A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
14:e75a59c1123d
Parent:
13:9cd54f7db57a
Child:
16:f416ef583c89
diff -r 9cd54f7db57a -r e75a59c1123d eth/eth.cpp
--- a/eth/eth.cpp	Mon May 01 18:20:55 2017 +0000
+++ b/eth/eth.cpp	Fri May 05 17:44:16 2017 +0000
@@ -20,56 +20,29 @@
     uint16_t typ;
 };
 
-static void typeToString(uint16_t type, int size, char* text)
+uint16_t EthProtocol;
+
+void EthProtocolToString(uint16_t prototype, int size, char* text)
 {
-    switch (type)
+    switch (prototype)
     {
         case ARP:  strncpy (text, "ARP" , size);        break;
         case IPV4: strncpy (text, "IPV4", size);        break;
         case IPV6: strncpy (text, "IPV6", size);        break;
-        default:   snprintf(text, size, "%04hX", type); break;
+        default:   snprintf(text, size, "%04hX", prototype); break;
     }
 }
 
-static void finalisePacket(int action, int type, int dataLength, void* pPacket, int* pSize)
+static void finalisePacket(int action, int dataLength, void* pPacket, int* pSize)
 {
+    if (!action) return;
+    
     struct header * pHeader = (header*)pPacket;
-    
-    if (!action) return;
+        
+    MacMake(action, EthProtocol, pHeader->dst);
 
-    switch (action)
-    {
-        case DO_NOTHING:
-            return;
-        case UNICAST:
-        case UNICAST_DNS:
-        case UNICAST_DHCP:
-            break;
-        case MULTICAST_NODE:
-            if (type == IPV6) MacMakeMulticastNode6(pHeader->dst);
-            else              MacMakeMulticastNode4(pHeader->dst);
-            break;
-        case MULTICAST_ROUTER:
-            if (type == IPV6) MacMakeMulticastRouter6(pHeader->dst);
-            else              MacMakeMulticastRouter4(pHeader->dst);
-            break;
-        case MULTICAST_MDNS:
-            if (type == IPV6) MacMakeMulticastMdns6(pHeader->dst);
-            else              MacMakeMulticastMdns4(pHeader->dst);
-            break;
-        case MULTICAST_LLMNR:
-            if (type == IPV6) MacMakeMulticastLlmnr6(pHeader->dst);
-            else              MacMakeMulticastLlmnr4(pHeader->dst);
-            break;
-        case BROADCAST:
-            MacMakeBroadcast(pHeader->dst);
-            break;
-        default:
-            LogTimeF("Unknown ETH action %d\r\n", action);
-            return;
-    }
     memcpy(pHeader->src, MacLocal, 6);        //Put our MAC into the source
-    pHeader->typ = NetToHost16(type);
+    pHeader->typ = NetToHost16(EthProtocol);
     
     *pSize = HEADER_SIZE + dataLength;
 }
@@ -77,11 +50,11 @@
 {
     char text[20];
     LogTimeF("ETH %s\r\n", title);
-    NetMacToString(pHeader->dst, sizeof(text), text);
+    MacToString(pHeader->dst, sizeof(text), text);
     LogTimeF("Destination:  %s\r\n", text);
-    NetMacToString(pHeader->src, sizeof(text), text);
+    MacToString(pHeader->src, sizeof(text), text);
     LogTimeF("Source:       %s\r\n", text);
-    typeToString(NetToHost16(pHeader->typ), sizeof(text), text);
+    EthProtocolToString(NetToHost16(pHeader->typ), sizeof(text), text);
     LogTimeF("EtherType:    %s\r\n", text);        
 }
 int EthHandlePacket(void* pPacket, int* pSize)
@@ -89,23 +62,16 @@
     struct header * pHeader = (header*)pPacket;
     int dataLength = *pSize - HEADER_SIZE;
     void* pData = (char*)pPacket + HEADER_SIZE;
-    
-    bool doIt = MacCompareUnicastLocal        (pHeader->dst) || MacCompareBroadcast           (pHeader->dst) ||
-                MacCompareMulticastLocal4     (pHeader->dst) || MacCompareMulticastLocal6     (pHeader->dst) ||
-                MacCompareMulticastAllNodes4  (pHeader->dst) || MacCompareMulticastAllNodes6  (pHeader->dst) ||
-                MacCompareMulticastAllRouters4(pHeader->dst) || MacCompareMulticastAllRouters6(pHeader->dst) ||
-                MacCompareMulticastMdns4      (pHeader->dst) || MacCompareMulticastMdns6      (pHeader->dst) ||
-                MacCompareMulticastLlmnr4     (pHeader->dst) || MacCompareMulticastLlmnr6     (pHeader->dst);
-    
-    if (!doIt) return DO_NOTHING;
+        
+    if (!MacAccept(pHeader->dst)) return DO_NOTHING;
     
     if (DEBUG) LogHeader(pHeader, "received packet");
     
-    uint16_t type = NetToHost16(pHeader->typ);
-    if (type < 1500) return DO_NOTHING; //drop 802.3 messages
+    EthProtocol = NetToHost16(pHeader->typ);
+    if (EthProtocol < 1500) return DO_NOTHING; //drop 802.3 messages
 
     int   action = DO_NOTHING;
-    switch (type)
+    switch (EthProtocol)
     {
         case ARP:  action = ArpHandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break;
         case IPV4: action = Ip4HandleReceivedPacket(pHeader->src, pData, &dataLength, pHeader->dst); break;
@@ -115,7 +81,7 @@
             break;
     }
     
-    finalisePacket(action, type, dataLength, pPacket, pSize);
+    finalisePacket(action, dataLength, pPacket, pSize);
     return action;
 }
 int EthPollForPacketToSend(void* pPacket, int* pSize)
@@ -124,22 +90,22 @@
     void* pData = (char*)pPacket + HEADER_SIZE;
     
     int dataLength = 0;
-    int type = 0;
+    EthProtocol = 0;
     int action = DO_NOTHING;
 
     if (action == DO_NOTHING)
     {
         action = Ip6PollForPacketToSend(pData, &dataLength, pHeader->dst);
-        type = IPV6;
+        EthProtocol = IPV6;
     }
     
     if (action == DO_NOTHING)
     {
         action = Ip4PollForPacketToSend(pData, &dataLength, pHeader->dst);
-        type = IPV4;
+        EthProtocol = IPV4;
     }
     
-    finalisePacket(action, type, dataLength, pPacket, pSize);
+    finalisePacket(action, dataLength, pPacket, pSize);
     
     if (DEBUG) LogHeader(pHeader, "sent packet");