From: Paul Donald <newt...@gmail.com>

In accordance with RFC4861. Enables control of ULA.

The new config variable is valid_lifetime. e.g.:

config dhcp 'lan'
        ...
        option valid_lifetime '6h'

Signed-off-by: Paul Donald <newt...@gmail.com>
---
 README       |  2 ++
 src/config.c | 14 ++++++++++++++
 src/odhcpd.h |  1 +
 3 files changed, 17 insertions(+)

diff --git a/README b/README
index c8f2eb4..4d1956c 100644
--- a/README
+++ b/README
@@ -155,6 +155,8 @@ prefix_filter               string  ::/0                    
Only advertise on-link prefixes within
                                                        filtered out.
 ntp                    list    <local address>         NTP servers to announce
                                                        accepts IPv4 and IPv6
+valid_lifetime         string  30d                     Value for the valid 
lifetime
+                                                       for a prefix
 
 
 Sections of type host (static leases)
diff --git a/src/config.c b/src/config.c
index a3bf1ba..285e3a1 100644
--- a/src/config.c
+++ b/src/config.c
@@ -93,6 +93,7 @@ enum {
        IFACE_ATTR_NDPROXY_SLAVE,
        IFACE_ATTR_PREFIX_FILTER,
        IFACE_ATTR_PREFERRED_LIFETIME,
+       IFACE_ATTR_VALID_LIFETIME,
        IFACE_ATTR_NTP,
        IFACE_ATTR_MAX
 };
@@ -146,6 +147,7 @@ static const struct blobmsg_policy 
iface_attrs[IFACE_ATTR_MAX] = {
        [IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = 
BLOBMSG_TYPE_BOOL },
        [IFACE_ATTR_PREFIX_FILTER] = { .name = "prefix_filter", .type = 
BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_PREFERRED_LIFETIME] = { .name = "preferred_lifetime", .type 
= BLOBMSG_TYPE_STRING },
+       [IFACE_ATTR_VALID_LIFETIME] = { .name = "valid_lifetime", .type = 
BLOBMSG_TYPE_STRING },
        [IFACE_ATTR_NTP] = { .name = "ntp", .type = BLOBMSG_TYPE_ARRAY },
 };
 
@@ -217,6 +219,7 @@ static void set_interface_defaults(struct interface *iface)
        iface->learn_routes = 1;
        iface->dhcp_leasetime = 43200;
        iface->preferred_lifetime = 604800; /* rfc4861#section-6.2.1: 
AdvPreferredLifetime 7 days */
+       iface->valid_lifetime = 2592000; /* rfc4861#section-6.2.1: 
AdvValidLifetime 30 days */
        iface->dhcpv4_start.s_addr = htonl(START_DEFAULT);
        iface->dhcpv4_end.s_addr = htonl(START_DEFAULT + LIMIT_DEFAULT - 1);
        iface->dhcpv6_assignall = true;
@@ -659,6 +662,17 @@ int config_parse_interface(void *data, size_t len, const 
char *name, bool overwr
 
        }
 
+       if ((c = tb[IFACE_ATTR_VALID_LIFETIME])) {
+               uint32_t time = (uint32_t)parse_leasetime(c);
+
+               if (time >= 0)
+                       iface->valid_lifetime = time;
+               else
+                       syslog(LOG_ERR, "Invalid %s value configured for 
interface '%s'",
+                                  iface_attrs[IFACE_ATTR_VALID_LIFETIME].name, 
iface->name);
+
+       }
+
        if ((c = tb[IFACE_ATTR_START])) {
                iface->dhcpv4_start.s_addr = htonl(blobmsg_get_u32(c));
                iface->dhcpv4_end.s_addr = 
htonl(ntohl(iface->dhcpv4_start.s_addr) +
diff --git a/src/odhcpd.h b/src/odhcpd.h
index fecd77e..ddbc6b3 100644
--- a/src/odhcpd.h
+++ b/src/odhcpd.h
@@ -320,6 +320,7 @@ struct interface {
        uint32_t ra_hoplimit;
        int ra_mtu;
        uint32_t preferred_lifetime;
+       uint32_t valid_lifetime;
 
        // DHCP
        uint32_t dhcp_leasetime;
-- 
2.44.0


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to