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
Diff: net.cpp
- 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