304 lines
8.5 KiB
C
304 lines
8.5 KiB
C
// ax.25 code for QtTERMTCP KISS Mode
|
||
|
||
// based on SoundModem/QtSoundModem ax.25 code
|
||
|
||
// The underlying code allows for up to four KISS ports, but at the moment
|
||
// the config and user interface only supports 1
|
||
|
||
// The code supports KISS over a Serial port or TCP connection
|
||
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <math.h>
|
||
#include <stdio.h>
|
||
#include <ctype.h>
|
||
#include <time.h>
|
||
|
||
#define UNUSED(x) (void)(x)
|
||
|
||
#define single float
|
||
#define boolean int
|
||
#define Byte unsigned char // 0 to 255
|
||
#define Word unsigned short // 0 to 65,535
|
||
#define SmallInt short // -32,768 to 32,767
|
||
#define LongWord unsigned int // 0 to 4,294,967,295
|
||
// Int6 : Cardinal; // 0 to 4,294,967,295
|
||
#define LongInt int // -2,147,483,648 to 2,147,483,647
|
||
#define Integer int // -2,147,483,648 to 2,147,483,647
|
||
//#define Int64 long long // -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
|
||
|
||
//#define Byte unsigned char // 0 to 255
|
||
#define word unsigned short // 0 to 65,535
|
||
#define smallint short // -32,768 to 32,767
|
||
#define longword unsigned int // 0 to 4,294,967,295
|
||
// Int6 : Cardinal; // 0 to 4,294,967,295
|
||
#define longint int // -2,147,483,648 to 2,147,483,647
|
||
#define integer int // -2,147,483,648 to 2,147,483,647
|
||
|
||
typedef unsigned long ULONG;
|
||
|
||
#define UCHAR unsigned char
|
||
#define UINT unsigned int
|
||
#define BOOL int
|
||
#define TRUE 1
|
||
#define FALSE 0
|
||
|
||
#define FEND 0xc0
|
||
#define FESC 0xDB
|
||
#define TFEND 0xDC
|
||
#define TFESC 0xDD
|
||
|
||
#define port_num 32 // ?? Max AGW sessions
|
||
#define PKT_ERR 15 // Minimum packet size, bytes
|
||
#define I_MAX 7 // Maximum number of packets
|
||
|
||
|
||
// Status flags
|
||
|
||
#define STAT_NO_LINK 0
|
||
#define STAT_LINK 1
|
||
#define STAT_CHK_LINK 2
|
||
#define STAT_WAIT_ANS 3
|
||
#define STAT_TRY_LINK 4
|
||
#define STAT_TRY_UNLINK 5
|
||
|
||
|
||
// <20>md,Resp,Poll,Final,Digipeater flags
|
||
#define SET_P 1
|
||
#define SET_F 0
|
||
#define SET_C 1
|
||
#define SET_R 0
|
||
#define SET_NO_RPT 0
|
||
#define SET_RPT 1
|
||
// Frame ID flags
|
||
#define I_FRM 0
|
||
#define S_FRM 1
|
||
#define U_FRM 2
|
||
#define I_I 0
|
||
#define S_RR 1
|
||
#define S_RNR 5
|
||
#define S_REJ 9
|
||
#define S_SREJ 0x0D
|
||
#define U_SABM 47
|
||
#define U_DISC 67
|
||
#define U_DM 15
|
||
#define U_UA 99
|
||
#define U_FRMR 135
|
||
#define U_UI 3
|
||
// PID flags
|
||
#define PID_X25 0x01 // 00000001-CCIT X25 PLP
|
||
#define PID_SEGMENT 0x08 // 00001000-Segmentation fragment
|
||
#define PID_TEXNET 0xC3 // 11000011-TEXNET Datagram Protocol
|
||
#define PID_LQ 0xC4 // 11001000-Link Quality Protocol
|
||
#define PID_APPLETALK 0xCA // 11001010-Appletalk
|
||
#define PID_APPLEARP 0xCB // 11001011-Appletalk ARP
|
||
#define PID_IP 0xCC // 11001100-ARPA Internet Protocol
|
||
#define PID_ARP 0xCD // 11001101-ARPA Address Resolution Protocol
|
||
#define PID_NET_ROM 0xCF // 11001111-NET/ROM
|
||
|
||
#define FX25_LOAD 1
|
||
|
||
#define MODE_OUR 0
|
||
#define MODE_OTHER 1
|
||
#define MODE_RETRY 2
|
||
|
||
#define TIMER_FREE 0
|
||
#define TIMER_BUSY 1
|
||
#define TIMER_OFF 2
|
||
#define TIMER_EVENT_ON 3
|
||
#define TIMER_EVENT_OFF 4
|
||
|
||
|
||
typedef struct string_T
|
||
{
|
||
unsigned char * Data;
|
||
int Length;
|
||
int AllocatedLength; // A reasonable sized block is allocated at the start to speed up adding chars
|
||
|
||
}string;
|
||
|
||
typedef struct TStringList_T
|
||
{
|
||
int Count;
|
||
string ** Items;
|
||
|
||
} TStringList;
|
||
|
||
|
||
typedef struct AGWUser_t
|
||
{
|
||
void *socket;
|
||
string * data_in;
|
||
TStringList AGW_frame_buf;
|
||
boolean Monitor;
|
||
boolean Monitor_raw;
|
||
boolean reportFreqAndModem; // Can report modem and frequency to host
|
||
|
||
} AGWUser;
|
||
|
||
typedef struct TAX25Info_t
|
||
{
|
||
longint stat_s_pkt;
|
||
longint stat_s_byte;
|
||
longint stat_r_pkt;
|
||
longint stat_r_byte;
|
||
longint stat_r_fc;
|
||
longint stat_fec_count;
|
||
time_t stat_begin_ses;
|
||
time_t stat_end_ses;
|
||
longint stat_l_r_byte;
|
||
longint stat_l_s_byte;
|
||
|
||
} TAX25Info;
|
||
|
||
typedef struct TAX25Port_t
|
||
{
|
||
Byte hi_vs;
|
||
Byte vs;
|
||
Byte vr;
|
||
Byte PID;
|
||
TStringList in_data_buf;
|
||
TStringList frm_collector;
|
||
string frm_win[8];
|
||
string out_data_buf;
|
||
word t1;
|
||
word t2;
|
||
word t3;
|
||
Byte i_lo;
|
||
Byte i_hi;
|
||
word n1;
|
||
word n2;
|
||
word IPOLL_cnt;
|
||
TStringList frame_buf; //<2F><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
TStringList I_frame_buf;
|
||
Byte status;
|
||
word clk_frack;
|
||
char corrcall[10];
|
||
char mycall[10];
|
||
UCHAR digi[56];
|
||
UCHAR Path[80]; // Path in ax25 format - added to save building it each time
|
||
UCHAR ReversePath[80];
|
||
int snd_ch; // Simplifies parameter passing
|
||
int port;
|
||
int pathLen;
|
||
void * socket;
|
||
void * Sess;
|
||
char kind[16];
|
||
TAX25Info info;
|
||
} TAX25Port;
|
||
|
||
typedef struct TKISSMode_t
|
||
{
|
||
string * data_in;
|
||
void * Socket; // Used as a key
|
||
|
||
// Not sure what rest are used for. Seems to be one per channel
|
||
|
||
TStringList buffer[4]; // Outgoing Frames
|
||
|
||
} TKISSMode;
|
||
|
||
// Dephi emulation functions
|
||
|
||
string * Strings(TStringList * Q, int Index);
|
||
void Clear(TStringList * Q);
|
||
int Count(TStringList * List);
|
||
|
||
string * newString();
|
||
string * copy(string * Source, int StartChar, int Count);
|
||
TStringList * newTStringList();
|
||
|
||
void freeString(string * Msg);
|
||
void initString(string * S);
|
||
void initTStringList(TStringList* T);
|
||
|
||
// Two delete() This is confusing!!
|
||
// Not really - one acts on String, other TStringList
|
||
|
||
void Delete(TStringList * Q, int Index);
|
||
void mydelete(string * Source, int StartChar, int Count);
|
||
void move(UCHAR * SourcePointer, UCHAR * DestinationPointer, int CopyCount);
|
||
void fmove(float * SourcePointer, float * DestinationPointer, int CopyCount);
|
||
void setlength(string * Msg, int Count); // Set string length
|
||
string * stringAdd(string * Msg, UCHAR * Chars, int Count); // Extend string
|
||
void Assign(TStringList * to, TStringList * from); // Duplicate from to to
|
||
string * duplicateString(string * in);
|
||
int my_indexof(TStringList * l, string * s);
|
||
boolean compareStrings(string * a, string * b);
|
||
int Add(TStringList * Q, string * Entry);
|
||
void Debugprintf(const char * format, ...);
|
||
void ax25_info_init(TAX25Port * AX25Sess);
|
||
void clr_frm_win(TAX25Port * AX25Sess);
|
||
void decode_frame(Byte * frame, int len, Byte * path, string * data,
|
||
Byte * pid, Byte * nr, Byte * ns, Byte * f_type, Byte * f_id,
|
||
Byte * rpt, Byte * pf, Byte * cr);
|
||
#ifdef __cplusplus
|
||
extern "C" void KISSSendtoServer(myTcpSocket* Socket, char * Data, int Length);
|
||
extern "C" void monitor_frame(int snd_ch, string * frame, char * code, int tx, int excluded);
|
||
extern "C" void WriteDebugLog(char * Mess);
|
||
extern "C" void SendtoTerm(Ui_ListenSession * Sess, char * Msg, int Len);
|
||
extern "C" void ClearSessLabel(Ui_ListenSession * Sess);
|
||
extern "C" void rst_timer(TAX25Port * AX25Sess);
|
||
extern "C" void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int MsgLen);
|
||
#else
|
||
void monitor_frame(int snd_ch, string * frame, char * code, int tx, int excluded);
|
||
void SendtoTerm(void * Sess, char * Msg, int Len);
|
||
void ClearSessLabel(void * Sess);
|
||
void WriteDebugLog(char * Mess);
|
||
void AX25_disc(TAX25Port * AX25Sess, Byte mode);
|
||
void rst_timer(TAX25Port * AX25Sess);
|
||
void Send_UI(int port, Byte PID, char * CallFrom, char *CallTo, Byte * Msg, int MsgLen);
|
||
#endif
|
||
|
||
BOOL ConvToAX25(char * callsign, unsigned char * ax25call);
|
||
int ConvFromAX25(unsigned char * incall, char * outcall);
|
||
void reverse_addr(Byte * path, Byte * revpath, int Len);
|
||
void set_DM(int snd_ch, Byte * path);
|
||
void set_link(TAX25Port * AX25Sess, UCHAR * axpath);
|
||
boolean is_last_digi(Byte *path);
|
||
boolean is_correct_path(Byte * path, Byte pid);
|
||
int number_digi(unsigned char * path);
|
||
void AX25_conn(TAX25Port * AX25Sess, int snd_ch, Byte mode);
|
||
void write_ax25_info(TAX25Port * AX25Sess);
|
||
void rst_values(TAX25Port * AX25Sess);
|
||
|
||
#ifdef __cplusplus
|
||
extern "C"
|
||
{
|
||
#endif
|
||
|
||
extern boolean dyn_frack[4];
|
||
extern Byte recovery[4];
|
||
extern Byte users[4];
|
||
|
||
extern int resptime[4];
|
||
extern int slottime[4];
|
||
extern int persist[4];
|
||
extern int kisspaclen[4];
|
||
extern int fracks[4];
|
||
extern int frack_time[4];
|
||
extern int idletime[4];
|
||
extern int redtime[4];
|
||
extern int IPOLL[4];
|
||
extern int maxframe[4];
|
||
extern int TXFrmMode[4];
|
||
|
||
extern char MyDigiCall[4][512];
|
||
extern char exclude_callsigns[4][512];
|
||
extern char exclude_APRS_frm[4][512];
|
||
|
||
extern TStringList list_exclude_callsigns[4];
|
||
extern TStringList list_exclude_APRS_frm[4];
|
||
extern TStringList list_digi_callsigns[4];
|
||
|
||
extern int max_frame_collector[4];
|
||
extern boolean KISS_opt[4];
|
||
|
||
extern TAX25Port AX25Port[4][port_num];
|
||
|
||
extern TStringList KISS_acked[];
|
||
extern TStringList KISS_iacked[];
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif |