summaryrefslogtreecommitdiffstats
path: root/net/ipv4/nexthop.c
diff options
context:
space:
mode:
authorPetr Machata <petrm@nvidia.com>2021-01-28 13:49:23 +0100
committerJakub Kicinski <kuba@kernel.org>2021-01-29 05:49:53 +0100
commite948217d258f35b248578f7b400d6df23ac562da (patch)
treeec23e963b85d1b2ee3d0cc3caf830cd899821428 /net/ipv4/nexthop.c
parentnexthop: Extract a helper for walking the next-hop tree (diff)
downloadlinux-e948217d258f35b248578f7b400d6df23ac562da.tar.xz
linux-e948217d258f35b248578f7b400d6df23ac562da.zip
nexthop: Add a callback parameter to rtm_dump_walk_nexthops()
In order to allow different handling for next-hop tree dumper and for bucket dumper, parameterize the next-hop tree walker with a callback. Add rtm_dump_nexthop_cb() with just the bits relevant for next-hop tree dumping. Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/ipv4/nexthop.c')
-rw-r--r--net/ipv4/nexthop.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c
index e5175f531ffb..9536cf2f6aca 100644
--- a/net/ipv4/nexthop.c
+++ b/net/ipv4/nexthop.c
@@ -2083,9 +2083,11 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
struct netlink_callback *cb,
struct rb_root *root,
struct rtm_dump_nh_ctx *ctx,
- struct nh_dump_filter *filter)
+ int (*nh_cb)(struct sk_buff *skb,
+ struct netlink_callback *cb,
+ struct nexthop *nh, void *data),
+ void *data)
{
- struct nhmsg *nhm = nlmsg_data(cb->nlh);
struct rb_node *node;
int idx = 0, s_idx;
int err;
@@ -2098,14 +2100,9 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
goto cont;
nh = rb_entry(node, struct nexthop, rb_node);
- if (nh_dump_filtered(nh, filter, nhm->nh_family))
- goto cont;
-
ctx->idx = idx;
- err = nh_fill_node(skb, nh, RTM_NEWNEXTHOP,
- NETLINK_CB(cb->skb).portid,
- cb->nlh->nlmsg_seq, NLM_F_MULTI);
- if (err < 0)
+ err = nh_cb(skb, cb, nh, data);
+ if (err)
return err;
cont:
idx++;
@@ -2115,6 +2112,20 @@ cont:
return 0;
}
+static int rtm_dump_nexthop_cb(struct sk_buff *skb, struct netlink_callback *cb,
+ struct nexthop *nh, void *data)
+{
+ struct nhmsg *nhm = nlmsg_data(cb->nlh);
+ struct nh_dump_filter *filter = data;
+
+ if (nh_dump_filtered(nh, filter, nhm->nh_family))
+ return 0;
+
+ return nh_fill_node(skb, nh, RTM_NEWNEXTHOP,
+ NETLINK_CB(cb->skb).portid,
+ cb->nlh->nlmsg_seq, NLM_F_MULTI);
+}
+
/* rtnl */
static int rtm_dump_nexthop(struct sk_buff *skb, struct netlink_callback *cb)
{
@@ -2128,7 +2139,8 @@ static int rtm_dump_nexthop(struct sk_buff *skb, struct netlink_callback *cb)
if (err < 0)
return err;
- err = rtm_dump_walk_nexthops(skb, cb, root, ctx, &filter);
+ err = rtm_dump_walk_nexthops(skb, cb, root, ctx,
+ &rtm_dump_nexthop_cb, &filter);
if (err < 0) {
if (likely(skb->len))
goto out;