From b08f841685bf67b3f4f8cc3e8f667c80878916a8 Mon Sep 17 00:00:00 2001 From: Steven Barth Date: Fri, 18 Oct 2013 14:18:32 +0200 Subject: [PATCH] Add option "delegate" to toggle prefix delegation --- interface-ip.c | 9 ++++++--- interface.c | 4 ++++ interface.h | 1 + 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; -- 2.25.1