Do a slightly better job handling sock control fields
This commit is contained in:
parent
3e99af64d1
commit
0bfd5795ad
3 changed files with 33 additions and 24 deletions
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
37
src/sock.c
37
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue