From: Yonghong Song <yhs@fb.com>
To: Zvi Effron <zeffron@riotgames.com>
Cc: bpf <bpf@vger.kernel.org>, Alexei Starovoitov <ast@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Daniel Borkmann <daniel@iogearbox.net>,
Jesper Dangaard Brouer <hawk@kernel.org>,
Andrii Nakryiko <andrii.nakryiko@gmail.com>,
Maciej Fijalkowski <maciej.fijalkowski@intel.com>,
Martin KaFai Lau <kafai@fb.com>, Cody Haas <chaas@riotgames.com>,
Lisa Watanabe <lwatanabe@riotgames.com>
Subject: Re: [PATCH bpf-next v4 3/3] selftests/bpf: Add test for xdp_md context in BPF_PROG_TEST_RUN
Date: Wed, 9 Jun 2021 17:11:36 -0700 [thread overview]
Message-ID: <0915c55e-ea90-1d43-4431-a4959ce3d7ec@fb.com> (raw)
In-Reply-To: <CAC1LvL08QdD-4D_q2TEt3wv+8N=xbfmMdPwZPyA+MoZV=0KKMA@mail.gmail.com>
On 6/9/21 10:07 AM, Zvi Effron wrote:
> On Sat, Jun 5, 2021 at 11:19 PM Yonghong Song <yhs@fb.com> wrote:
>> On 6/4/21 3:02 PM, Zvi Effron wrote:
>>> + opts.ctx_in = &ctx_in;
>>> + opts.ctx_size_in = sizeof(ctx_in);
>>> +
>>> + opts.ctx_in = &ctx_in;
>>> + opts.ctx_size_in = sizeof(ctx_in);
>>
>> The above two assignments are redundant.
>>
>
> Good catch.
>
>>> + ctx_in.data_meta = 0;
>>> + ctx_in.data = sizeof(__u32);
>>> + ctx_in.data_end = ctx_in.data + sizeof(pkt_v4);
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_OK(err, "bpf_prog_test_run(test1)");
>>> + ASSERT_EQ(opts.retval, XDP_PASS, "test1-retval");
>>> + ASSERT_EQ(opts.data_size_out, sizeof(pkt_v4), "test1-datasize");
>>> + ASSERT_EQ(opts.ctx_size_out, opts.ctx_size_in, "test1-ctxsize");
>>> + ASSERT_EQ(ctx_out.data_meta, 0, "test1-datameta");
>>> + ASSERT_EQ(ctx_out.data, ctx_out.data_meta, "test1-data");
>>
>> I suggest just to test ctx_out.data == 0. It just happens
>> the input data - meta = 4 and bpf program adjuested by 4.
>> If they are not the same, the result won't be equal to data_meta.
>>
>
> Sure.
>
>>> + ASSERT_EQ(ctx_out.data_end, sizeof(pkt_v4), "test1-dataend");
>>> +
>>> + /* Data past the end of the kernel's struct xdp_md must be 0 */
>>> + bad_ctx[sizeof(bad_ctx) - 1] = 1;
>>> + opts.ctx_in = bad_ctx;
>>> + opts.ctx_size_in = sizeof(bad_ctx);
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_EQ(errno, 22, "test2-errno");
>>> + ASSERT_ERR(err, "bpf_prog_test_run(test2)");
>>
>> I suggest to drop this test. Basically you did here
>> is to have non-zero egress_ifindex which is not allowed.
>> You have a test below.
>>
>
> We think the actual correction here is that bad_ctx is supposed to be one byte
> larger than than struct xdp_md. It is misdeclared. We'll correct that.
>
>>> +
>>> + /* The egress cannot be specified */
>>> + ctx_in.egress_ifindex = 1;
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_EQ(errno, 22, "test3-errno");
>>
>> Use EINVAL explicitly? The same for below a few other cases.
>>
>
> Good suggestion.
>
>>> + ASSERT_ERR(err, "bpf_prog_test_run(test3)");
>>> +
>>> + /* data_meta must reference the start of data */
>>> + ctx_in.data_meta = sizeof(__u32);
>>> + ctx_in.data = ctx_in.data_meta;
>>> + ctx_in.data_end = ctx_in.data + sizeof(pkt_v4);
>>> + ctx_in.egress_ifindex = 0;
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_EQ(errno, 22, "test4-errno");
>>> + ASSERT_ERR(err, "bpf_prog_test_run(test4)");
>>> +
>>> + /* Metadata must be 32 bytes or smaller */
>>> + ctx_in.data_meta = 0;
>>> + ctx_in.data = sizeof(__u32)*9;
>>> + ctx_in.data_end = ctx_in.data + sizeof(pkt_v4);
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_EQ(errno, 22, "test5-errno");
>>> + ASSERT_ERR(err, "bpf_prog_test_run(test5)");
>>
>> This test is not necessary if ctx size should be
>> <= sizeof(struct xdp_md). So far, I think we can
>> require it must be sizeof(struct xdp_md). If
>> in the future, kernel struct xdp_md is extended,
>> it may be changed to accept both old and new
>> xdp_md's similar to other uapi data strcture
>> like struct bpf_prog_info if there is a desire.
>> In my opinion, the kernel should just stick
>> to sizeof(struct xdp_md) size since the functionality
>> is implemented as a *testing* mechanism.
>>
>
> You might be confusing the context (struct xdp_md) with the XDP metadata (data
> just before the frame data). XDP allows at most 32 bytes of metadata. This test
> is verifying that a metadata size >32 bytes is rejected.
Right, you can keep this test. Previously I suggested to enforce
sizeof(struct xdp_md) as the ctx size, but that may be too restrictive.
>
>>> + ctx_in.ingress_ifindex = 1;
>>> + ctx_in.rx_queue_index = 1;
>>> + err = bpf_prog_test_run_opts(prog_fd, &opts);
>>> + ASSERT_EQ(errno, 22, "test10-errno");
>>> + ASSERT_ERR(err, "bpf_prog_test_run(test10)");
>>
>> Why this failure? I guess it is due to device search failure, right?
>> So this test MAY succeed if the underlying host happens with
>> a proper configuration with ingress_ifindex = 1 and rx_queue_index = 1,
>> right?
>>
>
> I may be making incorrect assumptions, but my understanding is that interface
> index 1 is always the loopback interface, and the loopback interface only ever
> (in current kernels) has one rx queue. If that's not the case, we'll need to
> adjust (or remove) the test.
You could be correct. Please add some comments though.
>
>>> +
>>> + test_xdp_context_test_run__destroy(skel);
>>> +}
[...]
next prev parent reply other threads:[~2021-06-10 0:11 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-04 22:02 [PATCH bpf-next v4 0/3] bpf: support input xdp_md context in BPF_PROG_TEST_RUN Zvi Effron
2021-06-04 22:02 ` [PATCH bpf-next v4 1/3] " Zvi Effron
2021-06-06 3:17 ` Yonghong Song
2021-06-07 17:58 ` Martin KaFai Lau
2021-06-09 17:06 ` Zvi Effron
2021-06-10 0:07 ` Yonghong Song
2021-06-04 22:02 ` [PATCH bpf-next v4 2/3] bpf: support specifying ingress via " Zvi Effron
2021-06-06 3:36 ` Yonghong Song
2021-06-04 22:02 ` [PATCH bpf-next v4 3/3] selftests/bpf: Add test for " Zvi Effron
2021-06-06 4:18 ` Yonghong Song
2021-06-09 17:07 ` Zvi Effron
2021-06-10 0:11 ` Yonghong Song [this message]
2021-06-06 5:36 ` Yonghong Song
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0915c55e-ea90-1d43-4431-a4959ce3d7ec@fb.com \
--to=yhs@fb.com \
--cc=andrii.nakryiko@gmail.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=chaas@riotgames.com \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=hawk@kernel.org \
--cc=kafai@fb.com \
--cc=lwatanabe@riotgames.com \
--cc=maciej.fijalkowski@intel.com \
--cc=zeffron@riotgames.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox