From 45dc77a4e18c41ce91f844f1ce6ccd0a5fc44fb8 Mon Sep 17 00:00:00 2001 From: John Wiseman Date: Mon, 1 Jun 2026 13:45:34 +0100 Subject: [PATCH] 6.0.25.30 --- APRSCode.c | 2 +- BPQINP3.c | 167 +++++++++++++------- Bpq32.c | 6 +- Cmd.c | 2 +- Debug/BuildLog.htm | Bin 6926 -> 0 bytes Debug/NodeMapTest.exe.embed.manifest | 8 - Debug/NodeMapTest.exe.embed.manifest.res | Bin 468 -> 0 bytes Debug/NodeMapTest.exe.intermediate.manifest | 8 - Debug/NodeMapTest.obj | Bin 105675 -> 0 bytes Debug/mt.dep | 1 - Debug/vc80.idb | Bin 142336 -> 0 bytes Debug/vc80.pdb | Bin 77824 -> 0 bytes Events.c | 18 +-- L3Code.c | 14 +- Versions.h | 4 +- asmstrucs.h | 4 +- cMain.c | 8 - 17 files changed, 134 insertions(+), 108 deletions(-) delete mode 100644 Debug/BuildLog.htm delete mode 100644 Debug/NodeMapTest.exe.embed.manifest delete mode 100644 Debug/NodeMapTest.exe.embed.manifest.res delete mode 100644 Debug/NodeMapTest.exe.intermediate.manifest delete mode 100644 Debug/NodeMapTest.obj delete mode 100644 Debug/mt.dep delete mode 100644 Debug/vc80.idb delete mode 100644 Debug/vc80.pdb 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 2bc0071f89ac579c9b85cf0e42d7df3c85f87b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6926 zcmeI1eN$Rj5XSfK&h$Inq0^Y84On7Qqe&(KF-=F*sHuIS2nrW+po0+~IQG&z^mGcF*2_{(fo)*0UpP*>n5SzA)A6wrjQXdf7_0WiKtVANb$0 zb$dX|8+&W7?I(L?87ta}9kWW^-wzn`(c089%-KuzX|%@u!8>=p^P-PCVAqay>Fu%V z2j2Va^qoCsPE4ETq^Ya2evSR&5pC9}pVxYE~dCH6q|B;u(6_xh;r-~@;GQZADQQzdd_9+%$CSPrtb>e55)$aQ)X$c=Vf0MlJItM$v>zr8i&`4>B_z<5VUR68X zYNae?w2r5>vgnczS|e+WTn~@X2;qw`;v;R+uYgJ!baKHepsA2g_*bzX8GC>f|3 zseey--m*?n+mT!-A@m%^^q?`nx!&ZUSlX0>&Ip`%4~-|xTEtpjV|Ai1**a?E4s%OZ zfFrLa7+Yk=RnD>orj{lcUuNYZcPmVd0Ja~hj>arwZeg_%W`?e?K7cT4cZFDj-hClKf z*WX^Bd@_4|i$*P^bT3F<{_(WWv4-PP5@kkv&{%hdHCeV_L>49Ns6<)ubq$wXJ4jYhf#NjPv()7Qn;>$C0fs3bV38pDe$M6$mYo=N7g|`XSO8k25EXI84nPz1B36lI>O5yEZ~L z@&FOw zeZ2qWvX8kRd;go|)eCsPEswuL6kZsk=T+CH4AwqL6#fEz-6K+0ETkK5(!WK03?1Aa zA|j_d9wGcyozzX9Wz#;MoIRM$4;-NtfK-Q!jK$kJ2a{%!jPjl0w0v0{8d)TqEU1y9@#2C(^+}NDw2j->1J z59D$)ELOMJF0yXHx7!Sza>rNC8z*zcA!-PkE-mY#@yfFed|w8=3%R-la8bFK&*O{Y zZwD(_LIX?*Uu{CPGa6eWzMe$bbHsV#Y{*?sc+YK3S*^5vhra2&nC_K|NG^U?(RUi< i&_(AnP-FCWh0)(y{$FPMzx-E@`(^yiNMi@zzy1XdXn|n> 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 7b55d19001b1a6c9becd61f77f12ffdedbbaed6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 468 zcmZ8d!A`?43@s8DkhpV`i!+}rY6E-te zwqePN?PvS>B?y9mk#9D?PT`4toVEBh^-w|<1sCUS)A#3BHeBn9t-ztOCg*V&aRx@( zQki+qUndWplr!|gl%lc*a^3*);o#~r6NsRTs$sOiV9sl2`Y0Em1$MNO&Z3?9jCuk=2 n4SxP;CetD*?nDf63Q55SS@-`*t%`0d>{LefSKkRf%nyPsVFr%a 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 e304913be07779298300c8daaa9d3fd924064b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105675 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 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 6189aa58c27d5ada9736af57ac24e1409141c53f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142336 zcmeHQ32+?MwQT_jdvGve=OZvSw!yNz;0=s}CGTr2Z`cAcni)xhMl-{-Bx8cVSzIK6 zBrb3W0e(Uiq>7Xa3?>w$C_XViY+*AbMFABEB*hk>f(Z#Bg+c$Er`I!gtk)^`d+-5A*Ee|B_VK(b zn5%$G_T~=H+t6$DUsXUA_>WTHll8Cm=%xy&0&!8`BVOEt?K1C@xYS$gsS2n9Jw5eH z8mh;C)$=}v7#s$wffaRs$*_#6zjyYKr;eKO?Va^&A^v|Bi3Jh zO~d+ouKvyXTgL5}Hg@BK>+Y{R!>$wN@9%lUe&Bf{*R>op{qd?F+3&cE8_&Uw!w|6- z@aS7tzWV0#FIBzzC_Z4@2-E`sckY3nM;O1K%uCbnsbk43Zvl5X&PN#T+k>_~`pbu_ z#{ay`V=3S+KG^dJ8SewWo4XU|CnR^}nQrc#H~}GJNPo%AU4{LG;cj@PjdeTjNH=${ z1E3cmxm%8KbMF9&Fx<~*i=Bs{Zh+yg*wV@vo}B9Td)~gDM;Puce`+T8g^S$W13@AT z*S5uNX*c)IuRt@vaBU2;&v0}11&=UXTeo+vb#w25UWDP=c)Pyl=H7dd=Mjc$+v1Jk zZf*C)$QV8t>gJw+_9ZH~>)qUA(Y}O?Vew!&DJsXX9VEhVpE)|kzW(uXA$|wJFJQQ~ z?>u?GoBJ$cB@Ea0$s^~wxlcn&!fw;9ia#CJfiM z#YhguVhgy>K`+8^ZQU;YsUV^la4$tp5Hj9<_i^ic8FGS<+?%&o1`+tZ3OPZ@cvs?B zxdq(UArB$B6A_c#0&YEa68!wNbN>3jJ-7}%@jvBwSqiwkmJ!CU)i+GD?<0Q*!?l{7 zIu6dn7Wh32u@aIy^>#Fl*aGe}^c%u(ZGYH&s34*kaBo1a5i;JFLUcF-?MuiQUc1!o zcMAGBVYqfY+tlRdz6TN^{a!yFL5VGh_s^&oVYoIgwufBbKEy$U;o7#i27O;{f!}wr zpD^6+UnH2v>qExso1hP2xK`iUN$It$@86&oVYpidoln1;*SWciK_aBzu({Dq=+}hg zW^Qr&-HdKR7_J?o{G;96pCNw;!?k_#*6wm&=TU)X=b}FnhHLemJkRZS8TtYtW0;n4 zbGINT2pPk7HoIdu2YrE%+=o}Y{jNqk5RyCTBJ2=bP`5$IVZv~2-P%UDV>lSv5{7HX z$)2}`QxpTg2cX{&hHLZUD#S0hfcq7+10mzRVGu+VTfp5PeSwhN?j`OV>cByS;o7=Q ztr1R94E#QTSP8?mef^CoZth^T86mk#PjG8i0Ev*?9_TH%Acl72C1JQW-kBle*(1=4 zFkIVzyA#r@s2lWpAkfU#?Y8Z1?o()A!uYl0!wVzb+ya`2FkG8&&sAQsO8Pzxy$Hj# zG4!l;`(1~ALdd$^g=6IwX!cEXYeL4mW0Pc-br^~EB@Ea0$#d_n3^?$6GV~&3yoc=X z=GLGc2pR9NrpiVR{Jw(SgyGsY-iGtYE#Uqh-I|cxO_d>(^yRgTkn#Rwy7XGsVIta> zFkG9*xsWy<1KkPf_sq(4E5&d+_7miOZ~jjndiIXzt7iSs9m7VD21;oAOt(^hv3??MB@aBcs6aj=_v4f;7DxwVx|T+-nk=tUT=?dw}Z*2mYQ zpA$0Phs=j^96^7$9{rp!U)%os!OSv`rGR@gu2+QN+BSZ3m76;QdJ&R)_kX#$ZQkgP z;^<7SJ6-hCsdT{~ot)BGDCS#>iH_=)Og8OT55I8Igb|G$rH8BC8NVx$t@b;+Qki`9 zq{i-KV>qLd z@vx7<`Bd1Oao(k{wK&fT*d3@eS6|=7d8%Re#{T87zXjmJdkE*HW^*Cl9M~J-hj-R) z#CdCA?}Gnvut#G*XMfwE(2vQ4LV_>bWa{ynS1j*oaN%^ zWH#aZxC*x9&E?R1?8v8l^QkM>p3ASv@nTroSH#uMTpbM~o5|tYne9yYrV`NB_?=db z0=A%XtRU)B>Qq5z3X+Rlc7|C1`hjk$fGV&X3Jf&=G1i#8<3O*QDxeDddnz!{{Qvi? ztwya1r~*;}&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~ze zmQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3 zssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gx zDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60 z&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfu zulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~ze zmQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3 zssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gx zDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60 z&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfu zulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~ze zmQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3 zssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gx zDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60 z&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfu zulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~ze zmQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3 zssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gxDWLfuulCm3ssd60&3~zemQ{gx zDe!}uF;xqX`Ag=@sP^3l9y9gZ-DfVkq5XyDuWjG^x2q5HywSNtN80yBcN9mrWU^_0 zbSBr5Hy@MPgum;@j(n<@+m&n2<=5nRNNHcOE0s1r%;DKgE}cqeI}_4*ZSOY5FfzIB zbkPT?;EzsDY4lU=jolM#Y7>o_Trvw^jRn80kVv+VscDPG&oz&$b#n{Fd}}e$QEkGj z9)97Z2_qUiGRb1z&$o0|cW3;rM7G-R>`Gh`ze!Qu`<=x^Hq)Am%1;$D z>_LTeGNc9rmJyL;a;;J0U^1+U9Cg0={N{w8j_N#>icCdordxKAB4R)9P9S%AC=zkt zs;wzNw$2vQ|MtX@>BM^$OF0qtI1px&b9{o{em>dWt6JagUrsLP(KsNLYDWj&L)Ft4 zCJUW==)>mjs)EIc1{H{VFf{W-p zoHA)E<~Soqo!+3Dy84r+a*%RYFxA}@f!3Zb=F-_;-iE*~RiL01V$Q;GW2;BiH`Og#*sy5+3{zaZc*)YGb8KQS?10!skwo#l_Oojd_{ZS|-*C!$$) zZ_G8_acoU(FikmeKwiqzoBr(#0g+Lgg{!j9wvu6k*5VP*p1!@agV&PKD+R7)cJ}2w9A9IOo442GzQaDgZ%t*w zPA(QKVct3Zh8^D7o$m_0;NZ-;Y=6~C<~aooJ8x;8(YH?JS$){S#dPT0pqNhh{hm0N z?pzbv+G}!V1>`($GKH21t5NT)*m)ej>foZy{bjZ_RKx5==?e>qoV>y^B}7U{hW z;8YZWW%9|+(EiE5JCgkbj_(WkeCY9oqTd!egygg7v0=TiyedW9dvIw;Wi!pa=NPb) zY^EdA8JeY~#kNylR3noLRVT>{V3-13#VjVhVc$Z#ejH;^??!#Q!;bFoFAN`(@`-*t z!)u|RuMt+FtJ6+q`sM*A@~Ld-;4N;rIMrlt><%5cI+7QL)i={&CnSAC!u_eHB<>l8 zU!pU)M9QS!RrXeGc7M-Xyr1V?dZ6c>iyN6W_&gujj(r<}r@!KPI}h=^clY(Yn_!>Z ztM|a%!PbE_W9;V}zT|l=@Wpk}Rq(SJ$KAP4CHHR!dEPw-c-}iW=6aOR1Ls(*p`N0} z=a+E&M3i^J-iy!A0oQPiCAN0N^*V37+HD46<90p#ayt;QzlQVgkNv~Iy&2r!BeuEl z`Dbt*#^*G?8v?rwz6-!we7_p!S_S(6c+2kHGI4I2X5#zzN`V?4t8x8-pR?pOf(Yo$xWmYWX7@(@m($%Q$BNv0P@)&11IU z_-XKa2lgieCu&Oygx_7qbqwjt8~>kqBR&|uB9Sp@*hy|Ay0~@Y;1BpB60GqYKKqVI z;;QW64?G5WKh)v4Zy?xHx+fUv07Txqpo_}xoytdIi`ic!zF2xi;+L*2k=VhsJ`%Y! z4REjr-khCwa^rC7YRX-2>P0$?qS%>hBtEjZcl8j$*5`kGwm9%M*XMuYfo%CsK}c_N zKEKuHe-*b8$}6o%BKF?th(yKM(dYSJs_0iQw)0_53OMKG{B8#d!(prKcl@2uW7yY& z4ZA%%ZDY}F=i%SY0H%80;Pn?@)3E-YtN(BPE#r1f8@utrb@$huVdrU_mvjEgc`4_1 zoF8*;&G{!;4=ZjneaBj+ZCg-=DZ*z{!IW*^* zod0vp!Sw{!2b?2w?ZJ6C=bW5#a~{t5FXz3SZ*%U=xjg5%oSSow&G{TTcEnev572VkUH&dV(ZJ%8D|JWr9Pp64d%s`^mh_GY`d*WJFP6M@6Nz5BOB9K1 zZ~pSecQk%!Wgm%N`SdT+As7#GY~S%;^}LU5URR^d`FkL?J-VrP_K>HJn(^(O^RB)9 z<=o7Vt~iSOn}N*$x|DZ>&Gp}emT@#&nUCTk!AFm45Yuv?+=itV1hd}rC9)0V| zSKoa8rK(pS#RqH~fqEd|a{M5S-%sYH>G#yJWR|yp%W;M<+_wj9ee{6*Cj&6a2@hWZb2LK`b8M7 z?Z4CCt?Up1m)AK$#?Zba__o)3@QK$$LdMWyK9r*fxV&x>=4;y)Rri#6ECpO%UkMq* zK0}zPx7KqgQ0FNum3~^cfFg-c>*D0 zSUi{`QF#mE-3}6AxX&D&VqgFGxH6BWfXjIYVYs&MJbAyH%lQdmxVBFoIoHkQJcck_ z+t;sXhA?6aV&Hs-FkIWlkK84QCZR!kw1jtTFp)!SN6+N;FohyLUO0xj>ZvNz~x+(FkIUoHXka8 zCD3xLXIE zPrsYjxw%|B5Ylhh+=y!oLUJ>=xczc1LKv;7{0UF9Rt@?gycTF+U=KXFG6xBU4$KC3;F}sXoTU~y0wjP z$H285VYqgj?0H)_MKSQpH6LNPHZQJ1{BjGpTpJQH-Wvu%M6m^2t|1A@?Ox)}A+9wE z!?ksrS|gmI82IIylrUV|*WZ}p=5p;yNbb@T+?sKXOGs`H^p;x?1J}ZY;o5j-hKy%i zGZThu`)_wbdKGnpUR+3UKr`-a;;7nuFbdSDlb_jeV>M2gp8qQ zt=lix{)FM$y4{6i2*b5)ybb4(TfpVL4nlG_RfbT~m)9~v#`}-y(rZ}Xuxg^+&FtW39347?XZko&#)KY8fcJD#ta^+R_I8$lwZ->_={@9hwV8_XX<=AOI< zL>R8^zc+1l$H03Ju>WfA6U+kZcpS>~}6aCy&*FkIWlZ?1B4d2fu6+`IqF&E4gB=z#BJ`TG2?zt_9; z`JdyRx6k|epFaPO@cRac9{eiLabs2UKiUm#ef}?BUiJID)Z^${eIHSL-uYkoL^k-T zVWd!kpQA@2i@1T4LFs=YYq;#ZW-3ex{OPuy?h-=WsltYlOW3w4qO8JBK+_P z#0dOz9_$btKL++y@J@hTj`I$O^}%m|y$-jh4~Ja_;I5|k7H*lEr&Qqcj_oK|-dX$s z&N~zKR@_282KHXuy5`;L4{FalKo@&^=v41)2ZvnXQ9>RI4*<6S>2lhtz;V)}$#CdCA?}Gnvut#G* zpZ;uvPLp7-grBovS3-vbEa)Dj_5KbX@9bU;-b7d)3m4uFoa`I0)B;uTo<*G0<2p9eb={!fS9iv1&DxuI%aJL-83>{Oh00_=zI zI}DbOxKDx|TIG2-rS~A>SPYv2AgT8_&cmn34fq~a^2Vbgr^5ai!L-4C1baU0MDXwz zu)JkB= zaid`$$9Xc`4}W#AjR;m}V@9a*&$=hMKp`Pc$Zh#(hVef^XBrG*#8(a)NpYT2h zdn{}Q^&bLzAN=idw;OwR*|PY22@ZUdir8%jPQc#;vXkw)@wdY442myK19qAMzz%jH zz(08a-bWS!4G}a zBm)za3C-?uB*2c!&c^|aosRB+!wU$5I1`u!FiGbC zOsaXnd|&~v5Lg5(2EG9-0UCg%z%pPtumV^KoDDF^Rs)Ry2P7sd2jKI71kem50VaPM zXaQOQ4mMx(W`6&RAU^B&;8h|}{ri8xAG2xPy}#(Ud+gv(FF2-R172*D|LmE=Yu|+d zX2|;Y|6G6e(fnnvsB_-ZpCpK+`9JslpNo;#{JlTs4Epy!_3wY~^7@YEf5@MG{g26i zef}3|P(~u?^FRL0WeB0q|LotN{!e)SPoMtBcB|7m)*VaVn7;PfvFY-}*sVA0 z+O>Ao=1f`PlT<2!e;4DM;Wa*^`k(vj5O4@M1RMem0f&G?z#-rea0oaA90CpjhrquR z1irQF$LHL~A>a^j2si{B0uBL(fJ49`;1F;KI0PI54uM~61k|T~vFqn*=MZoRI0PI5 z4grUNL%<>65O4@M1RMem0f)f3b3c9hr%&_#etz|z=*ESCGx|4i;;;DsRVtBu0JMa9 z=IkovCHb7dDqLT!hBhj72EXE;`POW0zTRjaYXzNddug@{SucrHl4i3?j1ED3+n`cQ z_@4lM0N+JiuTvw*u4FZ&21VXW4w-Z}EL&FhM7v&_i%K*F{=L?7*reV0ENK^x&QevA zP^ViNrW+VtyKw+oQ7M!{Nnk+QD$oX%NevpY@F2BXWTg^nglW#hB9Y|t6&B02rYvAQ zO1rGXHE|$5lv*!*FPSuQqmUZ_$Kq$@HEsiH)W~0KoAg?kiF5HmMhW;Ikck>S^u4I`?AesjH;kUUIvszx4@`h23aB;&io zV$+7K-1Cgw&PXmv-?6@TT}bzm{JjP|w)MrB%#B9I>b(osVt?qv|Ma8XBI70Z^vSYq z_si}zvNs!9md9s|JlKYD;?@{_F-CvBp)Vf?f=V$+r*gURRQh1x=V!8|LOz(e$>e#P zNxOAfpJdu%p^#Hj{tJ!l^07_I$@!^#wHQp63e}>-wmVE3i_rk=z%Sbx@g7F)QX=Ce z$BpdrF)2u;E7_S;B@6Y_g?z<7TrqXXJbSu${j>RUC6!P6qT58DZj-p~*KJB2 zjZSNNyK$=4t)p&N!Y0HhFLdU`cD;Y8*{m(p=dSP8j^D1fnzE>qQWNvF;~m8qP>?ho zwOOr@*jvPPf7;g|ttTbKAu5)#g;KV1B$&!hPAT#eYFU21P?}EVpeJR#c9o!OkJnn2P}UE7>N`UW0jrLCw@V$1t=7E8`2em*RC>N% zYc4HLwp&Y!nw|!IO%FX?YtGi^)3y2eqqW(S)*keQq$<^B>zVm^Q-+VU8&nF`gpp8m zy4CE~ALlM&8EP{kXPm zm0o|3k-OK(*>+7i;vdO+>OLbI7+I?WWoaAQA(9_ZHIeg@N98|xx__p8yj?OP&KcSI zGP1-r%GXoJjqHg&S&kDJhbhb7%=g7c_N0+z4BiHg?H3mM@?gy8mwD*E*i$W$@sf*1 z)?#VnJ?p|8+eWTq4hEF^bh!k7qpfh>?AX zkzKwo$hYR|nOe7|`+`Tqd1GZhb-G@XJkJjCV?% zK~C|{G|Kgx-FBniK^tU0_{wLMpJ>+~=#_uW$bZJfjx)H1_n~d-_Qo+^Qsru0)5dwd ziE-Op(-vc@*jij#q%zWeUxqxkt8{B&fdO2{AGW0(Uar>ZO8rERX?J<8=KSf1_6nrk z>&f-F9e0toPtzpbt8l&FV{tm3zZ%yEJl3s)m_M{}HS&ENH2azI;`Y(wWou{p2L0_d zkSBhxmH$ypp#NMCTCWccsMi_!*Bg23Z}gi*y~RYPio(Li;=bctj>$}+%4GgdQj}UC$zzcs+?X#JZ0>qooH`s zCzc7d)LW6xem1G7%;o(ueWKQlW9}uNGJ1XU0)9rnTcz@;`9`f{`xxVEJ-#;<^F8u+ zsJS`@1@$?)s2SsvzAL2nj@9=qyg|q{nDXZA(SpO$pQ!&3L z9`wI=#PBM5y?D^ZZx?=K<98Z-mbWp}M>c+!k$t(rQs))fnAhjqSoq~GhflG&5c+!f z#-1K}pAYP|@}#5fTi@72I`v%v`n#n*_<;}l?oeMFx7mi`?TC1y=Th&Hx_HU=%76Mm zLVU&cDenvEUh@6scht5b{5}}+bic^<%`zfcPkl&ayySv;N+zI?YK z&yRw}e3?JT=)Z09{ZG%DZ_sERT{=e07-v2n<~x%79sFkhYWv3jYSyDgm17#l zy-yms{}#$&ynsC8V>MpW#{V7Pcp1NM(*A)-OCIAvJjQ=I#|Yz%<=g8CEW+t=2HVyD4)YyJejC48 zrnT+g7+$ldU7ZNTxlK%@KMkrA0j4QvPI`QC5%d}%ZEmjJWlw2jNnZu}e7$+RdqTG( zre9-ZgL%wh(Uzz;*Dk*cp8X_Mq&Mr#xoq5rzHfA0zRsQ2>`7`PV~6D5Le|F1ADDF3 zFKD;_3mWZYv8A1VC~{u%X(PV^zDErx!}01czGschGe(9y9jhYVj|^{lJ&(;{?M?b+ z+U6ghRkqt$sGq8FF3CRN$B?yk`e&2Q`XcM{PoUZFzuYD7kpJ;ABCLiCFP^V$OU(Ct zJFQT|Cf^a0*0w9!i1pCxL99!XOQJ~P`|vVGeoq!}cw)^1}VR@#yW zsY^k(pTR`rXYn~!0(r-;Uj|dW*ObM0q|}3Ukwp4H(meIxRO9%G9{OdXL+9a4y))Zx zEXraP$I4qkA4+r{E}upOTHp|BDIB{pug4ON>DohOwAFf-^E0L){c)jJ=N2=%e0QylDMl`TEfoQT=u! zJ?r;^p8ECHhwW!j>ZAK>?GNERMaHd+aW}Qm@ zU&-GC*?xPaLBqPZ_`bDQMrfqtlOQj$m(`zRfaUa`5PiJlr2MDOy8qz3kKYJWPi2kl zokrG1uF!$bb;e+wZmT4MoxJ+ThHfNQPW2at~6C@)Wy zrCiNt`>}Hj-L^bc75>0R;>qtOa^j2si|OJ`vy^NCw|Yd=C`0j+f%!*TGni z|J>VJi!Ueo+#lvW%v`hMeGpuC65O4@M1RMem0f)fP zHv*jhyN^S_A>a^j2si{B0uBL(fJ49`;1F;KI0PI5zt{+HFQ3n3j^V$3CNscu0i<8x zysKb-HsFIy!5mLTG0(i$OqyR$#Ls67A77B?mH6DpphD_dJSwzUJI=G7_}m=nI2Vuf z`FWgS5X>&hvrLDO=Ni&a)S7eV`Sv5AZ6~cUCo=cqdP>qF;qg}6o-4xVIo>Dq`Nm1} z>=#J_1=h7lDWCy7NJ(w$_jQj~RY*X(3{pXVl35FNVL+ zYM#fx4?6yy=8Mjh|CE~LCvi*eeY zfwmN*9fjOiP`0)hDvsxhdA1UtSDOXTe*Q{b_}s*=!lwE>tYWHE_Hn9OzL3x2Y_;s& zKFikUU}@e&DeLDmxg(Z7pftVgr>kbZdK4WXx(ENP5knw|TIjH9SaynJ?HGjnB3~Y=daW`% zP&A7|hPT@ArnA!_4r>gp?3ZSIqu*LfOHcXJDXr5wOUqWmwCfEmQhOgCk2Hz3c;Z|kuf8;3&qWiay~mT zVR?A&&y;&8o6i&u1tq^+DP={uva!KXB;$`4(m1uRSS?Pc@~KH*+=*qZ2xZ3osniUP zc`HlV!y!GBEvLqFelUG7D3%J9LK;W^Y5U_@N}~fUkeim8`vEQvLZiIovoe&iUOtX0 zYWuAUc~*ISo}YhMj^xYPa#n|Oaxh$~;s<%CI>{gOM%H6ZC==#2k!tD%2!h3 z<9;R>FBJ}z={4GB8$y1$oU0xdJvN3kYik29k5w!es`-reiA&Ct%lVV3^bs7rI9&wn zWi|{GH=Yy9P83RMKLFyT0G1DM)?%fq^TYGU2A{*zIYMf5yfma+eJXw~kLp{q7`e@% z+=TBN9WM)M5QMo`IwaPcs*TC!$%+$qZtBa21F*+BZG5{ z;1ZRLWNk1VB5k4=mdLa#MD7SP5BrW`$**`wt6|$J^(Y>S>#%gNZ7NWBI5rXsL7><_|J{KI`kYhI)gZ_Ye7{0KuNF z5uja{VFYvbBl(3~<^p`wpXu4Wpu$p*`Vl`LtB{Uq9$H2d#Ttr~F(D`|&Gv|I*g>~Smq7FChQ8&O2+|Q#O z7GQ^;ky!mOYUAjWC;fv6-V9>X{`9yVyTJD&UItxz1^ue9wN20lB7WJg(3@=xLYwd5 z*|D4+$msNF1Ch+6pNHFqZ5-_&;+Ydu(H}}1fzL-g{c|G4&d}H$ejf3sb^GUdhxafO zpO$I=p%BvD5aN-=bfbJ?sXNzt5NFrw7%dP!6jSmt zF12UA>imQTKxLRBWq3+xsR{-;Z;)0-igl&odkyv2zj*Idq4MAwxcc zDj)(Bs_2ky*`A8YAl~E&SvdZT@k)LsTQW?e_h3BjI3g!;xd+v0z|^( zvm!2o8Il!?%M8b5ddlM9Ljr%<)@dXzYlf02GA5{Pw=ymlD>o)6zPBnaSEVCxknd;G zgq{JW|cm5cq?#QEtQMvU1^Y6h*6V{7AYYvVGU4$w&=A<<=BTt?L3 zSdft=5@b7AAD0un%11C#L_F3$M44n<1}gVTXpAn3%Sb-eA_vrQ+l(+^gufxqw_`kmk+tc@xQvW>QG~(mk~mKf3jE9k@Ow^NR+qu!zjL{85~=IGDK3ZM zT!98PUPVhqTr zo%XYsDA~Gh@0HbgVcfxy4y2^6&s|Oiu@tjMjg7(g>I=&0O4u^5xu9Ih=Nf>O+i^iT zfQI>qm3!U=<#2R z>-ii;--2mB?l;6`5mm|@R%7tpFV41bV_dd3-*SMahY?ribsf~f+gz&3!1A172u&*aTK8>co|*=%uUujn+;L%T(2gE3kL>#J8nCqCcEG3FWK zYv!%Y4f9nw1DQUZ<6%DfoU8=oe_3eEi|Op~fzO=HN472HxKxalim)k|ei!zQ zcvA;+)5Z^B<2XHC1)b|T)Q|RiEy`reG1;nSSk?p=9`W{ug5WyGkLERzSUNj zw~923!|XoFYDvS_-e~?BUeBaT*;F)cSxcI2k;Z20NW=Is%h#e9T9UNvZqe-`NrMZ+ z8`am+zS!?vtgrW4{su{_>$p+#_F3K~!i)5Ij^@kSCiB|F>zM+MWz%)Il-C#>lo@VK z`I||@c+Fm4#%nH!rAnogvCS6J(we}0FXuH^!x6f%OcnO!TS?Cq3ADtgEA;gt5}0l~ zuQ9N|vX)#wm)BUXiI;yhXz>pkEnDy5)=gxta&2fp|tUF6t zhBBQhAB3o+7dq#fBm%!n&|deN*zpFmSGc*KuL4KYR;7=GLr?m_L@qU1Mk&%KQ&;Kl z;=G&oU>w4kFjfytd05vfV7wDgALO#*rBq3`SFE-6@&QjFKPk&+*-1K>#xB_}hiMh& z26&+rR`rVoIE}8~;2HKoeR*O^f^8~)ysDQXtnSfj^>pga0BP8a@{VGkP5x)AY%3e^m2lut`G$nU!uM!SWJ#CxldncEL{7;UGP3+vGXPJDbCZ zajF1+!jvPxcs7?4InK<>+fe z_fq=RH==FewB7mIY`v3iwWsFV`K1NCm18zjKh|jCWJu_^!mjC`IcIucL^#>T)Ve9# zcVlzQH}MmO3ir_>zU;BW!rWfgbG>jpz@Uj4wr~7B91rMylCZsC+@}Wtl$TvCYZpt$ zJ{Wgakb<~;cfiu)y6N>|^1m1I8T>_S!8>`4O{eKdA>$Fd5Av&e3}A%x+0+7@qsdG1Zg04!SUu{WfFggua1g9#V1pnvUM}RY)qtUMR?1K^M+*7qm9X%~4Q=ca(!P5B74lP6glFE@W3kn9 zv5;?85hQzQH+o(c@%61P)_;3+Lrd`U@%{FpUfsei1nRY-m&b{t=sVm?x3@6}Z=|1x zo{M>{JfAMx`hsWZ4?VhSmhs`$z3H*K7}bAGFR#p7f^6Jn*=u|G5?r$RiGsy<-7@@m zo9^Qq`>_>je_P+1UMAS_HrB__$UPt0{5tOSrsoQ-V0KY2UDwNCHQLML6iw3f(REp( zD&GM)yzx24pWjMJtbi%9&iL2_hzHpz!?)?Z)FL5HL_#UNRA`(74u9SkU z%vjRy{Rl6I)!ixw*4kI?o{#WorC1!cdp*JnJx-^ydptT_Dkx?T`#H0YVfS<_4|gG9 zq@~l@eH`Hx^t~l^&qm9$dxCx#5YmtAUXAcfy=|u2|4MCLH=yFnDf=A5jV@!m$p!KZZp6&V;-D#UGS|3Qfqb0C4n9VE24B1# zRLkG87kf+5df~fu8DMJM-W2Aa!7Yw**8cdi(nF#ePDq4$}5F$NTRx*&_{Qa_CSgoc}VQ#Kw9 z8(KBb5rg(6yn93BSV`K1=fAOSy-(MXn2|4S$*y;=!&im?YKv|hsR|`s3UsfUgaJhaxF}RSoiX< z&=ju2pL=O9Pq#$fPue-hhk#$Nl&q?&TSA{J*W0J+?bPDpd}CH#)GHVzRIYKfU2C6? zGvGVygSo~`d;gZUcT7UxhhgpI{yPL50uBL(fJ49`;1F;KI0PI54grUNL%<>M^NTWg?_F1bUg-`I*Z8_3Q+pw#y|cz67@ zxaSZHKJSA3Tbp>E{T`)${1D!Dc%M?gjfaZ=W)Id^H!Jm-Hh4Mkw%{4|-Aa8Q@>kuh z)IHd&x*LlNK5m-oLiTYynDYP@i{6HE2Jrn0l>Kp}{}C2*zkI(^@4pxCG`|M?lizbn`*zIc)va}Mu|MxC3G`vG*D!vmC$ z0yFQhQh$efe-v2!${3!x3Y2;p*MA3HURwZub*)$FrApn3{0=<=xfHP6iT6%I*GG?I zjT+Z!VDrK4s0$u=d2&{%Yj4B5te+2jpkf|*`~wz{zf-~)2^Gko&VP^JPauyCu*Xx- zZ9VWi0bKt12IP;tZUMF*0ImV*@t45wzUSh3$D5RT9dy3!D9$2)-lr~6>f3p&<81@3 zFT#5se5Lk4|CKeR?#2HNkpBegZ~$`OLH@r1tajmh7WqDdy1og1@P>?1mq3Tl;QBV` zoItueaG1j#kY5j7-gQ8!cZ2t7%?PjY=K73-=U2EE3jI?dtgs0 z^=k=@;}=m*P*&rkg#k?-m|l)4Q1O+mjcu+5KQo6E4c`AM{aiHDW? z$)kAh1@L|^(ta(C^{*2A3wHf$l=&Y{D76#vkK+2vhm?B$0M^~`{WH|(HCH3Am%`Sw zO1%+&`n?@Wedv0mdkO4@dSzDt8`$nWz~?ORe58(dNuy3*9fT}+?|={9@nWSu44XBf z!=un|JIeVd$Zt?e{V&vY74-iCbiEhYeHS>~MF#x)6L%`L8~J>ytJLoUi=Q4->d%4I z1MtuL*FX>W?Qfy}pS~4s_6pQ<7w&w15H=b|dx!4-6Xj%K$6vQ_8bb(DD0M!uOEJcjr+414`ZeJlGa>`4g1=S=eg?HeU&QpepJmkUfX=;|G+g zUXAkM+ij%#9P0fv>OBsu9(xgVgpV|kZU*&xKibd|XbW4B7PPOxhF?m<_bRXfd4{*B@zt_Q^J_5{s3F%&h*zq>#_%X=-A@o^?dN0Bs zUWGD#a5?G^+&%`JezF((f;S33+5r7O32eR$?6$oSI;DW|QM4(@e*xuq*8vykzZ32H zUi`lTJ`(H%Z4^EbK;|@Tg?b!@t{eA5#{}Mwj`F_^-BzML--I3Z1A}eQa~ilGf#1Cw z*I$L6C6w8G1a^h4PmckgEr^@Y;V$^(2Z7zA0QT%A#5UOHB+9w-Zv2OSuT>ha--M1k zpu?Ni=@|9YWr!^g<6Ic%_eo&ULA{Ow+cmJ&r=Z7Iu7ywR1Af5v?XX7`dVChP{0{Wp z3f*tO?~k{Y`hz;!9dy`x5&RixAAxR{-vXRbx6cEQ%bVzTpzA%rWF>TKqb^TfjQ;5k z#H0I_`d#?J*GACZ(Z2RCLD?j}`0%WgHDk~h|G$oUxQ|1?A>a^j2si{B0uBL(!1)NQ z{@m^ahHNs1`Y6UtBN(p^sdMKBK^izi2FAJ=)AEaPt=CM}L>9&_s&&q4uaIc(^zu3sHgFN+Onfx+uJzVzGMk9MkC_9p*9pdF~GCW%@`LtVqxtmR1 zml^rZ%VWO4d(CK@%VTA3#qW5TR~R1enIqP^Zrz2TQ=eseOB+<6Ei{^O+6ZYUT1#zX zC#GE^a&xu#d67w>wR+NSAnkO$7Eim0vCc zSazlE)*h^LFNU7FO6u(;x10J~pAcEtjrJo>R~xx&`s6N#ZD?OB_dFxFGm=ZvcWgVp zE~I-&{>HL_wDrZ9%#B9I>b(osVtONDAtV%r@ijm2mHcHoz`Al}2kC?zspa@@!+ACvTXfw<=s>PPp$ zvJRPNPZzI$cqc2>cY;{z-&?(Bu$-ma=0T)U zD%WZrpIB(mr!SFV@?gMyFeEc5NG-*7SDc6wYvkefVrMG0F>_c`>f;UurgM z3-!6{@npm8xCd32MV+vcHD5d4k!SY{lBR=u6<0{?E#kUA?Q4)$-=7+Xs93_mkUTVL zDm$s41Hk>5F&7H?=C(t9e2A5!$;Z;Dg|r8NGLkpYIf@nbp`V~!NWO+jb?4W@v!FF9L4T;fxiWT*|H;$+Gv(v$l5us;$kvyUCALw%o;q%1PxQ%hoWM9tS^j3eFE+9#jVxpE zHgIgeu+WzWV?MvkL-)m=YKe@OTr{#4OB?T57v|VDavdXQ@gbji^~&RXXd{2h$Xk3U z-z)2>hm7p$K3R@YtiF0Y`RR7@_hl%9Lw;eYw@c`!+ZxeE<#uOEd1;&pCz!@ zfD_MSE!VG1VIVP=?ba8hk9fJsi}CLKK4=={`Z$23frl)$Prve67%pW7=I_t2uu0X8F{T_?c@%+`eKH#x#9mM=0 zIluF9(ClZ*i`z$!m#v-Y8}zr=K%Oz-wemlT3G|=qLF@IQ0rff~|9T^D{f&OJh#cwj z)`y-jvTqD!BR{~{2|lBBqCC^R6mrz*%_iNGCf)M>!n)-e&6C>q-eP2JKdbYiJ$DOs zyvFm#xZV@m0Qc|Xm~m}y+KKkIc4C=OOT888>}QjT%3R(r(i#}orC;v% zPSiStwWDz%?SN;>Dz-Y-|B2UB%&&0#%8C>2z@<$p@-h*1H0Y+zuW(J`~PnL-|hdq{eQRrkIvnF z90Cpjhk!%CA>a^j2>gO0;P(IH2G;iuxcz@Gd5Kwviq<-#`wraxzuW)k-kMz(=X$$c zL)UBWZvX#|u>I)0Jnl8{%l72<|K0w-Js;KW|GWMFn#2mX|Ihfyy*S&K@ETFm?f+x1 zocq^q|KIKZbKK?j|LuJNZvUV068HM?9*~}We$xLn`~PpgVRs^b*)t6f@<*=v{H6Zm zKRNj1hrZFA`0-M^N9c+>sJ|kC-FT{)H+^@e_scKJS65O4@M1RMem0f&G?z#-rea0oaAe$ElVk$>*v5O4@M1RMem0f&G? Wz#-rea0oaA90Cpjhrlm50{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: