From 967f2f683080647ce4918a2de9e96bbd542385a8 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Mon, 3 Aug 2020 18:47:48 -0400 Subject: [PATCH] Rename patty_ax25_sock sequences per Section 4.2.4 Changes: * Rename seq_send to vs, ie, V(S) * Rename seq_recv to vr, ie, V(R) * Ensure handling RR responses updates V(S) with the N(R) value of the received frame --- include/patty/ax25/sock.h | 12 ++++++++---- src/server.c | 12 ++++++++---- src/sock.c | 39 ++++++++++++++++++++------------------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index da5c770..13caa79 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -83,8 +83,12 @@ typedef struct _patty_ax25_sock { timer_t2, timer_t3; - unsigned int seq_send, - seq_recv; + /* + * AX.25 v2.2 Section 4.2.4 "Frame Variables and Sequence Numbers" + */ + unsigned int vs, + vr, + va; size_t retries, pending; @@ -129,9 +133,9 @@ char *patty_ax25_sock_pty(patty_ax25_sock *sock); int patty_ax25_sock_bind_if(patty_ax25_sock *sock, patty_ax25_if *iface); -void patty_ax25_sock_seq_send_incr(patty_ax25_sock *sock); +void patty_ax25_sock_vs_incr(patty_ax25_sock *sock); -void patty_ax25_sock_seq_recv_incr(patty_ax25_sock *sock); +void patty_ax25_sock_vr_incr(patty_ax25_sock *sock); ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, enum patty_ax25_frame_cr cr, diff --git a/src/server.c b/src/server.c index 9540f8d..f779992 100644 --- a/src/server.c +++ b/src/server.c @@ -1340,8 +1340,8 @@ static int handle_i(patty_ax25_server *server, return frame->pf? reply_dm(iface, frame, PATTY_AX25_FRAME_FINAL): 0; } - if (sock->seq_recv == frame->ns) { - patty_ax25_sock_seq_recv_incr(sock); + if (sock->vr == frame->ns) { + patty_ax25_sock_vr_incr(sock); } else { return patty_ax25_sock_send_rej(sock, PATTY_AX25_FRAME_RESPONSE, 1); } @@ -1350,6 +1350,8 @@ static int handle_i(patty_ax25_server *server, goto error_write; } + sock->va = frame->ns + 1; + if (++sock->pending == sock->n_window_rx / 2) { sock->pending = 0; patty_timer_stop(&sock->timer_t2); @@ -1405,6 +1407,8 @@ static int handle_rr(patty_ax25_server *server, return patty_ax25_sock_send_rr(sock, PATTY_AX25_FRAME_RESPONSE, 1); case PATTY_AX25_FRAME_RESPONSE: + sock->vs = frame->nr; + patty_timer_start(&sock->timer_t3, PATTY_AX25_SOCK_DEFAULT_KEEPALIVE); default: @@ -1418,7 +1422,7 @@ static int handle_rej(patty_ax25_server *server, patty_ax25_sock *sock, patty_ax25_frame *frame) { unsigned int i, - end = sock->seq_send; + end = sock->vs; if (sock == NULL) { return 0; @@ -1777,7 +1781,7 @@ static int handle_sock(uint32_t key, /* * NOTE: See AX.25 2.2, Section 6.4.1, "Sending I Frames" */ - if (sock->seq_recv + sock->n_window_tx == sock->seq_send) { + if (sock->vs + sock->n_window_tx == sock->vs) { goto done; } } diff --git a/src/sock.c b/src/sock.c index f8ba5be..d26aba4 100644 --- a/src/sock.c +++ b/src/sock.c @@ -183,10 +183,11 @@ void patty_ax25_sock_init(patty_ax25_sock *sock) { * AX.25 v2.2 Specification, Section 6.5 "Resetting Procedure" */ void patty_ax25_sock_reset(patty_ax25_sock *sock) { - sock->seq_send = 0; - sock->seq_recv = 0; - sock->retries = sock->n_retry; - sock->pending = 0; + sock->vs = 0; + sock->vr = 0; + sock->va = 0; + sock->retries = sock->n_retry; + sock->pending = 0; patty_timer_clear(&sock->timer_t1); patty_timer_clear(&sock->timer_t2); @@ -329,19 +330,19 @@ error_if_promisc_add: return -1; } -void patty_ax25_sock_seq_send_incr(patty_ax25_sock *sock) { +void patty_ax25_sock_vs_incr(patty_ax25_sock *sock) { if (sock->mode == PATTY_AX25_SOCK_SABM) { - sock->seq_send = (sock->seq_send + 1) & 0x07; + sock->vs = (sock->vs + 1) & 0x07; } else { - sock->seq_send = (sock->seq_send + 1) & 0x7f; + sock->vs = (sock->vs + 1) & 0x7f; } } -void patty_ax25_sock_seq_recv_incr(patty_ax25_sock *sock) { +void patty_ax25_sock_vr_incr(patty_ax25_sock *sock) { if (sock->mode == PATTY_AX25_SOCK_SABM) { - sock->seq_recv = (sock->seq_recv + 1) & 0x07; + sock->vr = (sock->vr + 1) & 0x07; } else { - sock->seq_recv = (sock->seq_recv + 1) & 0x7f; + sock->vr = (sock->vr + 1) & 0x7f; } } @@ -398,7 +399,7 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, ssize_t encoded; uint8_t *buf = PATTY_AX25_FRAME_CONTROL_I(control)? - tx_slot_buf(sock, sock->seq_send): sock->tx_buf; + tx_slot_buf(sock, sock->vs): sock->tx_buf; if (sock->iface == NULL) { errno = ENETDOWN; @@ -437,7 +438,7 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, offset += infolen; - tx_slot_save_len(sock, sock->seq_send, offset); + tx_slot_save_len(sock, sock->vs, offset); } return patty_ax25_if_send(sock->iface, buf, offset); @@ -462,13 +463,13 @@ ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock, static uint16_t control_i(patty_ax25_sock *sock, int flag) { switch (sock->mode) { case PATTY_AX25_SOCK_SABM: - return ((sock->seq_recv & 0x07) << 5) - | ((sock->seq_send & 0x07) << 1) + return ((sock->vr & 0x07) << 5) + | ((sock->vs & 0x07) << 1) | (flag << 4); case PATTY_AX25_SOCK_SABME: - return ((sock->seq_recv & 0x7f) << 9) - | ((sock->seq_send & 0x7f) << 1) + return ((sock->vr & 0x7f) << 9) + | ((sock->vs & 0x7f) << 1) | (flag << 8); default: @@ -481,12 +482,12 @@ static uint16_t control_s(patty_ax25_sock *sock, int flag) { switch (sock->mode) { case PATTY_AX25_SOCK_SABM: - return ((sock->seq_recv & 0x07) << 5) + return ((sock->vr & 0x07) << 5) | (type & 0x0f) | (flag << 4); case PATTY_AX25_SOCK_SABME: - return ((sock->seq_recv & 0x7f) << 9) + return ((sock->vr & 0x7f) << 9) | (type & 0x0f) | (flag << 8); @@ -634,7 +635,7 @@ ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, goto error_send; } - patty_ax25_sock_seq_send_incr(sock); + patty_ax25_sock_vs_incr(sock); return len;