OpenModem/protocol/AX25.h

73 lines
1.8 KiB
C
Raw Normal View History

2014-12-02 19:10:06 -05:00
#ifndef PROTOCOL_AX25_H
#define PROTOCOL_AX25_H
#include <stdio.h>
#include <stdbool.h>
2014-12-18 17:45:36 -05:00
#include "device.h"
2014-12-02 19:10:06 -05:00
#define AX25_MIN_FRAME_LEN 18
2014-12-18 17:45:36 -05:00
#ifndef CUSTOM_FRAME_SIZE
#define AX25_MAX_FRAME_LEN 620
#else
#define AX25_MAX_FRAME_LEN CUSTOM_FRAME_SIZE
#endif
2014-12-02 19:10:06 -05:00
#define AX25_CRC_CORRECT 0xF0B8
#define AX25_CTRL_UI 0x03
#define AX25_PID_NOLAYER3 0xF0
struct AX25Ctx; // Forward declaration
2014-12-18 17:45:36 -05:00
struct AX25Msg;
2014-12-02 19:10:06 -05:00
#if SERIAL_PROTOCOL == PROTOCOL_KISS
typedef void (*ax25_callback_t)(struct AX25Ctx *ctx);
#endif
2014-12-18 17:45:36 -05:00
#if SERIAL_PROTOCOL == PROTOCOL_SIMPLE_SERIAL
typedef void (*ax25_callback_t)(struct AX25Msg *msg);
#endif
typedef struct AX25Ctx {
2014-12-02 19:10:06 -05:00
uint8_t buf[AX25_MAX_FRAME_LEN];
FILE *ch;
size_t frame_len;
uint16_t crc_in;
uint16_t crc_out;
ax25_callback_t hook;
bool sync;
bool escape;
} AX25Ctx;
2014-12-18 17:45:36 -05:00
#if SERIAL_PROTOCOL == PROTOCOL_SIMPLE_SERIAL
#define AX25_CALL(str, id) {.call = (str), .ssid = (id) }
#define AX25_MAX_RPT 8
#define AX25_REPEATED(msg, n) ((msg)->rpt_flags & BV(n))
typedef struct AX25Call {
char call[6];
uint8_t ssid;
} AX25Call;
typedef struct AX25Msg {
AX25Call src;
AX25Call dst;
AX25Call rpt_list[AX25_MAX_RPT];
uint8_t rpt_count;
uint8_t rpt_flags;
uint16_t ctrl;
uint8_t pid;
const uint8_t *info;
size_t len;
} AX25Msg;
void ax25_sendVia(AX25Ctx *ctx, const AX25Call *path, size_t path_len, const void *_buf, size_t len);
#define ax25_send(ctx, dst, src, buf, len) ax25_sendVia(ctx, ({static AX25Call __path[]={dst, src}; __path;}), 2, buf, len)
#endif
2014-12-02 19:10:06 -05:00
void ax25_poll(AX25Ctx *ctx);
void ax25_sendRaw(AX25Ctx *ctx, void *_buf, size_t len);
void ax25_init(AX25Ctx *ctx, FILE *channel, ax25_callback_t hook);
#endif