summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2014-05-30 16:59:53 +0200
committerSteven Barth <steven@midlink.org>2014-05-30 16:59:53 +0200
commitfc7fb637811089b4f26fb00ca81a0d05c09076bd (patch)
tree73ca8ed1c6cf25a9bff39cbff2850faa07660dbf
parent7fb8ef575d019796b212824a706b0ea5c6bdffaa (diff)
Make filtering customizable
-rw-r--r--src/config.c8
-rw-r--r--src/dhcpv4.c7
-rw-r--r--src/dhcpv6.c8
-rw-r--r--src/odhcpd.h2
4 files changed, 16 insertions, 9 deletions
diff --git a/src/config.c b/src/config.c
index 6dd52bb..db5ca3b 100644
--- a/src/config.c
+++ b/src/config.c
@@ -32,6 +32,7 @@ enum {
IFACE_ATTR_NDP,
IFACE_ATTR_DNS,
IFACE_ATTR_DOMAIN,
+ IFACE_ATTR_FILTER_CLASS,
IFACE_ATTR_DHCPV6_RAW,
IFACE_ATTR_RA_DEFAULT,
IFACE_ATTR_RA_MANAGEMENT,
@@ -62,6 +63,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = {
[IFACE_ATTR_NDP] = { .name = "ndp", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY },
[IFACE_ATTR_DOMAIN] = { .name = "domain", .type = BLOBMSG_TYPE_ARRAY },
+ [IFACE_ATTR_FILTER_CLASS] = { .name = "filter_class", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_DHCPV6_RAW] = { .name = "dhcpv6_raw", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_PD_MANAGER] = { .name = "pd_manager", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_PD_CER] = { .name = "pd_cer", .type = BLOBMSG_TYPE_STRING },
@@ -152,6 +154,7 @@ static void clean_interface(struct interface *iface)
free(iface->static_ndp);
free(iface->dhcpv4_dns);
free(iface->dhcpv6_raw);
+ free(iface->filter_class);
memset(&iface->ra, 0, sizeof(*iface) - offsetof(struct interface, ra));
}
@@ -457,6 +460,11 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
}
}
+ if ((c = tb[IFACE_ATTR_FILTER_CLASS])) {
+ iface->filter_class = realloc(iface->filter_class, blobmsg_data_len(c) + 1);
+ memcpy(iface->filter_class, blobmsg_get_string(c), blobmsg_data_len(c) + 1);
+ }
+
if ((c = tb[IFACE_ATTR_DHCPV6_RAW])) {
iface->dhcpv6_raw_len = blobmsg_data_len(c) / 2;
iface->dhcpv6_raw = realloc(iface->dhcpv6_raw, iface->dhcpv6_raw_len);
diff --git a/src/dhcpv4.c b/src/dhcpv4.c
index b8e0c95..628efcd 100644
--- a/src/dhcpv4.c
+++ b/src/dhcpv4.c
@@ -37,7 +37,6 @@ 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);
-static const char *excluded_class = "HOMENET";
// Create socket and register events
int init_dhcpv4(void)
@@ -294,11 +293,11 @@ 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_USER_CLASS) {
+ } else if (iface->filter_class && 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))
+ size_t elen = strlen(iface->filter_class);
+ if (*c == elen && !memcmp(&c[1], iface->filter_class, elen))
return; // Ignore from homenet
}
}
diff --git a/src/dhcpv6.c b/src/dhcpv6.c
index 37dc3f5..aaefa5e 100644
--- a/src/dhcpv6.c
+++ b/src/dhcpv6.c
@@ -22,8 +22,6 @@
#include "odhcpd.h"
#include "dhcpv6.h"
-static const char *excluded_class = "HOMENET";
-
static void relay_client_request(struct sockaddr_in6 *source,
const void *data, size_t len, struct interface *iface);
@@ -293,11 +291,11 @@ static void handle_client_request(void *addr, void *data, size_t len,
if (olen != ntohs(dest.serverid_length) ||
memcmp(odata, &dest.duid_type, olen))
return; // Not for us
- } else if (otype == DHCPV6_OPT_USER_CLASS) {
+ } else if (iface->filter_class && otype == DHCPV6_OPT_USER_CLASS) {
uint8_t *c = odata, *cend = &odata[olen];
for (; &c[2] <= cend && &c[2 + (c[0] << 8) + c[1]] <= cend; c = &c[2 + (c[0] << 8) + c[1]]) {
- size_t elen = strlen(excluded_class);
- if (((((size_t)c[0]) << 8) | c[1]) == elen && !memcmp(&c[2], excluded_class, elen))
+ size_t elen = strlen(iface->filter_class);
+ if (((((size_t)c[0]) << 8) | c[1]) == elen && !memcmp(&c[2], iface->filter_class, elen))
return; // Ignore from homenet
}
} else if (otype == DHCPV6_OPT_IA_PD) {
diff --git a/src/odhcpd.h b/src/odhcpd.h
index 64ffca2..dfaec9b 100644
--- a/src/odhcpd.h
+++ b/src/odhcpd.h
@@ -165,6 +165,8 @@ struct interface {
char *upstream;
size_t upstream_len;
+
+ char *filter_class;
};
extern struct list_head interfaces;