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@59:e0e556c8bd46, 2017-12-14 (annotated)
- Committer:
- andrewboyson
- Date:
- Thu Dec 14 20:55:40 2017 +0000
- Revision:
- 59:e0e556c8bd46
- Parent:
- 57:e0fb648acf48
Added buffer length to help avoid over runs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 7:b794780e33b4 | 1 | #include "mbed.h" |
andrewboyson | 59:e0e556c8bd46 | 2 | #include "link.h" |
andrewboyson | 7:b794780e33b4 | 3 | #include "net.h" |
andrewboyson | 52:fbc5a46b5e16 | 4 | #include "tcb.h" |
andrewboyson | 7:b794780e33b4 | 5 | #include "dhcp.h" |
andrewboyson | 48:952dddb74b8b | 6 | #include "ar4.h" |
andrewboyson | 48:952dddb74b8b | 7 | #include "ar6.h" |
andrewboyson | 50:492f2d2954e4 | 8 | #include "nr4.h" |
andrewboyson | 50:492f2d2954e4 | 9 | #include "nr6.h" |
andrewboyson | 7:b794780e33b4 | 10 | #include "dns.h" |
andrewboyson | 7:b794780e33b4 | 11 | #include "slaac.h" |
andrewboyson | 47:73af5c0b0dc2 | 12 | #include "ndp.h" |
andrewboyson | 22:914b970356f0 | 13 | #include "ntp.h" |
andrewboyson | 22:914b970356f0 | 14 | #include "io.h" |
andrewboyson | 57:e0fb648acf48 | 15 | #include "tftp.h" |
andrewboyson | 37:793b39683406 | 16 | |
andrewboyson | 43:bc028d5a6424 | 17 | bool NetTraceStack = false; |
andrewboyson | 43:bc028d5a6424 | 18 | bool NetTraceNewLine = false; |
andrewboyson | 43:bc028d5a6424 | 19 | bool NetTraceVerbose = false; |
andrewboyson | 59:e0e556c8bd46 | 20 | bool NetPreferIp4Polled = false; |
andrewboyson | 59:e0e556c8bd46 | 21 | const char* NetName4; |
andrewboyson | 59:e0e556c8bd46 | 22 | const char* NetName6; |
andrewboyson | 57:e0fb648acf48 | 23 | |
andrewboyson | 57:e0fb648acf48 | 24 | static bool hostMatched = false; |
andrewboyson | 57:e0fb648acf48 | 25 | bool NetTraceHostGetMatched() |
andrewboyson | 57:e0fb648acf48 | 26 | { |
andrewboyson | 57:e0fb648acf48 | 27 | return hostMatched; |
andrewboyson | 57:e0fb648acf48 | 28 | } |
andrewboyson | 57:e0fb648acf48 | 29 | void NetTraceHostResetMatched() |
andrewboyson | 57:e0fb648acf48 | 30 | { |
andrewboyson | 57:e0fb648acf48 | 31 | hostMatched = false; |
andrewboyson | 57:e0fb648acf48 | 32 | } |
andrewboyson | 59:e0e556c8bd46 | 33 | char NetTraceHost[2]; |
andrewboyson | 57:e0fb648acf48 | 34 | void NetTraceHostCheckIp6(char* ip) |
andrewboyson | 57:e0fb648acf48 | 35 | { |
andrewboyson | 57:e0fb648acf48 | 36 | if (!ip[0]) return; |
andrewboyson | 57:e0fb648acf48 | 37 | if (NetTraceHost[0] != ip[14]) return; |
andrewboyson | 57:e0fb648acf48 | 38 | if (NetTraceHost[1] != ip[15]) return; |
andrewboyson | 57:e0fb648acf48 | 39 | hostMatched = true; |
andrewboyson | 57:e0fb648acf48 | 40 | } |
andrewboyson | 57:e0fb648acf48 | 41 | void NetTraceHostCheckMac(char* mac) |
andrewboyson | 57:e0fb648acf48 | 42 | { |
andrewboyson | 57:e0fb648acf48 | 43 | if (NetTraceHost[0] != mac[4]) return; |
andrewboyson | 57:e0fb648acf48 | 44 | if (NetTraceHost[1] != mac[5]) return; |
andrewboyson | 57:e0fb648acf48 | 45 | hostMatched = true; |
andrewboyson | 57:e0fb648acf48 | 46 | } |
andrewboyson | 0:faa09bd4e6bf | 47 | int16_t NetToHost16(int16_t n) |
andrewboyson | 0:faa09bd4e6bf | 48 | { |
andrewboyson | 0:faa09bd4e6bf | 49 | int16_t h; |
andrewboyson | 0:faa09bd4e6bf | 50 | |
andrewboyson | 0:faa09bd4e6bf | 51 | char* pn = (char*)&n; |
andrewboyson | 0:faa09bd4e6bf | 52 | char* ph = (char*)&h + 1; |
andrewboyson | 0:faa09bd4e6bf | 53 | |
andrewboyson | 0:faa09bd4e6bf | 54 | *ph = *pn; ph--; pn++; // 1<-0 |
andrewboyson | 0:faa09bd4e6bf | 55 | *ph = *pn; // 0<-1 |
andrewboyson | 0:faa09bd4e6bf | 56 | |
andrewboyson | 0:faa09bd4e6bf | 57 | return h; |
andrewboyson | 0:faa09bd4e6bf | 58 | } |
andrewboyson | 0:faa09bd4e6bf | 59 | |
andrewboyson | 0:faa09bd4e6bf | 60 | int32_t NetToHost32(int32_t n) |
andrewboyson | 0:faa09bd4e6bf | 61 | { |
andrewboyson | 0:faa09bd4e6bf | 62 | int32_t h; |
andrewboyson | 0:faa09bd4e6bf | 63 | |
andrewboyson | 0:faa09bd4e6bf | 64 | char* pn = (char*)&n; |
andrewboyson | 0:faa09bd4e6bf | 65 | char* ph = (char*)&h + 3; |
andrewboyson | 0:faa09bd4e6bf | 66 | |
andrewboyson | 0:faa09bd4e6bf | 67 | *ph = *pn; ph--; pn++; // 3<-0 |
andrewboyson | 0:faa09bd4e6bf | 68 | *ph = *pn; ph--; pn++; // 2<-1 |
andrewboyson | 0:faa09bd4e6bf | 69 | *ph = *pn; ph--; pn++; // 1<-2 |
andrewboyson | 0:faa09bd4e6bf | 70 | *ph = *pn; // 0<-3 |
andrewboyson | 0:faa09bd4e6bf | 71 | |
andrewboyson | 0:faa09bd4e6bf | 72 | return h; |
andrewboyson | 0:faa09bd4e6bf | 73 | } |
andrewboyson | 0:faa09bd4e6bf | 74 | int64_t NetToHost64(int64_t n) |
andrewboyson | 0:faa09bd4e6bf | 75 | { |
andrewboyson | 0:faa09bd4e6bf | 76 | int64_t h; |
andrewboyson | 0:faa09bd4e6bf | 77 | |
andrewboyson | 0:faa09bd4e6bf | 78 | char* pn = (char*)&n; |
andrewboyson | 0:faa09bd4e6bf | 79 | char* ph = (char*)&h + 7; |
andrewboyson | 0:faa09bd4e6bf | 80 | |
andrewboyson | 0:faa09bd4e6bf | 81 | *ph = *pn; ph--; pn++; // 7<-0 |
andrewboyson | 0:faa09bd4e6bf | 82 | *ph = *pn; ph--; pn++; // 6<-1 |
andrewboyson | 0:faa09bd4e6bf | 83 | *ph = *pn; ph--; pn++; // 5<-2 |
andrewboyson | 0:faa09bd4e6bf | 84 | *ph = *pn; ph--; pn++; // 4<-3 |
andrewboyson | 0:faa09bd4e6bf | 85 | *ph = *pn; ph--; pn++; // 3<-4 |
andrewboyson | 0:faa09bd4e6bf | 86 | *ph = *pn; ph--; pn++; // 2<-5 |
andrewboyson | 0:faa09bd4e6bf | 87 | *ph = *pn; ph--; pn++; // 1<-6 |
andrewboyson | 0:faa09bd4e6bf | 88 | *ph = *pn; // 0<-7 |
andrewboyson | 0:faa09bd4e6bf | 89 | |
andrewboyson | 0:faa09bd4e6bf | 90 | return h; |
andrewboyson | 0:faa09bd4e6bf | 91 | } |
andrewboyson | 0:faa09bd4e6bf | 92 | uint16_t onesComplement(uint16_t start, int count, void* pData) |
andrewboyson | 0:faa09bd4e6bf | 93 | { |
andrewboyson | 0:faa09bd4e6bf | 94 | uint32_t sum = start; //Initialise the 32 bit accumulator with the last sum |
andrewboyson | 0:faa09bd4e6bf | 95 | uint16_t* p = (uint16_t*)pData; //Set up a 16 bit pointer for the data |
andrewboyson | 0:faa09bd4e6bf | 96 | |
andrewboyson | 0:faa09bd4e6bf | 97 | while(count > 1) |
andrewboyson | 0:faa09bd4e6bf | 98 | { |
andrewboyson | 0:faa09bd4e6bf | 99 | sum += *p++; // Add each pair of bytes into 32 bit accumulator |
andrewboyson | 0:faa09bd4e6bf | 100 | count -= 2; |
andrewboyson | 0:faa09bd4e6bf | 101 | } |
andrewboyson | 0:faa09bd4e6bf | 102 | if(count) sum += * (uint8_t*) p; // Add left-over byte, if any |
andrewboyson | 0:faa09bd4e6bf | 103 | 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 | 104 | return sum; |
andrewboyson | 0:faa09bd4e6bf | 105 | } |
andrewboyson | 0:faa09bd4e6bf | 106 | uint16_t NetCheckSumTwo(int count1, void* pData1, int count2, void* pData2) |
andrewboyson | 0:faa09bd4e6bf | 107 | { |
andrewboyson | 0:faa09bd4e6bf | 108 | uint16_t sum = onesComplement(0, count1, pData1); |
andrewboyson | 0:faa09bd4e6bf | 109 | return ~onesComplement(sum, count2, pData2); |
andrewboyson | 0:faa09bd4e6bf | 110 | } |
andrewboyson | 0:faa09bd4e6bf | 111 | uint16_t NetCheckSum(int count, void* pData) |
andrewboyson | 0:faa09bd4e6bf | 112 | { |
andrewboyson | 0:faa09bd4e6bf | 113 | return ~onesComplement(0, count, pData); |
andrewboyson | 0:faa09bd4e6bf | 114 | } |
andrewboyson | 2:849103b5a16d | 115 | |
andrewboyson | 59:e0e556c8bd46 | 116 | int NetInit(const char* name4, const char* name6) |
andrewboyson | 59:e0e556c8bd46 | 117 | { |
andrewboyson | 44:83ce5ace337b | 118 | NetName4 = name4; |
andrewboyson | 44:83ce5ace337b | 119 | NetName6 = name6; |
andrewboyson | 59:e0e556c8bd46 | 120 | LinkInit(); |
andrewboyson | 52:fbc5a46b5e16 | 121 | TcbInit(); |
andrewboyson | 48:952dddb74b8b | 122 | Ar4Init(); |
andrewboyson | 48:952dddb74b8b | 123 | Ar6Init(); |
andrewboyson | 50:492f2d2954e4 | 124 | Nr4Init(); |
andrewboyson | 50:492f2d2954e4 | 125 | Nr6Init(); |
andrewboyson | 30:e34173b7585c | 126 | SlaacInit(); |
andrewboyson | 2:849103b5a16d | 127 | return 0; |
andrewboyson | 2:849103b5a16d | 128 | } |
andrewboyson | 2:849103b5a16d | 129 | int NetMain() |
andrewboyson | 2:849103b5a16d | 130 | { |
andrewboyson | 59:e0e556c8bd46 | 131 | LinkMain(); |
andrewboyson | 57:e0fb648acf48 | 132 | TcbMain(); |
andrewboyson | 57:e0fb648acf48 | 133 | Ar4Main(); |
andrewboyson | 57:e0fb648acf48 | 134 | Ar6Main(); |
andrewboyson | 57:e0fb648acf48 | 135 | Nr4Main(); |
andrewboyson | 57:e0fb648acf48 | 136 | Nr6Main(); |
andrewboyson | 52:fbc5a46b5e16 | 137 | DhcpMain(); |
andrewboyson | 57:e0fb648acf48 | 138 | DnsMain(); |
andrewboyson | 57:e0fb648acf48 | 139 | NdpMain(); |
andrewboyson | 57:e0fb648acf48 | 140 | TftpMain(); |
andrewboyson | 2:849103b5a16d | 141 | return 0; |
andrewboyson | 2:849103b5a16d | 142 | } |