diff mbox series

[RFC,net-next,3/8] nexthop: Refactor nexthop_for_each_fib6_nh

Message ID 20200610034953.28861-4-dsahern@kernel.org
State RFC
Delegated to: David Miller
Headers show
Series nexthop: Add support for active-backup nexthop type | expand

Commit Message

David Ahern June 10, 2020, 3:49 a.m. UTC
Refactor nexthop_for_each_fib6_nh moving standalone and group processing
into helpers. Prepatory patch for adding active-backup group.

Signed-off-by: David Ahern <dsahern@kernel.org>
---
 net/ipv4/nexthop.c | 48 +++++++++++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 15 deletions(-)
diff mbox series

Patch

diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
index 7d0a170821f3..940f46a7d533 100644
--- a/net/ipv4/nexthop.c
+++ b/net/ipv4/nexthop.c
@@ -588,34 +588,52 @@  struct nexthop *nexthop_select_path(struct nexthop *nh, int hash)
 }
 EXPORT_SYMBOL_GPL(nexthop_select_path);
 
+static int nexthop_fib6_nh_cb(struct nexthop *nh,
+			      int (*cb)(struct fib6_nh *nh, void *arg),
+			      void *arg)
+{
+	struct nh_info *nhi;
+
+	nhi = rcu_dereference_rtnl(nh->nh_info);
+
+	return cb(&nhi->fib6_nh, arg);
+}
+
+static int nexthop_fib6_nhg_cb(struct nh_group *nhg,
+			       int (*cb)(struct fib6_nh *nh, void *arg),
+			       void *arg)
+{
+	int err;
+	int i;
+
+	for (i = 0; i < nhg->num_nh; i++) {
+		struct nh_grp_entry *nhge = &nhg->nh_entries[i];
+		struct nexthop *nh = nhge->nh;
+
+		err = nexthop_fib6_nh_cb(nh, cb, arg);
+		if (err)
+			return err;
+	}
+
+	return 0;
+}
+
 int nexthop_for_each_fib6_nh(struct nexthop *nh,
 			     int (*cb)(struct fib6_nh *nh, void *arg),
 			     void *arg)
 {
-	struct nh_info *nhi;
 	int err;
 
 	if (nh->is_group) {
 		struct nh_group *nhg;
-		int i;
 
 		nhg = rcu_dereference_rtnl(nh->nh_grp);
-		for (i = 0; i < nhg->num_nh; i++) {
-			struct nh_grp_entry *nhge = &nhg->nh_entries[i];
-
-			nhi = rcu_dereference_rtnl(nhge->nh->nh_info);
-			err = cb(&nhi->fib6_nh, arg);
-			if (err)
-				return err;
-		}
+		err = nexthop_fib6_nhg_cb(nhg, cb, arg);
 	} else {
-		nhi = rcu_dereference_rtnl(nh->nh_info);
-		err = cb(&nhi->fib6_nh, arg);
-		if (err)
-			return err;
+		err = nexthop_fib6_nh_cb(nh, cb, arg);
 	}
 
-	return 0;
+	return err;
 }
 EXPORT_SYMBOL_GPL(nexthop_for_each_fib6_nh);