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;
|
unsigned int hops;
|
||||||
} patty_ax25_sock;
|
} patty_ax25_sock;
|
||||||
|
|
||||||
#define PATTY_AX25_SOCK_CONTROL_SABM(sock, flag) \
|
#define PATTY_AX25_SOCK_CONTROL_SABM(sock, pf) \
|
||||||
(((sock->seq_recv & 0x07) << 7) | (flag << 4) | (sock->seq_send & 0x07))
|
(((sock->seq_recv & 0x07) << 7) | (pf << 4) | (sock->seq_send & 0x07))
|
||||||
|
|
||||||
#define PATTY_AX25_SOCK_CONTROL_SABME(sock, flag) \
|
#define PATTY_AX25_SOCK_CONTROL_SABME(sock, pf) \
|
||||||
(((sock->seq_recv & 0x7f) << 15) | (flag << 7) | (sock->seq_send & 0x7f))
|
(((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? \
|
(sock->mode == PATTY_AX25_SOCK_SABME? \
|
||||||
PATTY_AX25_SOCK_CONTROL_SABME(sock, flag): \
|
PATTY_AX25_SOCK_CONTROL_SABME(sock, pf): \
|
||||||
PATTY_AX25_SOCK_CONTROL_SABM(sock, flag))
|
PATTY_AX25_SOCK_CONTROL_SABM(sock, pf))
|
||||||
|
|
||||||
patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
|
patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
|
||||||
enum patty_ax25_sock_type type);
|
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,
|
int patty_ax25_sock_bind_if(patty_ax25_sock *sock,
|
||||||
patty_ax25_if *iface);
|
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,
|
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
||||||
uint16_t control,
|
uint16_t control,
|
||||||
void *info,
|
void *info,
|
||||||
|
|
|
@ -1280,7 +1280,7 @@ static int handle_info(patty_ax25_server *server,
|
||||||
* TODO: Validate RX and TX sequence numbers
|
* TODO: Validate RX and TX sequence numbers
|
||||||
*/
|
*/
|
||||||
if (sock->seq_recv == PATTY_AX25_CONTROL_SEQ_SEND(frame->control)) {
|
if (sock->seq_recv == PATTY_AX25_CONTROL_SEQ_SEND(frame->control)) {
|
||||||
sock->seq_recv++;
|
patty_ax25_sock_seq_recv_incr(sock);
|
||||||
} else {
|
} else {
|
||||||
return reply_rej(iface, frame, PATTY_AX25_FRAME_FINAL);
|
return reply_rej(iface, frame, PATTY_AX25_FRAME_FINAL);
|
||||||
}
|
}
|
||||||
|
|
33
src/sock.c
33
src/sock.c
|
@ -138,6 +138,22 @@ error_if_promisc_add:
|
||||||
return -1;
|
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) {
|
static size_t copy_addr_to_tx_buf(patty_ax25_sock *sock) {
|
||||||
void *buf = sock->iface->tx_buf;
|
void *buf = sock->iface->tx_buf;
|
||||||
|
|
||||||
|
@ -247,25 +263,14 @@ ssize_t patty_ax25_sock_write(patty_ax25_sock *sock,
|
||||||
|
|
||||||
if (sock->type == PATTY_AX25_SOCK_RAW) {
|
if (sock->type == PATTY_AX25_SOCK_RAW) {
|
||||||
return patty_ax25_if_send(sock->iface, buf, len);
|
return patty_ax25_if_send(sock->iface, buf, len);
|
||||||
}
|
} else if (sock->mode == PATTY_AX25_SOCK_DM) {
|
||||||
|
|
||||||
switch (sock->mode) {
|
|
||||||
case PATTY_AX25_SOCK_DM:
|
|
||||||
errno = EBADF;
|
errno = EBADF;
|
||||||
|
|
||||||
goto error_invalid_mode;
|
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) {
|
if (patty_ax25_sock_send(sock, control, buf, len) < 0) {
|
||||||
goto error_send;
|
goto error_send;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue