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:
Fri Jul 19 17:48:06 2019 +0000
Revision:
151:bde6f7da1755
Parent:
143:8cec8f08dc54
Child:
172:9bc3c7b2cca1
Removed private key and certificate from semihost storage as found to be unreliable (though secure) and moved it into flash storage (reliable, simple, but visible on mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 61:aad055f1b0d1 1 #include <stdbool.h>
andrewboyson 61:aad055f1b0d1 2 #include <string.h>
andrewboyson 61:aad055f1b0d1 3 #include <stdio.h>
andrewboyson 61:aad055f1b0d1 4
andrewboyson 60:1d8c7a1e7483 5 #include "log.h"
andrewboyson 60:1d8c7a1e7483 6 #include "net.h"
andrewboyson 60:1d8c7a1e7483 7 #include "action.h"
andrewboyson 60:1d8c7a1e7483 8 #include "eth.h"
andrewboyson 60:1d8c7a1e7483 9 #include "http.h"
andrewboyson 60:1d8c7a1e7483 10
andrewboyson 60:1d8c7a1e7483 11 char MacLocal[6];
andrewboyson 60:1d8c7a1e7483 12 void MacClear(char* mac)
andrewboyson 60:1d8c7a1e7483 13 {
andrewboyson 60:1d8c7a1e7483 14 memset(mac, 0, 6);
andrewboyson 60:1d8c7a1e7483 15 }
andrewboyson 143:8cec8f08dc54 16 void MacCopy(char* macTo, const char* macFrom)
andrewboyson 60:1d8c7a1e7483 17 {
andrewboyson 60:1d8c7a1e7483 18 memcpy(macTo, macFrom, 6);
andrewboyson 60:1d8c7a1e7483 19 }
andrewboyson 143:8cec8f08dc54 20 bool MacIsSame(const char* macA, const char* macB)
andrewboyson 60:1d8c7a1e7483 21 {
andrewboyson 60:1d8c7a1e7483 22 return memcmp(macA, macB, 6) == 0;
andrewboyson 60:1d8c7a1e7483 23 }
andrewboyson 143:8cec8f08dc54 24 bool MacIsEmpty(const char* mac)
andrewboyson 60:1d8c7a1e7483 25 {
andrewboyson 60:1d8c7a1e7483 26 if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 27 mac++; if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 28 mac++; if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 29 mac++; if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 30 mac++; if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 31 mac++; if (*mac) return false;
andrewboyson 60:1d8c7a1e7483 32 return true;
andrewboyson 60:1d8c7a1e7483 33 }
andrewboyson 60:1d8c7a1e7483 34
andrewboyson 143:8cec8f08dc54 35 int MacToString(const char* mac, int size, char* text)
andrewboyson 60:1d8c7a1e7483 36 {
andrewboyson 60:1d8c7a1e7483 37 return snprintf(text, size, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 60:1d8c7a1e7483 38 }
andrewboyson 143:8cec8f08dc54 39 int MacLog(const char* mac)
andrewboyson 60:1d8c7a1e7483 40 {
andrewboyson 60:1d8c7a1e7483 41 return LogF("%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 60:1d8c7a1e7483 42 }
andrewboyson 143:8cec8f08dc54 43 int MacHttp(const char* mac)
andrewboyson 60:1d8c7a1e7483 44 {
andrewboyson 60:1d8c7a1e7483 45 return HttpAddF("%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 60:1d8c7a1e7483 46 }
andrewboyson 60:1d8c7a1e7483 47
andrewboyson 143:8cec8f08dc54 48 int MacAccept(const char* p)
andrewboyson 60:1d8c7a1e7483 49 {
andrewboyson 60:1d8c7a1e7483 50 switch (*p)
andrewboyson 60:1d8c7a1e7483 51 {
andrewboyson 60:1d8c7a1e7483 52 case 0xff: //Broadcast
andrewboyson 60:1d8c7a1e7483 53 {
andrewboyson 60:1d8c7a1e7483 54 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 55 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 56 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 57 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 58 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 59 return BROADCAST;
andrewboyson 60:1d8c7a1e7483 60 }
andrewboyson 60:1d8c7a1e7483 61 case 0x01: //Multicast IP4
andrewboyson 60:1d8c7a1e7483 62 {
andrewboyson 105:ef2dd21d808c 63 p++; if (*p != 0x00) return DO_NOTHING; //01 00
andrewboyson 105:ef2dd21d808c 64 p++; if (*p != 0x5e) return DO_NOTHING; //01 00 5E
andrewboyson 105:ef2dd21d808c 65 p++; if (*p != 0x00) return DO_NOTHING; //01 00 5E 00
andrewboyson 60:1d8c7a1e7483 66 p++;
andrewboyson 105:ef2dd21d808c 67 switch (*p)
andrewboyson 60:1d8c7a1e7483 68 {
andrewboyson 105:ef2dd21d808c 69 case 0x00: //01 00 5E 00 00
andrewboyson 105:ef2dd21d808c 70 p++;
andrewboyson 105:ef2dd21d808c 71 switch (*p) //01 00 5E 00 00 xx
andrewboyson 105:ef2dd21d808c 72 {
andrewboyson 105:ef2dd21d808c 73 case 0x01: return MULTICAST_NODE;
andrewboyson 105:ef2dd21d808c 74 case 0x02: return MULTICAST_ROUTER;
andrewboyson 105:ef2dd21d808c 75 case 0xfb: return MULTICAST_MDNS;
andrewboyson 105:ef2dd21d808c 76 case 0xfc: return MULTICAST_LLMNR;
andrewboyson 105:ef2dd21d808c 77 default: return DO_NOTHING;
andrewboyson 105:ef2dd21d808c 78 }
andrewboyson 105:ef2dd21d808c 79 case 0x01: //01 00 5E 00 01
andrewboyson 105:ef2dd21d808c 80 p++;
andrewboyson 105:ef2dd21d808c 81 switch (*p) //01 00 5E 00 01 xx
andrewboyson 105:ef2dd21d808c 82 {
andrewboyson 105:ef2dd21d808c 83 case 0x01: return MULTICAST_NTP;
andrewboyson 105:ef2dd21d808c 84 default: return DO_NOTHING;
andrewboyson 105:ef2dd21d808c 85 }
andrewboyson 105:ef2dd21d808c 86 default: return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 87 }
andrewboyson 60:1d8c7a1e7483 88 }
andrewboyson 60:1d8c7a1e7483 89 case 0x33: //Multicast IP6
andrewboyson 60:1d8c7a1e7483 90 {
andrewboyson 60:1d8c7a1e7483 91 p++; if (*p != 0x33) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 92 p++;
andrewboyson 60:1d8c7a1e7483 93 switch (*p) //33 33
andrewboyson 60:1d8c7a1e7483 94 {
andrewboyson 60:1d8c7a1e7483 95 case 0x00: //33 33 00 Special address
andrewboyson 60:1d8c7a1e7483 96 {
andrewboyson 60:1d8c7a1e7483 97 p++;
andrewboyson 60:1d8c7a1e7483 98 switch (*p)
andrewboyson 60:1d8c7a1e7483 99 {
andrewboyson 60:1d8c7a1e7483 100 case 0x00: //33 33 00 00
andrewboyson 60:1d8c7a1e7483 101 {
andrewboyson 105:ef2dd21d808c 102 p++;
andrewboyson 105:ef2dd21d808c 103 switch (*p)
andrewboyson 60:1d8c7a1e7483 104 {
andrewboyson 105:ef2dd21d808c 105 case 0x00:
andrewboyson 105:ef2dd21d808c 106 p++;
andrewboyson 105:ef2dd21d808c 107 switch (*p) //33 33 00 00 00 xx
andrewboyson 105:ef2dd21d808c 108 {
andrewboyson 105:ef2dd21d808c 109 case 0x01: return MULTICAST_NODE;
andrewboyson 105:ef2dd21d808c 110 case 0x02: return MULTICAST_ROUTER;
andrewboyson 105:ef2dd21d808c 111 case 0xfb: return MULTICAST_MDNS;
andrewboyson 105:ef2dd21d808c 112 default: return DO_NOTHING;
andrewboyson 105:ef2dd21d808c 113 }
andrewboyson 105:ef2dd21d808c 114 case 0x01:
andrewboyson 105:ef2dd21d808c 115 p++;
andrewboyson 105:ef2dd21d808c 116 switch (*p) //33 33 00 00 01 xx
andrewboyson 105:ef2dd21d808c 117 {
andrewboyson 105:ef2dd21d808c 118 case 0x01: return MULTICAST_NTP;
andrewboyson 105:ef2dd21d808c 119 default: return DO_NOTHING;
andrewboyson 105:ef2dd21d808c 120 }
andrewboyson 105:ef2dd21d808c 121 default: return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 122 }
andrewboyson 60:1d8c7a1e7483 123 }
andrewboyson 60:1d8c7a1e7483 124 case 0x01: //33 33 00 01
andrewboyson 60:1d8c7a1e7483 125 {
andrewboyson 60:1d8c7a1e7483 126 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 127 p++;
andrewboyson 60:1d8c7a1e7483 128 switch (*p) //33 33 00 01 00 xx
andrewboyson 60:1d8c7a1e7483 129 {
andrewboyson 60:1d8c7a1e7483 130 case 0x03: return MULTICAST_LLMNR;
andrewboyson 60:1d8c7a1e7483 131 default: return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 132 }
andrewboyson 60:1d8c7a1e7483 133 }
andrewboyson 60:1d8c7a1e7483 134 default: return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 135 }
andrewboyson 60:1d8c7a1e7483 136 }
andrewboyson 60:1d8c7a1e7483 137 case 0xff: //33 33 FF LL LL LL Solicited address
andrewboyson 60:1d8c7a1e7483 138 {
andrewboyson 60:1d8c7a1e7483 139 char* q = MacLocal + 3;
andrewboyson 60:1d8c7a1e7483 140 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 141 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 142 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 143 return SOLICITED_NODE;
andrewboyson 60:1d8c7a1e7483 144 }
andrewboyson 60:1d8c7a1e7483 145 default: return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 146 }
andrewboyson 60:1d8c7a1e7483 147 }
andrewboyson 60:1d8c7a1e7483 148 default: //Unicast to me
andrewboyson 60:1d8c7a1e7483 149 {
andrewboyson 60:1d8c7a1e7483 150 char* q = MacLocal;
andrewboyson 60:1d8c7a1e7483 151 if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 152 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 153 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 154 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 155 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 156 p++; if (*p != *q) return DO_NOTHING;
andrewboyson 60:1d8c7a1e7483 157 return UNICAST;
andrewboyson 60:1d8c7a1e7483 158 }
andrewboyson 60:1d8c7a1e7483 159 }
andrewboyson 60:1d8c7a1e7483 160 }
andrewboyson 60:1d8c7a1e7483 161
andrewboyson 60:1d8c7a1e7483 162 void MacMakeFromDest(int dest, int pro, char* p)
andrewboyson 60:1d8c7a1e7483 163 {
andrewboyson 60:1d8c7a1e7483 164 if (dest == BROADCAST) { *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p = 0xff; return; }
andrewboyson 60:1d8c7a1e7483 165
andrewboyson 60:1d8c7a1e7483 166 if (pro == IPV4)
andrewboyson 60:1d8c7a1e7483 167 {
andrewboyson 60:1d8c7a1e7483 168 switch (dest)
andrewboyson 60:1d8c7a1e7483 169 {
andrewboyson 60:1d8c7a1e7483 170 case MULTICAST_NODE: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0x01; break;
andrewboyson 60:1d8c7a1e7483 171 case MULTICAST_ROUTER: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
andrewboyson 60:1d8c7a1e7483 172 case MULTICAST_MDNS: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
andrewboyson 60:1d8c7a1e7483 173 case MULTICAST_LLMNR: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfc; break;
andrewboyson 105:ef2dd21d808c 174 case MULTICAST_NTP: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x01; *p = 0x01; break;
andrewboyson 60:1d8c7a1e7483 175 }
andrewboyson 60:1d8c7a1e7483 176 }
andrewboyson 60:1d8c7a1e7483 177 else
andrewboyson 60:1d8c7a1e7483 178 {
andrewboyson 60:1d8c7a1e7483 179 switch (dest)
andrewboyson 60:1d8c7a1e7483 180 {
andrewboyson 60:1d8c7a1e7483 181 case MULTICAST_NODE: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0x01; break;
andrewboyson 60:1d8c7a1e7483 182 case MULTICAST_ROUTER: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
andrewboyson 60:1d8c7a1e7483 183 case MULTICAST_MDNS: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
andrewboyson 60:1d8c7a1e7483 184 case MULTICAST_LLMNR: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x01; *p++ = 0x00; *p = 0x03; break;
andrewboyson 105:ef2dd21d808c 185 case MULTICAST_NTP: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x01; *p = 0x01; break;
andrewboyson 60:1d8c7a1e7483 186 }
andrewboyson 60:1d8c7a1e7483 187 }
andrewboyson 60:1d8c7a1e7483 188 }