Change homenet detection to User-Class
authorSteven Barth <steven@midlink.org>
Sat, 1 Feb 2014 12:01:37 +0000 (13:01 +0100)
committerSteven Barth <steven@midlink.org>
Sat, 1 Feb 2014 12:01:37 +0000 (13:01 +0100)
src/dhcpv4.c
src/dhcpv4.h

index 49b75f4..b8e0c95 100644 (file)
@@ -37,9 +37,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
 static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
                const char *hostname);
-
-// Magic option for hnet internal (4B enterprise ID, 1B data-len, 1B subopt-code, 1B subopt-len)
-static uint8_t hnet_internal_data[7] = {0x00, 0x00, 0x76, 0xfe, 2, 1, 0};
+static const char *excluded_class = "HOMENET";
 
 // Create socket and register events
 int init_dhcpv4(void)
@@ -296,10 +294,13 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
                } else if (opt->type == DHCPV4_OPT_SERVERID && opt->len == 4) {
                        if (memcmp(opt->data, &ifaddr.sin_addr, 4))
                                return;
-               } else if (opt->type == DHCPV4_OPT_VENDOR_SPECIFIC_INFORMATION &&
-                               opt->len == sizeof(hnet_internal_data)) {
-                       if (!memcmp(opt->data, hnet_internal_data, sizeof(hnet_internal_data)))
-                               return; // Ignoring hnet internal routers
+               } else if (opt->type == DHCPV4_OPT_USER_CLASS) {
+                       uint8_t *c = opt->data, *cend = &opt->data[opt->len];
+                       for (; c < cend && &c[*c] < cend; c = &c[1 + *c]) {
+                               size_t elen = strlen(excluded_class);
+                               if (*c == elen && !memcmp(&c[1], excluded_class, elen))
+                                       return; // Ignore from homenet
+                       }
                }
        }
 
index 7ee9fa9..a31d8fe 100644 (file)
@@ -50,7 +50,7 @@ enum dhcpv4_opt {
        DHCPV4_OPT_IPADDRESS = 50,
        DHCPV4_OPT_HOSTNAME = 10,
        DHCPV4_OPT_REQUEST = 17,
-       DHCPV4_OPT_VENDOR_SPECIFIC_INFORMATION = 125,
+       DHCPV4_OPT_USER_CLASS = 77,
        DHCPV4_OPT_END = 255,
 };