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

Commit b051d96b authored by David Ahern's avatar David Ahern Committed by Amit Pundir
Browse files

net: diag: Add support to filter on device index



Add support to inet_diag facility to filter sockets based on device
index. If an interface index is in the filter only sockets bound
to that index (sk_bound_dev_if) are returned.

[backport of net-next 637c841dd7a5f9bd97b75cbe90b526fa1a52e530]

Change-Id: I7a75a3f9f6438382c9e3c4310c8f9d13898d063a
Signed-off-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 223b70d7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ enum {
	INET_DIAG_BC_AUTO,
	INET_DIAG_BC_S_COND,
	INET_DIAG_BC_D_COND,
	INET_DIAG_BC_DEV_COND,   /* u32 ifindex */
};

struct inet_diag_hostcond {
+25 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ struct inet_diag_entry {
	struct in6_addr saddr_storage;	/* for IPv4-mapped-IPv6 addresses */
	struct in6_addr daddr_storage;	/* for IPv4-mapped-IPv6 addresses */
#endif
	u32 ifindex;
};

static DEFINE_MUTEX(inet_diag_table_mutex);
@@ -507,6 +508,14 @@ static int inet_diag_bc_run(const struct nlattr *_bc,
			yes = 0;
			break;
		}
		case INET_DIAG_BC_DEV_COND: {
			u32 ifindex;

			ifindex = *((const u32 *)(op + 1));
			if (ifindex != entry->ifindex)
				yes = 0;
			break;
		}
		}

		if (yes) {
@@ -543,6 +552,7 @@ int inet_diag_bc_sk(const struct nlattr *bc, struct sock *sk)
	entry.sport = inet->inet_num;
	entry.dport = ntohs(inet->inet_dport);
	entry.userlocks = sk->sk_userlocks;
	entry.ifindex = sk->sk_bound_dev_if;

	return inet_diag_bc_run(bc, &entry);
}
@@ -565,6 +575,17 @@ static int valid_cc(const void *bc, int len, int cc)
	return 0;
}

/* data is u32 ifindex */
static bool valid_devcond(const struct inet_diag_bc_op *op, int len,
			  int *min_len)
{
	/* Check ifindex space. */
	*min_len += sizeof(u32);
	if (len < *min_len)
		return false;

	return true;
}
/* Validate an inet_diag_hostcond. */
static bool valid_hostcond(const struct inet_diag_bc_op *op, int len,
			   int *min_len)
@@ -630,6 +651,10 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len)
			if (!valid_hostcond(bc, len, &min_len))
				return -EINVAL;
			break;
		case INET_DIAG_BC_DEV_COND:
			if (!valid_devcond(bc, len, &min_len))
				return -EINVAL;
			break;
		case INET_DIAG_BC_S_GE:
		case INET_DIAG_BC_S_LE:
		case INET_DIAG_BC_D_GE: