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
This commit is contained in:
XANTRONIX Development 2020-08-20 22:54:12 -05:00 committed by XANTRONIX Industrial
parent 645e2a465f
commit 3db8c9cef3

View file

@ -1293,14 +1293,23 @@ static int handle_frmr(patty_ax25_server *server,
return 0; return 0;
} }
if (sock->state == PATTY_AX25_SOCK_PENDING_CONNECT) { switch (sock->state) {
int ret = patty_ax25_sock_send_sabm(sock, PATTY_AX25_FRAME_POLL); 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; return 0;
@ -1340,11 +1349,24 @@ static int handle_sabm(patty_ax25_server *server,
goto error_sock_new; goto error_sock_new;
} }
remote->state = PATTY_AX25_SOCK_PENDING_ACCEPT;
save_reply_addr(remote, frame); save_reply_addr(remote, frame);
created = 1; 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; remote->state = PATTY_AX25_SOCK_ESTABLISHED;