ignore hnet internal routers
authorSteven Barth <steven@midlink.org>
Thu, 17 Oct 2013 13:38:24 +0000 (15:38 +0200)
committerSteven Barth <steven@midlink.org>
Thu, 17 Oct 2013 13:38:24 +0000 (15:38 +0200)
Signed-off-by: Markus Stenberg <markus.stenberg@iki.fi>
src/dhcpv4.c
src/dhcpv4.h

index 6f15a0ab586274d33b2afe6cd61b132d2addab9f..79fabe2dc6f3bd561eb28a77342249afe706cd77 100644 (file)
@@ -38,6 +38,8 @@ 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};
 
 // Create socket and register events
 int init_dhcpv4(void)
@@ -285,6 +287,10 @@ 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
                }
        }
 
index 308cc534c0fc84cc7e82327cbb8095e4ade7a257..7ee9fa98c8be7d9e915b49478f8d7e0c015d40eb 100644 (file)
@@ -50,6 +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_END = 255,
 };