Better adherence to flow control semantics

This commit is contained in:
XANTRONIX Development 2020-08-16 14:07:26 -04:00 committed by XANTRONIX Industrial
parent 37a03a15c7
commit 6d22d0286c

View file

@ -1438,7 +1438,7 @@ static int handle_i(patty_ax25_server *server,
goto error_write; goto error_write;
} }
sock->va = frame->ns + 1; sock->va = frame->nr;
if (++sock->pending == sock->n_window_rx / 2) { if (++sock->pending == sock->n_window_rx / 2) {
sock->pending = 0; 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); patty_ax25_sock_send_rnr(sock, PATTY_AX25_FRAME_RESPONSE, 1);
case PATTY_AX25_FRAME_RESPONSE: case PATTY_AX25_FRAME_RESPONSE:
sock->vs = frame->nr; sock->flow = PATTY_AX25_SOCK_READY;
sock->va = frame->nr;
sock->retries = sock->n_retry; sock->retries = sock->n_retry;
fd_watch(server, sock->fd); fd_watch(server, sock->fd);
@ -1548,15 +1549,13 @@ static int handle_rnr(patty_ax25_server *server,
case PATTY_AX25_FRAME_RESPONSE: case PATTY_AX25_FRAME_RESPONSE:
sock->flow = PATTY_AX25_SOCK_WAIT; sock->flow = PATTY_AX25_SOCK_WAIT;
sock->vs = frame->nr; sock->va = frame->nr;
sock->retries = sock->n_retry; sock->retries = sock->n_retry;
fd_clear(server, sock->fd); fd_clear(server, sock->fd);
patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE); patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE);
break;
default: default:
break; break;
} }
@ -2028,19 +2027,15 @@ static int handle_sock(uint32_t key,
/* /*
* AX.25 v2.2, Section 6.4.1, "Sending I Frames" * AX.25 v2.2, Section 6.4.1, "Sending I Frames"
*/ */
if (sock->flow == PATTY_AX25_SOCK_READY) { if (sock->vs == sock->va + sock->n_window_tx) {
if (sock->vs % sock->n_window_tx == sock->n_window_tx - 1) { sock->flow = PATTY_AX25_SOCK_WAIT;
sock->flow = PATTY_AX25_SOCK_WAIT;
fd_clear(server, sock->fd); fd_clear(server, sock->fd);
patty_timer_stop(&sock->timer_t3); patty_timer_stop(&sock->timer_t3);
patty_timer_start(&sock->timer_t1, sock->n_ack); patty_timer_start(&sock->timer_t1, sock->n_ack);
return patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_COMMAND, 1); 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;
} }
if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) { if ((len = read(sock->fd, sock->rx_buf, sock->n_maxlen_rx)) < 0) {