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

Revision:
105:ef2dd21d808c
Parent:
61:aad055f1b0d1
Child:
143:8cec8f08dc54
--- a/eth/mac.c	Wed Jan 09 14:24:25 2019 +0000
+++ b/eth/mac.c	Fri Jan 11 14:41:50 2019 +0000
@@ -60,18 +60,30 @@
         }
         case 0x01: //Multicast IP4
         {
-            p++; if (*p != 0x00) return DO_NOTHING;
-            p++; if (*p != 0x5e) return DO_NOTHING;
-            p++; if (*p != 0x00) return DO_NOTHING;
-            p++; if (*p != 0x00) return DO_NOTHING;
+            p++; if (*p != 0x00) return DO_NOTHING; //01 00
+            p++; if (*p != 0x5e) return DO_NOTHING; //01 00 5E
+            p++; if (*p != 0x00) return DO_NOTHING; //01 00 5E 00
             p++;
-            switch (*p) //01 00 5E 00 00 xx
+            switch (*p)
             {
-                case 0x01: return MULTICAST_NODE;
-                case 0x02: return MULTICAST_ROUTER;
-                case 0xfb: return MULTICAST_MDNS;
-                case 0xfc: return MULTICAST_LLMNR;
-                default:   return DO_NOTHING;
+                case 0x00: //01 00 5E 00 00
+                    p++;
+                    switch (*p) //01 00 5E 00 00 xx
+                    {
+                        case 0x01: return MULTICAST_NODE;
+                        case 0x02: return MULTICAST_ROUTER;
+                        case 0xfb: return MULTICAST_MDNS;
+                        case 0xfc: return MULTICAST_LLMNR;
+                        default:   return DO_NOTHING;
+                    }
+                case 0x01: //01 00 5E 00 01
+                    p++;
+                    switch (*p) //01 00 5E 00 01 xx
+                    {
+                        case 0x01: return MULTICAST_NTP;
+                        default:   return DO_NOTHING;
+                    }
+                default: return DO_NOTHING;
             }
         }
         case 0x33: //Multicast IP6
@@ -87,14 +99,26 @@
                     {
                         case 0x00: //33 33 00 00
                         {
-                            p++; if (*p != 0x00) return DO_NOTHING;
-                            p++;
-                            switch (*p) //33 33 00 00 00 xx
+                            p++; 
+                            switch (*p)
                             {
-                                case 0x01: return MULTICAST_NODE;
-                                case 0x02: return MULTICAST_ROUTER;
-                                case 0xfb: return MULTICAST_MDNS;
-                                default:   return DO_NOTHING;
+                                case 0x00:
+                                    p++;
+                                    switch (*p) //33 33 00 00 00 xx
+                                    {
+                                        case 0x01: return MULTICAST_NODE;
+                                        case 0x02: return MULTICAST_ROUTER;
+                                        case 0xfb: return MULTICAST_MDNS;
+                                        default:   return DO_NOTHING;
+                                    }
+                                case 0x01:
+                                    p++;
+                                    switch (*p) //33 33 00 00 01 xx
+                                    {
+                                        case 0x01: return MULTICAST_NTP;
+                                        default:   return DO_NOTHING;
+                                    }
+                                default: return DO_NOTHING;
                             }
                         }
                         case 0x01: //33 33 00 01
@@ -147,6 +171,7 @@
             case MULTICAST_ROUTER: *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
             case MULTICAST_MDNS:   *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
             case MULTICAST_LLMNR:  *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x00; *p = 0xfc; break;
+            case MULTICAST_NTP:    *p++ = 0x01; *p++ = 0x00; *p++ = 0x5e; *p++ = 0x00; *p++ = 0x01; *p = 0x01; break;
         }
     }
     else
@@ -157,6 +182,7 @@
             case MULTICAST_ROUTER: *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0x02; break;
             case MULTICAST_MDNS:   *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p = 0xfb; break;
             case MULTICAST_LLMNR:  *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x01; *p++ = 0x00; *p = 0x03; break;
+            case MULTICAST_NTP:    *p++ = 0x33; *p++ = 0x33; *p++ = 0x00; *p++ = 0x00; *p++ = 0x01; *p = 0x01; break;
         }
     }
 }