From: Shmulik Ladkani <shmulik@metanetworks.com>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: John Fastabend <john.fastabend@gmail.com>,
Daniel Borkmann <daniel@iogearbox.net>,
bpf@vger.kernel.org, Alexei Starovoitov <ast@kernel.org>,
Andrii Nakryiko <andrii@kernel.org>,
Paul Chaignon <paul@isovalent.com>,
Shmulik Ladkani <shmulik.ladkani@gmail.com>
Subject: Re: [PATCH v3 bpf-next 1/3] bpf: Support setting variable-length tunnel options
Date: Wed, 31 Aug 2022 22:40:45 +0300 [thread overview]
Message-ID: <20220831224045.00f71de5@blondie> (raw)
In-Reply-To: <CAJnrk1b0oy4MQW9aucSCRDRg3dJq8fbA29YMM_Xo7F-YfnTH7w@mail.gmail.com>
On Wed, 31 Aug 2022 12:07:28 -0700
Joanne Koong <joannelkoong@gmail.com> wrote:
> > option B: bpf_skb_set_tunnel_opt_dynptr
> > ---------------------------------------
> >
> > struct tun_opts {
> > __u8 data[MAX_OPT_SZ];
> > };
> > BPF_MAP_TYPE_HASH opts_map; // __type(value, tun_opts)
> > BPF_MAP_TYPE_HASH opts_len_map; // __type(value, __u32)
> >
> > ...
> >
> > struct bpf_dynptr dptr;
> > struct tun_opts *opts;
> > __u32 *opts_len;
> >
> > opts = bpf_map_lookup_elem(&opts_map, &the_flow_key);
> > opts_len = bpf_map_lookup_elem(&opts_len_map, &the_flow_key);
> >
> > bpf_dynptr_from_mem(opts, sizeof(*opts), 0, &dptr); // construct a dynptr from the raw option data
> > bpf_dynptr_trim(&dptr, opts_len); // trim it based on stored option len
> > bpf_skb_set_tunnel_opt_dynptr(skb, &dptr);
> >
> >
> > IMO, the 2nd user program is less readable:
> > - need to store the received options length in a separate map
> > - 5 bpf function calls instead of 2
>
> I don't think you need a separate map to store the opts length.
You are correct, I was under the impression that 'bpf_dynptr_from_mem'
will *only* accept the exact pointer to the map element, due to the
verifier checking this:
case BPF_FUNC_dynptr_from_mem:
if (regs[BPF_REG_1].type != PTR_TO_MAP_VALUE) {
verbose(env, "Unsupported reg type %s for bpf_dynptr_from_mem data\n",
However I found out this is also allowed by the verifier:
struct tun_opts {
__u32 len;
__u8 data[MAX_OPT_SZ];
};
opts = bpf_map_lookup_elem(&opts_map, &the_flow_key);
bpf_dynptr_from_mem(opts->data, sizeof(opts->data), 0, &dptr);
bpf_dynptr_trim(&dptr, opts->len);
bpf_skb_set_tunnel_opt_dynptr(skb, &dptr);
Nevertheless, IMO it doesn't change the argument about the better
readability and simplicity of the "bpf_skb_set_var_tunnel_opt" approach:
opts = bpf_map_lookup_elem(&opts_map, &the_flow_key);
bpf_skb_set_var_tunnel_opt(skb, opts->data, sizeof(opts->data), opts->len);
which is more straight forward.
It even allows the bpf program to set tunnel options *without* using a
map element at all, e.g. this usecase:
__u8 data[MAX_OPT_SZ];
len = bpf_skb_get_tunnel_opt(skb, data, sizeof(data));
...
// fiddle with the skb, the tunnel key, the tunnel remote, or whatever.
// then send again on a collect-md interface, setting same tunnel
// opts as seen.
...
bpf_skb_set_var_tunnel_opt(skb, data, sizeof(data), len);
bpf_redirect()
Best,
Shmulik
next prev parent reply other threads:[~2022-08-31 19:40 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-08-22 5:21 [PATCH v3 bpf-next 0/3] bpf: Support setting variable-length tunnel options Shmulik Ladkani
2022-08-22 5:21 ` [PATCH v3 bpf-next 1/3] " Shmulik Ladkani
2022-08-23 7:59 ` John Fastabend
2022-08-23 9:47 ` Shmulik Ladkani
2022-08-31 8:34 ` Shmulik Ladkani
2022-08-31 19:07 ` Joanne Koong
2022-08-31 19:40 ` Shmulik Ladkani [this message]
2022-09-02 15:51 ` Shmulik Ladkani
2022-08-22 5:21 ` [PATCH v3 bpf-next 2/3] selftests/bpf: Simplify test_tunnel setup for allowing non-local tunnel traffic Shmulik Ladkani
2022-08-22 5:21 ` [PATCH v3 bpf-next 3/3] selftests/bpf: Add geneve with bpf_skb_set_var_tunnel_opt test-case to test_progs Shmulik Ladkani
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=20220831224045.00f71de5@blondie \
--to=shmulik@metanetworks.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=joannelkoong@gmail.com \
--cc=john.fastabend@gmail.com \
--cc=paul@isovalent.com \
--cc=shmulik.ladkani@gmail.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