Compare commits

..

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

83 changed files with 1223 additions and 3126 deletions

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;

10
ARDOP.c
View File

@ -888,7 +888,6 @@ 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->ReportDISC = 1;
STREAM->AttachTime = 0; STREAM->AttachTime = 0;
@ -901,7 +900,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 +1494,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]))
{ {
@ -3143,7 +3138,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
@ -5961,7 +5955,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,10 +10758,10 @@ 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);
// Send SID and Prompt (Unless Sync) // Send SID and Prompt (Unless Sync)
@ -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;

498
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++)
{ {
@ -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,34 +1368,20 @@ 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++;
msglen--; // EOP msglen--; // EOP
} }
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

@ -1148,11 +1148,6 @@
// 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) // 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 +1724,6 @@ int APIENTRY WinMain(HINSTANCE hInstance,
// SaveUserDatabase(); // SaveUserDatabase();
SaveMessageDatabase(); SaveMessageDatabase();
SaveBIDDatabase(); SaveBIDDatabase();
SaveRestartData();
configSaved = 1; configSaved = 1;
SaveConfig(ConfigName); SaveConfig(ConfigName);
@ -3026,9 +3020,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 +3083,6 @@ static PSOCKADDR_IN psin;
SOCKET sock; SOCKET sock;
void GetRestartData();
BOOL Initialise() BOOL Initialise()
{ {
@ -3277,8 +3270,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;
};

31
Bpq32.c
View File

@ -1253,20 +1253,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix problem using SENDRAW from BPQMail (63) // Fix problem using SENDRAW from BPQMail (63)
// Fix compatibility with latest ardopcf (64) // Fix compatibility with latest ardopcf (64)
// Fix bug in RHP socket timeout code (65) // 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 +2376,6 @@ FirstInit()
timeLoadedMS = GetTickCount(); timeLoadedMS = GetTickCount();
srand(time(NULL));
INITIALISEPORTS(); INITIALISEPORTS();
OpenReportingSockets(); OpenReportingSockets();
@ -6132,14 +6117,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 +6149,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);

126
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));
} }
@ -1651,8 +1604,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 +1624,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;
@ -1799,7 +1733,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 +1785,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 +2816,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 +2865,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 +2922,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 +3220,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 +3228,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 +3601,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");
@ -4369,8 +4305,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 +5522,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");

View File

@ -77,8 +77,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 +363,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 +376,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;
} }
@ -480,7 +473,7 @@ int C_Q_ADD_NP(VOID *PQ, VOID *PBUFF)
next = Q[0]; next = Q[0];
while (next[0] != 0) while (next[0] != 0)
next = next[0]; // Chain to end of queue next=next[0]; // Chain to end of queue
next[0] = BUFF; // New one on end next[0] = BUFF; // New one on end
@ -1068,7 +1061,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 +1124,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
@ -4805,7 +4792,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 +4833,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]))
{ {

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

@ -1866,6 +1866,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 +1917,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]))
{ {

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
*/ */
//#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers //#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
@ -105,13 +104,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);
@ -3798,82 +3793,12 @@ 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[4] = " ";
int NodeCount; int NodeCount;
@ -3882,33 +3807,11 @@ doHeader:
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;
@ -4476,7 +4379,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++)
{ {

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

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

149
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,18 @@ 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);
unsigned char * Compressit(unsigned char * In, int Len, int * OutLen);
int doinflate(unsigned char * source, unsigned char * dest, int Len, int destlen, int * outLen); 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 L4Compress;
extern int L4CompMaxframe; extern int L4CompMaxframe;
extern int L4CompPaclen; 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 +299,6 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
return; return;
} }
L3MSG = GetBuff(); L3MSG = GetBuff();
if (L3MSG == 0) if (L3MSG == 0)
@ -573,55 +567,6 @@ void sendChunk(TRANSPORTENTRY * L4, unsigned char * Compressed, int complen, int
} }
} }
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 +628,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;
} }
@ -721,32 +666,36 @@ VOID L4BG()
if (L4->AllowCompress) if (L4->AllowCompress)
{ {
int complen = 0; int complen = 0;
unsigned char Compressed[8192]; unsigned char * Compressed;
unsigned char toCompress[8192];
int toCompressLen = 0;
int dataLen; int dataLen;
int savePort = Msg->PORT; int savePort = Msg->PORT;
int maxCompSendLen; int maxCompSendLen;
// Save first packet, then see if more on TX_Q // Save first packet, then see if more on TX_Q
L4->toCompress = malloc(8192);
L4->toCompressLen = 0;
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen; L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen); memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen; L4->toCompressLen += dataLen;
// See if first will compress. If not assume too short or already compressed data and just send // See if first will compress. If not assume too short or already compressed data and just send
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen); Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
if (complen >= dataLen) if (complen >= dataLen)
{ {
free(Compressed);
L4->SentAfterCompression += dataLen; L4->SentAfterCompression += dataLen;
SENDL4MESSAGE(L4, Msg); SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
toCompressLen = 0; free(L4->toCompress);
L4->toCompress = 0;
L4->toCompressLen = 0;
continue; continue;
} }
@ -756,7 +705,7 @@ VOID L4BG()
{ {
// no more, so just send the stuff we've just compressed. Compressed data will fit in input packet // 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); // Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
memcpy(Msg->L2DATA, Compressed, complen); memcpy(Msg->L2DATA, Compressed, complen);
@ -767,13 +716,17 @@ VOID L4BG()
SENDL4MESSAGE(L4, Msg); SENDL4MESSAGE(L4, Msg);
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
toCompressLen = 0; free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
continue; continue;
} }
free(Compressed);
ReleaseBuffer(Msg); // Not going to use it ReleaseBuffer(Msg); // Not going to use it
while (L4->L4TX_Q && toCompressLen < (8192 - 256)) // Make sure can't overrin buffer while (L4->L4TX_Q && L4->toCompressLen < (8192 - 256)) // Make sure can't overrin buffer
{ {
// Collect the data from L4TX_Q // Collect the data from L4TX_Q
@ -781,17 +734,16 @@ VOID L4BG()
dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid dataLen = Msg->LENGTH - MSGHDDRLEN - 1; // No header or pid
L4->Sent += dataLen; L4->Sent += dataLen;
memcpy(&toCompress[toCompressLen], Msg->L2DATA, dataLen); memcpy(&L4->toCompress[L4->toCompressLen], Msg->L2DATA, dataLen);
toCompressLen += dataLen; L4->toCompressLen += dataLen;
ReleaseBuffer(Msg); ReleaseBuffer(Msg);
} }
toCompress[toCompressLen] = 0; L4->toCompress[L4->toCompressLen] = 0;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen); Compressed = Compressit(L4->toCompress, L4->toCompressLen, &complen);
// Debugprintf("%d %d %d%%", L4->toCompressLen, complen, ((L4->toCompressLen - complen) * 100) / L4->toCompressLen);
Debugprintf("%d %d %d%%", toCompressLen, complen, ((toCompressLen - complen) * 100) / toCompressLen);
// Send compressed // Send compressed
@ -810,8 +762,8 @@ VOID L4BG()
int Fragments; int Fragments;
int ChunkSize; int ChunkSize;
unsigned char * CompressPtr = toCompress; unsigned char * CompressPtr = L4->toCompress;
int bytesleft = toCompressLen; int bytesleft = L4->toCompressLen;
// Assume 10% worse compression on smaller input // Assume 10% worse compression on smaller input
@ -819,7 +771,7 @@ VOID L4BG()
Fragments = j / maxCompSendLen; Fragments = j / maxCompSendLen;
Fragments++; Fragments++;
ChunkSize = (toCompressLen / Fragments) + 1; // 1 for rounding ChunkSize = (L4->toCompressLen / Fragments) + 1; // 1 for rounding
while (bytesleft > 0) while (bytesleft > 0)
{ {
@ -827,9 +779,9 @@ VOID L4BG()
if (Len > ChunkSize) if (Len > ChunkSize)
Len = ChunkSize; Len = ChunkSize;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen); free (Compressed);
Compressed = Compressit(CompressPtr, Len, &complen);
Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len); // Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);
sendChunk(L4, Compressed, complen, savePort); sendChunk(L4, Compressed, complen, savePort);
@ -841,7 +793,10 @@ VOID L4BG()
else else
sendChunk(L4, Compressed, complen,savePort); sendChunk(L4, Compressed, complen,savePort);
toCompressLen = 0; free(L4->toCompress);
L4->toCompressLen = 0;
L4->toCompress = 0;
free(Compressed);
} }
else else
{ {
@ -853,8 +808,6 @@ VOID L4BG()
continue; 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
@ -983,6 +936,9 @@ VOID CLEARSESSIONENTRY(TRANSPORTENTRY * Session)
if (Session->PARTCMDBUFFER) if (Session->PARTCMDBUFFER)
ReleaseBuffer(Session->PARTCMDBUFFER); ReleaseBuffer(Session->PARTCMDBUFFER);
if (Session->toCompress)
free(Session->toCompress);
if (Session->unCompress) if (Session->unCompress)
free(Session->unCompress); free(Session->unCompress);
@ -1820,7 +1776,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 +1791,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
@ -2009,7 +1965,7 @@ VOID FRAMEFORUS(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG, int ApplMask,
{ {
// INTERNODE LINK // INTERNODE LINK
TRANSPORTENTRY * L4; TRANSPORTENTRY * L4 = 0;
struct DEST_LIST * DEST; struct DEST_LIST * DEST;
int Opcode; int Opcode;
char Nodename[20]; char Nodename[20];
@ -2533,14 +2489,13 @@ VOID ACKFRAMES(L3MESSAGEBUFFER * L3MSG, TRANSPORTENTRY * L4, int NR)
RTT = GetTickCount() - L4->RTT_TIMER; RTT = GetTickCount() - L4->RTT_TIMER;
if (RTT < 180000) // Sanity Check if (RTT < 180) // 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;
} }
} }

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

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

51
RHP.c
View File

@ -451,13 +451,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;
@ -475,10 +470,9 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
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,60 +483,23 @@ 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;
} }
Len = strlen(Data);
ptr = Data; ptr = Data;
while (Len > RHPPaclen) while (Len > RHPPaclen)
@ -683,7 +640,7 @@ void RHPPoll()
// 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))

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

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

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

View File

@ -4501,7 +4501,7 @@ MsgLoop:
WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R'); WritetoTrace(Stream, MsgPtr, InputLen, sockptr->ADIF, 'R');
} }
if (InputLen == 8 && memcmp(MsgPtr, ";;;;;;\r\n", 8) == 0) if (InputLen == 8 && memcmp(MsgPtr, ";;;\r\n", 8) == 0)
{ {
// CMS Keepalive // CMS Keepalive
@ -5146,13 +5146,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;
@ -5473,7 +5467,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 +5523,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");

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

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

1
VARA.c
View File

@ -1720,6 +1720,7 @@ VConnected:
GetSemaphore(&Semaphore, 52); GetSemaphore(&Semaphore, 52);
VARAProcessReceivedControl(TNC); VARAProcessReceivedControl(TNC);
FreeSemaphore(&Semaphore); FreeSemaphore(&Semaphore);
Debugprintf("VARA Returned from processing control packet");
} }
if (FD_ISSET(TNC->TCPDataSock, &readfs)) if (FD_ISSET(TNC->TCPDataSock, &readfs))

View File

@ -10,15 +10,14 @@
#endif #endif
#define KVers 6,0,24,71 #define KVers 6,0,24,65
#define KVerstring "6.0.24.71\0" #define KVerstring "6.0.24.65\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]))
{ {

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

@ -1580,6 +1580,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 +1606,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

@ -176,6 +176,8 @@ typedef struct _TRANSPORTENTRY
// We collect as much data as possible before compressing and re-packetizing // We collect as much data as possible before compressing and re-packetizing
int AllowCompress; int AllowCompress;
unsigned char * toCompress; // Data being saved to compress
int toCompressLen;
unsigned char * unCompress; // Data being saved to uncompress unsigned char * unCompress; // Data being saved to uncompress
int unCompressLen; int unCompressLen;
@ -253,7 +255,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 +462,16 @@ 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 ROUT_LOCKED;
UCHAR Padding[4]; // 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
@ -496,8 +495,8 @@ typedef struct DEST_LIST
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,7 +700,6 @@ 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;
@ -961,21 +959,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 +1354,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();

33
cMain.c
View File

@ -144,12 +144,6 @@ int L4Compress = 0;
int L4CompMaxframe = 3; int L4CompMaxframe = 3;
int L4CompPaclen = 236; 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 +161,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
@ -845,20 +837,6 @@ BOOL Start()
if (L4CompPaclen < 64 || L4CompPaclen > 236) if (L4CompPaclen < 64 || L4CompPaclen > 236)
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
// int APPL1 = 0; // int APPL1 = 0;
@ -984,7 +962,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 +986,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;
@ -1469,8 +1443,6 @@ BOOL Start()
ENDBUFFERPOOL = NEXTFREEDATA; ENDBUFFERPOOL = NEXTFREEDATA;
PoolBuilt = 1;
// Copy Bridge Map // Copy Bridge Map
@ -1588,7 +1560,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 +1572,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;

View File

@ -308,7 +308,7 @@ static char *keywords[] =
"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" "L4Compress", "L4CompMaxframe", "L4CompPaclen"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -330,8 +330,7 @@ static void * offset[] =
&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,
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe, &xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen}; /* offset for corresponding data in config file */
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -352,8 +351,7 @@ static int routine[] =
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,
1, 1, 1, 1, 1, 1, 1, 1} ; // Routine to process param
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 +373,7 @@ 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"}; /* parameter keywords */
static void * poffset[] = static void * poffset[] =
{ {
@ -389,7 +387,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 +401,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 +535,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])
@ -625,10 +621,6 @@ BOOL ProcessConfig()
paramok[86]=1; // L4Compress paramok[86]=1; // L4Compress
paramok[87]=1; // L4Compress Maxframe paramok[87]=1; // L4Compress Maxframe
paramok[88]=1; // L4Compress Paclen 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
@ -174,10 +173,6 @@ struct CONFIGTABLE
int C_L4Compress; int C_L4Compress;
int C_L4CompMaxframe; int C_L4CompMaxframe;
int C_L4CompPaclen; 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

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

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

2
mqtt.c
View File

@ -429,6 +429,6 @@ void MQTTKISSRX(void *message) {};
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {}; void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {};
void MQTTTimer() {}; void MQTTTimer() {};
void MQTTReportSession(char * Msg) {}; void MQTTReportSession(char * Msg) {};
void MQTTMessageEvent(void* message) {};
#endif #endif

View File

@ -2,7 +2,6 @@
// Authentication is via Telnet USER records. // Authentication is via Telnet USER records.
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
#include "cheaders.h" #include "cheaders.h"
@ -336,7 +335,7 @@ Token * find_token(const char* token)
int send_http_response(char * response, const char* msg) int send_http_response(char * response, const char* msg)
{ {
return sprintf(response, "HTTP/1.1 %s\r\nAccess-Control-Allow-Origin: *\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg); return sprintf(response, "HTTP/1.1 %s\r\nContent-Length: 0\r\nConnection: close\r\n\r\n", msg);
} }
/* /*

View File

@ -520,8 +520,7 @@ char * MainConfigtxt()
"<textarea cols=\"8\" rows=\"5\" name=\"Hat\">%s</textarea>\r\n" "<textarea cols=\"8\" rows=\"5\" name=\"Hat\">%s</textarea>\r\n"
"<textarea cols=\"8\" rows=\"5\" name=\"HBID\">%s</textarea>\r\n" "<textarea cols=\"8\" rows=\"5\" name=\"HBID\">%s</textarea>\r\n"
"<p></p>" "<p></p>"
"&nbsp;FBB reject.sys type filters (all fields must match, wildcards allowed)<br>" "&nbsp;FBB reject.sys type filters (all fields must match, wildcards allowed)\r\n"
"&nbsp;'A' action accepts message if all fields match without checking following lines\r\n"
"<p></p>" "<p></p>"
"<div style='position: absolute; left: 20px;height: 120px; overflow:auto;'>%s</div>" "<div style='position: absolute; left: 20px;height: 120px; overflow:auto;'>%s</div>"
"<div style='position: absolute; top: 1120px;left: 300px; overflow:auto;'>" "<div style='position: absolute; top: 1120px;left: 300px; overflow:auto;'>"

14
upnp.c
View File

@ -93,11 +93,7 @@ int i;
const char * rootdescurl = 0; const char * rootdescurl = 0;
const char * multicastif = 0; const char * multicastif = 0;
const char * minissdpdpath = 0; const char * minissdpdpath = 0;
#ifdef UPNP_LOCAL_PORT_ANY
int localport = UPNP_LOCAL_PORT_ANY; int localport = UPNP_LOCAL_PORT_ANY;
#else
int localport = 0;
#endif
int retcode = 0; int retcode = 0;
int error = 0; int error = 0;
int ipv6 = 0; int ipv6 = 0;
@ -123,11 +119,8 @@ int upnpInit()
{ {
if (devlist == NULL) if (devlist == NULL)
{ {
#if MINIUPNPC_API_VERSION == 10
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
#else
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error); devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
#endif
if (devlist == NULL) if (devlist == NULL)
{ {
Consoleprintf("Failed to find a UPNP device"); Consoleprintf("Failed to find a UPNP device");
@ -157,11 +150,8 @@ int upnpClose()
{ {
if (devlist == NULL) if (devlist == NULL)
{ {
#if MINIUPNPC_API_VERSION == 10
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
#else
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error); devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
#endif
if (devlist == NULL) if (devlist == NULL)
{ {
Consoleprintf("Failed to find a UPNP device"); Consoleprintf("Failed to find a UPNP device");