Implement variable size sock frame slots

This commit is contained in:
XANTRONIX Development 2020-07-17 00:22:46 -04:00 committed by XANTRONIX Industrial
parent ce8c5b1cbb
commit 7715a8c070
3 changed files with 41 additions and 21 deletions

View file

@ -4,9 +4,6 @@
#include <stdint.h>
#include <sys/types.h>
#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

View file

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

View file

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