router: always check ra_default
authorstijn@linux-ipv6.be <stijn@linux-ipv6.be>
Thu, 16 Feb 2023 20:30:41 +0000 (22:30 +0200)
committerStijn Tintel <stijn@linux-ipv6.be>
Fri, 17 Feb 2023 12:27:21 +0000 (14:27 +0200)
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>

src/router.c

index 1c1184971c66ab6d1f3c10775c144df734332898..7e66e3c6418fbd5ca1b91dc7997c7dce03597892 100644 (file)
@@ -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;
                }