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:
Родитель
ad1601ae02
Коммит
f1741730dd
|
@ -19,6 +19,7 @@
|
|||
#include <linux/notifier.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/flow.h>
|
||||
#include <net/ip_fib.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/inetpeer.h>
|
||||
#include <net/fib_notifier.h>
|
||||
|
@ -125,14 +126,7 @@ struct rt6_exception {
|
|||
#define FIB6_MAX_DEPTH 5
|
||||
|
||||
struct fib6_nh {
|
||||
struct in6_addr fib_nh_gw6;
|
||||
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 fib_nh_common nh_common;
|
||||
};
|
||||
|
||||
struct fib6_info {
|
||||
|
|
|
@ -76,27 +76,48 @@ struct fnhe_hash_bucket {
|
|||
#define FNHE_HASH_SIZE (1 << FNHE_HASH_SHIFT)
|
||||
#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 net_device *fib_nh_dev;
|
||||
struct fib_nh_common nh_common;
|
||||
struct hlist_node nh_hash;
|
||||
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
|
||||
__u32 nh_tclassid;
|
||||
#endif
|
||||
int fib_nh_oif;
|
||||
__be32 fib_nh_gw4;
|
||||
__be32 nh_saddr;
|
||||
int nh_saddr_genid;
|
||||
struct rtable __rcu * __percpu *nh_pcpu_rth_output;
|
||||
struct rtable __rcu *nh_rth_input;
|
||||
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;
|
||||
|
||||
nh->fib_nh_family = AF_INET;
|
||||
|
||||
nh->nh_pcpu_rth_output = alloc_percpu(struct rtable __rcu *);
|
||||
if (!nh->nh_pcpu_rth_output)
|
||||
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_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;
|
||||
|
||||
#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 err;
|
||||
|
||||
fib6_nh->fib_nh_family = AF_INET6;
|
||||
|
||||
err = -ENODEV;
|
||||
if (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:
|
||||
fib6_nh->fib_nh_dev = dev;
|
||||
fib6_nh->fib_nh_oif = dev->ifindex;
|
||||
err = 0;
|
||||
out:
|
||||
if (idev)
|
||||
|
|
Загрузка…
Ссылка в новой задаче