diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 90d0ea6..94d49a4 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -58,16 +58,16 @@ typedef struct _patty_ax25_sock { unsigned int hops; } patty_ax25_sock; -#define PATTY_AX25_SOCK_CONTROL_SABM(sock, flag) \ - (((sock->seq_recv & 0x07) << 7) | (flag << 4) | (sock->seq_send & 0x07)) +#define PATTY_AX25_SOCK_CONTROL_SABM(sock, pf) \ + (((sock->seq_recv & 0x07) << 7) | (pf << 4) | (sock->seq_send & 0x07)) -#define PATTY_AX25_SOCK_CONTROL_SABME(sock, flag) \ - (((sock->seq_recv & 0x7f) << 15) | (flag << 7) | (sock->seq_send & 0x7f)) +#define PATTY_AX25_SOCK_CONTROL_SABME(sock, pf) \ + (((sock->seq_recv & 0x7f) << 15) | (pf << 7) | (sock->seq_send & 0x7f)) -#define PATTY_AX25_SOCK_CONTROL(sock, flag) \ +#define PATTY_AX25_SOCK_CONTROL(sock, pf) \ (sock->mode == PATTY_AX25_SOCK_SABME? \ - PATTY_AX25_SOCK_CONTROL_SABME(sock, flag): \ - PATTY_AX25_SOCK_CONTROL_SABM(sock, flag)) + PATTY_AX25_SOCK_CONTROL_SABME(sock, pf): \ + PATTY_AX25_SOCK_CONTROL_SABM(sock, pf)) patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto, enum patty_ax25_sock_type type); @@ -81,6 +81,10 @@ 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_seq_recv_incr(patty_ax25_sock *sock); + ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, uint16_t control, void *info, diff --git a/src/server.c b/src/server.c index 7552647..f7017fc 100644 --- a/src/server.c +++ b/src/server.c @@ -1280,7 +1280,7 @@ static int handle_info(patty_ax25_server *server, * TODO: Validate RX and TX sequence numbers */ if (sock->seq_recv == PATTY_AX25_CONTROL_SEQ_SEND(frame->control)) { - sock->seq_recv++; + patty_ax25_sock_seq_recv_incr(sock); } else { return reply_rej(iface, frame, PATTY_AX25_FRAME_FINAL); } diff --git a/src/sock.c b/src/sock.c index 844b987..b34654a 100644 --- a/src/sock.c +++ b/src/sock.c @@ -138,6 +138,22 @@ error_if_promisc_add: return -1; } +void patty_ax25_sock_seq_send_incr(patty_ax25_sock *sock) { + if (sock->mode == PATTY_AX25_SOCK_SABME) { + sock->seq_send = (sock->seq_send + 1) & 0x07; + } else { + sock->seq_send = (sock->seq_send + 1) & 0x7f; + } +} + +void patty_ax25_sock_seq_recv_incr(patty_ax25_sock *sock) { + if (sock->mode == PATTY_AX25_SOCK_SABME) { + sock->seq_recv = (sock->seq_recv + 1) & 0x07; + } else { + sock->seq_recv = (sock->seq_recv + 1) & 0x7f; + } +} + static size_t copy_addr_to_tx_buf(patty_ax25_sock *sock) { void *buf = sock->iface->tx_buf; @@ -247,24 +263,13 @@ ssize_t patty_ax25_sock_write(patty_ax25_sock *sock, if (sock->type == PATTY_AX25_SOCK_RAW) { return patty_ax25_if_send(sock->iface, buf, len); + } else if (sock->mode == PATTY_AX25_SOCK_DM) { + errno = EBADF; + + goto error_invalid_mode; } - switch (sock->mode) { - case PATTY_AX25_SOCK_DM: - errno = EBADF; - - goto error_invalid_mode; - - case PATTY_AX25_SOCK_SABM: - control = PATTY_AX25_SOCK_CONTROL_SABM(sock, 1); - - break; - - case PATTY_AX25_SOCK_SABME: - control = PATTY_AX25_SOCK_CONTROL_SABME(sock, 1); - - break; - } + control = PATTY_AX25_SOCK_CONTROL(sock, 0); if (patty_ax25_sock_send(sock, control, buf, len) < 0) { goto error_send;