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 Netrom over TCP (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
|
||||
|
|
@ -1406,11 +1408,7 @@ void initAIS();
|
|||
void initADSB();
|
||||
int CloseAllSessions();
|
||||
int CloseAllLinks();
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
void NETROMTCPResolve();
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
extern BOOL ADIFLogEnabled;
|
||||
|
||||
|
|
@ -2407,12 +2405,7 @@ VOID TimerProcX()
|
|||
if (CloseAllSessions() == 0)
|
||||
{
|
||||
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
|
||||
>>>>>>> Stashed changes
|
||||
else
|
||||
CloseAllTimer = 39; // ~4 secs for links to close
|
||||
}
|
||||
|
|
@ -5986,9 +5979,6 @@ DllExport VOID APIENTRY CreateNewTrayIcon()
|
|||
|
||||
void hookNodeClosing(char * Reason);
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
BOOL CALLBACK ClosaAllProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
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
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
DllExport VOID APIENTRY CloseAllPrograms()
|
||||
{
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
// HANDLE hProc;
|
||||
=======
|
||||
WNDCLASS wc;
|
||||
>>>>>>> Stashed changes
|
||||
CLOSING = TRUE;
|
||||
|
||||
// Tell BG to shut when all links are gone or after 5 secs
|
||||
|
||||
CloseAllTimer = 50;
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
Closing = TRUE;
|
||||
=======
|
||||
|
||||
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW;
|
||||
|
|
@ -6089,7 +6069,6 @@ DllExport VOID APIENTRY CloseAllPrograms()
|
|||
|
||||
hwndClosing = CreateDialog(hInstance, ClosingClassName, NULL, (DLGPROC)ClosaAllProc);
|
||||
ShowWindow(hwndClosing, SW_SHOW);
|
||||
>>>>>>> Stashed changes
|
||||
}
|
||||
|
||||
VOID RealCloseAllPrograms()
|
||||
|
|
|
|||
41
Cmd.c
41
Cmd.c
|
|
@ -905,18 +905,12 @@ int checkifService(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, s
|
|||
BOOL Stay = FALSE;
|
||||
char * ptr, *Context;
|
||||
int i;
|
||||
<<<<<<< Updated upstream
|
||||
|
||||
ptr = strtok_s(CmdTail, " ", &Context);
|
||||
||||||| Stash base
|
||||
=======
|
||||
char TailCopy[256];
|
||||
|
||||
strcpy(TailCopy, CmdTail);
|
||||
|
||||
|
||||
ptr = strtok_s(TailCopy, " ", &Context);
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
// 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
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
if (axcalls[7] == 0 && axcalls[9] )
|
||||
||||||| Stash base
|
||||
if (axcalls[7] == 0)
|
||||
=======
|
||||
// if (axcalls[7] == 0 && axcalls[9])
|
||||
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
|
||||
|
||||
|
|
@ -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.
|
||||
|
||||
// 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
|
||||
|
||||
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;
|
||||
|
||||
while (cmdCopy[i] >= '0' && cmdCopy[i]<= '9')
|
||||
i++;
|
||||
|
||||
if (cmdCopy[i] != ' ')
|
||||
if (i && cmdCopy[i] != ' ') // have an all digit param = probably a service
|
||||
goto Downlink;
|
||||
else
|
||||
{
|
||||
|
|
@ -2784,7 +2746,6 @@ NoPort:
|
|||
haveService = 1;
|
||||
Service = atoi(cmdCopy);
|
||||
}
|
||||
>>>>>>> Stashed changes
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
22
CommonCode.c
22
CommonCode.c
|
|
@ -3739,29 +3739,8 @@ VOID ResolveUpdateThread(void * Unused)
|
|||
nodeStartedSent = 1;
|
||||
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();
|
||||
|
||||
if (HostEnt1 && HostEnt2)
|
||||
|
|
@ -3769,7 +3748,6 @@ VOID ResolveUpdateThread(void * Unused)
|
|||
Sleep(1000 * 60 * 15);
|
||||
continue;
|
||||
}
|
||||
>>>>>>> Stashed changes
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
27
L4Code.c
27
L4Code.c
|
|
@ -73,6 +73,7 @@ void OutgoingL4ConnectionEvent(TRANSPORTENTRY * L4);
|
|||
void IncomingL4ConnectionEvent(TRANSPORTENTRY * L4);
|
||||
void L4DisconnectEvent(TRANSPORTENTRY * L4, char * Direction, char * Reason);
|
||||
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
|
||||
void L4StatusSeport(TRANSPORTENTRY * L4);
|
||||
|
||||
static UINT APPLMASK;
|
||||
|
||||
|
|
@ -89,6 +90,8 @@ extern int L2Compress;
|
|||
extern int L2CompMaxframe;
|
||||
extern int L2CompPaclen;
|
||||
|
||||
int sessionStatusInterval = 300; // 5 mins
|
||||
|
||||
// L4 Flags Values
|
||||
|
||||
#define DISCPENDING 8 // SEND DISC WHEN ALL DATA ACK'ED
|
||||
|
|
@ -1128,6 +1131,7 @@ VOID L4TimerProc()
|
|||
TRANSPORTENTRY * L4 = L4TABLE;
|
||||
TRANSPORTENTRY * Partner;
|
||||
int MaxLinks = MAXLINKS;
|
||||
time_t Now = time(NULL);
|
||||
|
||||
while (n--)
|
||||
{
|
||||
|
|
@ -1137,6 +1141,12 @@ VOID L4TimerProc()
|
|||
continue;
|
||||
}
|
||||
|
||||
// Check for Status report time
|
||||
|
||||
if (L4->lastStatusSentTime && (Now - L4->lastStatusSentTime) > sessionStatusInterval)
|
||||
L4StatusSeport(L4);
|
||||
|
||||
|
||||
// CHECK FOR L4BUSY SET AND NO LONGER BUSY
|
||||
|
||||
if (L4->NAKBITS & L4BUSY)
|
||||
|
|
@ -1601,13 +1611,8 @@ VOID CONNECTREQUEST(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, UINT Appl
|
|||
int Index;
|
||||
char APPLCMD[13] = "";
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
memcpy(APPLCMD, APPL->APPLCMD, 13);
|
||||
||||||| Stash base
|
||||
=======
|
||||
if (APPL)
|
||||
memcpy(APPLCMD, APPL->APPLCMD, 13);
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
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.
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
memcpy(APPLCMD, CMD->String, 13);
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
if (n < APPL1 + NumberofAppls)
|
||||
goto doAPPLConnect;
|
||||
}
|
||||
|
|
@ -2270,6 +2271,14 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
|
|||
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->PID = 0xf0;
|
||||
|
|
|
|||
4
LinBPQ.c
4
LinBPQ.c
|
|
@ -85,11 +85,7 @@ VOID GetPGConfig();
|
|||
void SendBBSDataToPktMap();
|
||||
void CloseAllLinks();
|
||||
void hookNodeClosing(char * Reason);
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
void NETROMTCPResolve();
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
extern uint64_t INP3timeLoadedMS;
|
||||
|
||||
|
|
|
|||
578
NETROMTCP.c
578
NETROMTCP.c
|
|
@ -1,4 +1,3 @@
|
|||
<<<<<<< Updated upstream
|
||||
/*
|
||||
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);
|
||||
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
|
||||
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
|
||||
void NetromTCPTrace(struct _MESSAGE * Message, char * Dirn);
|
||||
|
||||
extern SOCKET NodeAPISocket;
|
||||
|
||||
struct NRTCPMsg
|
||||
{
|
||||
|
|
@ -211,8 +213,11 @@ int NETROMOpenConnection(struct ROUTE * Route)
|
|||
{
|
||||
struct NRTCPSTRUCT * Info;
|
||||
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)
|
||||
{
|
||||
|
|
@ -233,560 +238,7 @@ int NETROMOpenConnection(struct ROUTE * Route)
|
|||
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, ¶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);
|
||||
memcpy(Info->Call, farCall, 10);
|
||||
Route->NEIGHBOUR_LINK = Info->LINK;
|
||||
|
||||
Info->Route = Route;
|
||||
|
|
@ -1009,6 +461,7 @@ checkLen:
|
|||
|
||||
if (memcmp(Info->Call, Msg->Call, 10) != 0)
|
||||
{
|
||||
Debugprintf("Mismatch");
|
||||
// something wrong - maybe connection reused
|
||||
}
|
||||
|
||||
|
|
@ -1045,6 +498,10 @@ checkLen:
|
|||
time(&Buffer->Timestamp);
|
||||
|
||||
BPQTRACE(Buffer, FALSE);
|
||||
|
||||
if(NodeAPISocket)
|
||||
NetromTCPTrace(Buffer, "rcvd");
|
||||
|
||||
ReleaseBuffer(Buffer);
|
||||
}
|
||||
|
||||
|
|
@ -1089,7 +546,7 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
|
|||
{
|
||||
Buffer->CHAIN = 0;
|
||||
Buffer->CTL = 0;
|
||||
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
||||
Buffer->PORT = Route->NEIGHBOUR_PORT;
|
||||
|
||||
ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
|
||||
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
|
||||
|
|
@ -1100,7 +557,13 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
|
|||
Buffer->LENGTH = DataLen + 15 + MSGHDDRLEN;
|
||||
time(&Buffer->Timestamp);
|
||||
|
||||
if(NodeAPISocket)
|
||||
NetromTCPTrace(Buffer, "sent");
|
||||
|
||||
Buffer->PORT = Route->NEIGHBOUR_PORT | 128; // TX Flag
|
||||
BPQTRACE(Buffer, FALSE);
|
||||
|
||||
|
||||
ReleaseBuffer(Buffer);
|
||||
}
|
||||
|
||||
|
|
@ -1137,4 +600,3 @@ void NETROMConnectionLost(struct ConnectionInfo * sockptr)
|
|||
memset(sockptr, 0, sizeof(struct ConnectionInfo));
|
||||
}
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
|
|
|
|||
12
Versions.h
12
Versions.h
|
|
@ -10,16 +10,8 @@
|
|||
|
||||
#endif
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
#define KVers 6,0,25,8
|
||||
#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
|
||||
#define KVers 6,0,25,11
|
||||
#define KVerstring "6.0.25.11\0"
|
||||
|
||||
|
||||
#ifdef CKernel
|
||||
|
|
|
|||
17
asmstrucs.h
17
asmstrucs.h
|
|
@ -184,7 +184,13 @@ typedef struct _TRANSPORTENTRY
|
|||
int NRRID;
|
||||
time_t NRRTime;
|
||||
|
||||
time_t ConnectTime;
|
||||
char Direction[16]; // In or Out
|
||||
|
||||
int Service; // For Paula's Connnect to Service
|
||||
int apiSeq; // for OARC event reporting
|
||||
time_t lastStatusSentTime;
|
||||
|
||||
|
||||
} TRANSPORTENTRY;
|
||||
|
||||
|
|
@ -250,13 +256,8 @@ typedef struct ROUTE
|
|||
|
||||
char * TCPHost; // For NETROM over TCP
|
||||
int TCPPort;
|
||||
<<<<<<< Updated upstream
|
||||
struct NRTCPSTRUCT * TCPSession;
|
||||
||||||| Stash base
|
||||
=======
|
||||
struct NRTCPSTRUCT * TCPSession;
|
||||
struct addrinfo * TCPAddress; // Resolved Address
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
} *PROUTE;
|
||||
|
||||
|
|
@ -742,6 +743,7 @@ typedef struct PORTCONTROL
|
|||
UCHAR * BUSY; // % Active (Normally DCD active or TX)
|
||||
|
||||
int Hardware; // TNC H_TYPE. Copied here for access from application context
|
||||
int isRF; // For API reporting. -1 is unspecified
|
||||
|
||||
|
||||
} PORTCONTROLX, *PPORTCONTROL;
|
||||
|
|
@ -983,9 +985,6 @@ typedef struct _LINKTABLE
|
|||
int framesRXed;
|
||||
int framesTXed;
|
||||
int framesResent;
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
time_t LastStatusTime;
|
||||
int LastStatusbytesRXed;
|
||||
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)
|
||||
int RTT;
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
// Now support compressing L2 Sessions.
|
||||
// We collect as much data as possible before compressing and re-packetizing
|
||||
|
|
@ -1013,6 +1011,7 @@ typedef struct _LINKTABLE
|
|||
|
||||
char ApplName[16];
|
||||
time_t lastStatusSentTime;
|
||||
int apiSeq; // for OARC event reporting
|
||||
|
||||
} 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 "tncinfo.h"
|
||||
#include "mqtt.h"
|
||||
#include "kiss.h"
|
||||
|
||||
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
|
||||
VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer);
|
||||
|
|
@ -57,13 +58,7 @@ VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
|
|||
void WritePacketLogThread(void * param);
|
||||
void hookNodeStarted();
|
||||
void hookNodeRunning();
|
||||
<<<<<<< Updated upstream
|
||||
void APIL2Trace(struct _MESSAGE * Message, char Dirn);
|
||||
||||||| Stash base
|
||||
|
||||
=======
|
||||
void APIL2Trace(struct _MESSAGE * Message, char * Dirn);
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
#include "configstructs.h"
|
||||
|
||||
|
|
@ -1023,6 +1018,7 @@ BOOL Start()
|
|||
PORT->INP3ONLY = PortRec->INP3ONLY;
|
||||
PORT->ALLOWINP3 = PortRec->AllowINP3;
|
||||
PORT->ENABLEINP3 = PortRec->EnableINP3;
|
||||
PORT->isRF = PortRec->isRF;
|
||||
|
||||
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
|
||||
|
||||
|
|
@ -1422,13 +1418,9 @@ BOOL Start()
|
|||
{
|
||||
ROUTE->TCPHost = Rcfg->tcphost;
|
||||
ROUTE->TCPPort = Rcfg->tcpport;
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
=======
|
||||
|
||||
ROUTE->TCPAddress = (struct addrinfo *)zalloc(sizeof(struct addrinfo));
|
||||
ROUTE->TCPAddress->ai_addr = (struct sockaddr *) zalloc(sizeof(struct sockaddr));
|
||||
>>>>>>> Stashed changes
|
||||
}
|
||||
|
||||
Rcfg++;
|
||||
|
|
@ -2292,12 +2284,7 @@ VOID TIMERINTERRUPT()
|
|||
Message = (struct _MESSAGE *)Buffer;
|
||||
|
||||
if(NodeAPISocket)
|
||||
<<<<<<< Updated upstream
|
||||
APIL2Trace(Message, 'T');
|
||||
||||||| Stash base
|
||||
=======
|
||||
APIL2Trace(Message, "sent");
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
Message->PORT |= 0x80; // Set TX Bit
|
||||
|
||||
|
|
@ -2412,12 +2399,7 @@ L2Packet:
|
|||
MQTTKISSRX(Buffer);
|
||||
|
||||
if(NodeAPISocket &&PORT->PROTOCOL == 0)
|
||||
<<<<<<< Updated upstream
|
||||
APIL2Trace(Message, 'R');
|
||||
||||||| Stash base
|
||||
=======
|
||||
APIL2Trace(Message, "rcvd");
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
// Bridge if requested
|
||||
|
||||
|
|
@ -2788,6 +2770,7 @@ VOID INITIALISEPORTS()
|
|||
{
|
||||
char INITMSG[80];
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct PORTCONTROL * SAVEPORT;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
|
|
@ -2795,7 +2778,68 @@ VOID INITIALISEPORTS()
|
|||
WritetoConsoleLocal(INITMSG);
|
||||
|
||||
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",
|
||||
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
|
||||
"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[] =
|
||||
{
|
||||
|
|
@ -393,7 +394,8 @@ static void * poffset[] =
|
|||
&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.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[] =
|
||||
{
|
||||
|
|
@ -407,7 +409,8 @@ static int proutine[] =
|
|||
0, 1, 2, 18, 15, 16, 2,
|
||||
1, 17, 1, 1, 1, 1, 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);
|
||||
|
||||
|
|
@ -635,13 +638,8 @@ BOOL ProcessConfig()
|
|||
paramok[93]=1; // ONLYVer2point0
|
||||
paramok[94]=1; // DEBUGINP3
|
||||
paramok[95]=1; // EnableOARCAPI
|
||||
<<<<<<< Updated upstream
|
||||
||||||| Stash base
|
||||
paramok[93]=1; // C_ONLYVer2point0
|
||||
=======
|
||||
paramok[96]=1; // OARCAPI
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
|
||||
for (i=0; i < PARAMLIM; i++)
|
||||
{
|
||||
|
|
@ -1825,6 +1823,7 @@ int ports(int i)
|
|||
}
|
||||
|
||||
xxp.SendtoM0LTEMap = 1; // Default to enabled
|
||||
xxp.isRF = -1; // Default to undefined
|
||||
|
||||
while (endport == 0 && !feof(fp1))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ struct PORTCONFIG
|
|||
int QtSMPort;
|
||||
int AllowINP3;
|
||||
int EnableINP3;
|
||||
short isRF;
|
||||
};
|
||||
|
||||
struct ROUTECONFIG
|
||||
|
|
|
|||
Loading…
Reference in a new issue