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:
- 0:faa09bd4e6bf
- Child:
- 2:849103b5a16d
diff -r 000000000000 -r faa09bd4e6bf net.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/net.cpp Mon Jan 09 13:29:41 2017 +0000 @@ -0,0 +1,70 @@ +#include "mbed.h" + +int16_t NetToHost16(int16_t n) +{ + int16_t h; + + char* pn = (char*)&n; + char* ph = (char*)&h + 1; + + *ph = *pn; ph--; pn++; // 1<-0 + *ph = *pn; // 0<-1 + + return h; +} + +int32_t NetToHost32(int32_t n) +{ + int32_t h; + + char* pn = (char*)&n; + char* ph = (char*)&h + 3; + + *ph = *pn; ph--; pn++; // 3<-0 + *ph = *pn; ph--; pn++; // 2<-1 + *ph = *pn; ph--; pn++; // 1<-2 + *ph = *pn; // 0<-3 + + return h; +} +int64_t NetToHost64(int64_t n) +{ + int64_t h; + + char* pn = (char*)&n; + char* ph = (char*)&h + 7; + + *ph = *pn; ph--; pn++; // 7<-0 + *ph = *pn; ph--; pn++; // 6<-1 + *ph = *pn; ph--; pn++; // 5<-2 + *ph = *pn; ph--; pn++; // 4<-3 + *ph = *pn; ph--; pn++; // 3<-4 + *ph = *pn; ph--; pn++; // 2<-5 + *ph = *pn; ph--; pn++; // 1<-6 + *ph = *pn; // 0<-7 + + return h; +} +uint16_t onesComplement(uint16_t start, int count, void* pData) +{ + uint32_t sum = start; //Initialise the 32 bit accumulator with the last sum + uint16_t* p = (uint16_t*)pData; //Set up a 16 bit pointer for the data + + while(count > 1) + { + sum += *p++; // Add each pair of bytes into 32 bit accumulator + count -= 2; + } + if(count) sum += * (uint8_t*) p; // Add left-over byte, if any + while (sum>>16) sum = (sum & 0xffff) + (sum >> 16); // Add any carries from the sum back into the sum to make it ones complement + return sum; +} +uint16_t NetCheckSumTwo(int count1, void* pData1, int count2, void* pData2) +{ + uint16_t sum = onesComplement(0, count1, pData1); + return ~onesComplement(sum, count2, pData2); +} +uint16_t NetCheckSum(int count, void* pData) +{ + return ~onesComplement(0, count, pData); +}