Skip to content
Snippets Groups Projects
  1. Sep 12, 2024
  2. Sep 11, 2024
  3. Aug 29, 2024
  4. Jun 23, 2024
  5. May 28, 2024
  6. May 26, 2024
  7. May 25, 2024
  8. May 15, 2024
  9. Apr 29, 2024
  10. Apr 26, 2024
  11. Apr 21, 2024
  12. Apr 05, 2024
  13. Mar 04, 2024
  14. Mar 03, 2024
    • Dave Thaler's avatar
      bpf, docs: Use IETF format for field definitions in instruction-set.rst · 4e73e1bc
      Dave Thaler authored
      In preparation for publication as an IETF RFC, the WG chairs asked me
      to convert the document to use IETF packet format for field layout, so
      this patch attempts to make it consistent with other IETF documents.
      
      Some fields that are not byte aligned were previously inconsistent
      in how values were defined.  Some were defined as the value of the
      byte containing the field (like 0x20 for a field holding the high
      four bits of the byte), and others were defined as the value of the
      field itself (like 0x2).  This PR makes them be consistent in using
      just the values of the field itself, which is IETF convention.
      
      As a result, some of the defines that used BPF_* would no longer
      match the value in the spec, and so this patch also drops the BPF_*
      prefix to avoid confusion with the defines that are the full-byte
      equivalent values.  For consistency, BPF_* is then dropped from
      other fields too.  BPF_<foo> is thus the Linux implementation-specific
      define for <foo> as it appears in the BPF ISA specification.
      
      The syntax BPF_ADD | BPF_X | BPF_ALU only worked for full-byte
      values so the convention {ADD, X, ALU} is proposed for referring
      to field values instead.
      
      Also replace the redundant "LSB bits" with "least significant bits".
      
      A preview of what the resulting Internet Draft would look like can
      be seen at:
      https://htmlpreview.github.io/?https://raw.githubusercontent.com/dthaler/ebp
      
      
      f-docs-1/format/draft-ietf-bpf-isa.html
      
      v1->v2: Fix sphinx issue as recommended by David Vernet
      
      Signed-off-by: default avatarDave Thaler <dthaler1968@gmail.com>
      Acked-by: default avatarDavid Vernet <void@manifault.com>
      Link: https://lore.kernel.org/r/20240301222337.15931-1-dthaler1968@gmail.com
      
      
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      4e73e1bc
  15. Feb 29, 2024
    • Kees Cook's avatar
      bpf: Replace bpf_lpm_trie_key 0-length array with flexible array · 896880ff
      Kees Cook authored
      
      Replace deprecated 0-length array in struct bpf_lpm_trie_key with
      flexible array. Found with GCC 13:
      
      ../kernel/bpf/lpm_trie.c:207:51: warning: array subscript i is outside array bounds of 'const __u8[0]' {aka 'const unsigned char[]'} [-Warray-bounds=]
        207 |                                        *(__be16 *)&key->data[i]);
            |                                                   ^~~~~~~~~~~~~
      ../include/uapi/linux/swab.h:102:54: note: in definition of macro '__swab16'
        102 | #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x))
            |                                                      ^
      ../include/linux/byteorder/generic.h:97:21: note: in expansion of macro '__be16_to_cpu'
         97 | #define be16_to_cpu __be16_to_cpu
            |                     ^~~~~~~~~~~~~
      ../kernel/bpf/lpm_trie.c:206:28: note: in expansion of macro 'be16_to_cpu'
        206 |                 u16 diff = be16_to_cpu(*(__be16 *)&node->data[i]
      ^
            |                            ^~~~~~~~~~~
      In file included from ../include/linux/bpf.h:7:
      ../include/uapi/linux/bpf.h:82:17: note: while referencing 'data'
         82 |         __u8    data[0];        /* Arbitrary size */
            |                 ^~~~
      
      And found at run-time under CONFIG_FORTIFY_SOURCE:
      
        UBSAN: array-index-out-of-bounds in kernel/bpf/lpm_trie.c:218:49
        index 0 is out of range for type '__u8 [*]'
      
      Changing struct bpf_lpm_trie_key is difficult since has been used by
      userspace. For example, in Cilium:
      
      	struct egress_gw_policy_key {
      	        struct bpf_lpm_trie_key lpm_key;
      	        __u32 saddr;
      	        __u32 daddr;
      	};
      
      While direct references to the "data" member haven't been found, there
      are static initializers what include the final member. For example,
      the "{}" here:
      
              struct egress_gw_policy_key in_key = {
                      .lpm_key = { 32 + 24, {} },
                      .saddr   = CLIENT_IP,
                      .daddr   = EXTERNAL_SVC_IP & 0Xffffff,
              };
      
      To avoid the build time and run time warnings seen with a 0-sized
      trailing array for struct bpf_lpm_trie_key, introduce a new struct
      that correctly uses a flexible array for the trailing bytes,
      struct bpf_lpm_trie_key_u8. As part of this, include the "header"
      portion (which is just the "prefixlen" member), so it can be used
      by anything building a bpf_lpr_trie_key that has trailing members that
      aren't a u8 flexible array (like the self-test[1]), which is named
      struct bpf_lpm_trie_key_hdr.
      
      Unfortunately, C++ refuses to parse the __struct_group() helper, so
      it is not possible to define struct bpf_lpm_trie_key_hdr directly in
      struct bpf_lpm_trie_key_u8, so we must open-code the union directly.
      
      Adjust the kernel code to use struct bpf_lpm_trie_key_u8 through-out,
      and for the selftest to use struct bpf_lpm_trie_key_hdr. Add a comment
      to the UAPI header directing folks to the two new options.
      
      Reported-by: default avatarMark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: default avatarGustavo A. R. Silva <gustavoars@kernel.org>
      Closes: https://paste.debian.net/hidden/ca500597/
      Link: https://lore.kernel.org/all/202206281009.4332AA33@keescook/ [1]
      Link: https://lore.kernel.org/bpf/20240222155612.it.533-kees@kernel.org
      896880ff
  16. Feb 22, 2024
  17. Feb 13, 2024
  18. Feb 06, 2024
  19. Feb 05, 2024
  20. Feb 01, 2024
  21. Jan 29, 2024
  22. Jan 26, 2024
  23. Jan 23, 2024
  24. Dec 10, 2023
  25. Dec 02, 2023
  26. Nov 17, 2023
  27. Nov 10, 2023
  28. Nov 02, 2023
  29. Oct 18, 2023
  30. Oct 12, 2023
  31. Sep 13, 2023
Loading