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
|