net: Add fib_nh_common and update fib_nh and fib6_nh
Add fib_nh_common struct with common nexthop attributes. Convert fib_nh and fib6_nh to use it. Use macros to move existing fib_nh_* references to the new nh_common.nhc_*. Signed-off-by: David Ahern <dsahern@gmail.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ad1601ae02
commit
f1741730dd
@@ -19,6 +19,7 @@
|
|||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <net/dst.h>
|
#include <net/dst.h>
|
||||||
#include <net/flow.h>
|
#include <net/flow.h>
|
||||||
|
#include <net/ip_fib.h>
|
||||||
#include <net/netlink.h>
|
#include <net/netlink.h>
|
||||||
#include <net/inetpeer.h>
|
#include <net/inetpeer.h>
|
||||||
#include <net/fib_notifier.h>
|
#include <net/fib_notifier.h>
|
||||||
@@ -125,14 +126,7 @@ struct rt6_exception {
|
|||||||
#define FIB6_MAX_DEPTH 5
|
#define FIB6_MAX_DEPTH 5
|
||||||
|
|
||||||
struct fib6_nh {
|
struct fib6_nh {
|
||||||
struct in6_addr fib_nh_gw6;
|
struct fib_nh_common nh_common;
|
||||||
bool fib_nh_has_gw;
|
|
||||||
struct net_device *fib_nh_dev;
|
|
||||||
struct lwtunnel_state *fib_nh_lws;
|
|
||||||
|
|
||||||
unsigned int fib_nh_flags;
|
|
||||||
atomic_t fib_nh_upper_bound;
|
|
||||||
int fib_nh_weight;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fib6_info {
|
struct fib6_info {
|
||||||
|
|||||||
@@ -76,27 +76,48 @@ struct fnhe_hash_bucket {
|
|||||||
#define FNHE_HASH_SIZE (1 << FNHE_HASH_SHIFT)
|
#define FNHE_HASH_SIZE (1 << FNHE_HASH_SHIFT)
|
||||||
#define FNHE_RECLAIM_DEPTH 5
|
#define FNHE_RECLAIM_DEPTH 5
|
||||||
|
|
||||||
|
struct fib_nh_common {
|
||||||
|
struct net_device *nhc_dev;
|
||||||
|
int nhc_oif;
|
||||||
|
unsigned int nhc_flags;
|
||||||
|
struct lwtunnel_state *nhc_lwtstate;
|
||||||
|
unsigned char nhc_scope;
|
||||||
|
u8 nhc_family;
|
||||||
|
u8 nhc_has_gw:1,
|
||||||
|
unused:7;
|
||||||
|
union {
|
||||||
|
__be32 ipv4;
|
||||||
|
struct in6_addr ipv6;
|
||||||
|
} nhc_gw;
|
||||||
|
|
||||||
|
int nhc_weight;
|
||||||
|
atomic_t nhc_upper_bound;
|
||||||
|
};
|
||||||
|
|
||||||
struct fib_nh {
|
struct fib_nh {
|
||||||
struct net_device *fib_nh_dev;
|
struct fib_nh_common nh_common;
|
||||||
struct hlist_node nh_hash;
|
struct hlist_node nh_hash;
|
||||||
struct fib_info *nh_parent;
|
struct fib_info *nh_parent;
|
||||||
unsigned int fib_nh_flags;
|
|
||||||
unsigned char fib_nh_scope;
|
|
||||||
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
|
||||||
int fib_nh_weight;
|
|
||||||
atomic_t fib_nh_upper_bound;
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||||
__u32 nh_tclassid;
|
__u32 nh_tclassid;
|
||||||
#endif
|
#endif
|
||||||
int fib_nh_oif;
|
|
||||||
__be32 fib_nh_gw4;
|
|
||||||
__be32 nh_saddr;
|
__be32 nh_saddr;
|
||||||
int nh_saddr_genid;
|
int nh_saddr_genid;
|
||||||
struct rtable __rcu * __percpu *nh_pcpu_rth_output;
|
struct rtable __rcu * __percpu *nh_pcpu_rth_output;
|
||||||
struct rtable __rcu *nh_rth_input;
|
struct rtable __rcu *nh_rth_input;
|
||||||
struct fnhe_hash_bucket __rcu *nh_exceptions;
|
struct fnhe_hash_bucket __rcu *nh_exceptions;
|
||||||
struct lwtunnel_state *fib_nh_lws;
|
#define fib_nh_family nh_common.nhc_family
|
||||||
|
#define fib_nh_dev nh_common.nhc_dev
|
||||||
|
#define fib_nh_oif nh_common.nhc_oif
|
||||||
|
#define fib_nh_flags nh_common.nhc_flags
|
||||||
|
#define fib_nh_lws nh_common.nhc_lwtstate
|
||||||
|
#define fib_nh_scope nh_common.nhc_scope
|
||||||
|
#define fib_nh_family nh_common.nhc_family
|
||||||
|
#define fib_nh_has_gw nh_common.nhc_has_gw
|
||||||
|
#define fib_nh_gw4 nh_common.nhc_gw.ipv4
|
||||||
|
#define fib_nh_gw6 nh_common.nhc_gw.ipv6
|
||||||
|
#define fib_nh_weight nh_common.nhc_weight
|
||||||
|
#define fib_nh_upper_bound nh_common.nhc_upper_bound
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -468,6 +468,8 @@ int fib_nh_init(struct net *net, struct fib_nh *nh,
|
|||||||
{
|
{
|
||||||
int err = -ENOMEM;
|
int err = -ENOMEM;
|
||||||
|
|
||||||
|
nh->fib_nh_family = AF_INET;
|
||||||
|
|
||||||
nh->nh_pcpu_rth_output = alloc_percpu(struct rtable __rcu *);
|
nh->nh_pcpu_rth_output = alloc_percpu(struct rtable __rcu *);
|
||||||
if (!nh->nh_pcpu_rth_output)
|
if (!nh->nh_pcpu_rth_output)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
@@ -490,7 +492,10 @@ int fib_nh_init(struct net *net, struct fib_nh *nh,
|
|||||||
}
|
}
|
||||||
|
|
||||||
nh->fib_nh_oif = cfg->fc_oif;
|
nh->fib_nh_oif = cfg->fc_oif;
|
||||||
nh->fib_nh_gw4 = cfg->fc_gw;
|
if (cfg->fc_gw) {
|
||||||
|
nh->fib_nh_gw4 = cfg->fc_gw;
|
||||||
|
nh->fib_nh_has_gw = 1;
|
||||||
|
}
|
||||||
nh->fib_nh_flags = cfg->fc_flags;
|
nh->fib_nh_flags = cfg->fc_flags;
|
||||||
|
|
||||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||||
|
|||||||
@@ -2906,6 +2906,8 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
|
|||||||
int addr_type;
|
int addr_type;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
fib6_nh->fib_nh_family = AF_INET6;
|
||||||
|
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
if (cfg->fc_ifindex) {
|
if (cfg->fc_ifindex) {
|
||||||
dev = dev_get_by_index(net, cfg->fc_ifindex);
|
dev = dev_get_by_index(net, cfg->fc_ifindex);
|
||||||
@@ -2999,6 +3001,7 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
|
|||||||
|
|
||||||
set_dev:
|
set_dev:
|
||||||
fib6_nh->fib_nh_dev = dev;
|
fib6_nh->fib_nh_dev = dev;
|
||||||
|
fib6_nh->fib_nh_oif = dev->ifindex;
|
||||||
err = 0;
|
err = 0;
|
||||||
out:
|
out:
|
||||||
if (idev)
|
if (idev)
|
||||||
|
|||||||
Reference in New Issue
Block a user