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) \ #define PATTY_AX25_FRAME_CONTROL_FLAG(c) \
((c & 0x01) >> 4) ((c & 0x01) >> 4)
#define PATTY_AX25_FRAME_OVERHEAD 73
#define PATTY_AX25_FRAME_SIZE(format, hops, c, infolen) \ #define PATTY_AX25_FRAME_SIZE(format, hops, c, infolen) \
(((2 + hops) * sizeof(patty_ax25_addr)) \ (((2 + hops) * sizeof(patty_ax25_addr)) \
+ (format == PATTY_AX25_FRAME_EXTENDED? 2: 1) \ + (format == PATTY_AX25_FRAME_EXTENDED? 2: 1) \

View file

@ -1,13 +1,12 @@
#ifndef _PATTY_AX25_SOCK_H #ifndef _PATTY_AX25_SOCK_H
#define _PATTY_AX25_SOCK_H #define _PATTY_AX25_SOCK_H
#define PATTY_AX25_SOCK_BUFSZ 328 #define PATTY_AX25_SOCK_RX_MAXLEN 4096
#define PATTY_AX25_SOCK_SLOTS_SABM 8 #define PATTY_AX25_SOCK_RX_WINDOW 127
#define PATTY_AX25_SOCK_SLOTS_SABME 128
#define PATTY_AX25_SOCK_DEFAULT_MAXLEN 256 #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_WINDOW 8
#define PATTY_AX25_SOCK_DEFAULT_SLOTS PATTY_AX25_SOCK_SLOTS_SABM
enum patty_ax25_sock_type { enum patty_ax25_sock_type {
PATTY_AX25_SOCK_STREAM, PATTY_AX25_SOCK_STREAM,
@ -51,9 +50,11 @@ typedef struct _patty_ax25_sock {
timer_response, timer_response,
timer_keepalive; timer_keepalive;
size_t n_maxlen, size_t n_maxlen_tx,
n_retry, n_maxlen_rx,
n_window; n_window_tx,
n_window_rx,
n_retry;
unsigned int seq_send, unsigned int seq_send,
seq_recv; seq_recv;
@ -63,7 +64,7 @@ typedef struct _patty_ax25_sock {
int fd; int fd;
char path[PATTY_AX25_SOCK_PATH_SIZE]; char path[PATTY_AX25_SOCK_PATH_SIZE];
void *rx_buf; void *buf;
void *tx_slots; void *tx_slots;
patty_ax25_if *iface; patty_ax25_if *iface;

View file

@ -1441,7 +1441,7 @@ static int handle_sock(uint32_t key,
goto done; 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) { if (errno == EIO) {
(void)sock_close(server, sock); (void)sock_close(server, sock);
@ -1455,7 +1455,7 @@ static int handle_sock(uint32_t key,
goto done; 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; goto error_sock_write;
} }

View file

@ -61,8 +61,8 @@ static inline size_t tx_slot_size(size_t len) {
+ len; + len;
} }
static inline size_t tx_slots_size(size_t count, size_t len) { static inline size_t tx_slots_size(patty_ax25_sock *sock) {
return count * tx_slot_size(len); 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) { 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)); memset(sock, '\0', sizeof(*sock));
if ((sock->rx_buf = malloc(PATTY_AX25_SOCK_BUFSZ)) == NULL) { sock->proto = proto;
goto error_malloc_rx_buf; 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, if ((sock->tx_slots = malloc(tx_slots_size(sock))) == NULL) {
PATTY_AX25_SOCK_DEFAULT_MAXLEN))) == NULL) {
goto error_malloc_tx_slots; 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; 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; return sock;
error_bind_pty: error_bind_pty:
free(sock->tx_slots); free(sock->tx_slots);
error_malloc_tx_slots: error_malloc_tx_slots:
free(sock->rx_buf); free(sock->buf);
error_malloc_rx_buf: error_malloc_buf:
free(sock); free(sock);
error_malloc_sock: error_malloc_sock:
@ -115,14 +116,15 @@ error_malloc_sock:
} }
void patty_ax25_sock_reset(patty_ax25_sock *sock) { void patty_ax25_sock_reset(patty_ax25_sock *sock) {
sock->status = PATTY_AX25_SOCK_CLOSED; sock->status = PATTY_AX25_SOCK_CLOSED;
sock->mode = PATTY_AX25_SOCK_DM; 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_ack = 0;
sock->timer_response = 0; sock->timer_response = 0;
sock->timer_keepalive = 0; sock->timer_keepalive = 0;
sock->n_maxlen = 0;
sock->n_retry = 0;
sock->n_window = 0;
sock->flags = 0; sock->flags = 0;
sock->seq_send = 0; sock->seq_send = 0;
sock->seq_recv = 0; sock->seq_recv = 0;
@ -137,37 +139,20 @@ void patty_ax25_sock_destroy(patty_ax25_sock *sock) {
close(sock->fd); close(sock->fd);
} }
free(sock->rx_buf); free(sock->buf);
free(sock->tx_slots); free(sock->tx_slots);
free(sock); free(sock);
} }
int patty_ax25_sock_mode_set(patty_ax25_sock *sock, int patty_ax25_sock_mode_set(patty_ax25_sock *sock,
enum patty_ax25_sock_mode mode) { enum patty_ax25_sock_mode mode) {
size_t slots = 0;
if (sock->mode == mode) { if (sock->mode == mode) {
return 0; 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; sock->mode = mode;
return 0; return 0;
error_malloc_tx_slots:
return -1;
} }
char *patty_ax25_sock_pty(patty_ax25_sock *sock) { 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, static inline int toobig(patty_ax25_sock *sock,
uint16_t control, uint16_t control,
size_t infolen) { 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, 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, void *slot = tx_slot(sock->tx_slots,
sock->seq_send, sock->seq_send,
sock->n_maxlen); sock->n_maxlen_tx);
uint8_t *buf = (uint8_t *)slot + sizeof(size_t); 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, ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock,
unsigned int seq) { 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); void *buf = (uint8_t *)slot + sizeof(size_t);
size_t len = *((size_t *)slot); size_t len = *((size_t *)slot);