[OpenWrt-Devel] [PATCH] [odhcp6c] ra: clear RA information and request new after link-up event or SIGUSR2

Hans Dedecker dedeckeh at gmail.com
Mon Mar 18 12:26:05 EDT 2019


Hi,

On Mon, Mar 18, 2019 at 2:43 PM <pavel.merzlyakov at gmail.com> wrote:
>
> From: Pavel Merzlyakov <pavel.merzlyakov at gmail.com>
>
> A subnet may be changed after link-up event
Can you be elaborate more in detail what use case you want to cover
with this patch; in other words what is not working now ?
>
> Signed-off-by: Pavel Merzlyakov <pavel.merzlyakov at 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();
Why do you want to restart RA if an SIGUSR2 signal is received ?

Hans
> +
>                 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 at lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel

_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list