master 24.72a
John Wiseman 7 months ago
parent 2af4cf380b
commit fcb3973abd

@ -0,0 +1,207 @@
#ifndef CONFIGSTRUCT
#define CONFIGSTRUCT
// MAKE SURE SHORTS ARE CORRECTLY ALLIGNED FOR ARMV5
struct PORTCONFIG
{
short PORTNUM;
char ID[30]; //2
short TYPE; // 32,
short PROTOCOL; // 34,
short IOADDR; // 36,
short INTLEVEL; // 38,
unsigned short SPEED; // 40,
unsigned char CHANNEL; // 42,
unsigned char pad;
short BBSFLAG; // 44,
short QUALITY; // 46,
short MAXFRAME; // 48,
short TXDELAY; // 50,
short SLOTTIME; // 52,
short PERSIST; // 54,
short FULLDUP; // 56,
short SOFTDCD; // 58,
short FRACK; // 60,
short RESPTIME; // 62,
short RETRIES; // 64,
short PACLEN; // 66,
short QUALADJUST; // 68,
UCHAR DIGIFLAG; // 70,
UCHAR DIGIPORT; // 71
short DIGIMASK; // 72
short USERS; // 74,
short TXTAIL; // 76
unsigned char ALIAS_IS_BBS; // 78
unsigned char pad2;
char CWID[10]; // 80,
char PORTCALL[10]; // 90,
char PORTALIAS[10]; // 100,
char L3ONLY; // 110,
char IGNOREUNLOCKED; // 111
short KISSOPTIONS; // 112,
short INTERLOCK; // 114,
short NODESPACLEN; // 116,
short TXPORT; // 118,
UCHAR MHEARD; // 120,
UCHAR CWIDTYPE; // 121,
char MINQUAL; // 122,
char MAXDIGIS; // 123,
char DefaultNoKeepAlives; // 124
char UIONLY; // 125,
unsigned short ListenPort; // 126
char UNPROTO[72]; // 128,
char PORTALIAS2[10]; // 200,
char DLLNAME[16]; // 210,
char BCALL[10]; // 226,
unsigned long IPADDR; // 236
char I2CMode; // 240
char I2CAddr; // 241
char INP3ONLY; // 242
char NoNormalize; // 243 Normalise Nodes Qualities
unsigned short TCPPORT; // 244
char Pad2[10]; // 246
char VALIDCALLS[256]; // 256 - 512
struct WL2KInfo * WL2K; // 512
char * SerialPortName; // 516
struct XDIGI * XDIGIS; // 596 Cross port digi setup
int RIGPORT; // Linked port with RigControl
unsigned int PERMITTEDAPPLS; // Appls allowed on this port
int HavePermittedAppls; // Indicated PERMITTEDAPPLS uses
int Hide; // Don't show on Ports display or AGW Connect Menu
// long long txOffset; // Transverter tx offset
// long long rxOffset; // Transverter rx offset ppa
int SmartID;
unsigned char * KissParams;
int SendtoM0LTEMap;
uint64_t PortFreq;
char * M0LTEMapInfo;
int QtSMPort;
int AllowINP3;
};
struct ROUTECONFIG
{
char call[80]; // May have VIA
int quality;
int port;
int pwind;
int pfrack;
int ppacl;
int farQual;
};
struct CONFIGTABLE
{
// CONFIGURATION DATA STRUCTURE
// DEFINES LAYOUT OF CONFIG RECORD PRODUCED BY CONFIGURATION PROG
char C_NODECALL[10]; // OFFSET = 0
char C_NODEALIAS[10]; // OFFSET = 10
char C_BBSCALL[10]; // OFFSET = 20
char C_BBSALIAS[10]; // OFFSET = 30
short C_OBSINIT; // OFFSET = 40
short C_OBSMIN; // OFFSET = 42
short C_NODESINTERVAL; // OFFSET = 44
short C_L3TIMETOLIVE; // OFFSET = 46
short C_L4RETRIES; // OFFSET = 48
short C_L4TIMEOUT; // OFFSET = 50
short C_BUFFERS; // OFFSET = 52
short C_PACLEN; // OFFSET = 54
short C_TRANSDELAY; // OFFSET = 56
short C_T3; // OFFSET = 58
short Spare1; // OFFSET = 60
short Spare2; // OFFSET = 62
short C_IDLETIME; // OFFSET = 64
UCHAR C_EMSFLAG; // OFFSET = 66
UCHAR C_LINKEDFLAG; // OFFSET = 67
UCHAR C_BBS; // OFFSET = 68
UCHAR C_NODE; // OFFSET = 69
UCHAR C_HOSTINTERRUPT; // OFFSET = 70
UCHAR C_DESQVIEW; // OFFSET = 71
short C_MAXLINKS; // OFFSET = 72
short C_MAXDESTS;
short C_MAXNEIGHBOURS;
short C_MAXCIRCUITS; // 78
UCHAR C_TNCPORTLIST[16]; // OFFSET = 80
short C_IDINTERVAL; // 96
short C_FULLCTEXT; // 98 ; SPARE (WAS DIGIFLAG)
short C_MINQUAL; // 100
UCHAR C_HIDENODES; // 102
UCHAR C_AUTOSAVE; // 103
short C_L4DELAY; // 104
short C_L4WINDOW; // 106
short C_BTINTERVAL; // 108
UCHAR C_L4APPL; // 110
UCHAR C_C; // 111 "C" = HOST Command Enabled
UCHAR C_IP; // 112 IP Enabled
UCHAR C_MAXRTT; // 113
UCHAR C_MAXHOPS; // 114
UCHAR C_PM; // 115 Poermapper Enabled
UCHAR C_LogL4Connects; // 116
UCHAR C_SaveMH; // 117
short C_BBSQUAL; // 118
UCHAR C_WASUNPROTO;
UCHAR C_BTEXT[120]; // 121
char C_VERSTRING[10]; // 241 Version String from Config File
UCHAR C_ADIF;
UCHAR C_EVENTS;
UCHAR C_LogAllConnects;
UCHAR C_SaveAPRSMsgs;
UCHAR C_M0LTEMap;
UCHAR C_VERSION; // CONFIG PROG VERSION
// Reuse C_APPLICATIONS - no longer used
char C_NETROMCALL[10];
UCHAR C_EXCLUDE[71];
char C_IDMSG[512];
char C_CTEXT[512];
char C_INFOMSG[2048];
UCHAR CfgBridgeMap[MaxBPQPortNo + 1][MaxBPQPortNo + 1];
struct ROUTECONFIG C_ROUTE[MaxLockedRoutes];
struct APPLCONFIG C_APPL[NumberofAppls];
struct PORTCONFIG C_PORT[MaxBPQPortNo + 4];
int C_MQTT;
char C_MQTT_HOST[80];
int C_MQTT_PORT;
char C_MQTT_USER[80];
char C_MQTT_PASS[80];
int C_L4Compress;
int C_L4CompMaxframe;
int C_L4CompPaclen;
int C_L2Compress;
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
int C_OnlyVer2point0;
//#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer
//#define InfoMax 2000 // Max Info
//#define C_IDMSG 512
//#define C_ROUTES 90000 // Allow 2500
//#define C_CTEXT 2048
//#define C_PORTS 2560
//#define C_INFOMSG 85000
};
struct UPNP
{
struct UPNP * Next;
char * Protocol;
char * LANport;
char * WANPort;
};
#endif

@ -0,0 +1,126 @@
#ifdef Kernel
#define Vers 5,2,9,2
#define Verstring "5.2.9.2\0"
#define Datestring "September 2012"
#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#endif
#define KVers 6,0,24,72
#define KVerstring "6.0.24.72\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "April 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0"
#define VerProduct "BPQ32"
#endif
#ifdef TermTCP
#define Vers 1,0,16,2
#define Verstring "1.0.16.2\0"
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTermTCP"
#endif
#ifdef BPQTerm
#define Vers 2,2,5,2
#define Verstring "2.2.5.2\0"
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
#define VerProduct "BPQTerminal"
#endif
#ifdef BPQTermMDI
#define Vers 2,2,0,3
#define Verstring "2.2.0.3\0"
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
#endif
#ifdef MAIL
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Mail server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQMail"
#endif
#ifdef HOSTMODES
#define Vers 1,1,8,1
#define Verstring "1.1.8.1\0"
//#define SPECIALVERSION "Test 3"
#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQHostModes"
#endif
#ifdef UIUTIL
#define Vers 0,1,3,1
#define Verstring "0.1.3.1\0"
#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
#define VerDesc "Beacon Utility for G8BPQ Switch\0"
#define VerProduct "BPQUIUtil"
#endif
#ifdef AUTH
#define Vers 0,1,0,0
#define Verstring "0.1.0.0\0"
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
#endif
#ifdef APRS
#define Vers KVers
#define Verstring KVerstring
#define VerComments "APRS Client for G8BPQ Switch\0"
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
#define VerDesc "APRS Client for G8BPQ Switch\0"
#define VerProduct "BPQAPRS"
#endif
#ifdef CHAT
#define Vers KVers
#define Verstring KVerstring
#define VerComments "Chat server for G8BPQ Packet Switch\0"
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
#define VerProduct "BPQChat"
#endif

@ -0,0 +1,451 @@
//
// Prototypes for BPQ32 Node Functions
//
#define DllImport
#define EXCLUDEBITS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "compatbits.h"
#include "asmstrucs.h"
BOOL CheckExcludeList(UCHAR * Call);
Dll int ConvFromAX25(unsigned char * incall,unsigned char * outcall);
Dll BOOL ConvToAX25(unsigned char * callsign, unsigned char * ax25call);
DllExport BOOL ConvToAX25Ex(unsigned char * callsign, unsigned char * ax25call);
int WritetoConsoleLocal(char * buff);
VOID Consoleprintf(const char * format, ...);
VOID FreeConfig();
int GetListeningPortsPID(int Port);
void * InitializeExtDriver(PEXTPORTDATA PORTVEC);
VOID PutLengthinBuffer(PDATAMESSAGE buff, USHORT datalen); // Needed for arm5 portability
int GetLengthfromBuffer(PDATAMESSAGE buff);
int IntDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, uint64_t Mask, BOOL APRS, BOOL MCTL);
int IntSetTraceOptionsEx(uint64_t mask, int mtxparam, int mcomparam, int monUIOnly);
int CountBits64(uint64_t in);
#define GetSemaphore(Semaphore,ID) _GetSemaphore(Semaphore, ID, __FILE__, __LINE__)
#define GetBuff() _GetBuff(__FILE__, __LINE__)
#define ReleaseBuffer(s) _ReleaseBuffer(s, __FILE__, __LINE__)
#define CheckGuardZone() _CheckGuardZone(__FILE__, __LINE__)
#define Q_REM(s) _Q_REM(s, __FILE__, __LINE__)
#define Q_REM_NP(s) _Q_REM_NP(s, __FILE__, __LINE__)
#define C_Q_ADD(s, b) _C_Q_ADD(s, b, __FILE__, __LINE__)
void _CheckGuardZone(char * File, int Line);
VOID * _Q_REM(VOID **Q, char * File, int Line);
VOID * _Q_REM_NP(VOID *Q, char * File, int Line);
int _C_Q_ADD(VOID *Q, VOID *BUFF, char * File, int Line);
UINT _ReleaseBuffer(VOID *BUFF, char * File, int Line);
VOID * _GetBuff(char * File, int Line);
int _C_Q_ADD(VOID *PQ, VOID *PBUFF, char * File, int Line);
int C_Q_COUNT(VOID *Q);
DllExport char * APIENTRY GetApplCall(int Appl);
DllExport char * APIENTRY GetApplAlias(int Appl);
DllExport int APIENTRY FindFreeStream();
DllExport int APIENTRY DeallocateStream(int stream);
DllExport int APIENTRY SessionState(int stream, int * state, int * change);
DllExport int APIENTRY SetAppl(int stream, int flags, int mask);
DllExport int APIENTRY GetMsg(int stream, char * msg, int * len, int * count );
DllExport int APIENTRY GetConnectionInfo(int stream, char * callsign,
int * port, int * sesstype, int * paclen,
int * maxframe, int * l4window);
#define LIBCONFIG_STATIC
#include "libconfig.h"
int GetIntValue(config_setting_t * group, char * name);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value);
int EncryptPass(char * Pass, char * Encrypt);
VOID DecryptPass(char * Encrypt, unsigned char * Pass, unsigned int len);
Dll VOID APIENTRY CreateOneTimePassword(char * Password, char * KeyPhrase, int TimeOffset);
Dll BOOL APIENTRY CheckOneTimePassword(char * Password, char * KeyPhrase);
DllExport int APIENTRY TXCount(int stream);
DllExport int APIENTRY RXCount(int stream);
DllExport int APIENTRY MONCount(int stream);
VOID ReadNodes();
int BPQTRACE(MESSAGE * Msg, BOOL APRS);
VOID CommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID PostStateChange(TRANSPORTENTRY * Session);
VOID InnerCommandHandler(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer);
VOID DoTheCommand(TRANSPORTENTRY * Session);
char * MOVEANDCHECK(TRANSPORTENTRY * Session, char * Bufferptr, char * Source, int Len);
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
char * strlop(char * buf, char delim);
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
VOID PostDataAvailable(TRANSPORTENTRY * Session);
int WritetoConsoleLocal(char * buff);
char * CHECKBUFFER(TRANSPORTENTRY * Session, char * Bufferptr);
VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
VOID SendCommandReply(TRANSPORTENTRY * Session, struct DATAMESSAGE * Buffer, int Len);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
VOID SENDL4CONNECT(TRANSPORTENTRY * Session);
VOID CloseSessionPartner(TRANSPORTENTRY * Session);
int COUNTNODES(struct ROUTE * ROUTE);
int DecodeNodeName(char * NodeName, char * ptr);;
VOID DISPLAYCIRCUIT(TRANSPORTENTRY * L4, char * Buffer);
int cCOUNT_AT_L2(struct _LINKTABLE * LINK);
void * zalloc(int len);
BOOL FindDestination(UCHAR * Call, struct DEST_LIST ** REQDEST);
BOOL ProcessConfig();
VOID PUT_ON_PORT_Q(struct PORTCONTROL * PORT, MESSAGE * Buffer);
VOID CLEAROUTLINK(struct _LINKTABLE * LINK);
VOID TellINP3LinkGone(struct ROUTE * Route);
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason);
// Reason Equates
#define NORMALCLOSE 0
#define RETRIEDOUT 1
#define SETUPFAILED 2
#define LINKLOST 3
#define LINKSTUCK 4
int COUNT_AT_L2(struct _LINKTABLE * LINK);
VOID SENDIDMSG();
VOID SENDBTMSG();
VOID INP3TIMER();
VOID REMOVENODE(dest_list * DEST);
BOOL ACTIVATE_DEST(struct DEST_LIST * DEST);
VOID TellINP3LinkSetupFailed(struct ROUTE * Route);
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
VOID PROCROUTES(struct DEST_LIST * DEST, struct ROUTE * ROUTE, int Qual);
BOOL L2SETUPCROSSLINK(PROUTE ROUTE);
VOID REMOVENODE(dest_list * DEST);
char * SetupNodeHeader(struct DATAMESSAGE * Buffer);
VOID L4CONNECTFAILED(TRANSPORTENTRY * L4);
int CountFramesQueuedOnSession(TRANSPORTENTRY * Session);
VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session);
VOID __cdecl Debugprintf(const char * format, ...);
int APIENTRY Restart();
int APIENTRY Reboot();
int APIENTRY Reconfig();
Dll int APIENTRY SaveNodes ();
struct SEM;
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void FreeSemaphore(struct SEM * Semaphore);
void MySetWindowText(HWND hWnd, char * Msg);
Dll int APIENTRY SessionControl(int stream, int command, int Mask);
HANDLE OpenCOMPort(VOID * pPort, int speed, BOOL SetDTR, BOOL SetRTS, BOOL Quiet, int Stopbits);
int ReadCOMBlock(HANDLE fd, char * Block, int MaxLength);
BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite);
VOID CloseCOMPort(HANDLE fd);
VOID initUTF8();
int Is8Bit(unsigned char *cpt, int len);
int WebIsUTF8(unsigned char *ptr, int len);
int IsUTF8(unsigned char *ptr, int len);
int Convert437toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int Convert1251toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int Convert1252toUTF8(unsigned char * MsgPtr, int len, unsigned char * UTF);
int TrytoGuessCode(unsigned char * Char, int Len);
#define CMD_TO_APPL 1 // PASS COMMAND TO APPLICATION
#define MSG_TO_USER 2 // SEND 'CONNECTED' TO USER
#define MSG_TO_APPL 4 // SEND 'CONECTED' TO APPL
#define CHECK_FOR_ESC 8 // Look for ^d (^D) to disconnect session)
#define UI 3
#define SABM 0x2F
#define DISC 0x43
#define DM 0x0F
#define UA 0x63
#define FRMR 0x87
#define RR 1
#define RNR 5
#define REJ 9
// V2.2 Types
#define SREJ 0x0D
#define SABME 0x6F
#define XID 0xAF
#define TEST 0xE3
// XID Optional Functions
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
#define OPSREJ 4
#define OPSREJMult 0x200000
#define OPREJ 2
#define OPMod8 0x400
#define OPMod128 0x800
#define BPQHOSTSTREAMS 64
extern TRANSPORTENTRY * L4TABLE;
extern unsigned char NEXTID;
extern int MAXCIRCUITS;
extern int L4DEFAULTWINDOW;
extern int L4T1;
extern APPLCALLS APPLCALLTABLE[];
extern char * APPLS;
extern int NEEDMH;
extern int RFOnly;
extern char SESSIONHDDR[];
extern UCHAR NEXTID;
extern struct ROUTE * NEIGHBOURS;
extern int MAXNEIGHBOURS;
extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN;
extern int MAXNEIGHBOURS;
extern struct DEST_LIST * DESTS; // NODE LIST
extern struct DEST_LIST * ENDDESTLIST;
extern int DEST_LIST_LEN;
extern int MAXDESTS; // MAX NODES IN SYSTEM
extern struct _LINKTABLE * LINKS;
extern int LINK_TABLE_LEN;
extern int MAXLINKS;
extern char MYCALL[]; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
extern char MYALIASTEXT[]; // {" " ; NODE ALIAS (KEEP TOGETHER)
extern UCHAR MYCALLWITHALIAS[13];
extern APPLCALLS APPLCALLTABLE[NumberofAppls];
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
extern VOID * FREE_Q;
extern struct PORTCONTROL * PORTTABLE;
extern int NUMBEROFPORTS;
extern int OBSINIT; // INITIAL OBSOLESCENCE VALUE
extern int OBSMIN; // MINIMUM TO BROADCAST
extern int L3INTERVAL; // "NODES" INTERVAL IN MINS
extern int IDINTERVAL; // "ID" BROADCAST INTERVAL
extern int BTINTERVAL; // "BT" BROADCAST INTERVAL
extern int MINQUAL; // MIN QUALITY FOR AUTOUPDATES
extern int HIDENODES; // N * COMMAND SWITCH
extern int BBSQUAL; // QUALITY OF BBS RELATIVE TO NODE
extern int NUMBEROFBUFFERS; // PACKET BUFFERS
extern int PACLEN; //MAX PACKET SIZE
// L2 SYSTEM TIMER RUNS AT 3 HZ
extern int T3; // LINK VALIDATION TIMER (3 MINS) (+ a bit to reduce RR collisions)
extern int L2KILLTIME; // IDLE LINK TIMER (16 MINS)
extern int L3LIVES; // MAX L3 HOPS
extern int L4N2; // LEVEL 4 RETRY COUNT
extern int L4LIMIT; // IDLE SESSION LIMIT - 15 MINS
extern int L4DELAY; // L4 DELAYED ACK TIMER
extern int BBS; // INCLUDE BBS SUPPORT
extern int NODE; // INCLUDE SWITCH SUPPORT
extern int FULL_CTEXT; // CTEXT ON ALL CONNECTS IF NZ
// Although externally streams are numbered 1 to 64, internally offsets are 0 - 63
extern BPQVECSTRUC DUMMYVEC; // Needed to force correct order of following
extern BPQVECSTRUC BPQHOSTVECTOR[BPQHOSTSTREAMS + 5];
extern int NODEORDER;
extern UCHAR LINKEDFLAG;
extern UCHAR UNPROTOCALL[80];
extern char * INFOMSG;
extern char * CTEXTMSG;
extern int CTEXTLEN;
extern UCHAR MYALIAS[7]; // ALIAS IN AX25 FORM
extern UCHAR BBSALIAS[7];
extern VOID * TRACE_Q; // TRANSMITTED FRAMES TO BE TRACED
extern char HEADERCHAR; // CHAR FOR _NODE HEADER MSGS
extern int AUTOSAVE; // AUTO SAVE NODES ON EXIT FLAG
extern int L4APPL; // Application for BBSCALL/ALIAS connects
extern int CFLAG; // C =HOST Command
extern VOID * IDMSG_Q; // ID/BEACONS WAITING TO BE SENT
extern struct DATAMESSAGE BTHDDR;
extern struct _MESSAGE IDHDDR;
extern VOID * IDMSG;
extern int L3TIMER; // TIMER FOR 'NODES' MESSAGE
extern int IDTIMER; // TIMER FOR ID MESSAGE
extern int BTTIMER; // TIMER FOR BT MESSAGE
extern int STATSTIME;
extern BOOL IPRequired;
extern int MaxHops;
extern int MAXRTT;
extern USHORT CWTABLE[];
extern TRANSPORTENTRY * L4TABLE;
extern UCHAR ROUTEQUAL;
extern UINT BPQMsg;
extern UCHAR ExcludeList[];
extern APPLCALLS APPLCALLTABLE[];
extern char VersionStringWithBuild[];
extern char VersionString[];
extern int MAXHEARDENTRIES;
extern int MHLEN;
extern int APPL1;
extern int PASSCMD;
extern int NUMBEROFCOMMANDS;
extern char * ConfigBuffer;
extern char * WL2KReportLine[];
extern struct CMDX COMMANDS[];
extern int QCOUNT, MAXBUFFS, MAXCIRCUITS, L4DEFAULTWINDOW, L4T1, CMDXLEN;
extern char CMDALIAS[ALIASLEN][NumberofAppls];
extern int SEMGETS;
extern int SEMRELEASES;
extern int SEMCLASHES;
extern int MINBUFFCOUNT;
extern UCHAR BPQDirectory[];
extern UCHAR BPQProgramDirectory[];
extern UCHAR WINMOR[];
extern UCHAR PACTORCALL[];
extern UCHAR MCOM;
extern UCHAR MUIONLY;
extern UCHAR MTX;
extern uint64_t MMASK;
extern UCHAR NODECALL[]; // NODES in ax.25
extern int L4CONNECTSOUT;
extern int L4CONNECTSIN;
extern int L4FRAMESTX;
extern int L4FRAMESRX;
extern int L4FRAMESRETRIED;
extern int OLDFRAMES;
extern int L3FRAMES;
extern char * PortConfig[];
extern struct SEM Semaphore;
extern UCHAR AuthorisedProgram; // Local Variable. Set if Program is on secure list
extern int REALTIMETICKS;
extern time_t CurrentSecs;
extern time_t lastSlowSecs;
extern time_t lastSaveSecs;
// SNMP Variables
extern int InOctets[64];
extern int OutOctets[64];
extern BOOL CloseAllNeeded;
extern int CloseOnError;
extern char * PortConfig[70];
extern struct TNCINFO * TNCInfo[71]; // Records are Malloc'd
#define MaxBPQPortNo 63 // Port 64 reserved for BBS Mon
#define MAXBPQPORTS 63
// IP, APRS use port ocnfig slots above the real port range
#define IPConfigSlot MaxBPQPortNo + 1
#define PortMapConfigSlot MaxBPQPortNo + 2
#define APRSConfigSlot MaxBPQPortNo + 3
extern char * UIUIDigi[MaxBPQPortNo + 1];
extern char UIUIDEST[MaxBPQPortNo + 1][11]; // Dest for Beacons
extern UCHAR FN[MaxBPQPortNo + 1][256]; // Filename
extern int Interval[MaxBPQPortNo + 1]; // Beacon Interval (Mins)
extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
extern BOOL SendFromFile[MaxBPQPortNo + 1];
extern BOOL MQTT;
extern char MQTT_HOST[80];
extern int MQTT_PORT;
extern char MQTT_USER[80];
extern char MQTT_PASS[80];
extern int SUPPORT2point2;
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);

@ -164,21 +164,21 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
int ActiveRoute;
if (DEST->DEST_ROUTE == 0) // Don't ALREADY HAVE A SELECTED ROUTE?
{
DEST->DEST_ROUTE = 1;
if (PREFERINP3ROUTES)
{
// if we have any INP3 routes use the first. It will always be the fastest. The others are there for fallback if the first fails.
if (ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR)
DEST->DEST_ROUTE = 4; // TRY TO ACTIVATE FIRST
}
else
ActiveRoute = DEST->DEST_ROUTE - 1;
}
ActiveRoute = DEST->DEST_ROUTE - 1;
ROUTE = DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR;
if (ROUTE == 0)
@ -198,6 +198,10 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR;
}
if (ROUTE == 0) // Shouldn't happen
return FALSE;
// if NetROM over VARA conection is made by the driver
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
@ -218,7 +222,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
return L2SETUPCROSSLINK(ROUTE);
}
// We mst be waiting for link to come up
// We umst be waiting for link to come up
return TRUE;
@ -1309,19 +1313,25 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--;
}
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
{
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL)
return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1330,6 +1340,7 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
}
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND

Binary file not shown.

@ -1267,6 +1267,10 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add MHUV and MHLV commands (Verbose listing with timestamps in clock time) (70)
// Improvements to INP3 (71)
// Improvements to KAM driver including support for GTOR connects (71)
// Support IPv6 for Telnet outward connects (72)
// Fix decaying NETROM routes (72)
// Add OnlyVer2point0 config command (72)
#define CKernel

@ -3321,7 +3321,7 @@ VOID SendReportMsg(char * buff, int txlen)
buff[txlen++] = (crc&0xff);
buff[txlen++] = (crc>>8);
sendto(ReportSocket, buff, txlen, 0, (struct sockaddr *)&reportdest, sizeof(reportdest));
// sendto(ReportSocket, buff, txlen, 0, (struct sockaddr *)&reportdest, sizeof(reportdest));
}
VOID SendLocation()

@ -154,6 +154,8 @@ extern BOOL LogAllConnects;
APPLCALLS * APPL;
int SUPPORT2point2 = 1;
void SendL2ToMonMap(struct PORTCONTROL * PORT, char * ReportCall, char Mode, char Direction)
{
@ -3242,7 +3244,7 @@ VOID L2TimerProc()
if (PORT == NULL)
{
LINK++;
continue; // just ion case!!
continue; // just in case!!
}
if (LINK->L2TIMER)
@ -4003,7 +4005,6 @@ VOID CONNECTREFUSED(struct _LINKTABLE * LINK)
ConnectFailedOrRefused(LINK, "Busy from");
}
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK);
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK);

@ -1332,34 +1332,6 @@ VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
L3TRYNEXTDEST(ROUTE); // RESET ASSOCIATED DEST ENTRIES
}
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
{
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL)
return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed or refused", Normcall);
}
TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1368,6 +1340,7 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
}
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND

@ -6342,77 +6342,101 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
struct ConnectionInfo * sockptr;
SOCKET sock;
struct sockaddr_in sinx;
struct sockaddr_in destaddr;
int addrlen=sizeof(sinx);
int i;
char PortString[20];
struct addrinfo hints, *res = 0, *saveres;
sockptr = STREAM->ConnectionInfo;
sock = sockptr->socket = socket(AF_INET, SOCK_STREAM, 0);
sprintf(PortString, "%d", Port);
if (sock == INVALID_SOCKET)
{
ReportError(STREAM, "Create Socket Failed");
return FALSE;
}
// get host info, make socket, and connect it
sockptr->SocketActive = TRUE;
sockptr->InputLen = 0;
sockptr->LoginState = 2;
sockptr->UserPointer = 0;
sockptr->DoEcho = FALSE;
memset(&hints, 0, sizeof hints);
sockptr->FBBMode = FBB; // Raw Data
if (TCP->IPV6 == 0 && TCP->IPV4)
hints.ai_family = AF_INET;
else if (TCP->IPV4 == 0 && TCP->IPV6)
hints.ai_family = AF_INET6;
else if (TCP->IPV4 && TCP->IPV6)
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
if (sockptr->ADIF == NULL)
sockptr->ADIF = malloc(sizeof(struct ADIF));
else
{
ReportError(STREAM, "Neither IPv4 nor IPv5 are enabled");
return FALSE; // Resolve failed
}
memset(sockptr->ADIF, 0, sizeof(struct ADIF));
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(Host, PortString, &hints, &res);
// Resolve Name if needed
if (!res)
{
char Msg[256];
err = WSAGetLastError();
sprintf(Msg, "Resolve HostName Failed - Error %d", err);
ReportError(STREAM, Msg);
return FALSE; // Resolve failed
}
sockptr->sin.sin_family = AF_INET;
sockptr->sin.sin_port = htons(Port);
// Step thorough the list of hosts
sockptr->sin.sin_addr.s_addr = inet_addr(Host);
saveres = res; // Save for free
if (sockptr->sin.sin_addr.s_addr == INADDR_NONE)
/* if (res->ai_next) // More than one
{
struct hostent * HostEnt;
int n = ISHostIndex;
// Resolve name to address
HostEnt = gethostbyname(Host);
if (!HostEnt)
while (n && res->ai_next)
{
ReportError(STREAM, "Resolve HostName Failed");
return FALSE; // Resolve failed
res = res->ai_next;
n--;
}
i = 0;
while (HostEnt->h_addr_list[i] != 0)
if (n)
{
struct in_addr addr;
addr.s_addr = *(u_long *) HostEnt->h_addr_list[i++];
// We have run off the end of the list
ISHostIndex = 0; // Back to start
res = saveres;
}
memcpy(&sockptr->sin.sin_addr.s_addr, HostEnt->h_addr, 4);
else
ISHostIndex++;
}
*/
// getnameinfo(res->ai_addr, (int)res->ai_addrlen, RealISHost, 256, serv, 256, 0);
ioctl (sockptr->socket, FIONBIO, &param);
sockptr = STREAM->ConnectionInfo;
setsockopt (sockptr->socket, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
sinx.sin_family = AF_INET;
sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0;
sockptr->SocketActive = TRUE;
sockptr->InputLen = 0;
sockptr->LoginState = 2;
sockptr->UserPointer = 0;
sockptr->DoEcho = FALSE;
sockptr->FBBMode = FBB; // Raw Data
if (bind(sockptr->socket, (struct sockaddr *) &sinx, addrlen) != 0 )
if (sockptr->ADIF == NULL)
sockptr->ADIF = malloc(sizeof(struct ADIF));
memset(sockptr->ADIF, 0, sizeof(struct ADIF));
if (sock == INVALID_SOCKET)
{
ReportError(STREAM, "Bind Failed");
ReportError(STREAM, "Create Socket Failed");
return FALSE;
}
ioctl (sock, FIONBIO, &param);
setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
// memcpy(work, res->ai_addr->sa_data, 4);
if (LogEnabled)
{
char logmsg[512];
@ -6421,21 +6445,21 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
WriteLog (logmsg);
}
if (connect(sockptr->socket,(struct sockaddr *) &sockptr->sin, sizeof(destaddr)) == 0)
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
{
//
// Connected successful
//
ReportError(STREAM, "*** Connected");
// Get Send Buffer Size
freeaddrinfo(saveres);
return TRUE;
}
else
{
freeaddrinfo(saveres);
err=WSAGetLastError();
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
@ -6461,7 +6485,6 @@ int TCPConnect(struct TNCINFO * TNC, struct TCPINFO * TCP, struct STREAMINFO * S
}
return FALSE;
}

@ -10,8 +10,8 @@
#endif
#define KVers 6,0,24,71
#define KVerstring "6.0.24.71\0"
#define KVers 6,0,24,72
#define KVerstring "6.0.24.72\0"
#ifdef CKernel

@ -1371,6 +1371,7 @@ struct arp_table_entry
// SOCKET SourceSocket;
struct AXIPPORTINFO * PORT;
BOOL noUpdate; // Don't update dest address from incoming packet
BOOL replytoSourcePort; // Update map entry dest port from source port of each packet.
time_t LastHeard; // Last Packet received from this ststiom
};

@ -204,7 +204,7 @@ int Update_MH_KeepAlive(struct AXIPPORTINFO * PORT, struct in_addr ipad, char pr
unsigned short int compute_crc(unsigned char *buf,int l);
unsigned int find_arp(unsigned char * call);
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, unsigned char * call, UCHAR * ip, int len, int port,unsigned char * name,
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate);
int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPMode, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort);
BOOL add_bc_entry(struct AXIPPORTINFO * PORT, unsigned char * call, int len);
BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call, int * calllen);
static BOOL ReadConfigFile(int Port);
@ -213,7 +213,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT);
BOOL CopyScreentoBuffer(char * buff, struct AXIPPORTINFO * PORT);
int DumpFrameInHex(unsigned char * msg, int len);
VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, UCHAR * buff, int txlen);
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr);
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort);
int DataSocket_Read(struct arp_table_entry * sockptr, SOCKET sock);
int GetMessageFromBuffer(struct AXIPPORTINFO * PORT, char * Buffer);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
@ -429,7 +429,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply)
{
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr))
if (CheckSourceisResolvable(PORT, call, 0, &RXaddr, 0))
return 1;
@ -437,7 +437,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
// Can't reply. If AutoConfig is set, add to table and accept, else reject
if (PORT->AutoAddARP)
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, 0, inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, 0, FALSE, 0, 0);
else
{
char From[11] = "|";
@ -536,7 +536,7 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
if (PORT->Checkifcanreply)
{
if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr))
if (CheckSourceisResolvable(PORT, call, htons(RXaddr.rxaddr.sin_port), &RXaddr, PORT->udpport[i]))
return 1;
else
{
@ -547,10 +547,10 @@ static size_t ExtProc(int fn, int port, PMESSAGE buff)
{
char Addr[80];
Format_Addr((UCHAR *)&RXaddr.rxaddr6.sin6_addr, Addr, TRUE);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr6.sin6_addr, 7, htons(RXaddr.rxaddr6.sin6_port), Addr, 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], TRUE, 0, 0);
}
else
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0);
return add_arp_entry(PORT, call, (UCHAR *)&RXaddr.rxaddr.sin_addr.s_addr, 7, htons(RXaddr.rxaddr.sin_port), inet_ntoa(RXaddr.rxaddr.sin_addr), 0, PORT->AutoAddBC, TRUE, 0, PORT->udpport[i], FALSE, 0, 0);
else
{
char From[11] = "|";
@ -1343,6 +1343,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
char axcall[7];
BOOL UDPFlag, BCFlag;
struct AXIPPORTINFO * PORT;
int useSourcePort = 0;
for (i=1; i <= MAXBPQPORTS; i++)
{
@ -1391,7 +1392,7 @@ LRESULT FAR PASCAL ConfigWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lPa
{
if (convtoax25(call,axcall,&calllen))
{
add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0);
add_arp_entry(PORT, axcall,0,calllen,port,host,Interval, BCFlag, FALSE, 0, port, FALSE, 0, useSourcePort);
ResolveDelay = 2;
return(DestroyWindow(hWnd));
}
@ -2147,6 +2148,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
int Interval;
int noUpdate=FALSE;
int TCPMode;
int useSourcePort = 0;
ptr = strtok(buf, " \t\n\r");
@ -2234,6 +2236,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
bcflag=0;
TCPMode=0;
SourcePort = 0;
useSourcePort = 0;
//
// Look for (optional) KEEPALIVE, DYNAMIC, UDP or BROADCAST params
@ -2264,7 +2267,14 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (p_udpport == NULL) return (FALSE);
if (_stricmp(p_udpport,"FROMPORT") == 0)
{
useSourcePort = TRUE;
port = 0;
}
else
port = atoi(p_udpport);
p_UDP = strtok(NULL, " \t\n\r");
continue;
}
@ -2327,7 +2337,7 @@ static int ProcessLine(char * buf, struct AXIPPORTINFO * PORT)
if (SourcePort == 0)
SourcePort = port;
add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate);
add_arp_entry(PORT, axcall, 0, calllen, port, p_ipad, Interval, bcflag, FALSE, TCPMode, SourcePort, FALSE, noUpdate, useSourcePort);
return (TRUE);
}
} // End of Process MAP
@ -2438,7 +2448,7 @@ BOOL convtoax25(unsigned char * callsign, unsigned char * ax25call,int * calllen
}
BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len, int port,
UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate)
UCHAR * name, int keepalive, BOOL BCFlag, BOOL AutoAdded, int TCPFlag, int SourcePort, BOOL IPv6, int noUpdate, int useSourcePort)
{
struct arp_table_entry * arp;
@ -2457,7 +2467,8 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->PORT = PORT;
if (port == 0) PORT->needip = 1; // Enable Raw IP Mode
if (port == 0 && arp->replytoSourcePort == 0)
PORT->needip = 1; // Enable Raw IP Mode
arp->ResolveFlag=TRUE;
PORT->NeedResolver=TRUE;
@ -2476,6 +2487,7 @@ BOOL add_arp_entry(struct AXIPPORTINFO * PORT, UCHAR * call, UCHAR * ip, int len
arp->TCPMode = TCPFlag;
arp->noUpdate = noUpdate;
PORT->arp_table_len++;
arp->replytoSourcePort = useSourcePort;
if (PORT->MaxResWindowlength < (PORT->arp_table_len * 14) + 70)
PORT->MaxResWindowlength = (PORT->arp_table_len * 14) + 70;
@ -2576,7 +2588,7 @@ int CheckKeepalives(struct AXIPPORTINFO * PORT)
return (0);
}
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port, VOID * rxaddr)
BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPort, VOID * rxaddr, int ToPort)
{
// Makes sure we can reply to call before accepting message
@ -2606,9 +2618,14 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port,
struct sockaddr_in * SA = rxaddr;
memcpy(&arp->destaddr.sin_addr.s_addr, &SA->sin_addr, 4);
}
// Dont think I should update port
// Dont think I should update port unless using source port for dest
//arp->port = Port;
if (arp->replytoSourcePort)
{
arp->port = FromPort;
if (arp->SourcePort == 0)
arp->SourcePort = ToPort;
}
}
arp->LastHeard = time(NULL);
return 1; // Ok to process

@ -858,6 +858,9 @@ BOOL Start()
PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0;
// Get pointers to PASSWORD and APPL1 commands

@ -202,8 +202,6 @@ int TrytoGuessCode(unsigned char * Char, int Len);
#define XID 0xAF
#define TEST 0xE3
#define SUPPORT2point2 1
// XID Optional Functions
#define OPMustHave 0x02A080 // Sync TEST 16 bit FCS Extended Address
@ -438,6 +436,9 @@ extern int MQTT_PORT;
extern char MQTT_USER[80];
extern char MQTT_PASS[80];
extern int SUPPORT2point2;
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);

@ -308,7 +308,8 @@ static char *keywords[] =
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS",
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe", "L2CompPaclen", "PREFERINP3ROUTES"
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe",
"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0"
}; /* parameter keywords */
static void * offset[] =
@ -331,7 +332,7 @@ static void * offset[] =
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES}; /* offset for corresponding data in config file */
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0}; /* offset for corresponding data in config file */
static int routine[] =
{
@ -353,7 +354,7 @@ static int routine[] =
2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20,
1, 1, 1, 1, 1,
1, 1} ; // Routine to process param
1, 1, 1} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -629,7 +630,7 @@ BOOL ProcessConfig()
paramok[90]=1; // L2Compress Maxframe
paramok[91]=1; // L2Compress Paclen
paramok[92]=1; // PREFERINP3ROUTES
paramok[93]=1; // C_ONLYVer2point0
for (i=0; i < PARAMLIM; i++)
{

@ -178,6 +178,7 @@ struct CONFIGTABLE
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
int C_OnlyVer2point0;
//#define ApplOffset 80000 // Applications offset in config buffer

Loading…
Cancel
Save

Powered by TurnKey Linux.