[PATCH odhcpd 2/2] router: always check ra_lifetime

stijn at linux-ipv6.be stijn at linux-ipv6.be
Mon Feb 13 12:18:38 PST 2023


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 at linux-ipv6.be>
---
 src/router.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/src/router.c b/src/router.c
index 1c11849..21674f6 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,13 +503,10 @@ 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))
-				default_route = true;
+			if (!default_route) {
+				if (parse_routes(addrs, valid_addr_cnt))
+					default_route = true;
+			}
 		}
 
 		if (invalid_addr_cnt) {
-- 
2.39.1




More information about the openwrt-devel mailing list