patty/include/patty/ax25/frame.h
XANTRONIX Development a4518a839a Implement better modulo-128 I and S frame support
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
2024-03-01 00:20:46 -05:00

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 */