Commit e948217d authored by Petr Machata's avatar Petr Machata Committed by Jakub Kicinski

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: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent cbee1807
...@@ -2083,9 +2083,11 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb, ...@@ -2083,9 +2083,11 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
struct netlink_callback *cb, struct netlink_callback *cb,
struct rb_root *root, struct rb_root *root,
struct rtm_dump_nh_ctx *ctx, 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; struct rb_node *node;
int idx = 0, s_idx; int idx = 0, s_idx;
int err; int err;
...@@ -2098,14 +2100,9 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb, ...@@ -2098,14 +2100,9 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
goto cont; goto cont;
nh = rb_entry(node, struct nexthop, rb_node); nh = rb_entry(node, struct nexthop, rb_node);
if (nh_dump_filtered(nh, filter, nhm->nh_family))
goto cont;
ctx->idx = idx; ctx->idx = idx;
err = nh_fill_node(skb, nh, RTM_NEWNEXTHOP, err = nh_cb(skb, cb, nh, data);
NETLINK_CB(cb->skb).portid, if (err)
cb->nlh->nlmsg_seq, NLM_F_MULTI);
if (err < 0)
return err; return err;
cont: cont:
idx++; idx++;
...@@ -2115,6 +2112,20 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb, ...@@ -2115,6 +2112,20 @@ static int rtm_dump_walk_nexthops(struct sk_buff *skb,
return 0; 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 */ /* rtnl */
static int rtm_dump_nexthop(struct sk_buff *skb, struct netlink_callback *cb) 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) ...@@ -2128,7 +2139,8 @@ static int rtm_dump_nexthop(struct sk_buff *skb, struct netlink_callback *cb)
if (err < 0) if (err < 0)
return err; 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 (err < 0) {
if (likely(skb->len)) if (likely(skb->len))
goto out; goto out;
......
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