Better implementation of AX.25 v2.2 default params

This commit is contained in:
XANTRONIX Development 2020-07-17 19:37:18 -04:00 committed by XANTRONIX Industrial
parent aeee7449eb
commit a722b8f9b3
4 changed files with 39 additions and 51 deletions

View file

@ -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) \

View file

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

View file

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

View file

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