diff --git a/APRSCode.c b/APRSCode.c
index 5f93809..e8f6257 100644
--- a/APRSCode.c
+++ b/APRSCode.c
@@ -7316,7 +7316,7 @@ VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE)
if (memcmp(MsgPtr, "POST" , 3) == 0)
{
- char * To;
+ char * To = "";
char * Msg = "";
URL = &MsgPtr[5];
diff --git a/BPQINP3.c b/BPQINP3.c
index a5598e6..a01767b 100644
--- a/BPQINP3.c
+++ b/BPQINP3.c
@@ -50,6 +50,8 @@ VOID SortRoutes(struct DEST_LIST * Dest);
VOID SendRTTMsg(struct ROUTE * Route);
VOID TCPNETROMSend(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame);
void NETROMCloseTCP(struct ROUTE * Route);
+VOID UpdateTTforRoute(struct ROUTE * Route, int TTChange);
+
static VOID SendNetFrame(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Frame)
{
@@ -134,7 +136,7 @@ VOID InitialiseRTT()
memset(&RTTMsg, ' ', sizeof(struct _RTTMSG));
memcpy(RTTMsg.ID, "L3RTT: ", 7);
memcpy(RTTMsg.VERSION, "LEVEL3_V2.1 ", 12);
- memcpy(RTTMsg.SWVERSION, "BPQ32002 ", 9);
+ memcpy(RTTMsg.SWVERSION, "BPQ32003 ", 9); // Follows XR by not adding route time before sending RIF
_snprintf(temp, sizeof(temp), "$M%d $N $H%d ", MAXRTT, MaxHops); // trailing spaces extend to ensure padding if the length of characters for MAXRTT changes.
memcpy(RTTMsg.FLAGS, temp, 20); // But still limit the actual characters copied.
memcpy(RTTMsg.ALIAS, &MYALIASTEXT, 6);
@@ -143,7 +145,7 @@ VOID InitialiseRTT()
VOID TellINP3LinkGone(struct ROUTE * Route)
{
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
char call[11]="";
ConvFromAX25(Route->NEIGHBOUR_CALL, call);
@@ -163,7 +165,7 @@ VOID TellINP3LinkGone(struct ROUTE * Route)
VOID DeleteINP3Routes(struct ROUTE * Route)
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
char Call1[10];
char Call2[10];
@@ -246,7 +248,7 @@ VOID DeleteINP3Routes(struct ROUTE * Route)
VOID DecayNETROMRoutes(struct ROUTE * Route)
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
Dest--;
@@ -348,6 +350,7 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
{
uint32_t RTT;
uint32_t OrigTime;
+ int32_t TTChange; // Old SRTT
char Normcall[10];
@@ -356,9 +359,9 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
Route->Timeout = 0; // Got Response
sscanf(&Buff->L4DATA[6], "%u", &OrigTime);
- RTT = GetTickCountINP3() - OrigTime; // We work internally in mS
+ RTT = GetTickCountINP3() - OrigTime;
- if (RTT > 60000 || RTT < 0)
+ if (RTT > 60000)
return; // Ignore if more than 60 secs (why ??)
if (RTT == 0)
@@ -378,15 +381,34 @@ VOID ProcessRTTReply(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff)
if (Route->RTTIncrement == 0)
Route->RTTIncrement = 1;
+ if (Route->OldBPQ)
+ Route->TXRTTIncrement = Route->RTTIncrement;
+ else
+ Route->TXRTTIncrement = 0;
+
+
if ((Route->Status & GotRTTResponse) == 0)
{
// Link is just starting
- if (DEBUGINP3) Debugprintf("INP3 got first RTT reply from %s - Link is (Re)staring", Normcall);
+ if (DEBUGINP3) Debugprintf("INP3 got first RTT reply from %s - Link is (Re)starting", Normcall);
Route->Status |= GotRTTResponse;
+ Route->STTAtLastChange = Route->RTTIncrement;
}
+ else
+ {
+ // if significant change update dests via this route
+
+ TTChange = Route->RTTIncrement - Route->STTAtLastChange; // Change since last reported in 10mS units
+ if (TTChange > 10 || TTChange < - 10)
+ {
+ if (DEBUGINP3) Debugprintf("INP3 Significant change to RTT by %s %d - updating routes", Normcall, TTChange);
+ UpdateTTforRoute(Route, TTChange);
+ Route->STTAtLastChange = Route->RTTIncrement;
+ }
+ }
}
VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
@@ -453,10 +475,11 @@ VOID ProcessINP3RIF(struct ROUTE * Route, UCHAR * ptr1, int msglen, int Port)
// if other end is old bpq then value is mS otherwise 10 mS unita
- if (Route->OldBPQ)
+ if (Route->OldBPQ == 1)
rtt /= 10;
-// rtt += Route->SRTT; // Don't do this - other end has added linkrtt
+ if (Route->OldBPQ == 0)
+ rtt += Route->RTTIncrement; // Don't do this if OldBPQ set - other end has added it
msglen -= 10;
@@ -507,12 +530,18 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
// SEE IF any of OUR CALLs - DONT WANT TO PUT IT IN LIST!
+ if (CompareCalls(axcall, MYCALL))
+ {
+ if (DEBUGINP3) Debugprintf("INP3 RIF for our Nodecall - discarding");
+ return;
+ }
if (CompareCalls(axcall, NETROMCALL))
{
- if (DEBUGINP3) Debugprintf("INP3 for our Nodecall - discarding");
+ if (DEBUGINP3) Debugprintf("INP3 RIF for our NETROMCALL - discarding");
return;
}
+
if (CheckExcludeList(axcall) == 0)
{
if (DEBUGINP3) Debugprintf("INP3 excluded - discarding");
@@ -525,7 +554,7 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
if (CompareCalls(axcall, APPL->APPLCALL))
{
- if (DEBUGINP3) Debugprintf("INP3 for an APPLCALL - discarding");
+ if (DEBUGINP3) Debugprintf("INP3 RIF for an APPLCALL - discarding");
return;
}
}
@@ -599,21 +628,15 @@ VOID UpdateNode(struct ROUTE * Route, UCHAR * axcall, UCHAR * alias, int hops,
// Adding New Node
- if (Dest->RouteLastTT)
- free(Dest->RouteLastTT);
-
memset(Dest, 0, sizeof(struct DEST_LIST));
-
memcpy(Dest->DEST_CALL, axcall, 7);
memcpy(Dest->DEST_ALIAS, alias, 6);
// Set up First Route
- Dest->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
Dest->INP3ROUTE[0].Hops = hops;
Dest->INP3ROUTE[0].STT = rtt;
- Dest->RouteLastTT[Route->recNum] = 0;
Dest->INP3FLAGS = NewNode;
@@ -685,11 +708,10 @@ Found:
if (DEBUGINP3) Debugprintf("INP3 adding as route[%d]", i);
AddHere(ROUTEPTR, Route, hops, rtt);
if (i == 0)
- Dest->RouteLastTT[Route->recNum] = 0;
+ Dest->LastTT = 0;
SortRoutes(Dest);
return;
}
- ROUTEPTR++;
}
if (DEBUGINP3) Debugprintf("INP3 All entries in use - see if this is better than existing");
@@ -863,6 +885,33 @@ VOID SortRoutes(struct DEST_LIST * Dest)
}
+VOID UpdateTTforRoute(struct ROUTE * Route, int TTChange)
+{
+ // Look for any Nodes with INP3 routes via Route and adjust STT. Called when an RTT messages detects a change in RTT to Route
+
+ struct DEST_LIST * Dest = DESTS;
+ int i, n;
+
+ for (i = 0; i < MAXDESTS; i++)
+ {
+ for (n = 0; n < 3; n++)
+ {
+ if (Dest->INP3ROUTE[n].ROUT_NEIGHBOUR == Route)
+ {
+ int newTT = Dest->INP3ROUTE[n].STT +TTChange;
+
+ if (newTT > 0)
+ {
+ Dest->INP3ROUTE[n].STT = newTT;
+ SortRoutes(Dest);
+ }
+ break;
+ }
+ }
+ Dest++;
+ }
+}
+
VOID UpdateRoute(struct DEST_LIST * Dest, struct INP3_DEST_ROUTE_ENTRY * ROUTEPTR, int hops, int rtt)
@@ -951,6 +1000,8 @@ VOID ProcessRTTMsg(struct ROUTE * Route, struct _L3MESSAGEBUFFER * Buff, int Len
if (memcmp(RTTMsg->SWVERSION, "BPQ32001 ", 9) == 0)
Route->OldBPQ = 1;
+ else if (memcmp(RTTMsg->SWVERSION, "BPQ32002 ", 9) == 0)
+ Route->OldBPQ = 2; // XR mode
else
Route->OldBPQ = 0;
@@ -1050,12 +1101,12 @@ VOID SendRTTMsg(struct ROUTE * Route)
SendNetFrame(Route, Msg);
if (Route->Status & SentRTTRequest)
+ {
+ if (DEBUGINP3) Debugprintf("INP3 Sending first RTT Msg to %s", Normcall);
return;
+ }
Route->Status |= SentRTTRequest;
-
- if (DEBUGINP3) Debugprintf("INP3 Sending first RTT Msg to %s", Normcall);
-
}
VOID SendKeepAlive(struct ROUTE * Route)
@@ -1137,14 +1188,17 @@ VOID SendOurRIF(struct ROUTE * Route)
int totLen = 1;
int App;
APPLCALLS * APPL;
- int sendTT = Route->RTTIncrement;
+ int sendTT = Route->TXRTTIncrement;
char Normcall[10];
+ if (sendTT == 0)
+ sendTT = 1;// For no logical reason XR sends our routes at 10mS
+
Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
if (DEBUGINP3) Debugprintf("INP3 Sending Our Call and Applcalls to %s ", Normcall);
- if (Route->OldBPQ) // old bpq bug - send mS not 10 mS units
+ if (Route->OldBPQ == 1) // old bpq bug - send mS not 10 mS units
sendTT *= 10;
Msg = GetBuff();
@@ -1346,6 +1400,12 @@ int SendRIPTimer()
{
Route->BCTimer = RTTInterval + rand() % 4;
Route->Retries = RTTRetries;
+
+ if (DEBUGINP3)
+ {
+ Normcall[ConvFromAX25(Route->NEIGHBOUR_CALL, Normcall)] = 0;
+ Debugprintf("INP3 Sending RTT Msg to %s BCTimer = %d", Normcall, Route->BCTimer);
+ }
SendRTTMsg(Route);
}
}
@@ -1406,15 +1466,13 @@ VOID SendRIFToOtherNeighbours(struct DEST_LIST * Dest, UCHAR * alias, struct INP
{
if (Routes->INP3Node && Routes->Status && Routes != Entry->ROUT_NEIGHBOUR)
{
- // as the value sent will be different for each link, we need to check if change is enough here
-
sendHops = Entry->Hops + 1;
if (Entry->STT < 60000)
- sendTT = Entry->STT + Routes->RTTIncrement;
+ sendTT = Entry->STT + Routes->TXRTTIncrement;
else
sendTT = 60000;
- lastTT = Dest->RouteLastTT[Routes->recNum];
+ lastTT = Dest->LastTT;
destCall[ConvFromAX25(Routes->NEIGHBOUR_CALL, destCall)] = 0;
@@ -1450,7 +1508,7 @@ VOID SendRIFToOtherNeighbours(struct DEST_LIST * Dest, UCHAR * alias, struct INP
if (memcmp(Routes->NEIGHBOUR_CALL, axcall, 7) == 0)
{
if (DEBUGINP3) Debugprintf("INP3 SendRIFToOtherNeighbours Don't send %s to itself", NodeCall);
- Dest->RouteLastTT[Routes->recNum] = sendTT; // But update or we will keep re-entering
+ Dest->LastTT = sendTT; // But update or we will keep re-entering
Routes+=1;
continue;
}
@@ -1464,7 +1522,7 @@ VOID SendRIFToOtherNeighbours(struct DEST_LIST * Dest, UCHAR * alias, struct INP
if (portNum)
Routes->Status &= ~SentOurRIF;
- Dest->RouteLastTT[Routes->recNum] = sendTT;
+ Dest->LastTT = sendTT;
// send, but only if within their constraints
@@ -1495,7 +1553,7 @@ VOID SendRIFToOtherNeighbours(struct DEST_LIST * Dest, UCHAR * alias, struct INP
if (Msg)
{
- if (Routes->OldBPQ) // old bpq bug - send mS not 10 mS units
+ if (Routes->OldBPQ == 1) // old bpq bug - send mS not 10 mS units
sendTT *= 10;
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], axcall, alias, sendHops, sendTT, destCall);
@@ -1515,7 +1573,7 @@ VOID SendRIFToOtherNeighbours(struct DEST_LIST * Dest, UCHAR * alias, struct INP
VOID SendRIFToNewNeighbour(struct ROUTE * Route)
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
struct _L3MESSAGEBUFFER * Msg;
int sendHops, sendTT;
@@ -1543,8 +1601,8 @@ VOID SendRIFToNewNeighbour(struct ROUTE * Route)
sendHops = Entry->Hops + 1;
- sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement;
- Dest->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] = sendTT;
+ sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->TXRTTIncrement;
+ Dest->LastTT = sendTT;
if ((Route->RemoteMAXHOPS == 0 || Route->RemoteMAXHOPS >= Entry->Hops || Entry->Hops > 30) &&
(Route->RemoteMAXRTT == 0 || Route->RemoteMAXRTT >= Entry->STT || Entry->STT == 60000))
@@ -1557,7 +1615,7 @@ VOID SendRIFToNewNeighbour(struct ROUTE * Route)
if (Msg == NULL)
return;
- if (Route->OldBPQ) // old bpq bug - send mS not 10 mS units
+ if (Route->OldBPQ == 1) // old bpq bug - send mS not 10 mS units
sendTT *= 10;
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Dest->DEST_CALL, Dest->DEST_ALIAS, sendHops, sendTT, Normcall);
@@ -1609,7 +1667,7 @@ VOID FlushRIFs()
VOID SendNegativeInfo()
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
char call[11]="";
@@ -1652,7 +1710,6 @@ VOID SendNegativeInfo()
}
else
{
- memset(Dest->RouteLastTT, 0, MAXNEIGHBOURS * sizeof(uint16_t)); // So next scan will check if rtt has increaced enough to need a RIF
memcpy(&Dest->INP3ROUTE[0], &Dest->INP3ROUTE[1], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memcpy(&Dest->INP3ROUTE[1], &Dest->INP3ROUTE[2], sizeof(struct INP3_DEST_ROUTE_ENTRY));
memset(&Dest->INP3ROUTE[2], 0, sizeof(struct INP3_DEST_ROUTE_ENTRY));
@@ -1676,7 +1733,7 @@ VOID SendNegativeInfo()
VOID SendPositiveInfo()
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
Dest--;
@@ -1700,7 +1757,7 @@ VOID SendPositiveInfo()
VOID SendNewInfo()
{
int i;
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
Dest--;
@@ -1733,7 +1790,7 @@ struct ROUTE * Route = NULL;
VOID sendAlltoOneNeigbour(struct ROUTE * Route)
{
char Call[10];
- struct DEST_LIST * Dest = DESTS;
+ struct DEST_LIST * Dest = DESTS;
struct INP3_DEST_ROUTE_ENTRY * Entry;
int i;
@@ -1756,10 +1813,12 @@ VOID sendAlltoOneNeigbour(struct ROUTE * Route)
if (Msg == 0)
return;
- if (Route->OldBPQ)
- Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->RTTIncrement * 10, Call);
+ if (Route->OldBPQ == 1)
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->TXRTTIncrement * 10, Call);
+ else if (Route->OldBPQ == 2)
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->TXRTTIncrement, Call);
else
- Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, Route->RTTIncrement, Call);
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], MYCALL, MYALIASTEXT, 1, 1, Call);
for (App = 0; App < NumberofAppls; App++)
{
@@ -1767,11 +1826,12 @@ VOID sendAlltoOneNeigbour(struct ROUTE * Route)
if (APPL->APPLQUAL > 0)
{
- if (Route->OldBPQ)
- Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->RTTIncrement * 10, Call);
+ if (Route->OldBPQ == 1)
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->TXRTTIncrement * 10, Call);
+ else if (Route->OldBPQ == 2)
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->TXRTTIncrement, Call);
else
- Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, Route->RTTIncrement, Call);
-
+ Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], APPL->APPLCALL, APPL->APPLALIAS_TEXT, 1, 1, Call);
}
}
@@ -1797,15 +1857,14 @@ VOID sendAlltoOneNeigbour(struct ROUTE * Route)
if (memcmp(Route->NEIGHBOUR_CALL, Dest->DEST_CALL, 7) == 0)
{
if (DEBUGINP3) Debugprintf("INP3 Timer RIF Don't send %s to itself", Call);
- Route++;
continue;
}
sendHops = Entry->Hops + 1;
- sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->RTTIncrement;
- lastTT = Dest->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum];
+ sendTT = Entry->STT + Entry->ROUT_NEIGHBOUR->TXRTTIncrement;
+ lastTT = Dest->LastTT;
- Dest->RouteLastTT[Entry->ROUT_NEIGHBOUR->recNum] = sendTT;
+ Dest->LastTT = sendTT;
// send, but only if within their constraints
@@ -1818,7 +1877,7 @@ VOID sendAlltoOneNeigbour(struct ROUTE * Route)
if (Msg)
{
- if (Route->OldBPQ)
+ if (Route->OldBPQ == 1)
sendTT *= 10;
Msg->LENGTH += BuildRIF(&Msg->L3SRCE[Msg->LENGTH], Dest->DEST_CALL, Dest->DEST_ALIAS, sendHops, sendTT, Call);
@@ -1963,7 +2022,7 @@ UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen)
{
if (!isupper(call[i]) && !isdigit(call[i]) && call[i] != '-')
{
- ptr2+=sprintf(ptr2, " Corrupt RIF\r");
+ ptr2+=sprintf(ptr2, " Corrupt RIF Call\r");
return ptr2;
}
}
@@ -1988,7 +2047,7 @@ UCHAR * DisplayINP3RIF(UCHAR * ptr1, UCHAR * ptr2, int msglen)
if (len < 2 || len > msglen)
{
- ptr2+=sprintf(ptr2, " Corrupt RIF\r");
+ ptr2+=sprintf(ptr2, " Corrupt RIF Opcode %d Len %d MsgLen %d \r", opcode, len, msglen);
return ptr2;
}
if (opcode == 0 && len < 9)
diff --git a/Bpq32.c b/Bpq32.c
index 801eb82..3b5121f 100644
--- a/Bpq32.c
+++ b/Bpq32.c
@@ -1319,6 +1319,9 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix crash when APRS pages requested when APRS isn't configured (26)
// Add setting modem params to QTSM command (28)
// Security fixes (28)
+// Change INP3 to XR 'standard' (29)
+// Swap L4INDEX and L4ID in Packet Trace API (30)
+// More INP3 fixes (30)
#define CKernel
@@ -3912,9 +3915,6 @@ BOOL UpdateNodesForApp(int Appl)
NUMBEROFNODES++;
APPL->NODEPOINTER = DEST;
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
-
memmove (DEST->DEST_CALL,APPL->APPLCALL,13);
DEST->DEST_STATE=0x80; // SPECIAL ENTRY
diff --git a/Cmd.c b/Cmd.c
index b059b32..36fc09d 100644
--- a/Cmd.c
+++ b/Cmd.c
@@ -6570,7 +6570,7 @@ VOID QTSMCMD(TRANSPORTENTRY * Session, char * Bufferptr, char * CmdTail, struct
ptr = strtok_s(CmdTail, " ,\r", &context);
- if (_stricmp(ptr, "HELP") == 0)
+ if (!ptr || _stricmp(ptr, "HELP") == 0)
{
Bufferptr = Cmdprintf(Session, Bufferptr, "QTSM portno displays QTSM configuration info (if avaliable)\r", ptr);
Bufferptr = Cmdprintf(Session, Bufferptr, "Modem, Centre Freq, fx25 flags and il2p flags can be changed if you have sysop access. All prameters are optional.\r", ptr);
diff --git a/Debug/BuildLog.htm b/Debug/BuildLog.htm
deleted file mode 100644
index 2bc0071..0000000
Binary files a/Debug/BuildLog.htm and /dev/null differ
diff --git a/Debug/NodeMapTest.exe.embed.manifest b/Debug/NodeMapTest.exe.embed.manifest
deleted file mode 100644
index 4b15fbf..0000000
--- a/Debug/NodeMapTest.exe.embed.manifest
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Debug/NodeMapTest.exe.embed.manifest.res b/Debug/NodeMapTest.exe.embed.manifest.res
deleted file mode 100644
index 7b55d19..0000000
Binary files a/Debug/NodeMapTest.exe.embed.manifest.res and /dev/null differ
diff --git a/Debug/NodeMapTest.exe.intermediate.manifest b/Debug/NodeMapTest.exe.intermediate.manifest
deleted file mode 100644
index b390755..0000000
--- a/Debug/NodeMapTest.exe.intermediate.manifest
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/Debug/NodeMapTest.obj b/Debug/NodeMapTest.obj
deleted file mode 100644
index e304913..0000000
Binary files a/Debug/NodeMapTest.obj and /dev/null differ
diff --git a/Debug/mt.dep b/Debug/mt.dep
deleted file mode 100644
index 3c6aa05..0000000
--- a/Debug/mt.dep
+++ /dev/null
@@ -1 +0,0 @@
-Manifest resource last updated at 18:43:52.23 on 29/04/2026
diff --git a/Debug/vc80.idb b/Debug/vc80.idb
deleted file mode 100644
index 6189aa5..0000000
Binary files a/Debug/vc80.idb and /dev/null differ
diff --git a/Debug/vc80.pdb b/Debug/vc80.pdb
deleted file mode 100644
index fbf30aa..0000000
Binary files a/Debug/vc80.pdb and /dev/null differ
diff --git a/Events.c b/Events.c
index 51a0c27..5d8d1be 100644
--- a/Events.c
+++ b/Events.c
@@ -1146,10 +1146,10 @@ int decodeNETROMIFrame(unsigned char * Msg, int iLen, char * Buffer, int BufferL
if (netromx)
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"CONN REQX\", \"fromCct\": %d, \"srcUser\": \"%s\", \"srcNode\": \"%s\", \"window\": %d, \"service\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID, srcUser, srcNode, L3MSG->L4DATA[0], service);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX, srcUser, srcNode, L3MSG->L4DATA[0], service);
else
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"CONN REQ\", \"fromCct\": %d, \"srcUser\": \"%s\", \"srcNode\": \"%s\", \"window\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID, srcUser, srcNode, L3MSG->L4DATA[0]);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX, srcUser, srcNode, L3MSG->L4DATA[0]);
return Len;
@@ -1159,10 +1159,10 @@ int decodeNETROMIFrame(unsigned char * Msg, int iLen, char * Buffer, int BufferL
if (L3MSG->L4FLAGS & L4BUSY)
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"CONN NAK\", \"toCct\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX);
else
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"CONN ACK\", \"toCct\": %d, \"fromCct\": %d, \"accWin\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID, (L3MSG->L4TXNO << 8) | L3MSG->L4RXNO, L3MSG->L4DATA[0]);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX, (L3MSG->L4TXNO << 8) | L3MSG->L4RXNO, L3MSG->L4DATA[0]);
return Len;
@@ -1170,31 +1170,31 @@ int decodeNETROMIFrame(unsigned char * Msg, int iLen, char * Buffer, int BufferL
case L4INFO:
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"INFO\", \"toCct\": %d, \"txSeq\": %d, \"rxSeq\": %d, \"paylen\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID, L3MSG->L4TXNO, L3MSG->L4RXNO, iLen - 20);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX, L3MSG->L4TXNO, L3MSG->L4RXNO, iLen - 20);
return Len;
case L4IACK:
Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"INFO ACK\", \"toCct\": %d, \"rxSeq\": %d",
- (L3MSG->L4INDEX << 8) | L3MSG->L4ID, L3MSG->L4RXNO);
+ (L3MSG->L4ID << 8) | L3MSG->L4INDEX, L3MSG->L4RXNO);
return Len;
case L4DREQ:
- Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"DISC REQ\", \"toCct\": %d", (L3MSG->L4INDEX << 8) | L3MSG->L4ID);
+ Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"DISC REQ\", \"toCct\": %d", (L3MSG->L4ID << 8) | L3MSG->L4INDEX);
return Len;
case L4DACK:
- Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"DISC ACK\", \"toCct\": %d", (L3MSG->L4INDEX << 8) | L3MSG->L4ID);
+ Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"DISC ACK\", \"toCct\": %d", (L3MSG->L4ID << 8) | L3MSG->L4INDEX);
return Len;
case L4RESET:
- Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"RSET\", \"fromCct\": %d", (L3MSG->L4INDEX << 8) | L3MSG->L4ID);
+ Len += snprintf(&Buffer[Len], BufferLen - Len, ", \"l4Type\": \"RSET\", \"fromCct\": %d", (L3MSG->L4ID << 8) | L3MSG->L4INDEX);
return Len;
diff --git a/L3Code.c b/L3Code.c
index 30dac2a..2ca3d93 100644
--- a/L3Code.c
+++ b/L3Code.c
@@ -403,8 +403,6 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
memset(DEST, 0, sizeof(struct DEST_LIST));
memcpy(DEST->DEST_CALL, Msg->ORIGIN, 7);
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
NUMBEROFNODES++;
}
@@ -584,8 +582,6 @@ VOID PROCESSNODEMESSAGE(MESSAGE * Msg, struct PORTCONTROL * PORT)
memset(DEST, 0, sizeof(struct DEST_LIST));
memcpy(DEST->DEST_CALL, ptr1, 7);
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
NUMBEROFNODES++;
}
@@ -1375,9 +1371,6 @@ VOID REMOVENODE(dest_list * DEST)
L4++;
}
- if (DEST->RouteLastTT)
- free(DEST->RouteLastTT);
-
memset(DEST, 0, sizeof(struct DEST_LIST));
NUMBEROFNODES--;
}
@@ -1425,7 +1418,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
if (ActiveRoute)
{
- ActiveRoute --; // Routes numbered 1 - 6, index from 0
+ ActiveRoute--; // Routes numbered 1 - 6, index from 0
if (DEST->NRROUTE[ActiveRoute].ROUT_NEIGHBOUR == ROUTE)
{
@@ -1457,7 +1450,7 @@ VOID L3TRYNEXTDEST(struct ROUTE * ROUTE)
DEST->DEST_ROUTE++; // TO NEXT
- if (DEST->DEST_ROUTE = 7)
+ if (DEST->DEST_ROUTE == 7)
DEST->DEST_ROUTE = 1; // TRY TO ACTIVATE FIRST
}
}
@@ -1533,9 +1526,6 @@ struct DEST_LIST * CHECKL3TABLES(struct _LINKTABLE * LINK, L3MESSAGEBUFFER * Msg
memcpy(DEST->DEST_CALL, Msg->L3SRCE, 7);
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
-
NUMBEROFNODES++;
// MAKE SURE NEIGHBOUR IS DEFINED FOR DESTINATION
diff --git a/Versions.h b/Versions.h
index ec3c8f0..1115329 100644
--- a/Versions.h
+++ b/Versions.h
@@ -10,8 +10,8 @@
#endif
-#define KVers 6,0,25,28
-#define KVerstring "6.0.25.28\0"
+#define KVers 6,0,25,30
+#define KVerstring "6.0.25.30\0"
#ifdef CKernel
diff --git a/asmstrucs.h b/asmstrucs.h
index 5465101..5e7fb29 100644
--- a/asmstrucs.h
+++ b/asmstrucs.h
@@ -243,6 +243,8 @@ typedef struct ROUTE
int SRTT; // Smoothed RTT
int NeighbourSRTT; // Other End SRTT
int RTTIncrement; // Average of Ours and Neighbours SRTT in 10 ms - smoothed neighbor transport time (SNTT) in spec
+ int TXRTTIncrement; // RTT to add before sending RIF. Zero if latest code, RTTIncrenent if older
+ int STTAtLastChange; // Last value used to update Node TTs
int BCTimer; // Time to next L3RTT Broadcast
int Timeout; // Lost Response Timer
int Retries; // Lost Response Count
@@ -517,8 +519,8 @@ typedef struct DEST_LIST
int DEST_RTT; // SMOOTHED ROUND TRIP TIMER
int DEST_COUNT; // FRAMES SENT
+ USHORT LastTT; // Last INP3 Value sent. This is our value, which we now send
- uint16_t * RouteLastTT; // Last time sent should be saved for each neighbour. Area is mallod'ed as needed
} dest_list;
diff --git a/cMain.c b/cMain.c
index 56116a1..fee87e5 100644
--- a/cMain.c
+++ b/cMain.c
@@ -1571,8 +1571,6 @@ BOOL Start()
DEST->DEST_STATE = 0x80; // SPECIAL ENTRY
DEST->NRROUTE[0].ROUT_QUALITY = 255;
DEST->NRROUTE[0].ROUT_OBSCOUNT = 255;
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
DEST++;
NUMBEROFNODES++;
@@ -1594,9 +1592,6 @@ BOOL Start()
DEST->NRROUTE[0].ROUT_QUALITY = (UCHAR)APPL->APPLQUAL;
DEST->NRROUTE[0].ROUT_OBSCOUNT = 255;
APPL->NODEPOINTER = DEST;
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
-
DEST++;
@@ -2132,9 +2127,6 @@ VOID ReadNodes()
memcpy(DEST->DEST_CALL, axcall, 7);
memcpy(DEST->DEST_ALIAS, FULLALIAS, 6);
- if (DEST->RouteLastTT == 0)
- DEST->RouteLastTT = (uint16_t *)zalloc(MAXNEIGHBOURS * sizeof(uint16_t));
-
NUMBEROFNODES++;
RouteLoop: