Re: [PATCH bpf-next V11 4/7] bpf: add BPF-helper for MTU checking

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 1/14/21 6:52 AM, Jesper Dangaard Brouer wrote:
On Tue, 12 Jan 2021 11:23:33 -0800
Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> wrote:

On Tue, Jan 12, 2021 at 9:49 AM Jesper Dangaard Brouer
<brouer@xxxxxxxxxx> wrote:

This BPF-helper bpf_check_mtu() works for both XDP and TC-BPF programs.

The SKB object is complex and the skb->len value (accessible from
BPF-prog) also include the length of any extra GRO/GSO segments, but
without taking into account that these GRO/GSO segments get added
transport (L4) and network (L3) headers before being transmitted. Thus,
this BPF-helper is created such that the BPF-programmer don't need to
handle these details in the BPF-prog.

The API is designed to help the BPF-programmer, that want to do packet
context size changes, which involves other helpers. These other helpers
usually does a delta size adjustment. This helper also support a delta
size (len_diff), which allow BPF-programmer to reuse arguments needed by
these other helpers, and perform the MTU check prior to doing any actual
size adjustment of the packet context.

It is on purpose, that we allow the len adjustment to become a negative
result, that will pass the MTU check. This might seem weird, but it's not
this helpers responsibility to "catch" wrong len_diff adjustments. Other
helpers will take care of these checks, if BPF-programmer chooses to do
actual size adjustment.

V9:
- Use dev->hard_header_len (instead of ETH_HLEN)
- Annotate with unlikely req from Daniel
- Fix logic error using skb_gso_validate_network_len from Daniel

V6:
- Took John's advice and dropped BPF_MTU_CHK_RELAX
- Returned MTU is kept at L3-level (like fib_lookup)

V4: Lot of changes
  - ifindex 0 now use current netdev for MTU lookup
  - rename helper from bpf_mtu_check to bpf_check_mtu
  - fix bug for GSO pkt length (as skb->len is total len)
  - remove __bpf_len_adj_positive, simply allow negative len adj

Signed-off-by: Jesper Dangaard Brouer <brouer@xxxxxxxxxx>
---
  include/uapi/linux/bpf.h       |   67 ++++++++++++++++++++++
  net/core/filter.c              |  122 ++++++++++++++++++++++++++++++++++++++++
  tools/include/uapi/linux/bpf.h |   67 ++++++++++++++++++++++
  3 files changed, 256 insertions(+)

diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 649586d656b6..fa2e99351758 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -3833,6 +3833,61 @@ union bpf_attr {
   *     Return
   *             A pointer to a struct socket on success or NULL if the file is
   *             not a socket.
+ *
+ * int bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags)

should return long, same as most other helpers

Is it enough to change it here?
(as this will be used for generating the helpers header file,
via ./scripts/bpf_helpers_doc.py --header)

Just change here is enough.


Or do I also need to change bpf_func_proto.ret_type ?

There is no need to change bpf_func_proto.ret_type.
RET_INTEGER already implies 64bit scalar.


+ *     Description
+ *             Check ctx packet size against MTU of net device (based on
+ *             *ifindex*).  This helper will likely be used in combination with
+ *             helpers that adjust/change the packet size.  The argument
+ *             *len_diff* can be used for querying with a planned size
+ *             change. This allows to check MTU prior to changing packet ctx.
+ *

[...]







[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux