Implement src/daemon.c to provide a high level method to instantiate a
patty server
Changes:
* Refactor src/server.c, src/route.c, src/if.c methods which accept
callsign arguments to use a patty_ax25_addr pointer instead; this
has significantly reduced the number of redundant calls to
patty_ax25_pton()
* Decouple patty_ax25_addr from patty_ax25_if_info types when
creating new interfaces with patty_ax25_if_new(); instead, take a
separate patty_ax25_addr argument
* Split patty_ax25_server_run() into the following methods:
- patty_ax25_server_start()
- patty_ax25_server_stop()
- patty_ax25_server_event_handle()
This is intended to allow possible integration into other event
loops.
* Implement src/daemon.c to allow quick instantiation of a server,
interfaces, and routes, and to encapsulate the setting of
configuration variables; callsigns and interface names are handled
as character strings
* Rename examples/server.c to examples/daemon.c; reimplement in
terms of the patty_daemon code
*
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
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
Keep distinct default Classes of Procedures parameter flag values for
sockets and interfaces, as the Asynchronous Balanced Mode parameter does
not apply to the interface itself, and the Half/Full Duplex parameters
do not apply to the sock
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
Use KISS framing for raw sockets to avoid multiple write() calls from
being buffered, which caused read() on the other end of a file
descriptor to read more than frame at once
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
Move raw frame interface capture to patty_ax25_if, patty_ax25_sock; this
resolves the issue wherein only bytes received, not sent, would be
captured by a raw socket bound to a specific interface with setsockopt()