summaryrefslogtreecommitdiffhomepage
path: root/src/dhcpv4.c
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2014-02-01 13:01:37 +0100
committerSteven Barth <steven@midlink.org>2014-02-01 13:01:37 +0100
commiteaa9fbea30a5c6de93b89b0acdb2ac856d4c9bcf (patch)
tree98dc714ca71d5e417d77c3086ccdde51f813b321 /src/dhcpv4.c
parentf0b46eb203e192f44d8f870f905697ae4612d111 (diff)
Change homenet detection to User-Class
Diffstat (limited to 'src/dhcpv4.c')
-rw-r--r--src/dhcpv4.c15
1 files changed, 8 insertions, 7 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
+ }
}
}