More strictly adhere to the behaviors of Timers T1, T2 and T3 as
prescribed in the AX.25 v2.2 Specification, Section 4.4.5 "Timeout Error
Recovery" descriptions for Timer T1 and T3, as well as Section 6.7.1.2
"Response Delay Timer T2"
Changes:
* Implement patty_timer type to store both a struct timeval and a
bitfield for indicating timer state; currently, this only holds
the PATTY_TIMER_RUNNING flag to indicate whether a timer has been
stopped (irrespective of its "expired" status)
* Remove 'target' argument from patty_timer_start(); instead, rely
on select() polling every 1s to cause events to trigger at a
regular interval
* Make patty_timer_expired() return false if PATTY_TIMER_RUNNING is
not set
* Implement patty_timer_stop() to clear the PATTY_TIMER_RUNNING flag
of a timer
* Make patty_timer_clear() set all fields to zero, including
clearing the PATTY_TIMER_RUNNING flag
Fix incorrect control P/F encoding in src/sock.c wherein the P/F flag
value was passed to patty_ax25_sock_send() as an information field body
length, rather than the pf argument for the internal functions
control_i(), control_s(), and control_u(); this corrects the following
functions:
* patty_ax25_sock_send_rr()
* patty_ax25_sock_send_rnr()
* patty_ax25_sock_send_rej()
Implement AX.25 v2.2 Section 6.7.1.2 "Response Delay Timer T2" as per
specification; do not acknowledge several sequential I frames until a
certain period of time has passed since the receipt of the most recent I
frame
In patty_ax25_sock_send(), only use a numbered TX slot in the ring
buffer when sending I frames, rather than the prior case when the frame
was not a U frame
Fix patty_timer_start() to only set the running timer to the value of
the timer being started, rather than adding the value of the started
timer to the running timer
Changes:
* Make ./configure generate src/config.h, which will contain the
appropriate #include for endian.h, or #defines to provide
alternatives
* Make sure to include config.h in src/frame.c to allow compiling
on macOS
Fix patty_kiss_tnc_new_fd() to only attempt tcgetattr()/tcsetattr() on
file descriptors for whom isatty() is true, allowing files and sockets
to once again be used
Changes:
* Implement patty_timer_expired() to determine if a timer has
expired or has gone negative
* Implement patty_timer_cancel() to set a timer to zero
* Implement patty_timer_start() to initialize a timer, add a
specified number of milliseconds, and ensure a target timer (such
as the server timer) is set for at least that value as well
* Implement patty_timer_tick() to subtract an elapsed time value
from a timer
* Remove functions specific to each timer in src/sock.c, as those
can now be handled generically by src/timer.c
* Replace calls to patty_ax25_sock_timer_t1_*() with patty_timer_*()
calls instead; reference the struct timeval objects directly
within the sock (for the time being, pending opaque structures)
Changes:
* Combine patty_ax25_sock_ack_timer_restart() and _set() into one
method, patty_ax25_sock_ack_timer_start(), which accepts a new
struct timeval argument to potentially add the Timer T1 value to
* Reorder some functions in src/sock.c, include/patty/ax25/sock.h
Changes:
* Implement patty_ax25_sock_timeR_ack_restart() to initialize the
XID/SABM/SABME ack Timer T1
* Implement patty_ax25_sock_timer_ack_cancel() to clear Timer T1
* Implement patty_ax25_sock_timer_ack_sub() to subtract the value of
a struct timeval from Timer T1
* Implement patty_ax25_sock_timer_ack_expired() to indicate if the
ack Timer T1 has expired
Other changes:
* Rearrange patty_ax25_sock a bit
Changes:
* Use cfmakeraw() to set raw TTY attributes in KISS TNC constructor
patty_kiss_tnc_new_fd()
* Restore previous TTY attributes in patty_kiss_tnc_destroy()
Begin to reimplement patty_ax25_sock_reset() to follow the AX.25 v2.2
Specification, Section 6.5 "Resetting Procedure" indications to set V(S)
and V(R) to 0
Rename patty_ax25_sock_reset() to patty_ax25_sock_init(), so as to allow
for the implementation of a future _reset() method which shall be used
to implement AX.25 v2.2 Section 6.5 "Resetting Procedure"
Changes:
* Make patty_ax25_sock_send_rr() accept a P/F flag value
* Make patty_ax25_sock_send_rnr() accept a P/F flag value
* Make patty_ax25_sock_send_rej() accept a P/F flag value
After performing XID parameter negotiation, do not simply use the
negotiated TX buffer size when allocating the RX buffer; this resolves
an issue wherein read()s into the RX buffer (allocated with a size equal
to the TX buffer, which may be smaller) would cause memory errors
Changes:
* Allow REJ handling to occur when the V(S) send state counter wraps
to a value lower than indicated in the frame N(R) field
* Fix tx_slot() in src/sock.c to not buffer overflow when the TX
window is less than the maximum for the SABM/SABME mode
Changes:
* Add an enum patty_ax25_version argument to the function
patty_ax25_sock_upgrade() to allow upgrading a socket to a certain
set of AX.25 defaults
Changes:
* Implement and use respond_accept() and respond_connect()
convenience methods instead of stack allocating response objects,
populating them, and using write() to send them to the client
* When receiving XID frames in response to either an accept() or
connect() call, respond to the client if any of the parameters
sent from the peer are not compatible with a socket or interface,
with the appropriate errno value
Changes:
* Improve patty_ax25_sock_params_set() validation by setting ENOTSUP
when setting options on a socket that don't make sense, such as no
Asynchronous Balanced Mode
Changes:
* Make patty_ax25_sock_send() set ENETDOWN when no network interface
is associated with a sock
* Make patty_ax25_sock_send() set EBADF when no remote address is
associated with a sock
Keep distinct default Classes of Procedures parameter flag values for
sockets and interfaces, as the Asynchronous Balanced Mode parameter does
not apply to the interface itself, and the Half/Full Duplex parameters
do not apply to the sock
Changes:
* Make bind() validate that no other socket has the same
callsign/SSID bound to a listening socket, emitting EADDRINUSE if
one already exists
* Make bind() validate that no address is already bound to the
socket, emitting EINVAL otherwise
Changes:
* Add a "pending disconnect" state to enum patty_ax25_sock_state
(PATTY_AX25_SOCK_PENDING_DISCONNECT), used when an originating
system sends a DISC frame, pending a UA response
* When handling a UA frame, rather than terminating a socket in the
established state implicitly, check for a "pending disconnect"
state explicitly
Other changes:
* When a remote socket has already been obtained in handle_frame()
in src/server.c, pass that socket to any other method that would
otherwise be looking up the same socket
Changes:
* Don't use a separate dict for keeping track of sockets pending
accept and sockets pending connect; rely more on the semantic
meaning of the enum patty_ax25_sock_status values
* Ensure DISC frames are acknowledged by UA frames
* Ensure a receiving system only shuts down a connection after
receiving a UA frame in response to a sent DISC frame
* Ensure a sending system only shuts down a connection just prior to
sending a UA frame in response to a received DISC frame
* Don't use the P/F flag for the connection management U frames;
implicitly assume the P/F flag is set to 1, and always send frames
with a true P/F flag