Fix bug in patty_ax25_if_addr_add() wherein, due to a typo of memcpy()
rather than memcmp(), the function would never fail to add an address
to an interface, even if it already exists on the interface
Changes:
* Add argument to patty_kiss_tnc_new(), patty_kiss_tnc_new_fd(),
a pointer to patty_kiss_tnc_info, to allow specifying baud and
flow control
* Rework patty_ax25_if_kiss_tnc_info to hold patty_kiss_tnc_info as
a hack to allow instantiating a KISS TNC-based network interface
with desired baud and flow control
Implement src/daemon.c to provide a high level method to instantiate a
patty server
Changes:
* Refactor src/server.c, src/route.c, src/if.c methods which accept
callsign arguments to use a patty_ax25_addr pointer instead; this
has significantly reduced the number of redundant calls to
patty_ax25_pton()
* Decouple patty_ax25_addr from patty_ax25_if_info types when
creating new interfaces with patty_ax25_if_new(); instead, take a
separate patty_ax25_addr argument
* Split patty_ax25_server_run() into the following methods:
- patty_ax25_server_start()
- patty_ax25_server_stop()
- patty_ax25_server_event_handle()
This is intended to allow possible integration into other event
loops.
* Implement src/daemon.c to allow quick instantiation of a server,
interfaces, and routes, and to encapsulate the setting of
configuration variables; callsigns and interface names are handled
as character strings
* Rename examples/server.c to examples/daemon.c; reimplement in
terms of the patty_daemon code
*
Rename patty_ax25_sock.rx_buf to io_buf, as the buffer is not used for
receiving frames from an interface, but rather from reading local data
to write to a remote peer
Other changes:
* Fix issue wherein patty_ax25_sock.n_maxlen_tx was not used for
reading local data when sending I frames
Changes:
* Ensure Timer T1 is stopped when Timer T3 is active
* Ensure Timer T1 is started when an acknowledgement from the peer
does not acknowledge all I frames previously sent
Make patty_ax25_sock_ack() return 1 if N(R) = V(A), to provide a
convenient means of verifying that an acknowledgement from the peer is
at least valid for current sequence variables, even if no new frames are
acknowledged; patty_ax25_sock_ack_pending() can always be used to
determine when frames are still pending acknowledgement
Stop flow before sending last I frame in window; furthermore, this last
I frame will have the P/F flag set to 1, to implicitly request a RR, RNR
or REJ response as appropriate
Remove unused patty_ax25_sock_flow_full(), in favor of the previously
implemented patty_ax25_sock_flow_left(), as a better means of
determining what flow control measures to take and how to interrogate
the peer for readiness to receive with minimal overhead
Implement patty_ax25_sock_flow_left() as a means to determine how many
I frames a peer may receive; this can be used to determine when to set
the P/F bit of outgoing I frames to implicitly require an RR or RNR
acknowledgement
Start Timer T3 when starting Timer T1 after expiry, to avoid a situation
wherein two RR command polling frames may be sent within close proximity
of one another
When handling I frames, stop Timer T2 if the number of unacknowledged
frames has reached k/2
Other changes:
* Provide annotations from the AX.25 v2.2 standards document
* Improve implementation of I frame reception P/F procedure
Always send RR when Timer T3 runs out, as we are not likely (with modern
hardware with MMUs) to be unable to receive; furthermore, RNR would have
only been sent erroneously if the outward flow of traffic had been
stopped
Implement SSID suffix stringes in pton()/ntop() to make it more
straightforward to specify addresses to bind, connect to, or add routes
for
Changes:
* Implement SSID suffix string formatting in patty_ax25_ntop(); drop
the 'ssid' pointer argument
* Implement SSID suffix string parsing in patty_ax25_pton(); drop
the 'ssid' argument
* Change all calls to patty_ax25_ntop() and patty_ax25_pton() to use
their new calling convention
Changes:
* Make TX slots only large enough to hold the info field of an I
frame; do not save header information
* Fix issue wherein patty_ax25_sock_resend() would resend the N(R)
value of an I frame as it was originally sent, even if this is
incorrect for a given situation
* Make control_i() in src/sock.c accept a V(S) sequence argument, as
this can sometimes be independent of the socket current V(S) value
* Declare control field functions as inline in src/sock.c
Changes:
* Use patty_ax25_sock_reset() when receiving a FRMR, SABM, or SABME
frame
* Reply to an SABM or SABME frame with a UA when received by an
ESTABLISHED socket
Implement AX.25 v2.2, Section 6.4.6 "Receiving Acknowledgement"
semantics more consistently
Changes:
* Add frame_ack() method in src/server.c to unify logic for
acknowledging frames and handling I frame transmission flow
control
* Ensure that the Timer T1 retry counter is reset as appropriate
when Timer T1 is restarted
* Add excerpts from the AX.25 v2.2 documentation to accompanying
code to better document the purpose of important aspects of the
state machine and protocol
* When receiving an S frame with N(R) acknowledgement of a frame
sent earlier than indicated by V(S), set V(S) to that N(R) value
* Implement patty_ax25_sock_resend_pending() as a means to resend
one frame previously sent which remains unacknowledged; this
uses V(S) to determine the frame to resend, and increments V(S) if
there was indeed an unacknowledged frame
* Call patty_ax25_sock_resend_pending() in src/server.c, method
handle_sock() to send a single frame previously sent but pending
acknowledgement
Changes:
* Make patty_ax25_sock_ack() take a N(R) argument directly, rather
than having the caller specify N(R)-1
* Only perform acknowledgement of frames within the range between
V(A) and N(R)-1
Implement patty_timer_init() to allow the caller to specify a timer
value to use each time patty_timer_start() is called, obviating the need
to pass the same argument redundantly; if the timer value must be
changed, then another call to patty_timer_init() may be used