Changes: * Split patty_ax25_frame_decode() into the following: - patty_ax25_frame_decode_address() - patty_ax25_frame_decode_control() This allows for look up an established socket for a given address pair, to determine if an SABME session is in progress, necessitating modulo-128 control decoding * Decode I and S N(R), N(S) sequence numbers, poll/final bits properly in both modulo-8 and modulo-128 mode * Perform better frame control validation * Implement the following functions in src/sock.c: - patty_ax25_sock_send_rr() - patty_ax25_sock_send_rnr() - patty_ax25_sock_send_rej() - patty_ax25_sock_send_srej() Corresponding functions have been removed from src/server.c * Implement better functions in src/sock.c for encoding frame control, with send/receive sequences associated with the socket, with modulo-128 encoding for SABME sessions Other changes: * Move or delete macros from include/patty/ax25/macros.h into include/patty/ax25.h and include/patty/ax25/frame.h * Move definitions from include/patty/ax25/proto.h to header file include/patty/ax25.h * Perform better bounds checking while decoding frames * Improve frame control printing in src/print.c; display frame type names, N(R), (NS) sequence numbers, and poll/final bits
117 lines
3.5 KiB
C
117 lines
3.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_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_type type;
|
|
|
|
uint8_t proto;
|
|
void *info;
|
|
size_t infolen;
|
|
} patty_ax25_frame;
|
|
|
|
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(patty_ax25_frame *frame,
|
|
enum patty_ax25_frame_format format,
|
|
void *buf,
|
|
size_t len);
|
|
|
|
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 */
|