netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create
@ 2019-03-21 12:21 David Ahern
  2019-03-21 12:21 ` [PATCH net-next 1/2] ipv6: Move setting default metric for routes David Ahern
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: David Ahern @ 2019-03-21 12:21 UTC (permalink / raw)
  To: davem, netdev; +Cc: David Ahern

From: David Ahern <dsahern@gmail.com>

addrconf_f6i_alloc is the last caller of fib6_info_alloc besides
ip6_route_info_create. There really is no good reason for it do
its own fib6_info initialization, so convert it to call 
ip6_route_info_create.

David Ahern (2):
  ipv6: Move setting default metric for routes
  ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create

 include/net/ip6_fib.h |  3 ++-
 net/ipv6/route.c      | 50 ++++++++++++++++++++------------------------------
 2 files changed, 22 insertions(+), 31 deletions(-)

-- 
2.11.0


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH net-next 1/2] ipv6: Move setting default metric for routes
  2019-03-21 12:21 [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
@ 2019-03-21 12:21 ` David Ahern
  2019-03-21 12:21 ` [PATCH net-next 2/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
  2019-03-21 17:17 ` [PATCH net-next 0/2] " David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David Ahern @ 2019-03-21 12:21 UTC (permalink / raw)
  To: davem, netdev; +Cc: David Ahern

From: David Ahern <dsahern@gmail.com>

ip6_route_info_create is a low level function for ensuring fc_metric is
set. Move the check and default setting to the 2 locations that do not
already set fc_metric before calling ip6_route_info_create. This is
required for the next patch which moves addrconf allocations to
ip6_route_info_create and want the metric for host routes to be 0.

Signed-off-by: David Ahern <dsahern@gmail.com>
---
 net/ipv6/route.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index c9a2f0f2dea6..d52f215870e2 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -2950,9 +2950,6 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
 			goto out;
 	}
 
-	if (cfg->fc_metric == 0)
-		cfg->fc_metric = IP6_RT_PRIO_USER;
-
 	if (cfg->fc_flags & RTNH_F_ONLINK) {
 		if (!dev) {
 			NL_SET_ERR_MSG(extack,
@@ -3603,7 +3600,7 @@ static void rtmsg_to_fib6_config(struct net *net,
 		.fc_table = l3mdev_fib_table_by_index(net, rtmsg->rtmsg_ifindex) ?
 			 : RT6_TABLE_MAIN,
 		.fc_ifindex = rtmsg->rtmsg_ifindex,
-		.fc_metric = rtmsg->rtmsg_metric,
+		.fc_metric = rtmsg->rtmsg_metric ? : IP6_RT_PRIO_USER,
 		.fc_expires = rtmsg->rtmsg_info,
 		.fc_dst_len = rtmsg->rtmsg_dst_len,
 		.fc_src_len = rtmsg->rtmsg_src_len,
@@ -4523,6 +4520,9 @@ static int inet6_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh,
 	if (err < 0)
 		return err;
 
+	if (cfg.fc_metric == 0)
+		cfg.fc_metric = IP6_RT_PRIO_USER;
+
 	if (cfg.fc_mp)
 		return ip6_route_multipath_add(&cfg, extack);
 	else
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH net-next 2/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create
  2019-03-21 12:21 [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
  2019-03-21 12:21 ` [PATCH net-next 1/2] ipv6: Move setting default metric for routes David Ahern
@ 2019-03-21 12:21 ` David Ahern
  2019-03-21 17:17 ` [PATCH net-next 0/2] " David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David Ahern @ 2019-03-21 12:21 UTC (permalink / raw)
  To: davem, netdev; +Cc: David Ahern

From: David Ahern <dsahern@gmail.com>

Change addrconf_f6i_alloc to generate a fib6_config and call
ip6_route_info_create. addrconf_f6i_alloc is the last caller to
fib6_info_alloc besides ip6_route_info_create, and there is no
reason for it to do its own initialization on a fib6_info.

Host routes need to be created even if the device is down, so add a
new flag, fc_ignore_dev_down, to fib6_config and update fib6_nh_init
to not error out if device is not up.

Notes on the conversion:
- ip_fib_metrics_init is the same as fib6_config has fc_mx set to NULL
  and fc_mx_len set to 0
- dst_nocount is handled by the RTF_ADDRCONF flag
- dst_host is handled by fc_dst_len = 128

nh_gw does not get set after the conversion to ip6_route_info_create
but it should not be set in addrconf_f6i_alloc since this is a host
route not a gateway route.

Everything else is a straight forward map between fib6_info and
fib6_config.

Signed-off-by: David Ahern <dsahern@gmail.com>
---
 include/net/ip6_fib.h |  3 ++-
 net/ipv6/route.c      | 42 ++++++++++++++++--------------------------
 2 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index 84097010237c..2acb78a762ee 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -50,7 +50,8 @@ struct fib6_config {
 	u32		fc_protocol;
 	u16		fc_type;        /* only 8 bits are used */
 	u16		fc_delete_all_nh : 1,
-			__unused : 15;
+			fc_ignore_dev_down:1,
+			__unused : 14;
 
 	struct in6_addr	fc_dst;
 	struct in6_addr	fc_src;
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index d52f215870e2..b804be3cbf05 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -3078,7 +3078,7 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,
 		goto out;
 	}
 
-	if (!(dev->flags & IFF_UP)) {
+	if (!(dev->flags & IFF_UP) && !cfg->fc_ignore_dev_down) {
 		NL_SET_ERR_MSG(extack, "Nexthop device is not up");
 		err = -ENETDOWN;
 		goto out;
@@ -3711,36 +3711,26 @@ struct fib6_info *addrconf_f6i_alloc(struct net *net,
 				     const struct in6_addr *addr,
 				     bool anycast, gfp_t gfp_flags)
 {
-	u32 tb_id;
-	struct net_device *dev = idev->dev;
-	struct fib6_info *f6i;
-
-	f6i = fib6_info_alloc(gfp_flags);
-	if (!f6i)
-		return ERR_PTR(-ENOMEM);
+	struct fib6_config cfg = {
+		.fc_table = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL,
+		.fc_ifindex = idev->dev->ifindex,
+		.fc_flags = RTF_UP | RTF_ADDRCONF | RTF_NONEXTHOP,
+		.fc_dst = *addr,
+		.fc_dst_len = 128,
+		.fc_protocol = RTPROT_KERNEL,
+		.fc_nlinfo.nl_net = net,
+		.fc_ignore_dev_down = true,
+	};
 
-	f6i->fib6_metrics = ip_fib_metrics_init(net, NULL, 0, NULL);
-	f6i->dst_nocount = true;
-	f6i->dst_host = true;
-	f6i->fib6_protocol = RTPROT_KERNEL;
-	f6i->fib6_flags = RTF_UP | RTF_NONEXTHOP;
 	if (anycast) {
-		f6i->fib6_type = RTN_ANYCAST;
-		f6i->fib6_flags |= RTF_ANYCAST;
+		cfg.fc_type = RTN_ANYCAST;
+		cfg.fc_flags |= RTF_ANYCAST;
 	} else {
-		f6i->fib6_type = RTN_LOCAL;
-		f6i->fib6_flags |= RTF_LOCAL;
+		cfg.fc_type = RTN_LOCAL;
+		cfg.fc_flags |= RTF_LOCAL;
 	}
 
-	f6i->fib6_nh.nh_gw = *addr;
-	dev_hold(dev);
-	f6i->fib6_nh.nh_dev = dev;
-	f6i->fib6_dst.addr = *addr;
-	f6i->fib6_dst.plen = 128;
-	tb_id = l3mdev_fib_table(idev->dev) ? : RT6_TABLE_LOCAL;
-	f6i->fib6_table = fib6_get_table(net, tb_id);
-
-	return f6i;
+	return ip6_route_info_create(&cfg, gfp_flags, NULL);
 }
 
 /* remove deleted ip from prefsrc entries */
-- 
2.11.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create
  2019-03-21 12:21 [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
  2019-03-21 12:21 ` [PATCH net-next 1/2] ipv6: Move setting default metric for routes David Ahern
  2019-03-21 12:21 ` [PATCH net-next 2/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
@ 2019-03-21 17:17 ` David Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2019-03-21 17:17 UTC (permalink / raw)
  To: dsahern; +Cc: netdev, dsahern

From: David Ahern <dsahern@kernel.org>
Date: Thu, 21 Mar 2019 05:21:33 -0700

> From: David Ahern <dsahern@gmail.com>
> 
> addrconf_f6i_alloc is the last caller of fib6_info_alloc besides
> ip6_route_info_create. There really is no good reason for it do
> its own fib6_info initialization, so convert it to call 
> ip6_route_info_create.

Looks great, series applied.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-03-21 17:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-21 12:21 [PATCH net-next 0/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
2019-03-21 12:21 ` [PATCH net-next 1/2] ipv6: Move setting default metric for routes David Ahern
2019-03-21 12:21 ` [PATCH net-next 2/2] ipv6: Change addrconf_f6i_alloc to use ip6_route_info_create David Ahern
2019-03-21 17:17 ` [PATCH net-next 0/2] " David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).