diff options
author | David S. Miller <davem@davemloft.net> | 2021-03-25 23:31:22 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2021-03-25 23:31:22 +0100 |
commit | efd13b71a3fa31413f8d15342e01d44b60b0a432 (patch) | |
tree | 2ed1b299e25538c5a60485a1047507b49d3e0ecf /include/net/nexthop.h | |
parent | hinic: avoid gcc -Wrestrict warning (diff) | |
parent | Merge branch 'akpm' (patches from Andrew) (diff) | |
download | linux-efd13b71a3fa31413f8d15342e01d44b60b0a432.tar.xz linux-efd13b71a3fa31413f8d15342e01d44b60b0a432.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/nexthop.h')
-rw-r--r-- | include/net/nexthop.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/include/net/nexthop.h b/include/net/nexthop.h index ba94868a21d5..28145f714801 100644 --- a/include/net/nexthop.h +++ b/include/net/nexthop.h @@ -476,6 +476,7 @@ static inline struct fib_nh *fib_info_nh(struct fib_info *fi, int nhsel) int fib6_check_nexthop(struct nexthop *nh, struct fib6_config *cfg, struct netlink_ext_ack *extack); +/* Caller should either hold rcu_read_lock(), or RTNL. */ static inline struct fib6_nh *nexthop_fib6_nh(struct nexthop *nh) { struct nh_info *nhi; @@ -496,6 +497,29 @@ static inline struct fib6_nh *nexthop_fib6_nh(struct nexthop *nh) return NULL; } +/* Variant of nexthop_fib6_nh(). + * Caller should either hold rcu_read_lock_bh(), or RTNL. + */ +static inline struct fib6_nh *nexthop_fib6_nh_bh(struct nexthop *nh) +{ + struct nh_info *nhi; + + if (nh->is_group) { + struct nh_group *nh_grp; + + nh_grp = rcu_dereference_bh_rtnl(nh->nh_grp); + nh = nexthop_mpath_select(nh_grp, 0); + if (!nh) + return NULL; + } + + nhi = rcu_dereference_bh_rtnl(nh->nh_info); + if (nhi->family == AF_INET6) + return &nhi->fib6_nh; + + return NULL; +} + static inline struct net_device *fib6_info_nh_dev(struct fib6_info *f6i) { struct fib6_nh *fib6_nh; |