Commit graph

448 commits

Author SHA1 Message Date
XANTRONIX Development
582c7f04d6 Don't stop Timer T3 only when stopping I transmit 2024-03-01 00:20:47 -05:00
XANTRONIX Development
5ccd2efbda Rearrange patty_ax25_sock struct definition
Rearrange patty_ax25_sock struct definition for better readability and
cohesion, and for the sake of future documentation
2024-03-01 00:20:47 -05:00
XANTRONIX Development
ec9066167b Stop flow before sending last I frame in window
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
826653f0d9 Remove unused patty_ax25_sock_flow_full()
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
dfa2ff547a Implement patty_ax25_sock_flow_left()
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
df9efb8b3a Start Timer T3 when starting Timer T1 after expiry
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
99a48af087 Stop Timer T2 when sending RR on k/2 unacked
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
3b1e341851 Fix switch case fallthrough bugs in src/server.c
Fix switch case fallthrough bugs in src/server.c in the following
functions:

    * handle_rr()

    * handle_rnr()

    * handle_rej()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
c6af57b245 Only set P/F flag on I frames when window is hit
Changes:

    * In src/sock.c, inline function control_i(), only set the P/F flag
      when the window of the peer has just received up to its window
2024-03-01 00:20:47 -05:00
XANTRONIX Development
b619fffb32 Always send RR when Timer T3 runs out
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
609a7271e5 Minor formatting tweaks for searchability 2024-03-01 00:20:47 -05:00
XANTRONIX Development
d88e8512b8 Adhere to P/F procedure on I frames 2024-03-01 00:20:47 -05:00
XANTRONIX Development
bdbab9c5e7 Disregard TEST, UA and XID not addressed to iface 2024-03-01 00:20:47 -05:00
XANTRONIX Development
222e51100e Implement SSID suffix stringes in pton()/ntop()
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
f41ce994f4 Make patty_ax25_sock_resend() send with V(R)
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
3db8c9cef3 Better handling, response to FRMR, SABM, and SABME
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
645e2a465f Reset Timer T1, TX slots w/patty_ax25_sock_reset()
Make patty_ax25_sock_reset() reset Timer T1 and zero out the len and ack
fields of each TX slot
2024-03-01 00:20:47 -05:00
XANTRONIX Development
56b8b90727 Minor code deduplication in src/sock.c
Minor code deduplication in src/sock.c for handling SABM vs SABME
sequence numbers
2024-03-01 00:20:47 -05:00
XANTRONIX Development
697ade0afa Reset socket retry counter for each frame acked 2024-03-01 00:20:47 -05:00
XANTRONIX Development
06ddf1bbaf Fix uninintialized frame ack field
Fix uninintialized frame ack field when initializing TX slots
2024-03-01 00:20:47 -05:00
XANTRONIX Development
484981de34 Implement better frame ack strategy
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
6e8099b6ae Add .gitignore 2024-03-01 00:20:47 -05:00
XANTRONIX Development
cd943f5c9c Minor syntax change, patty_ax25_sock_ack_pending() 2024-03-01 00:20:47 -05:00
XANTRONIX Development
1fd1be2cb6 Improvements to patty_ax25_sock_ack()
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
1819b7fb34 Rename patty_ax25_sock 'pending' to 'rx_pending'
Rename patty_ax25_sock 'pending' to 'rx_pending' to better document its
purpose
2024-03-01 00:20:47 -05:00
XANTRONIX Development
972b04c95f Slight rearrangement 2024-03-01 00:20:47 -05:00
XANTRONIX Development
0fb7d08872 Implement patty_timer_init()
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
2024-03-01 00:20:47 -05:00
XANTRONIX Development
4577b5f223 More WIP; please kill me 2024-03-01 00:20:47 -05:00
XANTRONIX Development
e34713c766 Send the right rejection packets 2024-03-01 00:20:47 -05:00
XANTRONIX Development
f26e977bfc Implement patty_ax25_sock_ack()
Implement patty_ax25_sock_ack() to keep track of I frames sent which
have been successfully acknowledged by a peer
2024-03-01 00:20:47 -05:00
XANTRONIX Development
301e58c6e9 Send RR Response, not Command, on Timer T2 timeout 2024-03-01 00:20:47 -05:00
XANTRONIX Development
4d84ed183e Adhere better to P/F bit procedure for I frames 2024-03-01 00:20:47 -05:00
XANTRONIX Development
6027a71e28 Use O_NOCTTY in patty_kiss_tnc_open() 2024-03-01 00:20:47 -05:00
XANTRONIX Development
d43d24a934 Poll with RR when V(S) = V(A) + k 2024-03-01 00:20:47 -05:00
XANTRONIX Development
a5d74ecf2e Initial flow control improvements 2024-03-01 00:20:47 -05:00
XANTRONIX Development
776949b90c Implement frame segmentation/reassembly
Implement frame segmentation/reassembly state machine as per AX.25 v2.2
specifications, as per Section 6.6 "Disassembler/Reassembler" and
associated appendices
2024-03-01 00:20:47 -05:00
XANTRONIX Development
6d22d0286c Better adherence to flow control semantics 2024-03-01 00:20:47 -05:00
XANTRONIX Development
37a03a15c7 Reduced default I frame body to 127 bytes
Reduced default I frame info field to 127 bytes so as to hopefully
better coincide with common TNC firmware; it is suspected (but not
confirmed that they do include the protocol identifier as part of the
info field length
2024-03-01 00:20:47 -05:00
XANTRONIX Development
50c8a30915 Refactor frame_send() in src/sock.c
Refactor frame_send() in src/sock.c and usages thereof to pass a proto
argument, rather than implicitly using the value of sock->proto
2024-03-01 00:20:47 -05:00
XANTRONIX Development
4befed8d45 Check for nil buffers in patty_ax25_sock_destroy()
Check before trying to free() nil buffers in patty_ax25_sock_destroy()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
a5fe9be054 Add comments to include/ax25/sock.h functions
Add comments to include/ax25/sock.h functions to improve readability
2024-03-01 00:20:47 -05:00
XANTRONIX Development
004d5c9ec6 Use default I frame lengths for common TNCs
Use default I frame lengths for common TNCs per version; for AX.25
prior to 2.2, use 128, otherwise, use 255, the maximum for Kenwood and
possibly other Kantronics-style TNCs
2024-03-01 00:20:47 -05:00
XANTRONIX Development
1e4329528c Use Timer T1 for timeouts on XID negotiations
When a remote station wishes to connect by sending an XID frame, use
Timer T1 to send an XID response up to the retry count before closing
the socket pending negotiation
2024-03-01 00:20:47 -05:00
XANTRONIX Development
893ddefd57 Use bit fields for setsockopt() SOCK_OPT_PARAMS 2024-03-01 00:20:47 -05:00
XANTRONIX Development
7a76da651c Add comments to include/ax25/sock.h defaults 2024-03-01 00:20:47 -05:00
XANTRONIX Development
0cee9d1e17 Fix error when handling unexpected DM 2024-03-01 00:20:47 -05:00
XANTRONIX Development
20cacf4bed Improve accept(); allow select(2) on listeners
Changes:

    * Add validation to accept() to ensure file descriptors provided
      refer to SOCK_STREAM sockets in the SOCK_LISTENING state

    * Rather than writing a reply to the patty client socket when
      accepting a SABM or SABME request, write a message to the
      remote end of the listening socket; this avoids issues wherein
      a client receives an unexpected accept() response that may be
      unrelated to another pending request; this also allows client
      code to use select(2) on listening sockets

    * In patty_client_accept(), send the initial request to validate
      that the local socket can accept connections, and then wait for
      a connection to be made, reading a message written to the
      listening socket from the patty server

    * Allow select(2) to notify on accepted connections
2024-03-01 00:20:47 -05:00
XANTRONIX Development
0b8ce4f775 Gracefully close raw sockets on EOF
In src/server.c, handle_sock_raw(), gracefully close sockets upon
read()ing EOF
2024-03-01 00:20:47 -05:00
XANTRONIX Development
a1ec1e00d0 Improve patty_ax25_sock_destroy() for raw sockets
Changes:

    * Don't clear socket from an interface's promiscuous socket table if
      the socket state is not SOCK_PROMISC

    * Destroy socket TNC if socket type is SOCK_RAW

    * Only attempt to close socket file descriptors >0
2024-03-01 00:20:47 -05:00
XANTRONIX Development
acaa5dee0f Don't change socket to SOCK_PROMISC for bad iface
In src/server.c, server_setsockopt(), do not change socket state to
SOCK_PROMISC if the requested interface cannot be found
2024-03-01 00:20:47 -05:00