Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
47:73af5c0b0dc2
Parent:
46:40d33e9037e4
Child:
48:952dddb74b8b
--- a/ip6/icmp/ndp/ns.cpp	Tue Oct 24 07:01:35 2017 +0000
+++ b/ip6/icmp/ndp/ns.cpp	Thu Oct 26 14:50:24 2017 +0000
@@ -8,91 +8,47 @@
 #include     "ar.h"
 #include    "ip6.h"
 #include  "slaac.h"
+#include    "ndp.h"
 
 bool NsTraceRecvSol = false;
 bool NsTraceRecvAdv = false;
 bool NsTraceSendSol = false;
 
-static char srcMAC[6];
-static char tgtMAC[6];
-
 char NsAddressToResolve[16];
 bool NsResolveRequestFlag = false;
 
-static int logOptions(char* p)
+__packed struct header
 {
-    int type = *p++;
-    int size = *p++;
-    char text[100];
-    switch (type)
-    {
-        case 1:
-            MacToString(p, sizeof(text), text);
-            LogF("  Src MAC     %s\r\n", text);
-            break;
-        case 2:
-            MacToString(p, sizeof(text), text);
-            LogF("  Tgt MAC     %s\r\n", text);
-            break;
-        default:
-            LogF("  Unknown option %d\r\n", type);
-            break;
-    }
-    return size * 8;
-}
+    uint32_t  reserved;
+    char      target[16];
+};
 
-void logHeader(void* pPacket, int* pSize)
+static void logHeader(void* pPacket, int size)
 {
-    __packed struct header
-    {
-        uint32_t  reserved;
-        char      target[16];
-    };
     struct header* pHeader = (header*)pPacket;
     char* pData = (char*)pHeader + sizeof(struct header);
-    int dataLength = *pSize - sizeof(struct header);
-    
-    Log("NDP header\r\n");
-    LogF("  Size        %d\r\n", *pSize);
-    char text[100];
-    Ip6AddressToString(pHeader->target, sizeof(text), text);
-    LogF("  Target      %s\r\n", text);
-    
-    char* p = pData;
-    char* pE = pData + dataLength;
+    int dataLength = size - sizeof(struct header);
     
-    while(p < pE) p += logOptions(p);
-}
-
-static int decodeOptions(char* p)
-{
-    int type = *p++;
-    int size = *p++;
-    switch (type)
+    if (NetTraceVerbose)
     {
-        case 1:
-            memcpy(srcMAC, p, 6);
-            break;
-        case 2:
-            memcpy(tgtMAC, p, 6);
-            break;
-        default:
-            LogF("  Unknown option %d\r\n", type);
-            break;
+        Log("NS header\r\n");
+        LogF("  Size        %d\r\n", size);
+        LogF("  Target      "); Ip6AddressLog(pHeader->target); Log("\r\n");
+        NdpLogOptionsVerbose(pData, dataLength);
     }
-    return size * 8;
+    else
+    {
+        Log("NS    header ");
+        Ip6AddressLog(pHeader->target);
+        NdpLogOptionsQuiet(pData, dataLength); 
+        Log("\r\n");
+    }
 }
 
 int NsHandleReceivedSolicitation(void (*traceback)(void), void* pPacket, int* pSize, uint8_t* pType, uint8_t* pCode)
 {
-    __packed struct header
-    {
-        uint32_t  reserved;
-        char      target[16];
-    };
     struct header* pHeader = (header*)pPacket;
     char* pData = (char*)pHeader + sizeof(struct header);
-    int dataLength = *pSize - sizeof(struct header);
     
     //Check it is us
     if (!SlaacScope(pHeader->target)) return DO_NOTHING;
@@ -102,12 +58,8 @@
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP received neighbour solicit\r\n");
         if (NetTraceStack) traceback();
-        logHeader(pPacket, pSize);
+        logHeader(pPacket, *pSize);
     }
-    char* p = pData;
-    char* pE = pData + dataLength;
-    
-    while(p < pE) p += decodeOptions(p);
     
     //Send advertisement
     *pType = 136;
@@ -115,26 +67,19 @@
     pHeader->reserved = 0x00000060; //R=0 (not a router); S=1 (solicited); O=1 (override)
                                     //pHeader->target is unchanged
     
-    p = pData;
-    *p++ = 2; //Target MAC option
-    *p++ = 1; //8 bytes
-    memcpy(p, MacLocal, 6);
-    p += 6;
+    //Add target MAC
+    char* p = pData;
+    p += NdpAddOptionTargetMac(p, MacLocal);
     
     *pSize = sizeof(struct header) + p - pData;
     
-    if (NsTraceRecvSol) logHeader(pPacket, pSize);
+    if (NsTraceRecvSol) logHeader(pPacket, *pSize);
     
     return ActionMakeFromDestAndTrace(UNICAST, NsTraceRecvSol && NetTraceStack);
 
 }
 int NsHandleReceivedAdvertisement(void (*traceback)(void), void* pPacket, int* pSize)
 {
-    __packed struct header
-    {
-        uint32_t  reserved;
-        char      target[16];
-    };
     struct header* pHeader = (header*)pPacket;
     char* pData = (char*)pHeader + sizeof(struct header);
     int dataLength = *pSize - sizeof(struct header);
@@ -144,15 +89,13 @@
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP received neighbour advertise\r\n");
         if (NetTraceStack) traceback();
-        logHeader(pPacket, pSize);
+        logHeader(pPacket, *pSize);
     }
     
-    char* p = pData;
-    char* pE = pData + dataLength;
+    char tgtMac[6];
+    NdpDecodeOptions(pData, dataLength, NULL, tgtMac);
     
-    while(p < pE) p += decodeOptions(p);
-    
-    ArAddIp6Record(tgtMAC, pHeader->target);
+    ArAddIp6Record(tgtMac, pHeader->target);
     NrMakeRequestForNameFromIp6(pHeader->target);
     
     return DO_NOTHING;
@@ -162,25 +105,17 @@
 {    
     if (!NsResolveRequestFlag) return DO_NOTHING;
     NsResolveRequestFlag = false;
-        
-    __packed struct header
-    {
-        uint32_t  reserved;
-        char      target[16];
-    };
-    struct header* pHeader = (header*)pPacket;
-    pHeader->reserved = 0;
-    memcpy(pHeader->target, NsAddressToResolve, 16);
 
     *pType = 135; //Neighbour solicitation
     *pCode = 0;
+        
+    struct header* pHeader = (header*)pPacket;
+    pHeader->reserved = 0;
+    Ip6Copy(pHeader->target, NsAddressToResolve);
     
     char* pData = (char*)pHeader + sizeof(struct header);
     char* p = pData;
-    *p++ = 1; //Source MAC option
-    *p++ = 1; //8 bytes
-    memcpy(p, MacLocal, 6);
-    p += 6;
+    p += NdpAddOptionSourceMac(p, MacLocal);
     
     *pSize = sizeof(struct header) + p - pData;
 
@@ -188,7 +123,7 @@
     {
         if (NetTraceNewLine) Log("\r\n");
         LogTimeF("NDP sent neighbour solicit\r\n");
-        logHeader(pPacket, pSize);
+        logHeader(pPacket, *pSize);
     }
     
     return ActionMakeFromDestAndTrace(MULTICAST_NODE, NsTraceSendSol && NetTraceStack);