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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.