Commit graph

438 commits

Author SHA1 Message Date
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
XANTRONIX Development
4c427854da Portability fixes for ./configure
Fix portability of ./configure by defaulting to a more generic POSIX
setup for all values of `uname -s` apart from "Darwin"
2024-03-01 00:20:47 -05:00
XANTRONIX Development
3e51b48453 Fix various timer-related issues
Changes:

    * Replace usage of gettimeofday() with clock_gettime() in the main
      event loop, patty_ax25_server_run(), as gettimeofday() apparently
      goes backwards in time occasionally, as per:

        https://bugzilla.redhat.com/show_bug.cgi?id=174390

      Thanks Iain MM0ROR!

    * Fix patty_timer_expired() to properly return true if the
      remaining number of seconds is zero, but the remaining higher
      precision time is less than zero

    * Implement patty_timer_sub() to subtract two struct timespec
      values, as glibc lacks timespecsub()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
f54db37a7e Always clear KISS frame decode state on FEND
Always completely discard KISS frame decode state when encountering an
FEND character
2024-03-01 00:20:47 -05:00
XANTRONIX Development
b5ec25eb6a Don't check errno on EOF in patty_kiss_tnc_recv() 2024-03-01 00:20:47 -05:00
XANTRONIX Development
63a1c2d56e Clear unwanted errno in patty_kiss_tnc_new_fd()
Clear unwanted errno in patty_kiss_tnc_new_fd() when isatty() returns
false on a file descriptor
2024-03-01 00:20:47 -05:00
XANTRONIX Development
40408060de Don't throw error on failure to decode frames
Fix src/server.c, handle_frame() to not throw an error when encountering
errors decoding invalid frames
2024-03-01 00:20:47 -05:00
XANTRONIX Development
b99a6607ba Use tcflush() in patty_kiss_tnc_new()
Use tcflush() to initialize TTY state in patty_kiss_tnc_new(), so that
no unexpected data causes KISS framing errors
2024-03-01 00:20:47 -05:00
XANTRONIX Development
08509999c4 Formatting tweaks 2024-03-01 00:20:47 -05:00
XANTRONIX Development
1493f913a7 Don't use tcdrain() in patty_kiss_frame_send()
Don't use tcdrain() in patty_kiss_frame_send(), as this may cause a
program to block indefinitely on BSD systems
2024-03-01 00:20:47 -05:00
XANTRONIX Development
e558ccd57d Cleanup in src/server.c, handle_sock()
Changes:

    * Implement handle_sock_dgram() to specifically handle datagram
      (UI frame-only) sockets; this fixes issues wherein logic
      specific to SOCK_STREAM timers would be erroneously applied
      to datagram sockets

    * Always tick Timers T1, T2 and T3

    * Some slight code reorganization for improved readability of
      control flow
2024-03-01 00:20:47 -05:00