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
This commit is contained in:
XANTRONIX Development 2020-08-19 22:23:27 -04:00 committed by XANTRONIX Industrial
parent 1819b7fb34
commit 1fd1be2cb6
3 changed files with 19 additions and 12 deletions

View file

@ -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); 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); int patty_ax25_sock_ack_pending(patty_ax25_sock *sock);

View file

@ -1502,7 +1502,7 @@ static int handle_i(patty_ax25_server *server,
return frame->pf? reply_dm(iface, frame, PATTY_AX25_FRAME_FINAL): 0; 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) { if (patty_ax25_sock_ack_pending(sock) == 0) {
patty_timer_stop(&sock->timer_t1); patty_timer_stop(&sock->timer_t1);
@ -1623,7 +1623,7 @@ static int handle_rr(patty_ax25_server *server,
return 0; 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; 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) { if (patty_ax25_sock_ack_pending(sock) == 0) {
patty_timer_stop(&sock->timer_t1); patty_timer_stop(&sock->timer_t1);
@ -1716,7 +1716,7 @@ static int handle_rej(patty_ax25_server *server,
return 0; return 0;
} }
patty_ax25_sock_ack(sock, frame->nr - 1); patty_ax25_sock_ack(sock, frame->nr);
end = sock->vs; end = sock->vs;
@ -1743,7 +1743,7 @@ static int handle_srej(patty_ax25_server *server,
return 0; 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 * TODO: Read the fine print of section 4.3.2.4

View file

@ -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; 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, int ret = 0,
min = sock->va,
max = nr,
i; i;
for (i=0; i<sock->n_window_tx; i++) { if (max < min) {
struct slot *slot = tx_slot(sock, seq - i); max += sock->mode == PATTY_AX25_SOCK_SABME? 128: 8;
}
if (slot->len > 0) { for (i=min; i<max; i++) {
struct slot *slot = tx_slot(sock, i);
if (slot->len > 0 && !slot->ack) {
slot->ack = 1; slot->ack = 1;
sock->va = tx_seq(sock, i);
ret++; ret++;
} }
} }
sock->va = seq;
return ret; return ret;
} }