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
This commit is contained in:
XANTRONIX Development 2020-07-16 00:14:21 -04:00 committed by XANTRONIX Industrial
parent c26c7509f4
commit 1eb3d09608

View file

@ -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; i<sock->seq_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: