Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
43:bc028d5a6424
Parent:
42:222a4f45f916
Child:
44:83ce5ace337b
--- a/eth/arp.cpp	Sun Oct 15 17:54:09 2017 +0000
+++ b/eth/arp.cpp	Thu Oct 19 20:56:58 2017 +0000
@@ -8,10 +8,13 @@
 #include     "ar.h"
 #include     "nr.h"
 #include     "io.h"
+#include    "ip4.h"
 
 #define REQUEST   1
 #define REPLY     2
 
+bool ArpTrace = false;
+
 uint32_t ArpAddressToResolve;
 bool     ArpResolveRequestFlag = false;
 
@@ -27,6 +30,44 @@
     char     targetHardwareAddress[6]; //nbytes: (ar$tha) Hardware address of target of this packet (if known).
     uint32_t targetProtocolAddress;    //mbytes: (ar$tpa) Protocol address of target.
 };
+
+static void logHeader(void * pPacket)
+{
+    struct header*         pHeader = (header*)pPacket;
+    char text[30];
+    
+    if (NetTraceVerbose)
+    {
+        LogTime("ARP header\r\n");
+        if (NetToHost16(pHeader->hardwareType) == ETHERNET) Log ("  hardwareType          = ETHERNET\r\n");
+        else                                                LogF("  hardwareType          = %d\r\n", NetToHost16(pHeader->hardwareType));
+        EthProtocolToString(NetToHost16(pHeader->protocolType), sizeof(text), text);
+        LogF("  protocolType          = %s\r\n", text);
+        LogF("  hardwareLength        = %d\r\n",             pHeader->hardwareLength);
+        LogF("  protocolLength        = %d\r\n",             pHeader->protocolLength);
+        if      (NetToHost16(pHeader->opCode) == REQUEST) Log ("  opCode                = REQUEST\r\n");
+        else if (NetToHost16(pHeader->opCode) == REPLY  ) Log ("  opCode                = REPLY\r\n");
+        else                                              LogF("  opCode                = %d\r\n", NetToHost16(pHeader->opCode));
+        MacToString(pHeader->senderHardwareAddress, sizeof(text), text);
+        LogF("  senderHardwareAddress = %s\r\n", text);
+        Ip4AddressToString(pHeader->senderProtocolAddress, sizeof(text), text);
+        LogF("  senderProtocolAddress = %s\r\n", text);
+        MacToString(pHeader->targetHardwareAddress, sizeof(text), text);
+        LogF("  targetHardwareAddress = %s\r\n", text);
+        Ip4AddressToString(pHeader->targetProtocolAddress, sizeof(text), text);
+        LogF("  targetProtocolAddress = %s\r\n", text);
+    }
+    else
+    {
+        Log("ARP header ");
+        MacToString       (pHeader->senderHardwareAddress, sizeof(text), text);           Log(text);
+        Ip4AddressToString(pHeader->senderProtocolAddress, sizeof(text), text); Log("["); LogF(text); Log("] >>> ");
+        MacToString       (pHeader->targetHardwareAddress, sizeof(text), text);           LogF(text);
+        Ip4AddressToString(pHeader->targetProtocolAddress, sizeof(text), text); Log("["); LogF(text); Log("]\r\n");
+        
+    }
+}
+
 int ArpHandleReceivedPacket(void (*traceback)(void), char* pSrcMac, void * pPacket, int* pSize, char* pDstMac)
 {
     struct header*         pHeader = (header*)pPacket;
@@ -46,17 +87,34 @@
     switch (opCode)
     {
         case REQUEST:
+            if (ArpTrace)
+            {
+                if (NetTraceNewLine) Log("\r\n");
+                LogTime("ARP received request\r\n");
+                logHeader(pPacket);
+                if (NetTraceStack) traceback();
+            }   
             MacCopy(pHeader->targetHardwareAddress,  pHeader->senderHardwareAddress);
-                   pHeader->targetProtocolAddress = pHeader->senderProtocolAddress;
+                    pHeader->targetProtocolAddress = pHeader->senderProtocolAddress;
             MacCopy(pHeader->senderHardwareAddress,  MacLocal);
-                   pHeader->senderProtocolAddress = DhcpLocalIp;
-                   pHeader->opCode                = NetToHost16(REPLY);
+                    pHeader->senderProtocolAddress = DhcpLocalIp;
+                    pHeader->opCode                = NetToHost16(REPLY);
             MacCopy(pDstMac, pSrcMac);
-            return UNICAST;
+            if (ArpTrace) logHeader(pPacket);
+            return ActionMakeFromDestAndTrace(UNICAST, ArpTrace && NetTraceStack);
+            
         case REPLY:
+            if (ArpTrace)
+            {
+                if (NetTraceNewLine) Log("\r\n");
+                LogTime("ARP received reply\r\n");
+                logHeader(pPacket);
+                if (NetTraceStack) traceback();
+            }   
             ArAddIp4Record(pHeader->senderHardwareAddress, pHeader->senderProtocolAddress);
             NrMakeRequestForNameFromIp4(pHeader->senderProtocolAddress);
             return DO_NOTHING;
+            
         default:
             return DO_NOTHING;
     }
@@ -65,7 +123,7 @@
 {
     if (!ArpResolveRequestFlag) return DO_NOTHING;
     ArpResolveRequestFlag = false;
-    
+        
     struct header* pHeader = (header*)pPacket;
     
     pHeader->hardwareType   = NetToHost16(ETHERNET);
@@ -76,10 +134,16 @@
     
     MacClear(pHeader->targetHardwareAddress);
              pHeader->targetProtocolAddress = ArpAddressToResolve;
-    MacCopy(pHeader->senderHardwareAddress,  MacLocal);
-           pHeader->senderProtocolAddress = DhcpLocalIp;
+    MacCopy (pHeader->senderHardwareAddress,  MacLocal);
+             pHeader->senderProtocolAddress = DhcpLocalIp;
            
     *pSize = sizeof(header);
     
-    return BROADCAST;
+    if (ArpTrace)
+    {
+        if (NetTraceNewLine) Log("\r\n");
+        LogTime("ARP send request\r\n");
+        logHeader(pPacket);
+    }
+    return ActionMakeFromDestAndTrace(BROADCAST, ArpTrace && NetTraceStack);
 }