New upstream version 6.0.25.11+repack
This commit is contained in:
parent
9aad97786d
commit
85f200a46c
25
Bpq32.c
25
Bpq32.c
|
|
@ -1298,6 +1298,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||||
// Add Paula's Netromx (allows connects to different applications using Node call) (8)
|
// Add Paula's Netromx (allows connects to different applications using Node call) (8)
|
||||||
// Add Netrom over TCP (8)
|
// Add Netrom over TCP (8)
|
||||||
// Fix FRMR caused by sending SREJ when no frames outstanding (8)
|
// Fix FRMR caused by sending SREJ when no frames outstanding (8)
|
||||||
|
// Fix some issues with NetromX connects and Route Selection when running INP3 and NODES routing (9)
|
||||||
|
// Fix connecting to a netrom node with c p node command (10)
|
||||||
|
|
||||||
|
|
||||||
#define CKernel
|
#define CKernel
|
||||||
|
|
@ -1406,11 +1408,7 @@ void initAIS();
|
||||||
void initADSB();
|
void initADSB();
|
||||||
int CloseAllSessions();
|
int CloseAllSessions();
|
||||||
int CloseAllLinks();
|
int CloseAllLinks();
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
void NETROMTCPResolve();
|
void NETROMTCPResolve();
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
extern BOOL ADIFLogEnabled;
|
extern BOOL ADIFLogEnabled;
|
||||||
|
|
||||||
|
|
@ -2407,12 +2405,7 @@ VOID TimerProcX()
|
||||||
if (CloseAllSessions() == 0)
|
if (CloseAllSessions() == 0)
|
||||||
{
|
{
|
||||||
if (CloseAllLinks() == 0) // No sessions closed so close links now
|
if (CloseAllLinks() == 0) // No sessions closed so close links now
|
||||||
<<<<<<< Updated upstream
|
|
||||||
CloseAllTimer = 0; // No Links so close now
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
CloseAllTimer = 1; // No Links so close now
|
CloseAllTimer = 1; // No Links so close now
|
||||||
>>>>>>> Stashed changes
|
|
||||||
else
|
else
|
||||||
CloseAllTimer = 39; // ~4 secs for links to close
|
CloseAllTimer = 39; // ~4 secs for links to close
|
||||||
}
|
}
|
||||||
|
|
@ -5986,9 +5979,6 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
|
||||||
|
|
||||||
void hookNodeClosing(char * Reason);
|
void hookNodeClosing(char * Reason);
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
BOOL CALLBACK ClosaAllProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
BOOL CALLBACK ClosaAllProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
int wmId, wmEvent;
|
int wmId, wmEvent;
|
||||||
|
|
@ -6052,25 +6042,15 @@ BOOL CALLBACK ClosaAllProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
|
||||||
|
|
||||||
HWND hwndClosing = NULL; // Window handle of dialog box
|
HWND hwndClosing = NULL; // Window handle of dialog box
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
DllExport VOID APIENTRY CloseAllPrograms()
|
DllExport VOID APIENTRY CloseAllPrograms()
|
||||||
{
|
{
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
// HANDLE hProc;
|
|
||||||
=======
|
|
||||||
WNDCLASS wc;
|
WNDCLASS wc;
|
||||||
>>>>>>> Stashed changes
|
|
||||||
CLOSING = TRUE;
|
CLOSING = TRUE;
|
||||||
|
|
||||||
// Tell BG to shut when all links are gone or after 5 secs
|
// Tell BG to shut when all links are gone or after 5 secs
|
||||||
|
|
||||||
CloseAllTimer = 50;
|
CloseAllTimer = 50;
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
Closing = TRUE;
|
|
||||||
=======
|
|
||||||
|
|
||||||
|
|
||||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||||
|
|
@ -6089,7 +6069,6 @@ DllExport VOID APIENTRY CloseAllPrograms()
|
||||||
|
|
||||||
hwndClosing = CreateDialog(hInstance, ClosingClassName, NULL, (DLGPROC)ClosaAllProc);
|
hwndClosing = CreateDialog(hInstance, ClosingClassName, NULL, (DLGPROC)ClosaAllProc);
|
||||||
ShowWindow(hwndClosing, SW_SHOW);
|
ShowWindow(hwndClosing, SW_SHOW);
|
||||||
>>>>>>> Stashed changes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID RealCloseAllPrograms()
|
VOID RealCloseAllPrograms()
|
||||||
|
|
|
||||||
41
Cmd.c
41
Cmd.c
|
|
@ -905,18 +905,12 @@ int checkifService(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, s
|
||||||
BOOL Stay = FALSE;
|
BOOL Stay = FALSE;
|
||||||
char * ptr, *Context;
|
char * ptr, *Context;
|
||||||
int i;
|
int i;
|
||||||
<<<<<<< Updated upstream
|
|
||||||
|
|
||||||
ptr = strtok_s(CmdTail, " ", &Context);
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
char TailCopy[256];
|
char TailCopy[256];
|
||||||
|
|
||||||
strcpy(TailCopy, CmdTail);
|
strcpy(TailCopy, CmdTail);
|
||||||
|
|
||||||
|
|
||||||
ptr = strtok_s(TailCopy, " ", &Context);
|
ptr = strtok_s(TailCopy, " ", &Context);
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
// see if any param. if longer than two chars treat as remote node
|
// see if any param. if longer than two chars treat as remote node
|
||||||
|
|
||||||
|
|
@ -2677,14 +2671,8 @@ NoPort:
|
||||||
|
|
||||||
// SEE IF CALL TO ANY OF OUR HOST SESSIONS - UNLESS DIGIS SPECIFIED
|
// SEE IF CALL TO ANY OF OUR HOST SESSIONS - UNLESS DIGIS SPECIFIED
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
if (axcalls[7] == 0 && axcalls[9] )
|
|
||||||
||||||| Stash base
|
|
||||||
if (axcalls[7] == 0)
|
|
||||||
=======
|
|
||||||
// if (axcalls[7] == 0 && axcalls[9])
|
// if (axcalls[7] == 0 && axcalls[9])
|
||||||
if (axcalls[7] == 0)
|
if (axcalls[7] == 0)
|
||||||
>>>>>>> Stashed changes
|
|
||||||
{
|
{
|
||||||
// If this connect is as a result of a command alias, don't check appls or we will loop
|
// If this connect is as a result of a command alias, don't check appls or we will loop
|
||||||
|
|
||||||
|
|
@ -2735,23 +2723,6 @@ NoPort:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
// if no digis see if connect to known node. But now could have a single numeric param as a service number (Paula's Netromx)
|
|
||||||
// cmdCopy is command tail (after call)
|
|
||||||
|
|
||||||
// Make sure field is numeric
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
while (cmdCopy[i] >= '0' && cmdCopy[i]<= '9')
|
|
||||||
i++;
|
|
||||||
|
|
||||||
if (cmdCopy[i] != ' ')
|
|
||||||
goto Downlink;
|
|
||||||
else
|
|
||||||
||||||| Stash base
|
|
||||||
if (axcalls[7] == 0)
|
|
||||||
=======
|
|
||||||
// if no digis see if connect to known node.
|
// if no digis see if connect to known node.
|
||||||
|
|
||||||
// But now could have a single numeric param as a service number (Paula's Netromx)
|
// But now could have a single numeric param as a service number (Paula's Netromx)
|
||||||
|
|
@ -2760,22 +2731,13 @@ NoPort:
|
||||||
// Make sure field is numeric
|
// Make sure field is numeric
|
||||||
|
|
||||||
if (cmdCopy[0] != ' ')
|
if (cmdCopy[0] != ' ')
|
||||||
>>>>>>> Stashed changes
|
|
||||||
{
|
{
|
||||||
<<<<<<< Updated upstream
|
|
||||||
if (i > 0) // Some digits
|
|
||||||
{
|
|
||||||
haveService = 1;
|
|
||||||
Service = atoi(cmdCopy);
|
|
||||||
||||||| Stash base
|
|
||||||
// SEE IF CALL TO ANOTHER NODE
|
|
||||||
=======
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
while (cmdCopy[i] >= '0' && cmdCopy[i]<= '9')
|
while (cmdCopy[i] >= '0' && cmdCopy[i]<= '9')
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
if (cmdCopy[i] != ' ')
|
if (i && cmdCopy[i] != ' ') // have an all digit param = probably a service
|
||||||
goto Downlink;
|
goto Downlink;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -2784,7 +2746,6 @@ NoPort:
|
||||||
haveService = 1;
|
haveService = 1;
|
||||||
Service = atoi(cmdCopy);
|
Service = atoi(cmdCopy);
|
||||||
}
|
}
|
||||||
>>>>>>> Stashed changes
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
22
CommonCode.c
22
CommonCode.c
|
|
@ -3739,29 +3739,8 @@ VOID ResolveUpdateThread(void * Unused)
|
||||||
nodeStartedSent = 1;
|
nodeStartedSent = 1;
|
||||||
LastNodeStatus = time(NULL);
|
LastNodeStatus = time(NULL);
|
||||||
}
|
}
|
||||||
<<<<<<< Updated upstream
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HostEnt1 && HostEnt2)
|
|
||||||
{
|
|
||||||
Sleep(1000 * 60 * 30);
|
|
||||||
continue;
|
|
||||||
||||||| Stash base
|
|
||||||
Sleep(1000 * 60 * 30);
|
|
||||||
continue;
|
|
||||||
=======
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
}
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
|
|
||||||
Debugprintf("Resolve Failed for update.g8bpq.net or chatmap.g8bpq.net");
|
|
||||||
Sleep(1000 * 60 * 5);
|
|
||||||
||||||| Stash base
|
|
||||||
|
|
||||||
Debugprintf("Resolve Failed for update.g8bpq.net or chatmap.g8bpq.net");
|
|
||||||
Sleep(1000 * 60 * 5);
|
|
||||||
=======
|
|
||||||
|
|
||||||
NETROMTCPResolve();
|
NETROMTCPResolve();
|
||||||
|
|
||||||
if (HostEnt1 && HostEnt2)
|
if (HostEnt1 && HostEnt2)
|
||||||
|
|
@ -3769,7 +3748,6 @@ VOID ResolveUpdateThread(void * Unused)
|
||||||
Sleep(1000 * 60 * 15);
|
Sleep(1000 * 60 * 15);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
>>>>>>> Stashed changes
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
27
L4Code.c
27
L4Code.c
|
|
@ -73,6 +73,7 @@ void OutgoingL4ConnectionEvent(TRANSPORTENTRY * L4);
|
||||||
void IncomingL4ConnectionEvent(TRANSPORTENTRY * L4);
|
void IncomingL4ConnectionEvent(TRANSPORTENTRY * L4);
|
||||||
void L4DisconnectEvent(TRANSPORTENTRY * L4, char * Direction, char * Reason);
|
void L4DisconnectEvent(TRANSPORTENTRY * L4, char * Direction, char * Reason);
|
||||||
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
|
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
|
||||||
|
void L4StatusSeport(TRANSPORTENTRY * L4);
|
||||||
|
|
||||||
static UINT APPLMASK;
|
static UINT APPLMASK;
|
||||||
|
|
||||||
|
|
@ -89,6 +90,8 @@ extern int L2Compress;
|
||||||
extern int L2CompMaxframe;
|
extern int L2CompMaxframe;
|
||||||
extern int L2CompPaclen;
|
extern int L2CompPaclen;
|
||||||
|
|
||||||
|
int sessionStatusInterval = 300; // 5 mins
|
||||||
|
|
||||||
// L4 Flags Values
|
// L4 Flags Values
|
||||||
|
|
||||||
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
|
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
|
||||||
|
|
@ -1128,6 +1131,7 @@ VOID L4TimerProc()
|
||||||
TRANSPORTENTRY * L4 = L4TABLE;
|
TRANSPORTENTRY * L4 = L4TABLE;
|
||||||
TRANSPORTENTRY * Partner;
|
TRANSPORTENTRY * Partner;
|
||||||
int MaxLinks = MAXLINKS;
|
int MaxLinks = MAXLINKS;
|
||||||
|
time_t Now = time(NULL);
|
||||||
|
|
||||||
while (n--)
|
while (n--)
|
||||||
{
|
{
|
||||||
|
|
@ -1137,6 +1141,12 @@ VOID L4TimerProc()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for Status report time
|
||||||
|
|
||||||
|
if (L4->lastStatusSentTime && (Now - L4->lastStatusSentTime) > sessionStatusInterval)
|
||||||
|
L4StatusSeport(L4);
|
||||||
|
|
||||||
|
|
||||||
// CHECK FOR L4BUSY SET AND NO LONGER BUSY
|
// CHECK FOR L4BUSY SET AND NO LONGER BUSY
|
||||||
|
|
||||||
if (L4->NAKBITS & L4BUSY)
|
if (L4->NAKBITS & L4BUSY)
|
||||||
|
|
@ -1601,13 +1611,8 @@ VOID CONNECTREQUEST(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, UINT Appl
|
||||||
int Index;
|
int Index;
|
||||||
char APPLCMD[13] = "";
|
char APPLCMD[13] = "";
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
memcpy(APPLCMD, APPL->APPLCMD, 13);
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
if (APPL)
|
if (APPL)
|
||||||
memcpy(APPLCMD, APPL->APPLCMD, 13);
|
memcpy(APPLCMD, APPL->APPLCMD, 13);
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
memcpy(BPQPARAMS, &L4T1, 2); // SET DEFAULT T1 IN CASE NOT FROM ANOTHER BPQ NODE
|
memcpy(BPQPARAMS, &L4T1, 2); // SET DEFAULT T1 IN CASE NOT FROM ANOTHER BPQ NODE
|
||||||
|
|
||||||
|
|
@ -1680,12 +1685,8 @@ VOID CONNECTREQUEST(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, UINT Appl
|
||||||
{
|
{
|
||||||
// At the moment I only handle connects to appls. May support other node commands later.
|
// At the moment I only handle connects to appls. May support other node commands later.
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
memcpy(APPLCMD, CMD->String, 13);
|
memcpy(APPLCMD, CMD->String, 13);
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
if (n < APPL1 + NumberofAppls)
|
if (n < APPL1 + NumberofAppls)
|
||||||
goto doAPPLConnect;
|
goto doAPPLConnect;
|
||||||
}
|
}
|
||||||
|
|
@ -2270,6 +2271,14 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if connect to service don't send connected to node messsage as service will send own message
|
||||||
|
|
||||||
|
// if (L4->Service)
|
||||||
|
// {
|
||||||
|
// ReleaseBuffer(L3MSG);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
Msg = (PDATAMESSAGE)L3MSG; // reuse input buffer
|
Msg = (PDATAMESSAGE)L3MSG; // reuse input buffer
|
||||||
|
|
||||||
Msg->PID = 0xf0;
|
Msg->PID = 0xf0;
|
||||||
|
|
|
||||||
4
LinBPQ.c
4
LinBPQ.c
|
|
@ -85,11 +85,7 @@ VOID GetPGConfig();
|
||||||
void SendBBSDataToPktMap();
|
void SendBBSDataToPktMap();
|
||||||
void CloseAllLinks();
|
void CloseAllLinks();
|
||||||
void hookNodeClosing(char * Reason);
|
void hookNodeClosing(char * Reason);
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
void NETROMTCPResolve();
|
void NETROMTCPResolve();
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
extern uint64_t INP3timeLoadedMS;
|
extern uint64_t INP3timeLoadedMS;
|
||||||
|
|
||||||
|
|
|
||||||
578
NETROMTCP.c
578
NETROMTCP.c
|
|
@ -1,4 +1,3 @@
|
||||||
<<<<<<< Updated upstream
|
|
||||||
/*
|
/*
|
||||||
Copyright 2001-2022 John Wiseman G8BPQ
|
Copyright 2001-2022 John Wiseman G8BPQ
|
||||||
|
|
||||||
|
|
@ -60,6 +59,9 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
|
||||||
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
|
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
|
||||||
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
|
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
|
||||||
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
|
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
|
||||||
|
void NetromTCPTrace(struct _MESSAGE * Message, char * Dirn);
|
||||||
|
|
||||||
|
extern SOCKET NodeAPISocket;
|
||||||
|
|
||||||
struct NRTCPMsg
|
struct NRTCPMsg
|
||||||
{
|
{
|
||||||
|
|
@ -211,8 +213,11 @@ int NETROMOpenConnection(struct ROUTE * Route)
|
||||||
{
|
{
|
||||||
struct NRTCPSTRUCT * Info;
|
struct NRTCPSTRUCT * Info;
|
||||||
struct ConnectionInfo * sockptr;
|
struct ConnectionInfo * sockptr;
|
||||||
|
char farCall[10];
|
||||||
|
|
||||||
Debugprintf("Opening NRTCP Connection");
|
farCall[ConvFromAX25(Route->NEIGHBOUR_CALL, farCall)] = 0;
|
||||||
|
|
||||||
|
Debugprintf("Opening NRTCP Connection to %s", farCall);
|
||||||
|
|
||||||
if (Route->TCPSession)
|
if (Route->TCPSession)
|
||||||
{
|
{
|
||||||
|
|
@ -233,560 +238,7 @@ int NETROMOpenConnection(struct ROUTE * Route)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
|
Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
|
||||||
memcpy(Info->Call, MYNETROMCALL, 10);
|
memcpy(Info->Call, farCall, 10);
|
||||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
|
||||||
|
|
||||||
Info->Route = Route;
|
|
||||||
Info->LINK->NEIGHBOUR = Route;
|
|
||||||
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
|
|
||||||
}
|
|
||||||
|
|
||||||
return NETROMTCPConnect(Route, sockptr);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
u_long param=1;
|
|
||||||
BOOL bcopt=TRUE;
|
|
||||||
SOCKET sock;
|
|
||||||
struct sockaddr_in sinx;
|
|
||||||
int addrlen=sizeof(sinx);
|
|
||||||
char PortString[20];
|
|
||||||
struct addrinfo hints, *res = 0, *saveres;
|
|
||||||
int Port = Route->TCPPort;
|
|
||||||
|
|
||||||
sprintf(PortString, "%d", Port);
|
|
||||||
|
|
||||||
// get host info, make socket, and connect it
|
|
||||||
|
|
||||||
memset(&hints, 0, sizeof hints);
|
|
||||||
|
|
||||||
hints.ai_family = AF_UNSPEC; // use IPv4 or IPv6, whichever
|
|
||||||
|
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
|
||||||
getaddrinfo(Route->TCPHost, PortString, &hints, &res);
|
|
||||||
|
|
||||||
if (!res)
|
|
||||||
{
|
|
||||||
err = WSAGetLastError();
|
|
||||||
Debugprintf("Resolve HostName %s Failed - Error %d", Route->TCPHost, err);
|
|
||||||
return FALSE; // Resolve failed
|
|
||||||
}
|
|
||||||
|
|
||||||
// Step thorough the list of hosts
|
|
||||||
|
|
||||||
saveres = res; // Save for free
|
|
||||||
|
|
||||||
sock = sockptr->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
|
|
||||||
|
|
||||||
|
|
||||||
if (sock == INVALID_SOCKET)
|
|
||||||
{
|
|
||||||
Debugprintf, ("Netrom over TCP Create Socket Failed");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ioctl(sock, FIONBIO, ¶m);
|
|
||||||
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt,4);
|
|
||||||
|
|
||||||
|
|
||||||
if (connect(sock, res->ai_addr, (int)res->ai_addrlen) == 0)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Connected successful
|
|
||||||
//
|
|
||||||
|
|
||||||
sockptr->Connected = TRUE;
|
|
||||||
freeaddrinfo(saveres);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
freeaddrinfo(saveres);
|
|
||||||
|
|
||||||
err=WSAGetLastError();
|
|
||||||
|
|
||||||
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
|
|
||||||
{
|
|
||||||
// Connect in Progress
|
|
||||||
|
|
||||||
sockptr->Connecting = TRUE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Connect failed
|
|
||||||
|
|
||||||
closesocket(sockptr->socket);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr)
|
|
||||||
{
|
|
||||||
// Not sure we can do much here until first message arrives with callsign
|
|
||||||
|
|
||||||
sockptr->Connected = TRUE;
|
|
||||||
Debugprintf("NRTCP Connection Accepted");
|
|
||||||
}
|
|
||||||
|
|
||||||
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info)
|
|
||||||
{
|
|
||||||
// Connection Complete
|
|
||||||
|
|
||||||
Debugprintf("NRTCP Connected");
|
|
||||||
|
|
||||||
sockptr->Connecting = FALSE;
|
|
||||||
sockptr->Connected = TRUE;
|
|
||||||
|
|
||||||
Info->LINK->L2STATE = 5;
|
|
||||||
|
|
||||||
if (Info->Route->INP3Node)
|
|
||||||
SendRTTMsg(Info->Route);
|
|
||||||
}
|
|
||||||
|
|
||||||
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo)
|
|
||||||
{
|
|
||||||
int len=0, maxlen;
|
|
||||||
struct NRTCPMsg * Msg;
|
|
||||||
struct _L3MESSAGEBUFFER * L3Msg;
|
|
||||||
struct ROUTE * Route;
|
|
||||||
UCHAR axCall[7];
|
|
||||||
PMESSAGE Buffer;
|
|
||||||
|
|
||||||
ioctl(sock,FIONREAD,&len);
|
|
||||||
|
|
||||||
maxlen = InputBufferLen - sockptr->InputLen;
|
|
||||||
|
|
||||||
if (len > maxlen) len = maxlen;
|
|
||||||
|
|
||||||
len = recv(sock, &sockptr->InputBuffer[sockptr->InputLen], len, 0);
|
|
||||||
|
|
||||||
if (len == SOCKET_ERROR || len == 0)
|
|
||||||
{
|
|
||||||
// Failed or closed - clear connection
|
|
||||||
|
|
||||||
NETROMConnectionLost(sockptr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sockptr->InputLen += len;
|
|
||||||
|
|
||||||
// Process data
|
|
||||||
|
|
||||||
checkLen:
|
|
||||||
|
|
||||||
// See if we have a whole packet
|
|
||||||
|
|
||||||
Msg = (struct NRTCPMsg *)&sockptr->InputBuffer[0];
|
|
||||||
|
|
||||||
if (Msg->Length > sockptr->InputLen) // if not got whole frame wait
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (Info->Call[0] == 0)
|
|
||||||
{
|
|
||||||
// first packet - do we need to do anything?
|
|
||||||
|
|
||||||
// This must be an incoming connection as Call is set before calling so need to find route record and set things up.
|
|
||||||
|
|
||||||
memcpy(Info->Call, Msg->Call, 10);
|
|
||||||
|
|
||||||
ConvToAX25(Msg->Call, axCall);
|
|
||||||
|
|
||||||
if (FindNeighbour(axCall, portNo, &Route))
|
|
||||||
{
|
|
||||||
Info->Route = Route;
|
|
||||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
|
||||||
Info->LINK->NEIGHBOUR = Route;
|
|
||||||
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
|
|
||||||
Route->TCPSession = Info;
|
|
||||||
Info->LINK->L2STATE = 5;
|
|
||||||
|
|
||||||
if (Info->Route->INP3Node)
|
|
||||||
SendRTTMsg(Info->Route);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
goto seeifMore; // Should we kill connection?
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (memcmp(Info->Call, Msg->Call, 10) != 0)
|
|
||||||
{
|
|
||||||
// something wrong - maybe connection reused
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format as if come from an ax.25 link
|
|
||||||
|
|
||||||
L3Msg = GetBuff();
|
|
||||||
|
|
||||||
if (L3Msg == 0)
|
|
||||||
goto seeifMore;
|
|
||||||
|
|
||||||
L3Msg->LENGTH = (Msg->Length - 12) + MSGHDDRLEN;
|
|
||||||
L3Msg->Next = 0;
|
|
||||||
L3Msg->Port = 0;
|
|
||||||
L3Msg->L3PID = NETROM_PID;
|
|
||||||
memcpy(&L3Msg->L3SRCE, Msg->Packet, Msg->Length - 13);
|
|
||||||
|
|
||||||
// Create a dummy L2 message so we can trace it
|
|
||||||
|
|
||||||
Buffer = GetBuff();
|
|
||||||
|
|
||||||
if (Buffer)
|
|
||||||
{
|
|
||||||
Buffer->CHAIN = 0;
|
|
||||||
Buffer->CTL = 0;
|
|
||||||
Buffer->PORT = portNo;
|
|
||||||
|
|
||||||
ConvToAX25(Info->Call, Buffer->ORIGIN);
|
|
||||||
ConvToAX25(MYNETROMCALL, Buffer->DEST);
|
|
||||||
|
|
||||||
memcpy(Buffer->L2DATA, &L3Msg->L3SRCE[0], Msg->Length - 13);
|
|
||||||
Buffer->ORIGIN[6] |= 1; // Set end of calls
|
|
||||||
Buffer->PID = NETROM_PID;
|
|
||||||
Buffer->LENGTH = Msg->Length + 10;
|
|
||||||
time(&Buffer->Timestamp);
|
|
||||||
|
|
||||||
BPQTRACE(Buffer, FALSE);
|
|
||||||
ReleaseBuffer(Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
NETROMMSG(Info->LINK, L3Msg);
|
|
||||||
|
|
||||||
seeifMore:
|
|
||||||
|
|
||||||
sockptr->InputLen -= Msg->Length;
|
|
||||||
|
|
||||||
if (sockptr->InputLen > 0)
|
|
||||||
{
|
|
||||||
memmove(sockptr->InputBuffer, &sockptr->InputBuffer[Msg->Length], sockptr->InputLen);
|
|
||||||
goto checkLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
|
|
||||||
{
|
|
||||||
struct NRTCPMsg Msg;
|
|
||||||
unsigned char * Data = (unsigned char *)&Frame->L3SRCE[0];
|
|
||||||
int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID
|
|
||||||
int Ret;
|
|
||||||
PMESSAGE Buffer;
|
|
||||||
|
|
||||||
Msg.Length = DataLen + 13; // include PID
|
|
||||||
memcpy(Msg.Call, MYNETROMCALL, 10);
|
|
||||||
Msg.PID = NETROM_PID;
|
|
||||||
memcpy(Msg.Packet, Data, DataLen);
|
|
||||||
|
|
||||||
if (Route->TCPSession == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0);
|
|
||||||
|
|
||||||
// Create a dummy L2 message so we can trace it
|
|
||||||
|
|
||||||
Buffer = GetBuff();
|
|
||||||
|
|
||||||
if (Buffer)
|
|
||||||
{
|
|
||||||
Buffer->CHAIN = 0;
|
|
||||||
Buffer->CTL = 0;
|
|
||||||
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
|
||||||
|
|
||||||
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
|
|
||||||
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
|
|
||||||
|
|
||||||
memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen);
|
|
||||||
Buffer->ORIGIN[6] |= 1; // Set end of calls
|
|
||||||
Buffer->PID = NETROM_PID;
|
|
||||||
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
|
|
||||||
time(&Buffer->Timestamp);
|
|
||||||
|
|
||||||
BPQTRACE(Buffer, FALSE);
|
|
||||||
ReleaseBuffer(Buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void NETROMConnectionLost(struct ConnectionInfo * sockptr)
|
|
||||||
{
|
|
||||||
struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
|
|
||||||
struct ROUTE * Route;
|
|
||||||
|
|
||||||
closesocket(sockptr->socket);
|
|
||||||
|
|
||||||
// If there is an attached route (there should be) clear all connections
|
|
||||||
|
|
||||||
if (Info)
|
|
||||||
{
|
|
||||||
Route = Info->Route;
|
|
||||||
|
|
||||||
if (sockptr->Connected)
|
|
||||||
L3LINKCLOSED(Info->LINK, LINKLOST);
|
|
||||||
|
|
||||||
if (sockptr->Connecting)
|
|
||||||
L3LINKCLOSED(Info->LINK, SETUPFAILED);
|
|
||||||
|
|
||||||
Route->TCPSession = 0;
|
|
||||||
|
|
||||||
Info->Call[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sockptr->SocketActive = FALSE;
|
|
||||||
|
|
||||||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
/*
|
|
||||||
Copyright 2001-2022 John Wiseman G8BPQ
|
|
||||||
|
|
||||||
This file is part of LinBPQ/BPQ32.
|
|
||||||
|
|
||||||
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Netrom over TCP Support
|
|
||||||
|
|
||||||
This is intended for operation over radio links with an IP interface, eg New Packet Radio or possibly microwave links
|
|
||||||
|
|
||||||
To simplify interface to the rest of the oode dummy LINK and PORT records are created
|
|
||||||
|
|
||||||
Packet Format is Length (2 byte little endian) Call (10 bytes ASCII) NETROM L3/4 Packet, starting 0xcf (to detect framing errors).
|
|
||||||
|
|
||||||
A TCP message can contain multiple packets and/or partial packets
|
|
||||||
|
|
||||||
It uses the Telnet Server, with port defined in NETROMPORT
|
|
||||||
|
|
||||||
ROUTE definitions have an extra field, the TCP Port Number
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
//#pragma data_seg("_BPQDATA")
|
|
||||||
|
|
||||||
|
|
||||||
#define _CRT_SECURE_NO_DEPRECATE
|
|
||||||
|
|
||||||
#include "time.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
#include <fcntl.h>
|
|
||||||
//#include "vmm.h"
|
|
||||||
|
|
||||||
#include "cheaders.h"
|
|
||||||
#include "asmstrucs.h"
|
|
||||||
#include "telnetserver.h"
|
|
||||||
|
|
||||||
#define NETROM_PID 0xCF
|
|
||||||
|
|
||||||
void NETROMConnectionLost(struct ConnectionInfo * sockptr);
|
|
||||||
int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info, int portNo);
|
|
||||||
int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr);
|
|
||||||
void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPSTRUCT * Info);
|
|
||||||
VOID SendRTTMsg(struct ROUTE * Route);
|
|
||||||
BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE);
|
|
||||||
VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
|
|
||||||
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
|
|
||||||
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
|
|
||||||
|
|
||||||
struct NRTCPMsg
|
|
||||||
{
|
|
||||||
short Length;
|
|
||||||
char Call[10];
|
|
||||||
unsigned char PID;
|
|
||||||
char Packet[1024];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct NRTCPSTRUCT
|
|
||||||
{
|
|
||||||
struct ConnectionInfo * sockptr;
|
|
||||||
struct _LINKTABLE * LINK; // Dummy Link Record for this ROUTE
|
|
||||||
struct ROUTE * Route; // May need backlink
|
|
||||||
char Call[10];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct NRTCPSTRUCT * NRTCPInfo[256] = {0};
|
|
||||||
|
|
||||||
// Do we want to use normal TCP server connections, which are limited, or our own. Let's try our own for now
|
|
||||||
|
|
||||||
struct ConnectionInfo * AllocateNRTCPRec()
|
|
||||||
{
|
|
||||||
struct ConnectionInfo * sockptr = 0;
|
|
||||||
struct NRTCPSTRUCT * Info;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 255; i++)
|
|
||||||
{
|
|
||||||
if (NRTCPInfo[i] == 0)
|
|
||||||
{
|
|
||||||
// only allocate as many as needed
|
|
||||||
|
|
||||||
Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT));
|
|
||||||
Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo));
|
|
||||||
Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE));
|
|
||||||
Info->sockptr->Number = i;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Info = NRTCPInfo[i];
|
|
||||||
|
|
||||||
sockptr = Info->sockptr;
|
|
||||||
|
|
||||||
if (sockptr->SocketActive == FALSE)
|
|
||||||
{
|
|
||||||
sockptr->SocketActive = TRUE;
|
|
||||||
sockptr->ConnectTime = sockptr->LastSendTime = time(NULL);
|
|
||||||
|
|
||||||
Debugprintf("NRTCP Allocated %d", i);
|
|
||||||
return sockptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkNRTCPSockets(int portNo)
|
|
||||||
{
|
|
||||||
SOCKET sock;
|
|
||||||
int Active = 0;
|
|
||||||
SOCKET maxsock;
|
|
||||||
int retval;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
struct timeval timeout;
|
|
||||||
fd_set readfd, writefd, exceptfd;
|
|
||||||
|
|
||||||
struct ConnectionInfo * sockptr;
|
|
||||||
|
|
||||||
timeout.tv_sec = 0;
|
|
||||||
timeout.tv_usec = 0; // poll
|
|
||||||
|
|
||||||
maxsock = 0;
|
|
||||||
|
|
||||||
FD_ZERO(&readfd);
|
|
||||||
FD_ZERO(&writefd);
|
|
||||||
FD_ZERO(&exceptfd);
|
|
||||||
|
|
||||||
for (i = 0; i < 255; i++)
|
|
||||||
{
|
|
||||||
if (NRTCPInfo[i] == 0)
|
|
||||||
break; // only as many as have been used
|
|
||||||
|
|
||||||
sockptr = NRTCPInfo[i]->sockptr;
|
|
||||||
|
|
||||||
if (sockptr->SocketActive == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (sockptr->Connecting)
|
|
||||||
{
|
|
||||||
// look for complete or failed
|
|
||||||
|
|
||||||
FD_SET(sockptr->socket, &writefd);
|
|
||||||
FD_SET(sockptr->socket, &exceptfd);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FD_SET(sockptr->socket, &readfd);
|
|
||||||
FD_SET(sockptr->socket, &exceptfd);
|
|
||||||
}
|
|
||||||
|
|
||||||
Active++;
|
|
||||||
|
|
||||||
if (sockptr->socket > maxsock)
|
|
||||||
maxsock = sockptr->socket;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Active)
|
|
||||||
{
|
|
||||||
retval = select((int)maxsock + 1, &readfd, &writefd, &exceptfd, &timeout);
|
|
||||||
|
|
||||||
if (retval == -1)
|
|
||||||
{
|
|
||||||
perror("data select");
|
|
||||||
Debugprintf("NRTCP Select Error %d Active %d", WSAGetLastError(), Active);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (retval)
|
|
||||||
{
|
|
||||||
// see who has data
|
|
||||||
|
|
||||||
for (i = 0; i < 255; i++)
|
|
||||||
{
|
|
||||||
if (NRTCPInfo[i] == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
sockptr = NRTCPInfo[i]->sockptr;
|
|
||||||
|
|
||||||
if (sockptr->SocketActive == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sock = sockptr->socket;
|
|
||||||
|
|
||||||
if (FD_ISSET(sock, &writefd))
|
|
||||||
NETROMConnected(sockptr, sock, NRTCPInfo[i]);
|
|
||||||
|
|
||||||
if (FD_ISSET(sock, &readfd))
|
|
||||||
DataSocket_ReadNETROM(sockptr, sock, NRTCPInfo[i], portNo);
|
|
||||||
|
|
||||||
if (FD_ISSET(sock, &exceptfd))
|
|
||||||
NETROMConnectionLost(sockptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int NETROMOpenConnection(struct ROUTE * Route)
|
|
||||||
{
|
|
||||||
struct NRTCPSTRUCT * Info;
|
|
||||||
struct ConnectionInfo * sockptr;
|
|
||||||
|
|
||||||
Debugprintf("Opening NRTCP Connection");
|
|
||||||
|
|
||||||
if (Route->TCPSession)
|
|
||||||
{
|
|
||||||
// SESSION ALREADY EXISTS
|
|
||||||
|
|
||||||
sockptr = Route->TCPSession->sockptr;
|
|
||||||
|
|
||||||
if (sockptr->Connected || sockptr->Connecting)
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
// previous connect failed
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sockptr = AllocateNRTCPRec();
|
|
||||||
|
|
||||||
if (sockptr == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
|
|
||||||
memcpy(Info->Call, MYNETROMCALL, 10);
|
|
||||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
Route->NEIGHBOUR_LINK = Info->LINK;
|
||||||
|
|
||||||
Info->Route = Route;
|
Info->Route = Route;
|
||||||
|
|
@ -1009,6 +461,7 @@ checkLen:
|
||||||
|
|
||||||
if (memcmp(Info->Call, Msg->Call, 10) != 0)
|
if (memcmp(Info->Call, Msg->Call, 10) != 0)
|
||||||
{
|
{
|
||||||
|
Debugprintf("Mismatch");
|
||||||
// something wrong - maybe connection reused
|
// something wrong - maybe connection reused
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1045,6 +498,10 @@ checkLen:
|
||||||
time(&Buffer->Timestamp);
|
time(&Buffer->Timestamp);
|
||||||
|
|
||||||
BPQTRACE(Buffer, FALSE);
|
BPQTRACE(Buffer, FALSE);
|
||||||
|
|
||||||
|
if(NodeAPISocket)
|
||||||
|
NetromTCPTrace(Buffer, "rcvd");
|
||||||
|
|
||||||
ReleaseBuffer(Buffer);
|
ReleaseBuffer(Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1089,7 +546,7 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
|
||||||
{
|
{
|
||||||
Buffer->CHAIN = 0;
|
Buffer->CHAIN = 0;
|
||||||
Buffer->CTL = 0;
|
Buffer->CTL = 0;
|
||||||
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
Buffer->PORT = Route->NEIGHBOUR_PORT;
|
||||||
|
|
||||||
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
|
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
|
||||||
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
|
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
|
||||||
|
|
@ -1100,7 +557,13 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
|
||||||
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
|
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
|
||||||
time(&Buffer->Timestamp);
|
time(&Buffer->Timestamp);
|
||||||
|
|
||||||
|
if(NodeAPISocket)
|
||||||
|
NetromTCPTrace(Buffer, "sent");
|
||||||
|
|
||||||
|
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
||||||
BPQTRACE(Buffer, FALSE);
|
BPQTRACE(Buffer, FALSE);
|
||||||
|
|
||||||
|
|
||||||
ReleaseBuffer(Buffer);
|
ReleaseBuffer(Buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1137,4 +600,3 @@ void NETROMConnectionLost(struct ConnectionInfo * sockptr)
|
||||||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
|
||||||
12
Versions.h
12
Versions.h
|
|
@ -10,16 +10,8 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
<<<<<<< Updated upstream
|
#define KVers 6,0,25,11
|
||||||
#define KVers 6,0,25,8
|
#define KVerstring "6.0.25.11\0"
|
||||||
#define KVerstring "6.0.25.8\0"
|
|
||||||
||||||| Stash base
|
|
||||||
#define KVers 6,0,25,1
|
|
||||||
#define KVerstring "6.0.25.1\0"
|
|
||||||
=======
|
|
||||||
#define KVers 6,0,25,9
|
|
||||||
#define KVerstring "6.0.25.9\0"
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CKernel
|
#ifdef CKernel
|
||||||
|
|
|
||||||
17
asmstrucs.h
17
asmstrucs.h
|
|
@ -184,7 +184,13 @@ typedef struct _TRANSPORTENTRY
|
||||||
int NRRID;
|
int NRRID;
|
||||||
time_t NRRTime;
|
time_t NRRTime;
|
||||||
|
|
||||||
|
time_t ConnectTime;
|
||||||
|
char Direction[16]; // In or Out
|
||||||
|
|
||||||
int Service; // For Paula's Connnect to Service
|
int Service; // For Paula's Connnect to Service
|
||||||
|
int apiSeq; // for OARC event reporting
|
||||||
|
time_t lastStatusSentTime;
|
||||||
|
|
||||||
|
|
||||||
} TRANSPORTENTRY;
|
} TRANSPORTENTRY;
|
||||||
|
|
||||||
|
|
@ -250,13 +256,8 @@ typedef struct ROUTE
|
||||||
|
|
||||||
char * TCPHost; // For NETROM over TCP
|
char * TCPHost; // For NETROM over TCP
|
||||||
int TCPPort;
|
int TCPPort;
|
||||||
<<<<<<< Updated upstream
|
|
||||||
struct NRTCPSTRUCT * TCPSession;
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
struct NRTCPSTRUCT * TCPSession;
|
struct NRTCPSTRUCT * TCPSession;
|
||||||
struct addrinfo * TCPAddress; // Resolved Address
|
struct addrinfo * TCPAddress; // Resolved Address
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
} *PROUTE;
|
} *PROUTE;
|
||||||
|
|
||||||
|
|
@ -742,6 +743,7 @@ typedef struct PORTCONTROL
|
||||||
UCHAR * BUSY; // % Active (Normally DCD active or TX)
|
UCHAR * BUSY; // % Active (Normally DCD active or TX)
|
||||||
|
|
||||||
int Hardware; // TNC H_TYPE. Copied here for access from application context
|
int Hardware; // TNC H_TYPE. Copied here for access from application context
|
||||||
|
int isRF; // For API reporting. -1 is unspecified
|
||||||
|
|
||||||
|
|
||||||
} PORTCONTROLX, *PPORTCONTROL;
|
} PORTCONTROLX, *PPORTCONTROL;
|
||||||
|
|
@ -983,9 +985,6 @@ typedef struct _LINKTABLE
|
||||||
int framesRXed;
|
int framesRXed;
|
||||||
int framesTXed;
|
int framesTXed;
|
||||||
int framesResent;
|
int framesResent;
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
time_t LastStatusTime;
|
time_t LastStatusTime;
|
||||||
int LastStatusbytesRXed;
|
int LastStatusbytesRXed;
|
||||||
int LastStatusbytesTXed;
|
int LastStatusbytesTXed;
|
||||||
|
|
@ -995,7 +994,6 @@ typedef struct _LINKTABLE
|
||||||
uint64_t lastPSent; // Time last I frame with P bit sent in mS (for RTT Measurements)
|
uint64_t lastPSent; // Time last I frame with P bit sent in mS (for RTT Measurements)
|
||||||
int RTT;
|
int RTT;
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
// Now support compressing L2 Sessions.
|
// Now support compressing L2 Sessions.
|
||||||
// We collect as much data as possible before compressing and re-packetizing
|
// We collect as much data as possible before compressing and re-packetizing
|
||||||
|
|
@ -1013,6 +1011,7 @@ typedef struct _LINKTABLE
|
||||||
|
|
||||||
char ApplName[16];
|
char ApplName[16];
|
||||||
time_t lastStatusSentTime;
|
time_t lastStatusSentTime;
|
||||||
|
int apiSeq; // for OARC event reporting
|
||||||
|
|
||||||
} LINKTABLE;
|
} LINKTABLE;
|
||||||
|
|
||||||
|
|
|
||||||
86
cMain.c
86
cMain.c
|
|
@ -38,6 +38,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||||
#include "cheaders.h"
|
#include "cheaders.h"
|
||||||
#include "tncinfo.h"
|
#include "tncinfo.h"
|
||||||
#include "mqtt.h"
|
#include "mqtt.h"
|
||||||
|
#include "kiss.h"
|
||||||
|
|
||||||
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
|
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
|
||||||
VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer);
|
VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer);
|
||||||
|
|
@ -57,13 +58,7 @@ VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
|
||||||
void WritePacketLogThread(void * param);
|
void WritePacketLogThread(void * param);
|
||||||
void hookNodeStarted();
|
void hookNodeStarted();
|
||||||
void hookNodeRunning();
|
void hookNodeRunning();
|
||||||
<<<<<<< Updated upstream
|
|
||||||
void APIL2Trace(struct _MESSAGE * Message, char Dirn);
|
|
||||||
||||||| Stash base
|
|
||||||
|
|
||||||
=======
|
|
||||||
void APIL2Trace(struct _MESSAGE * Message, char * Dirn);
|
void APIL2Trace(struct _MESSAGE * Message, char * Dirn);
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
#include "configstructs.h"
|
#include "configstructs.h"
|
||||||
|
|
||||||
|
|
@ -1023,6 +1018,7 @@ BOOL Start()
|
||||||
PORT->INP3ONLY = PortRec->INP3ONLY;
|
PORT->INP3ONLY = PortRec->INP3ONLY;
|
||||||
PORT->ALLOWINP3 = PortRec->AllowINP3;
|
PORT->ALLOWINP3 = PortRec->AllowINP3;
|
||||||
PORT->ENABLEINP3 = PortRec->EnableINP3;
|
PORT->ENABLEINP3 = PortRec->EnableINP3;
|
||||||
|
PORT->isRF = PortRec->isRF;
|
||||||
|
|
||||||
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
|
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
|
||||||
|
|
||||||
|
|
@ -1422,13 +1418,9 @@ BOOL Start()
|
||||||
{
|
{
|
||||||
ROUTE->TCPHost = Rcfg->tcphost;
|
ROUTE->TCPHost = Rcfg->tcphost;
|
||||||
ROUTE->TCPPort = Rcfg->tcpport;
|
ROUTE->TCPPort = Rcfg->tcpport;
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
|
|
||||||
ROUTE->TCPAddress = (struct addrinfo *)zalloc(sizeof(struct addrinfo));
|
ROUTE->TCPAddress = (struct addrinfo *)zalloc(sizeof(struct addrinfo));
|
||||||
ROUTE->TCPAddress->ai_addr = (struct sockaddr *) zalloc(sizeof(struct sockaddr));
|
ROUTE->TCPAddress->ai_addr = (struct sockaddr *) zalloc(sizeof(struct sockaddr));
|
||||||
>>>>>>> Stashed changes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Rcfg++;
|
Rcfg++;
|
||||||
|
|
@ -2292,12 +2284,7 @@ VOID TIMERINTERRUPT()
|
||||||
Message = (struct _MESSAGE *)Buffer;
|
Message = (struct _MESSAGE *)Buffer;
|
||||||
|
|
||||||
if(NodeAPISocket)
|
if(NodeAPISocket)
|
||||||
<<<<<<< Updated upstream
|
|
||||||
APIL2Trace(Message, 'T');
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
APIL2Trace(Message, "sent");
|
APIL2Trace(Message, "sent");
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
Message->PORT |= 0x80; // Set TX Bit
|
Message->PORT |= 0x80; // Set TX Bit
|
||||||
|
|
||||||
|
|
@ -2412,12 +2399,7 @@ L2Packet:
|
||||||
MQTTKISSRX(Buffer);
|
MQTTKISSRX(Buffer);
|
||||||
|
|
||||||
if(NodeAPISocket &&PORT->PROTOCOL == 0)
|
if(NodeAPISocket &&PORT->PROTOCOL == 0)
|
||||||
<<<<<<< Updated upstream
|
|
||||||
APIL2Trace(Message, 'R');
|
|
||||||
||||||| Stash base
|
|
||||||
=======
|
|
||||||
APIL2Trace(Message, "rcvd");
|
APIL2Trace(Message, "rcvd");
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
// Bridge if requested
|
// Bridge if requested
|
||||||
|
|
||||||
|
|
@ -2788,6 +2770,7 @@ VOID INITIALISEPORTS()
|
||||||
{
|
{
|
||||||
char INITMSG[80];
|
char INITMSG[80];
|
||||||
struct PORTCONTROL * PORT = PORTTABLE;
|
struct PORTCONTROL * PORT = PORTTABLE;
|
||||||
|
struct PORTCONTROL * SAVEPORT;
|
||||||
|
|
||||||
while (PORT)
|
while (PORT)
|
||||||
{
|
{
|
||||||
|
|
@ -2795,7 +2778,68 @@ VOID INITIALISEPORTS()
|
||||||
WritetoConsoleLocal(INITMSG);
|
WritetoConsoleLocal(INITMSG);
|
||||||
|
|
||||||
PORT->PORTINITCODE(PORT);
|
PORT->PORTINITCODE(PORT);
|
||||||
PORT = PORT->PORTPOINTER;
|
SAVEPORT=PORT;
|
||||||
|
|
||||||
|
// See if it is an RF port
|
||||||
|
|
||||||
|
if (PORT->isRF == -1) // Not set
|
||||||
|
{
|
||||||
|
// Try to determine if RF
|
||||||
|
|
||||||
|
if (PORT->PORTTYPE == 0)
|
||||||
|
{
|
||||||
|
struct KISSINFO * KISS = (struct KISSINFO *)PORT;
|
||||||
|
NPASYINFO Port;
|
||||||
|
|
||||||
|
if (KISS->FIRSTPORT && KISS->FIRSTPORT != KISS)
|
||||||
|
{
|
||||||
|
// Not first port on device
|
||||||
|
|
||||||
|
PORT = (struct PORTCONTROL *)KISS->FIRSTPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Port = KISSInfo[PORT->PORTNUMBER];
|
||||||
|
|
||||||
|
if (Port)
|
||||||
|
{
|
||||||
|
// KISS like
|
||||||
|
|
||||||
|
if (PORT->PORTIPADDR.s_addr || PORT->KISSSLAVE)
|
||||||
|
{
|
||||||
|
// KISS over UDP or TCP
|
||||||
|
|
||||||
|
if (PORT->KISSTCP)
|
||||||
|
PORT->isRF = 1; // Assume TCP is RF (software modem)
|
||||||
|
else
|
||||||
|
PORT->isRF = 0; // Assuem UDP is Internet
|
||||||
|
}
|
||||||
|
else
|
||||||
|
PORT->isRF = 1; // Serial port
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (PORT->PORTTYPE == 14) // Loopback
|
||||||
|
PORT->isRF = 0;
|
||||||
|
|
||||||
|
else if (PORT->PORTTYPE == 16) // External
|
||||||
|
{
|
||||||
|
if (PORT->PROTOCOL == 10) // 'HF' Port
|
||||||
|
{
|
||||||
|
struct TNCINFO * TNC = TNCInfo[PORT->PORTNUMBER];
|
||||||
|
|
||||||
|
if (TNC && TNC->Hardware == H_TELNET)
|
||||||
|
PORT->isRF = 0;
|
||||||
|
else
|
||||||
|
PORT->isRF = 1; // ARDOP etc
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// External but not HF - AXIP, BPQETHER VKISS, ??
|
||||||
|
|
||||||
|
PORT->isRF = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PORT = SAVEPORT->PORTPOINTER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
15
config.c
15
config.c
|
|
@ -379,7 +379,8 @@ static char *pkeywords[] =
|
||||||
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
|
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
|
||||||
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
|
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
|
||||||
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
|
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
|
||||||
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "ALLOWINP3", "ENABLEINP3"}; /* parameter keywords */
|
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort",
|
||||||
|
"ALLOWINP3", "ENABLEINP3", "isRF"}; /* parameter keywords */
|
||||||
|
|
||||||
static void * poffset[] =
|
static void * poffset[] =
|
||||||
{
|
{
|
||||||
|
|
@ -393,7 +394,8 @@ static void * poffset[] =
|
||||||
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
|
&xxp.BCALL, &xxp.DIGIMASK, &xxp.DefaultNoKeepAlives, &xxp.IOADDR, &xxp.DLLNAME, &xxp.WL2K, &xxp.UIONLY,
|
||||||
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
|
&xxp.IOADDR, &xxp.IPADDR, &xxp.INTLEVEL, &xxp.IOADDR, &xxp.IOADDR, &xxp.ListenPort, &xxp.NoNormalize,
|
||||||
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
|
&xxp.IGNOREUNLOCKED, &xxp.INP3ONLY, &xxp.TCPPORT, &xxp.RIGPORT, &xxp.PERMITTEDAPPLS, &xxp.Hide,
|
||||||
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3, &xxp.EnableINP3}; /* offset for corresponding data in config file */
|
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort,
|
||||||
|
&xxp.AllowINP3, &xxp.EnableINP3, &xxp.isRF}; /* offset for corresponding data in config file */
|
||||||
|
|
||||||
static int proutine[] =
|
static int proutine[] =
|
||||||
{
|
{
|
||||||
|
|
@ -407,7 +409,8 @@ static int proutine[] =
|
||||||
0, 1, 2, 18, 15, 16, 2,
|
0, 1, 2, 18, 15, 16, 2,
|
||||||
1, 17, 1, 1, 1, 1, 2,
|
1, 17, 1, 1, 1, 1, 2,
|
||||||
2, 2, 1, 1, 19, 2,
|
2, 2, 1, 1, 19, 2,
|
||||||
1, 20, 1, 21, 22, 1, 1, 1}; /* routine to process parameter */
|
1, 20, 1, 21, 22, 1,
|
||||||
|
1, 1, 1}; /* routine to process parameter */
|
||||||
|
|
||||||
int PPARAMLIM = sizeof(proutine)/sizeof(int);
|
int PPARAMLIM = sizeof(proutine)/sizeof(int);
|
||||||
|
|
||||||
|
|
@ -635,13 +638,8 @@ BOOL ProcessConfig()
|
||||||
paramok[93]=1; // ONLYVer2point0
|
paramok[93]=1; // ONLYVer2point0
|
||||||
paramok[94]=1; // DEBUGINP3
|
paramok[94]=1; // DEBUGINP3
|
||||||
paramok[95]=1; // EnableOARCAPI
|
paramok[95]=1; // EnableOARCAPI
|
||||||
<<<<<<< Updated upstream
|
|
||||||
||||||| Stash base
|
|
||||||
paramok[93]=1; // C_ONLYVer2point0
|
|
||||||
=======
|
|
||||||
paramok[96]=1; // OARCAPI
|
paramok[96]=1; // OARCAPI
|
||||||
|
|
||||||
>>>>>>> Stashed changes
|
|
||||||
|
|
||||||
for (i=0; i < PARAMLIM; i++)
|
for (i=0; i < PARAMLIM; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -1825,6 +1823,7 @@ int ports(int i)
|
||||||
}
|
}
|
||||||
|
|
||||||
xxp.SendtoM0LTEMap = 1; // Default to enabled
|
xxp.SendtoM0LTEMap = 1; // Default to enabled
|
||||||
|
xxp.isRF = -1; // Default to undefined
|
||||||
|
|
||||||
while (endport == 0 && !feof(fp1))
|
while (endport == 0 && !feof(fp1))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ struct PORTCONFIG
|
||||||
int QtSMPort;
|
int QtSMPort;
|
||||||
int AllowINP3;
|
int AllowINP3;
|
||||||
int EnableINP3;
|
int EnableINP3;
|
||||||
|
short isRF;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ROUTECONFIG
|
struct ROUTECONFIG
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue