Commit b238290b authored by Neil Spring's avatar Neil Spring Committed by Andrii Nakryiko
Browse files

bpf: Permit ingress_ifindex in bpf_prog_test_run_xattr



bpf_prog_test_run_xattr takes a struct __sk_buff, but did not permit
that __skbuff to include an nonzero ingress_ifindex.

This patch updates to allow ingress_ifindex, convert the __sk_buff field to
sk_buff (skb_iif) and back, and tests that the value is present from on BPF
program side. The test sets an unlikely distinct value for ingress_ifindex
(11) from ifindex (1), which is in line with the rest of the synthetic field
tests.

Adding this support allows testing BPF that operates differently on
incoming and outgoing skbs by discriminating on this field.

Signed-off-by: default avatarNeil Spring <ntspring@fb.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20210831033356.1459316-1-ntspring@fb.com
parent 27151f17
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -483,11 +483,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
		return -EINVAL;

	/* priority is allowed */

	if (!range_is_zero(__skb, offsetofend(struct __sk_buff, priority),
			   offsetof(struct __sk_buff, ifindex)))
		return -EINVAL;

	/* ingress_ifindex is allowed */
	/* ifindex is allowed */

	if (!range_is_zero(__skb, offsetofend(struct __sk_buff, ifindex),
@@ -516,6 +512,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)

	skb->mark = __skb->mark;
	skb->priority = __skb->priority;
	skb->skb_iif = __skb->ingress_ifindex;
	skb->tstamp = __skb->tstamp;
	memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN);

@@ -545,6 +542,7 @@ static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)

	__skb->mark = skb->mark;
	__skb->priority = skb->priority;
	__skb->ingress_ifindex = skb->skb_iif;
	__skb->ifindex = skb->dev->ifindex;
	__skb->tstamp = skb->tstamp;
	memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
+5 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ void test_skb_ctx(void)
		.cb[3] = 4,
		.cb[4] = 5,
		.priority = 6,
		.ingress_ifindex = 11,
		.ifindex = 1,
		.tstamp = 7,
		.wire_len = 100,
@@ -97,6 +98,10 @@ void test_skb_ctx(void)
		   "ctx_out_ifindex",
		   "skb->ifindex == %d, expected %d\n",
		   skb.ifindex, 1);
	CHECK_ATTR(skb.ingress_ifindex != 11,
		   "ctx_out_ingress_ifindex",
		   "skb->ingress_ifindex == %d, expected %d\n",
		   skb.ingress_ifindex, 11);
	CHECK_ATTR(skb.tstamp != 8,
		   "ctx_out_tstamp",
		   "skb->tstamp == %lld, expected %d\n",
+4 −0
Original line number Diff line number Diff line
@@ -25,6 +25,10 @@ int process(struct __sk_buff *skb)
		return 1;
	if (skb->gso_size != 10)
		return 1;
	if (skb->ingress_ifindex != 11)
		return 1;
	if (skb->ifindex != 1)
		return 1;

	return 0;
}