Do a slightly better job handling sock control fields

This commit is contained in:
XANTRONIX Development 2020-07-08 16:25:10 -04:00 committed by XANTRONIX Industrial
parent 3e99af64d1
commit 0bfd5795ad
3 changed files with 33 additions and 24 deletions

View file

@ -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,

View file

@ -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);
}

View file

@ -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;