From 1eb3d096080df207dc256629c95d25eafb2d200d Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Thu, 16 Jul 2020 00:14:21 -0400 Subject: [PATCH] Handle receipt of REJ, SREJ frames Utilizing the sock TX ring buffer, respond to peer requests to resend certain numbered I frames indicated by REJ and SREJ frames --- src/server.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/server.c b/src/server.c index 5a7d06d..a012da9 100644 --- a/src/server.c +++ b/src/server.c @@ -1276,6 +1276,41 @@ error_sock_delete: return -1; } +static int handle_rej(patty_ax25_server *server, + patty_ax25_if *iface, + patty_ax25_sock *sock, + patty_ax25_frame *frame) { + unsigned int i; + + for (i=frame->nr; iseq_send; i++) { + if (patty_ax25_sock_resend(sock, i) < 0) { + goto error_sock_resend; + } + } + + return 0; + +error_sock_resend: + return -1; +} + +static int handle_srej(patty_ax25_server *server, + patty_ax25_if *iface, + patty_ax25_sock *sock, + patty_ax25_frame *frame) { + /* + * TODO: Read the fine print of section 4.3.2.4 + */ + if (patty_ax25_sock_resend(sock, frame->nr) < 0) { + goto error_sock_resend; + } + + return 0; + +error_sock_resend: + return -1; +} + static int handle_frame(patty_ax25_server *server, patty_ax25_if *iface, void *buf, @@ -1307,12 +1342,14 @@ static int handle_frame(patty_ax25_server *server, } switch (frame.type) { - case PATTY_AX25_FRAME_I: return handle_i(server, iface, sock, &frame); case PATTY_AX25_FRAME_UA: return handle_ua(server, iface, &frame); case PATTY_AX25_FRAME_DM: return handle_dm(server, iface, &frame); case PATTY_AX25_FRAME_SABM: case PATTY_AX25_FRAME_SABME: return handle_sabm(server, iface, &frame); case PATTY_AX25_FRAME_DISC: return handle_disc(server, iface, &frame); + case PATTY_AX25_FRAME_I: return handle_i(server, iface, sock, &frame); + case PATTY_AX25_FRAME_REJ: return handle_rej(server, iface, sock, &frame); + case PATTY_AX25_FRAME_SREJ: return handle_srej(server, iface, sock, &frame); case PATTY_AX25_FRAME_FRMR: return 0; default: