From 6d22d0286c0bf7fbe21b2d8a311eac03ccfdb91e Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sun, 16 Aug 2020 14:07:26 -0400 Subject: [PATCH] Better adherence to flow control semantics --- src/server.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/server.c b/src/server.c index 126a563..59a6869 100644 --- a/src/server.c +++ b/src/server.c @@ -1438,7 +1438,7 @@ static int handle_i(patty_ax25_server *server, goto error_write; } - sock->va = frame->ns + 1; + sock->va = frame->nr; if (++sock->pending == sock->n_window_rx / 2) { sock->pending = 0; @@ -1513,7 +1513,8 @@ static int handle_rr(patty_ax25_server *server, patty_ax25_sock_send_rnr(sock, PATTY_AX25_FRAME_RESPONSE, 1); case PATTY_AX25_FRAME_RESPONSE: - sock->vs = frame->nr; + sock->flow = PATTY_AX25_SOCK_READY; + sock->va = frame->nr; sock->retries = sock->n_retry; fd_watch(server, sock->fd); @@ -1548,15 +1549,13 @@ static int handle_rnr(patty_ax25_server *server, case PATTY_AX25_FRAME_RESPONSE: sock->flow = PATTY_AX25_SOCK_WAIT; - sock->vs = frame->nr; + sock->va = frame->nr; sock->retries = sock->n_retry; fd_clear(server, sock->fd); patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE); - break; - default: break; } @@ -2028,19 +2027,15 @@ static int handle_sock(uint32_t key, /* * AX.25 v2.2, Section 6.4.1, "Sending I Frames" */ - if (sock->flow == PATTY_AX25_SOCK_READY) { - if (sock->vs % sock->n_window_tx == sock->n_window_tx - 1) { - sock->flow = PATTY_AX25_SOCK_WAIT; + if (sock->vs == sock->va + sock->n_window_tx) { + sock->flow = PATTY_AX25_SOCK_WAIT; - fd_clear(server, sock->fd); + fd_clear(server, sock->fd); - patty_timer_stop(&sock->timer_t3); - patty_timer_start(&sock->timer_t1, sock->n_ack); + patty_timer_stop(&sock->timer_t3); + patty_timer_start(&sock->timer_t1, sock->n_ack); - return patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_COMMAND, 1); - } - } else if (sock->flow == PATTY_AX25_SOCK_WAIT) { - sock->flow = PATTY_AX25_SOCK_READY; + return patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_COMMAND, 1); } if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) {