New upstream version 6.0.25.11+repack

This commit is contained in:
Hibby 2025-11-11 21:50:47 +00:00
parent 9aad97786d
commit 85f200a46c
12 changed files with 243 additions and 1514 deletions

25
Bpq32.c
View file

@ -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
View file

@ -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
} }
} }

View file

@ -3739,28 +3739,7 @@ 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();
@ -3769,7 +3748,6 @@ VOID ResolveUpdateThread(void * Unused)
Sleep(1000 * 60 * 15); Sleep(1000 * 60 * 15);
continue; continue;
} }
>>>>>>> Stashed changes
} }
} }

929
Events.c

File diff suppressed because it is too large Load diff

View file

@ -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--)
{ {
@ -1136,6 +1140,12 @@ VOID L4TimerProc()
L4++; L4++;
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
@ -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;

View file

@ -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;

View file

@ -1,557 +1,3 @@
<<<<<<< Updated upstream
/*
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;
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, &param);
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 Copyright 2001-2022 John Wiseman G8BPQ
@ -613,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
{ {
@ -764,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)
{ {
@ -786,7 +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; 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

View file

@ -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

View file

@ -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
View file

@ -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;
} }
} }

View file

@ -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))
{ {

View file

@ -83,6 +83,7 @@ struct PORTCONFIG
int QtSMPort; int QtSMPort;
int AllowINP3; int AllowINP3;
int EnableINP3; int EnableINP3;
short isRF;
}; };
struct ROUTECONFIG struct ROUTECONFIG