Compare commits

..

No commits in common. "hibbian/latest" and "upstream/6.0.24.59a+repack" have entirely different histories.

106 changed files with 43555 additions and 5072 deletions

139
.rej Normal file
View File

@ -0,0 +1,139 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

View File

@ -1412,11 +1412,10 @@ VOID * SIXPACKExtInit(EXTPORTDATA * PortEntry)
TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo)); TNC->sixPack = zalloc(sizeof(struct sixPackTNCInfo));
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SIXPACK;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SIXPACK;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -382,8 +382,7 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_AEA;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_AEA;
TNC->TEXTMODE = FALSE; TNC->TEXTMODE = FALSE;
@ -391,6 +390,8 @@ VOID * AEAExtInit(EXTPORTDATA * PortEntry)
TNC->InitScript = _strupr(TNC->InitScript); TNC->InitScript = _strupr(TNC->InitScript);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -1142,7 +1142,6 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
int con,conport; int con,conport;
int AGWYReply = 0; int AGWYReply = 0;
int state, change; int state, change;
int n;
// if we have hidden some ports then the port in the AGW packet will be an index into the visible ports, // if we have hidden some ports then the port in the AGW packet will be an index into the visible ports,
// not the real port number // not the real port number
@ -1197,7 +1196,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]); conport=GetPortNumber(VisiblePortToRealPort[key[0]-48]);
n = sprintf(ConnectMsg,"C %d %s",conport,ToCall); sprintf(ConnectMsg,"C %d %s",conport,ToCall);
// if 'v' command add digis // if 'v' command add digis
@ -1212,7 +1211,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
while(nDigis--) while(nDigis--)
{ {
n += sprintf(&ConnectMsg[n], " %s", Digis); sprintf(ConnectMsg, "%s, %s", ConnectMsg, Digis);
Digis += 10; Digis += 10;
} }
} }

View File

@ -760,7 +760,7 @@ void SaveVesselDataBase()
void LoadNavAidDataBase() void LoadNavAidDataBase()
{ {
int i, n, count; int i;
FILE *file; FILE *file;
char buf[256]; char buf[256];
@ -793,12 +793,10 @@ void LoadNavAidDataBase()
NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *)); NavRecords = (struct NAVAIDRECORD **)malloc(NavAidCount * sizeof(void *));
count = 0;
for (i = 0; i < NavAidCount; i++) for (i = 0; i < NavAidCount; i++)
{ {
navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD)); navptr = (struct NAVAIDRECORD *)malloc(sizeof(struct NAVAIDRECORD));
NavRecords[count] = navptr; NavRecords[i] = navptr;
memset(navptr, 0, sizeof(struct NAVAIDRECORD)); memset(navptr, 0, sizeof(struct NAVAIDRECORD));
fgets(buf, 255, file); fgets(buf, 255, file);
@ -809,19 +807,6 @@ void LoadNavAidDataBase()
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
strcpy(&navptr->name[0],token); strcpy(&navptr->name[0],token);
for (n = 0; n < 20; n++)
{
char c = navptr->name[n];
if (!isalpha(c) && !isdigit(c) && c != ' ' && c != '_')
{
count--;
break;
}
}
count++;
token = strtok(NULL, "|\n" ); token = strtok(NULL, "|\n" );
navptr->lat = atof(token); navptr->lat = atof(token);
@ -835,7 +820,6 @@ void LoadNavAidDataBase()
navptr->TimeLastUpdated = atoi(token); navptr->TimeLastUpdated = atoi(token);
} }
NavAidCount = count;
fclose(file); fclose(file);
} }

View File

@ -553,8 +553,6 @@ int APRSWriteLog(char * msg)
UCHAR Value[MAX_PATH]; UCHAR Value[MAX_PATH];
time_t T; time_t T;
struct tm * tm; struct tm * tm;
int n;
if (LogAPRSIS == 0) if (LogAPRSIS == 0)
return 0; return 0;
@ -576,9 +574,8 @@ int APRSWriteLog(char * msg)
strcat(Value, "logs/APRS_"); strcat(Value, "logs/APRS_");
} }
n = strlen(Value); sprintf(Value, "%s%02d%02d%02d.log", Value,
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
sprintf(&Value[n], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "ab")) == NULL) if ((file = fopen(Value, "ab")) == NULL)
return FALSE; return FALSE;

9223
APRSCode.c.orig Normal file

File diff suppressed because it is too large Load Diff

139
APRSCode.c.rej Normal file
View File

@ -0,0 +1,139 @@
--- APRSCode.c
+++ APRSCode.c
@@ -3674,7 +3674,7 @@
if (ptr1)
*ptr1 = 0;
-// Debugprintf("Duplicate Message supressed %s", Msg);
+// Debugprintf("Duplicate Message suppressed %s", Msg);
return TRUE; // Duplicate
}
}
--- BPQChat.rc
+++ BPQChat.rc
@@ -162,7 +162,7 @@
WS_VSCROLL
DEFPUSHBUTTON "Save Welcome Message",SAVEWELCOME,140,296,91,14,
BS_CENTER | BS_VCENTER
- LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
+ LTEXT " If the node is not directly connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT",
IDC_STATIC,9,52,355,24
END
--- BPQMail.rc
+++ BPQMail.rc
@@ -1045,7 +1045,7 @@
CONTROL "Delete Log and Message Files to Recycle Bin",
IDC_DELETETORECYCLE,"Button",BS_AUTOCHECKBOX |
BS_LEFTTEXT | BS_MULTILINE | WS_TABSTOP,5,142,115,20
- CONTROL "Supress Mailing of Housekeeping Results",
+ CONTROL "Suppress Mailing of Housekeeping Results",
IDC_MAINTNOMAIL,"Button",BS_AUTOCHECKBOX | BS_LEFTTEXT |
BS_MULTILINE | WS_TABSTOP,5,182,115,20
CONTROL "Generate Traffic Report",IDC_MAINTTRAFFIC,"Button",
--- HanksRT.c
+++ HanksRT.c
@@ -1186,7 +1186,7 @@
// Duplicate, so discard, but save time
DupInfo[i].DupTime = Now;
- Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s supressed", Call, Msg);
+ Logprintf(LOG_CHAT, circuit, '?', "Duplicate Message From %s %s suppressed", Call, Msg);
return TRUE; // Duplicate
}
--- RigControl.c
+++ RigControl.c
@@ -8385,7 +8385,7 @@
switch (Msg[0])
{
- case 'f': // Get Freqency
+ case 'f': // Get Frequency
HLGetFreq(Sock, RIG, sep);
return 0;
--- UZ7HODrv.c
+++ UZ7HODrv.c
@@ -374,7 +374,7 @@
{
// Read Freq
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Freqency %d\r", AGW->CenterFreq);
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Modem Frequency %d\r", AGW->CenterFreq);
return 1;
}
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}
--- WinRPRHelper.c
+++ WinRPRHelper.c
@@ -111,7 +111,7 @@
if (argc < 3)
{
- printf ("Missing paramters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
+ printf ("Missing parameters - you need COM port and IP Address and rigctl port of BPQ, eg \r\n"
" WinRPRHelper com10 192.168.1.64:4532\r\n\r\n"
"Press any key to exit\r\n");
--- config.c
+++ config.c
@@ -649,7 +649,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
- Consoleprintf("Please enter a LOCATOR statment in your BPQ32.cfg");
+ Consoleprintf("Please enter a LOCATOR statement in your BPQ32.cfg");
Consoleprintf("If you really don't want to be on the Node Map you can enter LOCATOR=NONE");
Consoleprintf("");
--- kiss.c
+++ kiss.c
@@ -1485,7 +1485,7 @@
}
}
else
- Debugprintf("Polled KISS - response from wrong address - Polled %d Reponse %d",
+ Debugprintf("Polled KISS - response from wrong address - Polled %d Response %d",
KISS->POLLPOINTER->OURCTRL, (Port->RXMSG[0] & 0xf0));
goto SeeifMore; // SEE IF ANYTHING ELSE
--- templatedefs.c
+++ templatedefs.c
@@ -1165,7 +1165,7 @@
"Send Non-delivery Notifications<br>\r\n"
"for P and T messages <input %sname=\"SendND\" value=\"SendND\" type=\"checkbox\" /><br>\r\n"
" <br />\r\n"
- "Supress Mailing of<br>\r\n"
+ "Suppress Mailing of<br>\r\n"
"Housekeeping Result <input %sname=\"NoMail\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"Generate Traffic Report<input %sname=\"GenTraffic\" value=\"Yes\" type=\"checkbox\"><br><br>\r\n"
"<div style=\"text-align: center;\"><input class='btn' name=RunNow value=\"Run Housekeeping\" type=submit class='btn'></div>\r\n"
@@ -1454,7 +1454,7 @@
"<div style=\"text-align: left; width: 680px; margin: auto;\">The Nodes to link to box defines which other Chat Nodes should be connected to, or from which "
"connections may be accepted. The format is ALIAS:CALL, eg BPQCHT:G8BPQ-4. If the node is not directly "
"connectable (ie is not in your NODES table) you can add a connect script. This consists of a series of commands "
- "seperared by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
+ "separated by |, eg NOTCHT:G8BPQ-4|C 3 GM8BPQ-9|CHAT"
"<br><br>The Callsign of the Chat Node is not defined here - it is obtained from the bpq32.cfg APPLICATION line corresponding to the Chat Appl Number.<br>\r\n"
"<br></div>\n"
--- WebMail.c
+++ WebMail.c
@@ -2020,7 +2020,7 @@
"document.getElementById('myform').action = '/WebMail/QuoteOriginal' + '?%s';"
" document.getElementById('myform').submit();}</script>"
"<input type=button class='btn' onclick='myfunc()' "
- "value='Include Orignal Msg'>";
+ "value='Include Original Msg'>";
char Temp[1024];
char ReplyAddr[128];

26
ARDOP.c
View File

@ -136,7 +136,6 @@ BOOL ARDOPStopPort(struct PORTCONTROL * PORT)
if (TNC->Streams[0].Attached) if (TNC->Streams[0].Attached)
TNC->Streams[0].ReportDISC = TRUE; TNC->Streams[0].ReportDISC = TRUE;
TNC->Streams[0].Connecting = 0;
TNC->Streams[0].Connected = 0; TNC->Streams[0].Connected = 0;
TNC->Streams[0].Attached = 0; TNC->Streams[0].Attached = 0;
@ -888,10 +887,8 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime)) if (TNC->SessionTimeLimit && STREAM->ConnectTime && time(NULL) > (TNC->SessionTimeLimit + STREAM->ConnectTime))
{ {
Debugprintf("ARDOP closing session on SessionTimelimit");
ARDOPSendCommand(TNC, "DISCONNECT", TRUE); ARDOPSendCommand(TNC, "DISCONNECT", TRUE);
STREAM->ReportDISC = 1; STREAM->Disconnecting = TRUE;
STREAM->AttachTime = 0;
} }
} }
@ -901,7 +898,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime)) if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{ {
Debugprintf("ARDOP closing session on AttachTimelimit");
STREAM->ReportDISC = 1; STREAM->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
} }
@ -1496,10 +1492,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1986,7 +1979,6 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->LogPath) if (TNC->LogPath)
ARDOPOpenLogFiles(TNC); ARDOPOpenLogFiles(TNC);
@ -1999,7 +1991,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_ARDOP; TNC->Hardware = H_ARDOP;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -2007,6 +1999,7 @@ VOID * ARDOPExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -2289,11 +2282,11 @@ VOID TNCLost(struct TNCINFO * TNC)
} }
if (STREAM->Attached) if (STREAM->Attached)
STREAM->ReportDISC = TRUE; {
STREAM->Connected = FALSE; STREAM->Connected = FALSE;
STREAM->Connecting = FALSE; STREAM->Connecting = FALSE;
STREAM->ReportDISC = TRUE;
}
} }
} }
@ -3143,7 +3136,6 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Incoming Connect // Incoming Connect
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
STREAM->AttachTime = time(NULL);
// Stop other ports in same group // Stop other ports in same group
@ -3326,9 +3318,9 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
} }
if (_memicmp(Buffer, "DISCONNECTED", 12) == 0 if (_memicmp(Buffer, "DISCONNECTED", 12) == 0
|| _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0 || _memicmp(Buffer, "STATUS CONNECT TO", 17) == 0
|| _memicmp(Buffer, "STATUS END ARQ CALL", 19) == 0
|| _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0 || _memicmp(Buffer, "STATUS ARQ TIMEOUT FROM PROTOCOL STATE", 24) == 0
// || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0 // || _memicmp(Buffer, "NEWSTATE DISC", 13) == 0
|| _memicmp(Buffer, "ABORT", 5) == 0) || _memicmp(Buffer, "ABORT", 5) == 0)
@ -5961,7 +5953,7 @@ VOID ARAXINIT(struct PORTCONTROL * PORT)
char Msg[80] = ""; char Msg[80] = "";
memcpy(Msg, PORT->PORTDESCRIPTION, 30); memcpy(Msg, PORT->PORTDESCRIPTION, 30);
strcat(Msg, "\n); sprintf(Msg, "%s\n", Msg);
WritetoConsoleLocal(Msg); WritetoConsoleLocal(Msg);
} }

View File

@ -117,7 +117,6 @@ struct UserInfo * FindBBS(char * Name);
void ReleaseWebMailStruct(WebMailInfo * WebMail); void ReleaseWebMailStruct(WebMailInfo * WebMail);
VOID TidyWelcomeMsg(char ** pPrompt); VOID TidyWelcomeMsg(char ** pPrompt);
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token); int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
void UndoTransparency(char * input);
char UNC[] = ""; char UNC[] = "";
char CHKD[] = "checked=checked "; char CHKD[] = "checked=checked ";
@ -187,7 +186,7 @@ char RefreshMainPage[] = "<html><head>"
char StatusPage [] = char StatusPage [] =
"<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>" "<form style=\"font-family: monospace; text-align: center\" method=post action=/Mail/DisSession?%s>"
"<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream &nbsp;Queue &nbsp;Sent &nbsp;Rxed<br>" "<br>User&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callsign&nbsp;&nbsp; Stream Queue<br>"
"<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>"; "<select style=\"font-family: monospace;\" tabindex=1 size=10 name=call>";
char StreamEnd[] = char StreamEnd[] =
@ -1702,8 +1701,6 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
free(Filters); free(Filters);
Filters = NULL; Filters = NULL;
UndoTransparency(input);
while (input) while (input)
{ {
// extract and validate before saving // extract and validate before saving
@ -1717,7 +1714,7 @@ VOID ProcessConfUpdate(struct HTTPConnectionInfo * Session, char * MsgPtr, char
input = strstr(input, "&Type="); input = strstr(input, "&Type=");
if (Filter.Action == 'H' || Filter.Action == 'R' || Filter.Action == 'A') if (Filter.Action == 'H' || Filter.Action == 'R')
{ {
Filter.Type = toupper(input[6]); Filter.Type = toupper(input[6]);
input = strstr(input, "&From="); input = strstr(input, "&From=");
@ -2758,19 +2755,6 @@ VOID SendUIPage(char * Reply, int * ReplyLen, char * Key)
*ReplyLen = Len; *ReplyLen = Len;
} }
void ConvertSpaceTonbsp(char * msg)
{
// Replace any space with &nbsp;
char * ptr;
while (ptr = strchr(msg, ' '))
{
memmove(ptr + 5, ptr, strlen(ptr) + 1);
memcpy(ptr, "&nbsp;", 6);
}
}
VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key) VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
{ {
int Len; int Len;
@ -2792,8 +2776,6 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
if (!conn->Active) if (!conn->Active)
{ {
strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" strcpy(msg,"Idle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n"); "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n");
} }
@ -2807,16 +2789,16 @@ VOID SendStatusPage(char * Reply, int * ReplyLen, char * Key)
strcpy(Name, conn->UserPointer->Name); strcpy(Name, conn->UserPointer->Name);
Name[9] = 0; Name[9] = 0;
i=sprintf_s(msg, sizeof(msg), "%-12s %-9s %3d %6d%6d%6d\r\n", i=sprintf_s(msg, sizeof(msg), "%s%s%s%s%2d&nbsp;%5d\r\n",
Name, Name,
&TenSpaces[strlen(Name) * 6],
conn->UserPointer->Call, conn->UserPointer->Call,
&TenSpaces[strlen(conn->UserPointer->Call) * 6],
conn->BPQStream, conn->BPQStream,
conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed); conn->OutputQueueLength - conn->OutputGetPointer);
} }
} }
} }
ConvertSpaceTonbsp(msg);
Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg); Len += sprintf(&Reply[Len], StatusLine, conn->BPQStream, msg);
} }

View File

@ -2085,7 +2085,6 @@ hold certain types or sizes of messages.
The first letter of each valid line specifies the action : The first letter of each valid line specifies the action :
A = Accept : Message is accepted without checking other filters
R = Reject : The message will not be received. R = Reject : The message will not be received.
H = Hold : The message will be received but held until the sysop reviews. H = Hold : The message will be received but held until the sysop reviews.
L = Local Hold : Only messages created on this BBS will be held. L = Local Hold : Only messages created on this BBS will be held.
@ -2180,38 +2179,21 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
while (p) while (p)
{ {
if (p->Action != 'R' && p->Action != 'A') if (p->Action != 'R')
goto Continue; goto Continue;
if (p->Type != Type && p->Type != '*') if (p->Type != Type && p->Type != '*')
goto Continue; goto Continue;
// wildcardcompare returns true on a match
if (wildcardcompare(From, p->From) == 0) if (wildcardcompare(From, p->From) == 0)
goto Continue; goto Continue;
if (p->TO[0] == '!')
{
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0) if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue; goto Continue;
}
if (ATBBS) if (ATBBS)
{ if (wildcardcompare(ATBBS, p->AT) == 0)
char AtCopy[256];
strcpy(AtCopy, ATBBS);
_strupr(AtCopy);
if (wildcardcompare(AtCopy, p->AT) == 0)
goto Continue; goto Continue;
}
if (BID) if (BID)
if (wildcardcompare(BID, p->BID) == 0) if (wildcardcompare(BID, p->BID) == 0)
@ -2220,11 +2202,6 @@ BOOL CheckRejFilters(char * From, char * To, char * ATBBS, char * BID, char Type
if (p->MaxLen && Len < p->MaxLen) if (p->MaxLen && Len < p->MaxLen)
goto Continue; goto Continue;
// if type 'A' matches all rules then accept without checking rest
if (p->Action == 'A')
return FALSE;
return TRUE; // Hold return TRUE; // Hold
Continue: Continue:
@ -2267,7 +2244,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
{ {
char ** Calls; char ** Calls;
FBBFilter * p = Filters; FBBFilter * p = Filters;
char ToCopy[256];
if (HoldFrom && From) if (HoldFrom && From)
{ {
@ -2331,9 +2307,6 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
// check fbb reject.sys type filters // check fbb reject.sys type filters
strcpy(ToCopy, To);
_strupr(ToCopy);
while (p) while (p)
{ {
if (p->Action != 'H') if (p->Action != 'H')
@ -2345,16 +2318,9 @@ BOOL CheckHoldFilters(struct MsgInfo * Msg, char * From, char * To, char * ATBBS
if (wildcardcompare(Msg->from, p->From) == 0) if (wildcardcompare(Msg->from, p->From) == 0)
goto Continue; goto Continue;
if (p->TO[0] == '!') if (wildcardcompare(Msg->to, p->TO) == 0)
{
if (wildcardcompare(ToCopy, &p->TO[1]) == 1)
goto Continue; goto Continue;
}
else
{
if (wildcardcompare(ToCopy, p->TO) == 0)
goto Continue;
}
if (wildcardcompare(Msg->via, p->AT) == 0) if (wildcardcompare(Msg->via, p->AT) == 0)
goto Continue; goto Continue;
@ -3422,7 +3388,6 @@ void Flush(CIRCUIT * conn)
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
conn->bytesSent += len;
tosend-=len; tosend-=len;
SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25); SendUnbuffered(conn->BPQStream, "<A>bort, <CR> Continue..>", 25);
FreeSemaphore(&OutputSEM); FreeSemaphore(&OutputSEM);
@ -3434,7 +3399,6 @@ void Flush(CIRCUIT * conn)
} }
SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len); SendUnbuffered(conn->BPQStream, &conn->OutputQueue[conn->OutputGetPointer], len);
conn->bytesSent += len;
conn->OutputGetPointer+=len; conn->OutputGetPointer+=len;
@ -5846,12 +5810,12 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
continue; continue;
} }
} }
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", Addr, Via); ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, Addr, Via);
continue; continue;
} }
@ -5869,7 +5833,7 @@ VOID ProcessMsgLine(CIRCUIT * conn, struct UserInfo * user, char* Buffer, int ms
} }
else else
{ {
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
// Add to B2 Message for RMS // Add to B2 Message for RMS
@ -10281,7 +10245,7 @@ BOOL GetConfig(char * ConfigName)
GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100); GetStringValue(group, "ISPAccountPass", EncryptedISPAccountPass, 100);
sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default sprintf(SignoffMsg, "73 de %s\r", BBSName); // Default
GetStringValue(group, "SignoffMsg", SignoffMsg, 50); GetStringValue(group, "SignoffMsg", ISPAccountName, 50);
DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass)); DecryptPass(EncryptedISPAccountPass, ISPAccountPass, (int)strlen(EncryptedISPAccountPass));
@ -10586,7 +10550,7 @@ int Connected(int Stream)
char callsign[10]; char callsign[10];
int port, paclen, maxframe, l4window; int port, paclen, maxframe, l4window;
char ConnectedMsg[] = "*** CONNECTED "; char ConnectedMsg[] = "*** CONNECTED ";
char Msg[256]; char Msg[100];
char Title[100]; char Title[100];
int64_t Freq = 0; int64_t Freq = 0;
int Mode = 0; int Mode = 0;
@ -10670,12 +10634,6 @@ int Connected(int Stream)
} }
} }
if (Mode < 0 || Mode > 54)
Mode = 0;
if (Freq < 0 || Freq > 11000000000)
Freq = 0;
memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything memset(conn, 0, sizeof(ConnectionInfo)); // Clear everything
conn->Active = TRUE; conn->Active = TRUE;
conn->BPQStream = Stream; conn->BPQStream = Stream;
@ -10740,7 +10698,7 @@ int Connected(int Stream)
LongFreq = GetPortFrequency(port, FreqString); LongFreq = GetPortFrequency(port, FreqString);
#endif #endif
} }
Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %lld Mode %d\r\n", callsign, port, LongFreq, Mode); Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %d Mode %ld\r\n", callsign, port, LongFreq, Mode);
sprintf(Title, "New User %s", callsign); sprintf(Title, "New User %s", callsign);
@ -10800,7 +10758,7 @@ int Connected(int Stream)
} }
if (port) if (port)
n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %lld Mode %s", n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %d Mode %s",
user->Call, port, Freq, WL2KModes[Mode]); user->Call, port, Freq, WL2KModes[Mode]);
else else
n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call); n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s", user->Call);
@ -11093,6 +11051,7 @@ int DoReceivedData(int Stream)
if (Stream == conn->BPQStream) if (Stream == conn->BPQStream)
{ {
conn->SIDResponseTimer = 0; // Got a message, so cancel timeout. conn->SIDResponseTimer = 0; // Got a message, so cancel timeout.
do do
{ {
// May have several messages per packet, or message split over packets // May have several messages per packet, or message split over packets
@ -11109,7 +11068,6 @@ int DoReceivedData(int Stream)
if (InputLen == 0 && conn->InputMode != 'Y') if (InputLen == 0 && conn->InputMode != 'Y')
return 0; return 0;
conn->bytesRxed += InputLen;
conn->InputLen += InputLen; conn->InputLen += InputLen;
if (conn->InputLen == 0) return 0; if (conn->InputLen == 0) return 0;

500
BPQINP3.c
View File

@ -37,9 +37,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
uint64_t timeLoadedMS = 0; uint64_t timeLoadedMS = 0;
VOID SendNegativeInfo();
VOID SortRoutes(struct DEST_LIST * Dest);
VOID SendRTTMsg(struct ROUTE * Route);
static VOID SendNetFrame(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame) static VOID SendNetFrame(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
{ {
@ -74,9 +71,9 @@ VOID __cdecl Debugprintf(const char * format, ...);
VOID SendINP3RIF(struct ROUTE * Route, UCHAR * Call, UCHAR * Alias, int Hops, int RTT); VOID SendINP3RIF(struct ROUTE * Route, UCHAR * Call, UCHAR * Alias, int Hops, int RTT);
VOID SendOurRIF(struct ROUTE * Route); VOID SendOurRIF(struct ROUTE * Route);
VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops, int rtt); VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops, int rtt);
VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt); VOID UpdateRoute(struct DEST_LIST * Dest, struct DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt);
VOID KillRoute(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR); VOID KillRoute(struct DEST_ROUTE_ENTRY * ROUTEPTR);
VOID AddHere(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt); VOID AddHere(struct DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt);
VOID SendRIPToNeighbour(struct ROUTE * Route); VOID SendRIPToNeighbour(struct ROUTE * Route);
VOID DecayNETROMRoutes(struct ROUTE * Route); VOID DecayNETROMRoutes(struct ROUTE * Route);
VOID DeleteINP3Routes(struct ROUTE * Route); VOID DeleteINP3Routes(struct ROUTE * Route);
@ -136,14 +133,8 @@ VOID DeleteINP3Routes(struct ROUTE * Route)
{ {
int i; int i;
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
char Call1[10];
char Call2[10];
Call1[ConvFromAX25(Route->NEIGHBOUR_CALL, Call1)] = 0; // Delete any NETROM Dest entries via this Route
Debugprintf("Deleting INP3 routes via %s", Call1);
// Delete any INP3 Dest entries via this Route
Route->SRTT = 0; Route->SRTT = 0;
Route->RTT = 0; Route->RTT = 0;
@ -165,65 +156,48 @@ VOID DeleteINP3Routes(struct ROUTE * Route)
if (Dest->NRROUTE[0].ROUT_OBSCOUNT >= 128) // Not if locked if (Dest->NRROUTE[0].ROUT_OBSCOUNT >= 128) // Not if locked
continue; continue;
Call2[ConvFromAX25(Dest->DEST_CALL, Call2)] = 0; if (Dest->ROUTE[0].ROUT_NEIGHBOUR == Route)
if (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == Route)
{ {
// We are deleting the best INP3 route, so need to tell other nodes // We are deleting the best route, so need to tell other nodes
// If this is the only one, we need to keep the entry with at 60000 rtt so // If this is the only one, we need to keep the entry with at 60000 rtt so
// we can send it. Remove when all gone // we can send it. Remove when all gone
// How do we indicate is is dead - Maybe the 60000 is enough! // How do we indicate is is dead - Maybe the 60000 is enough!
if (Dest->ROUTE[1].ROUT_NEIGHBOUR == 0)
// If we are cleaning up after a sabm on an existing link (frmr or other end reloaded) then we don't need to tell anyone - the routes should be reestablished very quickly
Debugprintf("Deleting First INP3 Route to %s", Call2);
if (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR == 0)
{ {
// Only entry // Only entry
Dest->INP3ROUTE[0].SRTT = 60000; Dest->ROUTE[0].SRTT = 60000;
Dest->INP3ROUTE[0].Hops = 255; Dest->ROUTE[0].Hops = 255;
Debugprintf("Was the only INP3 route");
if (Dest->DEST_ROUTE == 4) // we were using it
Dest->DEST_ROUTE = 0;
continue; continue;
} }
Dest->INP3ROUTE[1].LastRTT = Dest->INP3ROUTE[0].SRTT; // So next scan will check if rtt has increaced enough to need a RIF Dest->ROUTE[1].LastRTT = Dest->ROUTE[0].SRTT; // So next scan will check if rtt has increaced
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY)); // enough to need a RIF
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[2], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY)); memcpy(&Dest->ROUTE[0], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->ROUTE[1], &Dest->ROUTE[2], sizeof(struct DEST_ROUTE_ENTRY));
memset(&Dest->ROUTE[2], 0, sizeof(struct DEST_ROUTE_ENTRY));
continue; continue;
} }
// If we aren't removing the best, we don't need to tell anyone. // If we aren't removing the best, we don't need to tell anyone.
if (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR == Route) if (Dest->ROUTE[1].ROUT_NEIGHBOUR == Route)
{ {
Debugprintf("Deleting 2nd INP3 Route to %s", Call2); memcpy(&Dest->ROUTE[1], &Dest->ROUTE[2], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[2], sizeof(struct INP3_DEST_ROUTE_ENTRY)); memset(&Dest->ROUTE[2], 0, sizeof(struct DEST_ROUTE_ENTRY));
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY));
continue; continue;
} }
if (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR == Route) if (Dest->ROUTE[2].ROUT_NEIGHBOUR == Route)
{ {
Debugprintf("Deleting 3rd INP3 Route to %s", Call2); memset(&Dest->ROUTE[2], 0, sizeof(struct DEST_ROUTE_ENTRY));
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY));
continue; continue;
} }
} }
// I think we should send Negative info immediately
SendNegativeInfo();
} }
VOID DecayNETROMRoutes(struct ROUTE * Route) VOID DecayNETROMRoutes(struct ROUTE * Route)
@ -259,7 +233,7 @@ VOID DecayNETROMRoutes(struct ROUTE * Route)
if (Dest->NRROUTE[1].ROUT_NEIGHBOUR == 0) // No more Netrom Routes if (Dest->NRROUTE[1].ROUT_NEIGHBOUR == 0) // No more Netrom Routes
{ {
if (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) // Any INP3 ROutes? if (Dest->ROUTE[0].ROUT_NEIGHBOUR == 0) // Any INP3 ROutes?
{ {
// No More Routes - ZAP Dest // No More Routes - ZAP Dest
@ -332,9 +306,19 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
int RTT; int RTT;
unsigned int OrigTime; unsigned int OrigTime;
char Normcall[10]; if ((Route->Status & GotRTTResponse) == 0)
{
// Link is just starting
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0; Route->Status |= GotRTTResponse;
if (Route->Status & GotRTTRequest)
{
Route->Status |= SentOurRIF;
SendOurRIF(Route);
SendRIPToNeighbour(Route);
}
}
Route->Timeout = 0; // Got Response Route->Timeout = 0; // Got Response
@ -350,16 +334,6 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
Route->SRTT = RTT; Route->SRTT = RTT;
else else
Route->SRTT = ((Route->SRTT * 80)/100) + ((RTT * 20)/100); Route->SRTT = ((Route->SRTT * 80)/100) + ((RTT * 20)/100);
if ((Route->Status & GotRTTResponse) == 0)
{
// Link is just starting
Debugprintf("INP3 got first RTT reply from %s - Link is (Re)staring", Normcall);
Route->Status |= GotRTTResponse;
}
} }
VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port) VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
@ -371,13 +345,6 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
int opcode; int opcode;
char alias[6]; char alias[6];
UINT Stamp, HH, MM; UINT Stamp, HH, MM;
char Normcall[10];
Normcall[ConvFromAX25(Route->NEIGHBOUR_LINK->LINKCALL, Normcall)] = 0;
Debugprintf("Processing RIF from %s INP3Node %d Route SRTT %d", Normcall, Route->INP3Node, Route->SRTT);
if (Route->SRTT == 0)
Debugprintf("INP3 Zero SRTT");
#ifdef NOINP3 #ifdef NOINP3
@ -419,9 +386,10 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
rtt = (*ptr1++ << 8); rtt = (*ptr1++ << 8);
rtt += *ptr1++; rtt += *ptr1++;
// rtt is value from remote node. Add our RTT to that node // rtt is value from remote node. Add our RTT to that node and update hops
rtt += Route->SRTT; rtt += Route->SRTT;
hops++;
msglen -= 10; msglen -= 10;
@ -456,7 +424,7 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
return; return;
} }
VOID KillRoute(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR) VOID KillRoute(struct DEST_ROUTE_ENTRY * ROUTEPTR)
{ {
} }
@ -464,58 +432,21 @@ VOID KillRoute(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR)
VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops, int rtt) VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops, int rtt)
{ {
struct DEST_LIST * Dest; struct DEST_LIST * Dest;
struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR; struct DEST_ROUTE_ENTRY * ROUTEPTR;
int i; int i;
char call[11]=""; char call[11]="";
APPLCALLS * APPL;
int App;
char Normcall[10];
Normcall[ConvFromAX25(axcall, Normcall)] = 0;
// SEE IF any of OUR CALLs - DONT WANT TO PUT IT IN LIST!
if (CompareCalls(axcall, NETROMCALL))
{
Debugprintf("INP3 for our Nodecall - discarding");
return;
}
if (CheckExcludeList(axcall) == 0)
{
Debugprintf("INP3 excluded - discarding");
return;
}
for (App = 0; App < NumberofAppls; App++)
{
APPL=&APPLCALLTABLE[App];
if (APPL->APPLHASALIAS == 0 && CompareCalls(axcall, APPL->APPLCALL))
{
Debugprintf("INP3 for an APPLCALL - discarding");
return;
}
}
if (hops > MaxHops && hops < 255) if (hops > MaxHops && hops < 255)
{ {
ConvFromAX25(axcall, call); // ConvFromAX25(axcall, call);
Debugprintf("INP3 Node %s Hops %d RTT %d Ignored - Hop Count too high", call, hops, rtt); // Debugprintf("Node %s Hops %d RTT %d Ignored - Hop Count too high", call, hops, rtt);
return; return;
} }
if (rtt > MAXRTT && rtt < 60000) if (rtt > MAXRTT && rtt < 60000)
{ {
ConvFromAX25(axcall, call); // ConvFromAX25(axcall, call);
Debugprintf("INP3 Node %s Hops %d RTT %d Ignored - rtt too high", call, hops, rtt); // Debugprintf("Node %s Hops %d RTT %d Ignored - rtt too high", call, hops, rtt);
return;
}
if (rtt >= 60000)
{
Debugprintf("INP3 RTT > 60000 - discarding");
return; return;
} }
@ -523,12 +454,10 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
goto Found; goto Found;
if (Dest == NULL) if (Dest == NULL)
{ return; // Tsble Full
Debugprintf("INP3 Table Full - discarding");
return; // Table Full
}
if (rtt >= 60000)
return; // No Point addind a new dead route
memset(Dest, 0, sizeof(struct DEST_LIST)); memset(Dest, 0, sizeof(struct DEST_LIST));
@ -537,63 +466,58 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
// Set up First Route // Set up First Route
Dest->INP3ROUTE[0].Hops = hops; Dest->ROUTE[0].Hops = hops;
Dest->INP3ROUTE[0].SRTT = rtt; Dest->ROUTE[0].SRTT = rtt;
Dest->INP3ROUTE[0].LastRTT = 0; Dest->ROUTE[0].LastRTT = 0;
Dest->INP3FLAGS = NewNode; Dest->INP3FLAGS = NewNode;
Dest->INP3ROUTE[0].ROUT_NEIGHBOUR = Route; Dest->ROUTE[0].ROUT_NEIGHBOUR = Route;
NUMBEROFNODES++; NUMBEROFNODES++;
ConvFromAX25(Dest->DEST_CALL, call); ConvFromAX25(Dest->DEST_CALL, call);
Debugprintf("INP3 Adding New Node %s Hops %d RTT %d", call, hops, rtt); Debugprintf("Adding Node %s Hops %d RTT %d", call, hops, rtt);
return; return;
Found: Found:
if (Dest->DEST_STATE & 0x80) // Application Entry if (Dest->DEST_STATE & 0x80) // Application Entry
{ return;
Debugprintf("INP3 Application Entry - discarding");
return; // Tsble Full
}
// Update ALIAS // Update ALIAS
ConvFromAX25(Dest->DEST_CALL, call);
Debugprintf("INP3 Updating Node %s Hops %d RTT %d", call, hops, rtt);
if (alias[0] > ' ') if (alias[0] > ' ')
memcpy(Dest->DEST_ALIAS, alias, 6); memcpy(Dest->DEST_ALIAS, alias, 6);
// See if we are known to it, it not add // See if we are known to it, it not add
ROUTEPTR = &Dest->INP3ROUTE[0]; ROUTEPTR = &Dest->ROUTE[0];
if (rtt >= 60000)
{
i=rtt+1;
}
if (ROUTEPTR->ROUT_NEIGHBOUR == Route) if (ROUTEPTR->ROUT_NEIGHBOUR == Route)
{ {
Debugprintf("INP3 Already have as route[0] - updating");
UpdateRoute(Dest, ROUTEPTR, hops, rtt); UpdateRoute(Dest, ROUTEPTR, hops, rtt);
return; return;
} }
ROUTEPTR = &Dest->INP3ROUTE[1]; ROUTEPTR = &Dest->ROUTE[1];
if (ROUTEPTR->ROUT_NEIGHBOUR == Route) if (ROUTEPTR->ROUT_NEIGHBOUR == Route)
{ {
Debugprintf("INP3 Already have as route[1] - updating");
UpdateRoute(Dest, ROUTEPTR, hops, rtt); UpdateRoute(Dest, ROUTEPTR, hops, rtt);
return; return;
} }
ROUTEPTR = &Dest->INP3ROUTE[2]; ROUTEPTR = &Dest->ROUTE[2];
if (ROUTEPTR->ROUT_NEIGHBOUR == Route) if (ROUTEPTR->ROUT_NEIGHBOUR == Route)
{ {
Debugprintf("INP3 Already have as route[2] - updating");
UpdateRoute(Dest, ROUTEPTR, hops, rtt); UpdateRoute(Dest, ROUTEPTR, hops, rtt);
return; return;
} }
@ -601,68 +525,64 @@ Found:
// Not in list. If any spare, add. // Not in list. If any spare, add.
// If full, see if this is better // If full, see if this is better
for (i = 0; i < 3; i++) if (rtt >= 60000)
{ return; // No Point addind a new dead route
ROUTEPTR = &Dest->INP3ROUTE[i];
ROUTEPTR = &Dest->ROUTE[0];
for (i = 1; i < 4; i++)
{
if (ROUTEPTR->ROUT_NEIGHBOUR == NULL) if (ROUTEPTR->ROUT_NEIGHBOUR == NULL)
{ {
// Add here // Add here
Debugprintf("INP3 adding as route[%d]", i); Dest->ROUTE[0].Hops = hops;
AddHere(ROUTEPTR, Route, hops, rtt); Dest->ROUTE[0].SRTT = rtt;
SortRoutes(Dest); Dest->ROUTE[0].ROUT_NEIGHBOUR = Route;
return; return;
} }
ROUTEPTR++; ROUTEPTR++;
} }
Debugprintf("INP3 All entries in use - see if this is better than existing");
// Full, see if this is better // Full, see if this is better
// Note that wont replace any netrom routes with INP3 ones unless we add pseudo rtt values to netrom entries // Note that wont replace any netrom routes with INP3 ones unless we add pseudo rtt values to netrom entries
if (Dest->INP3ROUTE[0].SRTT > rtt) if (Dest->ROUTE[0].SRTT > rtt)
{ {
// We are better. Move others down and add on front // We are better. Move others down and add on front
Debugprintf("INP3 Replacing route 0"); memcpy(&Dest->ROUTE[2], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->ROUTE[1], &Dest->ROUTE[0], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[2], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY)); AddHere(&Dest->ROUTE[0], Route, hops, rtt);
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY));
AddHere(&Dest->INP3ROUTE[0], Route, hops, rtt);
return; return;
} }
if (Dest->INP3ROUTE[1].SRTT > rtt) if (Dest->ROUTE[1].SRTT > rtt)
{ {
// We are better. Move 2nd down and add // We are better. Move 2nd down and add
Debugprintf("INP3 Replacing route 1"); memcpy(&Dest->ROUTE[2], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[2], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
AddHere(&Dest->INP3ROUTE[1], Route, hops, rtt); AddHere(&Dest->ROUTE[1], Route, hops, rtt);
return; return;
} }
if (Dest->INP3ROUTE[2].SRTT > rtt) if (Dest->ROUTE[2].SRTT > rtt)
{ {
// We are better. Add here // We are better. Add here
Debugprintf("INP3 Replacing route 2"); AddHere(&Dest->ROUTE[2], Route, hops, rtt);
AddHere(&Dest->INP3ROUTE[2], Route, hops, rtt);
return; return;
} }
// Worse than any - ignoee
Debugprintf("INP3 Worse that any existing route");
// Worse than any - ignore
} }
VOID AddHere(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt) VOID AddHere(struct DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt)
{ {
ROUTEPTR->Hops = hops; ROUTEPTR->Hops = hops;
ROUTEPTR->SRTT = rtt; ROUTEPTR->SRTT = rtt;
@ -723,122 +643,38 @@ NOTBADROUTE:
JMP SENDOK JMP SENDOK
*/ */
struct INP3_DEST_ROUTE_ENTRY Temp;
VOID SortRoutes(struct DEST_LIST * Dest) VOID SortRoutes(struct DEST_LIST * Dest)
{ {
char Call1[10], Call2[10], Call3[10]; struct DEST_ROUTE_ENTRY Temp;
// May now be out of order // May now be out of order
if (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR == 0) if (Dest->ROUTE[1].ROUT_NEIGHBOUR == 0)
{
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Debugprintf("INP3 1 route %d %s", Dest->INP3ROUTE[0].SRTT, Call1);
return; // Only One, so cant be out of order return; // Only One, so cant be out of order
}
if (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR == 0) if (Dest->ROUTE[2].ROUT_NEIGHBOUR == 0)
{ {
// Only 2 // Only 2
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0; if (Dest->ROUTE[0].SRTT <= Dest->ROUTE[1].SRTT)
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Debugprintf("INP3 2 routes %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2);
if (Dest->INP3ROUTE[0].SRTT <= Dest->INP3ROUTE[1].SRTT)
return; return;
// Swap one and two // Swap one and two
memcpy(&Temp, &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY)); memcpy(&Temp, &Dest->ROUTE[0], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY)); memcpy(&Dest->ROUTE[0], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Temp, sizeof(struct INP3_DEST_ROUTE_ENTRY)); memcpy(&Dest->ROUTE[1], &Temp, sizeof(struct DEST_ROUTE_ENTRY));
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Debugprintf("INP3 2 routes %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2);
return; return;
} }
// Have 3 Entries // Have 3 Entries
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Call3[ConvFromAX25(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call3)] = 0;
Debugprintf("INP3 3 routes %d %s %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2, Dest->INP3ROUTE[2].SRTT, Call3);
// In order?
if (Dest->INP3ROUTE[0].SRTT <= Dest->INP3ROUTE[1].SRTT && Dest->INP3ROUTE[1].SRTT <= Dest->INP3ROUTE[2].SRTT)// In order?
return;
// If second is better that first swap
if (Dest->INP3ROUTE[0].SRTT > Dest->INP3ROUTE[1].SRTT)
{
memcpy(&Temp, &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Temp, sizeof(struct INP3_DEST_ROUTE_ENTRY));
}
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Call3[ConvFromAX25(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call3)] = 0;
Debugprintf("INP3 3 routes %d %s %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2, Dest->INP3ROUTE[2].SRTT, Call3);
// if 3 is better than 2 swap them. As two is worse than one. three will then be worst
if (Dest->INP3ROUTE[1].SRTT > Dest->INP3ROUTE[2].SRTT)
{
memcpy(&Temp, &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[2], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[2], &Temp, sizeof(struct INP3_DEST_ROUTE_ENTRY));
}
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Call3[ConvFromAX25(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call3)] = 0;
Debugprintf("INP3 3 routes %d %s %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2, Dest->INP3ROUTE[2].SRTT, Call3);
// 3 is now slowest. 2 could still be better than 1
if (Dest->INP3ROUTE[0].SRTT > Dest->INP3ROUTE[1].SRTT)
{
memcpy(&Temp, &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Temp, sizeof(struct INP3_DEST_ROUTE_ENTRY));
}
Call1[ConvFromAX25(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call1)] = 0;
Call2[ConvFromAX25(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call2)] = 0;
Call3[ConvFromAX25(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Call3)] = 0;
Debugprintf("INP3 3 routes %d %s %d %s %d %s", Dest->INP3ROUTE[0].SRTT, Call1, Dest->INP3ROUTE[1].SRTT, Call2, Dest->INP3ROUTE[2].SRTT, Call3);
if (Dest->INP3ROUTE[0].SRTT <= Dest->INP3ROUTE[1].SRTT && Dest->INP3ROUTE[1].SRTT <= Dest->INP3ROUTE[2].SRTT)// In order?
return;
// Something went wrong
Debugprintf("INP3 Sort Failed");
} }
VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt) VOID UpdateRoute(struct DEST_LIST * Dest, struct DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt)
{ {
if (ROUTEPTR->Hops == 0) if (ROUTEPTR->Hops == 0)
{ {
@ -870,28 +706,20 @@ VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPT
VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len, int Port) VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len, int Port)
{ {
int OtherRTT;
int Dummy;
char Normcall[10];
Normcall[ConvFromAX25(Route->NEIGHBOUR_LINK->LINKCALL, Normcall)] = 0;
// See if a reply to our message, or a new request // See if a reply to our message, or a new request
if (memcmp(Buff->L3SRCE, MYCALL,7) == 0) if (memcmp(Buff->L3SRCE, MYCALL,7) == 0)
{ {
ProcessRTTReply(Route, Buff); ProcessRTTReply(Route, Buff);
ReleaseBuffer(Buff); ReleaseBuffer(Buff);
return;
} }
else
if (Route->NEIGHBOUR_LINK->LINKPORT->ALLOWINP3) {
Route->INP3Node = 1; int OtherRTT;
int Dummy;
if (Route->INP3Node == 0) if (Route->INP3Node == 0)
{ {
Debugprintf("Ignoring RTT Msg from %s - not using INP3", Normcall);
ReleaseBuffer(Buff); ReleaseBuffer(Buff);
return; // We don't want to use INP3 return; // We don't want to use INP3
} }
@ -909,31 +737,29 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
{ {
// Link is just starting // Link is just starting
Debugprintf("INP3 Processing first RTT frame from %s - link is (re)starting", Normcall);
Route->Status |= GotRTTRequest; Route->Status |= GotRTTRequest;
// I don't think we should send RIF until we get an RTT response. if (Route->Status & GotRTTResponse)
{
if ((Route->Status & SentRTTRequest) == 0) // Not sent one yet so send it
SendRTTMsg(Route);
// No, it's the other end that must have an rrt response and we've just sent it
Route->Status |= SentOurRIF; Route->Status |= SentOurRIF;
SendOurRIF(Route); SendOurRIF(Route);
SendRIPToNeighbour(Route); SendRIPToNeighbour(Route);
} }
} else
{
// We have not yet seen a response (and maybe haven't sent one
Route->BCTimer = 0; // So send one
}
}
}
}
VOID SendRTTMsg(struct ROUTE * Route) VOID SendRTTMsg(struct ROUTE * Route)
{ {
struct _L3MESSAGEBUFFER * Msg; struct _L3MESSAGEBUFFER * Msg;
char Stamp[50]; char Stamp[50];
char Normcall[10];
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
Msg = GetBuff(); Msg = GetBuff();
if (Msg == 0) if (Msg == 0)
@ -962,14 +788,6 @@ VOID SendRTTMsg(struct ROUTE * Route)
Route->Timeout = RTTTimeout; Route->Timeout = RTTTimeout;
SendNetFrame(Route, Msg); SendNetFrame(Route, Msg);
if (Route->Status & SentRTTRequest)
return;
Route->Status |= SentRTTRequest;
Debugprintf("INP3 Sending first RTT Msg to %s", Normcall);
} }
VOID SendKeepAlive(struct ROUTE * Route) VOID SendKeepAlive(struct ROUTE * Route)
@ -1003,9 +821,7 @@ int BuildRIF(UCHAR * RIF, UCHAR * Call, UCHAR * Alias, int Hops, int RTT)
int RIFLen; int RIFLen;
UCHAR AliasCopy[10] = ""; UCHAR AliasCopy[10] = "";
UCHAR * ptr; UCHAR * ptr;
char Normcall[10];
Normcall[ConvFromAX25(Call, Normcall)] = 0;
if (RTT > 60000) RTT = 60000; // Dont send more than 60000 if (RTT > 60000) RTT = 60000; // Dont send more than 60000
@ -1032,13 +848,10 @@ int BuildRIF(UCHAR * RIF, UCHAR * Call, UCHAR * Alias, int Hops, int RTT)
RIF[12+AliasLen] = 0; RIF[12+AliasLen] = 0;
RIFLen = 13 + AliasLen; RIFLen = 13 + AliasLen;
Debugprintf("INP3 sending RIF Entry %s:%s %d %d", AliasCopy, Normcall, Hops, RTT);
return RIFLen; return RIFLen;
} }
RIF[10] = 0; RIF[10] = 0;
Debugprintf("INP3 sending RIF Entry %s %d %d", Normcall, Hops, RTT);
return (11); return (11);
} }
@ -1050,17 +863,11 @@ VOID SendOurRIF(struct ROUTE * Route)
int totLen = 1; int totLen = 1;
int App; int App;
APPLCALLS * APPL; APPLCALLS * APPL;
char Normcall[10];
Msg = GetBuff(); Msg = GetBuff();
if (Msg == 0) if (Msg == 0)
return; return;
Normcall[ConvFromAX25(Route->NEIGHBOUR_LINK->LINKCALL, Normcall)] = 0;
Debugprintf("INP3 Sending Initial RIF to %s ", Normcall);
Msg->L3SRCE[0] = 0xff; Msg->L3SRCE[0] = 0xff;
// send a RIF for our Node and all our APPLCalls // send a RIF for our Node and all our APPLCalls
@ -1091,8 +898,6 @@ int SendRIPTimer()
struct ROUTE * Route = NEIGHBOURS; struct ROUTE * Route = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int INP3Delay; int INP3Delay;
char Normcall[10];
for (count=0; count<MaxRoutes; count++) for (count=0; count<MaxRoutes; count++)
{ {
@ -1127,7 +932,7 @@ int SendRIPTimer()
// Delay more if Locked - they could be retrying for a long time // Delay more if Locked - they could be retrying for a long time
if ((Route->NEIGHBOUR_FLAG)) // LOCKED ROUTE if ((Route->NEIGHBOUR_FLAG & 1)) // LOCKED ROUTE
INP3Delay = 1200; INP3Delay = 1200;
else else
INP3Delay = 600; INP3Delay = 600;
@ -1141,12 +946,6 @@ int SendRIPTimer()
// Try to activate link // Try to activate link
if (Route->INP3Node)
{
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Activating link to %s", Normcall);
}
L2SETUPCROSSLINKEX(Route, 2); // Only try SABM twice L2SETUPCROSSLINKEX(Route, 2); // Only try SABM twice
Route->LastConnectAttempt = REALTIMETICKS; Route->LastConnectAttempt = REALTIMETICKS;
@ -1208,7 +1007,7 @@ int SendRIPTimer()
char Call [11] = ""; char Call [11] = "";
ConvFromAX25(Route->NEIGHBOUR_CALL, Call); ConvFromAX25(Route->NEIGHBOUR_CALL, Call);
Debugprintf("BPQ32 INP3 Neighbour %s Lost", Call); Debugprintf("BPQ32 INP Neighbour %s Lost", Call);
Route->Status = 0; // Down Route->Status = 0; // Down
} }
@ -1243,39 +1042,27 @@ struct _L3MESSAGEBUFFER * CreateRIFHeader(struct ROUTE * Route)
struct _L3MESSAGEBUFFER * Msg = GetBuff(); struct _L3MESSAGEBUFFER * Msg = GetBuff();
UCHAR AliasCopy[10] = ""; UCHAR AliasCopy[10] = "";
if (Msg)
{
Msg->LENGTH = 1; Msg->LENGTH = 1;
Msg->L3SRCE[0] = 0xff; Msg->L3SRCE[0] = 0xff;
Msg->L3PID = NRPID; Msg->L3PID = NRPID;
}
return Msg; return Msg;
} }
VOID SendRIF(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Msg) VOID SendRIF(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Msg)
{ {
char Normcall[10];
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
Msg->LENGTH += MSGHDDRLEN + 1; // PID Msg->LENGTH += MSGHDDRLEN + 1; // PID
Debugprintf("Sending INP3 RIF length %d to %s", Msg->LENGTH, Normcall);
SendNetFrame(Route, Msg); SendNetFrame(Route, Msg);
} }
VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_ROUTE_ENTRY * Entry) VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct DEST_ROUTE_ENTRY * Entry)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
struct _L3MESSAGEBUFFER * Msg; struct _L3MESSAGEBUFFER * Msg;
int count, MaxRoutes = MAXNEIGHBOURS; int count, MaxRoutes = MAXNEIGHBOURS;
char Normcall[10];
Normcall[ConvFromAX25(axcall, Normcall)] = 0;
Debugprintf("INP3 SendRIPToOtherNeighbours for %s", Normcall);
for (count=0; count<MaxRoutes; count++) for (count=0; count<MaxRoutes; count++)
{ {
@ -1286,14 +1073,7 @@ VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_RO
Msg = Routes->Msg; Msg = Routes->Msg;
if (Msg == NULL) if (Msg == NULL)
{
Normcall[ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Building RIF to send to %s", Normcall);
Msg = Routes->Msg = CreateRIFHeader(Routes); Msg = Routes->Msg = CreateRIFHeader(Routes);
}
if (Msg)
{
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH],
axcall, alias, Entry->Hops + 1, Entry->SRTT + Entry->ROUT_NEIGHBOUR->SRTT/10); axcall, alias, Entry->Hops + 1, Entry->SRTT + Entry->ROUT_NEIGHBOUR->SRTT/10);
@ -1305,7 +1085,6 @@ VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_RO
Routes->Msg = NULL; Routes->Msg = NULL;
} }
} }
}
Routes+=1; Routes+=1;
} }
} }
@ -1314,14 +1093,9 @@ VOID SendRIPToNeighbour(struct ROUTE * Route)
{ {
int i; int i;
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry; struct DEST_ROUTE_ENTRY * Entry;
struct _L3MESSAGEBUFFER * Msg; struct _L3MESSAGEBUFFER * Msg;
char Normcall[10];
Normcall[ConvFromAX25(Route->NEIGHBOUR_LINK->LINKCALL, Normcall)] = 0;
Debugprintf("INP3 Sending Our Table to %s ", Normcall);
Dest--; Dest--;
// Send all entries not via this Neighbour - used when link starts // Send all entries not via this Neighbour - used when link starts
@ -1330,7 +1104,7 @@ VOID SendRIPToNeighbour(struct ROUTE * Route)
{ {
Dest++; Dest++;
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->ROUTE[0];
if (Entry->ROUT_NEIGHBOUR && Entry->Hops && Route != Entry->ROUT_NEIGHBOUR) if (Entry->ROUT_NEIGHBOUR && Entry->Hops && Route != Entry->ROUT_NEIGHBOUR)
{ {
@ -1368,12 +1142,8 @@ VOID FlushRIFs()
{ {
if (Routes->Msg) if (Routes->Msg)
{ {
char Normcall[10];
Normcall[ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall)] = 0;
SendRIF(Routes, Routes->Msg); SendRIF(Routes, Routes->Msg);
Routes->Msg = NULL; Routes->Msg = NULL;
Debugprintf("INP3 Flushing RIF to %s", Normcall);
} }
Routes+=1; Routes+=1;
} }
@ -1383,7 +1153,7 @@ VOID SendNegativeInfo()
{ {
int i, Preload; int i, Preload;
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry; struct DEST_ROUTE_ENTRY * Entry;
Dest--; Dest--;
@ -1399,7 +1169,7 @@ VOID SendNegativeInfo()
{ {
Dest++; Dest++;
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->ROUTE[0];
if (Entry->SRTT > Entry->LastRTT) if (Entry->SRTT > Entry->LastRTT)
{ {
@ -1424,19 +1194,15 @@ VOID SendNegativeInfo()
{ {
char call[11]=""; char call[11]="";
ConvFromAX25(Dest->DEST_CALL, call); ConvFromAX25(Dest->DEST_CALL, call);
Debugprintf("INP3 Deleting Node %s", call); Debugprintf("Deleting Node %s", call);
REMOVENODE(Dest); // Clear buffers, Remove from Sorted Nodes chain, and zap entry REMOVENODE(Dest); // Clear buffers, Remove from Sorted Nodes chain, and zap entry
} }
else else
{ {
// Have a NETROM route, so zap the INP3 one // Have a NETROM route, so zap the INP3 one
memset(Entry, 0, sizeof(struct INP3_DEST_ROUTE_ENTRY)); memset(Entry, 0, sizeof(struct DEST_ROUTE_ENTRY));
} }
if (Dest->DEST_ROUTE == 4) // we were using it
Dest->DEST_ROUTE = 0;
} }
} }
} }
@ -1445,7 +1211,7 @@ VOID SendPositiveInfo()
{ {
int i; int i;
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry; struct DEST_ROUTE_ENTRY * Entry;
Dest--; Dest--;
@ -1455,14 +1221,14 @@ VOID SendPositiveInfo()
{ {
Dest++; Dest++;
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->ROUTE[0];
if (( (Entry->SRTT) && (Entry->LastRTT == 0) )|| // if zero haven't yet reported +ve info if (( (Entry->SRTT) && (Entry->LastRTT == 0) )|| // if zero haven't yet reported +ve info
((((Entry->SRTT * 125) /100) < Entry->LastRTT) && // Better by 25% ((((Entry->SRTT * 125) /100) < Entry->LastRTT) && // Better by 25%
((Entry->LastRTT - Entry->SRTT) > 10))) // and 100ms ((Entry->LastRTT - Entry->SRTT) > 10))) // and 100ms
{ {
SendRIPToOtherNeighbours(Dest->DEST_CALL, 0, Entry); SendRIPToOtherNeighbours(Dest->DEST_CALL, 0, Entry);
Dest->INP3ROUTE[0].LastRTT = (Dest->INP3ROUTE[0].SRTT * 11) / 10; //10% Negative Preload Dest->ROUTE[0].LastRTT = (Dest->ROUTE[0].SRTT * 11) / 10; //10% Negative Preload
} }
} }
} }
@ -1472,7 +1238,7 @@ VOID SendNewInfo()
int i; int i;
unsigned int NewRTT; unsigned int NewRTT;
struct DEST_LIST * Dest = DESTS; struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry; struct DEST_ROUTE_ENTRY * Entry;
Dest--; Dest--;
@ -1486,7 +1252,7 @@ VOID SendNewInfo()
{ {
Dest->INP3FLAGS &= ~NewNode; Dest->INP3FLAGS &= ~NewNode;
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->ROUTE[0];
SendRIPToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry); SendRIPToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry);
@ -1602,6 +1368,14 @@ UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen)
{ {
memcpy(IP, ptr1+2, len-2); memcpy(IP, ptr1+2, len-2);
} }
ptr1+=len;
msglen -=len;
}
if (IP[0])
ptr2+=sprintf(ptr2, " %s:%s %d %4.2d %d.%d.%d.%d\r", alias, call, hops, rtt, IP[0], IP[1], IP[2], IP[3]);
else
ptr2+=sprintf(ptr2, " %s:%s %d %4.2d\r", alias, call, hops, rtt); ptr2+=sprintf(ptr2, " %s:%s %d %4.2d\r", alias, call, hops, rtt);
ptr1++; ptr1++;
@ -1610,26 +1384,4 @@ UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen)
return ptr2; return ptr2;
} }
return ptr2;
}
// Paula's conversion of rtt to Quality
int inp3_tt2qual (int tt, int hops)
{
int qual;
if (tt >= 60000 || hops > 30)
return(0);
qual = 254 - (tt/20);
if (qual > 254 - hops)
qual = 254 - hops;
if (qual < 0)
qual=0;
return(qual);
}

Binary file not shown.

View File

@ -1147,12 +1147,6 @@
// Send forwarding info to packetnodes.spots.radio database (51) // Send forwarding info to packetnodes.spots.radio database (51)
// Fix bug in WP Message processing (56) // Fix bug in WP Message processing (56)
// Fix treating addresses ending in WW as Internet (57) // Fix treating addresses ending in WW as Internet (57)
// Run sending to packetnodes.spots.radio in a separate thread (61)
// Fix loading ISP Account Name from config file (67)
// Fixes to using {FormFolder} in Webmail Templates (68)
// Save FBB transfer restart data over program restarts (69)
// Add Send and Receive byte counts to status displays (69)
// Validate Mode and Frequency and fix formatting in Connected Message (71)
#include "bpqmail.h" #include "bpqmail.h"
#include "winstdint.h" #include "winstdint.h"
@ -1729,7 +1723,6 @@ int APIENTRY WinMain(HINSTANCE hInstance,
// SaveUserDatabase(); // SaveUserDatabase();
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveRestartData();
configSaved = 1; configSaved = 1;
SaveConfig(ConfigName); SaveConfig(ConfigName);
@ -3026,9 +3019,9 @@ int RefreshMainWindow()
strcpy(msg,"Logging in"); strcpy(msg,"Logging in");
else else
{ {
i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d %5d %5d", i=sprintf_s(msg, sizeof(msg), "%-10s %-10s %2d %-10s%5d",
conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream, conn->UserPointer->Name, conn->UserPointer->Call, conn->BPQStream,
"BBS", conn->OutputQueueLength - conn->OutputGetPointer, conn->bytesSent, conn->bytesRxed); "BBS", conn->OutputQueueLength - conn->OutputGetPointer);
} }
} }
} }
@ -3089,7 +3082,6 @@ static PSOCKADDR_IN psin;
SOCKET sock; SOCKET sock;
void GetRestartData();
BOOL Initialise() BOOL Initialise()
{ {
@ -3277,8 +3269,6 @@ BOOL Initialise()
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetRestartData();
UsingingRegConfig = FALSE; UsingingRegConfig = FALSE;
// Make sure SYSOPCALL is set // Make sure SYSOPCALL is set

1090
BPQMail.rc

File diff suppressed because it is too large Load Diff

12
BPQRemotePTT.cfg Normal file
View File

@ -0,0 +1,12 @@
main :
{
BPQHostIP = "192.168.1.64";
COM1 = "COM43";
COM2 = "";
COM3 = "";
COM4 = "";
HamLibPort1 = 4534;
HamLibPort2 = 0;
HamLibPort3 = 0;
HamLibPort4 = 0;
};

6741
Bpq32-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

46
Bpq32.c
View File

@ -1243,30 +1243,12 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix MailAPI msgs endpoint // Fix MailAPI msgs endpoint
// Attempt to fix NC going to wrong application. (57) // Attempt to fix NC going to wrong application. (57)
// Improve ARDOP end of session code (58) // Improve ARDOP end of session code (58)
// Run M0LTE Map reporting in a separate thread (59/60) // Run M0LTE Map repoorting in a separate thread (59)
// Add RHP support for WhatsPac (59) // Add support fro WhatsPac (59)
// Add timestamps to LIS monitor (60) // Add timestamps to LIS monitor
// Fix problem with L4 frames being delivered out of sequence (60)
// Add Compression of Netrom connections (62)
// Improve handling of Locked Routes (62)
// Add L4 RESET (Paula G8PZT's extension to NETROM)
// Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65)
// Fix L4 RTT (66)
// Fix RigConrol with Chanxx but no other settings (66)
// Add option to compress L2 frames (67)
// Sort Routes displays (67)
// Fix Ardop session premature close (70)
// Add timestamps to log entries in Web Driver windows (70)
// Generate stack backtrace if SIGSEGV or SIGABRT occur (Linux) (70)
// Remove some debug logging from L2 code (70)
// Fix compiling LinBPQ with nomqtt option (70)
// Improve handling of binary data in RHP interface (70)
// Fix sending KISS commands to multiport or multidropped TNCs (70)
// Add MHUV and MHLV commands (Verbose listing with timestamps in clock time) (70)
// Improvements to INP3 (71)
// Improvements to KAM driver including support for GTOR connects (71)
#define CKernel #define CKernel
@ -2389,8 +2371,6 @@ FirstInit()
timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
OpenReportingSockets(); OpenReportingSockets();
@ -6132,14 +6112,13 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n", RegLine); len = sprintf(RegLine, "%s\\\r\n", RegLine);
strcat(RegLine, "\\\r\n");
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len += sprintf(&RegLine[len], "%02x,", Value[k]); len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;
RegLine[++len] = 0x0a; RegLine[++len] = 0x0a;
@ -6165,20 +6144,19 @@ DllExport BOOL APIENTRY SaveReg(char * KeyIn, HANDLE hFile)
{ {
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
len = 2; len = 2;
} }
len = sprintf(RegLine, "%s%02x,", RegLine, Value[k]);
len += sprintf(&RegLine[len], "%02x,", Value[k]);
if (len > 76) if (len > 76)
{ {
len += sprintf(&RegLine[len], "\\\r\n"); len = sprintf(RegLine, "%s\\\r\n", RegLine);
WriteFile(hFile, RegLine, len, &written, NULL); WriteFile(hFile, RegLine, len, &written, NULL);
strcpy(RegLine, " "); strcpy(RegLine, " ");
} }
len += sprintf(&RegLine[len], "00,"); len = sprintf(RegLine, "%s00,", RegLine);
} }
RegLine[--len] = 0x0d; RegLine[--len] = 0x0d;

View File

@ -23,6 +23,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#ifdef LINBPQ #ifdef LINBPQ
#include "compatbits.h" #include "compatbits.h"
char * strlop(char * buf, char delim);
#define APIENTRY #define APIENTRY
#define VOID void #define VOID void
@ -31,8 +32,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <windows.h> #include <windows.h>
#endif #endif
char * strlop(char * buf, char delim);
VOID APIENTRY md5 (char *arg, unsigned char * checksum); VOID APIENTRY md5 (char *arg, unsigned char * checksum);

317
Cmd.c
View File

@ -70,10 +70,6 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
VOID WriteMiniDump(); VOID WriteMiniDump();
int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive); int CheckKissInterlock(struct PORTCONTROL * PORT, int Exclusive);
int seeifInterlockneeded(struct PORTCONTROL * PORT); int seeifInterlockneeded(struct PORTCONTROL * PORT);
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b);
extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer); extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer);
@ -1229,57 +1225,15 @@ VOID CMDSTATS(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
BOOL FindLink(UCHAR * LinkCall, UCHAR * OurCall, int Port, struct _LINKTABLE ** REQLINK);
VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
// PROCESS 'LINKS' MESSAGE // PROCESS 'LINKS' MESSAGE
struct _LINKTABLE * LINK = LINKS; struct _LINKTABLE * LINK = LINKS;
int n = MAXLINKS; int n = MAXLINKS;
int len, Count; int len;
char Normcall[11] = ""; char Normcall[11] = "";
UCHAR DEST[7];
UCHAR ORIGIN[7];
int Port = 0;
char * ptr = 0, * Context;
ptr = strtok_s(CmdTail, " ", &Context);
if (ptr && _stricmp(ptr, "reset") == 0)
{
ptr = strtok_s(NULL, " ", &Context);
if (ptr)
ConvToAX25(ptr, DEST);
ptr = strtok_s(NULL, " ", &Context);
if (ptr)
ConvToAX25(ptr, ORIGIN);
ptr = strtok_s(NULL, " ", &Context);
if (ptr)
Port = atoi(ptr);
if (FindLink(DEST, ORIGIN, Port, &LINK))
{
InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE
LINK->L2RETRIES -= 1; // Just send one DISC
LINK->L2STATE = 4; // CLOSING
L2SENDCOMMAND(LINK, DISC | PFBIT);
Bufferptr = Cmdprintf(Session, Bufferptr, "Link Reset\r");
}
else
Bufferptr = Cmdprintf(Session, Bufferptr, "Link Not Found\r");
}
else
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Links\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Links\r");
while (n--) while (n--)
@ -1287,7 +1241,6 @@ VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
if (LINK->LINKCALL[0]) if (LINK->LINKCALL[0])
{ {
len = ConvFromAX25(LINK->LINKCALL, Normcall); len = ConvFromAX25(LINK->LINKCALL, Normcall);
Count = COUNT_AT_L2(LINK);
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall); Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
@ -1295,15 +1248,15 @@ VOID CMDL00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall); Bufferptr = Cmdprintf(Session, Bufferptr, "%s", Normcall);
if (LINK->Ver2point2) if (LINK->Ver2point2)
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=2.2 Q=%d\r", Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=2.2\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, Count); LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE);
else else
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d Q=%d\r", Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d\r",
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG, Count); LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG);
} }
LINK++; LINK++;
} }
}
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
@ -1563,7 +1516,7 @@ VOID CMDP00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose) char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE * Routes, char Verbose)
{ {
char Normcall[10]; char Normcall[10];
char locked[4] = " "; char locked[] = " ! ";
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
char PercentString[20]; char PercentString[20];
@ -1577,16 +1530,11 @@ char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE *
Normcall[9]=0; Normcall[9]=0;
if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG) if ((Routes->NEIGHBOUR_FLAG & 1) == 1)
strcpy(locked, "!"); strcpy(locked, "!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
strcpy(locked, " "); strcpy(locked, " ");
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5) if (Routes->NEIGHBOUR_LINK && Routes->NEIGHBOUR_LINK->L2STATE >= 5)
@ -1651,8 +1599,6 @@ VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
int Port = 0; int Port = 0;
char AXCALL[7]; char AXCALL[7];
BOOL Found; BOOL Found;
int count, i, n = 0;
struct ROUTE * List[1000];
ptr = strtok_s(CmdTail, " ", &Context); ptr = strtok_s(CmdTail, " ", &Context);
@ -1673,30 +1619,13 @@ VOID CMDR00(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct C
Bufferptr = Cmdprintf(Session, Bufferptr, "Routes\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Routes\r");
// Build and sort list of routes while (MaxRoutes--)
for (count = 0; count < MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{
List[n++] = Routes;
if (n > 999)
break;
}
Routes++;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
if (Port == 0 || Port == Routes->NEIGHBOUR_PORT) if (Port == 0 || Port == Routes->NEIGHBOUR_PORT)
Bufferptr = DisplayRoute(Session, Bufferptr, Routes, Verbose); Bufferptr = DisplayRoute(Session, Bufferptr, Routes, Verbose);
Routes++;
} }
goto SendReply; goto SendReply;
@ -1749,7 +1678,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
@ -1768,7 +1697,7 @@ ROUTEUPDATE:
{ {
// Toggle Lock // Toggle Lock
Routes->NEIGHBOUR_FLAG ^= LOCKEDBYSYSOP; // FLIP LOCKED BIT Routes->NEIGHBOUR_FLAG ^= 1; // FLIP LOCKED BIT
goto Displayit; goto Displayit;
} }
} }
@ -1782,6 +1711,167 @@ Displayit:
else else
Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Not Found\r");
/* MOV ROUTEDISP,1
CMP BYTE PTR [ESI],20H
JE SHORT JUSTDISPLAY
MOV ZAPFLAG,0
CMP BYTE PTR [ESI],'Z'
JNE SHORT NOTZAP
MOV ZAPFLAG,1
JMP SHORT JUSTDISPLAY
PUBLIC NOTZAP
NOTZAP:
MOV ROUTEDISP,2 ; LOCK UPDATE
CMP BYTE PTR [ESI],'!'
JE SHORT JUSTDISPLAY
;
; LOOK FOR V FOR ADDING A DIGI
;
CMP WORD PTR [ESI],' V' ; V [SPACE]
JE ADDDIGI
CALL GETVALUE ; GET NUMBER, UP TO SPACE , CR OR OFFH
JC SHORT BADROUTECMD ; INVALID DIGITS
MOV NEWROUTEVAL,AL
MOV ROUTEDISP,0
CALL SCAN ; SEE IF !
MOV AH,[ESI]
PUBLIC JUSTDISPLAY
JUSTDISPLAY:
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
JZ SHORT FOUNDROUTE ; IN LIST - OK
CMP EBX,0
JE SHORT BADROUTECMD ; TABLE FULL??
MOV ECX,7
MOV EDI,EBX
REP MOVSB ; PUT IN CALL
MOV AL,SAVEPORT
MOV NEIGHBOUR_PORT[EBX],AL
JMP SHORT FOUNDROUTE
PUBLIC BADROUTECMD
BADROUTECMD:
POP EDI
JMP PBADVALUE
PUBLIC FOUNDROUTE
FOUNDROUTE:
CMP ZAPFLAG,1
JNE SHORT NOTCLEARCOUNTS
XOR AX,AX
MOV ES:WORD PTR NBOUR_IFRAMES[EDI],AX
MOV ES:WORD PTR NBOUR_IFRAMES+2[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES[EDI],AX
MOV ES:WORD PTR NBOUR_RETRIES+2[EDI],AX
JMP SHORT NOUPDATE
PUBLIC NOTCLEARCOUNTS
NOTCLEARCOUNTS:
CMP ROUTEDISP,1
JE SHORT NOUPDATE
CMP ROUTEDISP,2
JE SHORT LOCKUPDATE
MOV AL,NEWROUTEVAL
MOV NEIGHBOUR_QUAL[EBX],AL
CMP AH,'!'
JNE SHORT NOUPDATE
PUBLIC LOCKUPDATE
LOCKUPDATE:
XOR NEIGHBOUR_FLAG[EBX],1 ; FLIP LOCKED BIT
PUBLIC NOUPDATE
NOUPDATE:
MOV ESI,EBX
POP EDI
POP EBX
CALL DISPLAYROUTE
JMP SENDCOMMANDREPLY
PUBLIC ADDDIGI
ADDDIGI:
ADD ESI,2
PUSH ESI ; SAVE INPUT BUFFER
MOV ESI,OFFSET32 AX25CALL
CALL _FINDNEIGHBOUR
POP ESI
JZ SHORT ADD_FOUND ; IN LIST - OK
JMP BADROUTECMD
PUBLIC ADD_FOUND
ADD_FOUND:
CALL CONVTOAX25 ; GET DIGI CALLSIGN
PUSH ESI
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI[EBX]
MOV ECX,7
REP MOVSB
POP ESI ; MSG BUFFER
;
; SEE IF ANOTHER DIGI
;
CMP BYTE PTR [ESI],20H
JE SHORT NOMORE
CALL CONVTOAX25 ; GET DIGI CALLSIGN
MOV ESI,OFFSET32 AX25CALL
LEA EDI,NEIGHBOUR_DIGI+7[EBX]
MOV ECX,7
REP MOVSB
PUBLIC NOMORE
NOMORE:
JMP NOUPDATE
*/
SendReply: SendReply:
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
@ -1799,7 +1889,6 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
char * ptr, *Context; char * ptr, *Context;
struct PORTCONTROL * PORT = NULL; struct PORTCONTROL * PORT = NULL;
char ListenPortList[128] = ""; char ListenPortList[128] = "";
int len = 0;
ptr = strtok_s(CmdTail, " ,", &Context); ptr = strtok_s(CmdTail, " ,", &Context);
@ -1852,7 +1941,7 @@ VOID LISTENCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
} }
} }
len += sprintf(&ListenPortList[len], " %d", Port); sprintf(ListenPortList, "%s %d", ListenPortList, Port);
ListenMask |= ((uint64_t)1 << (Port - 1)); ListenMask |= ((uint64_t)1 << (Port - 1));
} }
@ -2883,12 +2972,15 @@ VOID LINKCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest) char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest)
{ {
char Normcall[10]; char Normcall[10];
char Alias[10]; char Alias[10];
struct NR_DEST_ROUTE_ENTRY * NRRoute; struct NR_DEST_ROUTE_ENTRY * NRRoute;
struct INP3_DEST_ROUTE_ENTRY * Route; struct DEST_ROUTE_ENTRY * Route;
struct ROUTE * Neighbour; struct ROUTE * Neighbour;
int i, Active, len; int i, Active, len;
@ -2929,7 +3021,7 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
// DISPLAY INP3 ROUTES // DISPLAY INP3 ROUTES
Route = &Dest->INP3ROUTE[0]; Route = &Dest->ROUTE[0];
Active = Dest->DEST_ROUTE; Active = Dest->DEST_ROUTE;
@ -2986,17 +3078,17 @@ int DoINP3ViaEntry(struct DEST_LIST * Dest, int n, char * line, int cursor)
int len; int len;
double srtt; double srtt;
if (Dest->INP3ROUTE[n].ROUT_NEIGHBOUR != 0) if (Dest->ROUTE[n].ROUT_NEIGHBOUR != 0)
{ {
srtt = Dest->INP3ROUTE[n].SRTT/1000.0; srtt = Dest->ROUTE[n].SRTT/1000.0;
len=ConvFromAX25(Dest->INP3ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Portcall); len=ConvFromAX25(Dest->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Portcall);
Portcall[len]=0; Portcall[len]=0;
len=sprintf(&line[cursor],"%s %d %d %4.2fs ", len=sprintf(&line[cursor],"%s %d %d %4.2fs ",
Portcall, Portcall,
Dest->INP3ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT, Dest->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT,
Dest->INP3ROUTE[n].Hops, srtt); Dest->ROUTE[n].Hops, srtt);
cursor+=len; cursor+=len;
@ -3284,7 +3376,7 @@ NODE_VIA:
{ {
Dest+=1; Dest+=1;
if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->ROUTE[0].ROUT_NEIGHBOUR == 0)
continue; continue;
@ -3292,9 +3384,9 @@ NODE_VIA:
|| (Dest->NRROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->NRROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->NRROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->NRROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->NRROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)) || (Dest->ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|| (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))) || (Dest->ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)))
{ {
len=ConvFromAX25(Dest->DEST_CALL,Normcall); len=ConvFromAX25(Dest->DEST_CALL,Normcall);
@ -3665,7 +3757,7 @@ VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CM
} }
else else
{ {
if (CMD->String[2] == 'V' || CMD->String[3] == 'V') // MHV if (CMD->String[2] == 'V') // MHV
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "MHeard List %s for Port %d\r", MYNODECALL, Port); Bufferptr = Cmdprintf(Session, Bufferptr, "MHeard List %s for Port %d\r", MYNODECALL, Port);
Bufferptr = Cmdprintf(Session, Bufferptr, "Callsign Last heard Pkts RX via Digi ;) \r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Callsign Last heard Pkts RX via Digi ;) \r");
@ -4052,7 +4144,7 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
if (ret & 0x8000) // Disconnecting if (ret & 0x8000) // Disconnecting
{ {
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Disconnecting)\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
@ -4103,25 +4195,14 @@ VOID ATTACHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
if (EXTPORT->ATTACHEDSESSIONS[sess]) if (EXTPORT->ATTACHEDSESSIONS[sess] || PORT->PortSuspended)
{ {
// In use // In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use (Session Attached\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port in use\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return; return;
} }
if (PORT->PortSuspended)
{
// In use
Bufferptr = Cmdprintf(Session, Bufferptr, "Error - Port Suspended\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
// GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK // GET CIRCUIT TABLE ENTRY FOR OTHER END OF LINK
NewSess = SetupNewSession(Session, Bufferptr); NewSess = SetupNewSession(Session, Bufferptr);
@ -4369,8 +4450,6 @@ struct CMDX COMMANDS[] =
"MHU ",3,MHCMD,0, // UTC Times "MHU ",3,MHCMD,0, // UTC Times
"MHL ",3,MHCMD,0, // Local Times "MHL ",3,MHCMD,0, // Local Times
"MHV ",3,MHCMD,0, "MHV ",3,MHCMD,0,
"MHUV ",3,MHCMD,0, // UTC Times
"MHLV ",3,MHCMD,0, // Local Times
"MHEARD ",1,MHCMD,0, "MHEARD ",1,MHCMD,0,
"APRS ",2,APRSCMD,0, "APRS ",2,APRSCMD,0,
"ATTACH ",1,ATTACHCMD,0, "ATTACH ",1,ATTACHCMD,0,
@ -5588,14 +5667,22 @@ VOID KISSCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
KISS = (struct KISSINFO *) PORT; KISS = (struct KISSINFO *) PORT;
if (KISS->FIRSTPORT != KISS)
{
Bufferptr = Cmdprintf(Session, Bufferptr, "Not first port of a Multidrop Set\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
// Send Command // Send Command
KissLen = KissEncode(KissString, ENCBUFF, KissLen); KissLen = KissEncode(KissString, ENCBUFF, KissLen);
PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q
PORT->Session = Session; PORT->Session = Session;
PORT->LastKISSCmdTime = time(NULL); PORT->LastKISSCmdTime = time(NULL);
PORT = (struct PORTCONTROL *)KISS->FIRSTPORT; // ALL FRAMES GO ON SAME Q
ASYSEND(PORT, ENCBUFF, KissLen); ASYSEND(PORT, ENCBUFF, KissLen);
Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "Command Sent\r");

5647
CommonCode-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c // General C Routines common to bpq32 and linbpq. Mainly moved from BPQ32.c
#pragma data_seg("_BPQDATA") #pragma data_seg("_BPQDATA")
@ -77,8 +78,6 @@ char * stristr (char *ch1, char *ch2);
extern VOID * ENDBUFFERPOOL; extern VOID * ENDBUFFERPOOL;
extern int PoolBuilt;
// Read/Write length field in a buffer header // Read/Write length field in a buffer header
@ -365,7 +364,7 @@ BOK1:
if (n > 1000) if (n > 1000)
{ {
Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line); Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer);
return 0; return 0;
} }
} }
@ -378,11 +377,6 @@ BOK1:
QCOUNT++; QCOUNT++;
if (PoolBuilt && QCOUNT > MAXBUFFS)
{
Debugprintf("Releasebuffer QCOUNT > MAXBUFFS - pointer = %p from %s Line %d", pointer, File, Line);
return 0;
}
return 0; return 0;
} }
@ -1068,7 +1062,6 @@ BOOL ReadConfigFile(int Port, int ProcLine(char * buf, int Port))
WritetoConsoleLocal("\n"); WritetoConsoleLocal("\n");
WritetoConsoleLocal("Bad config record "); WritetoConsoleLocal("Bad config record ");
WritetoConsoleLocal(errbuf); WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
} }
} }
} }
@ -1132,11 +1125,6 @@ int CompareNode(struct DEST_LIST ** a, struct DEST_LIST ** b)
return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7); return memcmp(a[0]->DEST_CALL, b[0]->DEST_CALL, 7);
} }
int CompareRoutes(struct ROUTE ** a, struct ROUTE ** b)
{
return memcmp(a[0]->NEIGHBOUR_CALL, b[0]->NEIGHBOUR_CALL, 7);
}
DllExport int APIENTRY CountFramesQueuedOnStream(int Stream) DllExport int APIENTRY CountFramesQueuedOnStream(int Stream)
{ {
BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1 BPQVECSTRUC * PORTVEC = &BPQHOSTVECTOR[Stream-1]; // API counts from 1
@ -1635,7 +1623,7 @@ DllExport int APIENTRY SendRaw(int port, char * msg, int len)
MSG->LENGTH = len + MSGHDDRLEN; MSG->LENGTH = len + MSGHDDRLEN;
if (PORT->PROTOCOL == 10 && PORT->HWType != H_KISSHF) // PACTOR/WINMOR Style if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF) // PACTOR/WINMOR Style
{ {
// Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR // Pactor Style. Probably will only be used for Tracker unless we do APRS over V4 or WINMOR
@ -2699,14 +2687,6 @@ int DoRoutes()
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{ {
// Dont save routes from config file here or they are difficult to get rid of
if (Routes->NEIGHBOUR_FLAG & LOCKEDBYCONFIG)
{
Routes++;
continue;
}
len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall); len=ConvFromAX25(Routes->NEIGHBOUR_CALL,Normcall);
Normcall[len]=0; Normcall[len]=0;
@ -2730,7 +2710,7 @@ int DoRoutes()
digis[0] = 0; digis[0] = 0;
len=sprintf(line, len=sprintf(line,
"ROUTE ADD %s %d %d %s %d %d %d %d %d %c\n", "ROUTE ADD %s %d %d %s %d %d %d %d %d\n",
Normcall, Normcall,
Routes->NEIGHBOUR_PORT, Routes->NEIGHBOUR_PORT,
Routes->NEIGHBOUR_QUAL, digis, Routes->NEIGHBOUR_QUAL, digis,
@ -2738,8 +2718,7 @@ int DoRoutes()
Routes->NBOUR_FRACK, Routes->NBOUR_FRACK,
Routes->NBOUR_PACLEN, Routes->NBOUR_PACLEN,
Routes->INP3Node | (Routes->NoKeepAlive << 2), Routes->INP3Node | (Routes->NoKeepAlive << 2),
Routes->OtherendsRouteQual, Routes->OtherendsRouteQual);
(Routes->NEIGHBOUR_FLAG & LOCKEDBYSYSOP)?'!':' ');
fputs(line, file); fputs(line, file);
} }
@ -4805,7 +4784,6 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
struct stat STAT; struct stat STAT;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
char PortList[256] = ""; char PortList[256] = "";
int len = 0;
while (PORT) while (PORT)
{ {
@ -4847,7 +4825,7 @@ void GetPortCTEXT(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, st
*ptr = '\r'; *ptr = '\r';
len += sprintf(&PortList[len], ",%d", PORT->PORTNUMBER); sprintf(PortList, "%s,%d", PortList, PORT->PORTNUMBER);
} }
PORT = PORT->PORTPOINTER; PORT = PORT->PORTPOINTER;

View File

@ -168,12 +168,6 @@ void hookL2SessionDeleted(struct _LINKTABLE * LINK)
LINK->ConnectTime = 0; LINK->ConnectTime = 0;
} }
if (LINK->Sent && LINK->Received && (LINK->SentAfterCompression || LINK->ReceivedAfterExpansion))
Debugprintf("L2 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", LINK->callingCall, LINK->receivingCall,
LINK->Sent, LINK->SentAfterCompression, ((LINK->Sent - LINK->SentAfterCompression) * 100) / LINK->Sent,
LINK->Received, LINK->ReceivedAfterExpansion, ((LINK->ReceivedAfterExpansion - LINK->Received) * 100) / LINK->Received);
} }
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK) void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK)

View File

@ -27,8 +27,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line); void _GetSemaphore(struct SEM * Semaphore, int ID, char * File, int Line);
void DeleteRestartData(CIRCUIT * conn);
int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress); int32_t Encode(char * in, char * out, int32_t inlen, BOOL B1Protocol, int Compress);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
@ -43,130 +41,6 @@ int B2RestartCount = 0;
extern char ProperBaseDir[]; extern char ProperBaseDir[];
char RestartDir[MAX_PATH] = "";
void GetRestartData()
{
int i;
struct FBBRestartData Restart;
struct FBBRestartData * RestartRec;
char MsgFile[MAX_PATH];
FILE * hFile;
int FileSize;
struct stat STAT;
size_t ReadLen = 0;
time_t Age;
strcpy(RestartDir, MailDir);
strcat(RestartDir, "/Restart");
// Make sure RestartDir exists
#ifdef WIN32
CreateDirectory(RestartDir, NULL); // Just in case
#else
mkdir(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
chmod(RestartDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif
// look for restart files. These will be numbered from 1 up
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
FileSize = STAT.st_size;
Age = time(NULL) - STAT.st_ctime;
if (Age > 86400 * 2) // Max 2 days
continue;
hFile = fopen(MsgFile, "rb");
if (hFile == NULL)
break;
// Read Restart Record
fread(&Restart, 1, sizeof(struct FBBRestartData), hFile);
if ((Restart.MailBufferSize + sizeof(struct FBBRestartData)) != FileSize) // Duff file
{
fclose(hFile);
break;
}
RestartRec = zalloc(sizeof (struct FBBRestartData));
GetSemaphore(&AllocSemaphore, 0);
RestartData = realloc(RestartData,(++RestartCount+1) * sizeof(void *));
RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore);
memcpy(RestartRec, &Restart, sizeof(struct FBBRestartData));
RestartRec->MailBuffer = malloc(RestartRec->MailBufferSize);
ReadLen = fread(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile);
Logprintf(LOG_BBS, 0, '?', "Restart Data for %s %s Len %d Loaded", RestartRec->Call, RestartRec->bid, RestartRec->length);
fclose(hFile);
}
}
void SaveRestartData()
{
// Save restart data to file so we can reload on restart
// Restart data has pointers to buffers so we must save copy of data and reconstitue on restart
// Delete and resave all restart data to keep restart directory clean
int i, n = 1;
char MsgFile[MAX_PATH];
FILE * hFile;
size_t WriteLen=0;
struct FBBRestartData * RestartRec = NULL;
struct stat STAT;
time_t NOW = time(NULL);
for (i = 1; 1; i++)
{
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, i);
if (stat(MsgFile, &STAT) == -1)
break;
DeleteFile(MsgFile);
}
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if (RestartRec == 0)
return; // Shouldn't happen!
if ((NOW - RestartRec->TimeCreated) > 86400 * 2) // Max 2 days
continue;
sprintf_s(MsgFile, sizeof(MsgFile), "%s/%d", RestartDir, n++);
hFile = fopen(MsgFile, "wb");
if (hFile)
{
WriteLen = fwrite(RestartRec, 1, sizeof(struct FBBRestartData), hFile); // Save Header
WriteLen = fwrite(RestartRec->MailBuffer, 1, RestartRec->MailBufferSize, hFile); // Save Data
fclose(hFile);
}
}
}
VOID FBBputs(CIRCUIT * conn, char * buf) VOID FBBputs(CIRCUIT * conn, char * buf)
{ {
// Sends to user and logs // Sends to user and logs
@ -1111,12 +985,12 @@ loop:
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
{ {
if (RestartRec->length <= offset) if (RestartRec->TempMsg->length <= offset)
{ {
conn->TempMsg->length = RestartRec->length; conn->TempMsg->length = RestartRec->TempMsg->length;
conn->MailBuffer = RestartRec->MailBuffer; conn->MailBuffer = RestartRec->MailBuffer;
conn->MailBufferSize = RestartRec->MailBufferSize; conn->MailBufferSize = RestartRec->MailBufferSize;
@ -1145,7 +1019,6 @@ loop:
RestartData[n] = RestartData[n+1]; // move down all following entries RestartData[n] = RestartData[n+1]; // move down all following entries
} }
RestartCount--; RestartCount--;
SaveRestartData();
} }
} }
@ -1273,7 +1146,6 @@ loop:
{ {
#endif #endif
conn->InputMode = 0; // So we won't save Restart data if decode fails conn->InputMode = 0; // So we won't save Restart data if decode fails
DeleteRestartData(conn);
Decode(conn, 0); // Setup Next Message will reset InputMode if needed Decode(conn, 0); // Setup Next Message will reset InputMode if needed
#ifndef LINBPQ #ifndef LINBPQ
} }
@ -1973,14 +1845,14 @@ VOID SaveFBBBinary(CIRCUIT * conn)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0)) && (strcmp(RestartRec->TempMsg->bid, conn->TempMsg->bid) == 0))
{ {
// Found it, so reuse // Fund it, so reuse
// If we have more data, reset retry count // If we have more data, reset retry count
if (RestartRec->length < conn->TempMsg->length) if (RestartRec->TempMsg->length < conn->TempMsg->length)
RestartRec->Count = 0;; RestartRec->Count = 0;;
break; break;
@ -1997,53 +1869,19 @@ VOID SaveFBBBinary(CIRCUIT * conn)
RestartData[RestartCount] = RestartRec; RestartData[RestartCount] = RestartRec;
FreeSemaphore(&AllocSemaphore); FreeSemaphore(&AllocSemaphore);
RestartRec->TimeCreated = time(NULL);
} }
strcpy(RestartRec->Call, conn->UserPointer->Call); RestartRec->UserPointer = conn->UserPointer;
RestartRec->length = conn->TempMsg->length; RestartRec->TempMsg = conn->TempMsg;
strcpy(RestartRec->bid, conn->TempMsg->bid);
RestartRec->MailBuffer = conn->MailBuffer; RestartRec->MailBuffer = conn->MailBuffer;
RestartRec->MailBufferSize = conn->MailBufferSize; RestartRec->MailBufferSize = conn->MailBufferSize;
len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart", len = sprintf_s(Msg, sizeof(Msg), "Disconnect received from %s during Binary Transfer - %d Bytes Saved for restart",
conn->Callsign, conn->TempMsg->length); conn->Callsign, conn->TempMsg->length);
SaveRestartData();
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
} }
void DeleteRestartData(CIRCUIT * conn)
{
struct FBBRestartData * RestartRec = NULL;
int i, n;
if (conn->TempMsg == NULL)
return;
for (i = 1; i <= RestartCount; i++)
{
RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0)
&& (strcmp(RestartRec->bid, conn->TempMsg->bid) == 0))
{
// Remove restrt data
for (n = i; n < RestartCount; n++)
{
RestartData[n] = RestartData[n+1]; // move down all following entries
}
RestartCount--;
SaveRestartData();
return;
}
}
}
BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader) BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
int i, n; int i, n;
@ -2057,15 +1895,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
{ {
RestartRec = RestartData[i]; RestartRec = RestartData[i];
if ((strcmp(RestartRec->Call, conn->UserPointer->Call) == 0) if ((RestartRec->UserPointer == conn->UserPointer)
&& (strcmp(RestartRec->bid, FBBHeader->BID) == 0)) && (strcmp(RestartRec->TempMsg->bid, FBBHeader->BID) == 0))
{ {
char Msg[120]; char Msg[120];
int len; int len;
RestartRec->Count++; RestartRec->Count++;
if (RestartRec->Count > 10) if (RestartRec->Count > 3)
{ {
len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning", len = sprintf_s(Msg, sizeof(Msg), "Too many restarts for %s - Requesting restart from beginning",
FBBHeader->BID); FBBHeader->BID);
@ -2080,16 +1918,15 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
} }
RestartCount--; RestartCount--;
SaveRestartData();
return FALSE; return FALSE;
} }
len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d", len = sprintf_s(Msg, sizeof(Msg), "Restart Data found for %s - Requesting restart from %d",
FBBHeader->BID, RestartRec->length); FBBHeader->BID, RestartRec->TempMsg->length);
WriteLogLine(conn, '|',Msg, len, LOG_BBS); WriteLogLine(conn, '|',Msg, len, LOG_BBS);
return (RestartRec->length); return (RestartRec->TempMsg->length);
} }
} }

View File

@ -538,11 +538,7 @@ pollloop:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1184,6 +1180,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
@ -1214,7 +1211,7 @@ VOID * FLDigiExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FLDIGI; TNC->Hardware = H_FLDIGI;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View File

@ -452,11 +452,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->lasttime = ltime; TNC->lasttime = ltime;
ConnecttoFreeData(port); ConnecttoFreeData(port);
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
@ -745,10 +740,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1401,14 +1393,14 @@ VOID * FreeDataExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("FreeData Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_FREEDATA;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_FREEDATA;
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->ARDOPDataBuffer = malloc(MAXRXSIZE); TNC->ARDOPDataBuffer = malloc(MAXRXSIZE);
TNC->ARDOPBuffer = malloc(FREEDATABUFLEN); TNC->ARDOPBuffer = malloc(FREEDATABUFLEN);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -4147,7 +4139,7 @@ void buildParamString(struct TNCINFO * TNC, char * line)
FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel); FDI->TuningRange * -1.0, FDI->TuningRange * 1.0, FDI->TXLevel);
if (FDI->hamlibHost) if (FDI->hamlibHost)
sprintf(&line[strlen(line)], " --rigctld_ip %s --rigctld_port %d", FDI->hamlibHost, FDI->hamlibPort); sprintf(line, "%s --rigctld_ip %s --rigctld_port %d", line, FDI->hamlibHost, FDI->hamlibPort);
if (FDI->LimitBandWidth) if (FDI->LimitBandWidth)
strcat(line, " --500hz"); strcat(line, " --500hz");

View File

@ -499,15 +499,15 @@ VOID * HALExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HAL; TNC->Hardware = H_HAL;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;
PortEntry->MAXHOSTMODESESSIONS = 1; // Default PortEntry->MAXHOSTMODESESSIONS = 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
{ {

View File

@ -336,8 +336,7 @@ LRESULT CALLBACK PacWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
} }
#endif #endif
BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, BOOL CreatePactorWindow(struct TNCINFO * TNC, char * ClassName, char * WindowTitle, int RigControlRow, WNDPROC WndProc, int Width, int Height, VOID ForcedCloseProc())
VOID ForcedCloseProc(struct TNCINFO * TNC, int Stream))
{ {
#ifdef LINBPQ #ifdef LINBPQ
return FALSE; return FALSE;
@ -1866,6 +1865,9 @@ static char ** SeparateMultiString(char * MultiString)
return Value; return Value;
} }
extern int nextDummyInterlock; extern int nextDummyInterlock;
int standardParams(struct TNCINFO * TNC, char * buf) int standardParams(struct TNCINFO * TNC, char * buf)
@ -1914,7 +1916,7 @@ int standardParams(struct TNCINFO * TNC, char * buf)
TNC->ActiveTXFreq = atof(&buf[13]); TNC->ActiveTXFreq = atof(&buf[13]);
else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session else if (_memicmp(buf, "ActiveRXFreq", 12) == 0) // Set at start of session
TNC->ActiveRXFreq = atof(&buf[13]); TNC->ActiveRXFreq = atof(&buf[13]);
else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at end of session else if (_memicmp(buf, "DisconnectScript", 16) == 0) // Set at start of session
TNC->DisconnectScript = SeparateMultiString(&buf[17]); TNC->DisconnectScript = SeparateMultiString(&buf[17]);
else if (_memicmp(buf, "PTTONHEX", 8) == 0) else if (_memicmp(buf, "PTTONHEX", 8) == 0)
{ {

View File

@ -648,11 +648,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1181,9 +1177,9 @@ VOID * HSMODEMExtInit(EXTPORTDATA * PortEntry)
Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort); Consoleprintf("HSMODEM Host %s %d", TNC->HostName, TNC->TCPPort);
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_HSMODEM;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_HSMODEM; TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

5175
HTTPcode-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -71,8 +71,6 @@ BOOL SHA1PasswordHash(char * String, char * Hash);
char * byte_base64_encode(char *str, int len); char * byte_base64_encode(char *str, int len);
int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE); int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
extern struct ROUTE * NEIGHBOURS; extern struct ROUTE * NEIGHBOURS;
extern int ROUTE_LEN; extern int ROUTE_LEN;
@ -105,13 +103,9 @@ extern int NumberofPorts;
extern UCHAR ConfigDirectory[260]; extern UCHAR ConfigDirectory[260];
extern struct AXIPPORTINFO * Portlist[];
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len); VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b); int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b); int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token); void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen); void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot); struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -149,7 +143,7 @@ char Tail[] = "</body></html>";
char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>" char RouteHddr[] = "<h2 align=center>Routes</h2><table align=center border=2 style=font-family:monospace bgcolor=white>"
"<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>"; "<tr><th>Port</th><th>Call</th><th>Quality</th><th>Node Count</th><th>Frame Count</th><th>Retries</th><th>Percent</th><th>Maxframe</th><th>Frack</th><th>Last Heard</th><th>Queued</th><th>Rem Qual</th></tr>";
char RouteLine[] = "<tr><td>%s%d</td><td>%s%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>"; char RouteLine[] = "<tr><td>%s%d</td><td>%s%c</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d%</td><td>%d</td><td>%d</td><td>%02d:%02d</td><td>%d</td><td>%d</td></tr>";
char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>" char xNodeHddr[] = "<align=center><form align=center method=get action=/Node/Nodes.html>"
"<table align=center bgcolor=white>" "<table align=center bgcolor=white>"
"<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>" "<tr><td><input type=submit class='btn' name=a value=\"Nodes Sorted by Alias\"></td><td>"
@ -2418,10 +2412,7 @@ doHeader:
if (Session == 0) if (Session == 0)
Session = &Dummy; Session = &Dummy;
if (LOCAL) Session->TNC = LOCAL; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
Session->TNC = (struct TNCINFO *)(uintptr_t)1; // TNC is only used on Web Terminal Sessions so can reuse as LOCAL flag
else
Session->TNC = 0;
WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL); WriteFile(hPipe, Session, sizeof (struct HTTPConnectionInfo), &InputLen, NULL);
WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL); WriteFile(hPipe, MsgPtr, MsgLen, &InputLen, NULL);
@ -3798,129 +3789,33 @@ doHeader:
*/ */
// AXIP Partners
if (_stricmp(NodeURL, "/Node/AXIP.html") == 0)
{
int i;
char Normcall[10];
int Width = 5;
int x = 0, n = 0, nd = 0;
struct arp_table_entry * List[1000];
struct arp_table_entry * ListD[1000];
char AXIPList[10000] = "";
int ListLen = 0;
struct AXIPPORTINFO * AXPORT = Portlist[0];
struct PORTCONTROL * PORT = PORTTABLE;
struct arp_table_entry * arp;
time_t NOW = time(NULL);
char AXIPHeader[] =
"<table align='center' bgcolor='ffffff' border=2 cellpadding=10 cellspacing=2 style=font-family:monospace>"
"<tr><td align='center'>AXIP Up</td><td align='center'>AXIP Down</td></tr><tr><td valign='top'>%s";
while (PORT)
{
AXPORT = Portlist[PORT->PORTNUMBER];
if (AXPORT)
{
// Get ARP entries
for (i = 0; i < AXPORT->arp_table_len; i++)
{
arp = &AXPORT->arp_table[i];
if (arp->LastHeard == 0 || (NOW - arp->LastHeard) > 3600) // Considered down
ListD[nd++] = arp;
else
List[n++] = arp;
}
}
PORT = PORT->PORTPOINTER;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareNode);
if (nd > 1)
qsort(ListD, nd, sizeof(void *), CompareNode);
for (i = 0; i < n; i++)
{
int len = ConvFromAX25(List[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (List[i]->LastHeard)?(NOW - List[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], AXIPHeader, AXIPList);
ListLen = 0;
for (i = 0; i < nd; i++)
{
int len = ConvFromAX25(ListD[i]->callsign, Normcall);
Normcall[len]=0;
ListLen += sprintf(&AXIPList[ListLen], "%02d - %s %d<br>", i + 1, Normcall, (ListD[i]->LastHeard)?(NOW - ListD[i]->LastHeard):0);
}
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td><td valign='top'>%s", AXIPList);
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "</td></tr></table></body></html>");
}
if (_stricmp(NodeURL, "/Node/Routes.html") == 0) if (_stricmp(NodeURL, "/Node/Routes.html") == 0)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
int MaxRoutes = MAXNEIGHBOURS; int MaxRoutes = MAXNEIGHBOURS;
int count, i; int count;
char Normcall[10]; char Normcall[10];
char locked[4] = " "; char locked;
int NodeCount; int NodeCount;
int Percent = 0; int Percent = 0;
int Iframes, Retries; int Iframes, Retries;
char Active[10]; char Active[10];
int Queued; int Queued;
int x = 0, n = 0;
struct ROUTE * List[1000];
ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr); ReplyLen += sprintf(&_REPLYBUFFER[ReplyLen], "%s", RouteHddr);
// Build and sort list of routes
for (count=0; count<MaxRoutes; count++) for (count=0; count<MaxRoutes; count++)
{ {
if (Routes->NEIGHBOUR_CALL[0] != 0) if (Routes->NEIGHBOUR_CALL[0] != 0)
{
List[n++] = Routes;
if (n > 999)
break;
}
Routes++;
}
if (n > 1)
qsort(List, n, sizeof(void *), CompareRoutes);
for (i = 0; i < n; i++)
{
Routes = List[i];
{ {
int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall); int len = ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall);
Normcall[len]=0; Normcall[len]=0;
if (Routes->NEIGHBOUR_FLAG == LOCKEDBYCONFIG) if ((Routes->NEIGHBOUR_FLAG & 1) == 1)
strcpy(locked, "!"); locked = '!';
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP)
strcpy(locked, "!!");
else if (Routes->NEIGHBOUR_FLAG == LOCKEDBYSYSOP + LOCKEDBYCONFIG)
strcpy(locked, "!!!");
else else
strcpy(locked, " "); locked = ' ';
NodeCount = COUNTNODES(Routes); NodeCount = COUNTNODES(Routes);
@ -4427,7 +4322,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
{ {
int ReplyLen = 0; int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password; char * user, * password, * Key;
struct HTTPConnectionInfo * NewSession; struct HTTPConnectionInfo * NewSession;
int i; int i;
struct UserRec * USER; struct UserRec * USER;
@ -4476,7 +4371,7 @@ int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char
if (user && user[0] && password && password[0]) if (user && user[0] && password && password[0])
{ {
sprintf(&MsgPtr[strlen(MsgPtr)], "?%s&%s", user, password); sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password);
} }
} }

View File

@ -1860,7 +1860,7 @@ static void cn_dec(ChatCIRCUIT *circuit, CHATNODE *node)
__try __try
{ {
#endif #endif
len += sprintf(&line[len], " %p %s", cn->node, cn->node->alias); len = sprintf(line, "%s %p %s", line, cn->node, cn->node->alias);
if (len > 80) if (len > 80)
{ {
Debugprintf("%s", line); Debugprintf("%s", line);
@ -2821,7 +2821,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
CHATNODE *node; CHATNODE *node;
LINK *link; LINK *link;
char line[1000]; char line[1000];
int len = 0; int len;
CN *cn; CN *cn;
int i = 0; int i = 0;
@ -2836,16 +2836,16 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
nprintf(conn, "%d Node(s)\r", i); nprintf(conn, "%d Node(s)\r", i);
if (Flag == 'c') if (Flag == 'c')
len = sprintf(line, "Here %-6.6s <-", OurNode); sprintf(line, "Here %-6.6s <-", OurNode);
else else
len = sprintf(line, "Here %-6.6s <-", OurAlias); sprintf(line, "Here %-6.6s <-", OurAlias);
for (node = node_hd; node; node = node->next) if (node->refcnt) for (node = node_hd; node; node = node->next) if (node->refcnt)
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", node->call); len = sprintf(line, "%s %s", line, node->call);
else else
len += sprintf(&line[len], " %s", node->alias); len = sprintf(line, "%s %s", line, node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2873,9 +2873,9 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
__try __try
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2883,23 +2883,23 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x", line, cn, cn->node);}
} }
else else
len = sprintf(&line[len], " Corrupt Rec %x %x ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %x %x ", line, cn, cn->node);
} }
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{len += sprintf(&line[len], " *PE* Corrupt Rec %x %x ", cn, cn->node);} {len = sprintf(line, "%s *PE* Corrupt Rec %x %x ", line, cn, cn->node);}
#else #else
for (cn = circuit->hnode; cn; cn = cn->next) for (cn = circuit->hnode; cn; cn = cn->next)
{ {
if (cn->node && cn->node->alias) if (cn->node && cn->node->alias)
{ {
if (Flag == 'c') if (Flag == 'c')
len += sprintf(&line[len], " %s", cn->node->call); len = sprintf(line, "%s %s", line, cn->node->call);
else else
len += sprintf(&line[len], " %s", cn->node->alias); len = sprintf(line, "%s %s", line, cn->node->alias);
if (len > 80) if (len > 80)
{ {
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -2907,7 +2907,7 @@ static void show_circuits(ChatCIRCUIT *conn, char Flag)
} }
} }
else else
len += sprintf(&line[len], " Corrupt Rec %p %p ", cn, cn->node); len = sprintf(line, "%s Corrupt Rec %p %p ", line, cn, cn->node);
} }
#endif #endif
nprintf(conn, "%s\r", line); nprintf(conn, "%s\r", line);
@ -3682,7 +3682,7 @@ VOID SendChatLinkStatus()
} }
} }
len += sprintf(&Msg[len], "%s %c ", link->call, '0' + link->flags); len = sprintf(Msg, "%s%s %c ", Msg, link->call, '0' + link->flags);
if (len > 240) if (len > 240)
break; break;

View File

@ -387,7 +387,7 @@ char * FormatIP(uint32_t Addr)
return FormatIPWork; return FormatIPWork;
} }
int CompareIPRoutes (const VOID * a, const VOID * b) int CompareRoutes (const VOID * a, const VOID * b)
{ {
PROUTEENTRY x; PROUTEENTRY x;
PROUTEENTRY y; PROUTEENTRY y;
@ -4972,7 +4972,7 @@ VOID SHOWIPROUTE(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, str
Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes); Bufferptr = Cmdprintf(Session, Bufferptr, "%d Entries\r", NumberofRoutes);
if (NumberofRoutes) if (NumberofRoutes)
qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareIPRoutes); qsort(RouteRecords, NumberofRoutes, sizeof(void *), CompareRoutes);
for (i=0; i < NumberofRoutes; i++) for (i=0; i < NumberofRoutes; i++)
{ {
@ -5413,8 +5413,11 @@ VOID ProcessSNMPMessage(PIPMSG IPptr)
int Len; int Len;
PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data; PUDPMSG UDPptr = (PUDPMSG)&IPptr->Data;
UCHAR * Msg; UCHAR * Msg;
int Type;
int Length, ComLen;
int IntVal;
UCHAR Reply[256]; UCHAR Reply[256];
int SendLen; int PDULen, SendLen;
int Offset = 0; int Offset = 0;
Len = ntohs(IPptr->IPLENGTH); Len = ntohs(IPptr->IPLENGTH);

View File

@ -70,8 +70,6 @@ static RECT Rect;
int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len); int DoScanLine(struct TNCINFO * TNC, char * Buff, int Len);
VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len); VOID WritetoTrace(struct TNCINFO * TNC, char * Msg, int Len);
VOID SuspendOtherPorts(struct TNCINFO * ThisTNC);
VOID ReleaseOtherPorts(struct TNCINFO * ThisTNC);
static FILE * LogHandle[32] = {0}; static FILE * LogHandle[32] = {0};
@ -519,28 +517,6 @@ ok:
return 0; return 0;
} }
VOID KAMSuspendPort(struct TNCINFO * TNC, struct TNCINFO * ThisTNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Interlocked");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
// STREAM->CmdSet = STREAM->CmdSave = zalloc(100);
// sprintf(STREAM->CmdSet, "I%s\r", "SCSPTC"); // Should prevent connects
}
VOID KAMReleasePort(struct TNCINFO * TNC)
{
struct STREAMINFO * STREAM = &TNC->Streams[0];
strcpy(TNC->WEB_TNCSTATE, "Free");
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL) static int WebProc(struct TNCINFO * TNC, char * Buff, BOOL LOCAL)
{ {
int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>" int Len = sprintf(Buff, "<html><meta http-equiv=expires content=0><meta http-equiv=refresh content=15>"
@ -591,15 +567,15 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
return ExtProc; return ExtProc;
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KAM; TNC->Hardware = H_KAM;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
PortEntry->MAXHOSTMODESESSIONS = 11; // Default PortEntry->MAXHOSTMODESESSIONS = 11; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
@ -619,11 +595,6 @@ void * KAMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort; PortEntry->PORTCONTROL.PORTSTARTCODE = KAMStartPort;
PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort; PortEntry->PORTCONTROL.PORTSTOPCODE = KAMStopPort;
// TNC->SuspendPortProc = KAMSuspendPort;
// TNC->ReleasePortProc = KAMReleasePort;
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
@ -1295,51 +1266,6 @@ VOID KAMPoll(int Port)
return; return;
} }
if (memcmp(MsgPtr, "GTOR ", 5) == 0) // GTOR Connect
{
memcpy(STREAM->RemoteCall, &MsgPtr[5], 9);
STREAM->Connecting = TRUE;
// If Stream 0, Convert C CALL to PACTOR CALL
if (Stream == 0)
{
datalen = sprintf(TXMsg, "C20GTOR %s", TNC->Streams[0].RemoteCall);
// If Pactor, check busy detecters on any interlocked ports
if (TNC->HFPacket == 0 && InterlockedCheckBusy(TNC) && TNC->OverrideBusy == 0)
{
// Channel Busy. Wait
TNC->ConnectCmd = _strdup(TXMsg);
sprintf(TNC->WEB_TNCSTATE, "Waiting for clear channel");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
TNC->BusyDelay = TNC->BusyWait * 10;
return;
}
TNC->OverrideBusy = FALSE;
sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s",
TNC->Streams[0].MyCall, TNC->Streams[0].RemoteCall);
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
}
else
datalen = sprintf(TXMsg, "C1%cC %s", Stream + '@', STREAM->RemoteCall);
EncodeAndSend(TNC, TXMsg, datalen);
TNC->Timeout = 50;
TNC->InternalCmd = 'C'; // So we dont send the reply to the user.
ReleaseBuffer(buffptr);
STREAM->Connecting = TRUE;
return;
}
if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect if (memcmp(MsgPtr, "DISCONNECT", datalen) == 0) // Disconnect
{ {
if (Stream == 0) if (Stream == 0)
@ -1718,10 +1644,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
return; return;
} }
WritetoTrace(TNC, Buffer, Len);
// Pass to Appl // Pass to Appl
Stream = TNC->CmdStream; Stream = TNC->CmdStream;
@ -1868,10 +1790,6 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Msg[1] == '2' && Msg[2] == 'A') if (Msg[1] == '2' && Msg[2] == 'A')
TNC->HFPacket = TRUE; TNC->HFPacket = TRUE;
// Stop other ports in same group
SuspendOtherPorts(TNC);
ProcessIncommingConnect(TNC, Call, Stream, TRUE); ProcessIncommingConnect(TNC, Call, Stream, TRUE);
SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream]; SESS = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
@ -2129,10 +2047,6 @@ VOID ForcedClose(struct TNCINFO * TNC, int Stream)
VOID CloseComplete(struct TNCINFO * TNC, int Stream) VOID CloseComplete(struct TNCINFO * TNC, int Stream)
{ {
sprintf(TNC->WEB_TNCSTATE, "Free");
SetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
ReleaseOtherPorts(TNC);
TNC->NeedPACTOR = 50; TNC->NeedPACTOR = 50;
} }

View File

@ -458,11 +458,7 @@ ok:
if (_memicmp(txbuff, "RADIO ", 6) == 0) if (_memicmp(txbuff, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &txbuff[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -813,10 +809,10 @@ VOID * KISSHFExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_KISSHF;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_KISSHF;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

438
L2Code.c
View File

@ -33,15 +33,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "cheaders.h" #include "cheaders.h"
#include "tncinfo.h" #include "tncinfo.h"
// This is needed to link with a lib built from source
#ifdef WIN32
#define ZEXPORT __stdcall
#endif
#include <zlib.h>
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
#define REJSENT 1 // SET WHEN FIRST REJ IS SENT IN REPLY #define REJSENT 1 // SET WHEN FIRST REJ IS SENT IN REPLY
@ -120,8 +111,7 @@ int CheckKissInterlock(struct PORTCONTROL * MYPORT, int Exclusive);
void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK); void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK); void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK); void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
VOID DeleteINP3Routes(struct ROUTE * Route);
extern int REALTIMETICKS; extern int REALTIMETICKS;
@ -136,9 +126,7 @@ extern int REALTIMETICKS;
#define SDINVC 1 // INVALID COMMAND #define SDINVC 1 // INVALID COMMAND
#define SDNRER 8 // INVALID N(R) #define SDNRER 8 // INVALID N(R)
extern int L2Compress;
extern int L2CompMaxframe;
extern int L2CompPaclen;
UCHAR NO_CTEXT = 0; UCHAR NO_CTEXT = 0;
UCHAR ALIASMSG = 0; UCHAR ALIASMSG = 0;
@ -771,7 +759,7 @@ VOID L2FORUS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buff
NO_CTEXT = 1; NO_CTEXT = 1;
if (ROUTE->NEIGHBOUR_FLAG && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0 if (ROUTE->NEIGHBOUR_FLAG == 1 && ROUTE->NEIGHBOUR_QUAL == 0) // Locked, qual 0
{ {
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
return; return;
@ -854,7 +842,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
while (xidlen > 0) while (xidlen > 0)
{ {
unsigned char * typeptr = ptr;
Type = *ptr++; Type = *ptr++;
Len = *ptr++; Len = *ptr++;
@ -902,23 +889,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
case 8: //RX Window case 8: //RX Window
break; break;
case 16:
// Compression
if (L2Compress)
{
LINK->AllowCompress = 1;
// return as 17
*typeptr = 17;
}
else
{
ptr = &ADJBUFFER->PID;
ptr[3] -= 2; // Length field - remove compress option
Buffer->LENGTH -=2;
}
} }
} }
@ -930,8 +900,6 @@ VOID ProcessXIDCommand(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESS
LINK->LINKPORT = PORT; LINK->LINKPORT = PORT;
LINK->KILLTIMER = L2KILLTIME - 60*3; // Time out after 60 secs if SABM not received
// save calls so we can match up SABM when it comes // save calls so we can match up SABM when it comes
memcpy(LINK->LINKCALL, Buffer->ORIGIN, 7); memcpy(LINK->LINKCALL, Buffer->ORIGIN, 7);
@ -1031,7 +999,6 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// MESSAGE ON AN ACTIVE LINK // MESSAGE ON AN ACTIVE LINK
int CTLlessPF = CTL & ~PFBIT; int CTLlessPF = CTL & ~PFBIT;
unsigned char * ptr;
PORT->L2FRAMESFORUS++; PORT->L2FRAMESFORUS++;
@ -1087,7 +1054,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
LINK->L2STATE = 2; LINK->L2STATE = 2;
LINK->Ver2point2 = FALSE; LINK->Ver2point2 = FALSE;
LINK->L2TIMER = 1; // Use retry to send SABM LINK->L2TIMER = 1; // USe retry to send SABM
} }
else if (CTLlessPF == XID) else if (CTLlessPF == XID)
{ {
@ -1095,49 +1062,7 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
LINK->L2STATE = 2; LINK->L2STATE = 2;
LINK->Ver2point2 = TRUE;// Must support 2.2 if responded to XID LINK->Ver2point2 = TRUE;// Must support 2.2 if responded to XID
LINK->L2TIMER = 1; // USe retry to send SABM
// if Compress enabled set it
ptr = &ADJBUFFER->PID;
if (*ptr++ == 0x82 && *ptr++ == 0x80)
{
int Type;
int Len;
unsigned int value;
int xidlen = *(ptr++) << 8;
xidlen += *ptr++;
// XID is set of Type, Len, Value n-tuples
while (xidlen > 0)
{
Type = *ptr++;
Len = *ptr++;
value = 0;
xidlen -= (Len + 2);
while (Len--)
{
value <<=8;
value += *ptr++;
}
switch(Type)
{
case 17:
// Compression
if (L2Compress)
LINK->AllowCompress = 1;
}
}
}
LINK->L2TIMER = 1; // Use retry to send SABM
} }
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
@ -1185,9 +1110,8 @@ VOID L2LINKACTIVE(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// 2. OTHER END THINKS LINK HAS DIED // 2. OTHER END THINKS LINK HAS DIED
// 3. RECOVERY FROM FRMR CONDITION // 3. RECOVERY FROM FRMR CONDITION
// 4. REPEAT OF ORIGINAL SABM COS OTHER END MISSED UA // 4. REPEAT OF ORIGINAL SABM COS OTHER END MISSED UA
// 5. Other end has reloaded
// FOR 1-3 and 5 IT IS REASONABLE TO FULLY RESET THE CIRCUIT, BUT IN 4 // FOR 1-3 IT IS REASONABLE TO FULLY RESET THE CIRCUIT, BUT IN 4
// SUCH ACTION WILL LOSE THE INITIAL SIGNON MSG IF CONNECTING TO A // SUCH ACTION WILL LOSE THE INITIAL SIGNON MSG IF CONNECTING TO A
// BBS. THE PROBLEM IS TELLING THE DIFFERENCE. I'M GOING TO SET A FLAG // BBS. THE PROBLEM IS TELLING THE DIFFERENCE. I'M GOING TO SET A FLAG
// WHEN FIRST INFO RECEIVED - IF SABM REPEATED BEFORE THIS, I'LL ASSUME // WHEN FIRST INFO RECEIVED - IF SABM REPEATED BEFORE THIS, I'LL ASSUME
@ -1217,8 +1141,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
TRANSPORTENTRY * Session; TRANSPORTENTRY * Session;
int CONERROR; int CONERROR;
struct ROUTE * ROUTE = NULL;
char toCall[12], fromCall[12]; char toCall[12], fromCall[12];
@ -1276,18 +1198,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF) if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
AttachKISSHF(PORT, Buffer); AttachKISSHF(PORT, Buffer);
// if it is an INP3 connection tell INP3 it is up
if (FindNeighbour(LINK->LINKCALL, PORT->PORTNUMBER, &ROUTE))
{
if (ROUTE->INP3Node)
{
Debugprintf("INP3 Incoming connect from %s", fromCall);
DeleteINP3Routes(ROUTE);
}
}
if (NO_CTEXT == 1) if (NO_CTEXT == 1)
return; return;
@ -1811,9 +1721,9 @@ BOOL InternalL2SETUPCROSSLINK(PROUTE ROUTE, int Retries)
else else
LINK->LINKWINDOW = PORT->PORTWINDOW; LINK->LINKWINDOW = PORT->PORTWINDOW;
if (SUPPORT2point2) // if (SUPPORT2point2)
LINK->L2STATE = 1; // Send XID // LINK->L2STATE = 1; // Send XID
else // else
LINK->L2STATE = 2; LINK->L2STATE = 2;
memcpy(LINK->LINKCALL, ROUTE->NEIGHBOUR_CALL, 7); memcpy(LINK->LINKCALL, ROUTE->NEIGHBOUR_CALL, 7);
@ -1971,23 +1881,11 @@ VOID L2_PROCESS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * B
// RESPONSE TO SABM - SET LINK UP // RESPONSE TO SABM - SET LINK UP
char fromCall[12]; char fromCall[12];
struct ROUTE * ROUTE;
fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0; fromCall[ConvFromAX25(Buffer->ORIGIN, fromCall)] = 0;
RESET2X(LINK); // LEAVE QUEUED STUFF RESET2X(LINK); // LEAVE QUEUED STUFF
// See if INP3 route setup
if (FindNeighbour(Buffer->ORIGIN, PORT->PORTNUMBER, &ROUTE))
{
if (ROUTE->INP3Node)
{
Debugprintf("INP3 Route to %s connected", fromCall);
}
}
SendL2ToMonMap(PORT, fromCall, '+', 'O'); SendL2ToMonMap(PORT, fromCall, '+', 'O');
LINK->L2STATE = 5; LINK->L2STATE = 5;
@ -2120,6 +2018,7 @@ VOID SDUFRM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
SDFRMR(LINK, PORT); // PROCESS FRAME REJECT CONDITION SDFRMR(LINK, PORT); // PROCESS FRAME REJECT CONDITION
} }
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
} }
@ -2459,11 +2358,12 @@ CheckNSLoop:
{ {
// Already have a copy, so discard old and keep this // Already have a copy, so discard old and keep this
Debugprintf ("Frame %d out of seq but already have copy - release it", NS);
ReleaseBuffer(Q_REM(&LINK->RXFRAMES[NS])); ReleaseBuffer(Q_REM(&LINK->RXFRAMES[NS]));
} }
else else
{ {
// Debugprintf ("Frame %d out of seq - save", NS); Debugprintf ("Frame %d out of seq - save", NS);
} }
Buffer->CHAIN = 0; Buffer->CHAIN = 0;
@ -2550,8 +2450,6 @@ CheckPF:
} }
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer) VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer)
{ {
@ -2581,7 +2479,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
Info = &Buffer->PID; Info = &Buffer->PID;
LINK->bytesRXed += Length; LINK->bytesRXed += Length;
LINK->Received += Length - 1; // Exclude PID
// Adjust for DIGIS // Adjust for DIGIS
@ -2598,111 +2495,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
switch(PID) switch(PID)
{ {
case 0xf2:
// Intermediate fragment of compressed. Save
// Length and Info include pid
Length--;
Info++;
if (LINK->unCompress == 0)
LINK->unCompress = malloc(8192);
// Save data
memcpy(&LINK->unCompress[LINK->unCompressLen], Info, Length);
LINK->unCompressLen += Length;
ReleaseBuffer(Buffer);
LINK->L2ACKREQ = PORT->PORTT2; // SET RR NEEDED
LINK->KILLTIMER = 0; // RESET IDLE LINK TIMER
return;
case 0xf1:
// Compressed last or only
{
char exBuffer[8192];
int Len;
int outLen;
int sendLen;
char * sendptr = exBuffer;
Length--;
Info++;
// we may have previous fragments
if (LINK->unCompressLen)
{
memcpy(&LINK->unCompress[LINK->unCompressLen], Info, Length);
LINK->unCompressLen += Length;
Len = doinflate(LINK->unCompress, exBuffer, LINK->unCompressLen, 8192, &outLen);
LINK->ReceivedAfterExpansion += outLen - 1;
LINK->unCompressLen = 0;
}
else
{
Len = doinflate(Info, exBuffer, Length, 8192, &outLen);
LINK->ReceivedAfterExpansion += outLen - 1;
}
sendLen = outLen;
// Send first bit in input buffer. If still some left get new buffers for it
if (sendLen > 257)
sendLen = 257;
// First byte is original PID
memcpy(&Msg->PID, exBuffer, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN;
C_Q_ADD(&LINK->RX_Q, Msg);
outLen -= sendLen;
sendptr += sendLen;
while (outLen > 0)
{
sendLen = outLen;
if (sendLen > 236)
sendLen = 236;
Msg = GetBuff();
if (Msg)
{
// Just ignore if no buffers - shouldn't happen
Msg->PID = exBuffer[0];
Msg->PORT = LINK->LINKPORT->PORTNUMBER;
memcpy(Msg->L2DATA, sendptr, sendLen);
Length = sendLen + 1;
Msg->LENGTH = Length + MSGHDDRLEN;
C_Q_ADD(&LINK->RX_Q, Msg);
}
outLen -= sendLen;
sendptr += sendLen;
}
LINK->L2ACKREQ = PORT->PORTT2; // SET RR NEEDED
LINK->KILLTIMER = 0; // RESET IDLE LINK TIMER
return;
}
case 0xcc: case 0xcc:
case 0xcd: case 0xcd:
@ -2752,7 +2544,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
// Copy Data back over // Copy Data back over
memmove(&Msg->PID, Info, Length); memmove(&Msg->PID, Info, Length);
LINK->ReceivedAfterExpansion += Length - 1;
Buffer->LENGTH = Length + MSGHDDRLEN; Buffer->LENGTH = Length + MSGHDDRLEN;
@ -2820,7 +2611,7 @@ VOID RESETNS(struct _LINKTABLE * LINK, UCHAR NS)
int COUNT_AT_L2(struct _LINKTABLE * LINK) int COUNT_AT_L2(struct _LINKTABLE * LINK)
{ {
// COUNTS FRAMES QUEUED ON AN L2 SESSION (IN LINK) // COUNTS FRAMES QUEUED ON AN L2 SESSION (IN BX)
int count = 0, abovelink = 0; int count = 0, abovelink = 0;
int n = 0; int n = 0;
@ -2967,7 +2758,7 @@ VOID SDETX(struct _LINKTABLE * LINK)
UCHAR * ptr1, * ptr2; UCHAR * ptr1, * ptr2;
UCHAR CTL; UCHAR CTL;
int count; int count;
struct DATAMESSAGE * Msg; MESSAGE * Msg;
MESSAGE * Buffer; MESSAGE * Buffer;
// DONT SEND IF RESEQUENCING RECEIVED FRAMES - CAN CAUSE FRMR PROBLEMS // DONT SEND IF RESEQUENCING RECEIVED FRAMES - CAN CAUSE FRMR PROBLEMS
@ -2975,6 +2766,11 @@ VOID SDETX(struct _LINKTABLE * LINK)
// if (LINK->L2RESEQ_Q) // if (LINK->L2RESEQ_Q)
// return; // return;
if (LINK->LINKPORT->PORTNUMBER == 19)
{
int i = 0;
}
Outstanding = LINK->LINKNS - LINK->LINKOWS; // Was WS not NS Outstanding = LINK->LINKNS - LINK->LINKOWS; // Was WS not NS
if (Outstanding < 0) if (Outstanding < 0)
@ -2987,148 +2783,11 @@ VOID SDETX(struct _LINKTABLE * LINK)
while (LINK->TX_Q && LINK->FRAMES[LINK->SDTSLOT] == NULL) while (LINK->TX_Q && LINK->FRAMES[LINK->SDTSLOT] == NULL)
{ {
// Try compressing here. Only Compress PID 0xF0 frames - NETROM doesn't treat L2 session as a byte stream
Msg = Q_REM(&LINK->TX_Q); Msg = Q_REM(&LINK->TX_Q);
Msg->CHAIN = NULL; Msg->CHAIN = NULL;
if (LINK->AllowCompress && Msg->LENGTH > 20 && LINK->TX_Q && Msg->PID == 240) // if short and no more not worth trying compression
{
int complen = 0;
int dataLen;
int savePort = Msg->PORT;
int savePID = Msg->PID;
unsigned char Compressed[8192];
unsigned char toCompress[8192];
int toCompressLen = 0;
int slots = 0;
int n = LINK->SDTSLOT;
int maxcompsize;
int PACLEN = LINK->LINKPORT->PORTPACLEN;
unsigned char * compdata;
int sendLen = complen;
int uncompressed = 0;
if (PACLEN == 0)
PACLEN = 256;
// I think I need to know how many slots are available, so I don't compress too much
// Then collect data, compressing after each frame to make sure will fit in available space
while (LINK->FRAMES[n] == NULL && slots < 8)
{
slots++;
n++;
n &= 7;
}
maxcompsize = slots * PACLEN;
// Save first packet, then see if more on TX_Q
toCompressLen = 0;
dataLen = Msg->LENGTH - MSGHDDRLEN;
LINK->Sent += dataLen;
memcpy(&toCompress[toCompressLen], &Msg->PID, dataLen);
toCompressLen += dataLen;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
ReleaseBuffer(Msg);
while (LINK->TX_Q)
{
Msg = LINK->TX_Q; // Leave on queue until sure it will fit
dataLen = Msg->LENGTH - MSGHDDRLEN -1; // PID only on 1st fragment
memcpy(&toCompress[toCompressLen], &Msg->L2DATA, dataLen);
toCompressLen += dataLen;
// Need to make sure we don't go over maxcompsize
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
if (complen > maxcompsize)
{
// Remove last fragment and compress again
toCompressLen -= dataLen;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
break;
}
else
{
LINK->Sent += dataLen;
Msg = Q_REM(&LINK->TX_Q);
Msg->CHAIN = NULL;
ReleaseBuffer(Msg);
}
}
if (complen >= toCompressLen)
{
// Won't compress, so just send original data
// May still need to fragment
memcpy(Compressed, toCompress, toCompressLen);
complen = toCompressLen - 1; // Remove leading PID
uncompressed = 1;
compdata = &Compressed[1];
}
else
compdata = Compressed;
// We now need to packetize and add to FRAMES
LINK->SentAfterCompression += complen;
sendLen = PACLEN;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
else
sendLen = complen;
if (uncompressed)
PID = Compressed[0];
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = savePort;
Msg->PID = PID;
memcpy(&Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1;
LINK->FRAMES[LINK->SDTSLOT] = Msg; LINK->FRAMES[LINK->SDTSLOT] = Msg;
LINK->SDTSLOT ++; LINK->SDTSLOT ++;
LINK->SDTSLOT &= 7; LINK->SDTSLOT &= 7;
compdata += sendLen;
complen -= sendLen;
}
toCompressLen = 0;
}
else
{
LINK->FRAMES[LINK->SDTSLOT] = Msg;
LINK->SDTSLOT ++;
LINK->SDTSLOT &= 7;
}
} }
// dont send while poll outstanding // dont send while poll outstanding
@ -3341,17 +3000,6 @@ VOID L2TimerProc()
{ {
// CIRCUIT HAS BEEN IDLE TOO LONG - SHUT IT DOWN // CIRCUIT HAS BEEN IDLE TOO LONG - SHUT IT DOWN
// if in XID received state session was never established so don't send DISC
if (LINK->L2STATE == 1)
{
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
DetachKISSHF(PORT);
CLEAROUTLINK(LINK);
}
else
{
LINK->KILLTIMER = 0; LINK->KILLTIMER = 0;
LINK->L2TIMER = 1; // TO FORCE DISC LINK->L2TIMER = 1; // TO FORCE DISC
LINK->L2STATE = 4; // DISCONNECTING LINK->L2STATE = 4; // DISCONNECTING
@ -3360,7 +3008,6 @@ VOID L2TimerProc()
InformPartner(LINK, NORMALCLOSE); InformPartner(LINK, NORMALCLOSE);
} }
}
LINK++; LINK++;
} }
} }
@ -3664,9 +3311,6 @@ VOID CLEAROUTLINK(struct _LINKTABLE * LINK)
CLEARL2QUEUES(LINK); // TO RELEASE ANY BUFFERS CLEARL2QUEUES(LINK); // TO RELEASE ANY BUFFERS
if (LINK->unCompress)
free(LINK->unCompress);
memset(LINK, 0, sizeof(struct _LINKTABLE)); memset(LINK, 0, sizeof(struct _LINKTABLE));
} }
@ -3701,10 +3345,6 @@ VOID L2SENDXID(struct _LINKTABLE * LINK)
*ptr++ = 0x82; // FI *ptr++ = 0x82; // FI
*ptr++ = 0x80; // GI *ptr++ = 0x80; // GI
*ptr++ = 0x0; *ptr++ = 0x0;
if (L2Compress)
*ptr++ = 0x12; // Length 18
else
*ptr++ = 0x10; // Length 16 *ptr++ = 0x10; // Length 16
*ptr++ = 0x02; // Classes of Procedures *ptr++ = 0x02; // Classes of Procedures
@ -3735,14 +3375,6 @@ VOID L2SENDXID(struct _LINKTABLE * LINK)
*ptr++ = 0x01; // Len *ptr++ = 0x01; // Len
*ptr++ = 0x07; // 7 *ptr++ = 0x07; // 7
// if L2Compress Enabled request it
if (L2Compress)
{
*ptr++ = 0x10; // Compress
*ptr++ = 0x00; // Len
}
Buffer->LENGTH = (int)(ptr - (UCHAR *)Buffer); // SET LENGTH Buffer->LENGTH = (int)(ptr - (UCHAR *)Buffer); // SET LENGTH
LINK->L2TIMER = ONEMINUTE; // (RE)SET TIMER LINK->L2TIMER = ONEMINUTE; // (RE)SET TIMER
@ -3946,6 +3578,7 @@ CheckNSLoop2:
struct PORTCONTROL * PORT = LINK->LINKPORT; struct PORTCONTROL * PORT = LINK->LINKPORT;
MESSAGE * OldBuffer = Q_REM(&LINK->RXFRAMES[LINK->LINKNR]); MESSAGE * OldBuffer = Q_REM(&LINK->RXFRAMES[LINK->LINKNR]);
Debugprintf("L2 about to send REJ - process saved Frame %d", LINK->LINKNR);
PROC_I_FRAME(LINK, PORT, OldBuffer); // Passes on or releases Buffer PROC_I_FRAME(LINK, PORT, OldBuffer); // Passes on or releases Buffer
// NR has been updated. // NR has been updated.
@ -4004,8 +3637,6 @@ VOID CONNECTREFUSED(struct _LINKTABLE * LINK)
} }
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK); VOID L3CONNECTFAILED(struct _LINKTABLE * LINK);
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK);
VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg) VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
{ {
@ -4020,7 +3651,7 @@ VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
if (LINK->LINKTYPE == 3) if (LINK->LINKTYPE == 3)
{ {
L3LINKSETUPFAILED(LINK); // REPORT TO LEVEL 3 L3CONNECTFAILED(LINK); // REPORT TO LEVEL 3
return; return;
} }
@ -4547,33 +4178,6 @@ int seeifUnlockneeded(struct _LINKTABLE * LINK)
return 0; return 0;
} }
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len)
{
z_stream defstream;
int maxSize;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
defstream.avail_in = Len; // size of input
defstream.next_in = (Bytef *)In; // input char array
deflateInit(&defstream, Z_BEST_COMPRESSION);
maxSize = deflateBound(&defstream, Len);
if (maxSize > OutSize)
return 0;
defstream.avail_out = maxSize; // size of output
defstream.next_out = (Bytef *)Out; // output char array
deflate(&defstream, Z_FINISH);
deflateEnd(&defstream);
return defstream.total_out;
}

View File

@ -67,8 +67,6 @@ extern dest_list * CURRENTNODE;
int L3_10SECS = 10; int L3_10SECS = 10;
extern int PREFERINP3ROUTES;
VOID L3BG() VOID L3BG()
{ {
@ -137,14 +135,12 @@ VOID L3BG()
// Drop through to Activate // Drop through to Activate
} }
// No Active Route
if (ACTIVATE_DEST(DEST) == FALSE) if (ACTIVATE_DEST(DEST) == FALSE)
{ {
// Node has no routes - get rid of it // Node has no routes - get rid of it
REMOVENODE(DEST); REMOVENODE(DEST);
return; // Avoid risk of looking at old entries return; // Avoid riskof looking at lod entries
} }
} }
} }
@ -158,24 +154,14 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
{ {
int n = MAXDESTS; int n = MAXDESTS;
struct PORTCONTROL * PORT = PORTTABLE; struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE = NULL; struct ROUTE * ROUTE;
struct _LINKTABLE * LINK; struct _LINKTABLE * LINK;
struct TNCINFO * TNC; struct TNCINFO * TNC;
int ActiveRoute; int ActiveRoute;
if (DEST->DEST_ROUTE == 0) // Don't ALREADY HAVE A SELECTED ROUTE? if (DEST->DEST_ROUTE == 0) // ALREADY HAVE A SELECTED ROUTE?
{ DEST->DEST_ROUTE = 1; // TRY TO ACTIVATE FIRST
DEST->DEST_ROUTE = 1;
if (PREFERINP3ROUTES)
{
// if we have any INP3 routes use the first. It will always be the fastest. The others are there for fallback if the first fails.
if (ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR)
DEST->DEST_ROUTE = 4; // TRY TO ACTIVATE FIRST
}
}
ActiveRoute = DEST->DEST_ROUTE - 1; ActiveRoute = DEST->DEST_ROUTE - 1;
@ -183,7 +169,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
if (ROUTE == 0) if (ROUTE == 0)
{ {
// Current Route not present // Currnet Route not present
// If current route is 1, then we must have INP3 routes (or entry is corrupt) // If current route is 1, then we must have INP3 routes (or entry is corrupt)
if (DEST->DEST_ROUTE != 1) if (DEST->DEST_ROUTE != 1)
@ -191,17 +177,13 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
// Current Route is 1 // Current Route is 1
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
return FALSE; // No INP3 so No Routes return FALSE; // No INP3 so No Routes
DEST->DEST_ROUTE = 4; // First INP3 DEST->DEST_ROUTE = 4; // First INP3
ROUTE = DEST->INP3ROUTE[0].ROUT_NEIGHBOUR; ROUTE = DEST->ROUTE[0].ROUT_NEIGHBOUR;
} }
if (ROUTE == 0) // Shouldn't happen
return FALSE;
// if NetROM over VARA conection is made by the driver // if NetROM over VARA conection is made by the driver
TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT]; TNC = TNCInfo[ROUTE->NEIGHBOUR_PORT];
@ -222,7 +204,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
return L2SETUPCROSSLINK(ROUTE); return L2SETUPCROSSLINK(ROUTE);
} }
// We umst be waiting for link to come up // We mst be waiting for link to come up
return TRUE; return TRUE;
@ -337,13 +319,13 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if locked route with quality zero ignore // if locked route with quality zero ignore
if ((ROUTE->NEIGHBOUR_FLAG)) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1)) // LOCKED ROUTE
if (ROUTE->NEIGHBOUR_QUAL == 0) if (ROUTE->NEIGHBOUR_QUAL == 0)
return; return;
// If Ignoreunlocked set, ignore it not locked // If Ignoreunlocked set, ignore it not locked
if ((ROUTE->NEIGHBOUR_FLAG) == 0) // LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // LOCKED ROUTE
if (PORT->IgnoreUnlocked) if (PORT->IgnoreUnlocked)
return; return;
@ -351,7 +333,7 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
// if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES // if not locked, update route quality from port quality (may have changed config and not cleared SAVENODES
if (ROUTE->NEIGHBOUR_FLAG == 0) // Not LOCKED ROUTE if ((ROUTE->NEIGHBOUR_FLAG & 1) == 0) // Not LOCKED ROUTE
ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY; ROUTE->NEIGHBOUR_QUAL = PORT->PORTQUALITY;
// GET TIME FROM BIOS DATA AREA OR RTC // GET TIME FROM BIOS DATA AREA OR RTC
@ -725,11 +707,11 @@ int COUNTNODES(struct ROUTE * ROUTE)
count++; count++;
else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->NRROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE) else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
count++; count++;
DEST++; DEST++;
@ -863,7 +845,7 @@ VOID SENDNEXTNODESFRAGMENT()
if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL && if (DEST->DEST_CALL[0] != 0x40 && DEST->NRROUTE[0].ROUT_QUALITY >= TXMINQUAL &&
DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN && DEST->NRROUTE[0].ROUT_OBSCOUNT >= OBSMIN &&
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0; (NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if DEST = 0;
{ {
// Send it // Send it
@ -896,9 +878,6 @@ VOID SENDNEXTNODESFRAGMENT()
*(ptr1++) = (UCHAR)Qual; *(ptr1++) = (UCHAR)Qual;
if (Qual == 0)
continue;
Count--; Count--;
} }
DEST++; DEST++;
@ -945,7 +924,7 @@ VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason)
VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason) VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET INACTIVE // SET INACTIVE
dest_list * DEST; dest_list * DEST;
@ -966,7 +945,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
if (DEST->DEST_ROUTE == 0) if (DEST->DEST_ROUTE == 0)
continue; continue;
if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
{ {
// Yes, so clear // Yes, so clear
@ -1059,7 +1038,7 @@ VOID L3TimerProc()
{ {
ROUTE++; ROUTE++;
if (ROUTE->NEIGHBOUR_FLAG) // Locked? if (ROUTE->NEIGHBOUR_FLAG & 1) // Locked?
continue; continue;
if (ROUTE->NEIGHBOUR_LINK) // Has an active Session if (ROUTE->NEIGHBOUR_LINK) // Has an active Session
@ -1141,7 +1120,7 @@ UPDEST000:
{ {
// Any INP3 Routes? // Any INP3 Routes?
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
{ {
// NO ROUTES LEFT TO DEST - REMOVE IT // NO ROUTES LEFT TO DEST - REMOVE IT
@ -1313,32 +1292,6 @@ VOID REMOVENODE(dest_list * DEST)
NUMBEROFNODES--; NUMBEROFNODES--;
} }
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK)
{
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
struct PORTCONTROL * PORT = PORTTABLE;
struct ROUTE * ROUTE;
ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE == NULL)
return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed", Normcall);
}
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
L3TRYNEXTDEST(ROUTE); // RESET ASSOCIATED DEST ENTRIES
}
VOID L3CONNECTFAILED(struct _LINKTABLE * LINK) VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
{ {
// L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED // L2 LINK SETUP HAS FAILED - SEE IF ANOTHER NEIGHBOUR CAN BE USED
@ -1352,14 +1305,6 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
if (ROUTE == NULL) if (ROUTE == NULL)
return; // NOTHING ??? return; // NOTHING ???
if (ROUTE->INP3Node)
{
char Normcall[10];
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
Debugprintf("INP3 Route to %s connect failed or refused", Normcall);
}
TellINP3LinkSetupFailed(ROUTE); TellINP3LinkSetupFailed(ROUTE);
ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT ROUTE->NEIGHBOUR_LINK = 0; // CLEAR IT
@ -1370,7 +1315,7 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE) VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
{ {
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND // FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE // SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
int n = MAXDESTS; int n = MAXDESTS;
@ -1383,7 +1328,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
if (ActiveRoute) if (ActiveRoute)
{ {
ActiveRoute --; // Routes numbered 1 - 6, index from 0 ActiveRoute --; // Routes numbered 1 - 6, idex from 0
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE) if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
{ {

560
L4Code.c
View File

@ -38,22 +38,22 @@ extern BPQVECSTRUC BPQHOSTVECTOR[];
#define BPQHOSTSTREAMS 64 #define BPQHOSTSTREAMS 64
#define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3] #define IPHOSTVECTOR BPQHOSTVECTOR[BPQHOSTSTREAMS + 3]
void CLOSECURRENTSESSION(TRANSPORTENTRY * Session); VOID CLOSECURRENTSESSION(TRANSPORTENTRY * Session);
void SENDL4DISC(TRANSPORTENTRY * Session); VOID SENDL4DISC(TRANSPORTENTRY * Session);
int C_Q_COUNT(void * Q); int C_Q_COUNT(VOID * Q);
TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK); TRANSPORTENTRY * SetupSessionForL2(struct _LINKTABLE * LINK);
void InformPartner(struct _LINKTABLE * LINK, int Reason); VOID InformPartner(struct _LINKTABLE * LINK, int Reason);
void IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer); VOID IFRM150(TRANSPORTENTRY * Session, PDATAMESSAGE Buffer);
void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG); VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex); BOOL FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex);
int GETBUSYBIT(TRANSPORTENTRY * L4); int GETBUSYBIT(TRANSPORTENTRY * L4);
BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions); BOOL cATTACHTOBBS(TRANSPORTENTRY * Session, UINT Mask, int Paclen, int * AnySessions);
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE); TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE);
extern char * ALIASPTR; extern char * ALIASPTR;
void SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall); VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER * L3MSG, BOOL BPQNODE, UINT Applmask, UCHAR * ApplCall);
void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG); VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG);
void L4TIMEOUT(TRANSPORTENTRY * L4); VOID L4TIMEOUT(TRANSPORTENTRY * L4);
struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg); struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg);
int CHECKIFBUSYL4(TRANSPORTENTRY * L4); int CHECKIFBUSYL4(TRANSPORTENTRY * L4);
VOID AUTOTIMER(TRANSPORTENTRY * L4); VOID AUTOTIMER(TRANSPORTENTRY * L4);
@ -67,23 +67,12 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall); VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask, UCHAR * ApplCall);
void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode); void WriteConnectLog(char * fromCall, char * toCall, UCHAR * Mode);
void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG); void SendVARANetromMsg(struct TNCINFO * TNC, PL3MESSAGEBUFFER MSG);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen);
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
static UINT APPLMASK; static UINT APPLMASK;
extern BOOL LogL4Connects; extern BOOL LogL4Connects;
extern BOOL LogAllConnects; extern BOOL LogAllConnects;
extern int L4Compress;
extern int L4CompMaxframe;
extern int L4CompPaclen;
extern int L2Compress;
extern int L2CompMaxframe;
extern int L2CompPaclen;
// 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
@ -304,7 +293,6 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
return; return;
} }
L3MSG = GetBuff(); L3MSG = GetBuff();
if (L3MSG == 0) if (L3MSG == 0)
@ -353,17 +341,6 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
L3MSG->L4FLAGS = L4INFO | L4->NAKBITS; L3MSG->L4FLAGS = L4INFO | L4->NAKBITS;
if (Msg->PID == 0xF1) // Compressed Message
{
L3MSG->L4FLAGS |= L4COMP;
Msg->PID = 0xF0;
}
else if (Msg->PID == 0xF2) // Compressed Message - More to come
{
L3MSG->L4FLAGS |= (L4COMP | L4MORE);
Msg->PID = 0xF0;
}
L4->L4TIMER = L4->SESSIONT1; // SET TIMER L4->L4TIMER = L4->SESSIONT1; // SET TIMER
L4->L4ACKREQ = 0; // CANCEL ACK NEEDED L4->L4ACKREQ = 0; // CANCEL ACK NEEDED
@ -493,9 +470,6 @@ VOID SENDL4CONNECT(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[17] - (UCHAR *)MSG);
if (L4Compress)
MSG->L4DATA[16] |= 0x40; // Set Compression Supported
if (Session->SPYFLAG) if (Session->SPYFLAG)
{ {
MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG MSG->L4DATA[17] = 'Z'; // ADD SPY ON BBS FLAG
@ -526,102 +500,6 @@ void RETURNEDTONODE(TRANSPORTENTRY * Session)
extern void * BUFFER; extern void * BUFFER;
void sendChunk(TRANSPORTENTRY * L4, unsigned char * Compressed, int complen, int savePort)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
L4->SentAfterCompression += complen;
if (complen > L4CompPaclen)
{
fragments = (complen / L4CompPaclen); // Split to roughly equal sized fraagments
if (fragments * L4CompPaclen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
}
void sendL2Chunk(struct _LINKTABLE * LINK, unsigned char * Compressed, int complen, int sendPacLen)
{
unsigned char * compdata;
struct DATAMESSAGE * Msg;
int sendLen = complen;
int fragments;
LINK->SentAfterCompression += complen;
if (complen > L2CompPaclen)
{
fragments = (complen / sendPacLen); // Split to roughly equal sized fraagments
if (fragments * sendPacLen != complen)
fragments++;
sendLen = (complen / fragments) + 1;
}
Debugprintf("L2 Chunk %d Bytes %d PACLEN %d Fragments %d FragSize", complen, sendPacLen, fragments, sendLen);
compdata = Compressed;
while (complen > 0)
{
int PID = 0xF1;
if (complen > sendLen)
PID = 0xF2; // More to come
Msg = GetBuff();
if (!Msg)
return;
Msg->PORT = LINK->LINKPORT->PORTNUMBER;
memcpy(Msg->L2DATA, compdata, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1; // 1 for pid field
Msg->PID = PID; // Not sent so use as a flag for compressed msg
compdata += sendLen;
complen -= sendLen;
C_Q_ADD(&LINK->TX_Q, Msg);
}
}
VOID L4BG() VOID L4BG()
{ {
// PROCESS DATA QUEUED ON SESSIONS // PROCESS DATA QUEUED ON SESSIONS
@ -683,7 +561,7 @@ VOID L4BG()
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
if (COUNT_AT_L2(LINK) > 64) if (COUNT_AT_L2(LINK) > 8)
break; break;
} }
@ -715,146 +593,11 @@ VOID L4BG()
if (L4->L4CIRCUITTYPE & SESSION) if (L4->L4CIRCUITTYPE & SESSION)
{ {
// Now support compressing NetRom Sessions.
// We collect as much data as possible before compressing and re-packetizing
if (L4->AllowCompress)
{
int complen = 0;
unsigned char Compressed[8192];
unsigned char toCompress[8192];
int toCompressLen = 0;
int dataLen;
int savePort = Msg->PORT;
int maxCompSendLen;
// Save first packet, then see if more on TX_Q
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen;
// See if first will compress. If not assume too short or already compressed data and just send
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
if (complen >= dataLen)
{
L4->SentAfterCompression += dataLen;
SENDL4MESSAGE(L4, Msg); SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
toCompressLen = 0;
continue; continue;
} }
// Worth compressing. Try to collect several packets
if (L4->L4TX_Q == 0)
{
// no more, so just send the stuff we've just compressed. Compressed data will fit in input packet
// Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
memcpy(Msg->L2DATA, Compressed, complen);
Msg->PID = 0xF1; // Compressed
Msg->LENGTH = complen + MSGHDDRLEN + 1; // 1 for pid field
L4->SentAfterCompression += complen;
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
toCompressLen = 0;
continue;
}
ReleaseBuffer(Msg); // Not going to use it
while (L4->L4TX_Q && toCompressLen < (8192 - 256)) // Make sure can't overrin buffer
{
// Collect the data from L4TX_Q
Msg = Q_REM((void *)&L4->L4TX_Q);
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen;
ReleaseBuffer(Msg);
}
toCompress[toCompressLen] = 0;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
// Send compressed
// Fragment if more than L4CompPaclen
// Entered with original first fragment in saveMsg;
// Check for too big a compressed frame size. Bigger compresses better but adds latency to link
maxCompSendLen = L4CompPaclen * L4CompMaxframe;
if (complen > maxCompSendLen)
{
// Too Much Data. Needs to recompress less. To avoid too many recompresses be a bit conservative in calulating max size
// to allow for a bit less compression of part of data. Getting it wrong isn't fatal as sending more than optimum isn't fatal
int Fragments;
int ChunkSize;
unsigned char * CompressPtr = toCompress;
int bytesleft = toCompressLen;
// Assume 10% worse compression on smaller input
int j = (complen * 11) / 10; // New Comp size
Fragments = j / maxCompSendLen;
Fragments++;
ChunkSize = (toCompressLen / Fragments) + 1; // 1 for rounding
while (bytesleft > 0)
{
int Len = bytesleft;
if (Len > ChunkSize)
Len = ChunkSize;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);
sendChunk(L4, Compressed, complen, savePort);
CompressPtr += Len;
bytesleft -= Len;
}
}
else
sendChunk(L4, Compressed, complen,savePort);
toCompressLen = 0;
}
else
{
// Compression Disabled
SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg);
}
continue;
}
// L2 Link
LINK = L4->L4TARGET.LINK; LINK = L4->L4TARGET.LINK;
// If we want to enforce PACLEN this may be a good place to do it // If we want to enforce PACLEN this may be a good place to do it
@ -960,32 +703,12 @@ VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session)
Session->L4RESEQ_Q = 0; Session->L4RESEQ_Q = 0;
} }
// if compressed session display stats
if (Session->Sent && Session->Received)
{
char SRCE[10];
char TO[10];
struct DEST_LIST * DEST = Session->L4TARGET.DEST;
SRCE[ConvFromAX25(Session->L4MYCALL, SRCE)] = 0;
TO[ConvFromAX25(DEST->DEST_CALL, TO)] = 0;
Debugprintf("L4 Compression Stats %s %s TX %d %d %d%% RX %d %d %d%%", SRCE, TO,
Session->Sent, Session->SentAfterCompression, ((Session->Sent - Session->SentAfterCompression) * 100) / Session->Sent,
Session->Received, Session->ReceivedAfterExpansion, ((Session->ReceivedAfterExpansion - Session->Received) * 100) / Session->Received);
}
while (Session->L4RESEQ_Q) while (Session->L4RESEQ_Q)
ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q)); ReleaseBuffer(Q_REM((void *)&Session->L4RESEQ_Q));
if (Session->PARTCMDBUFFER) if (Session->PARTCMDBUFFER)
ReleaseBuffer(Session->PARTCMDBUFFER); ReleaseBuffer(Session->PARTCMDBUFFER);
if (Session->unCompress)
free(Session->unCompress);
memset(Session, 0, sizeof(TRANSPORTENTRY)); memset(Session, 0, sizeof(TRANSPORTENTRY));
} }
@ -1177,14 +900,10 @@ VOID L4TimerProc()
L4->STAYFLAG = 0; L4->STAYFLAG = 0;
Partner = L4->L4CROSSLINK; Partner = L4->L4CROSSLINK;
CLOSECURRENTSESSION(L4); CLOSECURRENTSESSION(L4);
if (Partner) if (Partner)
{ {
// if compressed session display stats
Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE Partner->L4KILLTIMER = 0; //ITS TIMES IS ALSO ABOUT TO EXPIRE
CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE CLOSECURRENTSESSION(Partner); // CLOSE THIS ONE
} }
@ -1259,8 +978,6 @@ VOID L4TIMEOUT(TRANSPORTENTRY * L4)
{ {
// RETRIED N2 TIMES - FAIL LINK // RETRIED N2 TIMES - FAIL LINK
// if compressed session display stats
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT) CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
return; return;
} }
@ -1533,7 +1250,6 @@ VOID SENDL4DISC(TRANSPORTENTRY * Session)
MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG); MSG->LENGTH = (int)(&MSG->L4DATA[0] - (UCHAR *)MSG);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }
@ -1742,9 +1458,6 @@ VOID SendConACK(struct _LINKTABLE * LINK, TRANSPORTENTRY * L4, L3MESSAGEBUFFER *
if (BPQNODE) if (BPQNODE)
{ {
L3MSG->L4DATA[1] = L3LIVES; // Our TTL L3MSG->L4DATA[1] = L3LIVES; // Our TTL
if (L4->AllowCompress)
L3MSG->L4DATA[1] |= 0x80;
L3MSG->LENGTH++; L3MSG->LENGTH++;
} }
@ -1820,7 +1533,7 @@ int FINDCIRCUIT(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY ** REQL4, int * NewIndex
return FALSE; return FALSE;
} }
void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG) VOID L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
{ {
// EXCHANGE ORIGIN AND DEST // EXCHANGE ORIGIN AND DEST
@ -1835,7 +1548,7 @@ void L3SWAPADDRESSES(L3MESSAGEBUFFER * L3MSG)
L3MSG->L3SRCE[6] |= 1; // Set Last Call L3MSG->L3SRCE[6] |= 1; // Set Last Call
} }
void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG) VOID SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{ {
L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT L3MSG->L4FLAGS = L4CACK | L4BUSY; // REJECT
L3MSG->L4DATA[0] = 0; // WINDOW L3MSG->L4DATA[0] = 0; // WINDOW
@ -1846,25 +1559,6 @@ void SendConNAK(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
C_Q_ADD(&LINK->TX_Q, L3MSG); C_Q_ADD(&LINK->TX_Q, L3MSG);
} }
VOID SendL4RESET(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG)
{
// Paula's extension
L3MSG->L4FLAGS = L4RESET;
L3SWAPADDRESSES(L3MSG);
L3MSG->L3TTL = L3LIVES;
L3MSG->LENGTH = (int)(&L3MSG->L4DATA[0] - (UCHAR *)L3MSG);
C_Q_ADD(&LINK->TX_Q, L3MSG);
}
VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE) TRANSPORTENTRY * L4, char * BPQPARAMS, int ApplMask, int * BPQNODE)
{ {
@ -1879,7 +1573,6 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
L4->CIRCUITID = NEXTID; L4->CIRCUITID = NEXTID;
NEXTID++; NEXTID++;
if (NEXTID == 0) if (NEXTID == 0)
NEXTID++; // kEEP nON-ZERO NEXTID++; // kEEP nON-ZERO
@ -1907,15 +1600,7 @@ VOID SETUPNEWCIRCUIT(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG,
if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39) if (L3MSG->LENGTH == MSGHDDRLEN + 38 || L3MSG->LENGTH == MSGHDDRLEN + 39)
{ {
*BPQNODE = 1; *BPQNODE = 1;
memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36)); memcpy(BPQPARAMS, &L3MSG->L4DATA[15],L3MSG->LENGTH - (MSGHDDRLEN + 36));
// 40 bit of 2nd byte is Compress Flag
if (BPQPARAMS[1] & 0x40 && L4Compress)
L4->AllowCompress = 1;
BPQPARAMS[1] &= 0xf; // Only bottom bit is significant in Timeeout field
} }
L4->L4CIRCUITTYPE = SESSION | UPLINK; L4->L4CIRCUITTYPE = SESSION | UPLINK;
@ -1973,7 +1658,7 @@ TryAgain:
{ {
SHORT T1; SHORT T1;
DEST->DEST_STATE |= 0x40; // SET BPQ NODE BIT DEST->DEST_STATE |= 0x40; // SET BPQ _NODE BIT
memcpy((char *)&T1, BPQPARAMS, 2); memcpy((char *)&T1, BPQPARAMS, 2);
if (T1 > 300) if (T1 > 300)
@ -2059,45 +1744,19 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// OTHERS NEED A SESSION // OTHERS NEED A SESSION
if (Opcode == L4RESET)
{
// Paula's extension - other end dosn't know about session so disconnect
// A reset has our far index and id, not our index and id so have to search table for L4 entry
int n = MAXCIRCUITS;
L4 = L4TABLE;
while (n--)
{
if (L4->L4USER[0] && L4->FARID == L3MSG->L4ID && L4->FARINDEX == L3MSG->L4INDEX)
{
// Check L3 source call to be sure (should that be L4 source call??
L3MSG->L3SRCE[6] &= 0xfe; // mask end of call
if (memcmp(L3MSG->L3SRCE, L4->L4TARGET.DEST->DEST_CALL, 7) == 0)
{
CloseSessionPartner(L4); // SEND CLOSE TO PARTNER (IF PRESENT)
}
ReleaseBuffer(L3MSG);
return;
}
L4++;
}
ReleaseBuffer(L3MSG);
return;
}
if (L3MSG->L4INDEX < MAXCIRCUITS)
L4 = &L4TABLE[L3MSG->L4INDEX]; L4 = &L4TABLE[L3MSG->L4INDEX];
// If wrong ID or not an L4 session we must have restarted or cleared session if (L4->CIRCUITID!= L3MSG->L4ID)
if (L4 == 0 || L4->CIRCUITID != L3MSG->L4ID || (L4->L4CIRCUITTYPE & SESSION) == 0)
{ {
SendL4RESET(LINK, L3MSG); // Paula's extension ReleaseBuffer(L3MSG);
return;
}
if ((L4->L4CIRCUITTYPE & SESSION) == 0)
{
// Not an L4 Session - must be an old connection
ReleaseBuffer(L3MSG);
return; return;
} }
@ -2115,12 +1774,6 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg if (L3MSG->LENGTH > MSGHDDRLEN + 22) // Standard Msg
{ {
if (L3MSG->L4DATA[1] & 0x80) // Compress Flag
{
L4->AllowCompress = 1;
L3MSG->L4DATA[1] &= 0x7f;
}
DEST->DEST_STATE &= 0x80; DEST->DEST_STATE &= 0x80;
DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40 DEST->DEST_STATE |= (L3MSG->L4DATA[1] - L3MSG->L3TTL) + 0x41; // Hops to dest + x40
} }
@ -2221,19 +1874,6 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
return; return;
} }
// Randomly drop packets
/*
Debugprintf("L4 Test Received packet %d ", L3MSG->L4TXNO);
if ((rand() % 7) > 5)
{
Debugprintf("L4 Test Drop packet %d ", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG);
return;
}
*/
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
// If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES // If DISCPENDING or STATE IS 4, THEN SESSION IS CLOSING - IGNORE ANY I FRAMES
@ -2258,7 +1898,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// FRAME IS A REPEAT // FRAME IS A REPEAT
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("L4 Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("Discarding repeated frame seq %d from %s", L3MSG->L4TXNO, Call);
L4->L4ACKREQ = 1; L4->L4ACKREQ = 1;
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
@ -2271,14 +1911,15 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
// AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES // AND KEEP THIS FRAME UNTIL MISSING ONE ARRIVES
L4->NAKBITS |= L4NAK; // SET NAK REQUIRED L4->NAKBITS |= L4NAK; // SET NAK REQUIRED
SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES SENDL4IACK(L4); // SEND DATA ACK COMMAND TO ACK OUTSTANDING FRAMES
// SEE IF WE ALREADY HAVE A COPY OF THIS ONE // SEE IF WE ALREADY HAVE A COPY OF THIS ONE
/*
Saved = L4->L4RESEQ_Q; Saved = L4->L4RESEQ_Q;
Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0; Call[ConvFromAX25(L3MSG->L3SRCE, Call)] = 0;
Debugprintf("L4 Out Of Seq saving seq %d from %s", L3MSG->L4TXNO, Call); Debugprintf("saving seq %d from %s", L3MSG->L4TXNO, Call);
while (Saved) while (Saved)
{ {
@ -2286,7 +1927,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
{ {
// ALREADY HAVE A COPY - DISCARD IT // ALREADY HAVE A COPY - DISCARD IT
Debugprintf("L4 Already have seq %d - discarding", L3MSG->L4TXNO); Debugprintf("Already have seq %d - discarding", L3MSG->L4TXNO);
ReleaseBuffer(L3MSG); ReleaseBuffer(L3MSG);
return; return;
} }
@ -2296,6 +1937,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN C_Q_ADD(&L4->L4RESEQ_Q, L3MSG); // ADD TO CHAIN
return; return;
*/
} }
// Frame is OK // Frame is OK
@ -2324,122 +1966,15 @@ L4INFO_OK:
L3MSG->L3PID = 0xF0; // Normal Data PID L3MSG->L3PID = 0xF0; // Normal Data PID
// if compressed, expand
if ((L3MSG->L4FLAGS & L4COMP) == 0)
{
// Not Compressed
L4->Received += L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->ReceivedAfterExpansion += L3MSG->LENGTH - MSGHDDRLEN - 1;
memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *))); memmove(L3MSG->L3SRCE, L3MSG->L4DATA, L3MSG->LENGTH - (4 + sizeof(void *)));
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
}
else
{
char Buffer[8192];
int Len;
int outLen;
int sendLen;
char * sendptr;
int savePort = L3MSG->Port;
// May be more thsn one packet
Len = L3MSG->LENGTH - MSGHDDRLEN - 1;
L4->Received += Len;
if (L3MSG->L4FLAGS & L4MORE)
{
if (L4->unCompressLen == 0)
{
// New packet
L4->unCompress = malloc(8192);
}
// Save data
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
ReleaseBuffer(L3MSG);
goto checkReseq;
}
if (L4->unCompressLen)
{
// Already have some data - add this to it
memcpy(&L4->unCompress[L4->unCompressLen], L3MSG->L4DATA, Len);
L4->unCompressLen += Len;
Len = doinflate(L4->unCompress, Buffer, L4->unCompressLen, 8192, &outLen);
}
else
{
// Just inflate this bit
Len = doinflate(L3MSG->L4DATA, Buffer, L3MSG->LENGTH - MSGHDDRLEN - 1, 8192, &outLen);
}
free(L4->unCompress);
L4->unCompress = 0;
L4->unCompressLen = 0;
sendLen = outLen;
sendptr = Buffer;
L4->ReceivedAfterExpansion += outLen;
// Send first bit in input buffer. If still some left get new buffers for it
if (sendLen > 236)
sendLen = 236;
memcpy(L3MSG->L3SRCE, sendptr, sendLen); // Converting to DATAMESSAGE format
L3MSG->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
outLen -= sendLen;
sendptr += sendLen;
while (outLen > 0)
{
sendLen = outLen;
if (sendLen > 236)
sendLen = 236;
Msg = GetBuff();
if (Msg)
{
// Just ignore if no buffers - shouldn't happen
Msg->PID = 240;
Msg->PORT = savePort;
memcpy(Msg->L2DATA, sendptr, sendLen);
Msg->LENGTH = sendLen + MSGHDDRLEN + 1;
IFRM150(L4, Msg); // CHECK IF SETTING UP AND PASS ON
}
outLen -= sendLen;
sendptr += sendLen;
}
}
L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT)
REFRESHROUTE(L4); REFRESHROUTE(L4);
L4->L4ACKREQ = L4DELAY; // SEND INFO ACK AFTER L4DELAY (UNLESS I FRAME SENT)
IFRM150(L4, (PDATAMESSAGE)L3MSG); // CHECK IF SETTING UP AND PASS ON
// See if anything on reseq Q to process // See if anything on reseq Q to process
checkReseq:
if (L4->L4RESEQ_Q == 0) if (L4->L4RESEQ_Q == 0)
return; return;
@ -2458,11 +1993,11 @@ checkReseq:
OLDFRAMES++; // COUNT FOR STATS OLDFRAMES++; // COUNT FOR STATS
L3MSG = Saved; L3MSG = Saved;
Debugprintf("L4 Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG); Debugprintf("Processing Saved Message %d Address %x", L4->RXSEQNO, L3MSG);
goto L4INFO_OK; goto L4INFO_OK;
} }
Debugprintf("L4 Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved); Debugprintf("Message %d %x still on Reseq Queue", Saved->L4TXNO, Saved);
Prev = &Saved; Prev = &Saved;
Saved = Saved->Next; Saved = Saved->Next;
@ -2475,9 +2010,7 @@ checkReseq:
ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO); ACKFRAMES(L3MSG, L4, L3MSG->L4RXNO);
REFRESHROUTE(L4); REFRESHROUTE(L4);
ReleaseBuffer(L3MSG); // Drop Through
return;
} }
// Unrecognised - Ignore // Unrecognised - Ignore
@ -2533,15 +2066,11 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
RTT = GetTickCount() - L4->RTT_TIMER; RTT = GetTickCount() - L4->RTT_TIMER;
if (RTT < 180000) // Sanity Check
{
if (DEST->DEST_RTT == 0) if (DEST->DEST_RTT == 0)
DEST->DEST_RTT = RTT; DEST->DEST_RTT = RTT;
else else
DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New DEST->DEST_RTT = ((DEST->DEST_RTT * 9) + RTT) /10; // 90% Old + New
} }
L4->RTT_TIMER = 0;
}
} }
L4->L4WS++; L4->L4WS++;
@ -2577,7 +2106,7 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message L4->FLAGS |= L3MSG->L4FLAGS & L4BUSY; // Get Busy flag from message
if ((L3MSG->L4FLAGS & L4NAK) == 0) if ((L3MSG->L4FLAGS & L4NAK) == 0)
return; // Dont send while busy unless NAK received return; // Dont send while biust unless NAC received
} }
if (L3MSG->L4FLAGS & L4NAK) if (L3MSG->L4FLAGS & L4NAK)
@ -2605,6 +2134,17 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
VOID SENDL4IACK(TRANSPORTENTRY * Session) VOID SENDL4IACK(TRANSPORTENTRY * Session)
{ {
// SEND INFO ACK // SEND INFO ACK
@ -2628,7 +2168,6 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->L4TXNO = 0; MSG->L4TXNO = 0;
MSG->L4RXNO = Session->RXSEQNO; MSG->L4RXNO = Session->RXSEQNO;
Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED Session->L4LASTACKED = Session->RXSEQNO; // SAVE LAST NUMBER ACKED
@ -2636,10 +2175,7 @@ VOID SENDL4IACK(TRANSPORTENTRY * Session)
MSG->LENGTH = MSGHDDRLEN + 22; MSG->LENGTH = MSGHDDRLEN + 22;
// Debugprintf("Sending L4 IACK %d %x", MSG->L4RXNO, MSG->L4FLAGS);
C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG); C_Q_ADD(&DEST->DEST_Q, (UINT *)MSG);
} }

2154
LinBPQ-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -381,11 +381,12 @@ BOOL CtrlHandler(DWORD fdwCtrlType)
#include <signal.h> #include <signal.h>
// Linux Signal Handlers // Linux Signal Handlers
static void segvhandler(int sig) static void segvhandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGSEGV Received\n"; char msg[] = "SIGSEGV Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
@ -396,9 +397,6 @@ static void segvhandler(int sig)
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1); exit(1);
} }
@ -406,23 +404,18 @@ static void abrthandler(int sig)
{ {
void *array[10]; void *array[10];
size_t size; size_t size;
char msg[] = "\nSIGABRT Received\n"; char msg[] = "SIGABRT Received\n";
write(STDERR_FILENO, msg, strlen(msg)); write(STDERR_FILENO, msg, strlen(msg));
write(STDOUT_FILENO, msg, strlen(msg));
// get void*'s for all entries on the stack // get void*'s for all entries on the stack
size = backtrace(array, 10); size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO); backtrace_symbols_fd(array, size, STDERR_FILENO);
write(STDOUT_FILENO, msg, strlen(msg));
backtrace_symbols_fd(array, size, STDOUT_FILENO);
exit(1); exit(1);
} }
static void sigterm_handler(int sig) static void sigterm_handler(int sig)
{ {
syslog(LOG_INFO, "terminating on SIGTERM\n"); syslog(LOG_INFO, "terminating on SIGTERM\n");
@ -794,8 +787,6 @@ int Redirected = 0;
static void segvhandler(int sig); static void segvhandler(int sig);
static void abrthandler(int sig); static void abrthandler(int sig);
void GetRestartData();
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
@ -854,8 +845,6 @@ int main(int argc, char * argv[])
printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring); printf("G8BPQ AX25 Packet Switch System Version %s %s\n", TextVerstring, Datestring);
printf("%s\n", VerCopyright); printf("%s\n", VerCopyright);
srand(time(NULL));
// look for optarg format parameters // look for optarg format parameters
@ -1185,8 +1174,6 @@ int main(int argc, char * argv[])
chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO); chmod(MailDir, S_IRWXU | S_IRWXG | S_IRWXO);
#endif #endif
// Make backup copies of Databases // Make backup copies of Databases
// CopyConfigFile(ConfigName); // CopyConfigFile(ConfigName);
@ -1208,7 +1195,6 @@ int main(int argc, char * argv[])
GetBadWordFile(); GetBadWordFile();
GetHTMLForms(); GetHTMLForms();
GetPGConfig(); GetPGConfig();
GetRestartData();
// Make sure there is a user record for the BBS, with BBS bit set. // Make sure there is a user record for the BBS, with BBS bit set.
@ -1456,7 +1442,6 @@ int main(int argc, char * argv[])
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveConfig(ConfigName); SaveConfig(ConfigName);
SaveRestartData();
} }
KEEPGOING--; // Give time for links to close KEEPGOING--; // Give time for links to close

View File

@ -407,10 +407,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -713,7 +710,7 @@ void * MPSKExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_MPSK; TNC->Hardware = H_MPSK;
MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; MPSKChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;
@ -1542,7 +1539,7 @@ VOID CloseComplete(struct TNCINFO * TNC, int Stream)
sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode); sprintf(Cmd, "%cDIGITAL MODE %s\x1b", '\x1a', TNC->MPSKInfo->DefaultMode);
if (TNC->MPSKInfo->Beacon) if (TNC->MPSKInfo->Beacon)
sprintf(&Cmd[strlen(Cmd)], "%cBEACON_ARQ_FAE\x1b", '\x1a'); sprintf(Cmd, "%s%cBEACON_ARQ_FAE\x1b", Cmd, '\x1a');
Len = strlen(Cmd); Len = strlen(Cmd);

View File

@ -1570,12 +1570,12 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", &Addr[4]); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, &Addr[4]);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s@%s\r\n", &Addr[4], Via); ToLen = sprintf(ToString, "%sTo: %s@%s\r\n", ToString, &Addr[4], Via);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;
} }
@ -1591,7 +1591,7 @@ VOID ProcessSMTPServerMessage(SocketConn * sockptr, char * Buffer, int Len)
if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here if (CheckifLocalRMSUser(Addr)) // if local RMS - Leave Here
continue; continue;
ToLen = sprintf(&ToString[strlen(ToString)], "To: %s\r\n", Addr); ToLen = sprintf(ToString, "%sTo: %s\r\n", ToString, Addr);
*sockptr->RecpTo[i] = 0; // So we dont create individual one later *sockptr->RecpTo[i] = 0; // So we dont create individual one later
continue; continue;

View File

@ -535,16 +535,6 @@ KC6OAR*>ID:
Output += sprintf((char *)Output, " RX Window=%d", value); Output += sprintf((char *)Output, " RX Window=%d", value);
break; break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
} }
} }
} }
@ -561,15 +551,6 @@ KC6OAR*>ID:
switch (ADJBUFFER->PID) switch (ADJBUFFER->PID)
{ {
case 0xF1:
case 0xF2:
// Compressed L2 Data
Output += sprintf((char *)Output, " <%d Bytes of Compressed L2 Data>", MsgLen - (19 + sizeof(void *)));
break;
case 0xF0: // Normal Data case 0xF0: // Normal Data
{ {
char Infofield[257]; char Infofield[257];
@ -747,10 +728,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
return Output + sprintf((char *)Output, " <DISC ACK>"); return Output + sprintf((char *)Output, " <DISC ACK>");
case L4RESET:
return Output + sprintf((char *)Output, " <RESET>");
case L4INFO: case L4INFO:
{ {
char Infofield[257]; char Infofield[257];
@ -769,9 +746,6 @@ char * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen)
if (Flags & L4MORE) if (Flags & L4MORE)
*(Output++) = 'M'; *(Output++) = 'M';
if (Flags & L4COMP)
*(Output++) = 'C';
MsgLen = MsgLen - (19 + sizeof(void *)); MsgLen = MsgLen - (19 + sizeof(void *));
if (MsgLen < 0 || MsgLen > 257) if (MsgLen < 0 || MsgLen > 257)

View File

@ -919,9 +919,6 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
DoRefresh(Cinfo); DoRefresh(Cinfo);
Cinfo->Console->bytesRxed += Cinfo->kbptr+1;
if (Cinfo->Console->SysopChatStream) if (Cinfo->Console->SysopChatStream)
SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1); SendUnbuffered(Cinfo->Console->SysopChatStream->BPQStream, &Cinfo->kbbuf[0], Cinfo->kbptr+1);
else else

641
RHP-skigdebian.c Normal file
View File

@ -0,0 +1,641 @@
/*
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
*/
/*
Paula (G8PZT)'s Remote Host Protocol interface.
For now only sufficient support for WhatsPac
*/
#define _CRT_SECURE_NO_DEPRECATE
#include "cheaders.h"
#include "bpq32.h"
int FindFreeStreamNoSem();
DllExport int APIENTRY DeallocateStream(int stream);
int SendMsgNoSem(int stream, char * msg, int len);
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len);
static int GetJSONInt(char * _REPLYBUFFER, char * Name);
// Generally Can have multiple RHP connections and each can have multiple RHF Sessions
struct RHPSessionInfo
{
SOCKET Socket; // Websocks Socket
int BPQStream;
int Handle; // RHP session ID
int Seq;
char Local[12];
char Remote[12];
BOOL Connecting; // Set while waiting for connection to complete
BOOL Listening;
BOOL Connected;
};
struct RHPConnectionInfo
{
SOCKET socket;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
};
struct RHPConnectionInfo ** RHPSockets = NULL;
int NumberofRHPConnections = 0;
struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions;
char ErrCodes[18][24] =
{"Ok", "Unspecified", "Bad or missing type", "Invalid handle", "No memory", "Bad or missing mode",
"Invalid local address",
"Invalid remote address" ,
"Bad or missing family" ,
"Duplicate socket" ,
"No such port" ,
"Invalid protocol" ,
"Bad parameter" ,
"No buffers" ,
"Unauthorised" ,
"No Route" ,
"Operation not supported"};
extern char pgm[256];
SOCKET agwsock;
extern int SemHeldByAPI;
char szBuff[80];
int WhatsPacConfigured = 1;
int RHPPaclen = 236;
int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer);
void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
{
int Loops = 0;
int Sent;
int TxLen;
char * OutBuffer = Msg;
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
if (Len < 126)
{
// Two Byte Header
OutBuffer[8] = 0x81; // Fin, Data
OutBuffer[9] = Len;
TxLen = Len + 2;
OutBuffer = &Msg[8];
}
else if (Len < 65536)
{
OutBuffer[6] = 0x81; // Fin, Data
OutBuffer[7] = 126; // Unmasked, Extended Len 16
OutBuffer[8] = Len >> 8;
OutBuffer[9] = Len & 0xff;
TxLen = Len + 4;
OutBuffer = &Msg[6];
}
else
{
OutBuffer[0] = 0x81; // Fin, Data
OutBuffer[1] = 127; // Unmasked, Extended Len 64 bits
// Len is 32 bits, so pad with zeros
OutBuffer[2] = 0;
OutBuffer[3] = 0;
OutBuffer[4] = 0;
OutBuffer[5] = 0;
OutBuffer[6] = (Len >> 24) & 0xff;
OutBuffer[7] = (Len >> 16) & 0xff;
OutBuffer[8] = (Len >> 8) & 0xff;
OutBuffer[9] = Len & 0xff;
TxLen = Len + + 10;
OutBuffer = &Msg[0];
}
// Send may block
Sent = send(socket, OutBuffer, TxLen, 0);
while (Sent != TxLen && Loops++ < 3000) // 100 secs max
{
if (Sent > 0) // something sent
{
TxLen -= Sent;
memmove(OutBuffer, &OutBuffer[Sent], TxLen);
}
Sleep(30);
Sent = send(socket, OutBuffer, TxLen, 0);
if (Sent == -1)
break;
}
free(Msg);
return;
}
int RHPProcessHTTPMessage(struct ConnectionInfo * conn, char * response, char * Method, char * URL, char * request, BOOL LOCAL, BOOL COOKIE)
{
// RHP messages can be sent over Websocks or normal http but I think WhatsPac only uses WebSocks
return 0;
}
void ProcessRHPWebSock(SOCKET socket, char * Msg, int MsgLen)
{
int Loops = 0;
int InputLen = 0;
int Len;
char Value[16];
char * OutBuffer = malloc(250000);
struct RHPConnectionInfo * RHPSocket = NULL;
int n;
Msg[MsgLen] = 0;
// Find Connection Record. If none, create one
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]->socket == socket)
{
RHPSocket = RHPSockets[n];
break;
}
}
if (RHPSocket == 0)
{
NumberofRHPConnections;
RHPSockets = realloc(RHPSockets, sizeof(void *) * (NumberofRHPConnections + 1));
RHPSocket = RHPSockets[NumberofRHPConnections] = zalloc(sizeof (struct RHPConnectionInfo));
NumberofRHPConnections++;
RHPSocket->socket = socket;
}
// {"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
// {"type": "openReply", "id": 82, "handle": 1, "errCode": 0, "errText": "Ok"}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 0}
// ("seqno": 1, "type": "close", "handle": 1}
// {"id":40,"type":"close","handle":1}
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
// {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
GetJSONValue(Msg, "\"type\":", Value, 15);
if (_stricmp(Value, "open") == 0)
{
Len = processRHCPOpen(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
if (Len)
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "send") == 0)
{
Len = processRHCPSend(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "close") == 0)
{
Len = processRHCPClose(RHPSocket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(RHPSocket->socket, OutBuffer, Len);
return;
}
Debugprintf(Msg);
}
void ProcessRHPWebSockClosed(SOCKET socket)
{
// Close any connections on this scoket and delete socket entry
struct RHPConnectionInfo * RHPSocket = NULL;
int n;
// Find Connection Record. CLear any Sessions
for (n = 0; n < NumberofRHPConnections; n++)
{
if (RHPSockets[n]->socket == socket)
{
RHPSocket = RHPSockets[n];
break;
}
}
}
int processRHCPOpen(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
struct RHPSessionInfo * RHPSession = 0;
char * Value = malloc(strlen(Msg)); // Will always be long enough
int ID;
char pfam[16];
char Mode[16];
int Port;
char Local[16];
char Remote[16];
int flags;
int Handle = 1;
int Stream;
unsigned char AXCall[10];
int Len;
int n;
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
ID = GetJSONInt(Msg, "\"id\":");
GetJSONValue(Msg, "\"pfam\":", pfam, 15);
GetJSONValue(Msg, "\"mode\":", Mode, 15);
Port = GetJSONInt(Msg, "\"port\":");
GetJSONValue(Msg, "\"local\":", Local, 15);
GetJSONValue(Msg, "\"remote\":", Remote, 15);
flags = GetJSONInt(Msg, "\"flags\":");
if (_stricmp(pfam, "ax25") != 0)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
if (_stricmp(Mode, "stream") == 0)
{
{
// Allocate a RHP Session
// See if there is an old one we can reuse
for (n = 0; n < NumberofRHPSessions; n++)
{
if (RHPSessions[n]->BPQStream == 0)
{
RHPSession = RHPSessions[n];
Handle = n + 1;
Stream = RHPSessions[n]->BPQStream;
break;
}
}
if (RHPSession == 0)
{
RHPSessions = realloc(RHPSessions, sizeof(void *) * (NumberofRHPSessions + 1));
RHPSession = RHPSessions[NumberofRHPSessions] = zalloc(sizeof (struct RHPSessionInfo));
NumberofRHPSessions++;
Handle = NumberofRHPSessions;
}
strcpy(pgm, "RHP");
Stream = FindFreeStreamNoSem();
strcpy(pgm, "bpq32.exe");
if (Stream == 255)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
RHPSession->BPQStream = Stream;
RHPSession->Handle = Handle;
RHPSession->Connecting = TRUE;
RHPSession->Socket = RHPSocket->socket;
strcpy(RHPSession->Local, Local);
strcpy(RHPSession->Remote, Remote);
Connect(Stream);
ConvToAX25(Local, AXCall);
ChangeSessionCallsign(Stream, AXCall);
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\"}", ID, Handle);
}
}
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
}
int processRHCPSend(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
// {"type":"send","handle":1,"data":";;;;;;\r","id":70}
struct RHPSessionInfo * RHPSession;
int ID;
char * Data;
char * ptr;
int c;
int Len;
int Handle = 1;
Data = malloc(strlen(Msg));
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
GetJSONValue(Msg, "\"data\":", Data, strlen(Msg) - 1);
if (Handle < 1 || Handle > NumberofRHPSessions)
{
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
}
RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes
ptr = Data;
while (ptr = strchr(ptr, '\\'))
{
c = ptr[1];
switch (c)
{
case 'r':
*ptr = 13;
break;
case '\\':
*ptr = '\\';
break;
case '"':
*ptr = '"';
break;
}
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++;
}
Debugprintf(Data);
Len = strlen(Data);
ptr = Data;
while (Len > RHPPaclen)
{
SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
Len -= RHPPaclen;
ptr += RHPPaclen;
}
SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
}
int processRHCPClose(struct RHPConnectionInfo * RHPSocket, char * Msg, char * ReplyBuffer)
{
// {"id":70,"type":"close","handle":1}
struct RHPSessionInfo * RHPSession;
int ID;
int Handle = 1;
char * OutBuffer = malloc(256);
ID = GetJSONInt(Msg, "\"id\":");
Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
RHPSession = RHPSessions[Handle - 1];
Disconnect(RHPSession->BPQStream);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
}
void RHPPoll()
{
int Stream;
int n;
int state, change;
int Len;
char * RHPMsg;
unsigned char Buffer[1024]; // Space to escape control chars
int pktlen, count;
struct RHPSessionInfo * RHPSession;
for (n = 0; n < NumberofRHPSessions; n++)
{
RHPSession = RHPSessions[n];
Stream = RHPSession->BPQStream;
// See if connected state has changed
SessionState(Stream, &state, &change);
if (change == 1)
{
if (state == 1)
{
// Connected
RHPSession->Seq = 0;
RHPSession->Connecting = FALSE;
RHPSession->Connected = TRUE;
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
// Send RHP CTEXT
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"Connected to RHP Server\\r\"}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
else
{
// Disconnected. Send Close to client
RHPMsg = malloc(256);
Len = sprintf(&RHPMsg[10], "{\"type\": \"close\", \"seqno\": %d, \"handle\": %d}", RHPSession->Seq++, RHPSession->Handle);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
RHPSession->Connected = 0;
RHPSession->Connecting = 0;
DeallocateStream(RHPSession->BPQStream);
RHPSession->BPQStream = 0;
}
}
do
{
GetMsg(Stream, Buffer, &pktlen, &count);
if (pktlen > 0)
{
char * ptr = Buffer;
char c;
Buffer[pktlen] = 0;
// Message is JSON so Convert CR to \r, \ to \\ " to \"
while (c = *(ptr))
{
switch (c)
{
case 13:
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = 'r';
break;
case '"':
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = '"';
break;
case '\\':
memmove(ptr + 2, ptr + 1, strlen(ptr));
*(ptr++) = '\\';
*(ptr++) = '\\';
break;
}
ptr++;
}
RHPMsg = malloc(1024);
Len = sprintf(&RHPMsg[10], "{\"seqno\": %d, \"type\": \"recv\", \"handle\": %d, \"data\": \"%s\"}", RHPSession->Seq++, RHPSession->Handle, Buffer);
SendWebSockMessage(RHPSession->Socket, RHPMsg, Len);
}
}
while (count > 0);
}
}
static void GetJSONValue(char * _REPLYBUFFER, char * Name, char * Value, int Len)
{
char * ptr1, * ptr2;
Value[0] = 0;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return;
ptr1 += (strlen(Name) + 1);
// "data":"{\"t\":\"c\",\"n\":\"John\",\"c\":\"G8BPQ\",\"lm\":1737912636,\"le\":1737883907,\"led\":1737758451,\"v\":0.33,\"cc\":[{\"cid\":1,\"lp\":1737917257201,\"le\":1737913735726,\"led\":1737905249785},{\"cid\":0,\"lp\":1737324074107,\"le\":1737323831510,\"led\":1737322973662},{\"cid\":5,\"lp\":1737992107419,\"le\":1737931466510,\"led\":1737770056244}]}\r","id":28}
// There may be escaped " in data stream
ptr2 = strchr(ptr1, '"');
while (*(ptr2 - 1) == '\\')
{
ptr2 = strchr(ptr2 + 2, '"');
}
if (ptr2)
{
size_t ValLen = ptr2 - ptr1;
if (ValLen > Len)
ValLen = Len;
memcpy(Value, ptr1, ValLen);
Value[ValLen] = 0;
}
return;
}
static int GetJSONInt(char * _REPLYBUFFER, char * Name)
{
char * ptr1;
ptr1 = strstr(_REPLYBUFFER, Name);
if (ptr1 == 0)
return 0;
ptr1 += (strlen(Name));
return atoi(ptr1);
}

136
RHP.c
View File

@ -28,7 +28,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "cheaders.h" #include "cheaders.h"
#include "bpq32.h" #include "bpq32.h"
#include "telnetserver.h"
int FindFreeStreamNoSem(); int FindFreeStreamNoSem();
DllExport int APIENTRY DeallocateStream(int stream); DllExport int APIENTRY DeallocateStream(int stream);
@ -41,7 +40,6 @@ static int GetJSONInt(char * _REPLYBUFFER, char * Name);
struct RHPSessionInfo struct RHPSessionInfo
{ {
struct ConnectionInfo * sockptr;
SOCKET Socket; // Websocks Socket SOCKET Socket; // Websocks Socket
int BPQStream; int BPQStream;
int Handle; // RHP session ID int Handle; // RHP session ID
@ -51,7 +49,6 @@ struct RHPSessionInfo
BOOL Connecting; // Set while waiting for connection to complete BOOL Connecting; // Set while waiting for connection to complete
BOOL Listening; BOOL Listening;
BOOL Connected; BOOL Connected;
int Busy;
}; };
struct RHPConnectionInfo struct RHPConnectionInfo
@ -68,7 +65,6 @@ struct RHPParamBlock
unsigned char * Msg; unsigned char * Msg;
int Len; int Len;
SOCKET Socket; SOCKET Socket;
struct ConnectionInfo * sockptr;
}; };
@ -80,13 +76,8 @@ struct RHPSessionInfo ** RHPSessions;
int NumberofRHPSessions; int NumberofRHPSessions;
char ErrCodes[18][24] = char ErrCodes[18][24] =
{ {"Ok", "Unspecified", "Bad or missing type", "Invalid handle", "No memory", "Bad or missing mode",
"Ok",
"Unspecified",
"Bad or missing type",
"Invalid handle",
"No memory",
"Bad or missing mode",
"Invalid local address", "Invalid local address",
"Invalid remote address" , "Invalid remote address" ,
"Bad or missing family" , "Bad or missing family" ,
@ -116,10 +107,9 @@ int WhatsPacConfigured = 1;
int RHPPaclen = 236; int RHPPaclen = 236;
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer); int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer);
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer);
@ -132,6 +122,7 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
// WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len // WebSock Encode. Buffer has 10 bytes on front for header but header len depends on Msg len
if (Len < 126) if (Len < 126)
{ {
// Two Byte Header // Two Byte Header
@ -191,7 +182,7 @@ void SendWebSockMessage(SOCKET socket, char * Msg, int Len)
return; return;
} }
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen); void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen);
void RHPThread(void * Params) void RHPThread(void * Params)
{ {
@ -199,7 +190,7 @@ void RHPThread(void * Params)
struct RHPParamBlock * Block = (struct RHPParamBlock *)Params; struct RHPParamBlock * Block = (struct RHPParamBlock *)Params;
ProcessRHPWebSock(Block->sockptr, Block->Socket, Block->Msg, Block->Len); ProcessRHPWebSock(Block->Socket, Block->Msg, Block->Len);
free(Block->Msg); free(Block->Msg);
free(Params); free(Params);
@ -211,7 +202,7 @@ int RHPProcessHTTPMessage(void * conn, char * response, char * Method, char * UR
return 0; return 0;
} }
void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, int MsgLen) void ProcessRHPWebSock(SOCKET Socket, char * Msg, int MsgLen)
{ {
int Loops = 0; int Loops = 0;
int InputLen = 0; int InputLen = 0;
@ -273,14 +264,11 @@ void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Ms
// {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~. // {"seqno": 0, "type": "status", "handle": 1, "flags": 2}.~.
// {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}. // {"seqno": 1, "type": "recv", "handle": 1, "data": "Welcome to G8BPQ's Test Switch in Nottingham \rType ? for list of available commands.\r"}.
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 12, "errtext": "invalid handle"}. It
// {type: 'keepalive'} if there has been no other activity for nearly 3 minutes. Replies with {"type": "keepaliveReply"}
GetJSONValue(Msg, "\"type\":", Value, 15); GetJSONValue(Msg, "\"type\":", Value, 15);
if (_stricmp(Value, "open") == 0) if (_stricmp(Value, "open") == 0)
{ {
Len = processRHCPOpen(sockptr, Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header Len = processRHCPOpen(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
if (Len) if (Len)
SendWebSockMessage(Socket, OutBuffer, Len); SendWebSockMessage(Socket, OutBuffer, Len);
return; return;
@ -299,22 +287,7 @@ void ProcessRHPWebSock(struct ConnectionInfo * sockptr, SOCKET Socket, char * Ms
SendWebSockMessage(Socket, OutBuffer, Len); SendWebSockMessage(Socket, OutBuffer, Len);
return; return;
} }
Debugprintf(Msg);
if (_stricmp(Value, "status") == 0)
{
Len = processRHCPStatus(Socket, Msg, &OutBuffer[10]); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
if (_stricmp(Value, "keepalive") == 0)
{
Len = sprintf(&OutBuffer[10], "{\"type\": \"keepaliveReply\"}"); // Space at front for WebSock Header
SendWebSockMessage(Socket, OutBuffer, Len);
return;
}
Debugprintf("Unrecognised RHP Message - %s", Msg);
} }
void ProcessRHPWebSockClosed(SOCKET socket) void ProcessRHPWebSockClosed(SOCKET socket)
@ -353,7 +326,7 @@ void ProcessRHPWebSockClosed(SOCKET socket)
int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg, char * ReplyBuffer) int processRHCPOpen(SOCKET Socket, char * Msg, char * ReplyBuffer)
{ {
//{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128} //{"type":"open","id":5,"pfam":"ax25","mode":"stream","port":"1","local":"G8BPQ","remote":"G8BPQ-2","flags":128}
@ -371,7 +344,7 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
int Handle = 1; int Handle = 1;
int Stream; int Stream;
unsigned char AXCall[10]; unsigned char AXCall[10];
int Len;
int n; int n;
// ID seems to be used for control commands like open. SeqNo for data within a session (i Think! // ID seems to be used for control commands like open. SeqNo for data within a session (i Think!
@ -416,7 +389,7 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
} }
strcpy(pgm, "RHP"); strcpy(pgm, "RHP");
Stream = FindFreeStream(); Stream = FindFreeStreamNoSem();
strcpy(pgm, "bpq32.exe"); strcpy(pgm, "bpq32.exe");
if (Stream == 255) if (Stream == 255)
@ -426,7 +399,6 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
RHPSession->Handle = Handle; RHPSession->Handle = Handle;
RHPSession->Connecting = TRUE; RHPSession->Connecting = TRUE;
RHPSession->Socket = Socket; RHPSession->Socket = Socket;
RHPSession->sockptr = sockptr;
strcpy(RHPSession->Local, Local); strcpy(RHPSession->Local, Local);
strcpy(RHPSession->Remote, Remote); strcpy(RHPSession->Remote, Remote);
@ -451,13 +423,8 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
int ID; int ID;
char * Data; char * Data;
char * ptr; char * ptr;
unsigned char * uptr;
int c; int c;
int Len; int Len;
unsigned int HexCode1;
unsigned int HexCode2;
int n;
int Handle = 1; int Handle = 1;
@ -470,15 +437,14 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
if (Handle < 1 || Handle > NumberofRHPSessions) if (Handle < 1 || Handle > NumberofRHPSessions)
{ {
free(Data); free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle); return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
} }
RHPSession = RHPSessions[Handle - 1]; RHPSession = RHPSessions[Handle - 1];
// Look for \ escapes, Can now also get \u00c3 // Look for \ escapes
ptr = Data; ptr = Data;
Len = strlen(Data); // in case no escapes
while (ptr = strchr(ptr, '\\')) while (ptr = strchr(ptr, '\\'))
{ {
@ -489,70 +455,36 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
case 'r': case 'r':
*ptr = 13; *ptr = 13;
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case 'u':
HexCode1 = HexCode2 = 0;
n = toupper(ptr[2]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n << 4;
n = toupper(ptr[3]) - '0';
if (n > 9) n = n - 7;
HexCode1 |= n;
n = toupper(ptr[4]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n << 4;
n = toupper(ptr[5]) - '0';
if (n > 9) n = n - 7;
HexCode2 |= n;
if (HexCode1 == 0 || HexCode1 == 0xC2)
{
uptr = ptr;
*uptr = HexCode2;
}
else if (HexCode1 == 0xc2)
{
uptr = ptr;
*uptr = HexCode2 + 0x40;
}
memmove(ptr + 1, ptr + 6, strlen(ptr + 5));
break;
case '\\': case '\\':
*ptr = '\\'; *ptr = '\\';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
case '"': case '"':
*ptr = '"'; *ptr = '"';
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
break; break;
} }
memmove(ptr + 1, ptr + 2, strlen(ptr + 1));
ptr++; ptr++;
Len = ptr - Data;
} }
Debugprintf(Data);
Len = strlen(Data);
ptr = Data; ptr = Data;
while (Len > RHPPaclen) while (Len > RHPPaclen)
{ {
SendMsg(RHPSession->BPQStream, ptr, RHPPaclen); SendMsgNoSem(RHPSession->BPQStream, ptr, RHPPaclen);
Len -= RHPPaclen; Len -= RHPPaclen;
ptr += RHPPaclen; ptr += RHPPaclen;
} }
SendMsg(RHPSession->BPQStream, ptr, Len); SendMsgNoSem(RHPSession->BPQStream, ptr, Len);
free(Data); free(Data);
return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2); return sprintf(ReplyBuffer, "{\"type\": \"sendReply\", \"id\": %d, \"handle\": %d, \"errCode\": 0, \"errText\": \"Ok\", \"status\": %d}", ID, Handle, 2);
@ -576,7 +508,7 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
Handle = GetJSONInt(Msg, "\"handle\":"); Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions) if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", ID, Handle); return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 12, \"errtext\": \"Invalid handle\"}", ID, Handle);
RHPSession = RHPSessions[Handle - 1]; RHPSession = RHPSessions[Handle - 1];
@ -590,24 +522,6 @@ int processRHCPClose(SOCKET Socket, char * Msg, char * ReplyBuffer)
return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle); return sprintf(ReplyBuffer, "{\"id\": %d, \"type\": \"closeReply\", \"handle\": %d, \"errcode\": 0, \"errtext\": \"Ok\"}", ID, Handle);
} }
int processRHCPStatus(SOCKET Socket, char * Msg, char * ReplyBuffer)
{
// {"type": "status", "handle": 0}. XRouter will reply with {"type": "statusReply", "handle": 0, "errcode": 3, "errtext": "invalid handle"}. It
struct RHPSessionInfo * RHPSession;
int Handle = 0;
Handle = GetJSONInt(Msg, "\"handle\":");
if (Handle < 1 || Handle > NumberofRHPSessions)
return sprintf(ReplyBuffer, "{\"type\": \"statusReply\", \"handle\": %d, \"errcode\": 3, \"errtext\": \"Invalid handle\"}", Handle);
RHPSession = RHPSessions[Handle - 1];
return sprintf(ReplyBuffer, "{\"type\": \"status\", \"handle\": %d, \"flags\": 2}", RHPSession->Handle);
}
char toHex[] = "0123456789abcdef"; char toHex[] = "0123456789abcdef";
void RHPPoll() void RHPPoll()
@ -678,12 +592,9 @@ void RHPPoll()
Buffer[pktlen] = 0; Buffer[pktlen] = 0;
RHPSession->sockptr->LastSendTime = time(NULL);
// Message is JSON so Convert CR to \r, \ to \\ " to \" // Message is JSON so Convert CR to \r, \ to \\ " to \"
// Looks like I need to escape everything not between 0x20 and 0x7f eg \u00c3 // Looks like I need to escape everything not between 0x20 and 0x7f eg \U00c3
while (c = *(ptr)) while (c = *(ptr))
@ -738,6 +649,7 @@ void RHPPoll()
} }
while (count > 0); while (count > 0);
} }
} }

View File

@ -5286,12 +5286,8 @@ BOOL DecodeModePtr(char * Param, double * Dwell, double * Freq, char * Mode,
ptr = strtok_s(NULL, ",", &Context); ptr = strtok_s(NULL, ",", &Context);
if (ptr == NULL)
if (*MemoryNumber) // If channel, dont need mode
return TRUE;
if (ptr == NULL || strlen(ptr) > 8) if (ptr == NULL || strlen(ptr) > 8)
return FALSE; // Mode Missing return FALSE;
// If channel, dont need mode // If channel, dont need mode
@ -7397,8 +7393,6 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
int Interlock = RIG->Interlock; int Interlock = RIG->Interlock;
char PortString[128] = ""; char PortString[128] = "";
char TxPortString[128] = ""; char TxPortString[128] = "";
int n = 0;
int nn = 0;
// Find TNC ports in this Rig's scan group // Find TNC ports in this Rig's scan group
@ -7415,7 +7409,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
n += sprintf(&PortString[n], ",%d", p); sprintf(PortString, "%s,%d", PortString, p);
TNC->RIG = RIG; TNC->RIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)
@ -7425,7 +7419,7 @@ VOID SetupScanInterLockGroups(struct RIGINFO *RIG)
{ {
int p = PortRecord->PORTNUMBER; int p = PortRecord->PORTNUMBER;
RIG->BPQPort |= ((uint64_t)1 << p); RIG->BPQPort |= ((uint64_t)1 << p);
nn += sprintf(&TxPortString[nn], ",%d", p); sprintf(TxPortString, "%s,%d", TxPortString, p);
TNC->TXRIG = RIG; TNC->TXRIG = RIG;
if (RIG->PTTMode == 0 && TNC->PTTMode) if (RIG->PTTMode == 0 && TNC->PTTMode)

View File

@ -854,8 +854,7 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SCS;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SCS;
OpenLogFile(TNC->Port); OpenLogFile(TNC->Port);
CloseLogFile(TNC->Port); CloseLogFile(TNC->Port);
@ -886,6 +885,8 @@ void * SCSExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = CONLOCK; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0) if (PortEntry->PORTCONTROL.PORTINTERLOCK && TNC->RXRadio == 0 && TNC->TXRadio == 0)
TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK; TNC->RXRadio = TNC->TXRadio = PortEntry->PORTCONTROL.PORTINTERLOCK;

View File

@ -376,8 +376,7 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_TRKM;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRKM;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -393,6 +392,8 @@ void * TrackerMExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -666,8 +666,7 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_TRK;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TRK;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -683,6 +682,8 @@ void * TrackerExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else

View File

@ -508,10 +508,7 @@ ok:
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cnd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -773,9 +770,9 @@ VOID * SerialExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_SERIAL;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_SERIAL;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -322,9 +322,6 @@ Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT; EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
if (EXTPORT->UI_Q)
C_Q_ADD(&EXTPORT->UI_Q, Copy);
else
C_Q_ADD(&EXTPORT->UI_Q, Copy); C_Q_ADD(&EXTPORT->UI_Q, Copy);
return; return;
} }

7157
TelnetV6-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// Telnet Driver for BPQ Switch // Telnet Driver for BPQ Switch
// //
@ -114,7 +113,7 @@ extern int REALTIMETICKS;
#define MaxSockets 26 #define MaxSockets 26
struct UserRec RelayUser; struct UserRec RelayUser;
struct UserRec SyncUser = {"","Sync"}; struct UserRec SyncUser = {"","Sync"};;
struct UserRec CMSUser; struct UserRec CMSUser;
struct UserRec HostUser = {"","Host"}; struct UserRec HostUser = {"","Host"};
struct UserRec TriModeUser; struct UserRec TriModeUser;
@ -954,27 +953,13 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{ {
if (sockptr->WebSocks == 0) if (sockptr->WebSocks == 0)
{ {
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 150) // ~ 2.5 mins if (sockptr->LastSendTime && (REALTIMETICKS - sockptr->LastSendTime) > 1500) // ~ 2.5 mins
{ {
closesocket(sockptr->socket); closesocket(sockptr->socket);
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC); ShowConnections(TNC);
} }
} }
else if (memcmp(sockptr->WebURL, "rhp", 3) == 0)
{
// RHP Sockets (Used for WhatsPack) Need a timeout
// Normally keepalives are sent each way around every 9 mins
// Keepalives aren't sent when connecting so may need a bit longer
if (sockptr->LastSendTime && (time(NULL) - sockptr->LastSendTime) > 20 * 60) // 20mins
{
ProcessRHPWebSockClosed(sockptr->socket);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
}
} }
else else
{ {
@ -1189,7 +1174,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET; TNC->Hardware = H_TELNET;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
// Get Menu Handles // Get Menu Handles
@ -1464,12 +1449,13 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
TCP = TNC->TCPInfo; TCP = TNC->TCPInfo;
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET; TNC->Hardware = H_TELNET;
PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default PortEntry->MAXHOSTMODESESSIONS = TNC->TCPInfo->MaxSessions + 1; // Default
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] != 0) if (PortEntry->PORTCONTROL.PORTCALL[0] != 0)
ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall); ConvFromAX25(&PortEntry->PORTCONTROL.PORTCALL[0], TNC->NodeCall);
@ -2487,11 +2473,15 @@ nosocks:
if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT) if (sockptr->SocketActive && sockptr->Keepalive && L4LIMIT)
{ {
if ((time(NULL) - sockptr->LastSendTime) > (L4LIMIT - 60)) // PC Ticks are about 10% slow #ifdef WIN32
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 9) // PC Ticks are about 10% slow
#else
if ((REALTIMETICKS - sockptr->LastSendTime) > (L4LIMIT - 60) * 10)
#endif
{ {
// Send Keepalive // Send Keepalive
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
BuffertoNode(sockptr, "Keepalive\r", 10); BuffertoNode(sockptr, "Keepalive\r", 10);
} }
} }
@ -2621,7 +2611,7 @@ nosocks:
if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K') if (P3[0] == 'K' || P4[0] == 'K' || P5[0] == 'K' || P6[0] == 'K')
{ {
sockptr->Keepalive = TRUE; sockptr->Keepalive = TRUE;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
} }
if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S') if (P3[0] == 'S' || P4[0] == 'S' || P5[0] == 'S' || P6[0] == 'S')
@ -2853,7 +2843,7 @@ nosocks:
SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen); SendtoNode(TNC, Stream, &sockptr->FromHostBuffer[sockptr->FromHostBuffGetptr], Msglen);
sockptr->FromHostBuffGetptr += Msglen; sockptr->FromHostBuffGetptr += Msglen;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
} }
} }
} }
@ -3110,10 +3100,7 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
TNC = TNCInfo[n]; TNC = TNCInfo[n];
TNC->Port = n; TNC->Port = n;
TNC->PortRecord = PortRecord; TNC->Hardware = H_TELNET;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_TELNET;
TNC->hDlg = SavehDlg; TNC->hDlg = SavehDlg;
TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy TNC->RIG = &TNC->DummyRig; // Not using Rig control, so use Dummy
@ -3144,6 +3131,8 @@ LRESULT CALLBACK TelWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, "."); ModifyMenu(TCP->hDisMenu,i - 1 ,MF_BYPOSITION | MF_STRING,IDM_DISCONNECT + 1, ".");
} }
TNC->PortRecord = PortRecord;
Sleep(500); Sleep(500);
OpenSockets(TNC); OpenSockets(TNC);
OpenSockets6(TNC); OpenSockets6(TNC);
@ -3766,7 +3755,7 @@ MsgLoop:
BuffertoNode(sockptr, NodeLine, len); BuffertoNode(sockptr, NodeLine, len);
sockptr->InputLen = 0; sockptr->InputLen = 0;
ShowConnections(TNC); ShowConnections(TNC);;
return 0; return 0;
} }
@ -3940,7 +3929,7 @@ MsgLoop:
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC); ShowConnections(TNC);;
return 0; return 0;
} }
@ -4196,7 +4185,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
#ifndef LINBPQ #ifndef LINBPQ
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC); ShowConnections(TNC);;
return 0; return 0;
@ -4316,7 +4305,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL)); SendtoNode(TNC, sockptr->Number, TCP->RelayAPPL, (int)strlen(TCP->RelayAPPL));
ShowConnections(TNC); ShowConnections(TNC);;
return 0; return 0;
@ -4815,7 +4804,7 @@ MsgLoop:
ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr); ModifyMenu(TCP->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, MsgPtr);
#endif #endif
ShowConnections(TNC); ShowConnections(TNC);;
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
@ -4891,7 +4880,7 @@ MsgLoop:
WriteLog (logmsg); WriteLog (logmsg);
} }
ShowConnections(TNC); ShowConnections(TNC);;
InputLen=InputLen-(MsgLen+1); InputLen=InputLen-(MsgLen+1);
sockptr->InputLen=InputLen; sockptr->InputLen=InputLen;
@ -4989,7 +4978,6 @@ struct RHPParamBlock
unsigned char * Msg; unsigned char * Msg;
int Len; int Len;
SOCKET Socket; SOCKET Socket;
struct ConnectionInfo * sockptr;
}; };
@ -5119,7 +5107,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5132,13 +5120,10 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock)); struct RHPParamBlock * ParamBlock = malloc(sizeof(struct RHPParamBlock));
ParamBlock->sockptr = sockptr;
ParamBlock->Socket = sockptr->socket; ParamBlock->Socket = sockptr->socket;
ParamBlock->Len = Len; ParamBlock->Len = Len;
ParamBlock->Msg = malloc(Len + 10); ParamBlock->Msg = malloc(Len + 10);
memcpy(ParamBlock->Msg, Payload, Len); memcpy(ParamBlock->Msg, Payload, Len);
sockptr->LastSendTime = time(NULL);
_beginthread(RHPThread, 0, (VOID *)ParamBlock); _beginthread(RHPThread, 0, (VOID *)ParamBlock);
sockptr->InputLen = 0; sockptr->InputLen = 0;
@ -5146,13 +5131,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
} }
} }
else else
{
Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]); Debugprintf("WebSock Opcode %d Msg %s", Opcode, &MsgPtr[6]);
closesocket(sockptr->socket);
sockptr->SocketActive = FALSE;
ShowConnections(TNC);
}
sockptr->InputLen = 0; sockptr->InputLen = 0;
return 0; return 0;
@ -5179,7 +5158,7 @@ int DataSocket_ReadHTTP(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));
@ -5286,7 +5265,7 @@ int DataSocket_Disconnect(struct TNCINFO * TNC, struct ConnectionInfo * sockptr
ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, "."); ModifyMenu(TNC->TCPInfo->hDisMenu, n - 1, MF_BYPOSITION | MF_STRING, IDM_DISCONNECT + n, ".");
#endif #endif
sockptr->SocketActive = FALSE; sockptr->SocketActive = FALSE;
ShowConnections(TNC); ShowConnections(TNC);;
} }
return 0; return 0;
} }
@ -5473,7 +5452,8 @@ int WriteLog(char * msg)
strcat(Value, "logs/Telnet_"); strcat(Value, "logs/Telnet_");
} }
sprintf(&Value[strlen(Value)], "%02d%02d%02d.log", tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s%02d%02d%02d.log", Value,
tm->tm_year - 100, tm->tm_mon+1, tm->tm_mday);
if ((file = fopen(Value, "a")) == NULL) if ((file = fopen(Value, "a")) == NULL)
return FALSE; return FALSE;
@ -5528,7 +5508,8 @@ VOID WriteCMSLog(char * msg)
strcat(Value, "logs/CMSAccess"); strcat(Value, "logs/CMSAccess");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d%02d.log", tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday); sprintf(Value, "%s_%04d%02d%02d.log", Value,
tm->tm_year +1900, tm->tm_mon+1, tm->tm_mday);
Handle = fopen(Value, "ab"); Handle = fopen(Value, "ab");
@ -7173,7 +7154,7 @@ int DoRefreshWebMailIndex()
{ {
sockcopy = malloc(sizeof(struct ConnectionInfo)); sockcopy = malloc(sizeof(struct ConnectionInfo));
sockptr->TNC = TNC; sockptr->TNC = TNC;
sockptr->LastSendTime = time(NULL); sockptr->LastSendTime = REALTIMETICKS;
memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo)); memcpy(sockcopy, sockptr, sizeof(struct ConnectionInfo));

View File

@ -464,7 +464,7 @@ UINT UIARQExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UIARQ; TNC->Hardware = H_UIARQ;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;

View File

@ -685,11 +685,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ConnecttoUZ7HO(port); ConnecttoUZ7HO(port);
lasttime[port] = ltime; lasttime[port] = ltime;
} }
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
ReleaseBuffer(buffptr);
}
} }
else else
{ {
@ -1028,11 +1023,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1409,7 +1400,7 @@ void * UZ7HOExtInit(EXTPORTDATA * PortEntry)
ptr=strchr(TNC->NodeCall, ' '); ptr=strchr(TNC->NodeCall, ' ');
if (ptr) *(ptr) = 0; // Null Terminate if (ptr) *(ptr) = 0; // Null Terminate
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_UZ7HO; TNC->Hardware = H_UZ7HO;
UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65; UZ7HOChannel[port] = PortEntry->PORTCONTROL.CHANNELNUM-65;

9
V4.c
View File

@ -622,10 +622,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0) if (_memicmp(buff->L2DATA, "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(buff->L2DATA, "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(buff->L2DATA, "%d %s", TNC->Port, cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA)) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, buff->L2DATA))
{ {
@ -974,13 +971,13 @@ void * V4ExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_V4; TNC->Hardware = H_V4;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

38
VARA.c
View File

@ -1163,7 +1163,6 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
TNC->ARDOPBuffer = malloc(8192); TNC->ARDOPBuffer = malloc(8192);
TNC->ARDOPDataBuffer = malloc(8192); TNC->ARDOPDataBuffer = malloc(8192);
@ -1171,7 +1170,7 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = 1; TNC->WeStartedTNC = 1;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_VARA; TNC->Hardware = H_VARA;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1179,6 +1178,8 @@ void * VARAExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -1445,6 +1446,9 @@ VOID VARAThread(void * portptr)
return; return;
} }
// printf("Starting VARA Thread\n");
// if on Windows and Localhost see if TNC is running // if on Windows and Localhost see if TNC is running
#ifdef WIN32 #ifdef WIN32
@ -1560,11 +1564,14 @@ TNCRunning:
sinx.sin_addr.s_addr = INADDR_ANY; sinx.sin_addr.s_addr = INADDR_ANY;
sinx.sin_port = 0; sinx.sin_port = 0;
// printf("Trying to connect to VARA TNC\n");
if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0) if (connect(TNC->TCPSock,(LPSOCKADDR) &TNC->destaddr,sizeof(TNC->destaddr)) == 0)
{ {
// Connected successful // Connected successful
goto VConnected; goto VConnected;
} }
if (TNC->Alerted == FALSE) if (TNC->Alerted == FALSE)
@ -2223,7 +2230,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (App < 32) if (App < 32)
{ {
char AppName[13]; char AppName[13];
char AppBuffer[64];
memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12); memcpy(AppName, &ApplPtr[App * sizeof(struct CMDX)], 12);
AppName[12] = 0; AppName[12] = 0;
@ -2238,7 +2244,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (CheckAppl(TNC, AppName)) if (CheckAppl(TNC, AppName))
{ {
MsgLen = sprintf(AppBuffer, "%s\r", AppName); MsgLen = sprintf(Buffer, "%s\r", AppName);
buffptr = GetBuff(); buffptr = GetBuff();
@ -2248,9 +2254,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
} }
buffptr->Len = MsgLen; buffptr->Len = MsgLen;
memcpy(buffptr->Data, AppBuffer, MsgLen); memcpy(buffptr->Data, Buffer, MsgLen);
Debugprintf("Calling Application %s", AppBuffer);
C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr); C_Q_ADD(&TNC->WINMORtoBPQ_Q, buffptr);
@ -2425,7 +2429,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// return; // return;
} }
if (_memicmp(Buffer, "LINK REGISTERED", 9) == 0) if (_memicmp(Buffer, "REGISTERED", 9) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer)); WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
@ -2439,13 +2443,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
return; return;
} }
if (_memicmp(Buffer, "UNENCRYPTED LINK ", 11) == 0)
{
strcat(Buffer, "\r");
WritetoTrace(TNC, Buffer, (int)strlen(Buffer));
return;
}
if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0) if (_memicmp(Buffer, "MISSING SOUNDCARD", 17) == 0)
{ {
strcat(Buffer, "\r"); strcat(Buffer, "\r");
@ -2671,7 +2668,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
{ {
int InputLen, MsgLen; int InputLen, MsgLen;
char * ptr, * ptr2; char * ptr, * ptr2;
char Buffer[8192]; char Buffer[4096];
// shouldn't get several messages per packet, as each should need an ack // shouldn't get several messages per packet, as each should need an ack
// May get message split over packets // May get message split over packets
@ -2679,7 +2676,7 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
if (TNC->InputLen > 8000) // Shouldnt have packets longer than this if (TNC->InputLen > 8000) // Shouldnt have packets longer than this
TNC->InputLen=0; TNC->InputLen=0;
InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8191 - TNC->InputLen, 0); InputLen=recv(TNC->TCPSock, &TNC->ARDOPBuffer[TNC->InputLen], 8192 - TNC->InputLen, 0);
if (InputLen == 0 || InputLen == SOCKET_ERROR) if (InputLen == 0 || InputLen == SOCKET_ERROR)
{ {
@ -2702,18 +2699,12 @@ VOID VARAProcessReceivedControl(struct TNCINFO * TNC)
TNC->InputLen += InputLen; TNC->InputLen += InputLen;
TNC->ARDOPBuffer[TNC->InputLen] = 0;
Debugprintf("VARA Processing buffer - %s", TNC->ARDOPBuffer);
loop: loop:
ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen); ptr = memchr(TNC->ARDOPBuffer, '\r', TNC->InputLen);
if (ptr == 0) // CR in buffer if (ptr == 0) // CR in buffer
{
Debugprintf("VARA Part Packet Received - Waiting for rest");
return; // Wait for it return; // Wait for it
}
ptr2 = &TNC->ARDOPBuffer[TNC->InputLen]; ptr2 = &TNC->ARDOPBuffer[TNC->InputLen];
@ -2736,7 +2727,6 @@ loop:
if (TNC->InputLen < MsgLen) if (TNC->InputLen < MsgLen)
{ {
TNC->InputLen = 0; TNC->InputLen = 0;
Debugprintf("VARA Corrupt multi command input");
return; return;
} }
memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen); memmove(TNC->ARDOPBuffer, ptr + 1, TNC->InputLen-MsgLen);

125
Versions-skigdebian.h Normal file
View File

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

View File

@ -10,15 +10,14 @@
#endif #endif
#define KVers 6,0,24,71 #define KVers 6,0,24,59
#define KVerstring "6.0.24.71\0" #define KVerstring "6.0.24.59\0"
#ifdef CKernel #ifdef CKernel
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define Datestring "April 2025" #define Datestring "February 2025"
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring #define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0" #define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
#define VerDesc "BPQ32 Switch\0" #define VerDesc "BPQ32 Switch\0"

View File

@ -139,10 +139,6 @@ VOID WritetoTraceSupport(struct TNCINFO * TNC, char * Msg, int Len)
int LineLen, i; int LineLen, i;
UCHAR Save; UCHAR Save;
int SaveLen = Len; int SaveLen = Len;
char Time[16];
time_t T;
struct tm * tm;
if (Len < 0) if (Len < 0)
return; return;
@ -210,16 +206,10 @@ lineloop:
#endif #endif
// Write to Web Buffer // Write to Web Buffer
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, Line); strcat(TNC->WebBuffer, Line);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
Skip: Skip:
ptr1 = ptr2; ptr1 = ptr2;
@ -258,16 +248,10 @@ lineloop:
#else #else
index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 ); index=SendMessage(TNC->hMonitor, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR) ptr1 );
#endif #endif
T = time(NULL);
tm = gmtime(&T);
sprintf_s(Time, sizeof(Time),"%02d:%02d ", tm->tm_hour, tm->tm_min);
strcat(TNC->WebBuffer, Time);
strcat(TNC->WebBuffer, ptr1); strcat(TNC->WebBuffer, ptr1);
strcat(TNC->WebBuffer, "\r\n"); strcat(TNC->WebBuffer, "\r\n");
if (strlen(TNC->WebBuffer) > 4500) if (strlen(TNC->WebBuffer) > 4500)
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved memmove(TNC->WebBuffer, &TNC->WebBuffer[500], 4490); // Make sure null is moved
} }
} }
@ -1000,11 +984,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0) if (_memicmp(&buff->L2DATA[0], "RADIO ", 6) == 0)
{ {
char cmd[56]; sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &buff->L2DATA[6]);
strcpy(cmd, &buff->L2DATA[6]);
sprintf(&buff->L2DATA[0], "%d %s", TNC->Port, &cmd);
if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0])) if (Rig_Command(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4CROSSLINK, &buff->L2DATA[0]))
{ {
@ -1482,12 +1462,11 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
} }
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry;
if (TNC->ProgramPath) if (TNC->ProgramPath)
TNC->WeStartedTNC = RestartTNC(TNC); TNC->WeStartedTNC = RestartTNC(TNC);
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINMOR; TNC->Hardware = H_WINMOR;
if (TNC->BusyWait == 0) if (TNC->BusyWait == 0)
TNC->BusyWait = 10; TNC->BusyWait = 10;
@ -1495,6 +1474,7 @@ void * WinmorExtInit(EXTPORTDATA * PortEntry)
if (TNC->BusyHold == 0) if (TNC->BusyHold == 0)
TNC->BusyHold = 1; TNC->BusyHold = 1;
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);

View File

@ -37,7 +37,6 @@ VOID Do_Save_WPRec(HWND hDlg);
VOID SaveInt64Value(config_setting_t * group, char * name, long long value); VOID SaveInt64Value(config_setting_t * group, char * name, long long value);
VOID SaveIntValue(config_setting_t * group, char * name, int value); VOID SaveIntValue(config_setting_t * group, char * name, int value);
VOID SaveStringValue(config_setting_t * group, char * name, char * value); VOID SaveStringValue(config_setting_t * group, char * name, char * value);
BOOL GetStringValue(config_setting_t * group, char * name, char * value, int maxlen);
void MQTTMessageEvent(void* message); void MQTTMessageEvent(void* message);
WPRec * AllocateWPRecord() WPRec * AllocateWPRecord()

217
WebMail.c
View File

@ -1446,88 +1446,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// Neither do js or file downloads // Neither do js or file downloads
// This could be a request for a Template file
// WebMail/Local_Templates/My Forms/inc/logo_ad63.png
// WebMail/Standard Templates/
if (_memicmp(NodeURL, "/WebMail/Local", 14) == 0 || (_memicmp(NodeURL, "/WebMail/Standard", 17) == 0))
{
int FileSize;
char * MsgBytes;
char MsgFile[512];
FILE * hFile;
size_t ReadLen;
char TimeString[64];
char FileTimeString[64];
struct stat STAT;
char * FN = &NodeURL[9];
char * fileBit = FN;
char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN);
ext = strchr(FN, '.');
sprintf(MsgFile, "%s/%s", BPQDirectory, FN);
while (strchr(fileBit, '/'))
fileBit = strlop(fileBit, '/');
if (stat(MsgFile, &STAT) == -1)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
hFile = fopen(MsgFile, "rb");
if (hFile == 0)
{
*RLen = sprintf(Reply, "HTTP/1.1 404 Not Found\r\nContent-Length: 16\r\n\r\nPage not found\r\n");
return;
}
FileSize = STAT.st_size;
MsgBytes = malloc(FileSize + 1);
ReadLen = fread(MsgBytes, 1, FileSize, hFile);
fclose(hFile);
FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL));
ext++;
if (_stricmp(ext, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ext, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString);
memcpy(&Reply[*RLen], MsgBytes, FileSize);
*RLen += FileSize;
free (MsgBytes);
return;
}
//
if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0) if (_memicmp(NodeURL, "/WebMail/WMFile/", 16) == 0)
{ {
int FileSize; int FileSize;
@ -1541,8 +1459,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
char * FN = &NodeURL[16]; char * FN = &NodeURL[16];
char * fileBit = FN; char * fileBit = FN;
char * ext; char * ext;
char Type[64] = "Content-Type: text/html\r\n";
UndoTransparency(FN); UndoTransparency(FN);
ext = strchr(FN, '.'); ext = strchr(FN, '.');
@ -1575,31 +1491,24 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
FormatTime2(FileTimeString, STAT.st_ctime); FormatTime2(FileTimeString, STAT.st_ctime);
FormatTime2(TimeString, time(NULL)); FormatTime2(TimeString, time(NULL));
ext++; if (_stricmp(ext, ".htm") == 0 || _stricmp(ext, ".html") == 0 || _stricmp(ext, ".css") == 0 || _stricmp(ext, ".js") == 0)
{
if (_stricmp(ext, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ext, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ext, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
if (_stricmp(ext, "jpg") == 0 || _stricmp(ext, "jpeg") == 0 || _stricmp(ext, "png") == 0 ||
_stricmp(ext, "gif") == 0 || _stricmp(ext, "bmp") == 0 || _stricmp(ext, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
// File may be binary so output header then copy in message
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n" *RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"%s" "Content-Type: text/css\r\n"
"Date: %s\r\n" "Date: %s\r\n"
"Last-Modified: %s\r\n" "Last-Modified: %s\r\n"
"\r\n", FileSize, Type,TimeString, FileTimeString); "\r\n%s", FileSize, TimeString, FileTimeString, MsgBytes);
}
else
{
*RLen = sprintf(Reply, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
"Content-Type: application/octet-stream\r\n"
"Content-Disposition: attachment; filename=\"%s\"\r\n"
"Date: %s\r\n"
"Last-Modified: %s\r\n"
"\r\n%s", FileSize, fileBit, TimeString, FileTimeString, MsgBytes);
memcpy(&Reply[*RLen], MsgBytes, FileSize); }
*RLen += FileSize;
free (MsgBytes); free (MsgBytes);
return; return;
} }
@ -2384,7 +2293,6 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
struct HtmlFormDir * Dir; struct HtmlFormDir * Dir;
int i; int i;
int len;
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
DirNo = atoi(&NodeURL[17]); DirNo = atoi(&NodeURL[17]);
@ -2405,9 +2313,9 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (SubDir) if (SubDir)
len = sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName); sprintf(popup, popuphddr, Key, Dir->Dirs[SubDirNo]->DirName);
else else
len = sprintf(popup, popuphddr, Key, Dir->DirName); sprintf(popup, popuphddr, Key, Dir->DirName);
if (SubDir) if (SubDir)
{ {
@ -2418,7 +2326,7 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
len += sprintf(&popup[len], " <option value=%d:%d,%d>%s", DirNo, SubDirNo, i, Name); sprintf(popup, "%s <option value=%d:%d,%d>%s", popup, DirNo, SubDirNo, i, Name);
} }
} }
else else
@ -2430,10 +2338,10 @@ void ProcessWebMailMessage(struct HTTPConnectionInfo * Session, char * Key, BOOL
// We only send if there is a .txt file // We only send if there is a .txt file
if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0) if (_stricmp(&Name[strlen(Name) - 4], ".txt") == 0)
len += sprintf(&popup[len], " <option value=%d,%d>%s", DirNo, i, Name); sprintf(popup, "%s <option value=%d,%d>%s", popup, DirNo, i, Name);
} }
} }
len += sprintf(&popup[len], "</select></p>"); sprintf(popup, "%s</select></p>", popup);
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -2501,7 +2409,6 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
int i; int i;
int MsgLen = 0; int MsgLen = 0;
char * Boundary; char * Boundary;
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -2548,7 +2455,7 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
// Also to active fields in case not changed by form // Also to active fields in case not changed by form
len = sprintf(popup, popuphddr, Session->Key); sprintf(popup, popuphddr, Session->Key);
LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes LastGroup = HtmlFormDirs[0]->FormSet; // Save so we know when changes
@ -2561,21 +2468,21 @@ VOID SendTemplateSelectScreen(struct HTTPConnectionInfo * Session, char *Params,
if (strcmp(LastGroup, Dir->FormSet) != 0) if (strcmp(LastGroup, Dir->FormSet) != 0)
{ {
LastGroup = Dir->FormSet; LastGroup = Dir->FormSet;
len += sprintf(&popup[len], "%s", NewGroup); sprintf(popup, "%s%s", popup, NewGroup);
} }
len += sprintf(&popup[len], " <option value=%d>%s", i, Dir->DirName); sprintf(popup, "%s <option value=%d>%s", popup, i, Dir->DirName);
// Recurse any Subdirs // Recurse any Subdirs
n = 0; n = 0;
while (n < Dir->DirCount) while (n < Dir->DirCount)
{ {
len += sprintf(&popup[len], " <option value=%d:%d>%s", i, n, Dir->Dirs[n]->DirName); sprintf(popup, "%s <option value=%d:%d>%s", popup, i, n, Dir->Dirs[n]->DirName);
n++; n++;
} }
} }
len += sprintf(&popup[len], "%</select></td></tr></table></p>"); sprintf(popup, "%s</select></td></tr></table></p>", popup);
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
@ -2974,7 +2881,7 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R
// RMS Express Forms Support // RMS Express Forms Support
char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir) char * GetHTMLViewerTemplate(char * FN)
{ {
int i, j, k, l; int i, j, k, l;
@ -2988,7 +2895,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
{ {
if (strcmp(FN, Dir->Forms[j]->FileName) == 0) if (strcmp(FN, Dir->Forms[j]->FileName) == 0)
{ {
*FormDir = Dir;
return CheckFile(Dir, FN); return CheckFile(Dir, FN);
} }
} }
@ -3009,7 +2915,6 @@ char * GetHTMLViewerTemplate(char * FN, struct HtmlFormDir ** FormDir)
{ {
if (_stricmp(FN, SDir->Forms[k]->FileName) == 0) if (_stricmp(FN, SDir->Forms[k]->FileName) == 0)
{ {
*FormDir = SDir;
return CheckFile(SDir, SDir->Forms[k]->FileName); return CheckFile(SDir, SDir->Forms[k]->FileName);
} }
} }
@ -3073,13 +2978,6 @@ VOID GetPage(struct HTTPConnectionInfo * Session, char * NodeURL)
ptr = strchr(&NodeURL[17], ','); ptr = strchr(&NodeURL[17], ',');
Dir = HtmlFormDirs[DirNo]; Dir = HtmlFormDirs[DirNo];
if (DirNo == -1)
{
*WebMail->RLen = sprintf(WebMail->Reply, "<html><script>alert(\"No Page Selected. \");window.location.href = '/Webmail/NewMsg?%s';</script></html>", Session->Key);
return;
}
SubDir = strlop(&NodeURL[17], ':'); SubDir = strlop(&NodeURL[17], ':');
if (SubDir) if (SubDir)
{ {
@ -3393,13 +3291,6 @@ BOOL ParseXML(WebMailInfo * WebMail, char * XMLOrig)
// Extract Fields (stuff between < and >. Ignore Whitespace between fields // Extract Fields (stuff between < and >. Ignore Whitespace between fields
// Add FormFolder Key with our folder
// XMLKeys->Key = "FormFolder";
// XMLKeys->Value = _strdup(FormDir);
// XMLKeys++;
ptr1 = strstr(XML, "<xml_file_version>"); ptr1 = strstr(XML, "<xml_file_version>");
while (ptr1) while (ptr1)
@ -3503,8 +3394,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
size_t varlen, xmllen; size_t varlen, xmllen;
char var[100] = "<"; char var[100] = "<";
KeyValues * KeyValue; KeyValues * KeyValue;
struct HtmlFormDir * Dir;
char FormDir[MAX_PATH];
if (ParseXML(WebMail, XML)) if (ParseXML(WebMail, XML))
ptr = FindXMLVariable(WebMail, "display_form"); ptr = FindXMLVariable(WebMail, "display_form");
@ -3518,11 +3407,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
strcpy(FN, ptr); strcpy(FN, ptr);
Form = GetHTMLViewerTemplate(FN, &Dir); Form = GetHTMLViewerTemplate(FN);
sprintf(FormDir, "WMFile/%s/%s/", Dir->FormSet, Dir->DirName);
if (Form == NULL) if (Form == NULL)
{ {
@ -3538,15 +3423,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
// Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody} // Don't know why, but {MsgOriginalBody} is sent instead of {var MsgOriginalBody}
// So is {FormFolder} instread of {var FormFolder}
// As a fiddle replace {FormFolder} with {var Folder} and look for that
while (varptr = stristr(Form, "{FormFolder}"))
{
memcpy(varptr, "{var ", 5);
}
varptr = stristr(Form, "{MsgOriginalBody}"); varptr = stristr(Form, "{MsgOriginalBody}");
{ {
char * temp, * tempsave; char * temp, * tempsave;
@ -3686,23 +3562,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
while (KeyValue->Key) while (KeyValue->Key)
{ {
if (_stricmp(var, "Folder") == 0)
{
// Local form folder, not senders
xmllen = strlen(FormDir);
// Ok, we have the position of the variable and the substitution text.
// Copy message up to variable to Result, then copy value
memcpy(Reply, formptr, varptr - formptr - 5); // omit "{var "
Reply += (varptr - formptr - 5);
strcpy(Reply, FormDir);
Reply += xmllen;
break;
}
if (_stricmp(var, KeyValue->Key) == 0) if (_stricmp(var, KeyValue->Key) == 0)
{ {
xmllen = strlen(KeyValue->Value); xmllen = strlen(KeyValue->Value);
@ -3718,8 +3577,6 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
break; break;
} }
KeyValue++;
if (KeyValue->Key == NULL) if (KeyValue->Key == NULL)
{ {
// Not found in XML // Not found in XML
@ -3729,7 +3586,7 @@ int DisplayWebForm(struct HTTPConnectionInfo * Session, struct MsgInfo * Msg, ch
sprintf(Err, VarNotFoundMsg, var, "%s"); sprintf(Err, VarNotFoundMsg, var, "%s");
return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err); return ReturnRawMessage(User, Msg, Key, SaveReply, RawMessage, (int)(XML - RawMessage), Err);
} }
KeyValue++;
} }
formptr = endptr + 1; formptr = endptr + 1;
@ -5589,6 +5446,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
#endif #endif
printf("%s\n", MsgFile);
if (stat(MsgFile, &STAT) != -1) if (stat(MsgFile, &STAT) != -1)
{ {
hFile = fopen(MsgFile, "rb"); hFile = fopen(MsgFile, "rb");
@ -5605,6 +5464,8 @@ char * CheckFile(struct HtmlFormDir * Dir, char * FN)
MsgBytes[FileSize] = 0; MsgBytes[FileSize] = 0;
fclose(hFile); fclose(hFile);
printf("%d %s\n", strlen(MsgBytes), MsgBytes);
return MsgBytes; return MsgBytes;
} }
return NULL; return NULL;
@ -5634,7 +5495,6 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
char * ptr, * ptr1; char * ptr, * ptr1;
char * prompt; char * prompt;
char * var[100]; char * var[100];
int len;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
@ -5704,7 +5564,7 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
ptr = ptr1; ptr = ptr1;
} }
len = sprintf(popup, popuphddr, Session->Key, prompt, vars + 1); sprintf(popup, popuphddr, Session->Key, prompt, vars + 1);
for (i = 0; i < vars; i++) for (i = 0; i < vars; i++)
{ {
@ -5713,9 +5573,9 @@ BOOL DoSelectPrompt(struct HTTPConnectionInfo * Session, char * Select)
if (key == NULL) if (key == NULL)
key = var[i]; key = var[i];
len += sprintf(&popup[len], " <option value='%s'>%s", key, var[i]); sprintf(popup, "%s <option value='%s'>%s", popup, key, var[i]);
} }
len += sprintf(&popup[len], "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>"); sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
*WebMail->RLen = sprintf(WebMail->Reply, "%s", popup); *WebMail->RLen = sprintf(WebMail->Reply, "%s", popup);
free(SelCopy); free(SelCopy);
@ -6274,17 +6134,16 @@ VOID getAttachmentList(struct HTTPConnectionInfo * Session, char * Reply, int *
char popup[10000]; char popup[10000];
int i; int i;
WebMailInfo * WebMail = Session->WebMail; WebMailInfo * WebMail = Session->WebMail;
int len;
len = sprintf(popup, popuphddr, Session->Key, WebMail->Files); sprintf(popup, popuphddr, Session->Key, WebMail->Files);
for (i = 0; i < WebMail->Files; i++) for (i = 0; i < WebMail->Files; i++)
{ {
if(WebMail->FileLen[i] < 100000) if(WebMail->FileLen[i] < 100000)
len += sprintf(&popup[len], " <option value=%d>%s (Len %d)", i + 1, WebMail->FileName[i], WebMail->FileLen[i]); sprintf(popup, "%s <option value=%d>%s (Len %d)", popup, i + 1, WebMail->FileName[i], WebMail->FileLen[i]);
} }
len += sprintf(&popup[len], "%</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>"); sprintf(popup, "%s</select></td></tr></table><br><input onclick=window.history.back() value=Back type=button class='btn'></div>", popup);
*RLen = sprintf(Reply, "%s", popup); *RLen = sprintf(Reply, "%s", popup);
return; return;
@ -6430,7 +6289,7 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer)
} }
} }
ptr += sprintf(&ptr[strlen(ptr)], "</pre> \r\n"); ptr += sprintf(ptr, "%s</pre> \r\n", ptr);
Len = ptr - &OutBuffer[10]; Len = ptr - &OutBuffer[10];

View File

@ -795,8 +795,7 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
WritetoConsoleLocal(msg); WritetoConsoleLocal(msg);
TNC->Port = port; TNC->Port = port;
TNC->PortRecord = PortEntry; TNC->Hardware = H_WINRPR;
TNC->PortRecord->PORTCONTROL.HWType = TNC->Hardware = H_WINRPR;
// Set up DED addresses for streams // Set up DED addresses for streams
@ -812,6 +811,8 @@ void * WinRPRExtInit(EXTPORTDATA * PortEntry)
PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream PortEntry->PERMITGATEWAY = TRUE; // Can change ax.25 call on each stream
PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock PortEntry->SCANCAPABILITIES = NONE; // Scan Control 3 stage/conlock
TNC->PortRecord = PortEntry;
if (PortEntry->PORTCONTROL.PORTCALL[0] == 0) if (PortEntry->PORTCONTROL.PORTCALL[0] == 0)
memcpy(TNC->NodeCall, MYNODECALL, 10); memcpy(TNC->NodeCall, MYNODECALL, 10);
else else
@ -1580,6 +1581,8 @@ TNCRunning:
// Send INIT script // Send INIT script
// VARA needs each command in a separate send
ptr1 = &TNC->InitScript[0]; ptr1 = &TNC->InitScript[0];
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
@ -1604,6 +1607,7 @@ TNCRunning:
c = *(ptr2 + 1); // Save next char c = *(ptr2 + 1); // Save next char
*(ptr2 + 1) = 0; // Terminate string *(ptr2 + 1) = 0; // Terminate string
} }
// VARASendCommand(TNC, ptr1, TRUE);
if (ptr2) if (ptr2)
*(1 + ptr2++) = c; // Put char back *(1 + ptr2++) = c; // Put char back

3
adif.c
View File

@ -409,7 +409,8 @@ BOOL WriteADIFRecord(ADIF * ADIF)
strcat(Value, "logs/BPQ_CMS_ADIF"); strcat(Value, "logs/BPQ_CMS_ADIF");
} }
sprintf(&Value[strlen(Value)], "_%04d%02d.adi", tm->tm_year +1900, tm->tm_mon+1); sprintf(Value, "%s_%04d%02d.adi", Value,
tm->tm_year +1900, tm->tm_mon+1);
STAT.st_size = 0; STAT.st_size = 0;
stat(Value, &STAT); stat(Value, &STAT);

View File

@ -33,7 +33,6 @@ typedef int (FAR *FARPROCY)();
#define L4BUSY 0x80 // BNA - DONT SEND ANY MORE #define L4BUSY 0x80 // BNA - DONT SEND ANY MORE
#define L4NAK 0x40 // NEGATIVE RESPONSE FLAG #define L4NAK 0x40 // NEGATIVE RESPONSE FLAG
#define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG #define L4MORE 0x20 // MORE DATA FOLLOWS - FRAGMENTATION FLAG
#define L4COMP 0x10 // BPQ Specific use of spare it - data is compressed
#define L4CREQ 1 // CONNECT REQUEST #define L4CREQ 1 // CONNECT REQUEST
#define L4CACK 2 // CONNECT ACK #define L4CACK 2 // CONNECT ACK
@ -41,7 +40,6 @@ typedef int (FAR *FARPROCY)();
#define L4DACK 4 // DISCONNECT ACK #define L4DACK 4 // DISCONNECT ACK
#define L4INFO 5 // INFORMATION #define L4INFO 5 // INFORMATION
#define L4IACK 6 // INFORMATION ACK #define L4IACK 6 // INFORMATION ACK
#define L4RESET 7 // Paula's extension
extern char MYCALL[]; // 7 chars, ax.25 format extern char MYCALL[]; // 7 chars, ax.25 format
@ -172,21 +170,6 @@ typedef struct _TRANSPORTENTRY
char APPL[16]; // Set if session initiated by an APPL char APPL[16]; // Set if session initiated by an APPL
int L4LIMIT; // Idle time for this Session int L4LIMIT; // Idle time for this Session
// Now support compressing NetRom Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
} TRANSPORTENTRY; } TRANSPORTENTRY;
// //
@ -212,9 +195,6 @@ typedef struct ROUTE
UCHAR NEIGHBOUR_QUAL; UCHAR NEIGHBOUR_QUAL;
UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE UCHAR NEIGHBOUR_FLAG; // SET IF 'LOCKED' ROUTE
#define LOCKEDBYCONFIG 1
#define LOCKEDBYSYSOP 2
struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR struct _LINKTABLE * NEIGHBOUR_LINK; // POINTER TO LINK FOR THIS NEIGHBOUR
USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM) USHORT NEIGHBOUR_TIME; // TIME LAST HEARD (HH MM)
@ -253,7 +233,6 @@ typedef struct ROUTE
#define GotRTTResponse 2 // Other end has sent us a RTT Response #define GotRTTResponse 2 // Other end has sent us a RTT Response
#define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node #define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node
// (could just be monitoring RTT for some reason // (could just be monitoring RTT for some reason
#define SentRTTRequest 8
#define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls #define SentOurRIF 16 // Set when we have sent a rif for our Call and any ApplCalls
// (only sent when we have seen both a request and response) // (only sent when we have seen both a request and response)
@ -461,18 +440,15 @@ typedef struct _APPLCALLS
// This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs, // This way our times adjust to changes of neighbour SRTT. We can't cater for changes to other hop RTTs,
// But if these are significant (say 25% or 100 ms) they will be retransmitted // But if these are significant (say 25% or 100 ms) they will be retransmitted
// We treat the Routes as an array of 6. First 3 are NODES routes, next 3 are INP3 Routes. This works, but maybe is not ideal
typedef struct NR_DEST_ROUTE_ENTRY typedef struct NR_DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
UCHAR ROUT_QUALITY; // QUALITY UCHAR ROUT_QUALITY; // QUALITY
UCHAR ROUT_OBSCOUNT; UCHAR ROUT_OBSCOUNT;
UCHAR ROUT_LOCKED; UCHAR Padding[5]; // SO Entries are the same length
UCHAR Padding[4]; // So Entries are the same length
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct INP3_DEST_ROUTE_ENTRY typedef struct DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
USHORT LastRTT; // Last Value Reported USHORT LastRTT; // Last Value Reported
@ -491,13 +467,13 @@ typedef struct DEST_LIST
UCHAR DEST_ALIAS[6]; UCHAR DEST_ALIAS[6];
UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC UCHAR DEST_STATE; // CONTROL BITS - SETTING UP, ACTIVE ETC
UCHAR DEST_LOCKED;
UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION UCHAR DEST_ROUTE; // CURRENTY ACTIVE DESTINATION
UCHAR INP3FLAGS; UCHAR INP3FLAGS;
struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest struct NR_DEST_ROUTE_ENTRY NRROUTE[3];// Best 3 NR neighbours for this dest
struct INP3_DEST_ROUTE_ENTRY INP3ROUTE[3]; // Best 3 INP neighbours for this dest
struct DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION void * DEST_Q; // QUEUE OF FRAMES FOR THIS DESTINATION
@ -701,13 +677,11 @@ typedef struct PORTCONTROL
BOOL NormalizeQuality; // Normalise Node Qualities BOOL NormalizeQuality; // Normalise Node Qualities
BOOL IgnoreUnlocked; // Ignore Unlocked routes BOOL IgnoreUnlocked; // Ignore Unlocked routes
BOOL INP3ONLY; // Default to INP3 and disallow NODES BOOL INP3ONLY; // Default to INP3 and disallow NODES
BOOL ALLOWINP3;
void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ void (* UIHook)(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffer, MESSAGE * ADJBUFFER, UCHAR CTL, UCHAR MSGFLAG); // Used for KISSARQ
struct PORTCONTROL * HookPort; struct PORTCONTROL * HookPort;
int PortSlot; // Index in Port Table int PortSlot; // Index in Port Table
struct TNCINFO * TNC; // Associated TNC record struct TNCINFO * TNC; // Associated TNC record
int HWType; // Hardware type of Driver. In here as external apps don't have access to TNC record
int RIGPort; // Linked port for freq resporting int RIGPort; // Linked port for freq resporting
unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED) unsigned int PERMITTEDAPPLS; // Appls allowed on this port (generalisation of BBSBANNED)
char * CTEXT; // Port Specific CText char * CTEXT; // Port Specific CText
@ -961,21 +935,6 @@ typedef struct _LINKTABLE
int bytesRXed; // Info bytes only int bytesRXed; // Info bytes only
int bytesTXed; int bytesTXed;
// Now support compressing L2 Sessions.
// We collect as much data as possible before compressing and re-packetizing
int AllowCompress;
unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen;
int Sent;
int SentAfterCompression;
int Received;
int ReceivedAfterExpansion;
} LINKTABLE; } LINKTABLE;
#pragma pack(1) #pragma pack(1)
@ -1371,7 +1330,6 @@ struct arp_table_entry
// SOCKET SourceSocket; // SOCKET SourceSocket;
struct AXIPPORTINFO * PORT; struct AXIPPORTINFO * PORT;
BOOL noUpdate; // Don't update dest address from incoming packet BOOL noUpdate; // Don't update dest address from incoming packet
time_t LastHeard; // Last Packet received from this ststiom
}; };

View File

@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
return; return;
} }
// Select source port by choosing right socket // Seelcte source port by choosing right socket
// First Set Default for Protocol // First Set Default for Protocol
@ -2610,7 +2610,6 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int Port,
//arp->port = Port; //arp->port = Port;
} }
arp->LastHeard = time(NULL);
return 1; // Ok to process return 1; // Ok to process
} }
index++; index++;

View File

@ -290,9 +290,6 @@ typedef struct ConnectionInfo_S
struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to struct ConnectionInfo_S * SysopChatStream; // Stream sysop is chatting to
int bytesSent;
int bytesRxed;
} ConnectionInfo, CIRCUIT; } ConnectionInfo, CIRCUIT;
// Flags Equates // Flags Equates
@ -339,13 +336,11 @@ typedef struct ConnectionInfo_S
struct FBBRestartData struct FBBRestartData
{ {
char Call[10]; struct MsgInfo * TempMsg; // Header while message is being received
char bid[13]; struct UserInfo * UserPointer;
int length;
UCHAR * MailBuffer; // Mail Message being received UCHAR * MailBuffer; // Mail Message being received
int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct int MailBufferSize; // Total Malloc'ed size. Actual size in in Msg Struct
int Count; // Give up if too many restarts int Count; // Give up if too many restarts
time_t TimeCreated;
}; };
// We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so // We need to keep the B2Message file for B2 messages we are sending until the messages is acked, so
@ -1392,7 +1387,6 @@ BOOL CheckBBSHElements(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSFo
BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements); BOOL CheckBBSHElementsFlood(struct MsgInfo * Msg, struct UserInfo * bbs, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS, char ** HElements);
int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo); int CheckBBSToForNTS(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo);
int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS); int CheckBBSATListWildCarded(struct MsgInfo * Msg, struct BBSForwardingInfo * ForwardingInfo, char * ATBBS);
void SaveRestartData();
VOID ReRouteMessages(); VOID ReRouteMessages();

2788
cMain-skigdebian.c Normal file

File diff suppressed because it is too large Load Diff

64
cMain.c
View File

@ -17,7 +17,6 @@ You should have received a copy of the GNU General Public License
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
*/ */
// //
// C replacement for Main.asm // C replacement for Main.asm
// //
@ -140,16 +139,6 @@ int NODE = 1; // INCLUDE SWITCH SUPPORT
int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ int FULL_CTEXT = 1; // CTEXT ON ALL CONNECTS IF NZ
int L4Compress = 0;
int L4CompMaxframe = 3;
int L4CompPaclen = 236;
int L2Compress = 0;
int L2CompMaxframe = 3;
int L2CompPaclen = 236;
int PREFERINP3ROUTES = 0;
BOOL LogL4Connects = FALSE; BOOL LogL4Connects = FALSE;
BOOL LogAllConnects = FALSE; BOOL LogAllConnects = FALSE;
BOOL AUTOSAVEMH = TRUE; BOOL AUTOSAVEMH = TRUE;
@ -167,8 +156,6 @@ char MQTT_PASS[80] = "";
int MQTT_Connecting = 0; int MQTT_Connecting = 0;
int MQTT_Connected = 0; int MQTT_Connected = 0;
int PoolBuilt = 0;
//TNCTABLE DD 0 //TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0 //NUMBEROFSTREAMS DD 0
@ -835,29 +822,6 @@ BOOL Start()
MQTT_PORT = cfg->C_MQTT_PORT; MQTT_PORT = cfg->C_MQTT_PORT;
strcpy(MQTT_USER, cfg->C_MQTT_USER); strcpy(MQTT_USER, cfg->C_MQTT_USER);
strcpy(MQTT_PASS, cfg->C_MQTT_PASS); strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
L4Compress = cfg->C_L4Compress;
L4CompMaxframe = cfg->C_L4CompMaxframe;
L4CompPaclen = cfg->C_L4CompPaclen;
if (L4CompMaxframe < 1 || L4CompMaxframe > 16)
L4CompMaxframe = 3;
if (L4CompPaclen < 64 || L4CompPaclen > 236)
L4CompPaclen = 236;
L2Compress = cfg->C_L2Compress;
L2CompMaxframe = cfg->C_L2CompMaxframe;
L2CompPaclen = cfg->C_L2CompPaclen;
if (L2CompMaxframe < 1 || L2CompMaxframe > 16)
L2CompMaxframe = 3;
if (L2CompPaclen < 64 || L2CompPaclen > 236)
L2CompPaclen = 236;
PREFERINP3ROUTES = cfg->C_PREFERINP3ROUTES;
// Get pointers to PASSWORD and APPL1 commands // Get pointers to PASSWORD and APPL1 commands
@ -984,7 +948,6 @@ BOOL Start()
PORT->NormalizeQuality = !PortRec->NoNormalize; PORT->NormalizeQuality = !PortRec->NoNormalize;
PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED; PORT->IgnoreUnlocked = PortRec->IGNOREUNLOCKED;
PORT->INP3ONLY = PortRec->INP3ONLY; PORT->INP3ONLY = PortRec->INP3ONLY;
PORT->ALLOWINP3 = PortRec->AllowINP3;
PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME; PORT->PORTWINDOW = (UCHAR)PortRec->MAXFRAME;
@ -1009,9 +972,6 @@ BOOL Start()
PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN; PORT->PORTPACLEN = (UCHAR)PortRec->PACLEN;
PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST; PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST;
if (PORT->QUAL_ADJUST < 0 || PORT->QUAL_ADJUST > 100)
PORT->QUAL_ADJUST = 100;
PORT->DIGIFLAG = PortRec->DIGIFLAG; PORT->DIGIFLAG = PortRec->DIGIFLAG;
if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT)) if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT))
PORT->DIGIPORT = PortRec->DIGIPORT; PORT->DIGIPORT = PortRec->DIGIPORT;
@ -1378,7 +1338,7 @@ BOOL Start()
ROUTE->NBOUR_PACLEN = Rcfg->ppacl; ROUTE->NBOUR_PACLEN = Rcfg->ppacl;
ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual; ROUTE->OtherendsRouteQual = ROUTE->OtherendLocked = Rcfg->farQual;
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYCONFIG; // Locked ROUTE->NEIGHBOUR_FLAG = 1; // Locked
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1469,8 +1429,6 @@ BOOL Start()
ENDBUFFERPOOL = NEXTFREEDATA; ENDBUFFERPOOL = NEXTFREEDATA;
PoolBuilt = 1;
// Copy Bridge Map // Copy Bridge Map
@ -1588,7 +1546,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
struct ROUTE * ROUTE = NEIGHBOURS; struct ROUTE * ROUTE = NEIGHBOURS;
struct ROUTE * FIRSTSPARE = NULL; struct ROUTE * FIRSTSPARE = NULL;
int n = MAXNEIGHBOURS; int n = MAXNEIGHBOURS;
char Normcall[10];
while (n--) while (n--)
{ {
@ -1601,10 +1558,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
ROUTE++; ROUTE++;
continue; continue;
} }
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call)) if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
{ {
*REQROUTE = ROUTE; *REQROUTE = ROUTE;
@ -1890,11 +1843,12 @@ VOID ReadNodes()
if (ptr == NULL) continue; if (ptr == NULL) continue;
// I don't thinlk we should load locked flag from save file - only from config // I don't thinlk we should load locked flag from save file - only from config
// Now (2025) have two locked flags, from config or by sysop. Latter is saved and restored
// But need to parse it until I stop saving it
if (ptr[0] == '!') if (ptr[0] == '!')
{ {
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE // ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
} }
@ -1911,7 +1865,7 @@ VOID ReadNodes()
memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7); memcpy(ROUTE->NEIGHBOUR_DIGI1, axcall, 7);
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE - Digi'ed routes must be locked ROUTE->NEIGHBOUR_FLAG = 1; // LOCKED ROUTE - Digi'ed routes must be locked
ptr = strtok_s(NULL, seps, &Context); ptr = strtok_s(NULL, seps, &Context);
if (ptr == NULL) continue; if (ptr == NULL) continue;
@ -1967,14 +1921,6 @@ VOID ReadNodes()
if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE if (ROUTE->NEIGHBOUR_FLAG == 0 || ROUTE->OtherendLocked == 0); // Not LOCKED ROUTE
ROUTE->OtherendsRouteQual = atoi(ptr); ROUTE->OtherendsRouteQual = atoi(ptr);
ptr = strtok_s(NULL, seps, &Context); // INP3
if (ptr == NULL) continue;
if (ptr[0] == '!')
{
ROUTE->NEIGHBOUR_FLAG = LOCKEDBYSYSOP; // LOCKED ROUTE
ptr = strtok_s(NULL, seps, &Context);
}
continue; continue;
} }

View File

@ -2,6 +2,7 @@
// Prototypes for BPQ32 Node Functions // Prototypes for BPQ32 Node Functions
// //
#define DllImport #define DllImport
#define EXCLUDEBITS #define EXCLUDEBITS

View File

@ -307,8 +307,7 @@ static char *keywords[] =
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL", "APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed "BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS", "LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS", "EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe", "L2CompPaclen", "PREFERINP3ROUTES"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -329,9 +328,7 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual, &xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed &xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs, &xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS, &xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS}; /* offset for corresponding data in config file */
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -351,9 +348,7 @@ static int routine[] =
14, 14 ,14, 14, 14, 14 ,14, 14,
15, 0, 2, 9, 9, 15, 0, 2, 9, 9,
2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2,
2, 2, 0, 1, 20, 20, 2, 2, 0, 1, 20, 20} ; // Routine to process param
1, 1, 1, 1, 1,
1, 1} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int); int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int); //int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -375,7 +370,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"}; /* parameter keywords */ "SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort",
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -389,7 +385,7 @@ 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}; /* offset for corresponding data in config file */ &xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort}; /* offset for corresponding data in config file */
static int proutine[] = static int proutine[] =
{ {
@ -403,7 +399,7 @@ 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}; /* routine to process parameter */ 1, 20, 1, 21, 22, 1}; /* routine to process parameter */
int PPARAMLIM = sizeof(proutine)/sizeof(int); int PPARAMLIM = sizeof(proutine)/sizeof(int);
@ -537,8 +533,6 @@ BOOL ProcessConfig()
// xxcfg.SaveMH = TRUE; // Default to save // xxcfg.SaveMH = TRUE; // Default to save
xxcfg.C_PREFERINP3ROUTES = 0; // Default to false
GetNextLine(rec); GetNextLine(rec);
while (rec[0]) while (rec[0])
@ -622,14 +616,6 @@ BOOL ProcessConfig()
paramok[83]=1; // MQTT Params paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params paramok[84]=1; // MQTT Params
paramok[85]=1; // MQTT Params paramok[85]=1; // MQTT Params
paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen
paramok[89]=1; // L2Compress
paramok[90]=1; // L2Compress Maxframe
paramok[91]=1; // L2Compress Paclen
paramok[92]=1; // PREFERINP3ROUTES
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
{ {

View File

@ -81,7 +81,6 @@ struct PORTCONFIG
uint64_t PortFreq; uint64_t PortFreq;
char * M0LTEMapInfo; char * M0LTEMapInfo;
int QtSMPort; int QtSMPort;
int AllowINP3;
}; };
struct ROUTECONFIG struct ROUTECONFIG
@ -171,14 +170,6 @@ struct CONFIGTABLE
int C_MQTT_PORT; int C_MQTT_PORT;
char C_MQTT_USER[80]; char C_MQTT_USER[80];
char C_MQTT_PASS[80]; char C_MQTT_PASS[80];
int C_L4Compress;
int C_L4CompMaxframe;
int C_L4CompPaclen;
int C_L2Compress;
int C_L2CompMaxframe;
int C_L2CompPaclen;
int C_PREFERINP3ROUTES;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer //#define InfoOffset 85000 // Infomsg offset in buffer

11
debian/NEWS vendored
View File

@ -1,11 +0,0 @@
linbpq (6.0.24.22-2) unstable; urgency=medium
This is quite a big update, with config moving from /opt/oarc/bpq/bpq32.cfg to
/etc/bpq32.cfg. The system shall do this automatically for you, however
computers and their programmers are not perfect.
I strongly recommend at this point backing up your entire
/opt/oarc/bpq/ directory (cp -r /opt/oarc/bpq/ ~/bpq-backup/) before
proceeding with the upgrade
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 13:30:06 +0000

23
debian/README.Debian vendored
View File

@ -1,23 +0,0 @@
README for linbpq on Debian
===========================
Please see https://wiki.oarc.uk/packet:linbpq-apt-installation for this guide
# Set config
Copy the config, edit it & set permissions.
The permissions are so linbpq web interface can edit the config.
sudo mv /usr/share/doc/linbpq/examples/bpq32.cfg /etc/bpq32.cfg
sudo nano /etc/bpq32.cfg
sudo chown :linbpq /etc/bpq32.cfg
sudo chmod 644 /etc/bpq32.cfg
# Start linbpq
sudo systemctl start linbpq
# Access your node
It shall be available by accessing http://localhost:8008 in the browser or telnet localhost 8010
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 00:53:42 +0000

50
debian/bpq32.cfg vendored
View File

@ -1,50 +0,0 @@
SIMPLE
NODECALL=MB7NAA
NODEALIAS=AANODE
LOCATOR=AA00aa
PASSWORD=xxxxxxxx
AUTOSAVE=1
NODESINTERVAL=10
MINQUAL=10
CTEXT:
Thanks for connecting.
Type ? for help.
***
PORT
PORTNUM=1
ID=VHF
TYPE=ASYNC
PROTOCOL=KISS
KISSOPTIONS=ACKMODE
COMPORT=/dev/ttyACM0
SPEED=57600
FRACK=4000
PACLEN=150
DIGIFLAG=0
QUALITY=192
MINQUAL=20
ENDPORT
PORT
PORTNUM=9
ID=Telnet
DRIVER=Telnet
CONFIG
LOGGING=1
CMS=1
DisconnectOnClose=1
SECURETELNET=1
TCPPORT=8010
FBBPORT=8011
HTTPPORT=8008
LOGINPROMPT=user:
PASSWORDPROMPT=password:
MAXSESSIONS=10
CTEXT=Thanks for connecting\n Enter ? for list of commands\n\n
USER=username,xxxxxxxx,m0aaa,,SYSOP
ENDPORT
LINCHAT
APPLICATION 2,CHAT,,MB7NAA-9,AACHAT,255

260
debian/changelog vendored
View File

@ -1,260 +0,0 @@
linbpq (6.0.24.71+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.67+repack
* New upstream version 6.0.24.69+repack
* New upstream version 6.0.24.69.1+repack
* New upstream version 6.0.24.71+repack
* Okay that's a lot of updates.
* Refreshed d/p/makefile to reflect new CFLAG
* MINI_BUILDD_OPTION: auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Wed, 21 May 2025 21:45:59 +0100
linbpq (6.0.24.66+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Update postinst script to be a little quieter
* MINI_BUILDD_OPTION:
auto-ports=trixie-packetrepo-unstable,bookworm-packetrepo-unstable,bullseye-packetrepo-unstable,noble-packetrepo-unstable,jammy-packetrepo-unstable
-- Dave Hibberd <hibby@debian.org> Tue, 11 Mar 2025 00:51:35 +0000
linbpq (6.0.24.66+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.66+repack
-- Dave Hibberd <hibby@debian.org> Tue, 04 Mar 2025 22:50:09 +0000
linbpq (6.0.24.65+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Tue, 25 Feb 2025 09:33:24 +0000
linbpq (6.0.24.59a+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Little tweaks to makefile patch to account for new -rdynamic
-- Dave Hibberd <hibby@debian.org> Mon, 03 Feb 2025 22:32:11 +0000
linbpq (6.0.24.56+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
-- Dave Hibberd <hibby@debian.org> Mon, 06 Jan 2025 21:37:44 +0000
linbpq (6.0.24.55+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* d/rules
- Increased hardening
-- Dave Hibberd <hibby@debian.org> Sun, 05 Jan 2025 23:35:06 +0000
linbpq (6.0.24.54+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream
* Drop AGW Patch
* Drop Spelling Patch
* Drop Dynamic Links patch
-- Dave Hibberd <hibby@debian.org> Tue, 17 Dec 2024 16:46:05 +0000
linbpq (6.0.24.53+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches refreshed
- dropped some edits in ftbfs-gcc14
- dropped d/patches/headers.patch
-- Dave Hibberd <hibby@debian.org> Tue, 03 Dec 2024 00:57:57 +0000
linbpq (6.0.24.52+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream
- Patches happy
-- Dave Hibberd <hibby@debian.org> Sat, 30 Nov 2024 21:47:17 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Iron out an issue with time...
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:57:28 +0000
linbpq (6.0.24.51.1+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import after bug report
* Roll back some ftbfs-gcc14 edits
* Remove some more lib headers
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 19:30:22 +0000
linbpq (6.0.24.51+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
- Patches refreshed
* Upstream is now repacked to include less files
* Big build system review, now using Debian CFLAGS and LDFLAGS
- Hardening enabled, mostly
- A debug symbols package is now available
* Oh yeah, everything is now dynamic linking
- libpng
- libpaho-mqtt
- libjansson
- libminiupnpc
-- Dave Hibberd <hibby@debian.org> Fri, 29 Nov 2024 13:08:38 +0000
linbpq (6.0.24.50-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Files excluded at origtargz generation time for cleanliness
-- Dave Hibberd <hibby@debian.org> Tue, 12 Nov 2024 21:56:38 +0000
linbpq (6.0.24.49-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream import
* Patches refreshed
* Add mqtt requirements
-- Dave Hibberd <hibby@debian.org> Tue, 05 Nov 2024 21:52:29 +0000
linbpq (6.0.24.45-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import
* Patches refreshed
-- Dave Hibberd <hibby@debian.org> Fri, 11 Oct 2024 15:48:41 +0100
linbpq (6.0.24.42-1~hibbian+3) bookworm-hibbian-unstable; urgency=medium
* 32bit build error
- Patch updated to fix hopefully
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:21:57 +0100
linbpq (6.0.24.42-1~hibbian+2) bookworm-hibbian-unstable; urgency=medium
* Forgot to fix the ninotnc-smt issue, fixed now
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 12:05:54 +0100
linbpq (6.0.24.42-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* Install config to /etc
* New upstream update
* Patches refreshed
* Debian hardening enabled
- 2 new patches created that touch almost every file
- Considered experimental.
- gcc14 builds for Debian Trixie!
-- Dave Hibberd <hibby@debian.org> Fri, 30 Aug 2024 10:15:11 +0100
linbpq (6.0.24.40-1) unstable; urgency=medium
* Fresh upstream release
- Patches refreshed
* Secure by default patch
-- Dave Hibberd <hibby@debian.org> Sun, 07 Jul 2024 16:09:28 +0100
linbpq (6.0.24.38-1) unstable; urgency=medium
* New Upstream
* Tweak config file per recommendation from 2M0MQN to make first start simple
* Bump standards to 4.7.0.0
-- Dave Hibberd <hibby@debian.org> Sun, 09 Jun 2024 22:38:40 +0100
linbpq (6.0.24.34-2) unstable; urgency=medium
* Fix config permissions bug as reported by Alex 2E1PKY
-- Dave Hibberd <hibby@debian.org> Mon, 08 Apr 2024 22:27:02 +0100
linbpq (6.0.24.34-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Sat, 06 Apr 2024 02:15:28 +0100
linbpq (6.0.24.33-1) unstable; urgency=medium
* Upstream bump
* Moved config file to examples
* Updated service to fail on no config
* Added helpful README.Debian
-- Dave Hibberd <hibby@debian.org> Tue, 26 Mar 2024 20:24:08 +0000
linbpq (6.0.24.30-1) unstable; urgency=medium
* Upstream bump
-- Dave Hibberd <hibby@debian.org> Fri, 23 Feb 2024 23:24:46 +0000
linbpq (6.0.24.29-1) unstable; urgency=medium
* Upstream bump
* Added my new details
* Tidied up some packaging errors
-- Dave Hibberd <hibby@debian.org> Tue, 13 Feb 2024 00:06:33 +0000
linbpq (6.0.24.27-2) unstable; urgency=medium
* Permissions fix for web-config-editor users
-- Dave Hibberd <d@vehibberd.com> Thu, 18 Jan 2024 10:31:56 +0000
linbpq (6.0.24.27-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Tue, 16 Jan 2024 20:51:43 +0000
linbpq (6.0.24.25-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Thu, 28 Dec 2023 10:44:47 +0000
linbpq (6.0.24.22-2) unstable; urgency=medium
* Moved config file home, caused chaos
-- Dave Hibberd <d@vehibberd.com> Sat, 16 Dec 2023 14:40:20 +0000
linbpq (6.0.24.22-1) unstable; urgency=medium
* New Upstream Release
-- Dave Hibberd <d@vehibberd.com> Fri, 08 Dec 2023 12:29:40 +0000
linbpq (6.0.24.16-1) unstable; urgency=medium
* New Upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 31 Oct 2023 22:50:01 +0000
linbpq (6.0.24.15-2) unstable; urgency=medium
* debian/conffiles introduced to stop linbpq overwriting config files
- Thanks to Mark 2M0IIG for raising concern about this bug!
-- Dave Hibberd <d@vehibberd.com> Sun, 15 Oct 2023 21:45:24 +0100
linbpq (6.0.24.15-1) unstable; urgency=medium
* New upstream release
-- Dave Hibberd <d@vehibberd.com> Tue, 10 Oct 2023 22:19:48 +0100
linbpq (6.0.24.2-1) unstable; urgency=medium
* Initial release.
-- Dave Hibberd <d@vehibberd.com> Mon, 28 Aug 2023 23:20:45 +0100

20
debian/control vendored
View File

@ -1,20 +0,0 @@
Source: linbpq
Section: hamradio
Priority: optional
Maintainer: Dave Hibberd <hibby@debian.org>
Standards-Version: 4.7.1
Vcs-Browser: https://git.hibbian.org/Hibbian/linbpq
Vcs-Git: https://git.hibbian.org/Hibbian/linbpq.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/
Build-Depends: debhelper-compat (= 13)
Build-Depends-Arch: libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev, libpng-dev
Rules-Requires-Root: no
Package: linbpq
Architecture: linux-any
Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, hibbian-archive-keyring
Description: Packet node and ax25 stack
LINBPQ is a Linux version of the BPQ32 Node, BBS and Chat Server components.
It is actively developed by John G8BPQ and contains a complete, independent
implementation of ax.25 and net/rom as well as BBS and Chat applications and
can be used either as a packet switch or as a full featured node.

36
debian/copyright vendored
View File

@ -1,36 +0,0 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: linBPQ
Upstream-Contact: John Wiseman G8BPQ <john.wiseman@cantab.net>
Source: https://www.cantab.net/users/john.wiseman/Documents/
Files-Excluded: *.vcproj* *.bak *.lib *.dll *.wav *.asm *.vcxproj* *.pdb *.exe
.gitignore XAprs zlib.h zconf.h MQTT* pcap.h miniupnpc.h upnpdev.h
igd_desc_parse.h upnpcommands.h upnperrors.h miniupnpctypes.h
Files: *
Copyright: 1990-2024 John Wiseman G8BPQ <john.wiseman@cantab.net>
License: GPL-3
Files: debian/*
Copyright: 2016-2021 Dave Hibberd <d@vehibberd.com>
License: GPL-3
Files: debian/linbpq.service
Copyright: Tom Fanning M0LTE
License: GPL-3
License: GPL-3
This program 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.
.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
.
The GPL License which applies to this package can be found on your Debian
system at /usr/share/common-licenses/GPL-3.

2
debian/dirs vendored
View File

@ -1,2 +0,0 @@
usr/sbin
opt/oarc/bpq

3
debian/gbp.conf vendored
View File

@ -1,3 +0,0 @@
[DEFAULT]
debian-branch = hibbian/latest
upstream-branch = upstream/latest

View File

@ -1,6 +0,0 @@
include:
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
reprotest:
extends: .test-reprotest-diffoscope

1
debian/install vendored
View File

@ -1 +0,0 @@
debian/bpq32.cfg etc/

View File

@ -1 +0,0 @@
debian/bpq32.cfg

14
debian/linbpq.service vendored
View File

@ -1,14 +0,0 @@
[Unit]
Description=Linbpq systemd service file
After=network.target
ConditionPathExists=/etc/bpq32.cfg
[Service]
ExecStart=/usr/sbin/linbpq -c /etc -d /opt/oarc/bpq -l /opt/oarc/bpq
WorkingDirectory=/opt/oarc/bpq
Restart=always
User=linbpq
Group=linbpq
[Install]
WantedBy=multi-user.target

View File

@ -1,11 +0,0 @@
# weirdness from oarc packaging
linbpq: dir-or-file-in-opt [opt/oarc/]
linbpq: dir-or-file-in-opt [opt/oarc/bpq/]
# i know!
linbpq: no-manual-page [usr/sbin/linbpq]
# Directory is populated on first run
linbpq: package-contains-empty-directory [opt/oarc/bpq/]
# Code convenience
linbpq: spelling-error-in-binary Dont Don't [usr/sbin/linbpq]
linbpq: spelling-error-in-binary Paramters Parameters [usr/sbin/linbpq]
linbpq: spelling-error-in-binary lon long [usr/sbin/linbpq]

View File

@ -1,51 +0,0 @@
--- a/makefile
+++ b/makefile
@@ -2,8 +2,7 @@
# To exclude i2c support run make noi2c
-OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
- pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
+OBJS = APRSIconData.o AISCommon.o\
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
@@ -18,9 +17,13 @@
# Configuration:
CC = gcc
-
-all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables
-all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
+
+CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
+CFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS)
+
+all: CFLAGS += -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables
+all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lrt -lm -lz -lpthread -lconfig -lpcap -lpng
all: linbpq
@@ -32,12 +35,15 @@
linbpq: $(OBJS)
- gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
- sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
+ gcc $(OBJS) $(CLFAGS) $(LDFLAGS) $(LIBS) -o linbpq
+ # sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d
-clean :
- rm *.d
- rm linbpq $(OBJS)
-
+install:
+ install -b -m 755 -D -d debian/linbpq/usr/sbin
+ install -b -m 755 -p linbpq debian/linbpq/usr/sbin
+
+clean:
+ $(RM) *.d
+ $(RM) linbpq $(OBJS)

View File

@ -1,2 +0,0 @@
spelling-fixes.patch
makefile

View File

@ -1,11 +0,0 @@
--- a/UZ7HODrv.c
+++ b/UZ7HODrv.c
@@ -382,7 +382,7 @@
if (AGW->CenterFreq == 0)
{
- buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Freqency\r");
+ buffptr->Len = sprintf((UCHAR *)&buffptr->Data[0], "UZ7HO} Invalid Modem Frequency\r");
return 1;
}

47
debian/postinst vendored
View File

@ -1,47 +0,0 @@
#!/bin/sh
set -e
if [ "$1" = configure ]; then
# if ! getent group linbpq >/dev/null; then
# addgroup --system --force-badname linbpq || true
# fi
echo "Creating/updating linbpq user account..."
adduser --system --group --home /opt/oarc/bpq \
--gecos "linbpq system user" --shell /bin/false \
--quiet --disabled-password linbpq || {
# adduser failed. Why?
if getent passwd linbpq >/dev/null ; then
echo "Non-system user linbpq found. I will not overwrite a non-system" >&2
echo "user. Remove the user and reinstall linbpq." >&2
exit 1
fi
# unknown adduser error, simply exit
exit 1
}
if ! id -nGz linbpq | grep -qzxF 'dialout' ; then
adduser linbpq dialout
fi
if ! id -nGz linbpq | grep -qzxF 'plugdev' ; then
adduser linbpq plugdev
fi
chown :linbpq /opt/oarc/bpq
chmod 775 /opt/oarc/bpq
# If we have setcap is installed, set the requirements
# which allows us to install our binaries without the setuid
# bit.
if command -v setcap > /dev/null; then
setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" /usr/sbin/linbpq
else
echo "Setcap failed on /usr/sbin/linbpq, Features may be limited" >&2
fi
else
echo "Setcap is not installed, Features may be limited" >&2
fi
#DEBHELPER#

14
debian/preinst vendored
View File

@ -1,14 +0,0 @@
#!/bin/sh
set -e
confile="/etc/bpq32.cfg"
node="/opt/oarc/bpq/bpq32.cfg"
if [ -L $confile ]; then
rm $confile
cp $node $confile
mv $node $node.bak
fi
#DEBHELPER#

6
debian/rules vendored
View File

@ -1,6 +0,0 @@
#!/usr/bin/make -f
export DEB_BUILD_MAINT_OPTIONS=hardening=+all
%:
dh $@

View File

@ -1 +0,0 @@
3.0 (quilt)

View File

3
debian/watch vendored
View File

@ -1,3 +0,0 @@
version=4
opts="pgpmode=none,dversionmangle=s/\+repack//,repacksuffix=+repack,repack,compression=xz" \
http://127.0.0.1:8000/linbpq-(.+)\.(?:zip|tgz|tbz|txz|(?:tar\.(?:gz|bz2|xz)))

2
kiss.c
View File

@ -2294,7 +2294,7 @@ VOID QtSMThread(struct PORTCONTROL * PORT)
char Msg[64]; char Msg[64];
int Len; int Len;
// We need to send a QtSMPort message for each Channel sharing this connection // We need tp send a QtSMPort message for each Channel sharing thia connection
// Note struct KISSINFO and struct PORTCONTROL are different mappings of the same data // Note struct KISSINFO and struct PORTCONTROL are different mappings of the same data
struct KISSINFO * KISS = (struct KISSINFO *)PORT; struct KISSINFO * KISS = (struct KISSINFO *)PORT;

View File

@ -852,14 +852,7 @@ double LatFromLOC = 0;
double LonFromLOC = 0; double LonFromLOC = 0;
#endif #endif
void SendBBSDataToPktMapThread();
void SendBBSDataToPktMap() void SendBBSDataToPktMap()
{
_beginthread(SendBBSDataToPktMapThread, 0, 0);
}
void SendBBSDataToPktMapThread()
{ {
char Request[64]; char Request[64];
char * Params; char * Params;

View File

@ -19,15 +19,15 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
CC = gcc CC = gcc
all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
all: linbpq all: linbpq
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT -fasynchronous-unwind-tables nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT
nomqtt: linbpq nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon -fasynchronous-unwind-tables noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon
noi2c: linbpq noi2c: linbpq

43
makefile~ Normal file
View File

@ -0,0 +1,43 @@
# LinBPQ Makefile
# To exclude i2c support run make noi2c
OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
AEAPactor.o HALDriver.o MULTIPSK.o BBSHTMLConfig.o ChatHTMLConfig.o BBSUtilities.o bpqaxip.o\
BPQINP3.o BPQNRR.o cMain.o Cmd.o CommonCode.o HTMLCommonCode.o compatbits.o config.o datadefs.o \
FBBRoutines.o HFCommon.o Housekeeping.o HTTPcode.o kiss.o L2Code.o L3Code.o L4Code.o lzhuf32.o \
MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \
DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o
# Configuration:
CC = gcc
all: CFLAGS = -DLINBPQ -MMD -g -fcommon
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
all: linbpq
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT
nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon
noi2c: linbpq
linbpq: $(OBJS)
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d
clean :
rm *.d
rm linbpq $(OBJS)

Some files were not shown because too many files have changed in this diff Show More