Implement patty_ax25_frame_decode_xid() to decode XID frame data, adhering to the basic structure of ISO 8885 as closely as possible
152 lines
4.5 KiB
C
152 lines
4.5 KiB
C
#ifndef _PATTY_AX25_FRAME_H
|
|
#define _PATTY_AX25_FRAME_H
|
|
|
|
#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
|
|
};
|
|
|
|
enum patty_ax25_frame_cr {
|
|
PATTY_AX25_FRAME_OLD,
|
|
PATTY_AX25_FRAME_COMMAND,
|
|
PATTY_AX25_FRAME_RESPONSE
|
|
};
|
|
|
|
enum patty_ax25_frame_flag {
|
|
PATTY_AX25_FRAME_POLL = 1,
|
|
PATTY_AX25_FRAME_FINAL = 1
|
|
};
|
|
|
|
#define PATTY_AX25_FRAME_CONTROL_I(c) \
|
|
((c & 0x1) == 0x00)
|
|
|
|
#define PATTY_AX25_FRAME_CONTROL_S(c) \
|
|
((c & 0x03) == 0x01)
|
|
|
|
#define PATTY_AX25_FRAME_CONTROL_U(c) \
|
|
((c & 0x03) == 0x03)
|
|
|
|
#define PATTY_AX25_FRAME_CONTROL_UI(c) \
|
|
((c & 0xef) == 0x03)
|
|
|
|
#define PATTY_AX25_FRAME_CONTROL_FLAG(c) \
|
|
((c & 0x01) >> 4)
|
|
|
|
#define PATTY_AX25_FRAME_SIZE(format, hops, c, infolen) \
|
|
(((2 + hops) * sizeof(patty_ax25_addr)) \
|
|
+ (format == PATTY_AX25_FRAME_EXTENDED? 2: 1) \
|
|
+ (PATTY_AX25_FRAME_CONTROL_I(c)? 1 + infolen: 0))
|
|
|
|
#define PATTY_AX25_FRAME_S_MASK 0x0f
|
|
#define PATTY_AX25_FRAME_U_MASK 0xef
|
|
|
|
enum patty_ax25_frame_type {
|
|
PATTY_AX25_FRAME_I = 0x00,
|
|
PATTY_AX25_FRAME_RR = 0x01,
|
|
PATTY_AX25_FRAME_RNR = 0x05,
|
|
PATTY_AX25_FRAME_REJ = 0x09,
|
|
PATTY_AX25_FRAME_SREJ = 0x0d,
|
|
PATTY_AX25_FRAME_SABM = 0x2f,
|
|
PATTY_AX25_FRAME_SABME = 0x6f,
|
|
PATTY_AX25_FRAME_DISC = 0x43,
|
|
PATTY_AX25_FRAME_DM = 0x0f,
|
|
PATTY_AX25_FRAME_UA = 0x63,
|
|
PATTY_AX25_FRAME_FRMR = 0x87,
|
|
PATTY_AX25_FRAME_UI = 0x03,
|
|
PATTY_AX25_FRAME_XID = 0x8f,
|
|
PATTY_AX25_FRAME_TEST = 0xe3,
|
|
PATTY_AX25_FRAME_UNKNOWN = 0xff
|
|
};
|
|
|
|
typedef struct _patty_ax25_frame {
|
|
patty_ax25_addr dest,
|
|
src,
|
|
repeaters[PATTY_AX25_MAX_HOPS];
|
|
|
|
unsigned int hops;
|
|
|
|
uint16_t control;
|
|
uint8_t nr, ns, pf;
|
|
enum patty_ax25_frame_cr cr;
|
|
enum patty_ax25_frame_type type;
|
|
enum patty_ax25_version version;
|
|
|
|
uint8_t proto;
|
|
void *info;
|
|
size_t infolen;
|
|
} patty_ax25_frame;
|
|
|
|
#pragma pack(push)
|
|
#pragma pack(1)
|
|
|
|
typedef struct _patty_ax25_frame_xid_element {
|
|
uint8_t format,
|
|
group;
|
|
|
|
uint16_t len;
|
|
} patty_ax25_frame_xid_element;
|
|
|
|
typedef struct _patty_ax25_frame_xid_param {
|
|
uint8_t id, len;
|
|
} patty_ax25_frame_xid_param;
|
|
|
|
enum patty_ax25_frame_xid_param_type {
|
|
PATTY_AX25_FRAME_XID_PARAM_CLASS = 2,
|
|
PATTY_AX25_FRAME_XID_PARAM_HDLC = 3,
|
|
PATTY_AX25_FRAME_XID_PARAM_INFO_TX = 5,
|
|
PATTY_AX25_FRAME_XID_PARAM_INFO_RX = 6,
|
|
PATTY_AX25_FRAME_XID_PARAM_WINDOW_TX = 7,
|
|
PATTY_AX25_FRAME_XID_PARAM_WINDOW_RX = 8,
|
|
PATTY_AX25_FRAME_XID_PARAM_ACK = 9
|
|
};
|
|
|
|
#pragma pack(pop)
|
|
|
|
typedef int (*patty_ax25_frame_xid_callback)(enum patty_ax25_frame_xid_param_type type,
|
|
size_t len,
|
|
uint8_t *data,
|
|
void *ctx);
|
|
|
|
ssize_t patty_ax25_frame_decode_address(patty_ax25_frame *frame,
|
|
void *buf,
|
|
size_t len);
|
|
|
|
ssize_t patty_ax25_frame_decode_control(patty_ax25_frame *frame,
|
|
enum patty_ax25_frame_format format,
|
|
void *buf,
|
|
size_t offset,
|
|
size_t len);
|
|
|
|
ssize_t patty_ax25_frame_decode_xid(patty_ax25_frame_xid_callback callback,
|
|
void *data,
|
|
size_t offset,
|
|
size_t len,
|
|
void *ctx);
|
|
|
|
ssize_t patty_ax25_frame_encode(patty_ax25_frame *frame,
|
|
enum patty_ax25_frame_format format,
|
|
void *buf,
|
|
size_t len);
|
|
|
|
ssize_t patty_ax25_frame_encode_reply_to(patty_ax25_frame *frame,
|
|
patty_ax25_frame *reply,
|
|
enum patty_ax25_frame_format format,
|
|
void *buf,
|
|
size_t len);
|
|
|
|
enum patty_ax25_version patty_ax25_frame_version(patty_ax25_frame *frame);
|
|
|
|
enum patty_ax25_frame_type patty_ax25_frame_type(patty_ax25_frame *frame);
|
|
|
|
enum patty_ax25_frame_cr patty_ax25_frame_cr(patty_ax25_frame *frame);
|
|
|
|
ssize_t patty_ax25_frame_info(patty_ax25_frame *frame,
|
|
void **info);
|
|
|
|
#endif /* _PATTY_AX25_FRAME_H */
|