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;
|
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,
|
static int handle_frame(patty_ax25_server *server,
|
||||||
patty_ax25_if *iface,
|
patty_ax25_if *iface,
|
||||||
void *buf,
|
void *buf,
|
||||||
|
@ -1307,12 +1342,14 @@ static int handle_frame(patty_ax25_server *server,
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (frame.type) {
|
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_UA: return handle_ua(server, iface, &frame);
|
||||||
case PATTY_AX25_FRAME_DM: return handle_dm(server, iface, &frame);
|
case PATTY_AX25_FRAME_DM: return handle_dm(server, iface, &frame);
|
||||||
case PATTY_AX25_FRAME_SABM:
|
case PATTY_AX25_FRAME_SABM:
|
||||||
case PATTY_AX25_FRAME_SABME: return handle_sabm(server, iface, &frame);
|
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_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;
|
case PATTY_AX25_FRAME_FRMR: return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Add table
Reference in a new issue