diff options
author | stijn@linux-ipv6.be <stijn@linux-ipv6.be> | 2023-02-16 22:30:41 +0200 |
---|---|---|
committer | Stijn Tintel <stijn@linux-ipv6.be> | 2023-02-17 14:27:21 +0200 |
commit | edc5e1738682e764e64bcbffde1e0a1cc9feac21 (patch) | |
tree | 8261901bf50e8b39a5d033b7d50d9fb503a3036d | |
parent | 5a1775178bfbaf3327df99998b60d1c48b2dad9d (diff) |
router: always check ra_default
We currently only check ra_default when an interface has valid
addresses. This results in ra_default being ignored in case we have an
interface with only link-local addresses. This effectively breaks the
use of value 2 for the ra_default parameter.
Fix this by always checking ra_lifetime, regardless of the interface
having public addresses or not.
Fixes: #11930
Fixes: 83e14f455817 ("router: advertise removed addresses as invalid in 3 consecutive RAs")
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
Acked-by:Hans Dedecker <dedeckeh@gmail.com>
-rw-r--r-- | src/router.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/router.c b/src/router.c index 1c11849..7e66e3c 100644 --- a/src/router.c +++ b/src/router.c @@ -488,6 +488,14 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr valid_addr_cnt = (iface->timer_rs.cb /* if not shutdown */ ? iface->addr6_len : 0); invalid_addr_cnt = iface->invalid_addr6_len; + // check ra_default + if (iface->default_router) { + default_route = true; + + if (iface->default_router > 1) + valid_prefix = true; + } + if (valid_addr_cnt + invalid_addr_cnt) { addrs = alloca(sizeof(*addrs) * (valid_addr_cnt + invalid_addr_cnt)); @@ -495,12 +503,7 @@ static int send_router_advert(struct interface *iface, const struct in6_addr *fr memcpy(addrs, iface->addr6, sizeof(*addrs) * valid_addr_cnt); /* Check default route */ - if (iface->default_router) { - default_route = true; - - if (iface->default_router > 1) - valid_prefix = true; - } else if (parse_routes(addrs, valid_addr_cnt)) + if (!default_route && parse_routes(addrs, valid_addr_cnt)) default_route = true; } |