Compare commits

..

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

49 changed files with 190 additions and 1321 deletions

View file

@ -441,6 +441,8 @@ HANDLE hMapFile;
// Logging // Logging
static int LogAge = 14;
int APRSWriteLog(char * msg) int APRSWriteLog(char * msg)
{ {
FILE *file; FILE *file;

View file

@ -1456,7 +1456,7 @@ VOID SaveHousekeeping(struct HTTPConnectionInfo * Session, char * MsgPtr, char *
GetParam(input, "MaxAge=", Temp); GetParam(input, "MaxAge=", Temp);
MaxAge = atoi(Temp); MaxAge = atoi(Temp);
GetParam(input, "LogLife=", Temp); GetParam(input, "LogLife=", Temp);
BBSLogAge = atoi(Temp); LogAge = atoi(Temp);
GetParam(input, "UserLife=", Temp); GetParam(input, "UserLife=", Temp);
UserLifetime= atoi(Temp); UserLifetime= atoi(Temp);
@ -2666,7 +2666,7 @@ VOID SendHouseKeeping(char * Reply, int * ReplyLen, char * Key)
*ReplyLen = sprintf(Reply, HousekeepingTemplate, *ReplyLen = sprintf(Reply, HousekeepingTemplate,
BBSName, Key, Key, Key, Key, Key, Key, Key, Key, Key, BBSName, Key, Key, Key, Key, Key, Key, Key, Key, Key,
MaintTime, MaintInterval, MaxMsgno, BidLifetime, BBSLogAge, UserLifetime, MaintTime, MaintInterval, MaxMsgno, BidLifetime, LogAge, UserLifetime,
(DeletetoRecycleBin) ? CHKD : UNC, (DeletetoRecycleBin) ? CHKD : UNC,
(SendNonDeliveryMsgs) ? CHKD : UNC, (SendNonDeliveryMsgs) ? CHKD : UNC,
(SuppressMaintEmail) ? CHKD : UNC, (SuppressMaintEmail) ? CHKD : UNC,

View file

@ -9939,8 +9939,8 @@ VOID SaveConfig(char * ConfigName)
SaveIntValue(group, "MaxMsgno", MaxMsgno); SaveIntValue(group, "MaxMsgno", MaxMsgno);
SaveIntValue(group, "BidLifetime", BidLifetime); SaveIntValue(group, "BidLifetime", BidLifetime);
SaveIntValue(group, "MaxAge", MaxAge); SaveIntValue(group, "MaxAge", MaxAge);
SaveIntValue(group, "LogLifetime", BBSLogAge); SaveIntValue(group, "LogLifetime", LogAge);
SaveIntValue(group, "LogLifetime", BBSLogAge); SaveIntValue(group, "LogLifetime", LogAge);
SaveIntValue(group, "MaintInterval", MaintInterval); SaveIntValue(group, "MaintInterval", MaintInterval);
SaveIntValue(group, "UserLifetime", UserLifetime); SaveIntValue(group, "UserLifetime", UserLifetime);
SaveIntValue(group, "MaintTime", MaintTime); SaveIntValue(group, "MaintTime", MaintTime);
@ -10601,7 +10601,7 @@ BOOL GetConfig(char * ConfigName)
LastHouseKeepingTime = GetIntValue(group, "LastHouseKeepingTime"); LastHouseKeepingTime = GetIntValue(group, "LastHouseKeepingTime");
LastTrafficTime = GetIntValue(group, "LastTrafficTime"); LastTrafficTime = GetIntValue(group, "LastTrafficTime");
MaxMsgno = GetIntValue(group, "MaxMsgno"); MaxMsgno = GetIntValue(group, "MaxMsgno");
BBSLogAge = GetIntValue(group, "LogLifetime"); LogAge = GetIntValue(group, "LogLifetime");
BidLifetime = GetIntValue(group, "BidLifetime"); BidLifetime = GetIntValue(group, "BidLifetime");
MaxAge = GetIntValue(group, "MaxAge"); MaxAge = GetIntValue(group, "MaxAge");
if (MaxAge == 0) if (MaxAge == 0)

345
BPQINP3.c
View file

@ -37,19 +37,13 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
extern int DEBUGINP3; extern int DEBUGINP3;
int NegativePercent = 120; // if time is 10% worse send negative info int NegativePercent = 110; // if time is 10% worse send negative info
int PositivePercent = 80; // if time is 20% better send positive info int PositivePercent = 80; // if time is 20% better send positive info
int NegativeDelay = 10; // Seconds between checks for negative info - should be quite shourt
int PositiveDelay = 300;
time_t SENDRIFTIME = 0;
int RIFInterval = 60;
VOID SendNegativeInfo(); VOID SendNegativeInfo();
VOID SortRoutes(struct DEST_LIST * Dest); VOID SortRoutes(struct DEST_LIST * Dest);
VOID SendRTTMsg(struct ROUTE * Route); VOID SendRTTMsg(struct ROUTE * Route);
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame); VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
void NETROMCloseTCP(struct ROUTE * Route);
static VOID SendNetFrame(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame) static VOID SendNetFrame(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
{ {
@ -111,8 +105,7 @@ struct _RTTMSG RTTMsg = {""};
//struct ROUTE DummyRoute = {"","",""}; //struct ROUTE DummyRoute = {"","",""};
int RIPTimerCount = 0; // 1 sec to 10 sec counter int RIPTimerCount = 0; // 1 sec to 10 sec counter
int PosTimerCount = 0; int PosTimerCount = 0; // 1 sec to 5 Mins counter
int NegTimerCount = 0;
// Timer Runs every 10 Secs // Timer Runs every 10 Secs
@ -129,8 +122,6 @@ VOID InitialiseRTT()
{ {
UCHAR temp[256] = ""; UCHAR temp[256] = "";
SENDRIFTIME = time(NULL);
memset(&RTTMsg, ' ', sizeof(struct _RTTMSG)); memset(&RTTMsg, ' ', sizeof(struct _RTTMSG));
memcpy(RTTMsg.ID, "L3RTT: ", 7); memcpy(RTTMsg.ID, "L3RTT: ", 7);
memcpy(RTTMsg.VERSION, "LEVEL3_V2.1 ", 12); memcpy(RTTMsg.VERSION, "LEVEL3_V2.1 ", 12);
@ -179,7 +170,7 @@ VOID DeleteINP3Routes(struct ROUTE * Route)
Route->Status = 0; Route->Status = 0;
Route->Timeout = 0; Route->Timeout = 0;
Route->NeighbourSRTT = 0; Route->NeighbourSRTT = 0;
Route->localport = 0;
Dest--; Dest--;
// Delete any Dest entries via this Route // Delete any Dest entries via this Route
@ -224,7 +215,7 @@ VOID DeleteINP3Routes(struct ROUTE * Route)
continue; continue;
} }
Dest->INP3ROUTE[1].RouteLastTT[Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->recNum] = Dest->INP3ROUTE[0].STT; // So next scan will check if rtt has increaced enough to need a RIF Dest->INP3ROUTE[1].LastTT = Dest->INP3ROUTE[0].STT; // So next scan will check if rtt has increaced enough to need a RIF
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY)); memcpy(&Dest->INP3ROUTE[0], &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[1], &Dest->INP3ROUTE[2], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY)); memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY));
@ -580,10 +571,7 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
Dest->INP3ROUTE[0].Hops = hops; Dest->INP3ROUTE[0].Hops = hops;
Dest->INP3ROUTE[0].STT = rtt; Dest->INP3ROUTE[0].STT = rtt;
if (Dest->INP3ROUTE[0].RouteLastTT == 0) Dest->INP3ROUTE[0].LastTT = 0;
Dest->INP3ROUTE[0].RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
Dest->INP3ROUTE[0].RouteLastTT[Route->recNum] = 0;
Dest->INP3FLAGS = NewNode; Dest->INP3FLAGS = NewNode;
@ -708,10 +696,7 @@ Found:
VOID AddHere(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt) VOID AddHere(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR,struct ROUTE * Route , int hops, int rtt)
{ {
ROUTEPTR->Hops = hops; ROUTEPTR->Hops = hops;
if (ROUTEPTR->RouteLastTT == 0) ROUTEPTR->LastTT = 0;
ROUTEPTR->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
ROUTEPTR->RouteLastTT[Route->recNum] = 0;
ROUTEPTR->STT = rtt; ROUTEPTR->STT = rtt;
ROUTEPTR->ROUT_NEIGHBOUR = Route; ROUTEPTR->ROUT_NEIGHBOUR = Route;
@ -889,16 +874,6 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
return; return;
} }
// Check TTL
if (Buff->L3TTL < 2)
{
ReleaseBuffer(Buff);
return;
}
Buff->L3TTL--;
if (Route->NEIGHBOUR_LINK->LINKPORT && (Route->NEIGHBOUR_LINK->LINKPORT->ALLOWINP3 || Route->NEIGHBOUR_LINK->LINKPORT->ENABLEINP3)) if (Route->NEIGHBOUR_LINK->LINKPORT && (Route->NEIGHBOUR_LINK->LINKPORT->ALLOWINP3 || Route->NEIGHBOUR_LINK->LINKPORT->ENABLEINP3))
Route->INP3Node = 1; Route->INP3Node = 1;
@ -1109,11 +1084,17 @@ 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;
if (DEBUGINP3) 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
@ -1207,13 +1188,13 @@ int SendRIPTimer()
Route->ConnectionAttempts++; Route->ConnectionAttempts++;
if (Route->INP3Node && ((Route->TCPPort == 0 || strcmp(Route->TCPHost, "0.0.0.0") != 0))) if (Route->INP3Node)
{ {
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0; Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
if (DEBUGINP3) Debugprintf("INP3 Activating link to %s", Normcall); if (DEBUGINP3) Debugprintf("INP3 Activating link to %s", Normcall);
} }
L2SETUPCROSSLINKEX(Route, 2); // Only try SABM/XID twice L2SETUPCROSSLINKEX(Route, 2); // Only try SABM twice
Route->NeighbourSRTT = 0; // just in case! Route->NeighbourSRTT = 0; // just in case!
Route->BCTimer = 0; Route->BCTimer = 0;
@ -1291,12 +1272,6 @@ int SendRIPTimer()
Route->NEIGHBOUR_LINK->L2TIMER = 1; // TO FORCE DISC Route->NEIGHBOUR_LINK->L2TIMER = 1; // TO FORCE DISC
Route->NEIGHBOUR_LINK->L2STATE = 4; // DISCONNECTING Route->NEIGHBOUR_LINK->L2STATE = 4; // DISCONNECTING
} }
else
{
// but we should reset the TCP connection
NETROMCloseTCP(Route);
}
} }
Route->BCTimer = 5; // Wait a while before retrying Route->BCTimer = 5; // Wait a while before retrying
@ -1352,101 +1327,74 @@ VOID SendRIF(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Msg)
SendNetFrame(Route, Msg); SendNetFrame(Route, Msg);
} }
VOID SendRIFToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_ROUTE_ENTRY * Entry, int Negative, int portNum) VOID SendRIFToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_ROUTE_ENTRY * Entry, int Negative)
{ {
struct ROUTE * Routes = NEIGHBOURS; struct ROUTE * Routes = NEIGHBOURS;
struct _L3MESSAGEBUFFER * Msg; struct _L3MESSAGEBUFFER * Msg;
int count, MaxRoutes = MAXNEIGHBOURS; int count, MaxRoutes = MAXNEIGHBOURS;
char NodeCall[10]; char Normcall[10];
char destCall[10]; char Normcall2[10];
int sendHops, sendTT, lastTT; int sendHops, sendTT, lastTT;
int sent = 0;
// if portNum is set sending a periodic refresh. Just sent to this port Normcall[ConvFromAX25(axcall, Normcall)] = 0;
NodeCall[ConvFromAX25(axcall, NodeCall)] = 0;
for (count = 0; count < MaxRoutes; count++) for (count = 0; count < MaxRoutes; count++)
{ {
if ((Entry->ROUT_NEIGHBOUR && Routes->INP3Node) && if ((Entry->ROUT_NEIGHBOUR && Routes->INP3Node) &&
(Routes->Status) && (Routes->Status) &&
// (memcmp(Routes->NEIGHBOUR_CALL
(Routes != Entry->ROUT_NEIGHBOUR)) // Dont send to originator of route (Routes != Entry->ROUT_NEIGHBOUR)) // Dont send to originator of route
{ {
// as the value sent will be different for each link, we need to check if change is enough here // as the value sent will be different for each link, we need to check if change is enough here
sendHops = Entry->Hops + 1; sendHops = Entry->Hops + 1;
sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement; sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement;
lastTT = Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum]; lastTT = Entry->LastTT + Entry->LastNeighbourTT;
if (!portNum) if (Negative)
{
if (Negative)
{
// only send if significantly worse
if (sendTT < (lastTT * NegativePercent) / 100)
{
Routes+=1;
continue;
}
}
else
{
// Send if significantly better
if (sendTT > (lastTT * PositivePercent) / 100)
{
Routes+=1;
continue;
}
}
}
// Don't send if Node is the Neighbour we are sending to
if (memcmp(Routes->NEIGHBOUR_CALL, axcall, 7) == 0)
{ {
if (DEBUGINP3) Debugprintf("INP3 SendRIFToOtherNeighbours Don't send %s to itself", NodeCall); // only send if significantly worse
Routes+=1;
continue;
}
if (portNum && Routes->NEIGHBOUR_PORT != portNum) if (sendTT < (lastTT * NegativePercent) / 100)
{
Routes+=1;
continue;
}
}
else
{ {
Routes+=1; // Send if significantly better
continue;
if (sendTT > (lastTT * PositivePercent) / 100)
{
Routes+=1;
continue;
}
} }
if (portNum) sent++;
Routes->Status &= ~SentOurRIF;
Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] = sendTT;
if (DEBUGINP3) Debugprintf("INP3 SendRIFToOtherNeighbours for %s", Normcall);
if (DEBUGINP3) Debugprintf("INP3 %s Old RTT %d Old NRTT %d New %d %d Sufficent change so sending if in other ends limits",
Normcall, Entry->LastTT, Entry->LastNeighbourTT, sendTT, Entry->ROUT_NEIGHBOUR->RTTIncrement);
Entry->LastTT = Entry->STT;
Entry->LastNeighbourTT = Entry->ROUT_NEIGHBOUR->RTTIncrement;
// send, but only if within their constraints // send, but only if within their constraints
if ((Routes->RemoteMAXHOPS == 0 || Routes->RemoteMAXHOPS >= Entry->Hops) && if ((Routes->RemoteMAXHOPS == 0 || Routes->RemoteMAXHOPS >= Entry->Hops) &&
(Routes->RemoteMAXRTT == 0 || Routes->RemoteMAXRTT >= sendTT || sendTT == 60000)) (Routes->RemoteMAXRTT == 0 || Routes->RemoteMAXRTT >= Entry->STT || Entry->STT == 60000))
{ {
if (DEBUGINP3)
{
if (portNum)
Debugprintf("INP3 %s Timer Refresh Sending to port %d", NodeCall, portNum);
else
Debugprintf("INP3 %s Old TT %d New %d Sufficent change so sending ", NodeCall, lastTT, sendTT);
}
Msg = Routes->Msg; Msg = Routes->Msg;
if (Msg == NULL) if (Msg == NULL)
{ {
if (DEBUGINP3) Normcall2[ConvFromAX25(Routes->NEIGHBOUR_CALL, Normcall2)] = 0;
{ if (DEBUGINP3) Debugprintf("INP3 Building RIF to send to %s", Normcall2);
destCall[ConvFromAX25(Entry->ROUT_NEIGHBOUR->NEIGHBOUR_CALL, destCall)] = 0;
Debugprintf("INP3 Building RIF to send to %s", destCall);
}
Msg = Routes->Msg = CreateRIFHeader(Routes); Msg = Routes->Msg = CreateRIFHeader(Routes);
} }
@ -1454,12 +1402,12 @@ VOID SendRIFToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_RO
{ {
if (Routes->OldBPQ) if (Routes->OldBPQ)
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH],
axcall, alias, sendHops, sendTT + 10); axcall, alias, sendHops, sendTT + 10);
else else
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH],
axcall, alias, sendHops, sendTT); axcall, alias, sendHops, sendTT);
if (Msg->LENGTH > 250 - 15) if (Msg->LENGTH > 250 - 15)
// if (Msg->LENGTH > Routes->NBOUR_PACLEN - 11) // if (Msg->LENGTH > Routes->NBOUR_PACLEN - 11)
{ {
@ -1470,9 +1418,13 @@ VOID SendRIFToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_DEST_RO
} }
} }
Routes+=1; Routes+=1;
} }
if (sent)
Debugprintf("INP3 End of Loop %s Old RTT %d Old NRTT %d ", Normcall, Entry->LastTT, Entry->LastNeighbourTT);
} }
VOID SendRIFToNewNeighbour(struct ROUTE * Route) VOID SendRIFToNewNeighbour(struct ROUTE * Route)
@ -1504,9 +1456,9 @@ VOID SendRIFToNewNeighbour(struct ROUTE * Route)
// Best Route not via this neighbour - send, but only if within their constraints // Best Route not via this neighbour - send, but only if within their constraints
sendHops = Entry->Hops + 1; sendHops = Entry->Hops + 1;
Entry->LastTT = Entry->STT;
sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement; sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement;
Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] = sendTT;
if ((Route->RemoteMAXHOPS == 0 || Route->RemoteMAXHOPS >= Entry->Hops) && if ((Route->RemoteMAXHOPS == 0 || Route->RemoteMAXHOPS >= Entry->Hops) &&
(Route->RemoteMAXRTT == 0 || Route->RemoteMAXRTT >= Entry->STT || Entry->STT == 60000)) (Route->RemoteMAXRTT == 0 || Route->RemoteMAXRTT >= Entry->STT || Entry->STT == 60000))
@ -1595,11 +1547,10 @@ VOID SendNegativeInfo()
if (Entry->ROUT_NEIGHBOUR == 0) if (Entry->ROUT_NEIGHBOUR == 0)
continue; continue;
if (Entry->LastTT == 0) // if zero haven't yet reported +ve info. Shouldn't really be reporting negative without positive but just in case
if (Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] == 0) // if zero haven't yet reported +ve info. Shouldn't really be reporting negative without positive but just in case SendRIFToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry, TRUE);
SendRIFToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry, TRUE, FALSE);
else else
SendRIFToOtherNeighbours(Dest->DEST_CALL, 0, Entry, TRUE, FALSE); SendRIFToOtherNeighbours(Dest->DEST_CALL, 0, Entry, TRUE);
if (Entry->STT >= 60000) if (Entry->STT >= 60000)
{ {
@ -1640,11 +1591,8 @@ VOID SendPositiveInfo()
{ {
Dest++; Dest++;
if (Dest->DEST_CALL[0] == 0) // unused entry
continue;
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->INP3ROUTE[0];
SendRIFToOtherNeighbours(Dest->DEST_CALL, 0, Entry, FALSE, FALSE); SendRIFToOtherNeighbours(Dest->DEST_CALL, 0, Entry, FALSE);
} }
} }
@ -1668,169 +1616,11 @@ VOID SendNewInfo()
Entry = &Dest->INP3ROUTE[0]; Entry = &Dest->INP3ROUTE[0];
SendRIFToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry, FALSE, FALSE); SendRIFToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry, FALSE);
} }
} }
} }
// Refresh RIF entries for each route. Shouldn't be necessary, but add for now
int routeCount = 0;
struct ROUTE * Route = NULL;
VOID sendAlltoOneNeigbour(struct ROUTE * Route)
{
char Call[10];
struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
int i;
struct _L3MESSAGEBUFFER * Msg;
int sendHops, sendTT, lastTT;
APPLCALLS * APPL;
int App;
Call[ConvFromAX25(Route->NEIGHBOUR_CALL, Call)] = 0;
if (DEBUGINP3) Debugprintf("INP3 Manual send RIF to %s", Call);
// send a RIF for our Node and all our APPLCalls
Msg = Route->Msg;
if (Msg == NULL)
Msg = Route->Msg = CreateRIFHeader(Route);
if (Msg == 0)
return;
if (Route->OldBPQ)
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->RTTIncrement * 10);
else
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->RTTIncrement);
for (App = 0; App < NumberofAppls; App++)
{
APPL=&APPLCALLTABLE[App];
if (APPL->APPLQUAL > 0)
{
if (Route->OldBPQ)
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->RTTIncrement * 10);
else
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->RTTIncrement);
}
}
// Send all dests that have this route as their best inp3 route
Dest--;
for (i=0; i < MAXDESTS; i++)
{
Dest++;
Entry = &Dest->INP3ROUTE[0];
if (Entry->ROUT_NEIGHBOUR == 0)
continue;
if (Entry->ROUT_NEIGHBOUR && Route->INP3Node && Route->Status && Route != Entry->ROUT_NEIGHBOUR) // Dont send to originator of route
{
// as the value sent will be different for each link, we need to check if change is enough here
// Don't send if Node is the Neighbour we are sending to
if (memcmp(Route->NEIGHBOUR_CALL, Dest->DEST_CALL, 7) == 0)
{
if (DEBUGINP3) Debugprintf("INP3 Timer RIF Don't send %s to itself", Call);
Route++;
continue;
}
sendHops = Entry->Hops + 1;
sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement;
lastTT = Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum];
Entry->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] = sendTT;
// send, but only if within their constraints
if ((Route->RemoteMAXHOPS == 0 || Route->RemoteMAXHOPS >= Entry->Hops) && (Route->RemoteMAXRTT == 0 || Route->RemoteMAXRTT >= sendTT))
{
Msg = Route->Msg;
if (Msg == NULL)
Msg = Route->Msg = CreateRIFHeader(Route);
if (Msg)
{
if (Route->OldBPQ)
sendTT *= 10;
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Dest->DEST_CALL, Dest->DEST_ALIAS, sendHops, sendTT);
if (Msg->LENGTH > 250 - 15)
{
SendRIF(Route, Msg);
Route->Msg = NULL;
}
}
}
}
}
if (Route->Msg)
{
SendRIF(Route, Route->Msg);
Route->Msg = NULL;
}
}
VOID SendAllInfo()
{
time_t Now = time(NULL);
if (routeCount == 0) // Not sending
{
if (RIFInterval == 0 || (Now - SENDRIFTIME) < RIFInterval) // Time for new send?
return;
Route = NEIGHBOURS;
}
// Build RIF
while (Route->INP3Node == 0)
{
Route++;
routeCount++;
if (routeCount == MAXNEIGHBOURS)
{
//cycle finished
SENDRIFTIME = Now;
routeCount = 0;
return;
}
}
sendAlltoOneNeigbour(Route);
Route++;
routeCount++;
if (routeCount == MAXNEIGHBOURS)
{
//cycle finished
SENDRIFTIME = Now;
routeCount = 0;
}
}
VOID INP3TIMER() VOID INP3TIMER()
{ {
@ -1853,27 +1643,20 @@ VOID INP3TIMER()
#endif #endif
if (NegTimerCount == 0) SendNegativeInfo(); // Urgent
{
NegTimerCount = NegativeDelay;
SendNegativeInfo();
}
else
NegTimerCount--;
if (RIPTimerCount == 0) if (RIPTimerCount == 0)
{ {
RIPTimerCount = 10; RIPTimerCount = 10;
SendNewInfo(); // Not quite so urgent SendNewInfo(); // Not quite so urgent
SendRIPTimer(); SendRIPTimer();
SendAllInfo(); // Timer Driven refresh
} }
else else
RIPTimerCount--; RIPTimerCount--;
if (PosTimerCount == 0) if (PosTimerCount == 0)
{ {
PosTimerCount = PositiveDelay; PosTimerCount = 300; // 5 mins
SendPositiveInfo(); SendPositiveInfo();
} }
else else

View file

@ -731,7 +731,7 @@ VOID WINAPI OnSelChanged(HWND hwndDlg)
SetDlgItemInt(pHdr->hwndDisplay, IDC_MAXMSG, MaxMsgno, FALSE); SetDlgItemInt(pHdr->hwndDisplay, IDC_MAXMSG, MaxMsgno, FALSE);
SetDlgItemInt(pHdr->hwndDisplay, IDC_BIDLIFETIME, BidLifetime, FALSE); SetDlgItemInt(pHdr->hwndDisplay, IDC_BIDLIFETIME, BidLifetime, FALSE);
SetDlgItemInt(pHdr->hwndDisplay, IDC_USERLIFETIME, UserLifetime, FALSE); SetDlgItemInt(pHdr->hwndDisplay, IDC_USERLIFETIME, UserLifetime, FALSE);
SetDlgItemInt(pHdr->hwndDisplay, IDC_LOGLIFETIME, BBSLogAge, FALSE); SetDlgItemInt(pHdr->hwndDisplay, IDC_LOGLIFETIME, LogAge, FALSE);
SetDlgItemInt(pHdr->hwndDisplay, IDC_MAINTINTERVAL, MaintInterval, FALSE); SetDlgItemInt(pHdr->hwndDisplay, IDC_MAINTINTERVAL, MaintInterval, FALSE);
sprintf(Time, "%04d", MaintTime); sprintf(Time, "%04d", MaintTime);
SetDlgItemText(pHdr->hwndDisplay, IDC_MAINTTIME, Time); SetDlgItemText(pHdr->hwndDisplay, IDC_MAINTTIME, Time);
@ -1979,7 +1979,7 @@ VOID SaveMAINTConfigFromDialog()
if (MaxMsgno > 99000) MaxMsgno = 99000; if (MaxMsgno > 99000) MaxMsgno = 99000;
BidLifetime = GetDlgItemInt(hwndDisplay, IDC_BIDLIFETIME, &OK1, FALSE); BidLifetime = GetDlgItemInt(hwndDisplay, IDC_BIDLIFETIME, &OK1, FALSE);
BBSLogAge = GetDlgItemInt(hwndDisplay, IDC_LOGLIFETIME, &OK1, FALSE); LogAge = GetDlgItemInt(hwndDisplay, IDC_LOGLIFETIME, &OK1, FALSE);
UserLifetime = GetDlgItemInt(hwndDisplay, IDC_USERLIFETIME, &OK1, FALSE); UserLifetime = GetDlgItemInt(hwndDisplay, IDC_USERLIFETIME, &OK1, FALSE);
MaintInterval = GetDlgItemInt(hwndDisplay, IDC_MAINTINTERVAL, &OK1, FALSE); MaintInterval = GetDlgItemInt(hwndDisplay, IDC_MAINTINTERVAL, &OK1, FALSE);
MaintTime = GetDlgItemInt(hwndDisplay, IDC_MAINTTIME, &OK1, FALSE); MaintTime = GetDlgItemInt(hwndDisplay, IDC_MAINTTIME, &OK1, FALSE);
@ -2657,7 +2657,7 @@ BOOL GetConfigFromRegistry()
Vallen=4; Vallen=4;
RegQueryValueEx(hKey,"LogLifetime",0, RegQueryValueEx(hKey,"LogLifetime",0,
(ULONG *)&Type,(UCHAR *)&BBSLogAge,(ULONG *)&Vallen); (ULONG *)&Type,(UCHAR *)&LogAge,(ULONG *)&Vallen);
Vallen=4; Vallen=4;
retCode += RegQueryValueEx(hKey,"BidLifetime",0, retCode += RegQueryValueEx(hKey,"BidLifetime",0,

View file

@ -1304,10 +1304,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Add validation of INP3 RTT messages and various INP3 fixes (12) // Add validation of INP3 RTT messages and various INP3 fixes (12)
// Change NetromX connect syntax to Service@Node to fix passing commands to local applications (12) // Change NetromX connect syntax to Service@Node to fix passing commands to local applications (12)
// Add config file option to enable writing monitor data to a file at startup (13) // Add config file option to enable writing monitor data to a file at startup (13)
// Add option to use V2.0 on a route (14)
// Don't reset NS on RR R(F) following I(P) just on RR poll following timeout. Can get problems with delayed RR R(F) (reverted) (14)
// Ignore packets that would cause an FRMR and respond to FRMR with DM (14)
// Add option to send periodic INP3 RIF refresh (15)

40
Cmd.c
View file

@ -71,7 +71,6 @@ int CompareAlias(const void *a, const void *b);
int CompareRoutes(const void * a, const void * b); int CompareRoutes(const void * a, const void * b);
void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer); void SendVARANetromNodes(struct TNCINFO * TNC, MESSAGE *Buffer);
VOID DoNetromConnect(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest, BOOL Spy, int Service); VOID DoNetromConnect(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST * Dest, BOOL Spy, int Service);
VOID sendAlltoOneNeigbour(struct ROUTE * Route);
extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer); extern VOID KISSTX(struct KISSINFO * KISS, PMESSAGE Buffer);
@ -85,7 +84,6 @@ UCHAR SAVEDAPPLFLAGS = 0;
UCHAR ALIASINVOKED = 0; UCHAR ALIASINVOKED = 0;
extern int MONTOFILEFLAG; extern int MONTOFILEFLAG;
extern int RIFInterval;
VOID * CMDPTR = 0; VOID * CMDPTR = 0;
@ -359,36 +357,6 @@ VOID POLLNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struc
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER)); SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
} }
VOID SENDRIF(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{
struct ROUTE * Route;
int Portnum = atoi(CmdTail);
unsigned char axCall[7];
char * Call = strlop(CmdTail, ' ');
if (Call && Portnum)
{
ConvToAX25(Call, axCall);
if (FindNeighbour(axCall, Portnum, &Route))
{
sendAlltoOneNeigbour(Route);
strcpy(Bufferptr, OKMSG);
Bufferptr += (int)strlen(OKMSG);
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
}
Bufferptr = Cmdprintf(Session, Bufferptr, "Route not found\r");
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
return;
}
VOID SENDNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD) VOID SENDNODES(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CMDX * CMD)
{ {
int Portnum = atoi(CmdTail); int Portnum = atoi(CmdTail);
@ -1942,13 +1910,9 @@ char * DisplayRoute(TRANSPORTENTRY * Session, char * Bufferptr, struct ROUTE *
double srtt = Routes->SRTT/100.0; double srtt = Routes->SRTT/100.0;
double nsrtt = Routes->NeighbourSRTT/100.0; double nsrtt = Routes->NeighbourSRTT/100.0;
Bufferptr = Cmdprintf(Session, Bufferptr, " %4.2fs %4.2fs %X", srtt, nsrtt, Routes->Status); Bufferptr = Cmdprintf(Session, Bufferptr, " %4.2fs %4.2fs", srtt, nsrtt);
} }
if (Routes->TCPPort)
Bufferptr = Cmdprintf(Session, Bufferptr, " %d", Routes->localport);
Bufferptr = Cmdprintf(Session, Bufferptr, "\r"); Bufferptr = Cmdprintf(Session, Bufferptr, "\r");
} }
else else
@ -4665,7 +4629,6 @@ struct CMDX COMMANDS[] =
"RESTARTTNC ",10,&RESTARTTNC,0, "RESTARTTNC ",10,&RESTARTTNC,0,
"POLLNODES ",8, &POLLNODES,0, "POLLNODES ",8, &POLLNODES,0,
"SENDNODES ",8, &SENDNODES,0, "SENDNODES ",8, &SENDNODES,0,
"SENDRIF ",7, &SENDRIF,0,
"EXTRESTART ",10, EXTPORTVAL, offsetof(EXTPORTDATA, EXTRESTART), "EXTRESTART ",10, EXTPORTVAL, offsetof(EXTPORTDATA, EXTRESTART),
"TXDELAY ",3, PORTVAL, offsetof(PORTCONTROLX, PORTTXDELAY), "TXDELAY ",3, PORTVAL, offsetof(PORTCONTROLX, PORTTXDELAY),
"MAXFRAME ",3, PORTVAL, offsetof(PORTCONTROLX, PORTWINDOW), "MAXFRAME ",3, PORTVAL, offsetof(PORTCONTROLX, PORTWINDOW),
@ -4723,7 +4686,6 @@ struct CMDX COMMANDS[] =
"L4WINDOW ",6,SWITCHVAL,(size_t)&L4DEFAULTWINDOW, "L4WINDOW ",6,SWITCHVAL,(size_t)&L4DEFAULTWINDOW,
"BTINTERVAL ",5,SWITCHVAL,(size_t)&BTINTERVAL, "BTINTERVAL ",5,SWITCHVAL,(size_t)&BTINTERVAL,
"DEBUGINP3 ",8,SWITCHVAL,(size_t)&DEBUGINP3, "DEBUGINP3 ",8,SWITCHVAL,(size_t)&DEBUGINP3,
"RIFINTERVAL ",11,SWITCHVALW,(size_t)&RIFInterval,
"MAXHOPS ",7,SWITCHVAL,(size_t)&MaxHops, "MAXHOPS ",7,SWITCHVAL,(size_t)&MaxHops,
"PREFERINP3 ",10,SWITCHVAL,(size_t)&PREFERINP3ROUTES, "PREFERINP3 ",10,SWITCHVAL,(size_t)&PREFERINP3ROUTES,
"MAXRTT ",6,SWITCHVALW,(size_t)&MAXRTT, "MAXRTT ",6,SWITCHVALW,(size_t)&MAXRTT,

View file

@ -4187,7 +4187,7 @@ static BOOL RestartTNC(struct TNCINFO * TNC)
SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in destaddr; struct sockaddr_in destaddr;
// Debugprintf("trying to restart TNC %s", TNC->ProgramPath); Debugprintf("trying to restart TNC %s", TNC->ProgramPath);
if (sock == INVALID_SOCKET) if (sock == INVALID_SOCKET)
return 0; return 0;
@ -4210,7 +4210,7 @@ static BOOL RestartTNC(struct TNCINFO * TNC)
n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr)); n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
// Debugprintf("Restart TNC - sendto returned %d", n); Debugprintf("Restart TNC - sendto returned %d", n);
Sleep(100); Sleep(100);
closesocket(sock); closesocket(sock);

View file

@ -1396,23 +1396,23 @@ int SetupNodeMenu(char * Buff, int LOCAL)
char SigninBit[] = "<td><a href=/Node/Signon.html>SYSOP Signin</a></td>"; char SigninBit[] = "<td><a href=/Node/Signon.html>SYSOP Signin</a></td>";
char NodeTail[] = char NodeTail[] =
"<td><a href=/Node/EditCfg.html>Edit Config</a></td>\ "<td><a href=/Node/EditCfg.html>Edit Config</a></td>"
<td><div onmouseover=myShow() class='dropdown'>\ "<td><div onmouseover=myShow() class='dropdown'>"
<button class=\"dropbtn\">View Logs</button>\ "<button class=\"dropbtn\">View Logs</button>"
<div id=\"myDropdown\" class=\"dropdown-content\">\ "<div id=\"myDropdown\" class=\"dropdown-content\">"
<form id = doDate form action='/node/ShowLog.html'><label>\ "<form id = doDate form action='/node/ShowLog.html'><label>"
Select Date: <input type='date' name='date' id=e>\ "Select Date: <input type='date' name='date' id=e>"
<script>\ "<script>"
document.getElementById('e').value = new Date().toISOString().substring(0, 10);\ "document.getElementById('e').value = new Date().toISOString().substring(0, 10);"
</script></label>\ "</script></label>"
<input type=submit class='btn' name='BBS' value='BBS Log'></br>\ "<input type=submit class='btn' name='BBS' value='BBS Log'></br>"
<input type=submit class='btn' name='Debug' value='BBS Debug Log'></br>\ "<input type=submit class='btn' name='Debug' value='BBS Debug Log'></br>"
<input type=submit class='btn' name='Telnet' value='Telnet Log'></br>\ "<input type=submit class='btn' name='Telnet' value='Telnet Log'></br>"
<input type=submit class='btn' name='CMS' value='CMS Log'></br>\ "<input type=submit class='btn' name='CMS' value='CMS Log'></br>"
<input type=submit class='btn' name='Chat' value='Chat Log'></br>\ "<input type=submit class='btn' name='Chat' value='Chat Log'></br>"
</form></div>\ "</form></div>"
</div>\ "</div>"
</td></tr></table>"; "</td></tr></table>";
Len = sprintf(Buff, NodeMenuHeader, Mycall); Len = sprintf(Buff, NodeMenuHeader, Mycall);
@ -1566,9 +1566,10 @@ VOID SaveConfigFile(SOCKET sock , char * MsgPtr, char * Rest, int LOCAL)
} }
ReplyLen = sprintf(Reply, "<html><script>alert(\"%s\");window.close();</script></html>", Mess); ReplyLen = sprintf(Reply, "<html><script>alert(\"%s\");window.close();</script></html>", Mess);
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", ReplyLen); HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n", ReplyLen + (int)strlen(Tail));
send(sock, Header, HeaderLen, 0); send(sock, Header, HeaderLen, 0);
send(sock, Reply, ReplyLen, 0); send(sock, Reply, ReplyLen, 0);
send(sock, Tail, (int)strlen(Tail), 0);
} }
return; return;
} }

View file

@ -30,7 +30,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
char * APIENTRY GetBPQDirectory(); char * APIENTRY GetBPQDirectory();
int BBSLogAge = 7; int LogAge = 7;
BOOL DeletetoRecycleBin = FALSE; BOOL DeletetoRecycleBin = FALSE;
BOOL SuppressMaintEmail = FALSE; BOOL SuppressMaintEmail = FALSE;
@ -61,7 +61,7 @@ struct Override ** LTFROM;
struct Override ** LTTO; struct Override ** LTTO;
struct Override ** LTAT; struct Override ** LTAT;
int DeleteBBSLogFiles(); int DeleteLogFiles();
VOID SendNonDeliveryMessage(struct MsgInfo * OldMsg, BOOL Forwarded, int Age); VOID SendNonDeliveryMessage(struct MsgInfo * OldMsg, BOOL Forwarded, int Age);
int CreateWPMessage(); int CreateWPMessage();
@ -281,7 +281,7 @@ VOID DoHouseKeeping(BOOL Manual)
UpdateWP(); UpdateWP();
DeleteBBSLogFiles(); DeleteLogFiles();
RemoveKilledMessages(); RemoveKilledMessages();
ExpireMessages(); ExpireMessages();
@ -799,7 +799,7 @@ VOID MailHousekeepingResults()
extern UCHAR LogDirectory[260]; extern UCHAR LogDirectory[260];
int DeleteBBSLogFiles() int DeleteLogFiles()
{ {
WIN32_FIND_DATA ffd; WIN32_FIND_DATA ffd;
@ -848,7 +848,7 @@ int DeleteBBSLogFiles()
Age = (int)((now - ft.LowPart) / 86400); Age = (int)((now - ft.LowPart) / 86400);
if (Age > BBSLogAge) if (Age > LogAge)
{ {
sprintf(File, "%s/logs/%s%c", GetLogDirectory(), ffd.cFileName, 0); sprintf(File, "%s/logs/%s%c", GetLogDirectory(), ffd.cFileName, 0);
if (DeletetoRecycleBin) if (DeletetoRecycleBin)
@ -875,7 +875,7 @@ int Filter(const struct dirent * dir)
return memcmp(dir->d_name, "log", 3) == 0 && strstr(dir->d_name, ".txt"); return memcmp(dir->d_name, "log", 3) == 0 && strstr(dir->d_name, ".txt");
} }
int DeleteBBSLogFiles() int DeleteLogFiles()
{ {
struct dirent **namelist; struct dirent **namelist;
int n; int n;
@ -897,7 +897,7 @@ int DeleteBBSLogFiles()
{ {
Age = (now - STAT.st_mtime) / 86400; Age = (now - STAT.st_mtime) / 86400;
if (Age > BBSLogAge) if (Age > LogAge)
{ {
printf("Deleting %s\n", FN); printf("Deleting %s\n", FN);
unlink(FN); unlink(FN);

View file

@ -20,9 +20,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// //
// C replacement for L2Code.asm // C replacement for L2Code.asm
// //
#define FRMRHACK
#define Kernel #define Kernel
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_DEPRECATE
@ -1218,18 +1215,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
LINK->L2RETRIES--; // Make sure at least one is sent
// if an L3 link mark neighbour as not V2.2
if (LINK->LINKTYPE == 3)
{
struct ROUTE * ROUTE = LINK->NEIGHBOUR; // TO NEIGHBOUR
if (ROUTE)
ROUTE->noV2point2 = 1;
}
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
return; return;
} }
@ -1915,7 +1901,7 @@ BOOL InternalL2SETUPCROSSLINK(PROUTE ROUTE, int Retries)
else else
LINK->LINKWINDOW = PORT->PORTWINDOW; LINK->LINKWINDOW = PORT->PORTWINDOW;
if (SUPPORT2point2 && (ROUTE->noV2point2 == 0)) if (SUPPORT2point2)
LINK->L2STATE = 1; // Send XID LINK->L2STATE = 1; // Send XID
else else
LINK->L2STATE = 2; LINK->L2STATE = 2;
@ -2170,27 +2156,7 @@ VOID L2_PROCESS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * B
// FRAME REJECT RECEIVED - LOG IT AND RESET LINK // FRAME REJECT RECEIVED - LOG IT AND RESET LINK
//#ifdef FRMRHACK RESET2(LINK);
// Treat as DM and break link
Debugprintf("BPQ32 FRMR received, disconnecting link");
InformPartner(LINK, LINKLOST); // SEND DISC TO OTHER END
L2SENDCOMMAND(LINK, DM);
CLEAROUTLINK(LINK);
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
DetachKISSHF(PORT);
PORT->L2FRMRRX++;
return;
//#endif
/* RESET2(LINK);
LINK->L2STATE = 2; // INITIALISING LINK->L2STATE = 2; // INITIALISING
LINK->L2ACKREQ = 0; // DONT SEND ANYTHING ELSE LINK->L2ACKREQ = 0; // DONT SEND ANYTHING ELSE
@ -2200,7 +2166,7 @@ VOID L2_PROCESS(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * B
L2SENDCOMMAND(LINK, SABM | PFBIT); L2SENDCOMMAND(LINK, SABM | PFBIT);
return; return;
*/
default: default:
// ANY OTHER - IGNORE // ANY OTHER - IGNORE
@ -3863,13 +3829,6 @@ VOID SENDFRMR(struct _LINKTABLE * LINK)
MESSAGE * Buffer; MESSAGE * Buffer;
UCHAR * ptr; UCHAR * ptr;
#ifdef FRMRHACK // Ignore any frames with invalid n(r). If spurious error retry should fix it. If not link will retry out and reset
if (LINK->SDREJF & SDNRER)
return;
#endif
Buffer = SETUPL2MESSAGE(LINK, FRMR); Buffer = SETUPL2MESSAGE(LINK, FRMR);
if (Buffer == NULL) if (Buffer == NULL)

View file

View file

@ -1020,7 +1020,8 @@ void WritePacketLogThread(void * param)
int MsgLen; int MsgLen;
MESSAGE * MSG; MESSAGE * MSG;
MESSAGE * Q; MESSAGE * Q;
char buffer[2048]; char buffer[512];
while(1) while(1)
{ {
@ -1074,8 +1075,6 @@ void WritePacketLogThread(void * param)
MsgLen = IntDecodeFrame(MSG, buffer, MSG->Timestamp, 0xffffffffffffffff, FALSE, FALSE); MsgLen = IntDecodeFrame(MSG, buffer, MSG->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
IntSetTraceOptionsEx(MMASK, SaveMTX, SaveMCOM, SaveMUI); IntSetTraceOptionsEx(MMASK, SaveMTX, SaveMCOM, SaveMUI);
buffer[MsgLen++] = 0x0a; // Add lf
fwrite(buffer , 1, MsgLen, Handle); fwrite(buffer , 1, MsgLen, Handle);
GetSemaphore(&Semaphore, 101); GetSemaphore(&Semaphore, 101);

View file

@ -60,7 +60,6 @@ VOID NETROMMSG(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * L3MSG);
int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS); int BPQTRACE(MESSAGE * Msg, BOOL TOAPRS);
VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason); VOID L3LINKCLOSED(struct _LINKTABLE * LINK, int Reason);
void NetromTCPTrace(struct _MESSAGE * Message, char * Dirn); void NetromTCPTrace(struct _MESSAGE * Message, char * Dirn);
void NETROMCloseTCP(struct ROUTE * Route);
extern SOCKET NodeAPISocket; extern SOCKET NodeAPISocket;
@ -99,11 +98,11 @@ struct ConnectionInfo * AllocateNRTCPRec()
Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT)); Info = NRTCPInfo[i] = (struct NRTCPSTRUCT *)zalloc(sizeof(struct NRTCPSTRUCT));
Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo)); Info->sockptr = (struct ConnectionInfo *)zalloc(sizeof(struct ConnectionInfo));
Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE)); Info->LINK = (struct _LINKTABLE *)zalloc(sizeof(struct _LINKTABLE));
Info->sockptr->Number = i;
} }
else else
Info = NRTCPInfo[i]; Info = NRTCPInfo[i];
Info->sockptr->Number = i;
sockptr = Info->sockptr; sockptr = Info->sockptr;
if (sockptr->SocketActive == FALSE) if (sockptr->SocketActive == FALSE)
@ -111,7 +110,7 @@ struct ConnectionInfo * AllocateNRTCPRec()
sockptr->SocketActive = TRUE; sockptr->SocketActive = TRUE;
sockptr->ConnectTime = sockptr->LastSendTime = time(NULL); sockptr->ConnectTime = sockptr->LastSendTime = time(NULL);
Debugprintf("NRTCP Allocated %d", i); // Debugprintf("NRTCP Allocated %d", i);
return sockptr; return sockptr;
} }
} }
@ -125,7 +124,6 @@ void checkNRTCPSockets(int portNo)
SOCKET maxsock; SOCKET maxsock;
int retval; int retval;
int i; int i;
time_t Now = time(NULL);
struct timeval timeout; struct timeval timeout;
fd_set readfd, writefd, exceptfd; fd_set readfd, writefd, exceptfd;
@ -151,23 +149,9 @@ void checkNRTCPSockets(int portNo)
if (sockptr->SocketActive == 0) if (sockptr->SocketActive == 0)
continue; continue;
if (sockptr->Connected && (Now - sockptr->LastReceiveTime) > 600)
{
struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
if (Info)
Debugprintf("NETROMTCP link to %s idle for too long, closing", Info->Call);
else
Debugprintf("NETROMTCP link idle for too long, closing");
NETROMConnectionLost(sockptr);
continue;
}
if (sockptr->Connecting) if (sockptr->Connecting)
{ {
// look for complete or failed // look for complete or failed
FD_SET(sockptr->socket, &writefd); FD_SET(sockptr->socket, &writefd);
FD_SET(sockptr->socket, &exceptfd); FD_SET(sockptr->socket, &exceptfd);
@ -233,26 +217,38 @@ int NETROMOpenConnection(struct ROUTE * Route)
farCall[ConvFromAX25(Route->NEIGHBOUR_CALL, farCall)] = 0; farCall[ConvFromAX25(Route->NEIGHBOUR_CALL, farCall)] = 0;
// Debugprintf("Opening NRTCP Connection to %s", farCall);
sockptr = AllocateNRTCPRec(); if (Route->TCPSession)
{
// SESSION ALREADY EXISTS
if (sockptr == NULL) sockptr = Route->TCPSession->sockptr;
return 0;
if (sockptr->Connected || sockptr->Connecting)
return TRUE;
Debugprintf("Opening NRTCP Connection to %s index %d", farCall, sockptr->Number); // previous connect failed
}
else
{
sockptr = AllocateNRTCPRec();
Info = Route->TCPSession = NRTCPInfo[sockptr->Number]; if (sockptr == NULL)
memcpy(Info->Call, farCall, 10); return 0;
Route->NEIGHBOUR_LINK = Info->LINK;
Info->Route = Route; Info = Route->TCPSession = NRTCPInfo[sockptr->Number];
Info->LINK->NEIGHBOUR = Route; memcpy(Info->Call, farCall, 10);
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT); Route->NEIGHBOUR_LINK = Info->LINK;
memcpy(Route->NEIGHBOUR_LINK->LINKCALL, Route->NEIGHBOUR_CALL, 7);
Route->NEIGHBOUR_LINK = Route->TCPSession->LINK; // Just in case! Info->Route = Route;
Info->LINK->NEIGHBOUR = Route;
Info->LINK->LINKPORT = GetPortTableEntryFromPortNum(Route->NEIGHBOUR_PORT);
memcpy(Route->NEIGHBOUR_LINK->LINKCALL, Route->NEIGHBOUR_CALL, 7);
}
return NETROMTCPConnect(Route, sockptr); return NETROMTCPConnect(Route, sockptr);
} }
void NETROMTCPResolve() void NETROMTCPResolve()
@ -305,14 +301,6 @@ int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
char PortString[20]; char PortString[20];
struct addrinfo * res = Route->TCPAddress; struct addrinfo * res = Route->TCPAddress;
int Port = Route->TCPPort; int Port = Route->TCPPort;
struct sockaddr_in my_addr;
socklen_t len = sizeof(my_addr);
struct NRTCPSTRUCT * Info = NRTCPInfo[sockptr->Number];
// Get my ip address and port
memset(&my_addr, 0, sizeof(my_addr));
getsockname(sockptr->socket, (struct sockaddr *) &my_addr, &len);
sprintf(PortString, "%d", Port); sprintf(PortString, "%d", Port);
@ -345,7 +333,6 @@ int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
// //
sockptr->Connected = TRUE; sockptr->Connected = TRUE;
sockptr->LastReceiveTime = time(NULL);
return TRUE; return TRUE;
} }
else else
@ -355,15 +342,8 @@ int NETROMTCPConnect(struct ROUTE * Route, struct ConnectionInfo * sockptr)
if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK if (err == 10035 || err == 115 || err == 36) //EWOULDBLOCK
{ {
// Connect in Progress // Connect in Progress
sockptr->Connecting = TRUE;
// Get my ip address and port sockptr->Connecting = TRUE;
memset(&my_addr, 0, sizeof(my_addr));
getsockname(sockptr->socket, (struct sockaddr *) &my_addr, &len);
Route->localport = htons(my_addr.sin_port);
Debugprintf("NRTCP Connection in progress %s local port %d", Info->Call, Route->localport);
return TRUE; return TRUE;
} }
else else
@ -386,18 +366,7 @@ void NETROMConnectionAccepted(struct ConnectionInfo * sockptr)
{ {
// Not sure we can do much here until first message arrives with callsign // Not sure we can do much here until first message arrives with callsign
struct sockaddr_in my_addr;
socklen_t len = sizeof(my_addr);
// Get my ip address and port
memset(&my_addr, 0, sizeof(my_addr));
// getsockname(sockptr->socket, (struct sockaddr *) &my_addr, &len);
Debugprintf("INP3 Accept() Local port %d", htons(sockptr->sin.sin_port));
sockptr->Connected = TRUE; sockptr->Connected = TRUE;
sockptr->LastReceiveTime = time(NULL);
// Debugprintf("NRTCP Connection Accepted"); // Debugprintf("NRTCP Connection Accepted");
} }
@ -407,11 +376,8 @@ void NETROMConnected(struct ConnectionInfo * sockptr, SOCKET sock, struct NRTCPS
// Debugprintf("NRTCP Connected"); // Debugprintf("NRTCP Connected");
Debugprintf("NRTCP Connection Complete %s Local port %d", Info->Call, Info->Route->localport);
sockptr->Connecting = FALSE; sockptr->Connecting = FALSE;
sockptr->Connected = TRUE; sockptr->Connected = TRUE;
sockptr->LastReceiveTime = time(NULL);
Info->LINK->L2STATE = 5; Info->LINK->L2STATE = 5;
@ -444,8 +410,6 @@ int DataSocket_ReadNETROM(struct ConnectionInfo * sockptr, SOCKET sock, struct N
return 0; return 0;
} }
sockptr->LastReceiveTime = time(NULL);
sockptr->InputLen += len; sockptr->InputLen += len;
// Process data // Process data
@ -465,6 +429,8 @@ checkLen:
// This must be an incoming connection as Call is set before calling so need to find route record and set things up. // This must be an incoming connection as Call is set before calling so need to find route record and set things up.
// Debugprintf("New NRTCP Connection from %s", Msg->Call);
memcpy(Info->Call, Msg->Call, 10); memcpy(Info->Call, Msg->Call, 10);
ConvToAX25(Msg->Call, axCall); ConvToAX25(Msg->Call, axCall);
@ -479,10 +445,6 @@ checkLen:
Route->TCPSession = Info; Route->TCPSession = Info;
Info->LINK->L2STATE = 5; Info->LINK->L2STATE = 5;
memcpy(Route->NEIGHBOUR_LINK->LINKCALL, axCall, 7); memcpy(Route->NEIGHBOUR_LINK->LINKCALL, axCall, 7);
Route->localport = htons(sockptr->sin.sin_port);
Debugprintf("New NRTCP Connection from %s port %d", Msg->Call, Route->localport);
if (Info->Route->INP3Node) if (Info->Route->INP3Node)
SendRTTMsg(Info->Route); SendRTTMsg(Info->Route);
@ -498,6 +460,7 @@ checkLen:
} }
} }
if (memcmp(Info->Call, Msg->Call, 10) != 0) if (memcmp(Info->Call, Msg->Call, 10) != 0)
{ {
Debugprintf("NRTCP Mismatch - closing connection"); Debugprintf("NRTCP Mismatch - closing connection");
@ -549,8 +512,6 @@ checkLen:
ReleaseBuffer(Buffer); ReleaseBuffer(Buffer);
} }
Info->Route->NEIGHBOUR_LINK = Info->LINK; // Just in case!
NETROMMSG(Info->LINK, L3Msg); NETROMMSG(Info->LINK, L3Msg);
seeifMore: seeifMore:
@ -573,9 +534,6 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID int DataLen = Frame->LENGTH - (MSGHDDRLEN + 1); // Not including PID
int Ret; int Ret;
PMESSAGE Buffer; PMESSAGE Buffer;
struct sockaddr_in my_addr;
socklen_t len = sizeof(my_addr);
struct ConnectionInfo * sockptr;
Msg.Length = DataLen + 13; // include PID Msg.Length = DataLen + 13; // include PID
memcpy(Msg.Call, MYNETROMCALL, 10); memcpy(Msg.Call, MYNETROMCALL, 10);
@ -585,47 +543,6 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
if (Route->TCPSession == 0) if (Route->TCPSession == 0)
return; return;
sockptr = Route->TCPSession->sockptr;
// Get other port
if (strcmp(Route->TCPHost, "0.0.0.0") == 0)
{
// incoming
// Debugprintf("INP3 Remote port %d", htons(sockptr->sin.sin_port));
if (Route->localport != htons(sockptr->sin.sin_port))
{
// Route is linked to wrong session. Close it
// Route->TCPSession = 0;
// Route->NEIGHBOUR_LINK = 0;
return;
}
}
else
{
// outgoing
memset(&my_addr, 0, sizeof(my_addr));
getsockname(sockptr->socket, (struct sockaddr *) &my_addr, &len);
// Debugprintf("INP3 Local port %d", htons(my_addr.sin_port));
if (Route->localport != htons(my_addr.sin_port))
{
// Route is linked to wrong session. Close it
// if (sockptr->Connecting == 0)
// {
// Route->TCPSession = 0;
// Route->NEIGHBOUR_LINK = 0;
// }
return;
}
}
Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0); Ret = send(Route->TCPSession->sockptr->socket, (char *)&Msg, DataLen + 13, 0);
// Create a dummy L2 message so we can trace it // Create a dummy L2 message so we can trace it
@ -638,7 +555,7 @@ VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
Buffer->CTL = 0; Buffer->CTL = 0;
Buffer->PORT = Route->NEIGHBOUR_PORT; Buffer->PORT = Route->NEIGHBOUR_PORT;
memcpy(Buffer->DEST, Route->NEIGHBOUR_CALL, 7); ConvToAX25(Route->TCPSession->Call, Buffer->DEST);
ConvToAX25(MYNETROMCALL, Buffer->ORIGIN); ConvToAX25(MYNETROMCALL, Buffer->ORIGIN);
memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen); memcpy(Buffer->L2DATA, &Frame->L3SRCE[0], DataLen);
@ -673,12 +590,14 @@ void NETROMConnectionLost(struct ConnectionInfo * sockptr)
{ {
Route = Info->Route; Route = Info->Route;
if (sockptr->Connected)
L3LINKCLOSED(Info->LINK, LINKLOST);
if (sockptr->Connecting)
L3LINKCLOSED(Info->LINK, SETUPFAILED);
if (Route) if (Route)
{
Route->NEIGHBOUR_LINK = 0;
Route->TCPSession = 0; Route->TCPSession = 0;
Route->localport = 0;
}
Info->Call[0] = 0; Info->Call[0] = 0;
Info->LINK->L2STATE = 0; Info->LINK->L2STATE = 0;
@ -689,18 +608,3 @@ void NETROMConnectionLost(struct ConnectionInfo * sockptr)
memset(sockptr, 0, sizeof(struct ConnectionInfo)); memset(sockptr, 0, sizeof(struct ConnectionInfo));
} }
void NETROMCloseTCP(struct ROUTE * Route)
{
if (Route->TCPSession)
{
struct ConnectionInfo * sockptr = Route->TCPSession->sockptr;
NETROMConnectionLost(sockptr);
}
else
{
Route->NEIGHBOUR_LINK = 0;
}
}

6
RHP.c
View file

@ -387,12 +387,6 @@ int processRHCPOpen(struct ConnectionInfo * sockptr, SOCKET Socket, char * Msg,
if (_stricmp(pfam, "ax25") != 0) if (_stricmp(pfam, "ax25") != 0)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0); return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 12, \"errText\": \"Bad parameter\"}", ID, 0);
if (strlen(Local) > 10)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 6, \"errText\": \"%s\"}", ID, 0, ErrCodes[6]);
if (strlen(Remote) > 10)
return sprintf(ReplyBuffer, "{\"type\": \"openReply\", \"id\": %d, \"handle\": %d, \"errCode\": 7, \"errText\": \"%s\"}", ID, 0, ErrCodes[7]);
if (_stricmp(Mode, "stream") == 0) if (_stricmp(Mode, "stream") == 0)
{ {
{ {

View file

@ -178,16 +178,17 @@ void NETROMConnectionLost(struct ConnectionInfo * sockptr);
void NETROMConnectionAccepted(struct ConnectionInfo * sockptr); void NETROMConnectionAccepted(struct ConnectionInfo * sockptr);
struct ConnectionInfo * AllocateNRTCPRec(); struct ConnectionInfo * AllocateNRTCPRec();
static int LogAge = 10;
int DeleteLogFile(char * Log, int KeepDays); int DeleteLogFile(char * Log, int KeepDays);
void DeleteLogFiles(int Age) void DeleteTelnetLogFiles()
{ {
DeleteLogFile("Telnet", Age); DeleteLogFile("Telnet", 14);
DeleteLogFile("CMSAccess_", Age); DeleteLogFile("CMSAccess_", 14);
DeleteLogFile("ConnectLog_",Age); DeleteLogFile("ConnectLog_",14);
DeleteLogFile("APRS_", Age); DeleteLogFile("APRS_", 14);
if (MONTOFILEFLAG) DeleteLogFile("PacketLog_",MONTOFILEFLAG);
DeleteLogFile("PacketLog_", MONTOFILEFLAG);
} }
#ifdef WIN32 #ifdef WIN32
@ -234,11 +235,11 @@ int DeleteLogFile(char * Log, int KeepDays)
Age = (int)((now - ft.LowPart) / 86400); Age = (int)((now - ft.LowPart) / 86400);
if (Age > KeepDays) if (Age > KeepDays)
{ {
sprintf(File, "%s/logs/%s%c", GetLogDirectory(), ffd.cFileName, 0); sprintf(File, "%s/logs/%s%c", GetLogDirectory(), ffd.cFileName, 0);
Debugprintf("Deleting %s", File); Debugprintf("Deleting %s", File);
DeleteFile(File); DeleteFile(File);
} }
} }
} }
while (FindNextFile(hFind, &ffd) != 0); while (FindNextFile(hFind, &ffd) != 0);
@ -1444,6 +1445,8 @@ void * TelnetExtInit(EXTPORTDATA * PortEntry)
} }
*/ */
DeleteTelnetLogFiles(LogAge);
initUTF8(); initUTF8();
sprintf(msg,"Telnet Server "); sprintf(msg,"Telnet Server ");

View file

@ -10,15 +10,15 @@
#endif #endif
#define KVers 6,0,25,15 #define KVers 6,0,25,13
#define KVerstring "6.0.25.15\0" #define KVerstring "6.0.25.13\0"
#ifdef CKernel #ifdef CKernel
#define Vers KVers #define Vers KVers
#define Verstring KVerstring #define Verstring KVerstring
#define Datestring "December 2025" #define Datestring "October 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

@ -2929,7 +2929,7 @@ BOOL RestartTNC(struct TNCINFO * TNC)
SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in destaddr; struct sockaddr_in destaddr;
// Debugprintf("trying to restart TNC %s", TNC->ProgramPath); Debugprintf("trying to restart TNC %s", TNC->ProgramPath);
if (sock == INVALID_SOCKET) if (sock == INVALID_SOCKET)
return 0; return 0;
@ -2952,7 +2952,7 @@ BOOL RestartTNC(struct TNCINFO * TNC)
n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr)); n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
// Debugprintf("Restart TNC - sendto returned %d", n); Debugprintf("Restart TNC - sendto returned %d", n);
Sleep(100); Sleep(100);
closesocket(sock); closesocket(sock);

View file

@ -120,7 +120,7 @@ static BOOL RestartTNC(struct TNCINFO * TNC)
SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); SOCKET sock = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in destaddr; struct sockaddr_in destaddr;
// Debugprintf("trying to restart TNC %s", TNC->ProgramPath); Debugprintf("trying to restart TNC %s", TNC->ProgramPath);
if (sock == INVALID_SOCKET) if (sock == INVALID_SOCKET)
return 0; return 0;
@ -143,7 +143,7 @@ static BOOL RestartTNC(struct TNCINFO * TNC)
n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr)); n = sendto(sock, TNC->ProgramPath, (int)strlen(TNC->ProgramPath), 0, (struct sockaddr *)&destaddr, sizeof(destaddr));
// Debugprintf("Restart TNC - sendto returned %d", n); Debugprintf("Restart TNC - sendto returned %d", n);
Sleep(100); Sleep(100);
closesocket(sock); closesocket(sock);

View file

@ -258,9 +258,6 @@ typedef struct ROUTE
int TCPPort; int TCPPort;
struct NRTCPSTRUCT * TCPSession; struct NRTCPSTRUCT * TCPSession;
struct addrinfo * TCPAddress; // Resolved Address struct addrinfo * TCPAddress; // Resolved Address
int localport; // for consistancy check
int recNum; // This entry's index it Routes table
int noV2point2; // Set to force V2.0 connect. Can be set in config or dynamically learned
} *PROUTE; } *PROUTE;
@ -268,8 +265,10 @@ typedef struct ROUTE
#define GotRTTRequest 1 // Other end has sent us a RTT Packet #define GotRTTRequest 1 // Other end has sent us a RTT Packet
#define GotRTTResponse 2 // Other end has sent us a RTT Response #define GotRTTResponse 2 // Other end has sent us a RTT Response
#define SentRTTRequest 4 #define GotRIF 4 // Other end has sent RIF, so is probably an INP3 Node
#define SentOurRIF 8 // Set when we have sent a rif for our Call and any ApplCalls // (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
// (only sent when we have seen both a request and response) // (only sent when we have seen both a request and response)
#pragma pack(1) #pragma pack(1)
@ -481,18 +480,20 @@ typedef struct _APPLCALLS
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
uint16_t * Dummy; // Padding so records are same length 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
} *PNR_DEST_ROUTE_ENTRY; } *PNR_DEST_ROUTE_ENTRY;
typedef struct INP3_DEST_ROUTE_ENTRY typedef struct INP3_DEST_ROUTE_ENTRY
{ {
struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH struct ROUTE * ROUT_NEIGHBOUR; // POINTER TO NEXT NODE IN PATH
uint16_t * RouteLastTT; // Last time sent should be saved for each neighbour. Area is mallod'ed as needed USHORT LastTT; // Last Value Reported. This is our value, not the one actually sent (which includes Neighbour TT)
USHORT LastNeighbourTT; // Saved from last report so we can calulate what we actually sent
USHORT STT; // Current time to dest from here (was called RTT but is one way not round trip. USHORT STT; // Current time to dest from here (was called RTT but is one way not round trip.
// Is actually a smoothed value as is calculated from smoothed link times) // Is actually a smoothed value as is calculated from smoother link times)
UCHAR Hops; UCHAR Hops;
} *PDEST_ROUTE_ENTRY; } *PDEST_ROUTE_ENTRY;
@ -745,8 +746,6 @@ typedef struct PORTCONTROL
int Hardware; // TNC H_TYPE. Copied here for access from application context int Hardware; // TNC H_TYPE. Copied here for access from application context
int isRF; // For API reporting. -1 is unspecified int isRF; // For API reporting. -1 is unspecified
int SENDRIFTIMER;
time_t LastRIFTime;
} PORTCONTROLX, *PPORTCONTROL; } PORTCONTROLX, *PPORTCONTROL;

View file

@ -1591,7 +1591,7 @@ extern RECT DebugRect;
extern HWND hMonitor; extern HWND hMonitor;
//extern HWND hConsole; //extern HWND hConsole;
//extern RECT ConsoleRect; //extern RECT ConsoleRect;
extern int BBSLogAge; extern int LogAge;
extern BOOL DeletetoRecycleBin; extern BOOL DeletetoRecycleBin;
extern BOOL SuppressMaintEmail; extern BOOL SuppressMaintEmail;
extern BOOL SaveRegDuringMaint; extern BOOL SaveRegDuringMaint;

34
cMain.c
View file

@ -58,7 +58,6 @@ VOID L2SENDCOMMAND(struct _LINKTABLE * LINK, int CMD);
void WritePacketLogThread(void * param); void WritePacketLogThread(void * param);
void hookNodeStarted(); void hookNodeStarted();
void hookNodeRunning(); void hookNodeRunning();
void DeleteLogFiles(int Age);
void APIL2Trace(struct _MESSAGE * Message, char * Dirn); void APIL2Trace(struct _MESSAGE * Message, char * Dirn);
#include "configstructs.h" #include "configstructs.h"
@ -72,15 +71,11 @@ extern int nodeStartedSent;
extern SOCKADDR_IN UDPreportdest; extern SOCKADDR_IN UDPreportdest;
extern char NodeAPIServer[80]; extern char NodeAPIServer[80];
extern int NodeAPIPort; extern int NodeAPIPort;
extern int RIFInterval;
time_t LastNodeStatus = 0; time_t LastNodeStatus = 0;
int nodeStatusTimer = 20 * 60; // 20 mins int nodeStatusTimer = 20 * 60; // 20 mins
int LogAge = 10;
struct PORTCONFIG * PortRec; struct PORTCONFIG * PortRec;
#define RNRSET 0x2 // RNR RECEIVED FROM OTHER END #define RNRSET 0x2 // RNR RECEIVED FROM OTHER END
@ -680,7 +675,6 @@ BOOL Start()
struct CMDX * CMD; struct CMDX * CMD;
int PortSlot = 1; int PortSlot = 1;
uintptr_t int3; uintptr_t int3;
int index = 0; // Entry No. in ROUTES
unsigned char * ptr2 = 0, * ptr3, * ptr4; unsigned char * ptr2 = 0, * ptr3, * ptr4;
USHORT * CWPTR; USHORT * CWPTR;
@ -850,10 +844,6 @@ BOOL Start()
MAXLINKS = cfg->C_MAXLINKS; MAXLINKS = cfg->C_MAXLINKS;
MAXDESTS = cfg->C_MAXDESTS; MAXDESTS = cfg->C_MAXDESTS;
MAXNEIGHBOURS = cfg->C_MAXNEIGHBOURS; MAXNEIGHBOURS = cfg->C_MAXNEIGHBOURS;
if (MAXNEIGHBOURS == 0)
MAXNEIGHBOURS = 1;
MAXCIRCUITS = cfg->C_MAXCIRCUITS; MAXCIRCUITS = cfg->C_MAXCIRCUITS;
HIDENODES = cfg->C_HIDENODES; HIDENODES = cfg->C_HIDENODES;
@ -898,8 +888,6 @@ BOOL Start()
MONTOFILEFLAG = cfg->C_MONTOFILE; MONTOFILEFLAG = cfg->C_MONTOFILE;
RIFInterval = cfg->C_RIFInterval;
if (cfg->C_OnlyVer2point0) if (cfg->C_OnlyVer2point0)
SUPPORT2point2 = 0; SUPPORT2point2 = 0;
@ -1374,7 +1362,6 @@ BOOL Start()
char * VIA; char * VIA;
char axcall[8]; char axcall[8];
ConvToAX25(Rcfg->call, ROUTE->NEIGHBOUR_CALL); ConvToAX25(Rcfg->call, ROUTE->NEIGHBOUR_CALL);
// if VIA convert digis // if VIA convert digis
@ -1419,9 +1406,6 @@ BOOL Start()
ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES ROUTE->NoKeepAlive = 0; // Cant have INP3 and NOKEEPALIVES
} }
if (Rcfg->noV2point2)
ROUTE->noV2point2 = 1;
ROUTE->NBOUR_MAXFRAME = Rcfg->pwind & 0x3f; ROUTE->NBOUR_MAXFRAME = Rcfg->pwind & 0x3f;
FRACK = Rcfg->pfrack; FRACK = Rcfg->pfrack;
@ -1439,8 +1423,6 @@ BOOL Start()
ROUTE->TCPAddress = (struct addrinfo *)zalloc(sizeof(struct addrinfo)); ROUTE->TCPAddress = (struct addrinfo *)zalloc(sizeof(struct addrinfo));
ROUTE->TCPAddress->ai_addr = (struct sockaddr *) zalloc(sizeof(struct sockaddr)); ROUTE->TCPAddress->ai_addr = (struct sockaddr *) zalloc(sizeof(struct sockaddr));
} }
ROUTE->recNum = index++;
Rcfg++; Rcfg++;
ROUTE++; ROUTE++;
@ -1601,11 +1583,6 @@ BOOL Start()
if (AUTOSAVEMH) if (AUTOSAVEMH)
ReadMH(); // Only if AutoSave configured ReadMH(); // Only if AutoSave configured
// Tidy Log Files
DeleteLogFiles(LogAge);
// set up stream number in BPQHOSTVECTOR // set up stream number in BPQHOSTVECTOR
for (i = 0; i < 64; i++) for (i = 0; i < 64; i++)
@ -1680,19 +1657,14 @@ 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;
char Normcall[10]; char Normcall[10];
int n;
for (n = 0; n < MAXNEIGHBOURS; n++) while (n--)
{ {
if (ROUTE->NEIGHBOUR_CALL[0] == 0) // Spare if (ROUTE->NEIGHBOUR_CALL[0] == 0) // Spare
{
if (FIRSTSPARE == NULL) if (FIRSTSPARE == NULL)
{
FIRSTSPARE = ROUTE; FIRSTSPARE = ROUTE;
ROUTE->recNum = n;
}
}
if (ROUTE->NEIGHBOUR_PORT != Port) if (ROUTE->NEIGHBOUR_PORT != Port)
{ {
@ -1700,6 +1672,7 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
continue; continue;
} }
Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0; Normcall[ConvFromAX25(ROUTE->NEIGHBOUR_CALL, Normcall)] = 0;
if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call)) if (CompareCalls(ROUTE->NEIGHBOUR_CALL, Call))
@ -1713,7 +1686,6 @@ BOOL FindNeighbour(UCHAR * Call, int Port, struct ROUTE ** REQROUTE)
// ENTRY NOT FOUND - FIRSTSPARE HAS FIRST FREE ENTRY, OR ZERO IF TABLE FULL // ENTRY NOT FOUND - FIRSTSPARE HAS FIRST FREE ENTRY, OR ZERO IF TABLE FULL
*REQROUTE = FIRSTSPARE; *REQROUTE = FIRSTSPARE;
return FALSE; return FALSE;
} }

View file

@ -310,9 +310,7 @@ static char *keywords[] =
"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", "L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe",
"L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0", "DEBUGINP3", "ENABLEOARCAPI", "MONTOFILE", "L2CompPaclen", "PREFERINP3ROUTES", "OnlyVer2point0", "DEBUGINP3", "ENABLEOARCAPI", "MONTOFILE"
"RIFInterval"
}; /* parameter keywords */ }; /* parameter keywords */
static void * offset[] = static void * offset[] =
@ -336,8 +334,7 @@ static void * offset[] =
&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, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0, &xxcfg.C_DEBUGINP3, &xxcfg.C_OARCAPI, &xxcfg.C_MONTOFILE, &xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES, &xxcfg.C_OnlyVer2point0, &xxcfg.C_DEBUGINP3, &xxcfg.C_OARCAPI, &xxcfg.C_MONTOFILE}; /* offset for corresponding data in config file */
&xxcfg.C_RIFInterval}; /* offset for corresponding data in config file */
static int routine[] = static int routine[] =
{ {
@ -360,8 +357,7 @@ static int routine[] =
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, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; // Routine to process param
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);
@ -624,7 +620,8 @@ BOOL ProcessConfig()
paramok[78]=1; // ENABLEADIFLOG optional paramok[78]=1; // ENABLEADIFLOG optional
paramok[79]=1; // EnableEvents optional paramok[79]=1; // EnableEvents optional
paramok[80]=1; // SaveAPRSMsgs optional paramok[80]=1; // SaveAPRSMsgs optional
paramok[81]=1; // EnableM0LTEMap optional paramok[79]=1; // SaveAPRSMsgs optional
paramok[80]=1; // EnableM0LTEMap optional
paramok[82]=1; // MQTT Params paramok[82]=1; // MQTT Params
paramok[83]=1; // MQTT Params paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params paramok[84]=1; // MQTT Params
@ -641,7 +638,6 @@ BOOL ProcessConfig()
paramok[95]=1; // DEBUGINP3 paramok[95]=1; // DEBUGINP3
paramok[96]=1; // EnableOARCAPI paramok[96]=1; // EnableOARCAPI
paramok[97]=1; // MONTOFILE paramok[97]=1; // MONTOFILE
paramok[98]=1; // RIFInterval
for (i=0; i < PARAMLIM; i++) for (i=0; i < PARAMLIM; i++)
@ -1683,15 +1679,7 @@ int routes(int i)
char * val = strtok_s(NULL, " ,=", &context); char * val = strtok_s(NULL, " ,=", &context);
if (val) if (val)
Route->nokeepalives = atoi(val); Route->farQual = atoi(val);
}
else if (strcmp(ptr, "NOV2.2") == 0)
{
char * val = strtok_s(NULL, " ,=", &context);
if (val)
Route->noV2point2 = atoi(val);
} }

View file

@ -97,7 +97,6 @@ struct ROUTECONFIG
int farQual; int farQual;
int inp3; int inp3;
int nokeepalives; int nokeepalives;
int noV2point2;
char * tcphost; char * tcphost;
int tcpport; int tcpport;
}; };
@ -189,8 +188,6 @@ struct CONFIGTABLE
int C_DEBUGINP3; int C_DEBUGINP3;
int C_OARCAPI; int C_OARCAPI;
int C_MONTOFILE; int C_MONTOFILE;
int C_RIFInterval;
//#define ApplOffset 80000 // Applications offset in config buffer //#define ApplOffset 80000 // Applications offset in config buffer

View file

@ -39,7 +39,7 @@ int DEBUGINP3 = 0;
int EnableOARCAPI = 0; int EnableOARCAPI = 0;
int RTTInterval = 30; // 10 second increments - 5 Minutes int RTTInterval = 30; // 5 Minutes
BOOL IPRequired = FALSE; BOOL IPRequired = FALSE;
BOOL PMRequired = FALSE; BOOL PMRequired = FALSE;

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

359
debian/changelog vendored
View file

@ -1,359 +0,0 @@
linbpq (6.0.25.15+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.15+repack
* Remove Patch for TelnetV6, fixed upstream
* 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, 07 Jan 2026 21:53:20 +0000
linbpq (6.0.25.13+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* 6.0.25.12 hacky merge due t it not ffing.
* New upstream version 6.0.25.13+repack
* Patch TelnetV6 to build
* 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, 23 Dec 2025 16:45:56 +0000
linbpq (6.0.25.12+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.12+repack
* 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> Sat, 22 Nov 2025 15:11:09 +0000
linbpq (6.0.25.11+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.11+repack
* 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 Nov 2025 21:52:58 +0000
linbpq (6.0.25.9+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.9+repack
* Refresh patches
* 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> Sun, 09 Nov 2025 22:45:07 +0000
linbpq (6.0.25.8+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* Build on latest gcc standards
* New upstream version 6.0.25.8+repack
* Refresh patches with gbp pq!
* 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> Fri, 24 Oct 2025 00:45:16 +0100
linbpq (6.0.25.06+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.06+repack
* 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> Fri, 10 Oct 2025 23:42:04 +0100
linbpq (6.0.25.1+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.1+repack
* 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> Sat, 20 Sep 2025 15:43:32 +0100
linbpq (6.0.24.82+repack-1~hibbian13+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.82+repack
* 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> Sun, 17 Aug 2025 22:36:49 +0100
linbpq (6.0.24.78+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New Upstream
* New files excluded
- No binaries in this release at all maybe!
* 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> Thu, 31 Jul 2025 01:31:38 +0100
linbpq (6.0.24.77+repack-1~hibbian~TRIXIE+1) trixie-hibbian-unstable; urgency=medium
* New upstream version 6.0.24.77+repack
* 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, 22 Jul 2025 21:46:13 +0100
linbpq (6.0.24.75+repack-1~hibbian~TRIXIE+2) trixie-hibbian-unstable; urgency=medium
* First trixie release
* Drop hard-dep on hibbian-archive-keyring
-- Dave Hibberd <hibby@debian.org> Wed, 16 Jul 2025 19:10:33 +0100
linbpq (6.0.24.75+repack-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream version 6.0.25.75+repack
* 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, 15 Jul 2025 01:10:43 +0100
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.2
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
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.

37
debian/copyright vendored
View file

@ -1,37 +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
*.svn-base *.db *.obj
Files: *
Copyright: 1990-2025 John Wiseman G8BPQ <john.wiseman@cantab.net>
License: GPL-3
Files: debian/*
Copyright: 2016-2025 Dave Hibberd <d@vehibberd.com>
License: GPL-3
Files: debian/linbpq.service
Copyright: 2024-2025 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,57 +0,0 @@
From: Dave Hibberd <hibby@debian.org>
Date: Sat, 20 Sep 2025 15:42:15 +0100
Subject: makefile
---
makefile | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/makefile b/makefile
index 26403e5..0f15cc0 100644
--- 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\
@@ -17,12 +16,12 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
# Configuration:
-#Default to Linux
- CC = gcc
- LDFLAGS = -Xlinker -Map=output.map -lrt
+CFLAGS:=$(shell dpkg-buildflags --get CFLAGS)
+CFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS)
+LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS)
-all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
-all: LIBS = -lpaho-mqtt3a -ljansson -lminiupnpc -lm -lz -lpthread -lconfig -lpcap
+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
#other OS
@@ -74,12 +73,11 @@ noi2c: linbpq
linbpq: $(OBJS)
- cc $(OBJS) $(CFLAGS) $(LDFLAGS) $(LIBS) -o linbpq
- sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
+ $(CC) $(OBJS) $(CFLAGS) $(LDFLAGS) $(LIBS) -o 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

View file

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

View file

@ -1,21 +0,0 @@
From: Dave Hibberd <hibby@debian.org>
Date: Sat, 20 Sep 2025 15:42:15 +0100
Subject: spelling-fixes
---
UZ7HODrv.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/UZ7HODrv.c b/UZ7HODrv.c
index 2adfe12..75e40ee 100644
--- a/UZ7HODrv.c
+++ b/UZ7HODrv.c
@@ -387,7 +387,7 @@ int UZ7HOSetFreq(int port, struct TNCINFO * TNC, struct AGWINFO * AGW, PDATAMESS
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

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

View file

@ -66,7 +66,6 @@ struct ConnectionInfo
char Signon[100]; // User/Pass/Appl for Outgoing Connects char Signon[100]; // User/Pass/Appl for Outgoing Connects
BOOL Keepalive; // For HOST (esp CCC) Keepalives BOOL Keepalive; // For HOST (esp CCC) Keepalives
time_t LastSendTime; time_t LastSendTime;
time_t LastReceiveTime;
BOOL NoCallsign; // Don't Send Callsign to host if no Signon BOOL NoCallsign; // Don't Send Callsign to host if no Signon
UCHAR * ResendBuffer; // Used if send() returns EWOULDBLOCK UCHAR * ResendBuffer; // Used if send() returns EWOULDBLOCK
int ResendLen; // Len to resend int ResendLen; // Len to resend