diff mbox series

[net-next,13/13] net: Use common nexthop init and release helpers

Message ID 20190327032942.20473-14-dsahern@kernel.org
State Changes Requested
Delegated to: David Miller
Headers show
Series net: Move fib_nh and fib6_nh to a common struct | expand

Commit Message

David Ahern March 27, 2019, 3:29 a.m. UTC
From: David Ahern <dsahern@gmail.com>

With fib_nh_common in place, move common initialization and release
code into helpers used by both ipv4 and ipv6. For the moment, the init
is just the lwt encap and the release is both the net dev reference and
the the lwt state reference. More will be added later.

Signed-off-by: David Ahern <dsahern@gmail.com>
---
 include/net/ip_fib.h     |  4 ++++
 net/ipv4/fib_semantics.c | 60 +++++++++++++++++++++++++++++++-----------------
 net/ipv6/route.c         | 21 ++++-------------
 3 files changed, 48 insertions(+), 37 deletions(-)

Comments

Ido Schimmel March 27, 2019, 9:46 a.m. UTC | #1
On Tue, Mar 26, 2019 at 08:29:42PM -0700, David Ahern wrote:
> From: David Ahern <dsahern@gmail.com>
> 
> With fib_nh_common in place, move common initialization and release
> code into helpers used by both ipv4 and ipv6. For the moment, the init
> is just the lwt encap and the release is both the net dev reference and

s/net dev/netdev/

> the the lwt state reference. More will be added later.
> 
> Signed-off-by: David Ahern <dsahern@gmail.com>
> ---
>  include/net/ip_fib.h     |  4 ++++
>  net/ipv4/fib_semantics.c | 60 +++++++++++++++++++++++++++++++-----------------

I don't really mind, but shouldn't the common parts be placed under
net/core/ ? Like how the FIB rules have a common code in
net/core/fib_rules.c ?

>  net/ipv6/route.c         | 21 ++++-------------
>  3 files changed, 48 insertions(+), 37 deletions(-)
David Ahern March 27, 2019, 2:22 p.m. UTC | #2
On 3/27/19 3:46 AM, Ido Schimmel wrote:
> On Tue, Mar 26, 2019 at 08:29:42PM -0700, David Ahern wrote:
>> From: David Ahern <dsahern@gmail.com>
>>
>> With fib_nh_common in place, move common initialization and release
>> code into helpers used by both ipv4 and ipv6. For the moment, the init
>> is just the lwt encap and the release is both the net dev reference and
> 
> s/net dev/netdev/
> 
>> the the lwt state reference. More will be added later.
>>
>> Signed-off-by: David Ahern <dsahern@gmail.com>
>> ---
>>  include/net/ip_fib.h     |  4 ++++
>>  net/ipv4/fib_semantics.c | 60 +++++++++++++++++++++++++++++++-----------------
> 
> I don't really mind, but shouldn't the common parts be placed under
> net/core/ ? Like how the FIB rules have a common code in
> net/core/fib_rules.c ?
> 

net/core is for common code across networking protocols.

Code common between just IPv4 and IPv6 is currently in net/ipv4
diff mbox series

Patch

diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 70548b1a6322..12a6d759cf57 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -441,6 +441,10 @@  int fib_nh_init(struct net *net, struct fib_nh *fib_nh,
 		struct fib_config *cfg, int nh_weight,
 		struct netlink_ext_ack *extack);
 void fib_nh_release(struct net *net, struct fib_nh *fib_nh);
+int fib_nh_common_init(struct fib_nh_common *nhc, struct nlattr *fc_encap,
+		       u16 fc_encap_type, void *cfg, gfp_t gfp_flags,
+		       struct netlink_ext_ack *extack);
+void fib_nh_common_release(struct fib_nh_common *nhc);
 
 /* Exported by fib_trie.c */
 void fib_trie_init(void);
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index b44ee0404260..d5738bc8904c 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -204,16 +204,22 @@  static void rt_fibinfo_free_cpus(struct rtable __rcu * __percpu *rtp)
 	free_percpu(rtp);
 }
 
+void fib_nh_common_release(struct fib_nh_common *nhc)
+{
+	if (nhc->nhc_dev)
+		dev_put(nhc->nhc_dev);
+
+	lwtstate_put(nhc->nhc_lwtstate);
+}
+EXPORT_SYMBOL_GPL(fib_nh_common_release);
+
 void fib_nh_release(struct net *net, struct fib_nh *fib_nh)
 {
 #ifdef CONFIG_IP_ROUTE_CLASSID
 	if (fib_nh->nh_tclassid)
 		net->ipv4.fib_num_tclassid_users--;
 #endif
-	if (fib_nh->fib_nh_dev)
-		dev_put(fib_nh->fib_nh_dev);
-
-	lwtstate_put(fib_nh->fib_nh_lws);
+	fib_nh_common_release(&fib_nh->nh_common);
 	free_nh_exceptions(fib_nh);
 	rt_fibinfo_free_cpus(fib_nh->nh_pcpu_rth_output);
 	rt_fibinfo_free(&fib_nh->nh_rth_input);
@@ -462,6 +468,30 @@  static int fib_detect_death(struct fib_info *fi, int order,
 	return 1;
 }
 
+int fib_nh_common_init(struct fib_nh_common *nhc, struct nlattr *encap,
+		       u16 encap_type, void *cfg, gfp_t gfp_flags,
+		       struct netlink_ext_ack *extack)
+{
+	if (encap) {
+		struct lwtunnel_state *lwtstate;
+		int err;
+
+		if (encap_type == LWTUNNEL_ENCAP_NONE) {
+			NL_SET_ERR_MSG(extack, "LWT encap type not specified");
+			return -EINVAL;
+		}
+		err = lwtunnel_build_state(encap_type, encap, nhc->nhc_family,
+					   cfg, &lwtstate, extack);
+		if (err)
+			return err;
+
+		nhc->nhc_lwtstate = lwtstate_get(lwtstate);
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(fib_nh_common_init);
+
 int fib_nh_init(struct net *net, struct fib_nh *nh,
 		struct fib_config *cfg, int nh_weight,
 		struct netlink_ext_ack *extack)
@@ -474,26 +504,14 @@  int fib_nh_init(struct net *net, struct fib_nh *nh,
 	if (!nh->nh_pcpu_rth_output)
 		goto failure;
 
-	if (cfg->fc_encap) {
-		struct lwtunnel_state *lwtstate;
-
-		err = -EINVAL;
-		if (cfg->fc_encap_type == LWTUNNEL_ENCAP_NONE) {
-			NL_SET_ERR_MSG(extack, "LWT encap type not specified");
-			goto failure;
-		}
-		err = lwtunnel_build_state(cfg->fc_encap_type,
-					   cfg->fc_encap, AF_INET, cfg,
-					   &lwtstate, extack);
-		if (err)
-			goto failure;
-
-		nh->fib_nh_lws = lwtstate_get(lwtstate);
-	}
+	err = fib_nh_common_init(&nh->nh_common, cfg->fc_encap,
+				 cfg->fc_encap_type, cfg, GFP_KERNEL, extack);
+	if (err)
+		goto failure;
 
 	nh->fib_nh_oif   = cfg->fc_oif;
 	if (cfg->fc_gw) {
-		nh->fib_nh_gw4   = cfg->fc_gw;
+		nh->fib_nh_gw4 = cfg->fc_gw;
 		nh->fib_nh_has_gw = 1;
 	}
 	nh->fib_nh_flags = cfg->fc_flags;
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 490834c5758b..250c439242ff 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2921,18 +2921,6 @@  int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
 		fib6_nh->fib_nh_flags |= RTNH_F_ONLINK;
 	}
 
-	if (cfg->fc_encap) {
-		struct lwtunnel_state *lwtstate;
-
-		err = lwtunnel_build_state(cfg->fc_encap_type,
-					   cfg->fc_encap, AF_INET6, cfg,
-					   &lwtstate, extack);
-		if (err)
-			goto out;
-
-		fib6_nh->fib_nh_lws = lwtstate_get(lwtstate);
-	}
-
 	fib6_nh->fib_nh_weight = 1;
 
 	/* We cannot add true routes via loopback here,
@@ -2990,6 +2978,10 @@  int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
 	    !netif_carrier_ok(dev))
 		fib6_nh->fib_nh_flags |= RTNH_F_LINKDOWN;
 
+	err = fib_nh_common_init(&fib6_nh->nh_common, cfg->fc_encap,
+				 cfg->fc_encap_type, cfg, gfp_flags, extack);
+	if (err)
+		goto out;
 set_dev:
 	fib6_nh->fib_nh_dev = dev;
 	fib6_nh->fib_nh_oif = dev->ifindex;
@@ -3006,10 +2998,7 @@  int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
 
 void fib6_nh_release(struct fib6_nh *fib6_nh)
 {
-	if (fib6_nh->fib_nh_dev)
-		dev_put(fib6_nh->fib_nh_dev);
-
-	lwtstate_put(fib6_nh->fib_nh_lws);
+	fib_nh_common_release(&fib6_nh->nh_common);
 }
 
 static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,