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
net.cpp@5:5fc4ca9fbf17, 2017-02-04 (annotated)
- Committer:
- andrewboyson
- Date:
- Sat Feb 04 18:44:47 2017 +0000
- Revision:
- 5:5fc4ca9fbf17
- Parent:
- 2:849103b5a16d
- Child:
- 7:b794780e33b4
Added DNS and reverse DNS. working.
Who changed what in which revision?
User | Revision | Line number | New 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 | 5:5fc4ca9fbf17 | 108 | ArpMain(); |
andrewboyson | 2:849103b5a16d | 109 | if (ticked()) |
andrewboyson | 2:849103b5a16d | 110 | { |
andrewboyson | 2:849103b5a16d | 111 | DhcpTick(); |
andrewboyson | 2:849103b5a16d | 112 | ArpTick(); |
andrewboyson | 2:849103b5a16d | 113 | } |
andrewboyson | 2:849103b5a16d | 114 | return 0; |
andrewboyson | 2:849103b5a16d | 115 | } |