lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Mon, 26 Feb 2018 14:28:47 -0800
From:   Wei Wang <weiwan@...gle.com>
To:     David Ahern <dsahern@...il.com>
Cc:     Linux Kernel Network Developers <netdev@...r.kernel.org>,
        "David S . Miller" <davem@...emloft.net>,
        Ido Schimmel <idosch@...sch.org>, roopa@...ulusnetworks.com,
        Eric Dumazet <eric.dumazet@...il.com>,
        Martin KaFai Lau <kafai@...com>,
        Hideaki YOSHIFUJI <yoshfuji@...ux-ipv6.org>
Subject: Re: [PATCH RFC net-next 10/20] net/ipv6: move expires into rt6_info

On Sun, Feb 25, 2018 at 11:47 AM, David Ahern <dsahern@...il.com> wrote:
> Add expires to rt6_info for FIB entries, and add fib6 helpers to
> manage it. Data path use of dst.expires remains.
>
> Signed-off-by: David Ahern <dsahern@...il.com>
> ---
>  include/net/ip6_fib.h | 26 +++++++++++++++++++++-----
>  net/ipv6/addrconf.c   |  6 +++---
>  net/ipv6/ip6_fib.c    |  8 ++++----
>  net/ipv6/ndisc.c      |  2 +-
>  net/ipv6/route.c      | 14 +++++++-------
>  5 files changed, 36 insertions(+), 20 deletions(-)
>
> diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
> index da81669b9c90..3ba0bb7c7a43 100644
> --- a/include/net/ip6_fib.h
> +++ b/include/net/ip6_fib.h
> @@ -179,6 +179,7 @@ struct rt6_info {
>                                         should_flush:1,
>                                         unused:6;
>
> +       unsigned long                   expires;
>         struct dst_metrics              *fib6_metrics;
>  #define fib6_pmtu              fib6_metrics->metrics[RTAX_MTU-1]
>  #define fib6_hoplimit          fib6_metrics->metrics[RTAX_HOPLIMIT-1]
> @@ -199,6 +200,26 @@ static inline struct inet6_dev *ip6_dst_idev(struct dst_entry *dst)
>         return ((struct rt6_info *)dst)->rt6i_idev;
>  }
>
> +static inline void fib6_clean_expires(struct rt6_info *f6i)
> +{
> +       f6i->rt6i_flags &= ~RTF_EXPIRES;
> +       f6i->expires = 0;
> +}
> +
> +static inline void fib6_set_expires(struct rt6_info *f6i,
> +                                   unsigned long expires)
> +{
> +       f6i->expires = expires;
> +       f6i->rt6i_flags |= RTF_EXPIRES;
> +}
> +
> +static inline bool fib6_check_expired(const struct rt6_info *f6i)
> +{
> +       if (f6i->rt6i_flags & RTF_EXPIRES)
> +               return time_after(jiffies, f6i->expires);
> +       return false;
> +}
> +
>  static inline void rt6_clean_expires(struct rt6_info *rt)
>  {
>         rt->rt6i_flags &= ~RTF_EXPIRES;
> @@ -213,11 +234,6 @@ static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires)
>
>  static inline void rt6_update_expires(struct rt6_info *rt0, int timeout)
>  {
> -       struct rt6_info *rt;
> -
> -       for (rt = rt0; rt && !(rt->rt6i_flags & RTF_EXPIRES); rt = rt->from);
> -       if (rt && rt != rt0)
> -               rt0->dst.expires = rt->dst.expires;

I was wondering if we need to retain the above logic. It makes sure
dst.expires gets synced to its "parent" route. But  it might be hard
because after your change, we can no longer use rt->from to refer to
the "parent".

>         dst_set_expires(&rt0->dst, timeout);
>         rt0->rt6i_flags |= RTF_EXPIRES;
>  }
> diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
> index eeecef2b83a4..478f45bf13cf 100644
> --- a/net/ipv6/addrconf.c
> +++ b/net/ipv6/addrconf.c
> @@ -1202,7 +1202,7 @@ cleanup_prefix_route(struct inet6_ifaddr *ifp, unsigned long expires, bool del_r
>                         ip6_del_rt(dev_net(ifp->idev->dev), rt);
>                 else {
>                         if (!(rt->rt6i_flags & RTF_EXPIRES))
> -                               rt6_set_expires(rt, expires);
> +                               fib6_set_expires(rt, expires);
>                         ip6_rt_put(rt);
>                 }
>         }
> @@ -2648,9 +2648,9 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao)
>                                 rt = NULL;
>                         } else if (addrconf_finite_timeout(rt_expires)) {
>                                 /* not infinity */
> -                               rt6_set_expires(rt, jiffies + rt_expires);
> +                               fib6_set_expires(rt, jiffies + rt_expires);
>                         } else {
> -                               rt6_clean_expires(rt);
> +                               fib6_clean_expires(rt);
>                         }
>                 } else if (valid_lft) {
>                         clock_t expires = 0;
> diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
> index faa2b46349df..7bc23b048189 100644
> --- a/net/ipv6/ip6_fib.c
> +++ b/net/ipv6/ip6_fib.c
> @@ -886,9 +886,9 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
>                                 if (!(iter->rt6i_flags & RTF_EXPIRES))
>                                         return -EEXIST;
>                                 if (!(rt->rt6i_flags & RTF_EXPIRES))
> -                                       rt6_clean_expires(iter);
> +                                       fib6_clean_expires(iter);
>                                 else
> -                                       rt6_set_expires(iter, rt->dst.expires);
> +                                       fib6_set_expires(iter, rt->expires);
>                                 iter->fib6_pmtu = rt->fib6_pmtu;
>                                 return -EEXIST;
>                         }
> @@ -1975,8 +1975,8 @@ static int fib6_age(struct rt6_info *rt, void *arg)
>          *      Routes are expired even if they are in use.
>          */
>
> -       if (rt->rt6i_flags & RTF_EXPIRES && rt->dst.expires) {
> -               if (time_after(now, rt->dst.expires)) {
> +       if (rt->rt6i_flags & RTF_EXPIRES && rt->expires) {
> +               if (time_after(now, rt->expires)) {
>                         RT6_TRACE("expiring %p\n", rt);
>                         return -1;
>                 }
> diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
> index 33f9e3dc526a..bd804e8cd73c 100644
> --- a/net/ipv6/ndisc.c
> +++ b/net/ipv6/ndisc.c
> @@ -1318,7 +1318,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
>         }
>
>         if (rt)
> -               rt6_set_expires(rt, jiffies + (HZ * lifetime));
> +               fib6_set_expires(rt, jiffies + (HZ * lifetime));
>         if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
>             ra_msg->icmph.icmp6_hop_limit) {
>                 if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
> diff --git a/net/ipv6/route.c b/net/ipv6/route.c
> index 1649e78b019d..b6206ec947e6 100644
> --- a/net/ipv6/route.c
> +++ b/net/ipv6/route.c
> @@ -435,7 +435,7 @@ static bool rt6_check_expired(const struct rt6_info *rt)
>                         return true;
>         } else if (rt->from) {
>                 return rt->dst.obsolete != DST_OBSOLETE_FORCE_CHK ||
> -                       rt6_check_expired(rt->from);
> +                       fib6_check_expired(rt->from);
>         }
>         return false;
>  }
> @@ -685,7 +685,7 @@ static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
>             !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
>                 goto out;
>
> -       if (rt6_check_expired(rt))
> +       if (fib6_check_expired(rt))
>                 goto out;
>
>         m = rt6_score_route(rt, oif, strict);
> @@ -869,9 +869,9 @@ int rt6_route_rcv(struct net_device *dev, u8 *opt, int len,
>
>         if (rt) {
>                 if (!addrconf_finite_timeout(lifetime))
> -                       rt6_clean_expires(rt);
> +                       fib6_clean_expires(rt);
>                 else
> -                       rt6_set_expires(rt, jiffies + HZ * lifetime);
> +                       fib6_set_expires(rt, jiffies + HZ * lifetime);
>
>                 ip6_rt_put(rt);
>         }
> @@ -2266,7 +2266,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net,
>         for_each_fib6_node_rt_rcu(fn) {
>                 if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
>                         continue;
> -               if (rt6_check_expired(rt))
> +               if (fib6_check_expired(rt))
>                         continue;
>                 if (rt->rt6i_flags & RTF_REJECT)
>                         break;
> @@ -2718,10 +2718,10 @@ static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg,
>                 goto out;
>
>         if (cfg->fc_flags & RTF_EXPIRES)
> -               rt6_set_expires(rt, jiffies +
> +               fib6_set_expires(rt, jiffies +
>                                 clock_t_to_jiffies(cfg->fc_expires));
>         else
> -               rt6_clean_expires(rt);
> +               fib6_clean_expires(rt);
>
>         if (cfg->fc_protocol == RTPROT_UNSPEC)
>                 cfg->fc_protocol = RTPROT_BOOT;
> --
> 2.11.0
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ