From 7715a8c070c13e8642a66935f899c400649867ce Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Fri, 17 Jul 2020 00:22:46 -0400 Subject: [PATCH] Implement variable size sock frame slots --- include/patty/ax25/frame.h | 3 --- include/patty/ax25/sock.h | 12 ++++++---- src/sock.c | 47 ++++++++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/include/patty/ax25/frame.h b/include/patty/ax25/frame.h index ae6131b..f4eae87 100644 --- a/include/patty/ax25/frame.h +++ b/include/patty/ax25/frame.h @@ -4,9 +4,6 @@ #include #include -#define PATTY_AX25_FRAME_DEFAULT_MAXLEN 256 -#define PATTY_AX25_FRAME_DEFAULT_WINDOW 8 - enum patty_ax25_frame_format { PATTY_AX25_FRAME_NORMAL, PATTY_AX25_FRAME_EXTENDED diff --git a/include/patty/ax25/sock.h b/include/patty/ax25/sock.h index 28b8c46..f87fdb0 100644 --- a/include/patty/ax25/sock.h +++ b/include/patty/ax25/sock.h @@ -5,6 +5,10 @@ #define PATTY_AX25_SOCK_SLOTS_SABM 8 #define PATTY_AX25_SOCK_SLOTS_SABME 128 +#define PATTY_AX25_SOCK_DEFAULT_MAXLEN 256 +#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, PATTY_AX25_SOCK_RAW @@ -43,9 +47,9 @@ typedef struct _patty_ax25_sock { timer_response, timer_keepalive; - unsigned int n_maxlen, - n_retry, - n_window; + size_t n_maxlen, + n_retry, + n_window; unsigned int seq_send, seq_recv; @@ -54,7 +58,7 @@ typedef struct _patty_ax25_sock { char path[PATTY_AX25_SOCK_PATH_SIZE]; void *rx_buf; - patty_ax25_sock_tx_slot *tx_slots; + void *tx_slots; patty_ax25_if *iface; diff --git a/src/sock.c b/src/sock.c index e329cd2..7a0f3fb 100644 --- a/src/sock.c +++ b/src/sock.c @@ -54,6 +54,21 @@ error_open: return -1; } +static inline size_t tx_slot_size(size_t len) { + return sizeof(size_t) + + sizeof(patty_ax25_addr) * 2 + + sizeof(patty_ax25_addr) * PATTY_AX25_MAX_HOPS + + len; +} + +static inline size_t tx_slots_size(size_t count, size_t len) { + return count * tx_slot_size(len); +} + +static inline void *tx_slot(void *slots, size_t i, size_t len) { + return (void *)((uint8_t *)slots + (i * tx_slot_size(len))); +} + patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto, enum patty_ax25_sock_type type) { patty_ax25_sock *sock; @@ -68,7 +83,8 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto, goto error_malloc_rx_buf; } - if ((sock->tx_slots = malloc(PATTY_AX25_SOCK_SLOTS_SABM * sizeof(patty_ax25_sock_tx_slot))) == NULL) { + if ((sock->tx_slots = malloc(tx_slots_size(PATTY_AX25_SOCK_DEFAULT_SLOTS, + PATTY_AX25_SOCK_DEFAULT_MAXLEN))) == NULL) { goto error_malloc_tx_slots; } @@ -80,8 +96,8 @@ patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto, sock->type = type; sock->status = PATTY_AX25_SOCK_CLOSED; sock->mode = PATTY_AX25_SOCK_DM; - sock->n_maxlen = PATTY_AX25_FRAME_DEFAULT_MAXLEN; - sock->n_window = PATTY_AX25_FRAME_DEFAULT_WINDOW; + sock->n_maxlen = PATTY_AX25_SOCK_DEFAULT_MAXLEN; + sock->n_window = PATTY_AX25_SOCK_DEFAULT_WINDOW; return sock; @@ -140,7 +156,7 @@ int patty_ax25_sock_mode_set(patty_ax25_sock *sock, } if ((sock->tx_slots = realloc(sock->tx_slots, - slots * sizeof(patty_ax25_sock_tx_slot))) == NULL) { + tx_slots_size(slots, PATTY_AX25_SOCK_DEFAULT_MAXLEN))) == NULL) { goto error_malloc_tx_slots; } @@ -221,12 +237,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 PATTY_AX25_FRAME_SIZE(sock->mode == PATTY_AX25_SOCK_SABME? - PATTY_AX25_FRAME_EXTENDED: - PATTY_AX25_FRAME_NORMAL, - sock->hops, - control, - infolen) > PATTY_AX25_SOCK_BUFSZ? 1: 0; + return infolen > sock->n_maxlen; } ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, @@ -235,7 +246,12 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, void *info, size_t infolen) { size_t offset; - uint8_t *buf = sock->tx_slots[sock->seq_send].buf; + + void *slot = tx_slot(sock->tx_slots, + sock->seq_send, + sock->n_maxlen); + + uint8_t *buf = (uint8_t *)slot + sizeof(size_t); if (toobig(sock, control, infolen)) { goto error_toobig; @@ -257,7 +273,7 @@ ssize_t patty_ax25_sock_send(patty_ax25_sock *sock, offset += infolen; } - sock->tx_slots[sock->seq_send].len = offset; + *((size_t *)slot) = offset; return patty_ax25_if_send(sock->iface, buf, offset); @@ -267,9 +283,12 @@ error_toobig: ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock, unsigned int seq) { - patty_ax25_sock_tx_slot *slot = &sock->tx_slots[seq]; + void *slot = tx_slot(sock->tx_slots, seq, sock->n_maxlen); + void *buf = (uint8_t *)slot + sizeof(size_t); - return patty_ax25_if_send(sock->iface, slot->buf, slot->len); + size_t len = *((size_t *)slot); + + return patty_ax25_if_send(sock->iface, buf, len); } static uint16_t control_i(patty_ax25_sock *sock, int flag) {