Attempt to set raw attributes on new socket PTYs to fix an issue on
Linux wherein any data written to a socket before the PTY subordinate
has been opened would be looped back in canonical mode, causing
frame errors; if tcsetattr() fails (usually on a non-Linux platform),
set errno to 0
Changes:
* Implement patty_ax25_if_driver type, providing a vtable with
pointers to methods implementing an AX.25 interface PHY
* Implement patty_ax25_if_name() to return a pointer to the name
string of an AX.25 interface
* Decouple patty_kiss_tnc from src/if.c using patty_ax25_if_driver
* Remove port input/output arguments from patty_kiss_tnc_send()
and patty_kiss_tnc_recv(), respectively; use 0 as the default,
but keep the port argument in patty_kiss_frame_send()
* Implement patty_ax25_if_fd() to return file descriptor backing a
PHY; use this rather than patty_kiss_tnc_fd() in src/server.c to
further decouple interfaces from their implementation
* Remove 'enum patty_ax25_if_type' type; refactor constructor
patty_ax25_if_new() to no longer take this as an argument, but
rather a patty_ax25_if_driver to use to instantiate the PHY
with the information pointer passed
* Break out patty_kiss_tnc code from src/kiss.c into src/tnc.c,
leaving only patty_kiss_frame_send() in the original; this is
needed to prevent a cyclic dependency within patty_ax25_sock and
other areas
* Rename patty_bin_if_config() to patty_bin_if_create(); a separate
patty_bin_if_config() will likely be created later as necessary
to change an existing interface
* Split PHY-specific interface configuration code into separate
delegates in bin/if.c
* Implement usage of patty_error to better capture internal error
states not currently representable with semantic error numbers
while configuring and instantiating PHYs
* Pass patty_error object to patty_bin_kiss_config() to receive
detailed error information
Changes:
* Implement src/conf.c, patty_conf_read(), to read a configuration
file to support a OpenBSD-style configuration file format
* Implement bin/pattyd.c to use patty_conf_read() to read a
configuration file and apply its settings to a patty_daemon
object as it is read; also implement a --standalone|-s flag to
allow the user to start a patty server without having to write
a configuration file
* Refactor patty_daemon_if_add() to accept a patty_ax25_if object;
this is necessary as bin/pattyd.c needs to be able to validate
the addresses given in a configuration file 'if' statement
* Refactor patty_ax25_server_new() to no longer accept a client
socket path; instead, patty_ax25_server_start() now accepts the
client socket path
* Remove the client socket 'path' member from patty_ax25_server in
src/server.c
* Refactor patty_kiss_tnc_new() to accept only one argument, a
patty_kiss_tnc_info object containing flags and settings needed
to open a device, use an existing file descriptor, or change
termios settings as appropriate
* Remove patty_kiss_tnc_new_fd(), as its functionality now exists
in patty_kiss_tnc_new() itself
* Add a 'flags' field to patty_kiss_tnc_info; use this bit field
to determine whether a path or file descriptor is provided by
the caller
* Make patty_ax25_if_new() accept an interface name argument, as
names are explicitly required when declaring new interfaces in
configuration files
* Make patty_kiss_tnc_new() able to accept /dev/ptmx as a device
name, regardless of whether this character device exists on a
given platform; when provided, a pseudo TTY pair is allocated
with openpty()
* Refactor examples/ax25dump.c to use the new patty_kiss_tnc_new()
calling convention
* Refactor examples/decode.c to use the new patty_kiss_tnc_new()
calling convention
* Remove examples/daemon.c in favor of bin/pattyd.c
* Rename examples/patty.conf to examples/pattyd.conf; modify to
provide values which would actually function
Improved portability in ./configure to add detection for various smaller
items, such as headers necessary for openpty(3), et cetera; improve
overall script structure
Use openpty(3) to open PTYs, to achieve compatibility with OpenBSD as
posix_openpty() returns a file descriptor which does not block on
read() nor select()
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
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
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
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
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
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
Implement frame segmentation/reassembly state machine as per AX.25 v2.2
specifications, as per Section 6.6 "Disassembler/Reassembler" and
associated appendices
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
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
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
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
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
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
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
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
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
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
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
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()
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
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