From 1fd1be2cb63bebe21319deab9f95d94313f9507d Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Wed, 19 Aug 2020 22:23:27 -0400 Subject: [PATCH] Improvements to patty_ax25_sock_ack() Changes: * Make patty_ax25_sock_ack() take a N(R) argument directly, rather than having the caller specify N(R)-1 * Only perform acknowledgement of frames within the range between V(A) and N(R)-1 --- include/patty/ax25/sock.h | 2 +- src/server.c | 10 +++++----- src/sock.c | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 35d963b..6022781 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -234,7 +234,7 @@ ssize_t patty_ax25_sock_recv_pending(patty_ax25_sock *sock); ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock, int seq); -int patty_ax25_sock_ack(patty_ax25_sock *sock, int seq); +int patty_ax25_sock_ack(patty_ax25_sock *sock, int nr); int patty_ax25_sock_ack_pending(patty_ax25_sock *sock); diff --git a/src/server.c b/src/server.c index b3281dc..b8b847c 100644 --- a/src/server.c +++ b/src/server.c @@ -1502,7 +1502,7 @@ static int handle_i(patty_ax25_server *server, return frame->pf? reply_dm(iface, frame, PATTY_AX25_FRAME_FINAL): 0; } - patty_ax25_sock_ack(sock, frame->nr - 1); + patty_ax25_sock_ack(sock, frame->nr); if (patty_ax25_sock_ack_pending(sock) == 0) { patty_timer_stop(&sock->timer_t1); @@ -1623,7 +1623,7 @@ static int handle_rr(patty_ax25_server *server, return 0; } - if (patty_ax25_sock_ack(sock, frame->nr - 1) > 0) { + if (patty_ax25_sock_ack(sock, frame->nr) > 0) { } @@ -1671,7 +1671,7 @@ static int handle_rnr(patty_ax25_server *server, return 0; } - patty_ax25_sock_ack(sock, frame->nr - 1); + patty_ax25_sock_ack(sock, frame->nr); if (patty_ax25_sock_ack_pending(sock) == 0) { patty_timer_stop(&sock->timer_t1); @@ -1716,7 +1716,7 @@ static int handle_rej(patty_ax25_server *server, return 0; } - patty_ax25_sock_ack(sock, frame->nr - 1); + patty_ax25_sock_ack(sock, frame->nr); end = sock->vs; @@ -1743,7 +1743,7 @@ static int handle_srej(patty_ax25_server *server, return 0; } - patty_ax25_sock_ack(sock, frame->nr - 1); + patty_ax25_sock_ack(sock, frame->nr); /* * TODO: Read the fine print of section 4.3.2.4 diff --git a/src/sock.c b/src/sock.c index 811be19..58e128f 100644 --- a/src/sock.c +++ b/src/sock.c @@ -689,21 +689,28 @@ ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock, int seq) { return slot->len > 0? patty_ax25_if_send(sock->iface, buf, slot->len): 0; } -int patty_ax25_sock_ack(patty_ax25_sock *sock, int seq) { +int patty_ax25_sock_ack(patty_ax25_sock *sock, int nr) { int ret = 0, + min = sock->va, + max = nr, i; - for (i=0; in_window_tx; i++) { - struct slot *slot = tx_slot(sock, seq - i); + if (max < min) { + max += sock->mode == PATTY_AX25_SOCK_SABME? 128: 8; + } - if (slot->len > 0) { + for (i=min; ilen > 0 && !slot->ack) { slot->ack = 1; + + sock->va = tx_seq(sock, i); + ret++; } } - sock->va = seq; - return ret; }