From: Pavel Merzlyakov <pavel.merzlya...@gmail.com> A subnet may be changed after link-up event
Signed-off-by: Pavel Merzlyakov <pavel.merzlya...@gmail.com> --- src/odhcp6c.c | 3 +++ src/ra.c | 20 +++++++++++++++++--- src/ra.h | 1 + 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/odhcp6c.c b/src/odhcp6c.c index 19a86f2..dd20f39 100644 --- a/src/odhcp6c.c +++ b/src/odhcp6c.c @@ -455,6 +455,9 @@ int main(_unused int argc, char* const argv[]) syslog(LOG_NOTICE, "(re)starting transaction on %s", ifname); + if (signal_usr2) + ra_restart(); + signal_usr1 = signal_usr2 = false; int mode = dhcpv6_set_ia_mode(ia_na_mode, ia_pd_mode); if (mode != DHCPV6_STATELESS) diff --git a/src/ra.c b/src/ra.c index 898f449..917df11 100644 --- a/src/ra.c +++ b/src/ra.c @@ -55,6 +55,7 @@ static int sock = -1, rtnl = -1; static int if_index = 0; static char if_name[IF_NAMESIZE] = {0}; static volatile int rs_attempt = 0; +static const int rs_attempt_limit = 4; static struct in6_addr lladdr = IN6ADDR_ANY_INIT; static unsigned int ra_options = 0; static unsigned int ra_holdoff_interval = 0; @@ -179,6 +180,20 @@ failure: return -1; } +void ra_restart(void) +{ + const int rs_attempt_old = rs_attempt; + + odhcp6c_clear_state(STATE_RA_PREFIX); + odhcp6c_clear_state(STATE_RA_ROUTE); + odhcp6c_clear_state(STATE_RA_DNS); + odhcp6c_clear_state(STATE_RA_SEARCH); + + rs_attempt = 0; + if (rs_attempt_old == 0 || rs_attempt_old >= rs_attempt_limit) + ra_send_rs(SIGALRM); +} + static void ra_send_rs(int signal __attribute__((unused))) { const struct sockaddr_in6 dest = {AF_INET6, 0, 0, ALL_IPV6_ROUTERS, if_index}; @@ -193,7 +208,7 @@ static void ra_send_rs(int signal __attribute__((unused))) if (sendto(sock, &rs, len, MSG_DONTWAIT, (struct sockaddr*)&dest, sizeof(dest)) < 0) syslog(LOG_ERR, "Failed to send RS (%s)", strerror(errno)); - if (++rs_attempt <= 3) + if (++rs_attempt < rs_attempt_limit) alarm(4); } @@ -243,8 +258,7 @@ bool ra_link_up(void) if (ret) { syslog(LOG_NOTICE, "carrier => %i event on %s", (int)!nocarrier, if_name); - rs_attempt = 0; - ra_send_rs(SIGALRM); + ra_restart(); } return ret; diff --git a/src/ra.h b/src/ra.h index 9acc8cd..4ec208f 100644 --- a/src/ra.h +++ b/src/ra.h @@ -46,5 +46,6 @@ struct icmpv6_opt_route_info { int ra_init(const char *ifname, const struct in6_addr *ifid, unsigned int options, unsigned int holdoff_interval); +void ra_restart(void); bool ra_link_up(void); bool ra_process(void); -- 2.21.0 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel