Implement variable size sock frame slots
This commit is contained in:
parent
ce8c5b1cbb
commit
7715a8c070
3 changed files with 41 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
47
src/sock.c
47
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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue