kopia lustrzana https://github.com/sp9skp/spdxl
299 wiersze
6.5 KiB
C
299 wiersze
6.5 KiB
C
/*
|
|
* dxlAPRS toolchain
|
|
*
|
|
* Copyright (C) Christian Rabler <oe5dxl@oevsv.at>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
|
|
#ifndef l2_H_
|
|
#define l2_H_
|
|
#ifndef X2C_H_
|
|
#include "X2C.h"
|
|
#endif
|
|
|
|
typedef uint16_t l2_SET16;
|
|
|
|
typedef uint8_t l2_SET8;
|
|
|
|
extern uint16_t l2_UA;
|
|
|
|
extern uint16_t l2_DM;
|
|
|
|
extern uint16_t l2_SABM;
|
|
|
|
extern uint16_t l2_DISC;
|
|
|
|
extern uint16_t l2_FRMR;
|
|
|
|
extern uint16_t l2_UI;
|
|
|
|
extern uint16_t l2_RR;
|
|
|
|
extern uint16_t l2_REJ;
|
|
|
|
extern uint16_t l2_RNR;
|
|
|
|
#define l2_PORTS 15
|
|
/* portset is SET16 */
|
|
|
|
#define l2_MYCALLS 16
|
|
|
|
typedef char l2_CALLTYP[7];
|
|
|
|
typedef char * l2_pSTRING;
|
|
|
|
struct l2_DFIELD;
|
|
|
|
typedef struct l2_DFIELD * l2_pDATA;
|
|
|
|
|
|
struct l2_DFIELD {
|
|
l2_pDATA next;
|
|
uint16_t len;
|
|
char info[257]; /*incl PID*/
|
|
};
|
|
|
|
typedef void *l2_pLINK;
|
|
|
|
typedef char l2_AFIELD[71];
|
|
|
|
enum l2_EVENT {l2_eCONNECTED, l2_eDISCONNECTED, l2_eBUSY, l2_eTXFREE,
|
|
l2_eRXDATA, l2_eMONITOR,
|
|
l2_eLISTEN, l2_eIDLE, l2_eCONNREQ, l2_eFLEXDATA};
|
|
|
|
|
|
extern char l2_L2Lock; /*disable interrupt starting L2*/
|
|
|
|
extern uint16_t l2_LostINT;
|
|
|
|
extern l2_pDATA l2_dbuf; /*must be new allocated after use*/
|
|
|
|
extern l2_AFIELD l2_adress; /*static adress field*/
|
|
|
|
extern uint16_t l2_asize; /*length of static adress*/
|
|
|
|
extern char l2_udp2buf[100]; /* axudp2 header after Getframe */
|
|
|
|
struct l2__D0;
|
|
|
|
struct l2__D1;
|
|
|
|
|
|
struct l2__D1 {
|
|
uint16_t Isent; /*I-frames sent, without I.P*/
|
|
uint16_t Iack; /*therefrom ackowledged*/
|
|
uint16_t Igot; /*I-frames got and accepted*/
|
|
uint32_t Bytesent; /*all frames + FCS + 1 flag*/
|
|
uint32_t Bytegot; /*all frames + FCS + 1 flag*/
|
|
};
|
|
|
|
|
|
struct l2__D0 {
|
|
uint16_t Links; /*statistics: links, including inactives*/
|
|
uint16_t MaxLinks;
|
|
struct l2__D1 Flows[13];
|
|
};
|
|
|
|
extern struct l2__D0 l2_PortSt[16];
|
|
|
|
struct l2__D2;
|
|
|
|
|
|
struct l2__D2 {
|
|
union {
|
|
/* (*c*) = rangecheck necessary*/
|
|
uint16_t card[17];
|
|
struct {
|
|
uint16_t SendPort; /*c*/ /*associated send port to that uplinkport*/
|
|
uint16_t Diversity; /*c*/ /*accept frames to existing links from ports with same numbers*/
|
|
uint16_t DCDlevel;
|
|
uint16_t TXwait; /*wait after sending before sending again*/
|
|
uint16_t TXtail; /*for fullduplex*/
|
|
uint16_t TXdel; /*txdelay*/
|
|
uint16_t DCDwait; /*wait after dcd before sending*/
|
|
uint16_t BaudSwBytes; /*c*/ /*number of flags sent after baud-switch*/
|
|
uint16_t txDelByte; /*bit pattern sent for sync*/
|
|
uint16_t MaxFrames; /*c*/ /*send windowsize*/
|
|
uint16_t T1;
|
|
uint16_t T3;
|
|
uint16_t IPoll; /*max info length for I.Poll*/
|
|
uint16_t Retries;
|
|
uint16_t MhTime; /*0 = mh off*/
|
|
uint16_t DCDIGNOR; /*ignore dcd longer than this time/dama slave off*/
|
|
} _0;
|
|
} _;
|
|
char monitor;
|
|
char passall;
|
|
char DamaMaster;
|
|
char HalfDuplex;
|
|
char Digipeat;
|
|
char Echo;
|
|
char SendBauds[17]; /*relation mycall <-> baud*/
|
|
};
|
|
|
|
extern struct l2__D2 l2_Parms[15];
|
|
|
|
typedef uint16_t l2_CMD;
|
|
|
|
enum l2_CONNTYP {l2_cNORMAL, l2_cCONNAK, l2_cFLEXback, l2_cFLEXbusy,
|
|
l2_cTEST};
|
|
|
|
|
|
struct l2_CONNECT;
|
|
|
|
typedef struct l2_CONNECT * l2_pCONNECT;
|
|
|
|
|
|
struct l2_CONNECT {
|
|
/* cmd:CARD16;*/
|
|
uint16_t handle;
|
|
uint16_t port; /*the port number of uplink port*/
|
|
uint16_t baud; /*baud is the index of sendbaud-table*/
|
|
uint16_t cpid; /*PID*/
|
|
l2_pSTRING l2adr; /*0-terminated unshifted raw ax.25 adress*/
|
|
l2_pSTRING l3adr; /*0-terminated SABM-with-info text for routing
|
|
unused if points to NIL*/
|
|
uint8_t typ; /*TEST returns an existing link with same adress*/
|
|
};
|
|
|
|
struct l2_SENDUI;
|
|
|
|
typedef struct l2_SENDUI * l2_pSENDUI;
|
|
|
|
|
|
struct l2_SENDUI {
|
|
char cmd; /* frame cmd */
|
|
uint16_t port;
|
|
uint16_t baud;
|
|
l2_pSTRING path; /*0-terminated, raw, unshifted ax.25 adress-field*/
|
|
uint16_t datalen;
|
|
l2_pSTRING data; /* PID is part of data */
|
|
};
|
|
|
|
struct l2_GETADRESS;
|
|
|
|
typedef struct l2_GETADRESS * l2_pGETADRESS;
|
|
|
|
|
|
struct l2_GETADRESS {
|
|
uint16_t cmd;
|
|
uint16_t port; /*number of uplink port*/
|
|
uint16_t my; /*number of mycall*/
|
|
uint16_t cpid; /*65535 if not known*/
|
|
char adress[72]; /*0-terminated, raw ax.25 adress*/
|
|
};
|
|
|
|
struct l2_GETSTAT;
|
|
|
|
typedef struct l2_GETSTAT * l2_pGETSTAT;
|
|
|
|
|
|
struct l2_GETSTAT {
|
|
uint16_t cmd;
|
|
l2_pLINK l;
|
|
uint16_t n;
|
|
uint16_t st;
|
|
uint16_t port;
|
|
uint16_t my;
|
|
uint16_t txbu;
|
|
uint16_t ret;
|
|
char bsy;
|
|
char remb;
|
|
l2_pLINK nudl;
|
|
char adress[72];
|
|
uint32_t sent;
|
|
uint32_t ack;
|
|
uint32_t rcvd;
|
|
uint32_t since;
|
|
};
|
|
|
|
typedef uint32_t l2_SUMMS[7];
|
|
|
|
struct l2_PORTSTAT;
|
|
|
|
typedef struct l2_PORTSTAT * l2_pPORTSTAT;
|
|
|
|
|
|
struct l2_PORTSTAT {
|
|
uint16_t cmd;
|
|
uint16_t port;
|
|
uint16_t minits5;
|
|
l2_SUMMS sums;
|
|
uint16_t mem;
|
|
uint32_t time0;
|
|
};
|
|
|
|
struct l2_PARMS0;
|
|
|
|
typedef struct l2_PARMS0 * l2_pPARMS;
|
|
|
|
|
|
struct l2_PARMS0 {
|
|
uint16_t cmd;
|
|
uint16_t port;
|
|
uint16_t parm;
|
|
char test; /* get instead of set parm */
|
|
uint32_t val; /* for numeric values */
|
|
l2_pSTRING str; /* for string values */
|
|
};
|
|
|
|
typedef void ( *l2_CALLBACKPROC)(char * *, l2_pLINK, uint8_t);
|
|
|
|
extern l2_pLINK l2_Connect0(char *, l2_pCONNECT);
|
|
/* NIL if no link */
|
|
/*mp: adress that is enclosed in all messages from L2 to
|
|
the host and may point to host-task-context*/
|
|
|
|
extern void l2_Disconnect(l2_pLINK *, char);
|
|
/*if dealloc, the owner of the link will be l2, else owner stays
|
|
the host and it must send a disconnect with dealloc later to
|
|
release memory and timers*/
|
|
|
|
extern void l2_Circuit(l2_pLINK *, l2_pLINK *, char, char,
|
|
uint16_t);
|
|
/*links streams of l1 and l2, if not reconn, then
|
|
the link will then belong to L2 again
|
|
reconn: if the other link disconnects, this links
|
|
datastream will be switched back to host
|
|
exitchar: if first char in l1-input-stream equals exitchar
|
|
the stream of l1 will be switched to host*/
|
|
|
|
extern void l2_GetAdress0(l2_pLINK, l2_pGETADRESS);
|
|
|
|
extern void l2_Getudp2info(l2_pLINK, char [], uint32_t);
|
|
|
|
extern char l2_GetChar(l2_pLINK, char, char *);
|
|
/*returns false if buffer is empty
|
|
delete: delete char from buffer after get*/
|
|
|
|
extern uint16_t l2_GetStr(l2_pLINK, uint16_t, l2_pSTRING);
|
|
/*return is length of data */
|
|
|
|
extern char l2_SendStr(l2_pLINK, uint16_t, l2_pSTRING);
|
|
/* max 256 byte, false if data not sent (sendbuffer full) */
|
|
|
|
extern void l2_SendRaw(l2_pSENDUI);
|
|
/* pid >255 send no pid */
|
|
|
|
extern void l2_GetStat0(l2_pGETSTAT);
|
|
|
|
extern char l2_PortStat0(l2_pPORTSTAT);
|
|
/* true if port is enabled */
|
|
|
|
extern void l2_Parm(l2_pPARMS);
|
|
|
|
extern l2_pLINK l2_GetMon(void);
|
|
|
|
extern void l2_Layer2(void);
|
|
/*started by 10ms interrupt-ticker if not L2Lock*/
|
|
|
|
extern void l2_L2Init(uint16_t, uint16_t, l2_CALLBACKPROC);
|
|
|
|
|
|
extern void l2_BEGIN(void);
|
|
|
|
|
|
#endif /* l2_H_ */
|