patty/include/patty/ax25/sock.h
XANTRONIX Development eb071de230 Add SOCK_PARAMS to patty_client_setsockopt()
Add SOCK_PARAMS to patty_client_setsockopt() to allow for setting
(presently) the MTU and TX window of a given socket to accommodate the
needs of specific remote stations
2024-03-01 00:20:47 -05:00

197 lines
5.7 KiB
C

#ifndef _PATTY_AX25_SOCK_H
#define _PATTY_AX25_SOCK_H
#include <patty/timer.h>
#define PATTY_AX25_SOCK_DEFAULT_KEEPALIVE (1000 * 30)
#define PATTY_AX25_SOCK_DEFAULT_DELAY 3000
#define PATTY_AX25_SOCK_DEFAULT_CLASSES \
(PATTY_AX25_PARAM_CLASSES_ABM)
#define PATTY_AX25_SOCK_DEFAULT_HDLC \
(PATTY_AX25_PARAM_HDLC_REJ \
| PATTY_AX25_PARAM_HDLC_XADDR | PATTY_AX25_PARAM_HDLC_MODULO_8 \
| PATTY_AX25_PARAM_HDLC_TEST | PATTY_AX25_PARAM_HDLC_SYNC_TX)
#define PATTY_AX25_SOCK_2_2_DEFAULT_HDLC \
(PATTY_AX25_PARAM_HDLC_REJ | PATTY_AX25_PARAM_HDLC_SREJ \
| PATTY_AX25_PARAM_HDLC_XADDR | PATTY_AX25_PARAM_HDLC_MODULO_128 \
| PATTY_AX25_PARAM_HDLC_TEST | PATTY_AX25_PARAM_HDLC_FCS_16 \
| PATTY_AX25_PARAM_HDLC_SYNC_TX)
#define PATTY_AX25_SOCK_2_2_MAX_HDLC \
(PATTY_AX25_PARAM_HDLC_REJ | PATTY_AX25_PARAM_HDLC_SREJ \
| PATTY_AX25_PARAM_HDLC_XADDR | PATTY_AX25_PARAM_HDLC_MODULO_128 \
| PATTY_AX25_PARAM_HDLC_TEST | PATTY_AX25_PARAM_HDLC_FCS_16 \
| PATTY_AX25_PARAM_HDLC_SYNC_TX | PATTY_AX25_PARAM_HDLC_SREJ_MULTI)
#define PATTY_AX25_SOCK_DEFAULT_I_LEN 256
#define PATTY_AX25_SOCK_DEFAULT_WINDOW 4
#define PATTY_AX25_SOCK_DEFAULT_RETRY 10
#define PATTY_AX25_SOCK_DEFAULT_ACK 3000
#define PATTY_AX25_SOCK_2_2_DEFAULT_I_LEN 256
#define PATTY_AX25_SOCK_2_2_DEFAULT_WINDOW 32
#define PATTY_AX25_SOCK_2_2_MAX_I_LEN 1536
#define PATTY_AX25_SOCK_2_2_MAX_WINDOW 127
enum patty_ax25_sock_type {
PATTY_AX25_SOCK_STREAM,
PATTY_AX25_SOCK_RAW
};
enum patty_ax25_sock_status {
PATTY_AX25_SOCK_CLOSED,
PATTY_AX25_SOCK_LISTENING,
PATTY_AX25_SOCK_PENDING_ACCEPT,
PATTY_AX25_SOCK_PENDING_CONNECT,
PATTY_AX25_SOCK_PENDING_DISCONNECT,
PATTY_AX25_SOCK_ESTABLISHED,
PATTY_AX25_SOCK_PROMISC
};
enum patty_ax25_sock_mode {
PATTY_AX25_SOCK_DM,
PATTY_AX25_SOCK_SABM,
PATTY_AX25_SOCK_SABME
};
enum patty_ax25_sock_flow {
PATTY_AX25_SOCK_WAIT,
PATTY_AX25_SOCK_READY
};
enum patty_ax25_sock_opt {
PATTY_AX25_SOCK_PARAMS,
PATTY_AX25_SOCK_IF
};
typedef struct _patty_ax25_sock {
enum patty_ax25_proto proto;
enum patty_ax25_sock_type type;
enum patty_ax25_version version;
enum patty_ax25_sock_status status;
enum patty_ax25_sock_mode mode;
enum patty_ax25_sock_flow flow;
size_t n_maxlen_tx,
n_maxlen_rx,
n_window_tx,
n_window_rx,
n_ack,
n_retry;
uint32_t flags_classes,
flags_hdlc;
patty_timer timer_t1,
timer_t2,
timer_t3;
/*
* AX.25 v2.2 Section 4.2.4 "Frame Variables and Sequence Numbers"
*/
unsigned int vs,
vr,
va;
size_t retries,
pending;
int fd;
char pty[PATTY_AX25_SOCK_PATH_SIZE];
void *tx_buf,
*rx_buf;
void *tx_slots;
patty_ax25_if *iface;
patty_kiss_tnc *raw;
patty_ax25_addr local,
remote,
repeaters[PATTY_AX25_MAX_HOPS];
unsigned int hops;
} patty_ax25_sock;
patty_ax25_sock *patty_ax25_sock_new(enum patty_ax25_proto proto,
enum patty_ax25_sock_type type);
void patty_ax25_sock_destroy(patty_ax25_sock *sock);
void patty_ax25_sock_init(patty_ax25_sock *sock);
void patty_ax25_sock_reset(patty_ax25_sock *sock);
void patty_ax25_sock_mtu_set(patty_ax25_sock *sock, size_t mtu);
void patty_ax25_sock_window_set(patty_ax25_sock *sock, size_t window);
void patty_ax25_sock_params_upgrade(patty_ax25_sock *sock);
void patty_ax25_sock_params_max(patty_ax25_sock *sock);
int patty_ax25_sock_params_negotiate(patty_ax25_sock *sock,
patty_ax25_params *params);
int patty_ax25_sock_realloc_bufs(patty_ax25_sock *sock);
char *patty_ax25_sock_pty(patty_ax25_sock *sock);
int patty_ax25_sock_bind_if(patty_ax25_sock *sock,
patty_ax25_if *iface);
void patty_ax25_sock_vs_incr(patty_ax25_sock *sock);
void patty_ax25_sock_vr_incr(patty_ax25_sock *sock);
ssize_t patty_ax25_sock_send(patty_ax25_sock *sock,
void *buf,
size_t len);
ssize_t patty_ax25_sock_recv(patty_ax25_sock *sock,
void *buf,
size_t len);
ssize_t patty_ax25_sock_recv_pending(patty_ax25_sock *sock);
ssize_t patty_ax25_sock_resend(patty_ax25_sock *sock,
unsigned int seq);
ssize_t patty_ax25_sock_send_rr(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr,
int pf);
ssize_t patty_ax25_sock_send_rnr(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr,
int pf);
ssize_t patty_ax25_sock_send_rej(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr,
int pf);
ssize_t patty_ax25_sock_send_srej(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr);
ssize_t patty_ax25_sock_send_sabm(patty_ax25_sock *sock, int pf);
ssize_t patty_ax25_sock_send_disc(patty_ax25_sock *sock, int pf);
ssize_t patty_ax25_sock_send_xid(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr);
ssize_t patty_ax25_sock_send_test(patty_ax25_sock *sock,
enum patty_ax25_frame_cr cr,
void *info,
size_t infolen);
ssize_t patty_ax25_sock_write(patty_ax25_sock *sock,
void *buf,
size_t len);
#endif /* _PATTY_AX25_SOCK_H */