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:
Mon Jan 09 13:29:41 2017 +0000
Revision:
0:faa09bd4e6bf
Child:
2:849103b5a16d
arp, ping udp and ntp are working. TCP started.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 0:faa09bd4e6bf 1 #include "mbed.h"
andrewboyson 0:faa09bd4e6bf 2
andrewboyson 0:faa09bd4e6bf 3 int16_t NetToHost16(int16_t n)
andrewboyson 0:faa09bd4e6bf 4 {
andrewboyson 0:faa09bd4e6bf 5 int16_t h;
andrewboyson 0:faa09bd4e6bf 6
andrewboyson 0:faa09bd4e6bf 7 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 8 char* ph = (char*)&h + 1;
andrewboyson 0:faa09bd4e6bf 9
andrewboyson 0:faa09bd4e6bf 10 *ph = *pn; ph--; pn++; // 1<-0
andrewboyson 0:faa09bd4e6bf 11 *ph = *pn; // 0<-1
andrewboyson 0:faa09bd4e6bf 12
andrewboyson 0:faa09bd4e6bf 13 return h;
andrewboyson 0:faa09bd4e6bf 14 }
andrewboyson 0:faa09bd4e6bf 15
andrewboyson 0:faa09bd4e6bf 16 int32_t NetToHost32(int32_t n)
andrewboyson 0:faa09bd4e6bf 17 {
andrewboyson 0:faa09bd4e6bf 18 int32_t h;
andrewboyson 0:faa09bd4e6bf 19
andrewboyson 0:faa09bd4e6bf 20 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 21 char* ph = (char*)&h + 3;
andrewboyson 0:faa09bd4e6bf 22
andrewboyson 0:faa09bd4e6bf 23 *ph = *pn; ph--; pn++; // 3<-0
andrewboyson 0:faa09bd4e6bf 24 *ph = *pn; ph--; pn++; // 2<-1
andrewboyson 0:faa09bd4e6bf 25 *ph = *pn; ph--; pn++; // 1<-2
andrewboyson 0:faa09bd4e6bf 26 *ph = *pn; // 0<-3
andrewboyson 0:faa09bd4e6bf 27
andrewboyson 0:faa09bd4e6bf 28 return h;
andrewboyson 0:faa09bd4e6bf 29 }
andrewboyson 0:faa09bd4e6bf 30 int64_t NetToHost64(int64_t n)
andrewboyson 0:faa09bd4e6bf 31 {
andrewboyson 0:faa09bd4e6bf 32 int64_t h;
andrewboyson 0:faa09bd4e6bf 33
andrewboyson 0:faa09bd4e6bf 34 char* pn = (char*)&n;
andrewboyson 0:faa09bd4e6bf 35 char* ph = (char*)&h + 7;
andrewboyson 0:faa09bd4e6bf 36
andrewboyson 0:faa09bd4e6bf 37 *ph = *pn; ph--; pn++; // 7<-0
andrewboyson 0:faa09bd4e6bf 38 *ph = *pn; ph--; pn++; // 6<-1
andrewboyson 0:faa09bd4e6bf 39 *ph = *pn; ph--; pn++; // 5<-2
andrewboyson 0:faa09bd4e6bf 40 *ph = *pn; ph--; pn++; // 4<-3
andrewboyson 0:faa09bd4e6bf 41 *ph = *pn; ph--; pn++; // 3<-4
andrewboyson 0:faa09bd4e6bf 42 *ph = *pn; ph--; pn++; // 2<-5
andrewboyson 0:faa09bd4e6bf 43 *ph = *pn; ph--; pn++; // 1<-6
andrewboyson 0:faa09bd4e6bf 44 *ph = *pn; // 0<-7
andrewboyson 0:faa09bd4e6bf 45
andrewboyson 0:faa09bd4e6bf 46 return h;
andrewboyson 0:faa09bd4e6bf 47 }
andrewboyson 0:faa09bd4e6bf 48 uint16_t onesComplement(uint16_t start, int count, void* pData)
andrewboyson 0:faa09bd4e6bf 49 {
andrewboyson 0:faa09bd4e6bf 50 uint32_t sum = start; //Initialise the 32 bit accumulator with the last sum
andrewboyson 0:faa09bd4e6bf 51 uint16_t* p = (uint16_t*)pData; //Set up a 16 bit pointer for the data
andrewboyson 0:faa09bd4e6bf 52
andrewboyson 0:faa09bd4e6bf 53 while(count > 1)
andrewboyson 0:faa09bd4e6bf 54 {
andrewboyson 0:faa09bd4e6bf 55 sum += *p++; // Add each pair of bytes into 32 bit accumulator
andrewboyson 0:faa09bd4e6bf 56 count -= 2;
andrewboyson 0:faa09bd4e6bf 57 }
andrewboyson 0:faa09bd4e6bf 58 if(count) sum += * (uint8_t*) p; // Add left-over byte, if any
andrewboyson 0:faa09bd4e6bf 59 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 60 return sum;
andrewboyson 0:faa09bd4e6bf 61 }
andrewboyson 0:faa09bd4e6bf 62 uint16_t NetCheckSumTwo(int count1, void* pData1, int count2, void* pData2)
andrewboyson 0:faa09bd4e6bf 63 {
andrewboyson 0:faa09bd4e6bf 64 uint16_t sum = onesComplement(0, count1, pData1);
andrewboyson 0:faa09bd4e6bf 65 return ~onesComplement(sum, count2, pData2);
andrewboyson 0:faa09bd4e6bf 66 }
andrewboyson 0:faa09bd4e6bf 67 uint16_t NetCheckSum(int count, void* pData)
andrewboyson 0:faa09bd4e6bf 68 {
andrewboyson 0:faa09bd4e6bf 69 return ~onesComplement(0, count, pData);
andrewboyson 0:faa09bd4e6bf 70 }