bpf: Permit ingress_ifindex in bpf_prog_test_run_xattr
authorNeil Spring <ntspring@fb.com>
Tue, 31 Aug 2021 03:33:56 +0000 (20:33 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Tue, 7 Sep 2021 23:55:32 +0000 (16:55 -0700)
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: Neil Spring <ntspring@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20210831033356.1459316-1-ntspring@fb.com
net/bpf/test_run.c
tools/testing/selftests/bpf/prog_tests/skb_ctx.c
tools/testing/selftests/bpf/progs/test_skb_ctx.c

index 2eb0e55ef54d221f61e1b721b3c9016f3f6a9780..1153b89c9d9342aafdf765f6284087dafb489cc5 100644 (file)
@@ -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);
index fafeddaad6a998e33ea99d95be5440fd6ed32558..2bf8c687348b00ca80052f4f44f1bb789a109026 100644 (file)
@@ -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",
index b02ea589ce7eaa308d36f81b75a7063de8713e3e..bbd5a9c1c4df379998617fa3e8abce7a610923f5 100644 (file)
@@ -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;
 }