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
This commit is contained in:
XANTRONIX Development 2020-07-19 01:44:16 -04:00 committed by XANTRONIX Industrial
parent a4f50d6bea
commit 052c7d94d0
2 changed files with 100 additions and 0 deletions

View file

@ -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);

View file

@ -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) {