Commit graph

389 commits

Author SHA1 Message Date
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
XANTRONIX Development
a3995c7e88 Stop Timer T1 upon receipt of DM during disconnect 2024-03-01 00:20:47 -05:00
XANTRONIX Development
82dd1d50a8 Start Timer T1 in src/server, sock_shutdown()
Start Timer T1 in src/server, sock_shutdown() after sending a DM frame
to the remote station
2024-03-01 00:20:47 -05:00
XANTRONIX Development
58a0025c59 Only handle clients and interfaces if select() >0
Only handle clients and interfaces if select() returns >0 in the main
event loop of patty_ax25_server_run(), to avoid unnecessary CPU
overhead
2024-03-01 00:20:47 -05:00
XANTRONIX Development
98490f79a7 Fix select() portability issues in src/server.c
Fix select() portability issues in src/server.c by using gettimeofday()
immediately prior to and after calling select() to calculate elapsed
time since blocking on select()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
4899aa4796 Implement SOCK_DGRAM
Implement PATTY_AX25_SOCK_DGRAM type sockets as a means of exchanging UI
frames between stations without requiring calling code to encode and
decode UI frames explicitly
2024-03-01 00:20:47 -05:00
XANTRONIX Development
1d03b2883a Return ENOTSUP on connect() to raw sockets 2024-03-01 00:20:47 -05:00
XANTRONIX Development
b2d3d3e03f Fix strncpy() buffer size compiler warnings 2024-03-01 00:20:47 -05:00
XANTRONIX Development
ca06f34eed Rename patty_ax25_sock member 'status' to 'state' 2024-03-01 00:20:47 -05:00
XANTRONIX Development
b2182618ab Slight order change 2024-03-01 00:20:47 -05:00
XANTRONIX Development
512957dda1 Fix NULL dereference
Fix NULL dereference when handling REJ packets
2024-03-01 00:20:47 -05:00
XANTRONIX Development
ea68dc199b Reset retry counter on receipt of RR, RNR 2024-03-01 00:20:47 -05:00
XANTRONIX Development
2e56ae55eb Allow setting retry count with setsockopt()
Allow setting retry count with patty_client_setsockopt()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
04176659ec Allow changing socket ack timer with setsockopt()
Allow changing socket ack timer with patty_client_setsockopt()
2024-03-01 00:20:47 -05:00
XANTRONIX Development
eb071de230 Add SOCK_PARAMS to patty_client_setsockopt()
Add SOCK_PARAMS to patty_client_setsockopt() to allow for setting
(presently) the MTU and TX window of a given socket to accommodate the
needs of specific remote stations
2024-03-01 00:20:47 -05:00
XANTRONIX Development
4d47b62f5f Implement additional socket flow control
Implement the SOCK_WAIT and SOCK_READY socket flow control states to
indicate a Receive Ready or Receive Not Ready state on the remote end

Other changes:

    * Fix issue wherein flow control was never halted when the remote
      end has received k (window) number of frames without the sending
      station asking for acknowledgment
2024-03-01 00:20:47 -05:00
XANTRONIX Development
36f98bf7f0 Improve SOCK_RAW facilities
Changes:

    * Reimplement patty_ax25_sock_send() to be geared specifically for
      sending raw frames; the function which formerly held this name is
      now a private method

    * Implement patty_ax25_sock_recv() to receive a frame from a raw
      socket

    * Implement patty_ax25_sock_recv_pending() to determine how many raw
      frames are pending receipt in the buffer

    * When handling raw sockets, use patty_ax25_sock_recv_pending() to
      ensure any raw pending frames read from a client intended for
      transmission on an interface are read completely
2024-03-01 00:20:47 -05:00
XANTRONIX Development
d0d17b58fb Implement support for sending frames with SOCK_RAW
Changes:

    * When associating a promiscuous socket with an interface, rather
      than creating a patty_kiss_tnc object, simply store the socket
      file descriptor and use patty_kiss_frame_send() to send incoming
      or outgoing frames for that interface to the promiscuous socket

    * Add special initialization code in src/sock.c for SOCK_RAW; don't
      allocate any buffers, but instead set a few flags and otherwise
      use 0-initialized defaults

    * Implement handle_sock_raw() in src/server.c to check to see if any
      raw frames are pending, and if so, send them to the associated
      interface if provided by setsockopt()

    * Make patty_ax25_sock_bind_if() only call the function
      patty_ax25_if_add_promisc() only if the socket status is PROMISC;
      this allows support for non-promiscuous sockets used for outbound
      purposes
2024-03-01 00:20:47 -05:00
XANTRONIX Development
c417461a0b Implement patty_kiss_frame_send()
Implement patty_kiss_frame_send() as a means of sending a KISS frame
without requiring a patty_kiss_tnc object
2024-03-01 00:20:47 -05:00
XANTRONIX Development
f96017bc10 Implement handling/sending RNR frames
Changes:

    * When handling RR commands with the P/F flag set, check to see if
      the socket file descriptor is currently being monitored; if so,
      reply RR, otherwise reply RNR

    * When handling RNR commands with the P/F flag set, apply the same
      aforementioned logic as used for handling RR commands

    * When handling RNR responses, clear the socket file descriptor so
      as to avoid infinite loop polling and to indicate that the remote
      station cannot receive packets currently
2024-03-01 00:20:47 -05:00
XANTRONIX Development
6b603b6048 Omit version field in patty_print_frame_header() 2024-03-01 00:20:47 -05:00
XANTRONIX Development
c7a51ff7f1 Use more standard formatting in src/print.c
Use a more standard formatting style when printing frame headers,
similar to that of MONITOR mode of a Kantronics TNC, or direwolf
2024-03-01 00:20:47 -05:00
XANTRONIX Development
967f2f6830 Rename patty_ax25_sock sequences per Section 4.2.4
Changes:

    * Rename seq_send to vs, ie, V(S)

    * Rename seq_recv to vr, ie, V(R)

    * Ensure handling RR responses updates V(S) with the N(R) value of
      the received frame
2024-03-01 00:20:47 -05:00
XANTRONIX Development
2db5a0d0b9 Fix issues with TX slots in src/sock.c
Fix issues with TX slots in src/sock.c wherein packets saved for resend
would not be able to be resent, as their total length was not encoded
properly into the slot structure
2024-03-01 00:20:46 -05:00
XANTRONIX Development
10432c9709 Fix swapped command/response bits in reply packets 2024-03-01 00:20:46 -05:00
XANTRONIX Development
4c00c441bb Remove localcall arg from examples/ax25dump.c 2024-03-01 00:20:46 -05:00
XANTRONIX Development
575adc5d31 Fix numerous XID negotiation bugs
Changes:

    * Fix Classes of Operations and HDLC parameter bit flags in
      include/patty/ax25.h to match the documentation after more careful
      analysis; resolve issues with byte order

    * Add support for previously missing HDLC parameters to function
      patty_print_params()

    * Fix Info TX/RX field encodings to be in bits, rather than bytes

    * Implement patty_ax25_sock_realloc_bufs() to reallocate buffers
      based on current window and I frame sizes

    * Implement patty_ax25_sock_params_upgrade() to upgrade a socket's
      parameters to the AX.25 v2.2 documented defaults; this will not
      change parameters if the socket is already set to v2.2

    * Implement patty_ax25_sock_params_max() to upgrade a socket's
      parameters to the highest values supported by patty

    * Reimplement patty_ax25_sock_send_xid() to send highest desired
      parameters, rather than the values currently set on the socket

    * When receiving XID frames destined to listening sockets, use
      patty_ax25_sock_params_max() to negotiate from high to low
      parameters

    * When receiving SABME flags, use patty_ax25_sock_params_upgrade()
      to ensure at least base AX.25 v2.2 parameter defaults are set

    * Fix issue where outbound connections initiated with XID were
      unable to time out after N retries
2024-03-01 00:20:46 -05:00
XANTRONIX Development
c287eb7a61 Fix dropped packets to promisc interfaces 2024-03-01 00:20:46 -05:00
XANTRONIX Development
16179894d2 Add tcdrain() at end of patty_kiss_tnc_send() 2024-03-01 00:20:46 -05:00
XANTRONIX Development
eb04bc4bb5 Fix XID I field size TX, RX parameter encoding
Fix XID I field size TX, RX parameter encoding to indicate the I frame
size in bits, rather than octets
2024-03-01 00:20:46 -05:00
XANTRONIX Development
671d4ef337 Don't tcsetattr() ptmx in patty_kiss_tnc_destroy()
Avoid tcsetattr() on a ptmx in patty_kiss_tnc_destroy(), as the old
attributes are not saved when opening a Unix98 PTY master
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1f4ffc98ac Implement new patty client code
Implement new patty client code, replacing src/call.c with src/client.c
providing clients with an interface dealing with file descriptors valid
in their process space; this also obviates the need to open a Unix
domain socket to a patty server explicitly, and helps keep track of
sockets opened on the server, locally

Changes:

    * Implement patty_client_new() to handle opening the server Unix
      domain socket, and to allocate a dict for mapping server-side
      sockets with current process file descriptors

    * Reimplement all server calls in src/call.c around the new
      patty_client type; calls which result in the creation of a
      Unix98 PTY by the patty server now handle opening the local PTY
      and setting the file descriptor to raw mode.  Furthermore, these
      calls deal exclusively in terms of current process file
      descriptors

    * Refactor src/server.c to use the new patty_client type and calls

    * Refactor examples/client.c, examples/server.c, examples/ax25dump.c
      to use the new patty_client type and calls

    * Fix a bug in src/server.c, respond_accept() wherein a 0, rather
      than the file descriptor of the socket, is sent to the client as a
      return value
2024-03-01 00:20:46 -05:00
XANTRONIX Development
81d063cb68 Skip tcgetattr() in patty_kiss_tnc_new_fd() w/ptmx
Modify patty_kiss_tnc_new_fd() to avoid tcgetattr()/tcsetattr() when
passed a file descriptor for a PTY master, to address incompatibility
with BSD kernelspace Unix98 PTY implementations
2024-03-01 00:20:46 -05:00
XANTRONIX Development
3d12ab33e3 Implement replies to TEST frames 2024-03-01 00:20:46 -05:00
XANTRONIX Development
f364604dcb Add TEST to patty_ax25_frame_decode_control()
Implement support for TEST frames in patty_ax25_frame_decode_control()
2024-03-01 00:20:46 -05:00
XANTRONIX Development
2c3b9ab799 Implement patty_ax25_sock_send_test()
Implement patty_ax25_sock_send_test() to send TEST frames
2024-03-01 00:20:46 -05:00
XANTRONIX Development
a08a70151c Better implementations of Timers T1, T2 and T3
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"
2024-03-01 00:20:46 -05:00
XANTRONIX Development
ba3923495e Implement patty_timer type
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
a619bc4906 Start Timer T1 when sending I frames 2024-03-01 00:20:46 -05:00
XANTRONIX Development
e432d57ff3 Fix incorrect control P/F encoding in src/sock.c
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()
2024-03-01 00:20:46 -05:00
XANTRONIX Development
aa2fd9b06d Implement Response Delay Timer T2
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
05cac588f2 Send REJ implicitly for out-of-order I frames
Send REJ implicitly for out-of-order I frames, regardless of I frame P/F
flag
2024-03-01 00:20:46 -05:00
XANTRONIX Development
62c116a17c Fix I frame encoding issue
Fix I frame encoding issue in patty_ax25_sock_write() wherein the N(S)
field was incorrectly encoded one bit too far to the right in the
control field
2024-03-01 00:20:46 -05:00
XANTRONIX Development
c61b09dedc Only use TX slot for outgoing I frames
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
55d40749a4 Fix patty_timer_start()
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
d6fbea1824 Fix patty_timer_expired()
Fix patty_timer_expired() to only check the tv_sec field for a value <=0
when testing for expiry
2024-03-01 00:20:46 -05:00
XANTRONIX Development
08d7594433 Remove unused maxsz() inline in src/sock.c 2024-03-01 00:20:46 -05:00
XANTRONIX Development
c321f6150e Add byte order swapping macros to configure
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
09df948871 Only set use tcsetattr() on TTYs for KISS TNCs
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
e10ce6b8e1 Implement generic timer functions in src/timer.c
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)
2024-03-01 00:20:46 -05:00