Update upstream source from tag 'upstream/6.0.24.71+repack'
Update to upstream version '6.0.24.71+repack'
with Debian dir d79186aef0
This commit is contained in:
commit
3ecb593511
3
ARDOP.c
3
ARDOP.c
|
@ -888,6 +888,7 @@ 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;
|
||||||
|
@ -900,6 +901,7 @@ 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;
|
||||||
}
|
}
|
||||||
|
@ -3141,6 +3143,7 @@ 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
|
||||||
|
|
||||||
|
|
|
@ -10586,7 +10586,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[100];
|
char Msg[256];
|
||||||
char Title[100];
|
char Title[100];
|
||||||
int64_t Freq = 0;
|
int64_t Freq = 0;
|
||||||
int Mode = 0;
|
int Mode = 0;
|
||||||
|
@ -10670,6 +10670,12 @@ 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;
|
||||||
|
@ -10734,7 +10740,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 %d Mode %ld\r\n", callsign, port, LongFreq, Mode);
|
Length += sprintf(MailBuffer, "New User %s Connected to Mailbox on Port %d Freq %lld Mode %d\r\n", callsign, port, LongFreq, Mode);
|
||||||
|
|
||||||
sprintf(Title, "New User %s", callsign);
|
sprintf(Title, "New User %s", callsign);
|
||||||
|
|
||||||
|
@ -10794,7 +10800,7 @@ int Connected(int Stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (port)
|
if (port)
|
||||||
n=sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %d Mode %s",
|
n = sprintf_s(Msg, sizeof(Msg), "Incoming Connect from %s on Port %d Freq %lld 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);
|
||||||
|
|
498
BPQINP3.c
498
BPQINP3.c
|
@ -37,6 +37,9 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -71,9 +74,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 DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt);
|
VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt);
|
||||||
VOID KillRoute(struct DEST_ROUTE_ENTRY * ROUTEPTR);
|
VOID KillRoute(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR);
|
||||||
VOID AddHere(struct 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);
|
||||||
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);
|
||||||
|
@ -133,8 +136,14 @@ 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];
|
||||||
|
|
||||||
// Delete any NETROM Dest entries via this Route
|
Call1[ConvFromAX25(Route->NEIGHBOUR_CALL, Call1)] = 0;
|
||||||
|
|
||||||
|
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;
|
||||||
|
@ -156,48 +165,65 @@ 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;
|
||||||
|
|
||||||
if (Dest->ROUTE[0].ROUT_NEIGHBOUR == Route)
|
Call2[ConvFromAX25(Dest->DEST_CALL, Call2)] = 0;
|
||||||
|
|
||||||
|
if (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == Route)
|
||||||
{
|
{
|
||||||
// We are deleting the best route, so need to tell other nodes
|
// We are deleting the best INP3 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->ROUTE[0].SRTT = 60000;
|
Dest->INP3ROUTE[0].SRTT = 60000;
|
||||||
Dest->ROUTE[0].Hops = 255;
|
Dest->INP3ROUTE[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->ROUTE[1].LastRTT = Dest->ROUTE[0].SRTT; // So next scan will check if rtt has increaced
|
Dest->INP3ROUTE[1].LastRTT = Dest->INP3ROUTE[0].SRTT; // So next scan will check if rtt has increaced enough to need a RIF
|
||||||
// enough to need a RIF
|
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->ROUTE[0], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
|
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_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->ROUTE[1].ROUT_NEIGHBOUR == Route)
|
if (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR == Route)
|
||||||
{
|
{
|
||||||
memcpy(&Dest->ROUTE[1], &Dest->ROUTE[2], sizeof(struct DEST_ROUTE_ENTRY));
|
Debugprintf("Deleting 2nd INP3 Route to %s", Call2);
|
||||||
memset(&Dest->ROUTE[2], 0, sizeof(struct 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));
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dest->ROUTE[2].ROUT_NEIGHBOUR == Route)
|
if (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR == Route)
|
||||||
{
|
{
|
||||||
memset(&Dest->ROUTE[2], 0, sizeof(struct DEST_ROUTE_ENTRY));
|
Debugprintf("Deleting 3rd INP3 Route to %s", Call2);
|
||||||
|
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)
|
||||||
|
@ -233,7 +259,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->ROUTE[0].ROUT_NEIGHBOUR == 0) // Any INP3 ROutes?
|
if (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == 0) // Any INP3 ROutes?
|
||||||
{
|
{
|
||||||
// No More Routes - ZAP Dest
|
// No More Routes - ZAP Dest
|
||||||
|
|
||||||
|
@ -306,19 +332,9 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
|
||||||
int RTT;
|
int RTT;
|
||||||
unsigned int OrigTime;
|
unsigned int OrigTime;
|
||||||
|
|
||||||
if ((Route->Status & GotRTTResponse) == 0)
|
char Normcall[10];
|
||||||
{
|
|
||||||
// Link is just starting
|
|
||||||
|
|
||||||
Route->Status |= GotRTTResponse;
|
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
|
||||||
|
|
||||||
if (Route->Status & GotRTTRequest)
|
|
||||||
{
|
|
||||||
Route->Status |= SentOurRIF;
|
|
||||||
SendOurRIF(Route);
|
|
||||||
SendRIPToNeighbour(Route);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Route->Timeout = 0; // Got Response
|
Route->Timeout = 0; // Got Response
|
||||||
|
|
||||||
|
@ -334,6 +350,16 @@ 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)
|
||||||
|
@ -345,6 +371,13 @@ 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
|
||||||
|
@ -386,10 +419,9 @@ 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 and update hops
|
// rtt is value from remote node. Add our RTT to that node
|
||||||
|
|
||||||
rtt += Route->SRTT;
|
rtt += Route->SRTT;
|
||||||
hops++;
|
|
||||||
|
|
||||||
msglen -= 10;
|
msglen -= 10;
|
||||||
|
|
||||||
|
@ -424,7 +456,7 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID KillRoute(struct DEST_ROUTE_ENTRY * ROUTEPTR)
|
VOID KillRoute(struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,21 +464,58 @@ VOID KillRoute(struct 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 DEST_ROUTE_ENTRY * ROUTEPTR;
|
struct INP3_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("Node %s Hops %d RTT %d Ignored - Hop Count too high", call, hops, rtt);
|
Debugprintf("INP3 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("Node %s Hops %d RTT %d Ignored - rtt too high", call, hops, rtt);
|
Debugprintf("INP3 Node %s Hops %d RTT %d Ignored - rtt too high", call, hops, rtt);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtt >= 60000)
|
||||||
|
{
|
||||||
|
Debugprintf("INP3 RTT > 60000 - discarding");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -454,10 +523,12 @@ 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));
|
||||||
|
|
||||||
|
@ -466,58 +537,63 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
|
||||||
|
|
||||||
// Set up First Route
|
// Set up First Route
|
||||||
|
|
||||||
Dest->ROUTE[0].Hops = hops;
|
Dest->INP3ROUTE[0].Hops = hops;
|
||||||
Dest->ROUTE[0].SRTT = rtt;
|
Dest->INP3ROUTE[0].SRTT = rtt;
|
||||||
Dest->ROUTE[0].LastRTT = 0;
|
Dest->INP3ROUTE[0].LastRTT = 0;
|
||||||
|
|
||||||
Dest->INP3FLAGS = NewNode;
|
Dest->INP3FLAGS = NewNode;
|
||||||
|
|
||||||
Dest->ROUTE[0].ROUT_NEIGHBOUR = Route;
|
Dest->INP3ROUTE[0].ROUT_NEIGHBOUR = Route;
|
||||||
|
|
||||||
NUMBEROFNODES++;
|
NUMBEROFNODES++;
|
||||||
|
|
||||||
ConvFromAX25(Dest->DEST_CALL, call);
|
ConvFromAX25(Dest->DEST_CALL, call);
|
||||||
Debugprintf("Adding Node %s Hops %d RTT %d", call, hops, rtt);
|
Debugprintf("INP3 Adding New 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->ROUTE[0];
|
ROUTEPTR = &Dest->INP3ROUTE[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->ROUTE[1];
|
ROUTEPTR = &Dest->INP3ROUTE[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->ROUTE[2];
|
ROUTEPTR = &Dest->INP3ROUTE[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;
|
||||||
}
|
}
|
||||||
|
@ -525,64 +601,68 @@ 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
|
||||||
|
|
||||||
if (rtt >= 60000)
|
for (i = 0; i < 3; i++)
|
||||||
return; // No Point addind a new dead route
|
|
||||||
|
|
||||||
ROUTEPTR = &Dest->ROUTE[0];
|
|
||||||
|
|
||||||
for (i = 1; i < 4; i++)
|
|
||||||
{
|
{
|
||||||
|
ROUTEPTR = &Dest->INP3ROUTE[i];
|
||||||
|
|
||||||
if (ROUTEPTR->ROUT_NEIGHBOUR == NULL)
|
if (ROUTEPTR->ROUT_NEIGHBOUR == NULL)
|
||||||
{
|
{
|
||||||
// Add here
|
// Add here
|
||||||
|
|
||||||
Dest->ROUTE[0].Hops = hops;
|
Debugprintf("INP3 adding as route[%d]", i);
|
||||||
Dest->ROUTE[0].SRTT = rtt;
|
AddHere(ROUTEPTR, Route, hops, rtt);
|
||||||
Dest->ROUTE[0].ROUT_NEIGHBOUR = Route;
|
SortRoutes(Dest);
|
||||||
|
|
||||||
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->ROUTE[0].SRTT > rtt)
|
if (Dest->INP3ROUTE[0].SRTT > rtt)
|
||||||
{
|
{
|
||||||
// We are better. Move others down and add on front
|
// We are better. Move others down and add on front
|
||||||
|
|
||||||
memcpy(&Dest->ROUTE[2], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
|
Debugprintf("INP3 Replacing route 0");
|
||||||
memcpy(&Dest->ROUTE[1], &Dest->ROUTE[0], sizeof(struct DEST_ROUTE_ENTRY));
|
|
||||||
|
|
||||||
AddHere(&Dest->ROUTE[0], Route, hops, rtt);
|
memcpy(&Dest->INP3ROUTE[2], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
|
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
|
AddHere(&Dest->INP3ROUTE[0], Route, hops, rtt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dest->ROUTE[1].SRTT > rtt)
|
if (Dest->INP3ROUTE[1].SRTT > rtt)
|
||||||
{
|
{
|
||||||
// We are better. Move 2nd down and add
|
// We are better. Move 2nd down and add
|
||||||
|
|
||||||
memcpy(&Dest->ROUTE[2], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
|
Debugprintf("INP3 Replacing route 1");
|
||||||
|
memcpy(&Dest->INP3ROUTE[2], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
AddHere(&Dest->ROUTE[1], Route, hops, rtt);
|
AddHere(&Dest->INP3ROUTE[1], Route, hops, rtt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dest->ROUTE[2].SRTT > rtt)
|
if (Dest->INP3ROUTE[2].SRTT > rtt)
|
||||||
{
|
{
|
||||||
// We are better. Add here
|
// We are better. Add here
|
||||||
|
|
||||||
AddHere(&Dest->ROUTE[2], Route, hops, rtt);
|
Debugprintf("INP3 Replacing route 2");
|
||||||
|
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 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;
|
||||||
ROUTEPTR->SRTT = rtt;
|
ROUTEPTR->SRTT = rtt;
|
||||||
|
@ -643,38 +723,122 @@ NOTBADROUTE:
|
||||||
JMP SENDOK
|
JMP SENDOK
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct INP3_DEST_ROUTE_ENTRY Temp;
|
||||||
|
|
||||||
|
|
||||||
VOID SortRoutes(struct DEST_LIST * Dest)
|
VOID SortRoutes(struct DEST_LIST * Dest)
|
||||||
{
|
{
|
||||||
struct DEST_ROUTE_ENTRY Temp;
|
char Call1[10], Call2[10], Call3[10];
|
||||||
|
|
||||||
|
|
||||||
// May now be out of order
|
// May now be out of order
|
||||||
|
|
||||||
if (Dest->ROUTE[1].ROUT_NEIGHBOUR == 0)
|
if (Dest->INP3ROUTE[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->ROUTE[2].ROUT_NEIGHBOUR == 0)
|
if (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR == 0)
|
||||||
{
|
{
|
||||||
// Only 2
|
// Only 2
|
||||||
|
|
||||||
if (Dest->ROUTE[0].SRTT <= Dest->ROUTE[1].SRTT)
|
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);
|
||||||
|
|
||||||
|
if (Dest->INP3ROUTE[0].SRTT <= Dest->INP3ROUTE[1].SRTT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Swap one and two
|
// Swap one and two
|
||||||
|
|
||||||
memcpy(&Temp, &Dest->ROUTE[0], sizeof(struct DEST_ROUTE_ENTRY));
|
memcpy(&Temp, &Dest->INP3ROUTE[0], sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
memcpy(&Dest->ROUTE[0], &Dest->ROUTE[1], sizeof(struct DEST_ROUTE_ENTRY));
|
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
memcpy(&Dest->ROUTE[1], &Temp, sizeof(struct 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;
|
||||||
|
|
||||||
|
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 DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt)
|
VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt)
|
||||||
{
|
{
|
||||||
if (ROUTEPTR->Hops == 0)
|
if (ROUTEPTR->Hops == 0)
|
||||||
{
|
{
|
||||||
|
@ -706,20 +870,28 @@ VOID UpdateRoute(struct DEST_LIST * Dest, struct DEST_ROUTE_ENTRY * ROUTEPTR, in
|
||||||
|
|
||||||
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)
|
||||||
int OtherRTT;
|
Route->INP3Node = 1;
|
||||||
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
|
||||||
}
|
}
|
||||||
|
@ -737,29 +909,31 @@ 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;
|
||||||
|
|
||||||
if (Route->Status & GotRTTResponse)
|
// I don't think we should send RIF until we get an RTT response.
|
||||||
{
|
|
||||||
|
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)
|
||||||
|
@ -788,6 +962,14 @@ 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)
|
||||||
|
@ -821,7 +1003,9 @@ 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
|
||||||
|
|
||||||
|
@ -848,10 +1032,13 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,11 +1050,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;
|
||||||
|
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
|
||||||
|
@ -898,6 +1091,8 @@ 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++)
|
||||||
{
|
{
|
||||||
|
@ -946,6 +1141,12 @@ 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;
|
||||||
|
@ -1007,7 +1208,7 @@ int SendRIPTimer()
|
||||||
char Call [11] = "";
|
char Call [11] = "";
|
||||||
|
|
||||||
ConvFromAX25(Route->NEIGHBOUR_CALL, Call);
|
ConvFromAX25(Route->NEIGHBOUR_CALL, Call);
|
||||||
Debugprintf("BPQ32 INP Neighbour %s Lost", Call);
|
Debugprintf("BPQ32 INP3 Neighbour %s Lost", Call);
|
||||||
|
|
||||||
Route->Status = 0; // Down
|
Route->Status = 0; // Down
|
||||||
}
|
}
|
||||||
|
@ -1042,27 +1243,39 @@ 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 DEST_ROUTE_ENTRY * Entry)
|
VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct INP3_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++)
|
||||||
{
|
{
|
||||||
|
@ -1073,7 +1286,14 @@ VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct DEST_ROUTE_E
|
||||||
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);
|
||||||
|
@ -1085,6 +1305,7 @@ VOID SendRIPToOtherNeighbours(UCHAR * axcall, UCHAR * alias, struct DEST_ROUTE_E
|
||||||
Routes->Msg = NULL;
|
Routes->Msg = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Routes+=1;
|
Routes+=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1093,9 +1314,14 @@ VOID SendRIPToNeighbour(struct ROUTE * Route)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct DEST_LIST * Dest = DESTS;
|
struct DEST_LIST * Dest = DESTS;
|
||||||
struct DEST_ROUTE_ENTRY * Entry;
|
struct INP3_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
|
||||||
|
@ -1104,7 +1330,7 @@ VOID SendRIPToNeighbour(struct ROUTE * Route)
|
||||||
{
|
{
|
||||||
Dest++;
|
Dest++;
|
||||||
|
|
||||||
Entry = &Dest->ROUTE[0];
|
Entry = &Dest->INP3ROUTE[0];
|
||||||
|
|
||||||
if (Entry->ROUT_NEIGHBOUR && Entry->Hops && Route != Entry->ROUT_NEIGHBOUR)
|
if (Entry->ROUT_NEIGHBOUR && Entry->Hops && Route != Entry->ROUT_NEIGHBOUR)
|
||||||
{
|
{
|
||||||
|
@ -1142,8 +1368,12 @@ 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;
|
||||||
}
|
}
|
||||||
|
@ -1153,7 +1383,7 @@ VOID SendNegativeInfo()
|
||||||
{
|
{
|
||||||
int i, Preload;
|
int i, Preload;
|
||||||
struct DEST_LIST * Dest = DESTS;
|
struct DEST_LIST * Dest = DESTS;
|
||||||
struct DEST_ROUTE_ENTRY * Entry;
|
struct INP3_DEST_ROUTE_ENTRY * Entry;
|
||||||
|
|
||||||
Dest--;
|
Dest--;
|
||||||
|
|
||||||
|
@ -1169,7 +1399,7 @@ VOID SendNegativeInfo()
|
||||||
{
|
{
|
||||||
Dest++;
|
Dest++;
|
||||||
|
|
||||||
Entry = &Dest->ROUTE[0];
|
Entry = &Dest->INP3ROUTE[0];
|
||||||
|
|
||||||
if (Entry->SRTT > Entry->LastRTT)
|
if (Entry->SRTT > Entry->LastRTT)
|
||||||
{
|
{
|
||||||
|
@ -1194,15 +1424,19 @@ VOID SendNegativeInfo()
|
||||||
{
|
{
|
||||||
char call[11]="";
|
char call[11]="";
|
||||||
ConvFromAX25(Dest->DEST_CALL, call);
|
ConvFromAX25(Dest->DEST_CALL, call);
|
||||||
Debugprintf("Deleting Node %s", call);
|
Debugprintf("INP3 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 DEST_ROUTE_ENTRY));
|
memset(Entry, 0, sizeof(struct INP3_DEST_ROUTE_ENTRY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Dest->DEST_ROUTE == 4) // we were using it
|
||||||
|
Dest->DEST_ROUTE = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1211,7 +1445,7 @@ VOID SendPositiveInfo()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct DEST_LIST * Dest = DESTS;
|
struct DEST_LIST * Dest = DESTS;
|
||||||
struct DEST_ROUTE_ENTRY * Entry;
|
struct INP3_DEST_ROUTE_ENTRY * Entry;
|
||||||
|
|
||||||
Dest--;
|
Dest--;
|
||||||
|
|
||||||
|
@ -1221,14 +1455,14 @@ VOID SendPositiveInfo()
|
||||||
{
|
{
|
||||||
Dest++;
|
Dest++;
|
||||||
|
|
||||||
Entry = &Dest->ROUTE[0];
|
Entry = &Dest->INP3ROUTE[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->ROUTE[0].LastRTT = (Dest->ROUTE[0].SRTT * 11) / 10; //10% Negative Preload
|
Dest->INP3ROUTE[0].LastRTT = (Dest->INP3ROUTE[0].SRTT * 11) / 10; //10% Negative Preload
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1238,7 +1472,7 @@ VOID SendNewInfo()
|
||||||
int i;
|
int i;
|
||||||
unsigned int NewRTT;
|
unsigned int NewRTT;
|
||||||
struct DEST_LIST * Dest = DESTS;
|
struct DEST_LIST * Dest = DESTS;
|
||||||
struct DEST_ROUTE_ENTRY * Entry;
|
struct INP3_DEST_ROUTE_ENTRY * Entry;
|
||||||
|
|
||||||
Dest--;
|
Dest--;
|
||||||
|
|
||||||
|
@ -1252,7 +1486,7 @@ VOID SendNewInfo()
|
||||||
{
|
{
|
||||||
Dest->INP3FLAGS &= ~NewNode;
|
Dest->INP3FLAGS &= ~NewNode;
|
||||||
|
|
||||||
Entry = &Dest->ROUTE[0];
|
Entry = &Dest->INP3ROUTE[0];
|
||||||
|
|
||||||
SendRIPToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry);
|
SendRIPToOtherNeighbours(Dest->DEST_CALL, Dest->DEST_ALIAS, Entry);
|
||||||
|
|
||||||
|
@ -1368,14 +1602,6 @@ 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++;
|
||||||
|
@ -1384,4 +1610,26 @@ UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, unsigned int msglen)
|
||||||
|
|
||||||
return ptr2;
|
return ptr2;
|
||||||
}
|
}
|
||||||
|
return ptr2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Paula's conversion of rtt to Quality
|
||||||
|
|
||||||
|
int inp3_tt2qual (int tt, int hops)
|
||||||
|
{
|
||||||
|
int qual;
|
||||||
|
|
||||||
|
if (tt >= 60000 || hops > 30)
|
||||||
|
return(0);
|
||||||
|
|
||||||
|
qual = 254 - (tt/20);
|
||||||
|
|
||||||
|
if (qual > 254 - hops)
|
||||||
|
qual = 254 - hops;
|
||||||
|
|
||||||
|
if (qual < 0)
|
||||||
|
qual=0;
|
||||||
|
|
||||||
|
return(qual);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -1152,6 +1152,7 @@
|
||||||
// Fixes to using {FormFolder} in Webmail Templates (68)
|
// Fixes to using {FormFolder} in Webmail Templates (68)
|
||||||
// Save FBB transfer restart data over program restarts (69)
|
// Save FBB transfer restart data over program restarts (69)
|
||||||
// Add Send and Receive byte counts to status displays (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"
|
||||||
|
|
14
Bpq32.c
14
Bpq32.c
|
@ -1257,8 +1257,16 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||||
// Fix RigConrol with Chanxx but no other settings (66)
|
// Fix RigConrol with Chanxx but no other settings (66)
|
||||||
// Add option to compress L2 frames (67)
|
// Add option to compress L2 frames (67)
|
||||||
// Sort Routes displays (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
|
||||||
|
|
||||||
|
@ -2381,6 +2389,8 @@ FirstInit()
|
||||||
|
|
||||||
timeLoadedMS = GetTickCount();
|
timeLoadedMS = GetTickCount();
|
||||||
|
|
||||||
|
srand(time(NULL));
|
||||||
|
|
||||||
INITIALISEPORTS();
|
INITIALISEPORTS();
|
||||||
|
|
||||||
OpenReportingSockets();
|
OpenReportingSockets();
|
||||||
|
|
91
Cmd.c
91
Cmd.c
|
@ -1229,15 +1229,57 @@ 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;
|
int len, Count;
|
||||||
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--)
|
||||||
|
@ -1245,6 +1287,7 @@ 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);
|
||||||
|
|
||||||
|
@ -1252,15 +1295,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\r",
|
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=2.2 Q=%d\r",
|
||||||
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE);
|
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, Count);
|
||||||
else
|
else
|
||||||
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d\r",
|
Bufferptr = Cmdprintf(Session, Bufferptr, " S=%d P=%d T=%d V=%d Q=%d\r",
|
||||||
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG);
|
LINK->L2STATE, LINK->LINKPORT->PORTNUMBER, LINK->LINKTYPE, 2 - LINK->VER1FLAG, Count);
|
||||||
}
|
}
|
||||||
LINK++;
|
LINK++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
|
SendCommandReply(Session, REPLYBUFFER, (int)(Bufferptr - (char *)REPLYBUFFER));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2845,7 +2888,7 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
|
||||||
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 DEST_ROUTE_ENTRY * Route;
|
struct INP3_DEST_ROUTE_ENTRY * Route;
|
||||||
struct ROUTE * Neighbour;
|
struct ROUTE * Neighbour;
|
||||||
int i, Active, len;
|
int i, Active, len;
|
||||||
|
|
||||||
|
@ -2886,7 +2929,7 @@ char * DoOneNode(TRANSPORTENTRY * Session, char * Bufferptr, struct DEST_LIST *
|
||||||
|
|
||||||
// DISPLAY INP3 ROUTES
|
// DISPLAY INP3 ROUTES
|
||||||
|
|
||||||
Route = &Dest->ROUTE[0];
|
Route = &Dest->INP3ROUTE[0];
|
||||||
|
|
||||||
Active = Dest->DEST_ROUTE;
|
Active = Dest->DEST_ROUTE;
|
||||||
|
|
||||||
|
@ -2943,17 +2986,17 @@ int DoINP3ViaEntry(struct DEST_LIST * Dest, int n, char * line, int cursor)
|
||||||
int len;
|
int len;
|
||||||
double srtt;
|
double srtt;
|
||||||
|
|
||||||
if (Dest->ROUTE[n].ROUT_NEIGHBOUR != 0)
|
if (Dest->INP3ROUTE[n].ROUT_NEIGHBOUR != 0)
|
||||||
{
|
{
|
||||||
srtt = Dest->ROUTE[n].SRTT/1000.0;
|
srtt = Dest->INP3ROUTE[n].SRTT/1000.0;
|
||||||
|
|
||||||
len=ConvFromAX25(Dest->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, Portcall);
|
len=ConvFromAX25(Dest->INP3ROUTE[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->ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT,
|
Dest->INP3ROUTE[n].ROUT_NEIGHBOUR->NEIGHBOUR_PORT,
|
||||||
Dest->ROUTE[n].Hops, srtt);
|
Dest->INP3ROUTE[n].Hops, srtt);
|
||||||
|
|
||||||
cursor+=len;
|
cursor+=len;
|
||||||
|
|
||||||
|
@ -3241,7 +3284,7 @@ NODE_VIA:
|
||||||
{
|
{
|
||||||
Dest+=1;
|
Dest+=1;
|
||||||
|
|
||||||
if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->ROUTE[0].ROUT_NEIGHBOUR == 0)
|
if (Dest->NRROUTE[0].ROUT_NEIGHBOUR == 0 && Dest->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
||||||
|
@ -3249,9 +3292,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->ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|
|| (Dest->INP3ROUTE[0].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[0].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|
||||||
|| (Dest->ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|
|| (Dest->INP3ROUTE[1].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[1].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL))
|
||||||
|| (Dest->ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)))
|
|| (Dest->INP3ROUTE[2].ROUT_NEIGHBOUR && CompareCalls(Dest->INP3ROUTE[2].ROUT_NEIGHBOUR->NEIGHBOUR_CALL, AXCALL)))
|
||||||
{
|
{
|
||||||
len=ConvFromAX25(Dest->DEST_CALL,Normcall);
|
len=ConvFromAX25(Dest->DEST_CALL,Normcall);
|
||||||
|
|
||||||
|
@ -3622,7 +3665,7 @@ VOID MHCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct CM
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (CMD->String[2] == 'V') // MHV
|
if (CMD->String[2] == 'V' || CMD->String[3] == '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");
|
||||||
|
@ -4326,6 +4369,8 @@ 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,
|
||||||
|
@ -5543,22 +5588,14 @@ 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");
|
||||||
|
|
10
CommonCode.c
10
CommonCode.c
|
@ -77,6 +77,8 @@ 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
|
||||||
|
|
||||||
|
@ -363,7 +365,7 @@ BOK1:
|
||||||
|
|
||||||
if (n > 1000)
|
if (n > 1000)
|
||||||
{
|
{
|
||||||
Debugprintf("Loop searching free chain - pointer = %p %p", debug, pointer);
|
Debugprintf("Releasebuffer Loop searching free chain - pointer = %p %p from %s Line %d", debug, pointer, File, Line);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -376,6 +378,11 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,6 +1068,7 @@ 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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2065,7 +2065,7 @@ BOOL LookupRestart(CIRCUIT * conn, struct FBBHeaderLine * FBBHeader)
|
||||||
|
|
||||||
RestartRec->Count++;
|
RestartRec->Count++;
|
||||||
|
|
||||||
if (RestartRec->Count > 3)
|
if (RestartRec->Count > 10)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
|
@ -452,6 +452,11 @@ 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
86
KAMPactor.c
86
KAMPactor.c
|
@ -70,6 +70,8 @@ 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};
|
||||||
|
|
||||||
|
@ -517,6 +519,28 @@ 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>"
|
||||||
|
@ -595,6 +619,11 @@ 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
|
||||||
|
|
||||||
|
@ -1266,6 +1295,51 @@ 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)
|
||||||
|
@ -1644,6 +1718,10 @@ 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;
|
||||||
|
@ -1790,6 +1868,10 @@ 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];
|
||||||
|
@ -2047,6 +2129,10 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
40
L2Code.c
40
L2Code.c
|
@ -121,6 +121,7 @@ void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LIN
|
||||||
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);
|
int L2Compressit(unsigned char * Out, int OutSize, unsigned char * In, int Len);
|
||||||
|
VOID DeleteINP3Routes(struct ROUTE * Route);
|
||||||
|
|
||||||
extern int REALTIMETICKS;
|
extern int REALTIMETICKS;
|
||||||
|
|
||||||
|
@ -1184,8 +1185,9 @@ 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 IT IS REASONABLE TO FULLY RESET THE CIRCUIT, BUT IN 4
|
// FOR 1-3 and 5 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
|
||||||
|
@ -1215,6 +1217,8 @@ 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];
|
||||||
|
|
||||||
|
@ -1272,6 +1276,18 @@ 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;
|
||||||
|
|
||||||
|
@ -1955,11 +1971,23 @@ 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;
|
||||||
|
@ -2431,12 +2459,11 @@ 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;
|
||||||
|
@ -2793,7 +2820,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 BX)
|
// COUNTS FRAMES QUEUED ON AN L2 SESSION (IN LINK)
|
||||||
|
|
||||||
int count = 0, abovelink = 0;
|
int count = 0, abovelink = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
@ -3919,7 +3946,6 @@ 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.
|
||||||
|
@ -3978,6 +4004,8 @@ 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)
|
||||||
{
|
{
|
||||||
|
@ -3992,7 +4020,7 @@ VOID ConnectFailedOrRefused(struct _LINKTABLE * LINK, char * Msg)
|
||||||
|
|
||||||
if (LINK->LINKTYPE == 3)
|
if (LINK->LINKTYPE == 3)
|
||||||
{
|
{
|
||||||
L3CONNECTFAILED(LINK); // REPORT TO LEVEL 3
|
L3LINKSETUPFAILED(LINK); // REPORT TO LEVEL 3
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
89
L3Code.c
89
L3Code.c
|
@ -67,6 +67,8 @@ extern dest_list * CURRENTNODE;
|
||||||
|
|
||||||
int L3_10SECS = 10;
|
int L3_10SECS = 10;
|
||||||
|
|
||||||
|
extern int PREFERINP3ROUTES;
|
||||||
|
|
||||||
|
|
||||||
VOID L3BG()
|
VOID L3BG()
|
||||||
{
|
{
|
||||||
|
@ -135,12 +137,14 @@ 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 riskof looking at lod entries
|
return; // Avoid risk of looking at old entries
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,14 +158,24 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
||||||
{
|
{
|
||||||
int n = MAXDESTS;
|
int n = MAXDESTS;
|
||||||
struct PORTCONTROL * PORT = PORTTABLE;
|
struct PORTCONTROL * PORT = PORTTABLE;
|
||||||
struct ROUTE * ROUTE;
|
struct ROUTE * ROUTE = NULL;
|
||||||
struct _LINKTABLE * LINK;
|
struct _LINKTABLE * LINK;
|
||||||
struct TNCINFO * TNC;
|
struct TNCINFO * TNC;
|
||||||
|
|
||||||
int ActiveRoute;
|
int ActiveRoute;
|
||||||
|
|
||||||
if (DEST->DEST_ROUTE == 0) // ALREADY HAVE A SELECTED ROUTE?
|
if (DEST->DEST_ROUTE == 0) // Don't 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;
|
||||||
|
|
||||||
|
@ -169,7 +183,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
||||||
|
|
||||||
if (ROUTE == 0)
|
if (ROUTE == 0)
|
||||||
{
|
{
|
||||||
// Currnet Route not present
|
// Current 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)
|
||||||
|
@ -177,13 +191,17 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
||||||
|
|
||||||
// Current Route is 1
|
// Current Route is 1
|
||||||
|
|
||||||
if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
|
if (DEST->INP3ROUTE[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->ROUTE[0].ROUT_NEIGHBOUR;
|
ROUTE = DEST->INP3ROUTE[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];
|
||||||
|
@ -204,7 +222,7 @@ BOOL ACTIVATE_DEST(struct DEST_LIST * DEST)
|
||||||
return L2SETUPCROSSLINK(ROUTE);
|
return L2SETUPCROSSLINK(ROUTE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We mst be waiting for link to come up
|
// We umst be waiting for link to come up
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -707,11 +725,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->ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
|
else if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == ROUTE)
|
||||||
count++;
|
count++;
|
||||||
else if (DEST->ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
|
else if (DEST->INP3ROUTE[1].ROUT_NEIGHBOUR == ROUTE)
|
||||||
count++;
|
count++;
|
||||||
else if (DEST->ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
|
else if (DEST->INP3ROUTE[2].ROUT_NEIGHBOUR == ROUTE)
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
DEST++;
|
DEST++;
|
||||||
|
@ -845,7 +863,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 DEST = 0;
|
(NODE == 1 || DEST->DEST_STATE & 0x80)) // Only send appl nodes if NODE = 0;
|
||||||
{
|
{
|
||||||
// Send it
|
// Send it
|
||||||
|
|
||||||
|
@ -878,6 +896,9 @@ VOID SENDNEXTNODESFRAGMENT()
|
||||||
|
|
||||||
*(ptr1++) = (UCHAR)Qual;
|
*(ptr1++) = (UCHAR)Qual;
|
||||||
|
|
||||||
|
if (Qual == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
Count--;
|
Count--;
|
||||||
}
|
}
|
||||||
DEST++;
|
DEST++;
|
||||||
|
@ -924,7 +945,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 [ESI] AS ACTIVE NEIGHBOUR, AND
|
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
|
||||||
// SET INACTIVE
|
// SET INACTIVE
|
||||||
|
|
||||||
dest_list * DEST;
|
dest_list * DEST;
|
||||||
|
@ -945,7 +966,7 @@ VOID CLEARACTIVEROUTE(struct ROUTE * ROUTE, int Reason)
|
||||||
if (DEST->DEST_ROUTE == 0)
|
if (DEST->DEST_ROUTE == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (DEST->ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
|
if (DEST->INP3ROUTE[DEST->DEST_ROUTE].ROUT_NEIGHBOUR == ROUTE) // Is this the active route
|
||||||
{
|
{
|
||||||
// Yes, so clear
|
// Yes, so clear
|
||||||
|
|
||||||
|
@ -1120,7 +1141,7 @@ UPDEST000:
|
||||||
{
|
{
|
||||||
// Any INP3 Routes?
|
// Any INP3 Routes?
|
||||||
|
|
||||||
if (DEST->ROUTE[0].ROUT_NEIGHBOUR == 0)
|
if (DEST->INP3ROUTE[0].ROUT_NEIGHBOUR == 0)
|
||||||
{
|
{
|
||||||
// NO ROUTES LEFT TO DEST - REMOVE IT
|
// NO ROUTES LEFT TO DEST - REMOVE IT
|
||||||
|
|
||||||
|
@ -1292,6 +1313,32 @@ 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
|
||||||
|
@ -1305,6 +1352,14 @@ 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
|
||||||
|
@ -1315,7 +1370,7 @@ VOID L3CONNECTFAILED(struct _LINKTABLE * LINK)
|
||||||
|
|
||||||
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
|
VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
|
||||||
{
|
{
|
||||||
// FIND ANY DESINATIONS WITH [ESI] AS ACTIVE NEIGHBOUR, AND
|
// FIND ANY DESINATIONS WITH ROUTE AS ACTIVE NEIGHBOUR, AND
|
||||||
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
|
// SET NEXT BEST NEIGHBOUR (IF ANY) ACTIVE
|
||||||
|
|
||||||
int n = MAXDESTS;
|
int n = MAXDESTS;
|
||||||
|
@ -1328,7 +1383,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
|
||||||
|
|
||||||
if (ActiveRoute)
|
if (ActiveRoute)
|
||||||
{
|
{
|
||||||
ActiveRoute --; // Routes numbered 1 - 6, idex from 0
|
ActiveRoute --; // Routes numbered 1 - 6, index from 0
|
||||||
|
|
||||||
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
|
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
|
||||||
{
|
{
|
||||||
|
|
1
L4Code.c
1
L4Code.c
|
@ -304,6 +304,7 @@ VOID SENDL4MESSAGE(TRANSPORTENTRY * L4, struct DATAMESSAGE * Msg)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
L3MSG = GetBuff();
|
L3MSG = GetBuff();
|
||||||
|
|
||||||
if (L3MSG == 0)
|
if (L3MSG == 0)
|
||||||
|
|
15
LinBPQ.c
15
LinBPQ.c
|
@ -381,12 +381,11 @@ 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[] = "SIGSEGV Received\n";
|
char msg[] = "\nSIGSEGV Received\n";
|
||||||
|
|
||||||
write(STDERR_FILENO, msg, strlen(msg));
|
write(STDERR_FILENO, msg, strlen(msg));
|
||||||
|
|
||||||
|
@ -397,6 +396,9 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,18 +406,23 @@ static void abrthandler(int sig)
|
||||||
{
|
{
|
||||||
void *array[10];
|
void *array[10];
|
||||||
size_t size;
|
size_t size;
|
||||||
char msg[] = "SIGABRT Received\n";
|
char msg[] = "\nSIGABRT 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");
|
||||||
|
@ -847,6 +854,8 @@ 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
|
||||||
|
|
||||||
|
|
51
RHP.c
51
RHP.c
|
@ -451,8 +451,13 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||||
int ID;
|
int ID;
|
||||||
char * Data;
|
char * Data;
|
||||||
char * ptr;
|
char * ptr;
|
||||||
|
unsigned char * uptr;
|
||||||
int c;
|
int c;
|
||||||
int Len;
|
int Len;
|
||||||
|
unsigned int HexCode1;
|
||||||
|
unsigned int HexCode2;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
|
||||||
int Handle = 1;
|
int Handle = 1;
|
||||||
|
|
||||||
|
@ -470,9 +475,10 @@ int processRHCPSend(SOCKET Socket, char * Msg, char * ReplyBuffer)
|
||||||
|
|
||||||
RHPSession = RHPSessions[Handle - 1];
|
RHPSession = RHPSessions[Handle - 1];
|
||||||
|
|
||||||
// Look for \ escapes
|
// Look for \ escapes, Can now also get \u00c3
|
||||||
|
|
||||||
ptr = Data;
|
ptr = Data;
|
||||||
|
Len = strlen(Data); // in case no escapes
|
||||||
|
|
||||||
while (ptr = strchr(ptr, '\\'))
|
while (ptr = strchr(ptr, '\\'))
|
||||||
{
|
{
|
||||||
|
@ -483,23 +489,60 @@ 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)
|
||||||
|
@ -640,7 +683,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))
|
||||||
|
|
|
@ -322,6 +322,9 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -685,6 +685,11 @@ 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
|
||||||
{
|
{
|
||||||
|
|
1
VARA.c
1
VARA.c
|
@ -1720,7 +1720,6 @@ 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))
|
||||||
|
|
|
@ -10,15 +10,15 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define KVers 6,0,24,69
|
#define KVers 6,0,24,71
|
||||||
#define KVerstring "6.0.24.69\0"
|
#define KVerstring "6.0.24.71\0"
|
||||||
|
|
||||||
|
|
||||||
#ifdef CKernel
|
#ifdef CKernel
|
||||||
|
|
||||||
#define Vers KVers
|
#define Vers KVers
|
||||||
#define Verstring KVerstring
|
#define Verstring KVerstring
|
||||||
#define Datestring "March 2025"
|
#define Datestring "April 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"
|
||||||
|
|
20
WINMOR.c
20
WINMOR.c
|
@ -139,6 +139,10 @@ 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;
|
||||||
|
|
||||||
|
@ -206,10 +210,16 @@ 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], 4490); // Make sure null is moved
|
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved
|
||||||
Skip:
|
Skip:
|
||||||
ptr1 = ptr2;
|
ptr1 = ptr2;
|
||||||
|
|
||||||
|
@ -248,10 +258,16 @@ 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], 4490); // Make sure null is moved
|
memmove(TNC->WebBuffer, &TNC->WebBuffer[500], strlen(&TNC->WebBuffer[500]) + 1); // Make sure null is moved
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3073,6 +3073,13 @@ 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)
|
||||||
{
|
{
|
||||||
|
|
10
asmstrucs.h
10
asmstrucs.h
|
@ -253,6 +253,7 @@ 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)
|
||||||
|
|
||||||
|
@ -460,16 +461,18 @@ 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 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
|
||||||
USHORT LastRTT; // Last Value Reported
|
USHORT LastRTT; // Last Value Reported
|
||||||
|
@ -494,7 +497,7 @@ typedef struct DEST_LIST
|
||||||
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 DEST_ROUTE_ENTRY ROUTE[3]; // Best 3 INP neighbours for this dest
|
struct INP3_DEST_ROUTE_ENTRY INP3ROUTE[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
|
||||||
|
|
||||||
|
@ -698,6 +701,7 @@ 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;
|
||||||
|
|
|
@ -733,7 +733,7 @@ VOID SendFrame(struct AXIPPORTINFO * PORT, struct arp_table_entry * arp_table, U
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seelcte source port by choosing right socket
|
// Select source port by choosing right socket
|
||||||
|
|
||||||
// First Set Default for Protocol
|
// First Set Default for Protocol
|
||||||
|
|
||||||
|
|
18
cMain.c
18
cMain.c
|
@ -148,6 +148,8 @@ int L2Compress = 0;
|
||||||
int L2CompMaxframe = 3;
|
int L2CompMaxframe = 3;
|
||||||
int L2CompPaclen = 236;
|
int L2CompPaclen = 236;
|
||||||
|
|
||||||
|
int PREFERINP3ROUTES = 0;
|
||||||
|
|
||||||
BOOL LogL4Connects = FALSE;
|
BOOL LogL4Connects = FALSE;
|
||||||
BOOL LogAllConnects = FALSE;
|
BOOL LogAllConnects = FALSE;
|
||||||
BOOL AUTOSAVEMH = TRUE;
|
BOOL AUTOSAVEMH = TRUE;
|
||||||
|
@ -165,6 +167,8 @@ 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
|
||||||
|
@ -852,6 +856,9 @@ BOOL Start()
|
||||||
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;
|
||||||
|
@ -977,6 +984,7 @@ 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;
|
||||||
|
|
||||||
|
@ -1001,6 +1009,9 @@ 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;
|
||||||
|
@ -1458,6 +1469,8 @@ BOOL Start()
|
||||||
|
|
||||||
ENDBUFFERPOOL = NEXTFREEDATA;
|
ENDBUFFERPOOL = NEXTFREEDATA;
|
||||||
|
|
||||||
|
PoolBuilt = 1;
|
||||||
|
|
||||||
|
|
||||||
// Copy Bridge Map
|
// Copy Bridge Map
|
||||||
|
|
||||||
|
@ -1575,6 +1588,7 @@ 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--)
|
||||||
{
|
{
|
||||||
|
@ -1587,6 +1601,10 @@ 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;
|
||||||
|
|
17
config.c
17
config.c
|
@ -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"
|
"L4Compress", "L4CompMaxframe", "L4CompPaclen", "L2Compress", "L2CompMaxframe", "L2CompPaclen", "PREFERINP3ROUTES"
|
||||||
}; /* parameter keywords */
|
}; /* parameter keywords */
|
||||||
|
|
||||||
static void * offset[] =
|
static void * offset[] =
|
||||||
|
@ -330,7 +330,8 @@ 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_L2CompPaclen}; /* offset for corresponding data in config file */
|
&xxcfg.C_L4Compress, &xxcfg.C_L4CompMaxframe, &xxcfg.C_L4CompPaclen, &xxcfg.C_L2Compress, &xxcfg.C_L2CompMaxframe,
|
||||||
|
&xxcfg.C_L2CompPaclen, &xxcfg.C_PREFERINP3ROUTES}; /* offset for corresponding data in config file */
|
||||||
|
|
||||||
static int routine[] =
|
static int routine[] =
|
||||||
{
|
{
|
||||||
|
@ -351,7 +352,8 @@ 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} ; // Routine to process param
|
1, 1, 1, 1, 1,
|
||||||
|
1, 1} ; // Routine to process param
|
||||||
|
|
||||||
int PARAMLIM = sizeof(routine)/sizeof(int);
|
int PARAMLIM = sizeof(routine)/sizeof(int);
|
||||||
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
|
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
|
||||||
|
@ -373,7 +375,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"}; /* parameter keywords */
|
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort", "ALLOWINP3"}; /* parameter keywords */
|
||||||
|
|
||||||
static void * poffset[] =
|
static void * poffset[] =
|
||||||
{
|
{
|
||||||
|
@ -387,7 +389,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}; /* offset for corresponding data in config file */
|
&xxp.SmartID, &xxp.KissParams, &xxp.SendtoM0LTEMap, &xxp.PortFreq, &xxp.M0LTEMapInfo, &xxp.QtSMPort, &xxp.AllowINP3}; /* offset for corresponding data in config file */
|
||||||
|
|
||||||
static int proutine[] =
|
static int proutine[] =
|
||||||
{
|
{
|
||||||
|
@ -401,7 +403,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}; /* routine to process parameter */
|
1, 20, 1, 21, 22, 1, 1}; /* routine to process parameter */
|
||||||
|
|
||||||
int PPARAMLIM = sizeof(proutine)/sizeof(int);
|
int PPARAMLIM = sizeof(proutine)/sizeof(int);
|
||||||
|
|
||||||
|
@ -535,6 +537,8 @@ 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])
|
||||||
|
@ -624,6 +628,7 @@ BOOL ProcessConfig()
|
||||||
paramok[89]=1; // L2Compress
|
paramok[89]=1; // L2Compress
|
||||||
paramok[90]=1; // L2Compress Maxframe
|
paramok[90]=1; // L2Compress Maxframe
|
||||||
paramok[91]=1; // L2Compress Paclen
|
paramok[91]=1; // L2Compress Paclen
|
||||||
|
paramok[92]=1; // PREFERINP3ROUTES
|
||||||
|
|
||||||
|
|
||||||
for (i=0; i < PARAMLIM; i++)
|
for (i=0; i < PARAMLIM; i++)
|
||||||
|
|
|
@ -81,6 +81,7 @@ struct PORTCONFIG
|
||||||
uint64_t PortFreq;
|
uint64_t PortFreq;
|
||||||
char * M0LTEMapInfo;
|
char * M0LTEMapInfo;
|
||||||
int QtSMPort;
|
int QtSMPort;
|
||||||
|
int AllowINP3;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ROUTECONFIG
|
struct ROUTECONFIG
|
||||||
|
@ -176,6 +177,7 @@ struct CONFIGTABLE
|
||||||
int C_L2Compress;
|
int C_L2Compress;
|
||||||
int C_L2CompMaxframe;
|
int C_L2CompMaxframe;
|
||||||
int C_L2CompPaclen;
|
int C_L2CompPaclen;
|
||||||
|
int C_PREFERINP3ROUTES;
|
||||||
|
|
||||||
|
|
||||||
//#define ApplOffset 80000 // Applications offset in config buffer
|
//#define ApplOffset 80000 // Applications offset in config buffer
|
||||||
|
|
2
kiss.c
2
kiss.c
|
@ -2294,7 +2294,7 @@ VOID QtSMThread(struct PORTCONTROL * PORT)
|
||||||
char Msg[64];
|
char Msg[64];
|
||||||
int Len;
|
int Len;
|
||||||
|
|
||||||
// We need tp send a QtSMPort message for each Channel sharing thia connection
|
// We need to send a QtSMPort message for each Channel sharing this 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;
|
||||||
|
|
6
makefile
6
makefile
|
@ -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
|
all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables
|
||||||
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
|
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT -fasynchronous-unwind-tables
|
||||||
nomqtt: linbpq
|
nomqtt: linbpq
|
||||||
|
|
||||||
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon
|
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon -fasynchronous-unwind-tables
|
||||||
noi2c: linbpq
|
noi2c: linbpq
|
||||||
|
|
||||||
|
|
||||||
|
|
2
mqtt.c
2
mqtt.c
|
@ -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
|
||||||
|
|
||||||
|
|
14
upnp.c
14
upnp.c
|
@ -93,7 +93,11 @@ 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;
|
||||||
|
@ -119,8 +123,11 @@ 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");
|
||||||
|
@ -150,8 +157,11 @@ 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");
|
||||||
|
|
Loading…
Reference in New Issue