Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16660f0b authored by David Ahern's avatar David Ahern Committed by David S. Miller
Browse files

net: Add support for filtering neigh dump by device index



Add support for filtering neighbor dumps by device by adding the
NDA_IFINDEX attribute to the dump request.

Signed-off-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
Reviewed-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e892406f
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -2249,6 +2249,14 @@ static bool neigh_master_filtered(struct net_device *dev, int master_idx)
	return false;
}

static bool neigh_ifindex_filtered(struct net_device *dev, int filter_idx)
{
	if (filter_idx && dev->ifindex != filter_idx)
		return true;

	return false;
}

static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
			    struct netlink_callback *cb)
{
@@ -2259,16 +2267,19 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
	int rc, h, s_h = cb->args[1];
	int idx, s_idx = idx = cb->args[2];
	struct neigh_hash_table *nht;
	int filter_master_idx = 0;
	int filter_master_idx = 0, filter_idx = 0;
	unsigned int flags = NLM_F_MULTI;
	int err;

	err = nlmsg_parse(nlh, sizeof(struct ndmsg), tb, NDA_MAX, NULL);
	if (!err) {
		if (tb[NDA_IFINDEX])
			filter_idx = nla_get_u32(tb[NDA_IFINDEX]);

		if (tb[NDA_MASTER])
			filter_master_idx = nla_get_u32(tb[NDA_MASTER]);

		if (filter_master_idx)
		if (filter_idx || filter_master_idx)
			flags |= NLM_F_DUMP_FILTERED;
	}

@@ -2283,6 +2294,8 @@ static int neigh_dump_table(struct neigh_table *tbl, struct sk_buff *skb,
		     n = rcu_dereference_bh(n->next)) {
			if (!net_eq(dev_net(n->dev), net))
				continue;
			if (neigh_ifindex_filtered(n->dev, filter_idx))
				continue;
			if (neigh_master_filtered(n->dev, filter_master_idx))
				continue;
			if (idx < s_idx)