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 Sep 22 13:55:56 2017 +0000
Revision:
35:93c39d260a83
Parent:
14:e75a59c1123d
Child:
36:900e24b27bfb
Added name resolution and address resolution

Who changed what in which revision?

UserRevisionLine numberNew contents of line
andrewboyson 13:9cd54f7db57a 1 #include "mbed.h"
andrewboyson 14:e75a59c1123d 2 #include "net.h"
andrewboyson 14:e75a59c1123d 3 #include "eth.h"
andrewboyson 13:9cd54f7db57a 4
andrewboyson 13:9cd54f7db57a 5 char MacLocal[6];
andrewboyson 13:9cd54f7db57a 6
andrewboyson 35:93c39d260a83 7 bool MacIsEmpty(char* mac)
andrewboyson 35:93c39d260a83 8 {
andrewboyson 35:93c39d260a83 9 if (*mac) return false;
andrewboyson 35:93c39d260a83 10 mac++; if (*mac) return false;
andrewboyson 35:93c39d260a83 11 mac++; if (*mac) return false;
andrewboyson 35:93c39d260a83 12 mac++; if (*mac) return false;
andrewboyson 35:93c39d260a83 13 mac++; if (*mac) return false;
andrewboyson 35:93c39d260a83 14 mac++; if (*mac) return false;
andrewboyson 35:93c39d260a83 15 return true;
andrewboyson 35:93c39d260a83 16 }
andrewboyson 35:93c39d260a83 17
andrewboyson 14:e75a59c1123d 18 int MacToString(char* mac, int size, char* text)
andrewboyson 13:9cd54f7db57a 19 {
andrewboyson 14:e75a59c1123d 20 return snprintf(text, size, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
andrewboyson 13:9cd54f7db57a 21 }
andrewboyson 14:e75a59c1123d 22
andrewboyson 14:e75a59c1123d 23 int MacAccept(char* p)
andrewboyson 13:9cd54f7db57a 24 {
andrewboyson 14:e75a59c1123d 25 switch (*p)
andrewboyson 14:e75a59c1123d 26 {
andrewboyson 14:e75a59c1123d 27 case 0xff: //Broadcast
andrewboyson 14:e75a59c1123d 28 {
andrewboyson 14:e75a59c1123d 29 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 30 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 31 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 32 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 33 p++; if (*p != 0xff) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 34 return BROADCAST;
andrewboyson 14:e75a59c1123d 35 }
andrewboyson 14:e75a59c1123d 36 case 0x01: //Multicast IP4
andrewboyson 14:e75a59c1123d 37 {
andrewboyson 14:e75a59c1123d 38 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 39 p++; if (*p != 0x5e) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 40 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 41 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 42 p++;
andrewboyson 14:e75a59c1123d 43 switch (*p) //01 00 5E 00 00 xx
andrewboyson 14:e75a59c1123d 44 {
andrewboyson 14:e75a59c1123d 45 case 0x01: return MULTICAST_NODE;
andrewboyson 14:e75a59c1123d 46 case 0x02: return MULTICAST_ROUTER;
andrewboyson 14:e75a59c1123d 47 case 0xfb: return MULTICAST_MDNS;
andrewboyson 14:e75a59c1123d 48 case 0xfc: return MULTICAST_LLMNR;
andrewboyson 14:e75a59c1123d 49 default: return DO_NOTHING;
andrewboyson 14:e75a59c1123d 50 }
andrewboyson 14:e75a59c1123d 51 }
andrewboyson 14:e75a59c1123d 52 case 0x33: //Multicast IP6
andrewboyson 14:e75a59c1123d 53 {
andrewboyson 14:e75a59c1123d 54 p++; if (*p != 0x33) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 55 p++;
andrewboyson 14:e75a59c1123d 56 switch (*p) //33 33
andrewboyson 14:e75a59c1123d 57 {
andrewboyson 14:e75a59c1123d 58 case 0x00: //33 33 00 Special address
andrewboyson 14:e75a59c1123d 59 {
andrewboyson 14:e75a59c1123d 60 p++;
andrewboyson 14:e75a59c1123d 61 switch (*p)
andrewboyson 14:e75a59c1123d 62 {
andrewboyson 14:e75a59c1123d 63 case 0x00: //33 33 00 00
andrewboyson 14:e75a59c1123d 64 {
andrewboyson 14:e75a59c1123d 65 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 66 p++;
andrewboyson 14:e75a59c1123d 67 switch (*p) //33 33 00 00 00 xx
andrewboyson 14:e75a59c1123d 68 {
andrewboyson 14:e75a59c1123d 69 case 0x01: return MULTICAST_NODE;
andrewboyson 14:e75a59c1123d 70 case 0x02: return MULTICAST_ROUTER;
andrewboyson 14:e75a59c1123d 71 case 0xfb: return MULTICAST_MDNS;
andrewboyson 14:e75a59c1123d 72 default: return DO_NOTHING;
andrewboyson 14:e75a59c1123d 73 }
andrewboyson 14:e75a59c1123d 74 }
andrewboyson 14:e75a59c1123d 75 case 0x01: //33 33 00 01
andrewboyson 14:e75a59c1123d 76 {
andrewboyson 14:e75a59c1123d 77 p++; if (*p != 0x00) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 78 p++;
andrewboyson 14:e75a59c1123d 79 switch (*p) //33 33 00 01 00 xx
andrewboyson 14:e75a59c1123d 80 {
andrewboyson 14:e75a59c1123d 81 case 0x03: return MULTICAST_LLMNR;
andrewboyson 14:e75a59c1123d 82 default: return DO_NOTHING;
andrewboyson 14:e75a59c1123d 83 }
andrewboyson 14:e75a59c1123d 84 }
andrewboyson 14:e75a59c1123d 85 default: return DO_NOTHING;
andrewboyson 14:e75a59c1123d 86 }
andrewboyson 14:e75a59c1123d 87 }
andrewboyson 14:e75a59c1123d 88 case 0xff: //33 33 FF LL LL LL Solicited address
andrewboyson 14:e75a59c1123d 89 {
andrewboyson 14:e75a59c1123d 90 char* q = MacLocal + 3;
andrewboyson 14:e75a59c1123d 91 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 92 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 93 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 94 return SOLICITED_NODE;
andrewboyson 14:e75a59c1123d 95 }
andrewboyson 14:e75a59c1123d 96 default: return DO_NOTHING;
andrewboyson 14:e75a59c1123d 97 }
andrewboyson 14:e75a59c1123d 98 }
andrewboyson 14:e75a59c1123d 99 default: //Unicast to me
andrewboyson 14:e75a59c1123d 100 {
andrewboyson 14:e75a59c1123d 101 char* q = MacLocal;
andrewboyson 14:e75a59c1123d 102 if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 103 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 104 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 105 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 106 p++; if (*p != *q++) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 107 p++; if (*p != *q) return DO_NOTHING;
andrewboyson 14:e75a59c1123d 108 return UNICAST;
andrewboyson 14:e75a59c1123d 109 }
andrewboyson 14:e75a59c1123d 110 }
andrewboyson 13:9cd54f7db57a 111 }
andrewboyson 14:e75a59c1123d 112
andrewboyson 14:e75a59c1123d 113 void MacMake(int action, int pro, char* p)
andrewboyson 13:9cd54f7db57a 114 {
andrewboyson 14:e75a59c1123d 115 if (action == BROADCAST) { *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p++ = 0xff; *p = 0xff; return; }
andrewboyson 14:e75a59c1123d 116 if (pro == IPV4)
andrewboyson 14:e75a59c1123d 117 {
andrewboyson 14:e75a59c1123d 118 switch (action)
andrewboyson 14:e75a59c1123d 119 {
andrewboyson 14:e75a59c1123d 120 case MULTICAST_NODE: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0x01; break;
andrewboyson 14:e75a59c1123d 121 case MULTICAST_ROUTER: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
andrewboyson 14:e75a59c1123d 122 case MULTICAST_MDNS: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
andrewboyson 14:e75a59c1123d 123 case MULTICAST_LLMNR: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfc; break;
andrewboyson 14:e75a59c1123d 124 }
andrewboyson 14:e75a59c1123d 125 }
andrewboyson 14:e75a59c1123d 126 else
andrewboyson 14:e75a59c1123d 127 {
andrewboyson 14:e75a59c1123d 128 switch (action)
andrewboyson 14:e75a59c1123d 129 {
andrewboyson 14:e75a59c1123d 130 case MULTICAST_NODE: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0x01; break;
andrewboyson 14:e75a59c1123d 131 case MULTICAST_ROUTER: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
andrewboyson 14:e75a59c1123d 132 case MULTICAST_MDNS: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
andrewboyson 14:e75a59c1123d 133 case MULTICAST_LLMNR: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x01; *p++ = 0x00; *p = 0x03; break;
andrewboyson 14:e75a59c1123d 134 }
andrewboyson 14:e75a59c1123d 135 }
andrewboyson 13:9cd54f7db57a 136 }