From eaa9fbea30a5c6de93b89b0acdb2ac856d4c9bcf Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Sat, 1 Feb 2014 13:01:37 +0100 Subject: [PATCH] Change homenet detection to User-Class --- src/dhcpv4.c | 15 ++++++++------- src/dhcpv4.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 49b75f4..b8e0c95 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -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 + } } } diff --git a/src/dhcpv4.h b/src/dhcpv4.h index 7ee9fa9..a31d8fe 100644 --- a/src/dhcpv4.h +++ b/src/dhcpv4.h @@ -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, }; -- 2.25.1