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:
parent
c26c7509f4
commit
1eb3d09608
1 changed files with 38 additions and 1 deletions
39
src/server.c
39
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; 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:
|
||||
|
|
Loading…
Add table
Reference in a new issue