Andrew Boyson / net

Dependents:   oldheating gps motorhome heating

Revision:
48:952dddb74b8b
Parent:
47:73af5c0b0dc2
Child:
49:1a6336f2b3f9
--- a/eth/arp.cpp	Thu Oct 26 14:50:24 2017 +0000
+++ b/eth/arp.cpp	Tue Oct 31 21:25:09 2017 +0000
@@ -5,7 +5,7 @@
 #include    "eth.h"
 #include    "mac.h"
 #include   "dhcp.h"
-#include     "ar.h"
+#include    "ar4.h"
 #include     "nr.h"
 #include     "io.h"
 #include    "ip4.h"
@@ -30,26 +30,25 @@
     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 struct header* pHeader;
 
-static void logHeader(void * pPacket)
-{
-    struct header*         pHeader = (header*)pPacket;
-    
+static void logHeader()
+{    
     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));
-        Log ("  protocolType          = "); EthProtocolLog(pHeader->protocolType); Log("\r\n");
-        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));
-        Log("  senderHardwareAddress = ");        MacLog(pHeader->senderHardwareAddress); Log("\r\n");
-        Log("  senderProtocolAddress = "); Ip4AddressLog(pHeader->senderProtocolAddress); Log("\r\n");
-        Log("  targetHardwareAddress = ");        MacLog(pHeader->targetHardwareAddress); Log("\r\n");
-        Log("  targetProtocolAddress = "); Ip4AddressLog(pHeader->targetProtocolAddress); Log("\r\n");
+        Log ("  protocolType          = ");      EthProtocolLog(pHeader->protocolType);          Log("\r\n");
+        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));
+        Log("  senderHardwareAddress = ");               MacLog(pHeader->senderHardwareAddress); Log("\r\n");
+        Log("  senderProtocolAddress = ");        Ip4AddressLog(pHeader->senderProtocolAddress); Log("\r\n");
+        Log("  targetHardwareAddress = ");               MacLog(pHeader->targetHardwareAddress); Log("\r\n");
+        Log("  targetProtocolAddress = ");        Ip4AddressLog(pHeader->targetProtocolAddress); Log("\r\n");
     }
     else
     {
@@ -61,17 +60,24 @@
         
     }
 }
+static void (*pTraceBack)(void);
+static void trace()
+{
+    pTraceBack();
+    logHeader();
+}
 
 int ArpHandleReceivedPacket(void (*traceback)(void), char* pSrcMac, void * pPacket, int* pSize, char* pDstMac)
 {
-    struct header*         pHeader = (header*)pPacket;
+    pTraceBack = traceback;
+    pHeader = (header*)pPacket;
     int16_t           hardwareType = NetToHost16(pHeader->hardwareType);
     int16_t           protocolType = NetToHost16(pHeader->protocolType);
     int8_t          hardwareLength =             pHeader->hardwareLength;
     int8_t          protocolLength =             pHeader->protocolLength;
     int16_t                 opCode = NetToHost16(pHeader->opCode);
     uint32_t targetProtocolAddress =             pHeader->targetProtocolAddress;
-    
+
     if (hardwareType          != ETHERNET     ) return DO_NOTHING; //This is not ethernet
     if (protocolType          != IPV4         ) return DO_NOTHING; //This is not IPv4
     if (hardwareLength        != 6            ) return DO_NOTHING; //This is not a MAC hardware address
@@ -86,7 +92,7 @@
                 if (NetTraceNewLine) Log("\r\n");
                 LogTime("ARP received request\r\n");
                 if (NetTraceStack) traceback();
-                logHeader(pPacket);
+                logHeader();
             }   
             MacCopy(pHeader->targetHardwareAddress,  pHeader->senderHardwareAddress);
                     pHeader->targetProtocolAddress = pHeader->senderProtocolAddress;
@@ -94,7 +100,7 @@
                     pHeader->senderProtocolAddress = DhcpLocalIp;
                     pHeader->opCode                = NetToHost16(REPLY);
             MacCopy(pDstMac, pSrcMac);
-            if (ArpTrace) logHeader(pPacket);
+            if (ArpTrace) logHeader();
             return ActionMakeFromDestAndTrace(UNICAST, ArpTrace && NetTraceStack);
             
         case REPLY:
@@ -103,9 +109,9 @@
                 if (NetTraceNewLine) Log("\r\n");
                 LogTime("ARP received reply\r\n");
                 if (NetTraceStack) traceback();
-                logHeader(pPacket);
+                logHeader();
             }   
-            ArAddIp4Record(pHeader->senderHardwareAddress, pHeader->senderProtocolAddress);
+            Ar4AddIpRecord(trace, pHeader->senderHardwareAddress, pHeader->senderProtocolAddress);
             NrMakeRequestForNameFromIp4(pHeader->senderProtocolAddress);
             return DO_NOTHING;
             
@@ -117,27 +123,27 @@
 {
     if (!ArpResolveRequestFlag) return DO_NOTHING;
     ArpResolveRequestFlag = false;
-        
-    struct header* pHeader = (header*)pPacket;
-    
+
+    pHeader = (header*)pPacket;
+
     pHeader->hardwareType   = NetToHost16(ETHERNET);
     pHeader->protocolType   = NetToHost16(IPV4);
     pHeader->hardwareLength = 6;
     pHeader->protocolLength = 4;
     pHeader->opCode         = NetToHost16(REQUEST);
-    
+
     MacClear(pHeader->targetHardwareAddress);
              pHeader->targetProtocolAddress = ArpAddressToResolve;
     MacCopy (pHeader->senderHardwareAddress,  MacLocal);
              pHeader->senderProtocolAddress = DhcpLocalIp;
-           
+
     *pSize = sizeof(header);
     
     if (ArpTrace)
     {
         if (NetTraceNewLine) Log("\r\n");
         LogTime("ARP send request\r\n");
-        logHeader(pPacket);
+        logHeader();
     }
     return ActionMakeFromDestAndTrace(BROADCAST, ArpTrace && NetTraceStack);
 }