Commit f1741730 authored by David Ahern's avatar David Ahern Committed by David S. Miller

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: default avatarDavid Ahern <dsahern@gmail.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ad1601ae
...@@ -19,6 +19,7 @@ ...@@ -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 { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment