From a722b8f9b3d28c9ef6fac75ddac9d58010e03197 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Fri, 17 Jul 2020 19:37:18 -0400 Subject: [PATCH] Better implementation of AX.25 v2.2 default params --- include/patty/ax25/frame.h | 2 ++ include/patty/ax25/sock.h | 17 +++++----- src/server.c | 4 +-- src/sock.c | 67 +++++++++++++++----------------------- 4 files changed, 39 insertions(+), 51 deletions(-) diff --git a/include/patty/ax25/frame.h b/include/patty/ax25/frame.h index d7b07b8..efd93fe 100644 --- a/include/patty/ax25/frame.h +++ b/include/patty/ax25/frame.h @@ -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) \ diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index cb1b739..4185b12 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -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; diff --git a/src/server.c b/src/server.c index b3c32d0..bc9abdc 100644 --- a/src/server.c +++ b/src/server.c @@ -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; } diff --git a/src/sock.c b/src/sock.c index 080e65f..baf38e3 100644 --- a/src/sock.c +++ b/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);