@@ -356,18 +356,36 @@ enum bpf_link_type {
356
356
#define BPF_F_SLEEPABLE (1U << 4)
357
357
358
358
/* When BPF ldimm64's insn[0].src_reg != 0 then this can have
359
- * two extensions:
360
- *
361
- * insn[0].src_reg: BPF_PSEUDO_MAP_FD BPF_PSEUDO_MAP_VALUE
362
- * insn[0].imm: map fd map fd
363
- * insn[1].imm: 0 offset into value
364
- * insn[0].off: 0 0
365
- * insn[1].off: 0 0
366
- * ldimm64 rewrite: address of map address of map[0]+offset
367
- * verifier type: CONST_PTR_TO_MAP PTR_TO_MAP_VALUE
359
+ * the following extensions:
360
+ *
361
+ * insn[0].src_reg: BPF_PSEUDO_MAP_FD
362
+ * insn[0].imm: map fd
363
+ * insn[1].imm: 0
364
+ * insn[0].off: 0
365
+ * insn[1].off: 0
366
+ * ldimm64 rewrite: address of map
367
+ * verifier type: CONST_PTR_TO_MAP
368
368
*/
369
369
#define BPF_PSEUDO_MAP_FD 1
370
+ /* insn[0].src_reg: BPF_PSEUDO_MAP_VALUE
371
+ * insn[0].imm: map fd
372
+ * insn[1].imm: offset into value
373
+ * insn[0].off: 0
374
+ * insn[1].off: 0
375
+ * ldimm64 rewrite: address of map[0]+offset
376
+ * verifier type: PTR_TO_MAP_VALUE
377
+ */
370
378
#define BPF_PSEUDO_MAP_VALUE 2
379
+ /* insn[0].src_reg: BPF_PSEUDO_BTF_ID
380
+ * insn[0].imm: kernel btd id of VAR
381
+ * insn[1].imm: 0
382
+ * insn[0].off: 0
383
+ * insn[1].off: 0
384
+ * ldimm64 rewrite: address of the kernel variable
385
+ * verifier type: PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var
386
+ * is struct/union.
387
+ */
388
+ #define BPF_PSEUDO_BTF_ID 3
371
389
372
390
/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative
373
391
* offset to another bpf function
@@ -417,6 +435,9 @@ enum {
417
435
418
436
/* Share perf_event among processes */
419
437
BPF_F_PRESERVE_ELEMS = (1U << 11 ),
438
+
439
+ /* Create a map that is suitable to be an inner map with dynamic max entries */
440
+ BPF_F_INNER_MAP = (1U << 12 ),
420
441
};
421
442
422
443
/* Flags for BPF_PROG_QUERY. */
@@ -1680,7 +1701,7 @@ union bpf_attr {
1680
1701
* **TCP_CONGESTION**, **TCP_BPF_IW**,
1681
1702
* **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**,
1682
1703
* **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**,
1683
- * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**.
1704
+ * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT **.
1684
1705
* * **IPPROTO_IP**, which supports *optname* **IP_TOS**.
1685
1706
* * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
1686
1707
* Return
@@ -2235,7 +2256,7 @@ union bpf_attr {
2235
2256
* Description
2236
2257
* This helper is used in programs implementing policies at the
2237
2258
* skb socket level. If the sk_buff *skb* is allowed to pass (i.e.
2238
- * if the verdeict eBPF program returns **SK_PASS**), redirect it
2259
+ * if the verdict eBPF program returns **SK_PASS**), redirect it
2239
2260
* to the socket referenced by *map* (of type
2240
2261
* **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and
2241
2262
* egress interfaces can be used for redirection. The
@@ -3661,10 +3682,59 @@ union bpf_attr {
3661
3682
* Redirect the packet to another net device of index *ifindex*
3662
3683
* and fill in L2 addresses from neighboring subsystem. This helper
3663
3684
* is somewhat similar to **bpf_redirect**\ (), except that it
3664
- * fills in e.g. MAC addresses based on the L3 information from
3665
- * the packet. This helper is supported for IPv4 and IPv6 protocols.
3685
+ * populates L2 addresses as well, meaning, internally, the helper
3686
+ * performs a FIB lookup based on the skb's networking header to
3687
+ * get the address of the next hop and then relies on the neighbor
3688
+ * lookup for the L2 address of the nexthop.
3689
+ *
3690
+ * The *flags* argument is reserved and must be 0. The helper is
3691
+ * currently only supported for tc BPF program types, and enabled
3692
+ * for IPv4 and IPv6 protocols.
3693
+ * Return
3694
+ * The helper returns **TC_ACT_REDIRECT** on success or
3695
+ * **TC_ACT_SHOT** on error.
3696
+ *
3697
+ * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu)
3698
+ * Description
3699
+ * Take a pointer to a percpu ksym, *percpu_ptr*, and return a
3700
+ * pointer to the percpu kernel variable on *cpu*. A ksym is an
3701
+ * extern variable decorated with '__ksym'. For ksym, there is a
3702
+ * global var (either static or global) defined of the same name
3703
+ * in the kernel. The ksym is percpu if the global var is percpu.
3704
+ * The returned pointer points to the global percpu var on *cpu*.
3705
+ *
3706
+ * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the
3707
+ * kernel, except that bpf_per_cpu_ptr() may return NULL. This
3708
+ * happens if *cpu* is larger than nr_cpu_ids. The caller of
3709
+ * bpf_per_cpu_ptr() must check the returned value.
3710
+ * Return
3711
+ * A pointer pointing to the kernel percpu variable on *cpu*, or
3712
+ * NULL, if *cpu* is invalid.
3713
+ *
3714
+ * void *bpf_this_cpu_ptr(const void *percpu_ptr)
3715
+ * Description
3716
+ * Take a pointer to a percpu ksym, *percpu_ptr*, and return a
3717
+ * pointer to the percpu kernel variable on this cpu. See the
3718
+ * description of 'ksym' in **bpf_per_cpu_ptr**\ ().
3719
+ *
3720
+ * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in
3721
+ * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would
3722
+ * never return NULL.
3723
+ * Return
3724
+ * A pointer pointing to the kernel percpu variable on this cpu.
3725
+ *
3726
+ * long bpf_redirect_peer(u32 ifindex, u64 flags)
3727
+ * Description
3728
+ * Redirect the packet to another net device of index *ifindex*.
3729
+ * This helper is somewhat similar to **bpf_redirect**\ (), except
3730
+ * that the redirection happens to the *ifindex*' peer device and
3731
+ * the netns switch takes place from ingress to ingress without
3732
+ * going through the CPU's backlog queue.
3733
+ *
3666
3734
* The *flags* argument is reserved and must be 0. The helper is
3667
- * currently only supported for tc BPF program types.
3735
+ * currently only supported for tc BPF program types at the ingress
3736
+ * hook and for veth device types. The peer device must reside in a
3737
+ * different network namespace.
3668
3738
* Return
3669
3739
* The helper returns **TC_ACT_REDIRECT** on success or
3670
3740
* **TC_ACT_SHOT** on error.
@@ -3823,6 +3893,9 @@ union bpf_attr {
3823
3893
FN(seq_printf_btf), \
3824
3894
FN(skb_cgroup_classid), \
3825
3895
FN(redirect_neigh), \
3896
+ FN(bpf_per_cpu_ptr), \
3897
+ FN(bpf_this_cpu_ptr), \
3898
+ FN(redirect_peer), \
3826
3899
/* */
3827
3900
3828
3901
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
0 commit comments