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

Committer:
andrewboyson
Date:
Sun Apr 16 14:21:55 2017 +0000
Revision:
10:f0854784e960
Parent:
9:91dae5300a4d
Child:
11:c051adb70c5a
MDNS and LLMNR now working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 7:b794780e33b4 1 #include "mbed.h"
andrewboyson 7:b794780e33b4 2 #include "phy.h"
andrewboyson 7:b794780e33b4 3 #include "net.h"
andrewboyson 7:b794780e33b4 4 #include "tcp.h"
andrewboyson 7:b794780e33b4 5 #include "dhcp.h"
andrewboyson 9:91dae5300a4d 6 #include "ar.h"
andrewboyson 7:b794780e33b4 7 #include "dns.h"
andrewboyson 7:b794780e33b4 8 #include "slaac.h"
andrewboyson 9:91dae5300a4d 9 #include "ndp.h"
andrewboyson 2:849103b5a16d 10
andrewboyson 10:f0854784e960 11 char* NetName;
andrewboyson 10:f0854784e960 12
andrewboyson 7:b794780e33b4 13 static void addHexNibble(bool* pAdded, int number, int index, char** pp)
andrewboyson 7:b794780e33b4 14 {
andrewboyson 7:b794780e33b4 15 int nibble = number;
andrewboyson 7:b794780e33b4 16 if (index) nibble >>= 4;
andrewboyson 7:b794780e33b4 17 nibble &= 0xF;
andrewboyson 7:b794780e33b4 18
andrewboyson 7:b794780e33b4 19 if (nibble || *pAdded)
andrewboyson 7:b794780e33b4 20 {
andrewboyson 7:b794780e33b4 21 **pp = nibble < 10 ? nibble + '0' : nibble - 10 + 'a';
andrewboyson 7:b794780e33b4 22 *pp += 1;
andrewboyson 7:b794780e33b4 23 *pAdded = true;
andrewboyson 7:b794780e33b4 24 }
andrewboyson 7:b794780e33b4 25 }
andrewboyson 7:b794780e33b4 26 int NetIp6AddressToString(char* pIp, int size, char* pText)
andrewboyson 7:b794780e33b4 27 {
andrewboyson 7:b794780e33b4 28 char* pIpE = pIp + 16;
andrewboyson 7:b794780e33b4 29 char* p = pText;
andrewboyson 7:b794780e33b4 30 while (true)
andrewboyson 7:b794780e33b4 31 {
andrewboyson 7:b794780e33b4 32 bool added = false;
andrewboyson 7:b794780e33b4 33 if (*pIp || *(pIp + 1))
andrewboyson 7:b794780e33b4 34 {
andrewboyson 7:b794780e33b4 35 if (p > pText + size - 2) break; addHexNibble(&added, *(pIp + 0), 1, &p);
andrewboyson 7:b794780e33b4 36 if (p > pText + size - 2) break; addHexNibble(&added, *(pIp + 0), 0, &p);
andrewboyson 7:b794780e33b4 37 if (p > pText + size - 2) break; addHexNibble(&added, *(pIp + 1), 1, &p);
andrewboyson 7:b794780e33b4 38 if (p > pText + size - 2) break; addHexNibble(&added, *(pIp + 1), 0, &p);
andrewboyson 7:b794780e33b4 39 }
andrewboyson 7:b794780e33b4 40
andrewboyson 7:b794780e33b4 41 pIp += 2;
andrewboyson 7:b794780e33b4 42 if (pIp >= pIpE) break;
andrewboyson 7:b794780e33b4 43
andrewboyson 7:b794780e33b4 44 if (p > pText + size - 2) break; *p++ = ':';
andrewboyson 7:b794780e33b4 45 }
andrewboyson 7:b794780e33b4 46 *p = 0;
andrewboyson 7:b794780e33b4 47 return p - pText;
andrewboyson 7:b794780e33b4 48 }
andrewboyson 7:b794780e33b4 49 int NetIp4AddressToString(uint32_t ip, int size, char* text)
andrewboyson 2:849103b5a16d 50 {
andrewboyson 2:849103b5a16d 51 int a0 = (ip & 0xFF000000) >> 24;
andrewboyson 2:849103b5a16d 52 int a1 = (ip & 0x00FF0000) >> 16;
andrewboyson 2:849103b5a16d 53 int a2 = (ip & 0x0000FF00) >> 8;
andrewboyson 2:849103b5a16d 54 int a3 = (ip & 0x000000FF);
andrewboyson 7:b794780e33b4 55 return snprintf(text, size, "%d.%d.%d.%d", a3, a2, a1, a0);
andrewboyson 7:b794780e33b4 56 }
andrewboyson 7:b794780e33b4 57 int NetMacToString(char* mac, int size, char* text)
andrewboyson 7:b794780e33b4 58 {
andrewboyson 9:91dae5300a4d 59 return snprintf(text, size, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 2:849103b5a16d 60 }
andrewboyson 9:91dae5300a4d 61 void NetProtocolToString(uint8_t protocol, int size, char* text)
andrewboyson 2:849103b5a16d 62 {
andrewboyson 7:b794780e33b4 63 switch (protocol)
andrewboyson 7:b794780e33b4 64 {
andrewboyson 9:91dae5300a4d 65 case ICMP: strncpy (text, "ICMP4", size); break;
andrewboyson 9:91dae5300a4d 66 case ICMP6: strncpy (text, "ICMP6", size); break;
andrewboyson 9:91dae5300a4d 67 case TCP: strncpy (text, "TCP" , size); break;
andrewboyson 9:91dae5300a4d 68 case UDP: strncpy (text, "UDP" , size); break;
andrewboyson 9:91dae5300a4d 69 default: snprintf(text, size, "%d", protocol); break;
andrewboyson 7:b794780e33b4 70 }
andrewboyson 2:849103b5a16d 71 }
andrewboyson 0:faa09bd4e6bf 72
andrewboyson 0:faa09bd4e6bf 73 int16_t NetToHost16(int16_t n)
andrewboyson 0:faa09bd4e6bf 74 {
andrewboyson 0:faa09bd4e6bf 75 int16_t h;
andrewboyson 0:faa09bd4e6bf 76
andrewboyson 0:faa09bd4e6bf 77 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 78 char* ph = (char*)&h + 1;
andrewboyson 0:faa09bd4e6bf 79
andrewboyson 0:faa09bd4e6bf 80 *ph = *pn; ph--; pn++; // 1<-0
andrewboyson 0:faa09bd4e6bf 81 *ph = *pn; // 0<-1
andrewboyson 0:faa09bd4e6bf 82
andrewboyson 0:faa09bd4e6bf 83 return h;
andrewboyson 0:faa09bd4e6bf 84 }
andrewboyson 0:faa09bd4e6bf 85
andrewboyson 0:faa09bd4e6bf 86 int32_t NetToHost32(int32_t n)
andrewboyson 0:faa09bd4e6bf 87 {
andrewboyson 0:faa09bd4e6bf 88 int32_t h;
andrewboyson 0:faa09bd4e6bf 89
andrewboyson 0:faa09bd4e6bf 90 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 91 char* ph = (char*)&h + 3;
andrewboyson 0:faa09bd4e6bf 92
andrewboyson 0:faa09bd4e6bf 93 *ph = *pn; ph--; pn++; // 3<-0
andrewboyson 0:faa09bd4e6bf 94 *ph = *pn; ph--; pn++; // 2<-1
andrewboyson 0:faa09bd4e6bf 95 *ph = *pn; ph--; pn++; // 1<-2
andrewboyson 0:faa09bd4e6bf 96 *ph = *pn; // 0<-3
andrewboyson 0:faa09bd4e6bf 97
andrewboyson 0:faa09bd4e6bf 98 return h;
andrewboyson 0:faa09bd4e6bf 99 }
andrewboyson 0:faa09bd4e6bf 100 int64_t NetToHost64(int64_t n)
andrewboyson 0:faa09bd4e6bf 101 {
andrewboyson 0:faa09bd4e6bf 102 int64_t h;
andrewboyson 0:faa09bd4e6bf 103
andrewboyson 0:faa09bd4e6bf 104 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 105 char* ph = (char*)&h + 7;
andrewboyson 0:faa09bd4e6bf 106
andrewboyson 0:faa09bd4e6bf 107 *ph = *pn; ph--; pn++; // 7<-0
andrewboyson 0:faa09bd4e6bf 108 *ph = *pn; ph--; pn++; // 6<-1
andrewboyson 0:faa09bd4e6bf 109 *ph = *pn; ph--; pn++; // 5<-2
andrewboyson 0:faa09bd4e6bf 110 *ph = *pn; ph--; pn++; // 4<-3
andrewboyson 0:faa09bd4e6bf 111 *ph = *pn; ph--; pn++; // 3<-4
andrewboyson 0:faa09bd4e6bf 112 *ph = *pn; ph--; pn++; // 2<-5
andrewboyson 0:faa09bd4e6bf 113 *ph = *pn; ph--; pn++; // 1<-6
andrewboyson 0:faa09bd4e6bf 114 *ph = *pn; // 0<-7
andrewboyson 0:faa09bd4e6bf 115
andrewboyson 0:faa09bd4e6bf 116 return h;
andrewboyson 0:faa09bd4e6bf 117 }
andrewboyson 0:faa09bd4e6bf 118 uint16_t onesComplement(uint16_t start, int count, void* pData)
andrewboyson 0:faa09bd4e6bf 119 {
andrewboyson 0:faa09bd4e6bf 120 uint32_t sum = start; //Initialise the 32 bit accumulator with the last sum
andrewboyson 0:faa09bd4e6bf 121 uint16_t* p = (uint16_t*)pData; //Set up a 16 bit pointer for the data
andrewboyson 0:faa09bd4e6bf 122
andrewboyson 0:faa09bd4e6bf 123 while(count > 1)
andrewboyson 0:faa09bd4e6bf 124 {
andrewboyson 0:faa09bd4e6bf 125 sum += *p++; // Add each pair of bytes into 32 bit accumulator
andrewboyson 0:faa09bd4e6bf 126 count -= 2;
andrewboyson 0:faa09bd4e6bf 127 }
andrewboyson 0:faa09bd4e6bf 128 if(count) sum += * (uint8_t*) p; // Add left-over byte, if any
andrewboyson 0:faa09bd4e6bf 129 while (sum>>16) sum = (sum & 0xffff) + (sum >> 16); // Add any carries from the sum back into the sum to make it ones complement
andrewboyson 0:faa09bd4e6bf 130 return sum;
andrewboyson 0:faa09bd4e6bf 131 }
andrewboyson 0:faa09bd4e6bf 132 uint16_t NetCheckSumTwo(int count1, void* pData1, int count2, void* pData2)
andrewboyson 0:faa09bd4e6bf 133 {
andrewboyson 0:faa09bd4e6bf 134 uint16_t sum = onesComplement(0, count1, pData1);
andrewboyson 0:faa09bd4e6bf 135 return ~onesComplement(sum, count2, pData2);
andrewboyson 0:faa09bd4e6bf 136 }
andrewboyson 0:faa09bd4e6bf 137 uint16_t NetCheckSum(int count, void* pData)
andrewboyson 0:faa09bd4e6bf 138 {
andrewboyson 0:faa09bd4e6bf 139 return ~onesComplement(0, count, pData);
andrewboyson 0:faa09bd4e6bf 140 }
andrewboyson 2:849103b5a16d 141
andrewboyson 2:849103b5a16d 142 static bool ticked()
andrewboyson 2:849103b5a16d 143 {
andrewboyson 2:849103b5a16d 144 static time_t lastT = 0;
andrewboyson 2:849103b5a16d 145 time_t thisT = time(NULL);
andrewboyson 2:849103b5a16d 146 bool oneshot = lastT != thisT;
andrewboyson 2:849103b5a16d 147 lastT = thisT;
andrewboyson 2:849103b5a16d 148 return oneshot;
andrewboyson 2:849103b5a16d 149 }
andrewboyson 2:849103b5a16d 150
andrewboyson 10:f0854784e960 151 int NetInit(char* name)
andrewboyson 2:849103b5a16d 152 {
andrewboyson 10:f0854784e960 153 NetName = name;
andrewboyson 2:849103b5a16d 154 PhyInit();
andrewboyson 2:849103b5a16d 155 TcpInit();
andrewboyson 9:91dae5300a4d 156 ArInit();
andrewboyson 7:b794780e33b4 157 SlaacInit();
andrewboyson 2:849103b5a16d 158 return 0;
andrewboyson 2:849103b5a16d 159 }
andrewboyson 2:849103b5a16d 160 int NetMain()
andrewboyson 2:849103b5a16d 161 {
andrewboyson 2:849103b5a16d 162 PhyMain();
andrewboyson 9:91dae5300a4d 163 ArMain();
andrewboyson 2:849103b5a16d 164 if (ticked())
andrewboyson 2:849103b5a16d 165 {
andrewboyson 2:849103b5a16d 166 DhcpTick();
andrewboyson 9:91dae5300a4d 167 ArTick();
andrewboyson 7:b794780e33b4 168 DnsTick();
andrewboyson 9:91dae5300a4d 169 NdpTick();
andrewboyson 2:849103b5a16d 170 }
andrewboyson 2:849103b5a16d 171 return 0;
andrewboyson 2:849103b5a16d 172 }