From 052c7d94d05c4ac6d654fc42584f8694fbeb430d Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sun, 19 Jul 2020 01:44:16 -0400 Subject: [PATCH] Implement functions for setting params on sockets Changes: * Implement patty_ax25_sock_upgrade() to upgrade a socket from the default AX.25 2.0 parameters to AX.25 2.2 parameters, meant to be used upon receipt of an XID frame * Implement patty_ax25_sock_params_set() to set lowest common denominator parameters to a socket, downgrading or adapting to the parameters advertised by a peer XID frame as necessary --- include/patty/ax25/sock.h | 5 +++ src/sock.c | 95 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 0b83b37..5e24593 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -87,8 +87,13 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto, void patty_ax25_sock_reset(patty_ax25_sock *sock); +void patty_ax25_sock_upgrade(patty_ax25_sock *sock); + void patty_ax25_sock_destroy(patty_ax25_sock *sock); +int patty_ax25_sock_params_set(patty_ax25_sock *sock, + patty_ax25_params *params); + int patty_ax25_sock_mode_set(patty_ax25_sock *sock, enum patty_ax25_sock_mode mode); diff --git a/src/sock.c b/src/sock.c index 59b209e..99edcff 100644 --- a/src/sock.c +++ b/src/sock.c @@ -130,6 +130,15 @@ void patty_ax25_sock_reset(patty_ax25_sock *sock) { sock->seq_recv = 0; } +void patty_ax25_sock_upgrade(patty_ax25_sock *sock) { + sock->version = PATTY_AX25_2_2; + sock->flags_hdlc = PATTY_AX25_SOCK_2_2_DEFAULT_HDLC; + sock->n_maxlen_tx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN; + sock->n_maxlen_rx = PATTY_AX25_SOCK_2_2_DEFAULT_MAXLEN; + sock->n_window_tx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW; + sock->n_window_rx = PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW; +} + void patty_ax25_sock_destroy(patty_ax25_sock *sock) { if (sock->fd) { if (sock->iface) { @@ -144,6 +153,92 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) { free(sock); } +int patty_ax25_sock_params_set(patty_ax25_sock *sock, + patty_ax25_params *params) { + if (params->flags & PATTY_AX25_PARAM_CLASSES) { + if (!(params->classes & PATTY_AX25_PARAM_CLASSES_ABM)) { + goto error_invalid; + } + + /* + * TODO: Eventually support full duplex + */ + if (!(params->classes & PATTY_AX25_PARAM_CLASSES_HALF_DUPLEX)) { + goto error_invalid; + } + + if (params->classes & PATTY_AX25_PARAM_CLASSES_FULL_DUPLEX) { + goto error_invalid; + } + } + + if (params->flags & PATTY_AX25_PARAM_HDLC) { + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_REJ)) { + sock->flags_hdlc &= ~PATTY_AX25_PARAM_HDLC_REJ; + } + + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_SREJ)) { + sock->flags_hdlc &= ~PATTY_AX25_PARAM_HDLC_SREJ; + } + + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_XADDR)) { + goto error_invalid; + } + + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_8)) { + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_128)) { + goto error_invalid; + } + } else { + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_MODULO_128)) { + goto error_invalid; + } + + params->hdlc &= ~PATTY_AX25_PARAM_HDLC_MODULO_8; + params->hdlc |= PATTY_AX25_PARAM_HDLC_MODULO_128; + } + + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_TEST)) { + params->hdlc &= ~PATTY_AX25_PARAM_HDLC_TEST; + } + + if (!(params->hdlc & PATTY_AX25_PARAM_HDLC_SYNC_TX)) { + goto error_invalid; + } + } + + if (params->flags & PATTY_AX25_PARAM_INFO_RX) { + if (sock->n_maxlen_tx > params->info_rx) { + sock->n_maxlen_tx = params->info_rx; + } + } + + if (params->flags & PATTY_AX25_PARAM_WINDOW_RX) { + if (sock->n_window_tx > params->window_rx) { + sock->n_window_tx = params->window_rx; + } + } + + if (params->flags & PATTY_AX25_PARAM_ACK) { + if (sock->n_ack < params->ack) { + sock->n_ack = params->ack; + } + } + + if (params->flags & PATTY_AX25_PARAM_RETRY) { + if (sock->n_retry < params->retry) { + sock->n_retry = params->retry; + } + } + + return 0; + +error_invalid: + errno = EINVAL; + + return -1; +} + int patty_ax25_sock_mode_set(patty_ax25_sock *sock, enum patty_ax25_sock_mode mode) { if (sock->mode == mode) {