From 3db8c9cef30c6065635e16790fb3746c86a67f81 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Thu, 20 Aug 2020 22:54:12 -0500 Subject: [PATCH] Better handling, response to FRMR, SABM, and SABME Changes: * Use patty_ax25_sock_reset() when receiving a FRMR, SABM, or SABME frame * Reply to an SABM or SABME frame with a UA when received by an ESTABLISHED socket --- src/server.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/server.c b/src/server.c index f636f75..cf7ca38 100644 --- a/src/server.c +++ b/src/server.c @@ -1293,14 +1293,23 @@ static int handle_frmr(patty_ax25_server *server, return 0; } - if (sock->state == PATTY_AX25_SOCK_PENDING_CONNECT) { - int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL); + switch (sock->state) { + case PATTY_AX25_SOCK_PENDING_CONNECT: + if (sock->state == PATTY_AX25_SOCK_PENDING_CONNECT) { + sock->retries = sock->n_retry; - sock->retries = sock->n_retry; + patty_timer_start(&sock->timer_t1); - patty_timer_start(&sock->timer_t1); + return patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL); + } - return ret; + case PATTY_AX25_SOCK_ESTABLISHED: + patty_ax25_sock_reset(sock); + + return 0; + + default: + break; } return 0; @@ -1340,11 +1349,24 @@ static int handle_sabm(patty_ax25_server *server, goto error_sock_new; } + remote->state = PATTY_AX25_SOCK_PENDING_ACCEPT; + save_reply_addr(remote, frame); created = 1; - } else if (remote->state != PATTY_AX25_SOCK_PENDING_ACCEPT) { - goto reply_dm; + } + + switch (remote->state) { + case PATTY_AX25_SOCK_PENDING_ACCEPT: + break; + + case PATTY_AX25_SOCK_ESTABLISHED: + patty_ax25_sock_reset(remote); + + return frame->pf == 1? reply_ua(iface, frame, 1): 0; + + default: + goto reply_dm; } remote->state = PATTY_AX25_SOCK_ESTABLISHED;