diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2017-02-20 15:31:48 +0100 |
---|---|---|
committer | Hans Dedecker <dedeckeh@gmail.com> | 2017-02-20 16:25:18 +0100 |
commit | 3495f179bd901d6d232e0dbf35444ebe483fdfd9 (patch) | |
tree | 7378fb16b52361778cfce9d27c6f61f15ba2cf7a /src | |
parent | e437ce9422c2f92752be5b6b3fd453e099a98a7e (diff) |
router: allow RA prefix lifetime being set to leasetime value (FS#397)
Add config option ra_useleasetime which allows the RA prefix lifetime
being set to the leasetime in case the valid and/or preferred prefix
lifetime is bigger than the configured leasetime.
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/config.c | 5 | ||||
-rw-r--r-- | src/odhcpd.h | 1 | ||||
-rw-r--r-- | src/router.c | 29 |
3 files changed, 27 insertions, 8 deletions
diff --git a/src/config.c b/src/config.c index df0cbc4..689d4ce 100644 --- a/src/config.c +++ b/src/config.c @@ -48,6 +48,7 @@ enum { IFACE_ATTR_RA_MININTERVAL, IFACE_ATTR_RA_MAXINTERVAL, IFACE_ATTR_RA_LIFETIME, + IFACE_ATTR_RA_USELEASETIME, IFACE_ATTR_PD_MANAGER, IFACE_ATTR_PD_CER, IFACE_ATTR_NDPROXY_ROUTING, @@ -85,6 +86,7 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_RA_MININTERVAL] = { .name = "ra_mininterval", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_MAXINTERVAL] = { .name = "ra_maxinterval", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_LIFETIME] = { .name = "ra_lifetime", .type = BLOBMSG_TYPE_INT32 }, + [IFACE_ATTR_RA_USELEASETIME] = { .name = "ra_useleasetime", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_NDPROXY_ROUTING] = { .name = "ndproxy_routing", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_NDPROXY_SLAVE] = { .name = "ndproxy_slave", .type = BLOBMSG_TYPE_BOOL }, }; @@ -599,6 +601,9 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if ((c = tb[IFACE_ATTR_RA_LIFETIME])) iface->ra_lifetime = blobmsg_get_u32(c); + if ((c = tb[IFACE_ATTR_RA_USELEASETIME])) + iface->ra_useleasetime = blobmsg_get_bool(c); + if ((c = tb[IFACE_ATTR_RA_PREFERENCE])) { const char *prio = blobmsg_get_string(c); diff --git a/src/odhcpd.h b/src/odhcpd.h index a88eb08..538a7e5 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -150,6 +150,7 @@ struct interface { bool always_rewrite_dns; bool ra_not_onlink; bool ra_advrouter; + bool ra_useleasetime; bool no_dynamic_dhcp; // RA diff --git a/src/router.c b/src/router.c index 4ab06b6..dd3f09c 100644 --- a/src/router.c +++ b/src/router.c @@ -321,6 +321,8 @@ static uint64_t send_router_advert(struct interface *iface, const struct in6_add for (ssize_t i = 0; i < ipcnt; ++i) { struct odhcpd_ipaddr *addr = &addrs[i]; + uint32_t preferred = 0; + uint32_t valid = 0; if (addr->prefix > 96 || addr->valid <= (uint32_t)now) { char namebuf[INET6_ADDRSTRLEN]; @@ -346,9 +348,23 @@ static uint64_t send_router_advert(struct interface *iface, const struct in6_add p = &adv.prefix[cnt++]; } - if (addr->preferred > (uint32_t)now && - minvalid > TIME_LEFT(addr->valid, now)) - minvalid = TIME_LEFT(addr->valid, now); + if (addr->preferred > (uint32_t)now) { + preferred = TIME_LEFT(addr->preferred, now); + + if (iface->ra_useleasetime && + preferred > iface->dhcpv4_leasetime) + preferred = iface->dhcpv4_leasetime; + } + + valid = TIME_LEFT(addr->valid, now); + if (iface->ra_useleasetime) { + if (valid > iface->dhcpv4_leasetime) + valid = iface->dhcpv4_leasetime; + } else if (!preferred && valid < 7200) + valid = 0; + + if (minvalid > valid) + minvalid = valid; if (!IN6_IS_ADDR_ULA(&addr->addr) || iface->default_router) valid_prefix = true; @@ -365,11 +381,8 @@ static uint64_t send_router_advert(struct interface *iface, const struct in6_add p->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_AUTO; if (iface->ra_advrouter) p->nd_opt_pi_flags_reserved |= ND_OPT_PI_FLAG_RADDR; - p->nd_opt_pi_valid_time = htonl(TIME_LEFT(addr->valid, now)); - if (addr->preferred > (uint32_t)now) - p->nd_opt_pi_preferred_time = htonl(TIME_LEFT(addr->preferred, now)); - else if (addr->valid - now < 7200) - p->nd_opt_pi_valid_time = 0; + p->nd_opt_pi_preferred_time = htonl(preferred); + p->nd_opt_pi_valid_time = htonl(valid); } // Calculate periodic transmit |