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:
parent
1819b7fb34
commit
1fd1be2cb6
3 changed files with 19 additions and 12 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
10
src/server.c
10
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;
|
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
|
||||||
|
|
19
src/sock.c
19
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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue