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
eth/mac.cpp@13:9cd54f7db57a, 2017-05-01 (annotated)
- Committer:
- andrewboyson
- Date:
- Mon May 01 18:20:55 2017 +0000
- Revision:
- 13:9cd54f7db57a
- Child:
- 14:e75a59c1123d
Added ability to read DNS queries with encoded IP addresses
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 13:9cd54f7db57a | 1 | #include "mbed.h" |
andrewboyson | 13:9cd54f7db57a | 2 | #include "eth.h" |
andrewboyson | 13:9cd54f7db57a | 3 | |
andrewboyson | 13:9cd54f7db57a | 4 | char MacLocal[6]; |
andrewboyson | 13:9cd54f7db57a | 5 | |
andrewboyson | 13:9cd54f7db57a | 6 | bool MacCompareBroadcast(char* p) |
andrewboyson | 13:9cd54f7db57a | 7 | { |
andrewboyson | 13:9cd54f7db57a | 8 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 9 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 10 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 11 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 12 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 13 | if (*p != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 14 | return true; |
andrewboyson | 13:9cd54f7db57a | 15 | } |
andrewboyson | 13:9cd54f7db57a | 16 | bool MacCompareUnicastLocal(char* p) |
andrewboyson | 13:9cd54f7db57a | 17 | { |
andrewboyson | 13:9cd54f7db57a | 18 | return memcmp(p, MacLocal, 6) == 0; |
andrewboyson | 13:9cd54f7db57a | 19 | } |
andrewboyson | 13:9cd54f7db57a | 20 | bool MacCompareMulticastLocal4(char* p) |
andrewboyson | 13:9cd54f7db57a | 21 | { |
andrewboyson | 13:9cd54f7db57a | 22 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 23 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 24 | if (*p++ != 0x5e) return false; |
andrewboyson | 13:9cd54f7db57a | 25 | char* q = MacLocal + 3; |
andrewboyson | 13:9cd54f7db57a | 26 | if (*p++ != *q++) return false; |
andrewboyson | 13:9cd54f7db57a | 27 | if (*p++ != *q++) return false; |
andrewboyson | 13:9cd54f7db57a | 28 | if (*p != *q ) return false; |
andrewboyson | 13:9cd54f7db57a | 29 | return true; |
andrewboyson | 13:9cd54f7db57a | 30 | } |
andrewboyson | 13:9cd54f7db57a | 31 | bool MacCompareMulticastLocal6(char* p) |
andrewboyson | 13:9cd54f7db57a | 32 | { |
andrewboyson | 13:9cd54f7db57a | 33 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 34 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 35 | if (*p++ != 0xff) return false; |
andrewboyson | 13:9cd54f7db57a | 36 | char* q = MacLocal + 3; |
andrewboyson | 13:9cd54f7db57a | 37 | if (*p++ != *q++) return false; |
andrewboyson | 13:9cd54f7db57a | 38 | if (*p++ != *q++) return false; |
andrewboyson | 13:9cd54f7db57a | 39 | if (*p != *q ) return false; |
andrewboyson | 13:9cd54f7db57a | 40 | return true; |
andrewboyson | 13:9cd54f7db57a | 41 | } |
andrewboyson | 13:9cd54f7db57a | 42 | bool MacCompareMulticastAllNodes4(char* p) |
andrewboyson | 13:9cd54f7db57a | 43 | { |
andrewboyson | 13:9cd54f7db57a | 44 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 45 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 46 | if (*p++ != 0x5e) return false; |
andrewboyson | 13:9cd54f7db57a | 47 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 48 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 49 | if (*p != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 50 | return true; |
andrewboyson | 13:9cd54f7db57a | 51 | } |
andrewboyson | 13:9cd54f7db57a | 52 | bool MacCompareMulticastAllNodes6(char* p) |
andrewboyson | 13:9cd54f7db57a | 53 | { |
andrewboyson | 13:9cd54f7db57a | 54 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 55 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 56 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 57 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 58 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 59 | if (*p != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 60 | return true; |
andrewboyson | 13:9cd54f7db57a | 61 | } |
andrewboyson | 13:9cd54f7db57a | 62 | bool MacCompareMulticastAllRouters4(char* p) |
andrewboyson | 13:9cd54f7db57a | 63 | { |
andrewboyson | 13:9cd54f7db57a | 64 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 65 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 66 | if (*p++ != 0x5e) return false; |
andrewboyson | 13:9cd54f7db57a | 67 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 68 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 69 | if (*p != 0x02) return false; |
andrewboyson | 13:9cd54f7db57a | 70 | return true; |
andrewboyson | 13:9cd54f7db57a | 71 | } |
andrewboyson | 13:9cd54f7db57a | 72 | bool MacCompareMulticastAllRouters6(char* p) |
andrewboyson | 13:9cd54f7db57a | 73 | { |
andrewboyson | 13:9cd54f7db57a | 74 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 75 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 76 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 77 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 78 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 79 | if (*p != 0x02) return false; |
andrewboyson | 13:9cd54f7db57a | 80 | return true; |
andrewboyson | 13:9cd54f7db57a | 81 | } |
andrewboyson | 13:9cd54f7db57a | 82 | bool MacCompareMulticastMdns4(char* p) |
andrewboyson | 13:9cd54f7db57a | 83 | { |
andrewboyson | 13:9cd54f7db57a | 84 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 85 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 86 | if (*p++ != 0x5e) return false; |
andrewboyson | 13:9cd54f7db57a | 87 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 88 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 89 | if (*p != 0xfb) return false; |
andrewboyson | 13:9cd54f7db57a | 90 | return true; |
andrewboyson | 13:9cd54f7db57a | 91 | } |
andrewboyson | 13:9cd54f7db57a | 92 | bool MacCompareMulticastMdns6(char* p) |
andrewboyson | 13:9cd54f7db57a | 93 | { |
andrewboyson | 13:9cd54f7db57a | 94 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 95 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 96 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 97 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 98 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 99 | if (*p != 0xfb) return false; |
andrewboyson | 13:9cd54f7db57a | 100 | return true; |
andrewboyson | 13:9cd54f7db57a | 101 | } |
andrewboyson | 13:9cd54f7db57a | 102 | bool MacCompareMulticastLlmnr4(char* p) |
andrewboyson | 13:9cd54f7db57a | 103 | { |
andrewboyson | 13:9cd54f7db57a | 104 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 105 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 106 | if (*p++ != 0x5e) return false; |
andrewboyson | 13:9cd54f7db57a | 107 | if (*p++ != 0x01) return false; |
andrewboyson | 13:9cd54f7db57a | 108 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 109 | if (*p != 0x03) return false; |
andrewboyson | 13:9cd54f7db57a | 110 | return true; |
andrewboyson | 13:9cd54f7db57a | 111 | } |
andrewboyson | 13:9cd54f7db57a | 112 | bool MacCompareMulticastLlmnr6(char* p) |
andrewboyson | 13:9cd54f7db57a | 113 | { |
andrewboyson | 13:9cd54f7db57a | 114 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 115 | if (*p++ != 0x33) return false; |
andrewboyson | 13:9cd54f7db57a | 116 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 117 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 118 | if (*p++ != 0x00) return false; |
andrewboyson | 13:9cd54f7db57a | 119 | if (*p != 0xfc) return false; |
andrewboyson | 13:9cd54f7db57a | 120 | return true; |
andrewboyson | 13:9cd54f7db57a | 121 | } |
andrewboyson | 13:9cd54f7db57a | 122 | void MacMakeMulticastNode4(char* p) |
andrewboyson | 13:9cd54f7db57a | 123 | { |
andrewboyson | 13:9cd54f7db57a | 124 | *p++ = 0x01; |
andrewboyson | 13:9cd54f7db57a | 125 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 126 | *p++ = 0x5e; |
andrewboyson | 13:9cd54f7db57a | 127 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 128 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 129 | *p = 0x01; |
andrewboyson | 13:9cd54f7db57a | 130 | } |
andrewboyson | 13:9cd54f7db57a | 131 | void MacMakeMulticastNode6(char* p) |
andrewboyson | 13:9cd54f7db57a | 132 | { |
andrewboyson | 13:9cd54f7db57a | 133 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 134 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 135 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 136 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 137 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 138 | *p = 0x01; |
andrewboyson | 13:9cd54f7db57a | 139 | } |
andrewboyson | 13:9cd54f7db57a | 140 | void MacMakeMulticastRouter4(char* p) |
andrewboyson | 13:9cd54f7db57a | 141 | { |
andrewboyson | 13:9cd54f7db57a | 142 | *p++ = 0x01; |
andrewboyson | 13:9cd54f7db57a | 143 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 144 | *p++ = 0x5e; |
andrewboyson | 13:9cd54f7db57a | 145 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 146 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 147 | *p = 0x02; |
andrewboyson | 13:9cd54f7db57a | 148 | } |
andrewboyson | 13:9cd54f7db57a | 149 | void MacMakeMulticastRouter6(char* p) |
andrewboyson | 13:9cd54f7db57a | 150 | { |
andrewboyson | 13:9cd54f7db57a | 151 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 152 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 153 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 154 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 155 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 156 | *p = 0x02; |
andrewboyson | 13:9cd54f7db57a | 157 | } |
andrewboyson | 13:9cd54f7db57a | 158 | void MacMakeMulticastMdns4(char* p) |
andrewboyson | 13:9cd54f7db57a | 159 | { |
andrewboyson | 13:9cd54f7db57a | 160 | *p++ = 0x01; |
andrewboyson | 13:9cd54f7db57a | 161 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 162 | *p++ = 0x5e; |
andrewboyson | 13:9cd54f7db57a | 163 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 164 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 165 | *p = 0xfb; |
andrewboyson | 13:9cd54f7db57a | 166 | } |
andrewboyson | 13:9cd54f7db57a | 167 | void MacMakeMulticastMdns6(char* p) |
andrewboyson | 13:9cd54f7db57a | 168 | { |
andrewboyson | 13:9cd54f7db57a | 169 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 170 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 171 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 172 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 173 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 174 | *p = 0xfb; |
andrewboyson | 13:9cd54f7db57a | 175 | } |
andrewboyson | 13:9cd54f7db57a | 176 | void MacMakeMulticastLlmnr4(char* p) |
andrewboyson | 13:9cd54f7db57a | 177 | { |
andrewboyson | 13:9cd54f7db57a | 178 | *p++ = 0x01; |
andrewboyson | 13:9cd54f7db57a | 179 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 180 | *p++ = 0x5e; |
andrewboyson | 13:9cd54f7db57a | 181 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 182 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 183 | *p = 0xfc; |
andrewboyson | 13:9cd54f7db57a | 184 | } |
andrewboyson | 13:9cd54f7db57a | 185 | void MacMakeMulticastLlmnr6(char* p) |
andrewboyson | 13:9cd54f7db57a | 186 | { |
andrewboyson | 13:9cd54f7db57a | 187 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 188 | *p++ = 0x33; |
andrewboyson | 13:9cd54f7db57a | 189 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 190 | *p++ = 0x01; |
andrewboyson | 13:9cd54f7db57a | 191 | *p++ = 0x00; |
andrewboyson | 13:9cd54f7db57a | 192 | *p = 0x03; |
andrewboyson | 13:9cd54f7db57a | 193 | } |
andrewboyson | 13:9cd54f7db57a | 194 | void MacMakeBroadcast(char* p) |
andrewboyson | 13:9cd54f7db57a | 195 | { |
andrewboyson | 13:9cd54f7db57a | 196 | memset(p, 0xFF, 6); |
andrewboyson | 13:9cd54f7db57a | 197 | } |