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:
7:b794780e33b4
Parent:
5:5fc4ca9fbf17
Child:
9:91dae5300a4d
--- a/net.cpp	Sun Feb 26 17:12:07 2017 +0000
+++ b/net.cpp	Sun Mar 12 13:56:08 2017 +0000
@@ -1,20 +1,69 @@
-#include "mbed.h"
-#include  "phy.h"
-#include  "tcp.h"
-#include "dhcp.h"
-#include  "arp.h"
+#include  "mbed.h"
+#include   "phy.h"
+#include   "net.h"
+#include   "tcp.h"
+#include  "dhcp.h"
+#include   "arp.h"
+#include   "dns.h"
+#include "slaac.h"
 
-int NetIpToString(uint32_t ip, char* text)
+static void addHexNibble(bool* pAdded, int number, int index, char** pp)
+{
+    int nibble = number;
+    if (index) nibble >>= 4;
+    nibble &= 0xF;
+    
+    if (nibble || *pAdded)
+    {
+        **pp = nibble < 10 ? nibble + '0' : nibble - 10 + 'a';
+        *pp += 1;
+        *pAdded = true;
+    }
+}
+int NetIp6AddressToString(char* pIp, int size, char* pText)
+{
+    char* pIpE = pIp + 16;
+    char* p = pText;
+    while (true)
+    {
+        bool added = false;
+        if (*pIp || *(pIp + 1))
+        {
+            if (p > pText + size - 2) break;  addHexNibble(&added, *(pIp + 0), 1, &p);
+            if (p > pText + size - 2) break;  addHexNibble(&added, *(pIp + 0), 0, &p);
+            if (p > pText + size - 2) break;  addHexNibble(&added, *(pIp + 1), 1, &p);
+            if (p > pText + size - 2) break;  addHexNibble(&added, *(pIp + 1), 0, &p);
+        }
+        
+        pIp += 2;
+        if (pIp >= pIpE) break;
+        
+        if (p > pText + size - 2) break; *p++ = ':';
+    }
+    *p = 0;
+    return p - pText;
+}
+int NetIp4AddressToString(uint32_t ip, int size, char* text)
 {
     int a0 = (ip & 0xFF000000) >> 24;
     int a1 = (ip & 0x00FF0000) >> 16;
     int a2 = (ip & 0x0000FF00) >>  8;
     int a3 = (ip & 0x000000FF);
-    return sprintf(text, "%d.%d.%d.%d", a0, a1, a2, a3); 
+    return snprintf(text, size, "%d.%d.%d.%d", a3, a2, a1, a0); 
+}
+int NetMacToString(char* mac, int size, char* text)
+{
+    return snprintf(text, size, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
 }
-int NetMacToString(char* mac, char* text)
+void NetProtocolToString(uint16_t protocol, int size, char* text)
 {
-    return sprintf(text, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+    switch (protocol)
+    {
+        case ICMP6_PROTOCOL: strncpy (text, "ICMP6", size);        break;
+        case   TCP_PROTOCOL: strncpy (text, "TCP"  , size);        break;
+        case   UDP_PROTOCOL: strncpy (text, "UDP"  , size);        break;
+        default:             snprintf(text, size, "%d", protocol); break;
+    }
 }
 
 int16_t NetToHost16(int16_t n)
@@ -100,6 +149,7 @@
     PhyInit();
     TcpInit();
     ArpInit();
+    SlaacInit();
     return 0;
 }
 int NetMain()
@@ -110,6 +160,7 @@
     {
         DhcpTick();
         ArpTick();
+        DnsTick();
     }
     return 0;
 }
\ No newline at end of file