summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2013-10-18 14:18:32 +0200
committerSteven Barth <steven@midlink.org>2013-10-18 14:18:32 +0200
commitb08f841685bf67b3f4f8cc3e8f667c80878916a8 (patch)
treeb54bb7bfcadbcf057d1134e4487b3bcbff6d8106
parente93c42c036c4b4df1f65f261def31cf1a429e942 (diff)
downloadnetifd-b08f841685bf67b3f4f8cc3e8f667c80878916a8.tar.gz
Add option "delegate" to toggle prefix delegation
-rw-r--r--interface-ip.c9
-rw-r--r--interface.c4
-rw-r--r--interface.h1
3 files changed, 11 insertions, 3 deletions
diff --git a/interface-ip.c b/interface-ip.c
index 60902f9..2280266 100644
--- a/interface-ip.c
+++ b/interface-ip.c
@@ -920,7 +920,9 @@ interface_update_prefix(struct vlist_tree *tree,
} else if (node_new) {
// Set null-route to avoid routing loops
system_add_route(NULL, &route);
- interface_update_prefix_assignments(prefix_new, true);
+
+ if (!prefix_new->iface || !prefix_new->iface->proto_ip.no_delegation)
+ interface_update_prefix_assignments(prefix_new, true);
} else if (node_old) {
// Remove null-route
interface_update_prefix_assignments(prefix_old, false);
@@ -928,11 +930,12 @@ interface_update_prefix(struct vlist_tree *tree,
}
if (node_old) {
- list_del(&prefix_old->head);
+ if (prefix_old->head.next)
+ list_del(&prefix_old->head);
free(prefix_old);
}
- if (node_new)
+ if (node_new && (!prefix_new->iface || !prefix_new->iface->proto_ip.no_delegation))
list_add(&prefix_new->head, &prefixes);
}
diff --git a/interface.c b/interface.c
index 0620617..698fedb 100644
--- a/interface.c
+++ b/interface.c
@@ -43,6 +43,7 @@ enum {
IFACE_ATTR_IP4TABLE,
IFACE_ATTR_IP6TABLE,
IFACE_ATTR_IP6CLASS,
+ IFACE_ATTR_DELEGATE,
IFACE_ATTR_MAX
};
@@ -61,6 +62,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = {
[IFACE_ATTR_IP4TABLE] = { .name = "ip4table", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_IP6TABLE] = { .name = "ip6table", .type = BLOBMSG_TYPE_STRING },
[IFACE_ATTR_IP6CLASS] = { .name = "ip6class", .type = BLOBMSG_TYPE_ARRAY },
+ [IFACE_ATTR_DELEGATE] = { .name = "delegate", .type = BLOBMSG_TYPE_BOOL },
};
static const struct uci_blob_param_info iface_attr_info[IFACE_ATTR_MAX] = {
@@ -605,6 +607,8 @@ interface_init(struct interface *iface, const char *name,
DPRINTF("Failed to resolve routing table: %s\n", (char *) blobmsg_data(cur));
}
+ iface->proto_ip.no_delegation = !blobmsg_get_bool_default(tb[IFACE_ATTR_DELEGATE], true);
+
iface->config_autostart = iface->autostart;
iface->dynamic = dynamic;
diff --git a/interface.h b/interface.h
index 8c69958..ca5d376 100644
--- a/interface.h
+++ b/interface.h
@@ -60,6 +60,7 @@ struct interface_ip_settings {
bool enabled;
bool no_defaultroute;
bool no_dns;
+ bool no_delegation;
struct vlist_tree addr;
struct vlist_tree route;