Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
59:e0e556c8bd46
Parent:
53:77f8a49adf89
--- a/ip6/icmp/ndp/ns.cpp	Thu Dec 07 20:44:32 2017 +0000
+++ b/ip6/icmp/ndp/ns.cpp	Thu Dec 14 20:55:40 2017 +0000
@@ -22,10 +22,8 @@
     uint32_t  reserved;
     char      target[16];
 };
-static struct header * pHeader;
-static int size;
 
-static void logHeader()
+static void logHeader(struct header* pHeader, int size)
 {
     char* pData = (char*)pHeader + sizeof(struct header);
     int dataLength = size - sizeof(struct header);
@@ -45,44 +43,48 @@
         Log("\r\n");
     }
 }
+static struct header * pTraceHeader;
+static int traceSize;
 static void (*pTraceBack)(void);
 static void trace()
 {
     pTraceBack();
-    logHeader();
+    logHeader(pTraceHeader, traceSize);
 }
-int NsHandleReceivedSolicitation(void (*traceback)(void), void* pPacket, int* pSize, uint8_t* pType, uint8_t* pCode)
+int NsHandleReceivedSolicitation(void (*traceback)(void), uint8_t* pType, uint8_t* pCode, void* pPacketRx, int sizeRx, void* pPacketTx, int* pSizeTx)
 {
     pTraceBack = traceback;
-    pHeader = (header*)pPacket;
-    size = *pSize;
-    char* pData = (char*)pHeader + sizeof(struct header);
+    struct header* pHeaderRx = (header*)pPacketRx;
+    struct header* pHeaderTx = (header*)pPacketTx;
+    
+    pTraceHeader = pHeaderRx;
+    traceSize = sizeRx;
     
     //Check it is us
-    if (!SlaacScope(pHeader->target)) return DO_NOTHING;
+    if (!SlaacScope(pHeaderRx->target)) return DO_NOTHING;
 
     if (NsTraceRecvSol)
     {
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP received neighbour solicit\r\n");
         if (NetTraceStack) traceback();
-        logHeader();
+        logHeader(pHeaderRx, sizeRx);
     }
     
     //Send advertisement
     *pType = 136;
     *pCode = 0;
-    pHeader->reserved = 0x00000060; //R=0 (not a router); S=1 (solicited); O=1 (override)
-                                    //pHeader->target is unchanged
+    pHeaderTx->reserved = 0x00000060; //R=0 (not a router); S=1 (solicited); O=1 (override)
+    Ip6AddressCopy(pHeaderTx->target, pHeaderRx->target); //Target toes not change
     
     //Add target MAC
-    char* p = pData;
+    char* pDataTx = (char*)pHeaderTx + sizeof(struct header);
+    char* p = pDataTx;
     p += NdpAddOptionTargetMac(p, MacLocal);
     
-    size = sizeof(struct header) + p - pData;
-    *pSize = size;
+    *pSizeTx = sizeof(struct header) + p - pDataTx;
     
-    if (NsTraceRecvSol) logHeader();
+    if (NsTraceRecvSol) logHeader(pHeaderTx, *pSizeTx);
     
     return ActionMakeFromDestAndTrace(UNICAST, NsTraceRecvSol && NetTraceStack);
 
@@ -90,17 +92,16 @@
 int NsHandleReceivedAdvertisement(void (*traceback)(void), void* pPacket, int* pSize)
 {
     pTraceBack = traceback;
-    pHeader = (header*)pPacket;
-    size = *pSize;
+    struct header* pHeader = (header*)pPacket;
     char* pData = (char*)pHeader + sizeof(struct header);
-    int dataLength = size - sizeof(struct header);
+    int dataLength = *pSize - sizeof(struct header);
     
     if (NsTraceRecvAdv)
     {
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP received neighbour advertise\r\n");
         if (NetTraceStack) traceback();
-        logHeader();
+        logHeader(pHeader, *pSize);
     }
     
     char tgtMac[6];
@@ -120,8 +121,7 @@
     *pType = 135; //Neighbour solicitation
     *pCode = 0;
         
-    pHeader = (header*)pPacket;
-    size = *pSize;
+    struct header* pHeader = (header*)pPacket;
     pHeader->reserved = 0;
     Ip6AddressCopy(pHeader->target, NsAddressToResolve);
     
@@ -129,14 +129,13 @@
     char* p = pData;
     p += NdpAddOptionSourceMac(p, MacLocal);
     
-    size = sizeof(struct header) + p - pData;
-    *pSize = size;
+    *pSize = sizeof(struct header) + p - pData;
 
     if (NsTraceSendSol)
     {
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP sent neighbour solicit\r\n");
-        logHeader();
+        logHeader(pHeader, *pSize);
     }
     
     return ActionMakeFromDestAndTrace(MULTICAST_NODE, NsTraceSendSol && NetTraceStack);