Improve SOCK_RAW facilities
Changes: * Reimplement patty_ax25_sock_send() to be geared specifically for sending raw frames; the function which formerly held this name is now a private method * Implement patty_ax25_sock_recv() to receive a frame from a raw socket * Implement patty_ax25_sock_recv_pending() to determine how many raw frames are pending receipt in the buffer * When handling raw sockets, use patty_ax25_sock_recv_pending() to ensure any raw pending frames read from a client intended for transmission on an interface are read completely
This commit is contained in:
parent
d0d17b58fb
commit
36f98bf7f0
3 changed files with 119 additions and 65 deletions
|
@ -140,10 +140,14 @@ void patty_ax25_sock_vs_incr(patty_ax25_sock *sock);
|
||||||
void patty_ax25_sock_vr_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,
|
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
void *buf,
|
||||||
uint16_t control,
|
size_t len);
|
||||||
void *info,
|
|
||||||
size_t infolen);
|
ssize_t patty_ax25_sock_recv(patty_ax25_sock *sock,
|
||||||
|
void *buf,
|
||||||
|
size_t len);
|
||||||
|
|
||||||
|
ssize_t patty_ax25_sock_recv_pending(patty_ax25_sock *sock);
|
||||||
|
|
||||||
ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock,
|
||||||
unsigned int seq);
|
unsigned int seq);
|
||||||
|
|
16
src/server.c
16
src/server.c
|
@ -1736,25 +1736,23 @@ error_io:
|
||||||
|
|
||||||
static int handle_sock_raw(patty_ax25_server *server,
|
static int handle_sock_raw(patty_ax25_server *server,
|
||||||
patty_ax25_sock *sock) {
|
patty_ax25_sock *sock) {
|
||||||
ssize_t len;
|
|
||||||
int port;
|
|
||||||
|
|
||||||
if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) {
|
if (!FD_ISSET(sock->fd, &server->fds_r) || sock->iface == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((len = patty_kiss_tnc_recv(sock->raw,
|
do {
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
if ((len = patty_ax25_sock_recv(sock,
|
||||||
sock->iface->tx_buf,
|
sock->iface->tx_buf,
|
||||||
sock->iface->mtu,
|
sock->iface->mtu)) < 0) {
|
||||||
&port)) < 0) {
|
|
||||||
goto error_io;
|
goto error_io;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (patty_ax25_if_send(sock->iface,
|
if (patty_ax25_sock_send(sock, sock->iface->tx_buf, len) < 0) {
|
||||||
sock->iface->tx_buf,
|
|
||||||
len) < 0) {
|
|
||||||
goto error_io;
|
goto error_io;
|
||||||
}
|
}
|
||||||
|
} while (patty_ax25_sock_recv_pending(sock));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
74
src/sock.c
74
src/sock.c
|
@ -421,6 +421,58 @@ error_toobig:
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
||||||
|
void *buf,
|
||||||
|
size_t len) {
|
||||||
|
if (sock->type != PATTY_AX25_SOCK_RAW) {
|
||||||
|
errno = EINVAL;
|
||||||
|
|
||||||
|
goto error_invalid_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sock->iface == NULL) {
|
||||||
|
errno = ENETDOWN;
|
||||||
|
|
||||||
|
goto error_noif;
|
||||||
|
}
|
||||||
|
|
||||||
|
return patty_ax25_if_send(sock->iface, buf, len);
|
||||||
|
|
||||||
|
error_noif:
|
||||||
|
error_invalid_type:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t patty_ax25_sock_recv(patty_ax25_sock *sock,
|
||||||
|
void *buf,
|
||||||
|
size_t len) {
|
||||||
|
int port;
|
||||||
|
|
||||||
|
if (sock->type != PATTY_AX25_SOCK_RAW) {
|
||||||
|
errno = EINVAL;
|
||||||
|
|
||||||
|
goto error_invalid_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return patty_kiss_tnc_recv(sock->raw, buf, len, &port);
|
||||||
|
|
||||||
|
error_invalid_type:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t patty_ax25_sock_recv_pending(patty_ax25_sock *sock) {
|
||||||
|
if (sock->type != PATTY_AX25_SOCK_RAW) {
|
||||||
|
errno = EINVAL;
|
||||||
|
|
||||||
|
goto error_invalid_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return patty_kiss_tnc_pending(sock->raw);
|
||||||
|
|
||||||
|
error_invalid_type:
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t frame_send(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
enum patty_ax25_frame_cr cr,
|
||||||
uint16_t control,
|
uint16_t control,
|
||||||
void *info,
|
void *info,
|
||||||
|
@ -535,7 +587,7 @@ static uint16_t control_u(enum patty_ax25_frame_type type,
|
||||||
ssize_t patty_ax25_sock_send_rr(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_send_rr(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
enum patty_ax25_frame_cr cr,
|
||||||
int pf) {
|
int pf) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
cr,
|
cr,
|
||||||
control_s(sock, PATTY_AX25_FRAME_RR, pf),
|
control_s(sock, PATTY_AX25_FRAME_RR, pf),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -545,7 +597,7 @@ ssize_t patty_ax25_sock_send_rr(patty_ax25_sock *sock,
|
||||||
ssize_t patty_ax25_sock_send_rnr(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_send_rnr(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
enum patty_ax25_frame_cr cr,
|
||||||
int pf) {
|
int pf) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
cr,
|
cr,
|
||||||
control_s(sock, PATTY_AX25_FRAME_RNR, pf),
|
control_s(sock, PATTY_AX25_FRAME_RNR, pf),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -555,7 +607,7 @@ ssize_t patty_ax25_sock_send_rnr(patty_ax25_sock *sock,
|
||||||
ssize_t patty_ax25_sock_send_rej(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_send_rej(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
enum patty_ax25_frame_cr cr,
|
||||||
int pf) {
|
int pf) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
cr,
|
cr,
|
||||||
control_s(sock, PATTY_AX25_FRAME_REJ, pf),
|
control_s(sock, PATTY_AX25_FRAME_REJ, pf),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -564,7 +616,7 @@ ssize_t patty_ax25_sock_send_rej(patty_ax25_sock *sock,
|
||||||
|
|
||||||
ssize_t patty_ax25_sock_send_srej(patty_ax25_sock *sock,
|
ssize_t patty_ax25_sock_send_srej(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr) {
|
enum patty_ax25_frame_cr cr) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
cr,
|
cr,
|
||||||
control_s(sock, PATTY_AX25_FRAME_SREJ, 1),
|
control_s(sock, PATTY_AX25_FRAME_SREJ, 1),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -576,7 +628,7 @@ ssize_t patty_ax25_sock_send_sabm(patty_ax25_sock *sock, int pf) {
|
||||||
PATTY_AX25_FRAME_SABME:
|
PATTY_AX25_FRAME_SABME:
|
||||||
PATTY_AX25_FRAME_SABM;
|
PATTY_AX25_FRAME_SABM;
|
||||||
|
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
PATTY_AX25_FRAME_COMMAND,
|
PATTY_AX25_FRAME_COMMAND,
|
||||||
control_u(type, pf),
|
control_u(type, pf),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -584,7 +636,7 @@ ssize_t patty_ax25_sock_send_sabm(patty_ax25_sock *sock, int pf) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int pf) {
|
ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int pf) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
PATTY_AX25_FRAME_COMMAND,
|
PATTY_AX25_FRAME_COMMAND,
|
||||||
control_u(PATTY_AX25_FRAME_DISC, pf),
|
control_u(PATTY_AX25_FRAME_DISC, pf),
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -622,7 +674,7 @@ ssize_t patty_ax25_sock_send_xid(patty_ax25_sock *sock,
|
||||||
goto error_frame_encode_xid;
|
goto error_frame_encode_xid;
|
||||||
}
|
}
|
||||||
|
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
cr,
|
cr,
|
||||||
control_u(PATTY_AX25_FRAME_XID, 0),
|
control_u(PATTY_AX25_FRAME_XID, 0),
|
||||||
buf,
|
buf,
|
||||||
|
@ -637,7 +689,7 @@ ssize_t patty_ax25_sock_send_test(patty_ax25_sock *sock,
|
||||||
enum patty_ax25_frame_cr cr,
|
enum patty_ax25_frame_cr cr,
|
||||||
void *info,
|
void *info,
|
||||||
size_t infolen) {
|
size_t infolen) {
|
||||||
return patty_ax25_sock_send(sock,
|
return frame_send(sock,
|
||||||
PATTY_AX25_FRAME_COMMAND,
|
PATTY_AX25_FRAME_COMMAND,
|
||||||
control_u(PATTY_AX25_FRAME_TEST, 1),
|
control_u(PATTY_AX25_FRAME_TEST, 1),
|
||||||
info,
|
info,
|
||||||
|
@ -661,15 +713,15 @@ ssize_t patty_ax25_sock_write(patty_ax25_sock *sock,
|
||||||
|
|
||||||
control = control_i(sock, 0);
|
control = control_i(sock, 0);
|
||||||
|
|
||||||
if (patty_ax25_sock_send(sock, PATTY_AX25_FRAME_COMMAND, control, buf, len) < 0) {
|
if (frame_send(sock, PATTY_AX25_FRAME_COMMAND, control, buf, len) < 0) {
|
||||||
goto error_send;
|
goto error_frame_send;
|
||||||
}
|
}
|
||||||
|
|
||||||
patty_ax25_sock_vs_incr(sock);
|
patty_ax25_sock_vs_incr(sock);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
error_send:
|
error_frame_send:
|
||||||
error_invalid_mode:
|
error_invalid_mode:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue