Better implementation of AX.25 v2.2 default params
This commit is contained in:
parent
aeee7449eb
commit
a722b8f9b3
4 changed files with 39 additions and 51 deletions
|
@ -35,6 +35,8 @@ enum patty_ax25_frame_flag {
|
|||
#define PATTY_AX25_FRAME_CONTROL_FLAG(c) \
|
||||
((c & 0x01) >> 4)
|
||||
|
||||
#define PATTY_AX25_FRAME_OVERHEAD 73
|
||||
|
||||
#define PATTY_AX25_FRAME_SIZE(format, hops, c, infolen) \
|
||||
(((2 + hops) * sizeof(patty_ax25_addr)) \
|
||||
+ (format == PATTY_AX25_FRAME_EXTENDED? 2: 1) \
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
#ifndef _PATTY_AX25_SOCK_H
|
||||
#define _PATTY_AX25_SOCK_H
|
||||
|
||||
#define PATTY_AX25_SOCK_BUFSZ 328
|
||||
#define PATTY_AX25_SOCK_SLOTS_SABM 8
|
||||
#define PATTY_AX25_SOCK_SLOTS_SABME 128
|
||||
#define PATTY_AX25_SOCK_RX_MAXLEN 4096
|
||||
#define PATTY_AX25_SOCK_RX_WINDOW 127
|
||||
|
||||
#define PATTY_AX25_SOCK_DEFAULT_MAXLEN 256
|
||||
#define PATTY_AX25_SOCK_DEFAULT_RETRY 10
|
||||
#define PATTY_AX25_SOCK_DEFAULT_WINDOW 8
|
||||
#define PATTY_AX25_SOCK_DEFAULT_SLOTS PATTY_AX25_SOCK_SLOTS_SABM
|
||||
|
||||
enum patty_ax25_sock_type {
|
||||
PATTY_AX25_SOCK_STREAM,
|
||||
|
@ -51,9 +50,11 @@ typedef struct _patty_ax25_sock {
|
|||
timer_response,
|
||||
timer_keepalive;
|
||||
|
||||
size_t n_maxlen,
|
||||
n_retry,
|
||||
n_window;
|
||||
size_t n_maxlen_tx,
|
||||
n_maxlen_rx,
|
||||
n_window_tx,
|
||||
n_window_rx,
|
||||
n_retry;
|
||||
|
||||
unsigned int seq_send,
|
||||
seq_recv;
|
||||
|
@ -63,7 +64,7 @@ typedef struct _patty_ax25_sock {
|
|||
int fd;
|
||||
char path[PATTY_AX25_SOCK_PATH_SIZE];
|
||||
|
||||
void *rx_buf;
|
||||
void *buf;
|
||||
void *tx_slots;
|
||||
|
||||
patty_ax25_if *iface;
|
||||
|
|
|
@ -1441,7 +1441,7 @@ static int handle_sock(uint32_t key,
|
|||
goto done;
|
||||
}
|
||||
|
||||
if ((len = read(sock->fd, sock->rx_buf, PATTY_AX25_SOCK_BUFSZ)) < 0) {
|
||||
if ((len = read(sock->fd, sock->buf, sock->n_maxlen_rx)) < 0) {
|
||||
if (errno == EIO) {
|
||||
(void)sock_close(server, sock);
|
||||
|
||||
|
@ -1455,7 +1455,7 @@ static int handle_sock(uint32_t key,
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (patty_ax25_sock_write(sock, sock->rx_buf, len) < 0) {
|
||||
if (patty_ax25_sock_write(sock, sock->buf, len) < 0) {
|
||||
goto error_sock_write;
|
||||
}
|
||||
|
||||
|
|
67
src/sock.c
67
src/sock.c
|
@ -61,8 +61,8 @@ static inline size_t tx_slot_size(size_t len) {
|
|||
+ len;
|
||||
}
|
||||
|
||||
static inline size_t tx_slots_size(size_t count, size_t len) {
|
||||
return count * tx_slot_size(len);
|
||||
static inline size_t tx_slots_size(patty_ax25_sock *sock) {
|
||||
return sock->n_window_tx * tx_slot_size(sock->n_maxlen_tx);
|
||||
}
|
||||
|
||||
static inline void *tx_slot(void *slots, size_t i, size_t len) {
|
||||
|
@ -79,12 +79,20 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
|
|||
|
||||
memset(sock, '\0', sizeof(*sock));
|
||||
|
||||
if ((sock->rx_buf = malloc(PATTY_AX25_SOCK_BUFSZ)) == NULL) {
|
||||
goto error_malloc_rx_buf;
|
||||
sock->proto = proto;
|
||||
sock->type = type;
|
||||
sock->status = PATTY_AX25_SOCK_CLOSED;
|
||||
sock->mode = PATTY_AX25_SOCK_DM;
|
||||
sock->n_maxlen_tx = PATTY_AX25_SOCK_DEFAULT_MAXLEN;
|
||||
sock->n_maxlen_rx = PATTY_AX25_SOCK_RX_MAXLEN;
|
||||
sock->n_window_tx = PATTY_AX25_SOCK_DEFAULT_WINDOW;
|
||||
sock->n_window_rx = PATTY_AX25_SOCK_RX_WINDOW;
|
||||
|
||||
if ((sock->buf = malloc(PATTY_AX25_FRAME_OVERHEAD + sock->n_maxlen_rx)) == NULL) {
|
||||
goto error_malloc_buf;
|
||||
}
|
||||
|
||||
if ((sock->tx_slots = malloc(tx_slots_size(PATTY_AX25_SOCK_DEFAULT_SLOTS,
|
||||
PATTY_AX25_SOCK_DEFAULT_MAXLEN))) == NULL) {
|
||||
if ((sock->tx_slots = malloc(tx_slots_size(sock))) == NULL) {
|
||||
goto error_malloc_tx_slots;
|
||||
}
|
||||
|
||||
|
@ -92,22 +100,15 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
|
|||
goto error_bind_pty;
|
||||
}
|
||||
|
||||
sock->proto = proto;
|
||||
sock->type = type;
|
||||
sock->status = PATTY_AX25_SOCK_CLOSED;
|
||||
sock->mode = PATTY_AX25_SOCK_DM;
|
||||
sock->n_maxlen = PATTY_AX25_SOCK_DEFAULT_MAXLEN;
|
||||
sock->n_window = PATTY_AX25_SOCK_DEFAULT_WINDOW;
|
||||
|
||||
return sock;
|
||||
|
||||
error_bind_pty:
|
||||
free(sock->tx_slots);
|
||||
|
||||
error_malloc_tx_slots:
|
||||
free(sock->rx_buf);
|
||||
free(sock->buf);
|
||||
|
||||
error_malloc_rx_buf:
|
||||
error_malloc_buf:
|
||||
free(sock);
|
||||
|
||||
error_malloc_sock:
|
||||
|
@ -115,14 +116,15 @@ error_malloc_sock:
|
|||
}
|
||||
|
||||
void patty_ax25_sock_reset(patty_ax25_sock *sock) {
|
||||
sock->status = PATTY_AX25_SOCK_CLOSED;
|
||||
sock->mode = PATTY_AX25_SOCK_DM;
|
||||
sock->status = PATTY_AX25_SOCK_CLOSED;
|
||||
sock->mode = PATTY_AX25_SOCK_DM;
|
||||
sock->n_maxlen_tx = PATTY_AX25_SOCK_DEFAULT_MAXLEN;
|
||||
sock->n_maxlen_rx = PATTY_AX25_SOCK_RX_MAXLEN;
|
||||
sock->n_retry = PATTY_AX25_SOCK_DEFAULT_RETRY;
|
||||
sock->n_window_tx = PATTY_AX25_SOCK_RX_WINDOW;
|
||||
sock->timer_ack = 0;
|
||||
sock->timer_response = 0;
|
||||
sock->timer_keepalive = 0;
|
||||
sock->n_maxlen = 0;
|
||||
sock->n_retry = 0;
|
||||
sock->n_window = 0;
|
||||
sock->flags = 0;
|
||||
sock->seq_send = 0;
|
||||
sock->seq_recv = 0;
|
||||
|
@ -137,37 +139,20 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
|
|||
close(sock->fd);
|
||||
}
|
||||
|
||||
free(sock->rx_buf);
|
||||
free(sock->buf);
|
||||
free(sock->tx_slots);
|
||||
free(sock);
|
||||
}
|
||||
|
||||
int patty_ax25_sock_mode_set(patty_ax25_sock *sock,
|
||||
enum patty_ax25_sock_mode mode) {
|
||||
size_t slots = 0;
|
||||
|
||||
if (sock->mode == mode) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (mode) {
|
||||
case PATTY_AX25_SOCK_SABM: slots = PATTY_AX25_SOCK_SLOTS_SABM; break;
|
||||
case PATTY_AX25_SOCK_SABME: slots = PATTY_AX25_SOCK_SLOTS_SABME; break;
|
||||
case PATTY_AX25_SOCK_DM: goto done;
|
||||
}
|
||||
|
||||
if ((sock->tx_slots = realloc(sock->tx_slots,
|
||||
tx_slots_size(slots, PATTY_AX25_SOCK_DEFAULT_MAXLEN))) == NULL) {
|
||||
goto error_malloc_tx_slots;
|
||||
}
|
||||
|
||||
done:
|
||||
sock->mode = mode;
|
||||
|
||||
return 0;
|
||||
|
||||
error_malloc_tx_slots:
|
||||
return -1;
|
||||
}
|
||||
|
||||
char *patty_ax25_sock_pty(patty_ax25_sock *sock) {
|
||||
|
@ -238,7 +223,7 @@ static size_t addr_copy_to_buf(void *dest,
|
|||
static inline int toobig(patty_ax25_sock *sock,
|
||||
uint16_t control,
|
||||
size_t infolen) {
|
||||
return infolen > sock->n_maxlen;
|
||||
return infolen > PATTY_AX25_FRAME_OVERHEAD + sock->n_maxlen_tx;
|
||||
}
|
||||
|
||||
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
||||
|
@ -250,7 +235,7 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
|
|||
|
||||
void *slot = tx_slot(sock->tx_slots,
|
||||
sock->seq_send,
|
||||
sock->n_maxlen);
|
||||
sock->n_maxlen_tx);
|
||||
|
||||
uint8_t *buf = (uint8_t *)slot + sizeof(size_t);
|
||||
|
||||
|
@ -284,7 +269,7 @@ error_toobig:
|
|||
|
||||
ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock,
|
||||
unsigned int seq) {
|
||||
void *slot = tx_slot(sock->tx_slots, seq, sock->n_maxlen);
|
||||
void *slot = tx_slot(sock->tx_slots, seq, sock->n_maxlen_tx);
|
||||
void *buf = (uint8_t *)slot + sizeof(size_t);
|
||||
|
||||
size_t len = *((size_t *)slot);
|
||||
|
|
Loading…
Add table
Reference in a new issue