sync with latest libbpf
authorYonghong Song <yhs@fb.com>
Sat, 20 Mar 2021 00:02:58 +0000 (17:02 -0700)
committeryonghong-song <ys114321@gmail.com>
Sat, 20 Mar 2021 02:24:12 +0000 (19:24 -0700)
sync with latest libbpf with top commit:
  092a60685625 Makefile: fix install flags order

Signed-off-by: Yonghong Song <yhs@fb.com>
docs/kernel-versions.md
src/cc/compat/linux/virtual_bpf.h
src/cc/export/helpers.h
src/cc/libbpf
src/cc/libbpf.c

index eda7eaf2e314575d5d6af7bf2ca4971c4e9a2804..5f6014d654ede62354adea825559f9640746baa6 100644 (file)
@@ -208,6 +208,7 @@ Helper | Kernel version | License | Commit |
 -------|----------------|---------|--------|
 `BPF_FUNC_bind()` | 4.17 |  | [`d74bad4e74ee`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d74bad4e74ee373787a9ae24197c17b7cdc428d5) |
 `BPF_FUNC_bprm_opts_set()` | 5.11 |  | [`3f6719c7b62f`](https://github.com/torvalds/linux/commit/3f6719c7b62f0327c9091e26d0da10e65668229e)
+`BPF_FUNC_check_mtu()` | 5.12 |  | [`34b2021cc616`](https://github.com/torvalds/linux/commit/34b2021cc61642d61c3cf943d9e71925b827941b)
 `BPF_FUNC_clone_redirect()` | 4.2 |  | [`3896d655f4d4`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=3896d655f4d491c67d669a15f275a39f713410f8)
 `BPF_FUNC_copy_from_user()` | 5.10 |  | [`07be4c4a3e7a`](https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit?id=07be4c4a3e7a0db148e44b16c5190e753d1c8569)
 `BPF_FUNC_csum_diff()` | 4.6 |  | [`7d672345ed29`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=7d672345ed295b1356a5d9f7111da1d1d7d65867)
@@ -216,6 +217,7 @@ Helper | Kernel version | License | Commit |
 `BPF_FUNC_current_task_under_cgroup()` | 4.9 |  | [`60d20f9195b2`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=60d20f9195b260bdf0ac10c275ae9f6016f9c069)
 `BPF_FUNC_d_path()` | 5.10 |  | [`6e22ab9da793`](https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit?id=6e22ab9da79343532cd3cde39df25e5a5478c692)
 `BPF_FUNC_fib_lookup()` | 4.18 | GPL | [`87f5fc7e48dd`](https://git.kernel.org/cgit/linux/kernel/git/davem/net-next.git/commit/?id=87f5fc7e48dd3175b30dd03b41564e1a8e136323)
+`BPF_FUNC_for_each_map_elem()` | 5.13 | | [`69c087ba6225`](https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git/commit?id=69c087ba6225b574afb6e505b72cb75242a3d844)
 `BPF_FUNC_get_current_ancestor_cgroup_id()` | 5.6 |  | [`b4490c5c4e02`](https://github.com/torvalds/linux/commit/b4490c5c4e023f09b7d27c9a9d3e7ad7d09ea6bf)
 `BPF_FUNC_get_cgroup_classid()` | 4.3 |  | [`8d20aabe1c76`](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=8d20aabe1c76cccac544d9fcc3ad7823d9e98a2d)
 `BPF_FUNC_get_current_cgroup_id()` | 4.18 |  | [`bf6fa2c893c5`](https://github.com/torvalds/linux/commit/bf6fa2c893c5237b48569a13fa3c673041430b6c)
index b6221a466a2111f2a9924a743c8ca9ac43412eb6..c12d7a25d4da711558dddacbecc523a03afd99bd 100644 (file)
@@ -20,7 +20,8 @@ R"********(
 
 /* ld/ldx fields */
 #define BPF_DW         0x18    /* double word (64-bit) */
-#define BPF_XADD       0xc0    /* exclusive add */
+#define BPF_ATOMIC     0xc0    /* atomic memory ops - op type in immediate */
+#define BPF_XADD       0xc0    /* exclusive add - legacy name */
 
 /* alu/jmp fields */
 #define BPF_MOV                0xb0    /* mov reg to reg */
@@ -44,6 +45,11 @@ R"********(
 #define BPF_CALL       0x80    /* function call */
 #define BPF_EXIT       0x90    /* function return */
 
+/* atomic op type fields (stored in immediate) */
+#define BPF_FETCH      0x01    /* not an opcode on its own, used to build others */
+#define BPF_XCHG       (0xe0 | BPF_FETCH)      /* atomic exchange */
+#define BPF_CMPXCHG    (0xf0 | BPF_FETCH)      /* atomic compare-and-write */
+
 /* Register numbers */
 enum {
        BPF_REG_0 = 0,
@@ -388,6 +394,15 @@ enum bpf_link_type {
  *                   is struct/union.
  */
 #define BPF_PSEUDO_BTF_ID      3
+/* insn[0].src_reg:  BPF_PSEUDO_FUNC
+ * insn[0].imm:      insn offset to the func
+ * insn[1].imm:      0
+ * insn[0].off:      0
+ * insn[1].off:      0
+ * ldimm64 rewrite:  address of the function
+ * verifier type:    PTR_TO_FUNC.
+ */
+#define BPF_PSEUDO_FUNC                4
 
 /* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative
  * offset to another bpf function
@@ -1651,22 +1666,30 @@ union bpf_attr {
  *             networking traffic statistics as it provides a global socket
  *             identifier that can be assumed unique.
  *     Return
- *             A 8-byte long non-decreasing number on success, or 0 if the
- *             socket field is missing inside *skb*.
+ *             A 8-byte long unique number on success, or 0 if the socket
+ *             field is missing inside *skb*.
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx)
  *     Description
  *             Equivalent to bpf_get_socket_cookie() helper that accepts
  *             *skb*, but gets socket from **struct bpf_sock_addr** context.
  *     Return
- *             A 8-byte long non-decreasing number.
+ *             A 8-byte long unique number.
  *
  * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx)
  *     Description
  *             Equivalent to **bpf_get_socket_cookie**\ () helper that accepts
  *             *skb*, but gets socket from **struct bpf_sock_ops** context.
  *     Return
- *             A 8-byte long non-decreasing number.
+ *             A 8-byte long unique number.
+ *
+ * u64 bpf_get_socket_cookie(struct sock *sk)
+ *     Description
+ *             Equivalent to **bpf_get_socket_cookie**\ () helper that accepts
+ *             *sk*, but gets socket from a BTF **struct sock**. This helper
+ *             also works for sleepable programs.
+ *     Return
+ *             A 8-byte long unique number or 0 if *sk* is NULL.
  *
  * u32 bpf_get_socket_uid(struct sk_buff *skb)
  *     Return
@@ -2226,6 +2249,9 @@ union bpf_attr {
  *             * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the
  *               packet is not forwarded or needs assist from full stack
  *
+ *             If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU
+ *             was exceeded and output params->mtu_result contains the MTU.
+ *
  * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  *     Description
  *             Add an entry to, or update a sockhash *map* referencing sockets.
@@ -2449,7 +2475,7 @@ union bpf_attr {
  *             running simultaneously.
  *
  *             A user should care about the synchronization by himself.
- *             For example, by using the **BPF_STX_XADD** instruction to alter
+ *             For example, by using the **BPF_ATOMIC** instructions to alter
  *             the shared data.
  *     Return
  *             A pointer to the local storage area.
@@ -2994,10 +3020,10 @@ union bpf_attr {
  *             string length is larger than *size*, just *size*-1 bytes are
  *             copied and the last byte is set to NUL.
  *
- *             On success, the length of the copied string is returned. This
- *             makes this helper useful in tracing programs for reading
- *             strings, and more importantly to get its length at runtime. See
- *             the following snippet:
+ *             On success, returns the number of bytes that were written,
+ *             including the terminal NUL. This makes this helper useful in
+ *             tracing programs for reading strings, and more importantly to
+ *             get its length at runtime. See the following snippet:
  *
  *             ::
  *
@@ -3025,7 +3051,7 @@ union bpf_attr {
  *             **->mm->env_start**: using this helper and the return value,
  *             one can quickly iterate at the right offset of the memory area.
  *     Return
- *             On success, the strictly positive length of the string,
+ *             On success, the strictly positive length of the output string,
  *             including the trailing NUL character. On error, a negative
  *             value.
  *
@@ -3831,6 +3857,96 @@ union bpf_attr {
  *     Return
  *             A pointer to a struct socket on success or NULL if the file is
  *             not a socket.
+ *
+ * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags)
+ *     Description
+ *             Check ctx packet size against exceeding 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. Providing an *len_diff* adjustment that is larger than the
+ *             actual packet size (resulting in negative packet size) will in
+ *             principle not exceed the MTU, why it is not considered a
+ *             failure.  Other BPF-helpers are needed for performing the
+ *             planned size change, why the responsability for catch a negative
+ *             packet size belong in those helpers.
+ *
+ *             Specifying *ifindex* zero means the MTU check is performed
+ *             against the current net device.  This is practical if this isn't
+ *             used prior to redirect.
+ *
+ *             The Linux kernel route table can configure MTUs on a more
+ *             specific per route level, which is not provided by this helper.
+ *             For route level MTU checks use the **bpf_fib_lookup**\ ()
+ *             helper.
+ *
+ *             *ctx* is either **struct xdp_md** for XDP programs or
+ *             **struct sk_buff** for tc cls_act programs.
+ *
+ *             The *flags* argument can be a combination of one or more of the
+ *             following values:
+ *
+ *             **BPF_MTU_CHK_SEGS**
+ *                     This flag will only works for *ctx* **struct sk_buff**.
+ *                     If packet context contains extra packet segment buffers
+ *                     (often knows as GSO skb), then MTU check is harder to
+ *                     check at this point, because in transmit path it is
+ *                     possible for the skb packet to get re-segmented
+ *                     (depending on net device features).  This could still be
+ *                     a MTU violation, so this flag enables performing MTU
+ *                     check against segments, with a different violation
+ *                     return code to tell it apart. Check cannot use len_diff.
+ *
+ *             On return *mtu_len* pointer contains the MTU value of the net
+ *             device.  Remember the net device configured MTU is the L3 size,
+ *             which is returned here and XDP and TX length operate at L2.
+ *             Helper take this into account for you, but remember when using
+ *             MTU value in your BPF-code.  On input *mtu_len* must be a valid
+ *             pointer and be initialized (to zero), else verifier will reject
+ *             BPF program.
+ *
+ *     Return
+ *             * 0 on success, and populate MTU value in *mtu_len* pointer.
+ *
+ *             * < 0 if any input argument is invalid (*mtu_len* not updated)
+ *
+ *             MTU violations return positive values, but also populate MTU
+ *             value in *mtu_len* pointer, as this can be needed for
+ *             implementing PMTU handing:
+ *
+ *             * **BPF_MTU_CHK_RET_FRAG_NEEDED**
+ *             * **BPF_MTU_CHK_RET_SEGS_TOOBIG**
+ *
+ * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags)
+ *     Description
+ *             For each element in **map**, call **callback_fn** function with
+ *             **map**, **callback_ctx** and other map-specific parameters.
+ *             The **callback_fn** should be a static function and
+ *             the **callback_ctx** should be a pointer to the stack.
+ *             The **flags** is used to control certain aspects of the helper.
+ *             Currently, the **flags** must be 0.
+ *
+ *             The following are a list of supported map types and their
+ *             respective expected callback signatures:
+ *
+ *             BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH,
+ *             BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH,
+ *             BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY
+ *
+ *             long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx);
+ *
+ *             For per_cpu maps, the map_value is the value on the cpu where the
+ *             bpf_prog is running.
+ *
+ *             If **callback_fn** return 0, the helper will continue to the next
+ *             element. If return value is 1, the helper will skip the rest of
+ *             elements and return. Other return values are not used now.
+ *
+ *     Return
+ *             The number of traversed map elements for success, **-EINVAL** for
+ *             invalid **flags**.
  */
 #define __BPF_FUNC_MAPPER(FN)          \
        FN(unspec),                     \
@@ -3996,6 +4112,8 @@ union bpf_attr {
        FN(ktime_get_coarse_ns),        \
        FN(ima_inode_hash),             \
        FN(sock_from_file),             \
+       FN(check_mtu),                  \
+       FN(for_each_map_elem),          \
        /* */
 
 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
@@ -4496,6 +4614,7 @@ struct bpf_prog_info {
        __aligned_u64 prog_tags;
        __u64 run_time_ns;
        __u64 run_cnt;
+       __u64 recursion_misses;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {
@@ -4976,9 +5095,13 @@ struct bpf_fib_lookup {
        __be16  sport;
        __be16  dport;
 
-       /* total length of packet from network header - used for MTU check */
-       __u16   tot_len;
+       union { /* used for MTU check */
+               /* input to lookup */
+               __u16   tot_len; /* L3 length from network hdr (iph->tot_len) */
 
+               /* output: MTU value */
+               __u16   mtu_result;
+       };
        /* input: L3 device index for lookup
         * output: device index from FIB lookup
         */
@@ -5024,6 +5147,17 @@ struct bpf_redir_neigh {
        };
 };
 
+/* bpf_check_mtu flags*/
+enum  bpf_check_mtu_flags {
+       BPF_MTU_CHK_SEGS  = (1U << 0),
+};
+
+enum bpf_check_mtu_ret {
+       BPF_MTU_CHK_RET_SUCCESS,      /* check and lookup successful */
+       BPF_MTU_CHK_RET_FRAG_NEEDED,  /* fragmentation required to fwd */
+       BPF_MTU_CHK_RET_SEGS_TOOBIG,  /* GSO re-segmentation needed to fwd */
+};
+
 enum bpf_task_fd_type {
        BPF_FD_TYPE_RAW_TRACEPOINT,     /* tp name */
        BPF_FD_TYPE_TRACEPOINT,         /* tp name */
index ce8c00e3c6fa23bda5c17e2a40caed456878aefb..c232441516ccd8e7b71e4cb0058e7a7f7ba08a8f 100644 (file)
@@ -837,6 +837,12 @@ static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) =
 struct file;
 static struct socket *(*bpf_sock_from_file)(struct file *file) =
   (void *)BPF_FUNC_sock_from_file;
+static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len,
+                             __s32 len_diff, __u64 flags) =
+  (void *)BPF_FUNC_check_mtu;
+static long (*bpf_for_each_map_elem)(void *map, void *callback_fn,
+                                     void *callback_ctx, __u64 flags) =
+  (void *)BPF_FUNC_for_each_map_elem;
 
 /* llvm builtin functions that eBPF C program may use to
  * emit BPF_LD_ABS and BPF_LD_IND instructions
index 051a4009f94d5633a8f734ca4235f0a78ee90469..092a606856252091ccbded34114d544280c24d35 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 051a4009f94d5633a8f734ca4235f0a78ee90469
+Subproject commit 092a606856252091ccbded34114d544280c24d35
index f7d6996af068ea578db802e823ecfc5358afeea3..b473f2c28ff625fef960bc5c078e43fdb3d22593 100644 (file)
@@ -261,6 +261,8 @@ static struct bpf_helper helpers[] = {
   {"ktime_get_coarse_ns", "5.11"},
   {"ima_inode_hash", "5.11"},
   {"sock_from_file", "5.11"},
+  {"check_mtu", "5.12"},
+  {"for_each_map_elem", "5.13"},
 };
 
 static uint64_t ptr_to_u64(void *ptr)