Commit graph

98 commits

Author SHA1 Message Date
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
3d12ab33e3 Implement replies to 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
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
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
XANTRONIX Development
1060ff6ab8 Rename timers to their documented T1, T2, T3 names 2024-03-01 00:20:46 -05:00
XANTRONIX Development
8632e7ccb8 Merge patty_ax25_sock_timer_ack_restart(), _set()
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
9db9234a56 Make sure to activate Timer T1 in connect() 2024-03-01 00:20:46 -05:00
XANTRONIX Development
7ed169d7cc Implement XID, SABM, SABME ack timer in server
Implement XID, SABM, SABME ack Timer T1 semantics in src/server.c, as
per AX.25 v2.2 Section 6.3.1 "Link Connection Establishment"
2024-03-01 00:20:46 -05:00
XANTRONIX Development
578c9183e8 Remove patty_ax25_sock_send_sabme()
Remove patty_ax25_sock_send_sabme() in favor of making send_sabm() check
the socket for SABM or SABME mode and send the correct frame accordingly
2024-03-01 00:20:46 -05:00
XANTRONIX Development
9463e22481 Use ptsname(), not ptsname_r(), for portability 2024-03-01 00:20:46 -05:00
XANTRONIX Development
0aea65487a (Re)implement patty_ax25_sock_reset()
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
df7c0fad38 Rename patty_ax25_sock_reset() to _init(),
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"
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1bd93e3bcc Make functions sending RR, RNR, REJ take P/F flag
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1ba57a8df2 Prevent I frame TX overflow
As per the AX.25 v2.2 Specification, Section 6.4.1, "Sending I Frames",
do not send an I frame if V(R) + x (TX window) equals V(S)
2024-03-01 00:20:46 -05:00
XANTRONIX Development
7fd8be445a Fix REJ handling when N(R) > V(S)
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
8a26cace95 Allow upgrading socks to certain versions of AX.25
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
971fc2c375 Streamline responding to accept(), connect() calls
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
be6ff4b660 Make bind() not care about socket status 2024-03-01 00:20:46 -05:00
XANTRONIX Development
3657c883c7 Make bind() perform more validation
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
e06a9d195e Prevent UA frame from terminating socket w/o DISC
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
8761a4e3c2 Refactor to adhere better to AX.25 v2.2
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
2024-03-01 00:20:46 -05:00
XANTRONIX Development
fa53b8d49d Keep separate TX, RX single buffers in socks
Changes:

    * Replace patty_ax25_sock member 'buf' with 'tx_buf' and 'rx_buf'
      for transmitting or receiving single, non-sequential packets

    * Make patty_ax25_sock_upgrade() reallocate all I/O buffers based on
      window size and MTU/MRU, useful when entering SABME mode
2024-03-01 00:20:46 -05:00
XANTRONIX Development
5fa29da680 Make fd_clear() in src/server.c faster 2024-03-01 00:20:46 -05:00
XANTRONIX Development
6711f37ab9 Ensure XID frame response is encoded as responses
Changes:

    * Modify patty_ax25_sock_send_xid() to require the 'cr' argument,
      which specifies whether the frame address field is to be encoded
      with the 'command' or 'response' bits set as appropriate
2024-03-01 00:20:46 -05:00
XANTRONIX Development
803ebd0048 Simplify frame encoding
Changes:

    * Add 'format' member to patty_ax25_frame

    * Drop 'format' argument in patty_ax25_encode_reply_to()

    * Drop 'format' argument in patty_ax25_encode()

    * Consolidate private functions for encoding frame addresses to one
      much simpler function to perform encoding; simplify encoding of
      addresses in frames sent in reply to other frames
2024-03-01 00:20:46 -05:00
XANTRONIX Development
67f66d5570 Ensure socket mode is SABM or SABME as needed
When accepting a SABM or SABME frame, ensure the peer socket mode is set
accordingly to ensure control fields are encoded properly
2024-03-01 00:20:46 -05:00
XANTRONIX Development
5371f92cd9 Attempt to negotiate remote connections with XID
Implement the AX.25 v2.2 XID parameter exchange as a preamble for
initiating connections with peers, with the following workflow:

    * Upon a connect() call, send an XID frame to the peer

    * When a DM is received, assume the peer is unable to accept a
      connection

    * When a FRMR is received, assume the peer does not adhere to the
      AX.25 v2.2 standard, and attempt to initiate a connection with a
      SABM frame instead

    * When an XID is received, adapt local parameters to meet the
      needs of the peer, and respond with an SABM or an SABME frame,
      depending on which mode is indicated
2024-03-01 00:20:46 -05:00
XANTRONIX Development
c2550d075a Use patty_ax25_sock_bind_if() in server_connect()
Use patty_ax25_sock_bind_if() in server_connect() to ensure any other
functions which must take place are attended to when assigning an
interface to a socket
2024-03-01 00:20:46 -05:00
XANTRONIX Development
4bfe7da77b Handle XID frames in src/server.c
Handle XID frames in src/server.c by decoding the parameter information
and passing it to patty_ax25_sock_params_set()
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1fbf09c9ba Refactor parameter decoding/display
Changes:

    * Implement patty_ax25_params struct to contain all parameters
      supported by patty, at the interface and socket level alike

    * Move parameter enumerate types into include/patty/ax25.h, from
      include/patty/ax25/frame.h; make corrections as necessary

    * Reimplement patty_ax25_frame_decode_xid() to parse known XID
      information parameters into a patty_ax25_params object

    * Implement patty_print_params() in src/print.c

    * Refactor patty_print_frame() as patty_print_frame_header(),
      without a call to patty_print_hexdump(); this allows
      patty_print_params() to be called prior to patty_print_hexdump(),
      for better readability

    * Use patty_print_params() in examples/ax25dump.c, decode.c

    * Refactor usage of patty_ax25_frame_decode_xid() in src/server.c to
      parse XID frames into a patty_ax25_params object
2024-03-01 00:20:46 -05:00
XANTRONIX Development
a722b8f9b3 Better implementation of AX.25 v2.2 default params 2024-03-01 00:20:46 -05:00
XANTRONIX Development
aeee7449eb Use new signature for XID param callback 2024-03-01 00:20:46 -05:00
XANTRONIX Development
ffe8599db1 Rename tx, rx_bufsz to mtu, mru in src/if.c 2024-03-01 00:20:46 -05:00
XANTRONIX Development
ce8c5b1cbb Initial code for handling XID in src/server.c
Write initial code for handling XID frames in src/server.c
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1eb3d09608 Handle receipt of REJ, SREJ frames
Utilizing the sock TX ring buffer, respond to peer requests to resend
certain numbered I frames indicated by REJ and SREJ frames
2024-03-01 00:20:46 -05:00
XANTRONIX Development
c26c7509f4 Implement ring buffer for sock sent frames
Implement ring buffer for frames sent in a SABM or SABME session,
facilitating the ability to retransmit select frames upon request,
retaining a copy of the full frame and its transmitted size
2024-03-01 00:20:46 -05:00
XANTRONIX Development
6df612b910 Reply to I frames with REJ only with P/F bit set 2024-03-01 00:20:46 -05:00
XANTRONIX Development
34353fa1d9 Remove FRMR responses from server
Remove FRMR responses from server, as they are not included in the
current AX.25 v2.2 standard
2024-03-01 00:20:46 -05:00
XANTRONIX Development
9066fe10da Implement better handling of command/response bits
Implement better handling of command/response bits whilst decoding and
encoding addresses

Changes:

    * Add an enum patty_ax25_frame_cr argument to functions in
      src/sock.c which send specific types of frames

    * Detect AX.25 version >2.0 based on the command/response SSID bits

    * Simplify address copying/encoding by usage of the new function
      patty_ax25_addr_copy()

    * Implement showing AX.25 version, command/response indicator for
      frames in src/print.c
2024-03-01 00:20:46 -05:00
XANTRONIX Development
359742f949 Implement support for handling SABME frames 2024-03-01 00:20:46 -05:00
XANTRONIX Development
905d5b117c Better handle read()s of multiple frames from TNC
Implement better handling of situations when read() captures multiple
TNC frames; ensure each frame is handled in src/server.c, function
handle_iface(), to ensure packets aren't ignored before the next
select() call
2024-03-01 00:20:46 -05:00
XANTRONIX Development
f0c1a0e782 I like those names better 2024-03-01 00:20:46 -05:00
XANTRONIX Development
566f302a1f Adhere to proper P/F procedure
Adhere to proper P/F procedure for SABM, I, and DISC frames
2024-03-01 00:20:46 -05:00
XANTRONIX Development
1265108efd Reply to I frames outside of SABM(E) with DM 2024-03-01 00:20:46 -05:00
XANTRONIX Development
a4518a839a Implement better modulo-128 I and S frame support
Changes:

    * Split patty_ax25_frame_decode() into the following:

      - patty_ax25_frame_decode_address()
      - patty_ax25_frame_decode_control()

      This allows for look up an established socket for a given address
      pair, to determine if an SABME session is in progress,
      necessitating modulo-128 control decoding

    * Decode I and S N(R), N(S) sequence numbers, poll/final
      bits properly in both modulo-8 and modulo-128 mode

    * Perform better frame control validation

    * Implement the following functions in src/sock.c:

      - patty_ax25_sock_send_rr()
      - patty_ax25_sock_send_rnr()
      - patty_ax25_sock_send_rej()
      - patty_ax25_sock_send_srej()

      Corresponding functions have been removed from src/server.c

    * Implement better functions in src/sock.c for encoding frame
      control, with send/receive sequences associated with the socket,
      with modulo-128 encoding for SABME sessions

Other changes:

    * Move or delete macros from include/patty/ax25/macros.h into
      include/patty/ax25.h and include/patty/ax25/frame.h

    * Move definitions from include/patty/ax25/proto.h to header file
      include/patty/ax25.h

    * Perform better bounds checking while decoding frames

    * Improve frame control printing in src/print.c; display frame
      type names, N(R), (NS) sequence numbers, and poll/final bits
2024-03-01 00:20:46 -05:00
XANTRONIX Development
b281925eba Significantly simplify dictionaries
Significantly simplify dictionaries so that dictionary keys are always
uint32_t; this number can be an arbitrary integer, be it a file
descriptor, for instance, or a hashed value
2024-03-01 00:20:46 -05:00