lkml.org 
[lkml]   [2012]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 77/85] ipv4: Add FLOWI_FLAG_KNOWN_NH
    Date
    3.6-stable review patch.  If anyone has any objections, please let me know.

    ------------------


    From: Julian Anastasov <ja@ssi.bg>

    [ Upstream commit c92b96553a80c1dbe2ebe128bbe37c8f98f148bf ]

    Add flag to request that output route should be
    returned with known rt_gateway, in case we want to use
    it as nexthop for neighbour resolving.

    The returned route can be cached as follows:

    - in NH exception: because the cached routes are not shared
    with other destinations
    - in FIB NH: when using gateway because all destinations for
    NH share same gateway

    As last option, to return rt_gateway!=0 we have to
    set DST_NOCACHE.

    Signed-off-by: Julian Anastasov <ja@ssi.bg>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/net/flow.h | 1 +
    net/ipv4/route.c | 21 +++++++++++++++++----
    2 files changed, 18 insertions(+), 4 deletions(-)

    --- a/include/net/flow.h
    +++ b/include/net/flow.h
    @@ -21,6 +21,7 @@ struct flowi_common {
    __u8 flowic_flags;
    #define FLOWI_FLAG_ANYSRC 0x01
    #define FLOWI_FLAG_CAN_SLEEP 0x02
    +#define FLOWI_FLAG_KNOWN_NH 0x04
    __u32 flowic_secid;
    };

    --- a/net/ipv4/route.c
    +++ b/net/ipv4/route.c
    @@ -1762,6 +1762,7 @@ static struct rtable *__mkroute_output(c
    struct in_device *in_dev;
    u16 type = res->type;
    struct rtable *rth;
    + bool do_cache;

    in_dev = __in_dev_get_rcu(dev_out);
    if (!in_dev)
    @@ -1798,24 +1799,36 @@ static struct rtable *__mkroute_output(c
    }

    fnhe = NULL;
    + do_cache = fi != NULL;
    if (fi) {
    struct rtable __rcu **prth;
    + struct fib_nh *nh = &FIB_RES_NH(*res);

    - fnhe = find_exception(&FIB_RES_NH(*res), fl4->daddr);
    + fnhe = find_exception(nh, fl4->daddr);
    if (fnhe)
    prth = &fnhe->fnhe_rth;
    - else
    - prth = __this_cpu_ptr(FIB_RES_NH(*res).nh_pcpu_rth_output);
    + else {
    + if (unlikely(fl4->flowi4_flags &
    + FLOWI_FLAG_KNOWN_NH &&
    + !(nh->nh_gw &&
    + nh->nh_scope == RT_SCOPE_LINK))) {
    + do_cache = false;
    + goto add;
    + }
    + prth = __this_cpu_ptr(nh->nh_pcpu_rth_output);
    + }
    rth = rcu_dereference(*prth);
    if (rt_cache_valid(rth)) {
    dst_hold(&rth->dst);
    return rth;
    }
    }
    +
    +add:
    rth = rt_dst_alloc(dev_out,
    IN_DEV_CONF_GET(in_dev, NOPOLICY),
    IN_DEV_CONF_GET(in_dev, NOXFRM),
    - fi);
    + do_cache);
    if (!rth)
    return ERR_PTR(-ENOBUFS);




    \
     
     \ /
      Last update: 2012-10-27 13:21    [W:4.024 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site