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:
Fri Jan 27 19:58:51 2017 +0000
Revision:
2:849103b5a16d
Parent:
0:faa09bd4e6bf
Child:
5:5fc4ca9fbf17
DHCP working and most options decoded; TCP and HTTP working.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:faa09bd4e6bf 1 #include "mbed.h"
andrewboyson 2:849103b5a16d 2 #include "phy.h"
andrewboyson 2:849103b5a16d 3 #include "tcp.h"
andrewboyson 2:849103b5a16d 4 #include "dhcp.h"
andrewboyson 2:849103b5a16d 5 #include "arp.h"
andrewboyson 2:849103b5a16d 6
andrewboyson 2:849103b5a16d 7 int NetIpToString(uint32_t ip, char* text)
andrewboyson 2:849103b5a16d 8 {
andrewboyson 2:849103b5a16d 9 int a0 = (ip & 0xFF000000) >> 24;
andrewboyson 2:849103b5a16d 10 int a1 = (ip & 0x00FF0000) >> 16;
andrewboyson 2:849103b5a16d 11 int a2 = (ip & 0x0000FF00) >> 8;
andrewboyson 2:849103b5a16d 12 int a3 = (ip & 0x000000FF);
andrewboyson 2:849103b5a16d 13 return sprintf(text, "%d.%d.%d.%d", a0, a1, a2, a3);
andrewboyson 2:849103b5a16d 14 }
andrewboyson 2:849103b5a16d 15 int NetMacToString(char* mac, char* text)
andrewboyson 2:849103b5a16d 16 {
andrewboyson 2:849103b5a16d 17 return sprintf(text, "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 2:849103b5a16d 18 }
andrewboyson 0:faa09bd4e6bf 19
andrewboyson 0:faa09bd4e6bf 20 int16_t NetToHost16(int16_t n)
andrewboyson 0:faa09bd4e6bf 21 {
andrewboyson 0:faa09bd4e6bf 22 int16_t h;
andrewboyson 0:faa09bd4e6bf 23
andrewboyson 0:faa09bd4e6bf 24 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 25 char* ph = (char*)&h + 1;
andrewboyson 0:faa09bd4e6bf 26
andrewboyson 0:faa09bd4e6bf 27 *ph = *pn; ph--; pn++; // 1<-0
andrewboyson 0:faa09bd4e6bf 28 *ph = *pn; // 0<-1
andrewboyson 0:faa09bd4e6bf 29
andrewboyson 0:faa09bd4e6bf 30 return h;
andrewboyson 0:faa09bd4e6bf 31 }
andrewboyson 0:faa09bd4e6bf 32
andrewboyson 0:faa09bd4e6bf 33 int32_t NetToHost32(int32_t n)
andrewboyson 0:faa09bd4e6bf 34 {
andrewboyson 0:faa09bd4e6bf 35 int32_t h;
andrewboyson 0:faa09bd4e6bf 36
andrewboyson 0:faa09bd4e6bf 37 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 38 char* ph = (char*)&h + 3;
andrewboyson 0:faa09bd4e6bf 39
andrewboyson 0:faa09bd4e6bf 40 *ph = *pn; ph--; pn++; // 3<-0
andrewboyson 0:faa09bd4e6bf 41 *ph = *pn; ph--; pn++; // 2<-1
andrewboyson 0:faa09bd4e6bf 42 *ph = *pn; ph--; pn++; // 1<-2
andrewboyson 0:faa09bd4e6bf 43 *ph = *pn; // 0<-3
andrewboyson 0:faa09bd4e6bf 44
andrewboyson 0:faa09bd4e6bf 45 return h;
andrewboyson 0:faa09bd4e6bf 46 }
andrewboyson 0:faa09bd4e6bf 47 int64_t NetToHost64(int64_t n)
andrewboyson 0:faa09bd4e6bf 48 {
andrewboyson 0:faa09bd4e6bf 49 int64_t h;
andrewboyson 0:faa09bd4e6bf 50
andrewboyson 0:faa09bd4e6bf 51 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 52 char* ph = (char*)&h + 7;
andrewboyson 0:faa09bd4e6bf 53
andrewboyson 0:faa09bd4e6bf 54 *ph = *pn; ph--; pn++; // 7<-0
andrewboyson 0:faa09bd4e6bf 55 *ph = *pn; ph--; pn++; // 6<-1
andrewboyson 0:faa09bd4e6bf 56 *ph = *pn; ph--; pn++; // 5<-2
andrewboyson 0:faa09bd4e6bf 57 *ph = *pn; ph--; pn++; // 4<-3
andrewboyson 0:faa09bd4e6bf 58 *ph = *pn; ph--; pn++; // 3<-4
andrewboyson 0:faa09bd4e6bf 59 *ph = *pn; ph--; pn++; // 2<-5
andrewboyson 0:faa09bd4e6bf 60 *ph = *pn; ph--; pn++; // 1<-6
andrewboyson 0:faa09bd4e6bf 61 *ph = *pn; // 0<-7
andrewboyson 0:faa09bd4e6bf 62
andrewboyson 0:faa09bd4e6bf 63 return h;
andrewboyson 0:faa09bd4e6bf 64 }
andrewboyson 0:faa09bd4e6bf 65 uint16_t onesComplement(uint16_t start, int count, void* pData)
andrewboyson 0:faa09bd4e6bf 66 {
andrewboyson 0:faa09bd4e6bf 67 uint32_t sum = start; //Initialise the 32 bit accumulator with the last sum
andrewboyson 0:faa09bd4e6bf 68 uint16_t* p = (uint16_t*)pData; //Set up a 16 bit pointer for the data
andrewboyson 0:faa09bd4e6bf 69
andrewboyson 0:faa09bd4e6bf 70 while(count > 1)
andrewboyson 0:faa09bd4e6bf 71 {
andrewboyson 0:faa09bd4e6bf 72 sum += *p++; // Add each pair of bytes into 32 bit accumulator
andrewboyson 0:faa09bd4e6bf 73 count -= 2;
andrewboyson 0:faa09bd4e6bf 74 }
andrewboyson 0:faa09bd4e6bf 75 if(count) sum += * (uint8_t*) p; // Add left-over byte, if any
andrewboyson 0:faa09bd4e6bf 76 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 77 return sum;
andrewboyson 0:faa09bd4e6bf 78 }
andrewboyson 0:faa09bd4e6bf 79 uint16_t NetCheckSumTwo(int count1, void* pData1, int count2, void* pData2)
andrewboyson 0:faa09bd4e6bf 80 {
andrewboyson 0:faa09bd4e6bf 81 uint16_t sum = onesComplement(0, count1, pData1);
andrewboyson 0:faa09bd4e6bf 82 return ~onesComplement(sum, count2, pData2);
andrewboyson 0:faa09bd4e6bf 83 }
andrewboyson 0:faa09bd4e6bf 84 uint16_t NetCheckSum(int count, void* pData)
andrewboyson 0:faa09bd4e6bf 85 {
andrewboyson 0:faa09bd4e6bf 86 return ~onesComplement(0, count, pData);
andrewboyson 0:faa09bd4e6bf 87 }
andrewboyson 2:849103b5a16d 88
andrewboyson 2:849103b5a16d 89 static bool ticked()
andrewboyson 2:849103b5a16d 90 {
andrewboyson 2:849103b5a16d 91 static time_t lastT = 0;
andrewboyson 2:849103b5a16d 92 time_t thisT = time(NULL);
andrewboyson 2:849103b5a16d 93 bool oneshot = lastT != thisT;
andrewboyson 2:849103b5a16d 94 lastT = thisT;
andrewboyson 2:849103b5a16d 95 return oneshot;
andrewboyson 2:849103b5a16d 96 }
andrewboyson 2:849103b5a16d 97
andrewboyson 2:849103b5a16d 98 int NetInit()
andrewboyson 2:849103b5a16d 99 {
andrewboyson 2:849103b5a16d 100 PhyInit();
andrewboyson 2:849103b5a16d 101 TcpInit();
andrewboyson 2:849103b5a16d 102 ArpInit();
andrewboyson 2:849103b5a16d 103 return 0;
andrewboyson 2:849103b5a16d 104 }
andrewboyson 2:849103b5a16d 105 int NetMain()
andrewboyson 2:849103b5a16d 106 {
andrewboyson 2:849103b5a16d 107 PhyMain();
andrewboyson 2:849103b5a16d 108 if (ticked())
andrewboyson 2:849103b5a16d 109 {
andrewboyson 2:849103b5a16d 110 DhcpTick();
andrewboyson 2:849103b5a16d 111 ArpTick();
andrewboyson 2:849103b5a16d 112 }
andrewboyson 2:849103b5a16d 113 return 0;
andrewboyson 2:849103b5a16d 114 }