[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87blmyvmc1.fsf@cloudflare.com>
Date: Fri, 08 May 2020 10:54:06 +0200
From: Jakub Sitnicki <jakub@...udflare.com>
To: Martin KaFai Lau <kafai@...com>
Cc: Lorenz Bauer <lmb@...udflare.com>,
Networking <netdev@...r.kernel.org>, bpf <bpf@...r.kernel.org>,
dccp@...r.kernel.org, kernel-team <kernel-team@...udflare.com>,
Alexei Starovoitov <ast@...nel.org>,
"Daniel Borkmann" <daniel@...earbox.net>,
"David S. Miller" <davem@...emloft.net>,
Eric Dumazet <edumazet@...gle.com>,
Gerrit Renker <gerrit@....abdn.ac.uk>,
Jakub Kicinski <kuba@...nel.org>,
Marek Majkowski <marek@...udflare.com>
Subject: Re: [PATCH bpf-next 02/17] bpf: Introduce SK_LOOKUP program type with a dedicated attach point
On Thu, May 07, 2020 at 10:55 PM CEST, Martin KaFai Lau wrote:
> On Wed, May 06, 2020 at 03:53:35PM +0200, Jakub Sitnicki wrote:
>> On Wed, May 06, 2020 at 03:16 PM CEST, Lorenz Bauer wrote:
>> > On Wed, 6 May 2020 at 13:55, Jakub Sitnicki <jakub@...udflare.com> wrote:
>>
>> [...]
>>
>> >> @@ -4012,4 +4051,18 @@ struct bpf_pidns_info {
>> >> __u32 pid;
>> >> __u32 tgid;
>> >> };
>> >> +
>> >> +/* User accessible data for SK_LOOKUP programs. Add new fields at the end. */
>> >> +struct bpf_sk_lookup {
>> >> + __u32 family; /* AF_INET, AF_INET6 */
>> >> + __u32 protocol; /* IPPROTO_TCP, IPPROTO_UDP */
>> >> + /* IP addresses allows 1, 2, and 4 bytes access */
>> >> + __u32 src_ip4;
>> >> + __u32 src_ip6[4];
>> >> + __u32 src_port; /* network byte order */
>> >> + __u32 dst_ip4;
>> >> + __u32 dst_ip6[4];
>> >> + __u32 dst_port; /* host byte order */
>> >
>> > Jakub and I have discussed this off-list, but we couldn't come to an
>> > agreement and decided to invite
>> > your opinion.
>> >
>> > I think that dst_port should be in network byte order, since it's one
>> > less exception to the
>> > rule to think about when writing BPF programs.
>> >
>> > Jakub's argument is that this follows __sk_buff->local_port precedent,
>> > which is also in host
>> > byte order.
>>
>> Yes, would be great to hear if there is a preference here.
>>
>> Small correction, proposed sk_lookup program doesn't have access to
>> __sk_buff, so perhaps that case matters less.
>>
>> bpf_sk_lookup->dst_port, the packet destination port, is in host byte
>> order so that it can be compared against bpf_sock->src_port, socket
>> local port, without conversion.
>>
>> But I also see how it can be a surprise for a BPF user that one field has
>> a different byte order.
> I would also prefer port and addr were all in the same byte order.
> However, it is not the cases for the other prog_type ctx.
> People has stomped on it from time to time. May be something
> can be done at the libbpf to hide this difference.
>
> I think uapi consistency with other existing ctx is more important here.
> (i.e. keep the "local" port in host order). Otherwise, the user will
> be slapped left and right when writting bpf_prog in different prog_type.
>
> Armed with the knowledge on skc_num, the "local" port is
> in host byte order in the current existing prog ctx. It is
> unfortunate that the "dst"_port in this patch is the "local" port.
> The "local" port in "struct bpf_sock" is actually the "src"_port. :/
> Would "local"/"remote" be clearer than "src"/dst" in this patch?
I went and compared the field naming and byte order in existing structs:
| struct | field | byte order |
|----------------+------------+------------|
| __sk_buff | local_port | host |
| sk_msg_md | local_port | host |
| bpf_sock_ops | local_port | host |
| bpf_sock | src_port | host |
| bpf_fib_lookup | dport | network |
| bpf_flow_keys | dport | network |
| bpf_sock_tuple | dport | network |
| bpf_sock_addr | user_port | network |
It does look like "local"/"remote" prefix is the sensible choice.
I got carried away trying to match the field names with bpf_sock, which
actually doesn't follow the naming convention.
Will rename fields to local_*, remote_* in v2.
Powered by blists - more mailing lists