]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
shared/kernel: update kernel headers
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 3 Dec 2020 02:20:18 +0000 (11:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 3 Dec 2020 02:21:13 +0000 (11:21 +0900)
From kernel commit 34816d20f173a90389c8a7e641166d8ea9dce70a.

src/shared/linux/auto_dev-ioctl.h
src/shared/linux/bpf.h
src/shared/linux/dm-ioctl.h
src/shared/linux/ethtool.h
src/shared/linux/nl80211.h

index 261546c667d13623d13edd8fcd2f24771c92e7c6..63f32e3b1386fc6381993195f33772f9b70eaf7e 100644 (file)
@@ -82,7 +82,7 @@ struct args_ismountpoint {
 /*
  * All the ioctls use this structure.
  * When sending a path size must account for the total length
- * of the chunk of memory otherwise is is the size of the
+ * of the chunk of memory otherwise it is the size of the
  * structure.
  */
 
index 359fc3703cb4afb2f6df2f0c0297d450c384bb98..e6ceac3f7d624ec45f4828e76a77cce43cc3aa9b 100644 (file)
@@ -14,6 +14,7 @@
 /* Extended instruction set based on top of classic BPF */
 
 /* instruction classes */
+#define BPF_JMP32      0x06    /* jmp mode in word width */
 #define BPF_ALU64      0x07    /* alu mode in double word width */
 
 /* ld/ldx fields */
@@ -80,6 +81,12 @@ struct bpf_cgroup_storage_key {
        __u32   attach_type;            /* program attach type */
 };
 
+union bpf_iter_link_info {
+       struct {
+               __u32   map_fd;
+       } map;
+};
+
 /* BPF syscall commands, see bpf(2) man-page for details. */
 enum bpf_cmd {
        BPF_MAP_CREATE,
@@ -104,6 +111,20 @@ enum bpf_cmd {
        BPF_BTF_GET_FD_BY_ID,
        BPF_TASK_FD_QUERY,
        BPF_MAP_LOOKUP_AND_DELETE_ELEM,
+       BPF_MAP_FREEZE,
+       BPF_BTF_GET_NEXT_ID,
+       BPF_MAP_LOOKUP_BATCH,
+       BPF_MAP_LOOKUP_AND_DELETE_BATCH,
+       BPF_MAP_UPDATE_BATCH,
+       BPF_MAP_DELETE_BATCH,
+       BPF_LINK_CREATE,
+       BPF_LINK_UPDATE,
+       BPF_LINK_GET_FD_BY_ID,
+       BPF_LINK_GET_NEXT_ID,
+       BPF_ENABLE_STATS,
+       BPF_ITER_CREATE,
+       BPF_LINK_DETACH,
+       BPF_PROG_BIND_MAP,
 };
 
 enum bpf_map_type {
@@ -131,6 +152,11 @@ enum bpf_map_type {
        BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE,
        BPF_MAP_TYPE_QUEUE,
        BPF_MAP_TYPE_STACK,
+       BPF_MAP_TYPE_SK_STORAGE,
+       BPF_MAP_TYPE_DEVMAP_HASH,
+       BPF_MAP_TYPE_STRUCT_OPS,
+       BPF_MAP_TYPE_RINGBUF,
+       BPF_MAP_TYPE_INODE_STORAGE,
 };
 
 /* Note that tracing related programs such as
@@ -165,6 +191,14 @@ enum bpf_prog_type {
        BPF_PROG_TYPE_LIRC_MODE2,
        BPF_PROG_TYPE_SK_REUSEPORT,
        BPF_PROG_TYPE_FLOW_DISSECTOR,
+       BPF_PROG_TYPE_CGROUP_SYSCTL,
+       BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE,
+       BPF_PROG_TYPE_CGROUP_SOCKOPT,
+       BPF_PROG_TYPE_TRACING,
+       BPF_PROG_TYPE_STRUCT_OPS,
+       BPF_PROG_TYPE_EXT,
+       BPF_PROG_TYPE_LSM,
+       BPF_PROG_TYPE_SK_LOOKUP,
 };
 
 enum bpf_attach_type {
@@ -186,11 +220,43 @@ enum bpf_attach_type {
        BPF_CGROUP_UDP6_SENDMSG,
        BPF_LIRC_MODE2,
        BPF_FLOW_DISSECTOR,
+       BPF_CGROUP_SYSCTL,
+       BPF_CGROUP_UDP4_RECVMSG,
+       BPF_CGROUP_UDP6_RECVMSG,
+       BPF_CGROUP_GETSOCKOPT,
+       BPF_CGROUP_SETSOCKOPT,
+       BPF_TRACE_RAW_TP,
+       BPF_TRACE_FENTRY,
+       BPF_TRACE_FEXIT,
+       BPF_MODIFY_RETURN,
+       BPF_LSM_MAC,
+       BPF_TRACE_ITER,
+       BPF_CGROUP_INET4_GETPEERNAME,
+       BPF_CGROUP_INET6_GETPEERNAME,
+       BPF_CGROUP_INET4_GETSOCKNAME,
+       BPF_CGROUP_INET6_GETSOCKNAME,
+       BPF_XDP_DEVMAP,
+       BPF_CGROUP_INET_SOCK_RELEASE,
+       BPF_XDP_CPUMAP,
+       BPF_SK_LOOKUP,
+       BPF_XDP,
        __MAX_BPF_ATTACH_TYPE
 };
 
 #define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE
 
+enum bpf_link_type {
+       BPF_LINK_TYPE_UNSPEC = 0,
+       BPF_LINK_TYPE_RAW_TRACEPOINT = 1,
+       BPF_LINK_TYPE_TRACING = 2,
+       BPF_LINK_TYPE_CGROUP = 3,
+       BPF_LINK_TYPE_ITER = 4,
+       BPF_LINK_TYPE_NETNS = 5,
+       BPF_LINK_TYPE_XDP = 6,
+
+       MAX_BPF_LINK_TYPE,
+};
+
 /* cgroup-bpf attach flags used in BPF_PROG_ATTACH command
  *
  * NONE(default): No further bpf programs allowed in the subtree.
@@ -214,6 +280,11 @@ enum bpf_attach_type {
  * When children program makes decision (like picking TCP CA or sock bind)
  * parent program has a chance to override it.
  *
+ * With BPF_F_ALLOW_MULTI a new program is added to the end of the list of
+ * programs for a cgroup. Though it's possible to replace an old program at
+ * any position by also specifying BPF_F_REPLACE flag and position itself in
+ * replace_bpf_fd attribute. Old program at this position will be released.
+ *
  * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups.
  * A cgroup with NONE doesn't allow any programs in sub-cgroups.
  * Ex1:
@@ -232,6 +303,7 @@ enum bpf_attach_type {
  */
 #define BPF_F_ALLOW_OVERRIDE   (1U << 0)
 #define BPF_F_ALLOW_MULTI      (1U << 1)
+#define BPF_F_REPLACE          (1U << 2)
 
 /* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
  * verifier will perform strict alignment checking as if the kernel
@@ -254,8 +326,66 @@ enum bpf_attach_type {
  */
 #define BPF_F_ANY_ALIGNMENT    (1U << 1)
 
-/* when bpf_ldimm64->src_reg == BPF_PSEUDO_MAP_FD, bpf_ldimm64->imm == fd */
+/* BPF_F_TEST_RND_HI32 is used in BPF_PROG_LOAD command for testing purpose.
+ * Verifier does sub-register def/use analysis and identifies instructions whose
+ * def only matters for low 32-bit, high 32-bit is never referenced later
+ * through implicit zero extension. Therefore verifier notifies JIT back-ends
+ * that it is safe to ignore clearing high 32-bit for these instructions. This
+ * saves some back-ends a lot of code-gen. However such optimization is not
+ * necessary on some arches, for example x86_64, arm64 etc, whose JIT back-ends
+ * hence hasn't used verifier's analysis result. But, we really want to have a
+ * way to be able to verify the correctness of the described optimization on
+ * x86_64 on which testsuites are frequently exercised.
+ *
+ * So, this flag is introduced. Once it is set, verifier will randomize high
+ * 32-bit for those instructions who has been identified as safe to ignore them.
+ * Then, if verifier is not doing correct analysis, such randomization will
+ * regress tests to expose bugs.
+ */
+#define BPF_F_TEST_RND_HI32    (1U << 2)
+
+/* The verifier internal test flag. Behavior is undefined */
+#define BPF_F_TEST_STATE_FREQ  (1U << 3)
+
+/* If BPF_F_SLEEPABLE is used in BPF_PROG_LOAD command, the verifier will
+ * restrict map and helper usage for such programs. Sleepable BPF programs can
+ * only be attached to hooks where kernel execution context allows sleeping.
+ * Such programs are allowed to use helpers that may sleep like
+ * bpf_copy_from_user().
+ */
+#define BPF_F_SLEEPABLE                (1U << 4)
+
+/* When BPF ldimm64's insn[0].src_reg != 0 then this can have
+ * the following extensions:
+ *
+ * insn[0].src_reg:  BPF_PSEUDO_MAP_FD
+ * insn[0].imm:      map fd
+ * insn[1].imm:      0
+ * insn[0].off:      0
+ * insn[1].off:      0
+ * ldimm64 rewrite:  address of map
+ * verifier type:    CONST_PTR_TO_MAP
+ */
 #define BPF_PSEUDO_MAP_FD      1
+/* insn[0].src_reg:  BPF_PSEUDO_MAP_VALUE
+ * insn[0].imm:      map fd
+ * insn[1].imm:      offset into value
+ * insn[0].off:      0
+ * insn[1].off:      0
+ * ldimm64 rewrite:  address of map[0]+offset
+ * verifier type:    PTR_TO_MAP_VALUE
+ */
+#define BPF_PSEUDO_MAP_VALUE   2
+/* insn[0].src_reg:  BPF_PSEUDO_BTF_ID
+ * insn[0].imm:      kernel btd id of VAR
+ * insn[1].imm:      0
+ * insn[0].off:      0
+ * insn[1].off:      0
+ * ldimm64 rewrite:  address of the kernel variable
+ * verifier type:    PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var
+ *                   is struct/union.
+ */
+#define BPF_PSEUDO_BTF_ID      3
 
 /* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative
  * offset to another bpf function
@@ -263,37 +393,72 @@ enum bpf_attach_type {
 #define BPF_PSEUDO_CALL                1
 
 /* flags for BPF_MAP_UPDATE_ELEM command */
-#define BPF_ANY                0 /* create new element or update existing */
-#define BPF_NOEXIST    1 /* create new element if it didn't exist */
-#define BPF_EXIST      2 /* update existing element */
+enum {
+       BPF_ANY         = 0, /* create new element or update existing */
+       BPF_NOEXIST     = 1, /* create new element if it didn't exist */
+       BPF_EXIST       = 2, /* update existing element */
+       BPF_F_LOCK      = 4, /* spin_lock-ed map_lookup/map_update */
+};
 
 /* flags for BPF_MAP_CREATE command */
-#define BPF_F_NO_PREALLOC      (1U << 0)
+enum {
+       BPF_F_NO_PREALLOC       = (1U << 0),
 /* Instead of having one common LRU list in the
  * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list
  * which can scale and perform better.
  * Note, the LRU nodes (including free nodes) cannot be moved
  * across different LRU lists.
  */
-#define BPF_F_NO_COMMON_LRU    (1U << 1)
+       BPF_F_NO_COMMON_LRU     = (1U << 1),
 /* Specify numa node during map creation */
-#define BPF_F_NUMA_NODE                (1U << 2)
-
-#define BPF_OBJ_NAME_LEN 16U
+       BPF_F_NUMA_NODE         = (1U << 2),
 
-/* Flags for accessing BPF object */
-#define BPF_F_RDONLY           (1U << 3)
-#define BPF_F_WRONLY           (1U << 4)
+/* Flags for accessing BPF object from syscall side. */
+       BPF_F_RDONLY            = (1U << 3),
+       BPF_F_WRONLY            = (1U << 4),
 
 /* Flag for stack_map, store build_id+offset instead of pointer */
-#define BPF_F_STACK_BUILD_ID   (1U << 5)
+       BPF_F_STACK_BUILD_ID    = (1U << 5),
 
 /* Zero-initialize hash function seed. This should only be used for testing. */
-#define BPF_F_ZERO_SEED                (1U << 6)
+       BPF_F_ZERO_SEED         = (1U << 6),
+
+/* Flags for accessing BPF object from program side. */
+       BPF_F_RDONLY_PROG       = (1U << 7),
+       BPF_F_WRONLY_PROG       = (1U << 8),
+
+/* Clone map from listener for newly accepted socket */
+       BPF_F_CLONE             = (1U << 9),
+
+/* Enable memory-mapping BPF map */
+       BPF_F_MMAPABLE          = (1U << 10),
+
+/* Share perf_event among processes */
+       BPF_F_PRESERVE_ELEMS    = (1U << 11),
 
-/* flags for BPF_PROG_QUERY */
+/* Create a map that is suitable to be an inner map with dynamic max entries */
+       BPF_F_INNER_MAP         = (1U << 12),
+};
+
+/* Flags for BPF_PROG_QUERY. */
+
+/* Query effective (directly attached + inherited from ancestor cgroups)
+ * programs that will be executed for events within a cgroup.
+ * attach_flags with this flag are returned only for directly attached programs.
+ */
 #define BPF_F_QUERY_EFFECTIVE  (1U << 0)
 
+/* Flags for BPF_PROG_TEST_RUN */
+
+/* If set, run the test on the cpu specified by bpf_attr.test.cpu */
+#define BPF_F_TEST_RUN_ON_CPU  (1U << 0)
+
+/* type for BPF_ENABLE_STATS */
+enum bpf_stats_type {
+       /* enabled run_time_ns and run_cnt */
+       BPF_STATS_RUN_TIME = 0,
+};
+
 enum bpf_stack_build_id_status {
        /* user space need an empty entry to identify end of a trace */
        BPF_STACK_BUILD_ID_EMPTY = 0,
@@ -313,6 +478,8 @@ struct bpf_stack_build_id {
        };
 };
 
+#define BPF_OBJ_NAME_LEN 16U
+
 union bpf_attr {
        struct { /* anonymous struct used by BPF_MAP_CREATE command */
                __u32   map_type;       /* one of enum bpf_map_type */
@@ -331,6 +498,10 @@ union bpf_attr {
                __u32   btf_fd;         /* fd pointing to a BTF type data */
                __u32   btf_key_type_id;        /* BTF type_id of the key */
                __u32   btf_value_type_id;      /* BTF type_id of the value */
+               __u32   btf_vmlinux_value_type_id;/* BTF type_id of a kernel-
+                                                  * struct stored as the
+                                                  * map value
+                                                  */
        };
 
        struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */
@@ -343,6 +514,23 @@ union bpf_attr {
                __u64           flags;
        };
 
+       struct { /* struct used by BPF_MAP_*_BATCH commands */
+               __aligned_u64   in_batch;       /* start batch,
+                                                * NULL to start from beginning
+                                                */
+               __aligned_u64   out_batch;      /* output: next start batch */
+               __aligned_u64   keys;
+               __aligned_u64   values;
+               __u32           count;          /* input/output:
+                                                * input: # of key/value
+                                                * elements
+                                                * output: # of filled elements
+                                                */
+               __u32           map_fd;
+               __u64           elem_flags;
+               __u64           flags;
+       } batch;
+
        struct { /* anonymous struct used by BPF_PROG_LOAD command */
                __u32           prog_type;      /* one of enum bpf_prog_type */
                __u32           insn_cnt;
@@ -367,6 +555,8 @@ union bpf_attr {
                __u32           line_info_rec_size;     /* userspace bpf_line_info size */
                __aligned_u64   line_info;      /* line info */
                __u32           line_info_cnt;  /* number of bpf_line_info records */
+               __u32           attach_btf_id;  /* in-kernel BTF type id to attach to */
+               __u32           attach_prog_fd; /* 0 to attach to vmlinux */
        };
 
        struct { /* anonymous struct used by BPF_OBJ_* commands */
@@ -380,6 +570,10 @@ union bpf_attr {
                __u32           attach_bpf_fd;  /* eBPF program to attach */
                __u32           attach_type;
                __u32           attach_flags;
+               __u32           replace_bpf_fd; /* previously attached eBPF
+                                                * program to replace if
+                                                * BPF_F_REPLACE is used
+                                                */
        };
 
        struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */
@@ -394,6 +588,15 @@ union bpf_attr {
                __aligned_u64   data_out;
                __u32           repeat;
                __u32           duration;
+               __u32           ctx_size_in;    /* input: len of ctx_in */
+               __u32           ctx_size_out;   /* input/output: len of ctx_out
+                                                *   returns ENOSPC if ctx_out
+                                                *   is too small.
+                                                */
+               __aligned_u64   ctx_in;
+               __aligned_u64   ctx_out;
+               __u32           flags;
+               __u32           cpu;
        } test;
 
        struct { /* anonymous struct used by BPF_*_GET_*_ID */
@@ -402,6 +605,7 @@ union bpf_attr {
                        __u32           prog_id;
                        __u32           map_id;
                        __u32           btf_id;
+                       __u32           link_id;
                };
                __u32           next_id;
                __u32           open_flags;
@@ -422,7 +626,7 @@ union bpf_attr {
                __u32           prog_cnt;
        } query;
 
-       struct {
+       struct { /* anonymous struct used by BPF_RAW_TRACEPOINT_OPEN command */
                __u64 name;
                __u32 prog_fd;
        } raw_tracepoint;
@@ -450,6 +654,53 @@ union bpf_attr {
                __u64           probe_offset;   /* output: probe_offset */
                __u64           probe_addr;     /* output: probe_addr */
        } task_fd_query;
+
+       struct { /* struct used by BPF_LINK_CREATE command */
+               __u32           prog_fd;        /* eBPF program to attach */
+               union {
+                       __u32           target_fd;      /* object to attach to */
+                       __u32           target_ifindex; /* target ifindex */
+               };
+               __u32           attach_type;    /* attach type */
+               __u32           flags;          /* extra flags */
+               union {
+                       __u32           target_btf_id;  /* btf_id of target to attach to */
+                       struct {
+                               __aligned_u64   iter_info;      /* extra bpf_iter_link_info */
+                               __u32           iter_info_len;  /* iter_info length */
+                       };
+               };
+       } link_create;
+
+       struct { /* struct used by BPF_LINK_UPDATE command */
+               __u32           link_fd;        /* link fd */
+               /* new program fd to update link with */
+               __u32           new_prog_fd;
+               __u32           flags;          /* extra flags */
+               /* expected link's program fd; is specified only if
+                * BPF_F_REPLACE flag is set in flags */
+               __u32           old_prog_fd;
+       } link_update;
+
+       struct {
+               __u32           link_fd;
+       } link_detach;
+
+       struct { /* struct used by BPF_ENABLE_STATS command */
+               __u32           type;
+       } enable_stats;
+
+       struct { /* struct used by BPF_ITER_CREATE command */
+               __u32           link_fd;
+               __u32           flags;
+       } iter_create;
+
+       struct { /* struct used by BPF_PROG_BIND_MAP command */
+               __u32           prog_fd;
+               __u32           map_fd;
+               __u32           flags;          /* extra flags */
+       } prog_bind_map;
+
 } __attribute__((aligned(8)));
 
 /* The description below is an attempt at providing documentation to eBPF
@@ -476,7 +727,7 @@ union bpf_attr {
  *             Map value associated to *key*, or **NULL** if no entry was
  *             found.
  *
- * int bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
+ * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
  *     Description
  *             Add or update the value of the entry associated to *key* in
  *             *map* with *value*. *flags* is one of:
@@ -494,36 +745,31 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_map_delete_elem(struct bpf_map *map, const void *key)
+ * long bpf_map_delete_elem(struct bpf_map *map, const void *key)
  *     Description
  *             Delete entry with *key* from *map*.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)
- *     Description
- *             Push an element *value* in *map*. *flags* is one of:
- *
- *             **BPF_EXIST**
- *             If the queue/stack is full, the oldest element is removed to
- *             make room for this.
- *     Return
- *             0 on success, or a negative error in case of failure.
- *
- * int bpf_probe_read(void *dst, u32 size, const void *src)
+ * long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr)
  *     Description
  *             For tracing programs, safely attempt to read *size* bytes from
- *             address *src* and store the data in *dst*.
+ *             kernel space address *unsafe_ptr* and store the data in *dst*.
+ *
+ *             Generally, use **bpf_probe_read_user**\ () or
+ *             **bpf_probe_read_kernel**\ () instead.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
  * u64 bpf_ktime_get_ns(void)
  *     Description
  *             Return the time elapsed since system boot, in nanoseconds.
+ *             Does not include time the system was suspended.
+ *             See: **clock_gettime**\ (**CLOCK_MONOTONIC**)
  *     Return
  *             Current *ktime*.
  *
- * int bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
+ * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...)
  *     Description
  *             This helper is a "printk()-like" facility for debugging. It
  *             prints a message defined by format *fmt* (of size *fmt_size*)
@@ -533,6 +779,8 @@ union bpf_attr {
  *             limited to five).
  *
  *             Each time the helper is called, it appends a line to the trace.
+ *             Lines are discarded while *\/sys/kernel/debug/tracing/trace* is
+ *             open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this.
  *             The format of the trace is customizable, and the exact output
  *             one will get depends on the options set in
  *             *\/sys/kernel/debug/tracing/trace_options* (see also the
@@ -571,7 +819,7 @@ union bpf_attr {
  *
  *             Also, note that **bpf_trace_printk**\ () is slow, and should
  *             only be used for debugging purposes. For this reason, a notice
- *             bloc (spanning several lines) is printed to kernel logs and
+ *             block (spanning several lines) is printed to kernel logs and
  *             states that the helper should not be used "for production use"
  *             the first time this helper is used (or more precisely, when
  *             **trace_printk**\ () buffers are allocated). For passing values
@@ -601,7 +849,7 @@ union bpf_attr {
  *     Return
  *             The SMP id of the processor running the program.
  *
- * int bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags)
+ * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags)
  *     Description
  *             Store *len* bytes from address *from* into the packet
  *             associated to *skb*, at *offset*. *flags* are a combination of
@@ -610,7 +858,7 @@ union bpf_attr {
  *             **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\
  *             **->swhash** and *skb*\ **->l4hash** to 0).
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -618,7 +866,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size)
+ * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size)
  *     Description
  *             Recompute the layer 3 (e.g. IP) checksum for the packet
  *             associated to *skb*. Computation is incremental, so the helper
@@ -635,7 +883,7 @@ union bpf_attr {
  *             flexibility and can handle sizes larger than 2 or 4 for the
  *             checksum to update.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -643,7 +891,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags)
+ * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags)
  *     Description
  *             Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the
  *             packet associated to *skb*. Computation is incremental, so the
@@ -667,7 +915,7 @@ union bpf_attr {
  *             flexibility and can handle sizes larger than 2 or 4 for the
  *             checksum to update.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -675,7 +923,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)
+ * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index)
  *     Description
  *             This special helper is used to trigger a "tail call", or in
  *             other words, to jump into another eBPF program. The same stack
@@ -706,7 +954,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags)
+ * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags)
  *     Description
  *             Clone and redirect the packet associated to *skb* to another
  *             net device of index *ifindex*. Both ingress and egress
@@ -722,7 +970,7 @@ union bpf_attr {
  *             efficient, but it is handled through an action code where the
  *             redirection happens only after the eBPF program has returned.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -742,7 +990,7 @@ union bpf_attr {
  *             A 64-bit integer containing the current GID and UID, and
  *             created as such: *current_gid* **<< 32 \|** *current_uid*.
  *
- * int bpf_get_current_comm(char *buf, u32 size_of_buf)
+ * long bpf_get_current_comm(void *buf, u32 size_of_buf)
  *     Description
  *             Copy the **comm** attribute of the current task into *buf* of
  *             *size_of_buf*. The **comm** attribute contains the name of
@@ -764,7 +1012,7 @@ union bpf_attr {
  *             based on a user-provided identifier for all traffic coming from
  *             the tasks belonging to the related cgroup. See also the related
  *             kernel documentation, available from the Linux sources in file
- *             *Documentation/cgroup-v1/net_cls.txt*.
+ *             *Documentation/admin-guide/cgroup-v1/net_cls.rst*.
  *
  *             The Linux kernel has two versions for cgroups: there are
  *             cgroups v1 and cgroups v2. Both are available to users, who can
@@ -779,7 +1027,7 @@ union bpf_attr {
  *     Return
  *             The classid, or 0 for the default unconfigured classid.
  *
- * int bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
+ * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci)
  *     Description
  *             Push a *vlan_tci* (VLAN tag control information) of protocol
  *             *vlan_proto* to the packet associated to *skb*, then update
@@ -787,7 +1035,7 @@ union bpf_attr {
  *             **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to
  *             be **ETH_P_8021Q**.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -795,11 +1043,11 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_vlan_pop(struct sk_buff *skb)
+ * long bpf_skb_vlan_pop(struct sk_buff *skb)
  *     Description
  *             Pop a VLAN header from the packet associated to *skb*.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -807,7 +1055,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
+ * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  *     Description
  *             Get tunnel metadata. This helper takes a pointer *key* to an
  *             empty **struct bpf_tunnel_key** of **size**, that will be
@@ -837,14 +1085,14 @@ union bpf_attr {
  *
  *                     int ret;
  *                     struct bpf_tunnel_key key = {};
- *                     
+ *
  *                     ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0);
  *                     if (ret < 0)
  *                             return TC_ACT_SHOT;     // drop packet
- *                     
+ *
  *                     if (key.remote_ipv4 != 0x0a000001)
  *                             return TC_ACT_SHOT;     // drop packet
- *                     
+ *
  *                     return TC_ACT_OK;               // accept packet
  *
  *             This interface can also be used with all encapsulation devices
@@ -858,7 +1106,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
+ * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags)
  *     Description
  *             Populate tunnel metadata for packet associated to *skb.* The
  *             tunnel metadata is set to the contents of *key*, of *size*. The
@@ -924,7 +1172,7 @@ union bpf_attr {
  *             The value of the perf event counter read from the map, or a
  *             negative error code in case of failure.
  *
- * int bpf_redirect(u32 ifindex, u64 flags)
+ * long bpf_redirect(u32 ifindex, u64 flags)
  *     Description
  *             Redirect the packet to another net device of index *ifindex*.
  *             This helper is somewhat similar to **bpf_clone_redirect**\
@@ -938,9 +1186,9 @@ union bpf_attr {
  *             supports redirection to the egress interface, and accepts no
  *             flag at all.
  *
- *             The same effect can be attained with the more generic
- *             **bpf_redirect_map**\ (), which requires specific maps to be
- *             used but offers better performance.
+ *             The same effect can also be attained with the more generic
+ *             **bpf_redirect_map**\ (), which uses a BPF map to store the
+ *             redirect target instead of providing it directly to the helper.
  *     Return
  *             For XDP, the helper returns **XDP_REDIRECT** on success or
  *             **XDP_ABORTED** on error. For other program types, the values
@@ -971,7 +1219,7 @@ union bpf_attr {
  *             The realm of the route for the packet associated to *skb*, or 0
  *             if none was found.
  *
- * int bpf_perf_event_output(struct pt_reg *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
+ * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
  *     Description
  *             Write raw *data* blob into a special BPF perf event held by
  *             *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf
@@ -1016,7 +1264,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_load_bytes(const struct sk_buff *skb, u32 offset, void *to, u32 len)
+ * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len)
  *     Description
  *             This helper was provided as an easy way to load data from a
  *             packet. It can be used to load *len* bytes from *offset* from
@@ -1033,7 +1281,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_get_stackid(struct pt_reg *ctx, struct bpf_map *map, u64 flags)
+ * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags)
  *     Description
  *             Walk a user or a kernel stack and return its id. To achieve
  *             this, the helper needs *ctx*, which is a pointer to the context
@@ -1102,7 +1350,7 @@ union bpf_attr {
  *             The checksum result, or a negative error code in case of
  *             failure.
  *
- * int bpf_skb_get_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size)
+ * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  *     Description
  *             Retrieve tunnel options metadata for the packet associated to
  *             *skb*, and store the raw tunnel option data to the buffer *opt*
@@ -1120,7 +1368,7 @@ union bpf_attr {
  *     Return
  *             The size of the option data retrieved.
  *
- * int bpf_skb_set_tunnel_opt(struct sk_buff *skb, u8 *opt, u32 size)
+ * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size)
  *     Description
  *             Set tunnel options metadata for the packet associated to *skb*
  *             to the option data contained in the raw buffer *opt* of *size*.
@@ -1130,7 +1378,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags)
+ * long bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags)
  *     Description
  *             Change the protocol of the *skb* to *proto*. Currently
  *             supported are transition from IPv4 to IPv6, and from IPv6 to
@@ -1149,7 +1397,7 @@ union bpf_attr {
  *             All values for *flags* are reserved for future usage, and must
  *             be left at zero.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1157,7 +1405,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_change_type(struct sk_buff *skb, u32 type)
+ * long bpf_skb_change_type(struct sk_buff *skb, u32 type)
  *     Description
  *             Change the packet type for the packet associated to *skb*. This
  *             comes down to setting *skb*\ **->pkt_type** to *type*, except
@@ -1184,7 +1432,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index)
+ * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index)
  *     Description
  *             Check whether *skb* is a descendant of the cgroup2 held by
  *             *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*.
@@ -1215,7 +1463,7 @@ union bpf_attr {
  *     Return
  *             A pointer to the current task struct.
  *
- * int bpf_probe_write_user(void *dst, const void *src, u32 len)
+ * long bpf_probe_write_user(void *dst, const void *src, u32 len)
  *     Description
  *             Attempt in a safe way to write *len* bytes from the buffer
  *             *src* to *dst* in memory. It only works for threads that are in
@@ -1234,7 +1482,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_current_task_under_cgroup(struct bpf_map *map, u32 index)
+ * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index)
  *     Description
  *             Check whether the probe is being run is the context of a given
  *             subset of the cgroup2 hierarchy. The cgroup2 to test is held by
@@ -1242,11 +1490,11 @@ union bpf_attr {
  *     Return
  *             The return value depends on the result of the test, and can be:
  *
- *             * 0, if the *skb* task belongs to the cgroup2.
- *             * 1, if the *skb* task does not belong to the cgroup2.
+ *             * 0, if current task belongs to the cgroup2.
+ *             * 1, if current task does not belong to the cgroup2.
  *             * A negative error code, if an error occurred.
  *
- * int bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
+ * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags)
  *     Description
  *             Resize (trim or grow) the packet associated to *skb* to the
  *             new *len*. The *flags* are reserved for future usage, and must
@@ -1262,7 +1510,7 @@ union bpf_attr {
  *             implicitly linearizes, unclones and drops offloads from the
  *             *skb*.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1270,7 +1518,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_pull_data(struct sk_buff *skb, u32 len)
+ * long bpf_skb_pull_data(struct sk_buff *skb, u32 len)
  *     Description
  *             Pull in non-linear data in case the *skb* is non-linear and not
  *             all of *len* are part of the linear section. Make *len* bytes
@@ -1298,7 +1546,7 @@ union bpf_attr {
  *             **bpf_skb_pull_data()** to effectively unclone the *skb* from
  *             the very beginning in case it is indeed cloned.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1326,7 +1574,7 @@ union bpf_attr {
  *             recalculation the next time the kernel tries to access this
  *             hash or when the **bpf_get_hash_recalc**\ () helper is called.
  *
- * int bpf_get_numa_node_id(void)
+ * long bpf_get_numa_node_id(void)
  *     Description
  *             Return the id of the current NUMA node. The primary use case
  *             for this helper is the selection of sockets for the local NUMA
@@ -1337,7 +1585,7 @@ union bpf_attr {
  *     Return
  *             The id of current NUMA node.
  *
- * int bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags)
+ * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags)
  *     Description
  *             Grows headroom of packet associated to *skb* and adjusts the
  *             offset of the MAC header accordingly, adding *len* bytes of
@@ -1350,7 +1598,7 @@ union bpf_attr {
  *             All values for *flags* are reserved for future usage, and must
  *             be left at zero.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1358,14 +1606,14 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta)
+ * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta)
  *     Description
  *             Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that
  *             it is possible to use a negative value for *delta*. This helper
  *             can be used to prepare the packet for pushing or popping
  *             headers.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1373,45 +1621,14 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_probe_read_str(void *dst, int size, const void *unsafe_ptr)
+ * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr)
  *     Description
- *             Copy a NUL terminated string from an unsafe address
- *             *unsafe_ptr* to *dst*. The *size* should include the
- *             terminating NUL byte. In case the string length is smaller than
- *             *size*, the target is not padded with further NUL bytes. If the
- *             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:
- *
- *             ::
+ *             Copy a NUL terminated string from an unsafe kernel address
+ *             *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for
+ *             more details.
  *
- *                     SEC("kprobe/sys_open")
- *                     void bpf_sys_open(struct pt_regs *ctx)
- *                     {
- *                             char buf[PATHLEN]; // PATHLEN is defined to 256
- *                             int res = bpf_probe_read_str(buf, sizeof(buf),
- *                                                          ctx->di);
- *
- *                             // Consume buf, for example push it to
- *                             // userspace via bpf_perf_event_output(); we
- *                             // can use res (the string length) as event
- *                             // size, after checking its boundaries.
- *                     }
- *
- *             In comparison, using **bpf_probe_read()** helper here instead
- *             to read the string would require to estimate the length at
- *             compile time, and would often result in copying more memory
- *             than necessary.
- *
- *             Another useful use case is when parsing individual process
- *             arguments or individual environment variables navigating
- *             *current*\ **->mm->arg_start** and *current*\
- *             **->mm->env_start**: using this helper and the return value,
- *             one can quickly iterate at the right offset of the memory area.
+ *             Generally, use **bpf_probe_read_user_str**\ () or
+ *             **bpf_probe_read_kernel_str**\ () instead.
  *     Return
  *             On success, the strictly positive length of the string,
  *             including the trailing NUL character. On error, a negative
@@ -1424,8 +1641,8 @@ union bpf_attr {
  *             If no cookie has been set yet, generate a new cookie. Once
  *             generated, the socket cookie remains stable for the life of the
  *             socket. This helper can be useful for monitoring per socket
- *             networking traffic statistics as it provides a unique socket
- *             identifier per namespace.
+ *             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*.
@@ -1433,14 +1650,14 @@ union bpf_attr {
  * 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** contex.
+ *             *skb*, but gets socket from **struct bpf_sock_addr** context.
  *     Return
  *             A 8-byte long non-decreasing 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** contex.
+ *             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.
  *
@@ -1452,14 +1669,14 @@ union bpf_attr {
  *             is returned (note that **overflowuid** might also be the actual
  *             UID value for the socket).
  *
- * u32 bpf_set_hash(struct sk_buff *skb, u32 hash)
+ * long bpf_set_hash(struct sk_buff *skb, u32 hash)
  *     Description
  *             Set the full hash for *skb* (set the field *skb*\ **->hash**)
  *             to value *hash*.
  *     Return
  *             0
  *
- * int bpf_setsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen)
+ * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  *     Description
  *             Emulate a call to **setsockopt()** on the socket associated to
  *             *bpf_socket*, which must be a full socket. The *level* at
@@ -1467,34 +1684,68 @@ union bpf_attr {
  *             must be specified, see **setsockopt(2)** for more information.
  *             The option value of length *optlen* is pointed by *optval*.
  *
+ *             *bpf_socket* should be one of the following:
+ *
+ *             * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
+ *             * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
+ *               and **BPF_CGROUP_INET6_CONNECT**.
+ *
  *             This helper actually implements a subset of **setsockopt()**.
  *             It supports the following *level*\ s:
  *
  *             * **SOL_SOCKET**, which supports the following *optname*\ s:
  *               **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**,
- *               **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**.
+ *               **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**,
+ *               **SO_BINDTODEVICE**, **SO_KEEPALIVE**.
  *             * **IPPROTO_TCP**, which supports the following *optname*\ s:
  *               **TCP_CONGESTION**, **TCP_BPF_IW**,
- *               **TCP_BPF_SNDCWND_CLAMP**.
+ *               **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**,
+ *               **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**,
+ *               **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**.
  *             * **IPPROTO_IP**, which supports *optname* **IP_TOS**.
  *             * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags)
+ * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags)
  *     Description
  *             Grow or shrink the room for data in the packet associated to
  *             *skb* by *len_diff*, and according to the selected *mode*.
  *
- *             There is a single supported mode at this time:
+ *             By default, the helper will reset any offloaded checksum
+ *             indicator of the skb to CHECKSUM_NONE. This can be avoided
+ *             by the following flag:
+ *
+ *             * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded
+ *               checksum data of the skb to CHECKSUM_NONE.
+ *
+ *             There are two supported modes at this time:
+ *
+ *             * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer
+ *               (room space is added or removed below the layer 2 header).
  *
  *             * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer
  *               (room space is added or removed below the layer 3 header).
  *
- *             All values for *flags* are reserved for future usage, and must
- *             be left at zero.
+ *             The following flags are supported at this time:
+ *
+ *             * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size.
+ *               Adjusting mss in this way is not allowed for datagrams.
+ *
+ *             * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**,
+ *               **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**:
+ *               Any new space is reserved to hold a tunnel header.
+ *               Configure skb offsets and other fields accordingly.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**,
+ *               **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**:
+ *               Use with ENCAP_L3 flags to further specify the tunnel type.
+ *
+ *             * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*):
+ *               Use with ENCAP_L3/L4 flags to further specify the tunnel
+ *               type; *len* is the length of the inner MAC header.
+ *
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1502,7 +1753,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)
+ * long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags)
  *     Description
  *             Redirect the packet to the endpoint referenced by *map* at
  *             index *key*. Depending on its type, this *map* can contain
@@ -1511,18 +1762,19 @@ union bpf_attr {
  *             but this is only implemented for native XDP (with driver
  *             support) as of this writing).
  *
- *             All values for *flags* are reserved for future usage, and must
- *             be left at zero.
+ *             The lower two bits of *flags* are used as the return code if
+ *             the map lookup fails. This is so that the return value can be
+ *             one of the XDP program return codes up to **XDP_TX**, as chosen
+ *             by the caller. Any higher bits in the *flags* argument must be
+ *             unset.
  *
- *             When used to redirect packets to net devices, this helper
- *             provides a high performance increase over **bpf_redirect**\ ().
- *             This is due to various implementation details of the underlying
- *             mechanisms, one of which is the fact that **bpf_redirect_map**\
- *             () tries to send packet as a "bulk" to the device.
+ *             See also **bpf_redirect**\ (), which only supports redirecting
+ *             to an ifindex, but doesn't require a map to do so.
  *     Return
- *             **XDP_REDIRECT** on success, or **XDP_ABORTED** on error.
+ *             **XDP_REDIRECT** on success, or the value of the two lower bits
+ *             of the *flags* argument on error.
  *
- * int bpf_sk_redirect_map(struct bpf_map *map, u32 key, u64 flags)
+ * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags)
  *     Description
  *             Redirect the packet to the socket referenced by *map* (of type
  *             **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and
@@ -1533,7 +1785,7 @@ union bpf_attr {
  *     Return
  *             **SK_PASS** on success, or **SK_DROP** on error.
  *
- * int bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
+ * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags)
  *     Description
  *             Add an entry to, or update a *map* referencing sockets. The
  *             *skops* is used as a new value for the entry associated to
@@ -1552,7 +1804,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta)
+ * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta)
  *     Description
  *             Adjust the address pointed by *xdp_md*\ **->data_meta** by
  *             *delta* (which can be positive or negative). Note that this
@@ -1573,7 +1825,7 @@ union bpf_attr {
  *             more flexibility as the user is free to store whatever meta
  *             data they need.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1581,7 +1833,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size)
+ * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size)
  *     Description
  *             Read the value of a perf event counter, and store it into *buf*
  *             of size *buf_size*. This helper relies on a *map* of type
@@ -1625,13 +1877,13 @@ union bpf_attr {
  *             the time running for event since last normalization. The
  *             enabled and running times are accumulated since the perf event
  *             open. To achieve scaling factor between two invocations of an
- *             eBPF program, users can can use CPU id as the key (which is
+ *             eBPF program, users can use CPU id as the key (which is
  *             typical for perf array usage model) to remember the previous
  *             value and do the calculation inside the eBPF program.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size)
+ * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size)
  *     Description
  *             For en eBPF program attached to a perf event, retrieve the
  *             value of the event counter associated to *ctx* and store it in
@@ -1642,7 +1894,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_getsockopt(struct bpf_sock_ops *bpf_socket, int level, int optname, char *optval, int optlen)
+ * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen)
  *     Description
  *             Emulate a call to **getsockopt()** on the socket associated to
  *             *bpf_socket*, which must be a full socket. The *level* at
@@ -1651,6 +1903,12 @@ union bpf_attr {
  *             The retrieved value is stored in the structure pointed by
  *             *opval* and of length *optlen*.
  *
+ *             *bpf_socket* should be one of the following:
+ *
+ *             * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**.
+ *             * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT**
+ *               and **BPF_CGROUP_INET6_CONNECT**.
+ *
  *             This helper actually implements a subset of **getsockopt()**.
  *             It supports the following *level*\ s:
  *
@@ -1661,14 +1919,14 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_override_return(struct pt_reg *regs, u64 rc)
+ * long bpf_override_return(struct pt_regs *regs, u64 rc)
  *     Description
  *             Used for error injection, this helper uses kprobes to override
  *             the return value of the probed function, and to set it to *rc*.
  *             The first argument is the context *regs* on which the kprobe
  *             works.
  *
- *             This helper works by setting setting the PC (program counter)
+ *             This helper works by setting the PC (program counter)
  *             to an override function which is run in place of the original
  *             probed function. This means the probed function is not run at
  *             all. The replacement function just returns with the required
@@ -1686,7 +1944,7 @@ union bpf_attr {
  *     Return
  *             0
  *
- * int bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval)
+ * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval)
  *     Description
  *             Attempt to set the value of the **bpf_sock_ops_cb_flags** field
  *             for the full TCP socket associated to *bpf_sock_ops* to
@@ -1702,11 +1960,19 @@ union bpf_attr {
  *             error if an eBPF program tries to set a callback that is not
  *             supported in the current kernel.
  *
- *             The supported callback values that *argval* can combine are:
+ *             *argval* is a flag array which can combine these flags:
  *
  *             * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out)
  *             * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission)
  *             * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change)
+ *             * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT)
+ *
+ *             Therefore, this function can be used to clear a callback flag by
+ *             setting the appropriate bit to zero. e.g. to disable the RTO
+ *             callback:
+ *
+ *             **bpf_sock_ops_cb_flags_set(bpf_sock,**
+ *                     **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)**
  *
  *             Here are some examples of where one could call such eBPF
  *             program:
@@ -1722,7 +1988,7 @@ union bpf_attr {
  *             be set is returned (which comes down to 0 if all bits were set
  *             as required).
  *
- * int bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags)
+ * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags)
  *     Description
  *             This helper is used in programs implementing policies at the
  *             socket level. If the message *msg* is allowed to pass (i.e. if
@@ -1736,7 +2002,7 @@ union bpf_attr {
  *     Return
  *             **SK_PASS** on success, or **SK_DROP** on error.
  *
- * int bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes)
+ * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes)
  *     Description
  *             For socket policies, apply the verdict of the eBPF program to
  *             the next *bytes* (number of bytes) of message *msg*.
@@ -1770,7 +2036,7 @@ union bpf_attr {
  *     Return
  *             0
  *
- * int bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes)
+ * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes)
  *     Description
  *             For socket policies, prevent the execution of the verdict eBPF
  *             program for message *msg* until *bytes* (byte number) have been
@@ -1788,7 +2054,7 @@ union bpf_attr {
  *     Return
  *             0
  *
- * int bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags)
+ * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags)
  *     Description
  *             For socket policies, pull in non-linear data from user space
  *             for *msg* and set pointers *msg*\ **->data** and *msg*\
@@ -1808,7 +2074,7 @@ union bpf_attr {
  *             copied if necessary (i.e. if data was not linear and if start
  *             and end pointers do not point to the same chunk).
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1819,7 +2085,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len)
+ * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len)
  *     Description
  *             Bind the socket associated to *ctx* to the address pointed by
  *             *addr*, of length *addr_len*. This allows for making outgoing
@@ -1829,20 +2095,21 @@ union bpf_attr {
  *
  *             This helper works for IPv4 and IPv6, TCP and UDP sockets. The
  *             domain (*addr*\ **->sa_family**) must be **AF_INET** (or
- *             **AF_INET6**). Looking for a free port to bind to can be
- *             expensive, therefore binding to port is not permitted by the
- *             helper: *addr*\ **->sin_port** (or **sin6_port**, respectively)
- *             must be set to zero.
+ *             **AF_INET6**). It's advised to pass zero port (**sin_port**
+ *             or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like
+ *             behavior and lets the kernel efficiently pick up an unused
+ *             port as long as 4-tuple is unique. Passing non-zero port might
+ *             lead to degraded performance.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta)
+ * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta)
  *     Description
  *             Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is
- *             only possible to shrink the packet as of this writing,
- *             therefore *delta* must be a negative integer.
+ *             possible to both shrink and grow the packet tail.
+ *             Shrink done via *delta* being a negative integer.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -1850,7 +2117,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags)
+ * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags)
  *     Description
  *             Retrieve the XFRM state (IP transform framework, see also
  *             **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*.
@@ -1866,7 +2133,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_get_stack(struct pt_regs *regs, void *buf, u32 size, u64 flags)
+ * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags)
  *     Description
  *             Return a user or a kernel stack in bpf program provided buffer.
  *             To achieve this, the helper needs *ctx*, which is a pointer
@@ -1899,7 +2166,7 @@ union bpf_attr {
  *             A non-negative value equal to or less than *size* on success,
  *             or a negative error in case of failure.
  *
- * int bpf_skb_load_bytes_relative(const struct sk_buff *skb, u32 offset, void *to, u32 len, u32 start_header)
+ * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header)
  *     Description
  *             This helper is similar to **bpf_skb_load_bytes**\ () in that
  *             it provides an easy way to load *len* bytes from *offset*
@@ -1921,7 +2188,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags)
+ * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags)
  *     Description
  *             Do FIB lookup in kernel tables using parameters in *params*.
  *             If lookup is successful and result shows packet is to be
@@ -1952,7 +2219,7 @@ union bpf_attr {
  *             * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the
  *               packet is not forwarded or needs assist from full stack
  *
- * int bpf_sock_hash_update(struct bpf_sock_ops_kern *skops, struct bpf_map *map, void *key, u64 flags)
+ * 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.
  *             The *skops* is used as a new value for the entry associated to
@@ -1971,7 +2238,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags)
+ * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags)
  *     Description
  *             This helper is used in programs implementing policies at the
  *             socket level. If the message *msg* is allowed to pass (i.e. if
@@ -1985,11 +2252,11 @@ union bpf_attr {
  *     Return
  *             **SK_PASS** on success, or **SK_DROP** on error.
  *
- * int bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags)
+ * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags)
  *     Description
  *             This helper is used in programs implementing policies at the
  *             skb socket level. If the sk_buff *skb* is allowed to pass (i.e.
- *             if the verdeict eBPF program returns **SK_PASS**), redirect it
+ *             if the verdict eBPF program returns **SK_PASS**), redirect it
  *             to the socket referenced by *map* (of type
  *             **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and
  *             egress interfaces can be used for redirection. The
@@ -1999,7 +2266,7 @@ union bpf_attr {
  *     Return
  *             **SK_PASS** on success, or **SK_DROP** on error.
  *
- * int bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len)
+ * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len)
  *     Description
  *             Encapsulate the packet associated to *skb* within a Layer 3
  *             protocol header. This header is provided in the buffer at
@@ -2014,8 +2281,21 @@ union bpf_attr {
  *                     Only works if *skb* contains an IPv6 packet. Insert a
  *                     Segment Routing Header (**struct ipv6_sr_hdr**) inside
  *                     the IPv6 header.
- *
- *             A call to this helper is susceptible to change the underlaying
+ *             **BPF_LWT_ENCAP_IP**
+ *                     IP encapsulation (GRE/GUE/IPIP/etc). The outer header
+ *                     must be IPv4 or IPv6, followed by zero or more
+ *                     additional headers, up to **LWT_BPF_MAX_HEADROOM**
+ *                     total bytes in all prepended headers. Please note that
+ *                     if **skb_is_gso**\ (*skb*) is true, no more than two
+ *                     headers can be prepended, and the inner header, if
+ *                     present, should be either GRE or UDP/GUE.
+ *
+ *             **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs
+ *             of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can
+ *             be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and
+ *             **BPF_PROG_TYPE_LWT_XMIT**.
+ *
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -2023,14 +2303,14 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len)
+ * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len)
  *     Description
  *             Store *len* bytes from address *from* into the packet
  *             associated to *skb*, at *offset*. Only the flags, tag and TLVs
  *             inside the outermost IPv6 Segment Routing Header can be
  *             modified through this helper.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -2038,7 +2318,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta)
+ * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta)
  *     Description
  *             Adjust the size allocated to TLVs in the outermost IPv6
  *             Segment Routing Header contained in the packet associated to
@@ -2046,7 +2326,7 @@ union bpf_attr {
  *             after the segments are accepted. *delta* can be as well
  *             positive (growing) as negative (shrinking).
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -2054,7 +2334,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len)
+ * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len)
  *     Description
  *             Apply an IPv6 Segment Routing action of type *action* to the
  *             packet associated to *skb*. Each action takes a parameter
@@ -2069,13 +2349,13 @@ union bpf_attr {
  *                     Type of *param*: **int**.
  *             **SEG6_LOCAL_ACTION_END_B6**
  *                     End.B6 action: Endpoint bound to an SRv6 policy.
- *                     Type of param: **struct ipv6_sr_hdr**.
+ *                     Type of *param*: **struct ipv6_sr_hdr**.
  *             **SEG6_LOCAL_ACTION_END_B6_ENCAP**
  *                     End.B6.Encap action: Endpoint bound to an SRv6
  *                     encapsulation policy.
- *                     Type of param: **struct ipv6_sr_hdr**.
+ *                     Type of *param*: **struct ipv6_sr_hdr**.
  *
- *             A call to this helper is susceptible to change the underlaying
+ *             A call to this helper is susceptible to change the underlying
  *             packet buffer. Therefore, at load time, all checks on pointers
  *             previously done by the verifier are invalidated and must be
  *             performed again, if the helper is used in combination with
@@ -2083,52 +2363,52 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle)
+ * long bpf_rc_repeat(void *ctx)
  *     Description
  *             This helper is used in programs implementing IR decoding, to
- *             report a successfully decoded key press with *scancode*,
- *             *toggle* value in the given *protocol*. The scancode will be
- *             translated to a keycode using the rc keymap, and reported as
- *             an input key down event. After a period a key up event is
- *             generated. This period can be extended by calling either
- *             **bpf_rc_keydown**\ () again with the same values, or calling
- *             **bpf_rc_repeat**\ ().
+ *             report a successfully decoded repeat key message. This delays
+ *             the generation of a key up event for previously generated
+ *             key down event.
  *
- *             Some protocols include a toggle bit, in case the button was
- *             released and pressed again between consecutive scancodes.
+ *             Some IR protocols like NEC have a special IR message for
+ *             repeating last button, for when a button is held down.
  *
  *             The *ctx* should point to the lirc sample as passed into
  *             the program.
  *
- *             The *protocol* is the decoded protocol number (see
- *             **enum rc_proto** for some predefined values).
- *
  *             This helper is only available is the kernel was compiled with
  *             the **CONFIG_BPF_LIRC_MODE2** configuration option set to
  *             "**y**".
  *     Return
  *             0
  *
- * int bpf_rc_repeat(void *ctx)
+ * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle)
  *     Description
  *             This helper is used in programs implementing IR decoding, to
- *             report a successfully decoded repeat key message. This delays
- *             the generation of a key up event for previously generated
- *             key down event.
+ *             report a successfully decoded key press with *scancode*,
+ *             *toggle* value in the given *protocol*. The scancode will be
+ *             translated to a keycode using the rc keymap, and reported as
+ *             an input key down event. After a period a key up event is
+ *             generated. This period can be extended by calling either
+ *             **bpf_rc_keydown**\ () again with the same values, or calling
+ *             **bpf_rc_repeat**\ ().
  *
- *             Some IR protocols like NEC have a special IR message for
- *             repeating last button, for when a button is held down.
+ *             Some protocols include a toggle bit, in case the button was
+ *             released and pressed again between consecutive scancodes.
  *
  *             The *ctx* should point to the lirc sample as passed into
  *             the program.
  *
+ *             The *protocol* is the decoded protocol number (see
+ *             **enum rc_proto** for some predefined values).
+ *
  *             This helper is only available is the kernel was compiled with
  *             the **CONFIG_BPF_LIRC_MODE2** configuration option set to
  *             "**y**".
  *     Return
  *             0
  *
- * uint64_t bpf_skb_cgroup_id(struct sk_buff *skb)
+ * u64 bpf_skb_cgroup_id(struct sk_buff *skb)
  *     Description
  *             Return the cgroup v2 id of the socket associated with the *skb*.
  *             This is roughly similar to the **bpf_get_cgroup_classid**\ ()
@@ -2144,30 +2424,12 @@ union bpf_attr {
  *     Return
  *             The id is returned or 0 in case the id could not be retrieved.
  *
- * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level)
- *     Description
- *             Return id of cgroup v2 that is ancestor of cgroup associated
- *             with the *skb* at the *ancestor_level*.  The root cgroup is at
- *             *ancestor_level* zero and each step down the hierarchy
- *             increments the level. If *ancestor_level* == level of cgroup
- *             associated with *skb*, then return value will be same as that
- *             of **bpf_skb_cgroup_id**\ ().
- *
- *             The helper is useful to implement policies based on cgroups
- *             that are upper in hierarchy than immediate cgroup associated
- *             with *skb*.
- *
- *             The format of returned id and helper limitations are same as in
- *             **bpf_skb_cgroup_id**\ ().
- *     Return
- *             The id is returned or 0 in case the id could not be retrieved.
- *
  * u64 bpf_get_current_cgroup_id(void)
  *     Return
  *             A 64-bit integer containing the current cgroup id based
  *             on the cgroup within which the current task is running.
  *
- * voidget_local_storage(void *map, u64 flags)
+ * void *bpf_get_local_storage(void *map, u64 flags)
  *     Description
  *             Get the pointer to the local storage area.
  *             The type and the size of the local storage is defined
@@ -2185,7 +2447,7 @@ union bpf_attr {
  *     Return
  *             A pointer to the local storage area.
  *
- * int bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
+ * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
  *     Description
  *             Select a **SO_REUSEPORT** socket from a
  *             **BPF_MAP_TYPE_REUSEPORT_ARRAY** *map*.
@@ -2194,6 +2456,24 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
+ * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level)
+ *     Description
+ *             Return id of cgroup v2 that is ancestor of cgroup associated
+ *             with the *skb* at the *ancestor_level*.  The root cgroup is at
+ *             *ancestor_level* zero and each step down the hierarchy
+ *             increments the level. If *ancestor_level* == level of cgroup
+ *             associated with *skb*, then return value will be same as that
+ *             of **bpf_skb_cgroup_id**\ ().
+ *
+ *             The helper is useful to implement policies based on cgroups
+ *             that are upper in hierarchy than immediate cgroup associated
+ *             with *skb*.
+ *
+ *             The format of returned id and helper limitations are same as in
+ *             **bpf_skb_cgroup_id**\ ().
+ *     Return
+ *             The id is returned or 0 in case the id could not be retrieved.
+ *
  * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *     Description
  *             Look for TCP socket matching *tuple*, optionally in a child
@@ -2212,7 +2492,7 @@ union bpf_attr {
  *                     Look for an IPv6 socket.
  *
  *             If the *netns* is a negative signed 32-bit integer, then the
- *             socket lookup table in the netns associated with the *ctx* will
+ *             socket lookup table in the netns associated with the *ctx*
  *             will be used. For the TC hooks, this is the netns of the device
  *             in the skb. For socket hooks, this is the netns of the socket.
  *             If *netns* is any other signed 32-bit value greater than or
@@ -2228,7 +2508,8 @@ union bpf_attr {
  *     Return
  *             Pointer to **struct bpf_sock**, or **NULL** in case of failure.
  *             For sockets with reuseport option, the **struct bpf_sock**
- *             result is from **reuse->socks**\ [] using the hash of the tuple.
+ *             result is from *reuse*\ **->socks**\ [] using the hash of the
+ *             tuple.
  *
  * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
  *     Description
@@ -2248,7 +2529,7 @@ union bpf_attr {
  *                     Look for an IPv6 socket.
  *
  *             If the *netns* is a negative signed 32-bit integer, then the
- *             socket lookup table in the netns associated with the *ctx* will
+ *             socket lookup table in the netns associated with the *ctx*
  *             will be used. For the TC hooks, this is the netns of the device
  *             in the skb. For socket hooks, this is the netns of the socket.
  *             If *netns* is any other signed 32-bit value greater than or
@@ -2264,9 +2545,10 @@ union bpf_attr {
  *     Return
  *             Pointer to **struct bpf_sock**, or **NULL** in case of failure.
  *             For sockets with reuseport option, the **struct bpf_sock**
- *             result is from **reuse->socks**\ [] using the hash of the tuple.
+ *             result is from *reuse*\ **->socks**\ [] using the hash of the
+ *             tuple.
  *
- * int bpf_sk_release(struct bpf_sock *sock)
+ * long bpf_sk_release(void *sock)
  *     Description
  *             Release the reference held by *sock*. *sock* must be a
  *             non-**NULL** pointer that was returned from
@@ -2274,19 +2556,29 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_map_pop_elem(struct bpf_map *map, void *value)
+ * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)
+ *     Description
+ *             Push an element *value* in *map*. *flags* is one of:
+ *
+ *             **BPF_EXIST**
+ *                     If the queue/stack is full, the oldest element is
+ *                     removed to make room for this.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_map_pop_elem(struct bpf_map *map, void *value)
  *     Description
  *             Pop an element from *map*.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_map_peek_elem(struct bpf_map *map, void *value)
+ * long bpf_map_peek_elem(struct bpf_map *map, void *value)
  *     Description
  *             Get an element from *map* without removing it.
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_msg_push_data(struct sk_buff *skb, u32 start, u32 len, u64 flags)
+ * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *     Description
  *             For socket policies, insert *len* bytes into *msg* at offset
  *             *start*.
@@ -2302,9 +2594,9 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 pop, u64 flags)
+ * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags)
  *     Description
- *             Will remove *pop* bytes from a *msg* starting at byte *start*.
+ *             Will remove *len* bytes from a *msg* starting at byte *start*.
  *             This may result in **ENOMEM** errors under certain situations if
  *             an allocation and copy are required due to a full ring buffer.
  *             However, the helper will try to avoid doing the allocation
@@ -2314,7 +2606,7 @@ union bpf_attr {
  *     Return
  *             0 on success, or a negative error in case of failure.
  *
- * int bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
+ * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y)
  *     Description
  *             This helper is used in programs implementing IR decoding, to
  *             report a successfully decoded pointer movement.
@@ -2327,70 +2619,1193 @@ union bpf_attr {
  *             "**y**".
  *     Return
  *             0
- */
-#define __BPF_FUNC_MAPPER(FN)          \
-       FN(unspec),                     \
-       FN(map_lookup_elem),            \
-       FN(map_update_elem),            \
-       FN(map_delete_elem),            \
-       FN(probe_read),                 \
-       FN(ktime_get_ns),               \
-       FN(trace_printk),               \
-       FN(get_prandom_u32),            \
-       FN(get_smp_processor_id),       \
-       FN(skb_store_bytes),            \
-       FN(l3_csum_replace),            \
-       FN(l4_csum_replace),            \
-       FN(tail_call),                  \
-       FN(clone_redirect),             \
-       FN(get_current_pid_tgid),       \
-       FN(get_current_uid_gid),        \
-       FN(get_current_comm),           \
-       FN(get_cgroup_classid),         \
-       FN(skb_vlan_push),              \
-       FN(skb_vlan_pop),               \
-       FN(skb_get_tunnel_key),         \
-       FN(skb_set_tunnel_key),         \
-       FN(perf_event_read),            \
-       FN(redirect),                   \
-       FN(get_route_realm),            \
-       FN(perf_event_output),          \
-       FN(skb_load_bytes),             \
-       FN(get_stackid),                \
-       FN(csum_diff),                  \
-       FN(skb_get_tunnel_opt),         \
-       FN(skb_set_tunnel_opt),         \
-       FN(skb_change_proto),           \
-       FN(skb_change_type),            \
-       FN(skb_under_cgroup),           \
-       FN(get_hash_recalc),            \
-       FN(get_current_task),           \
-       FN(probe_write_user),           \
-       FN(current_task_under_cgroup),  \
-       FN(skb_change_tail),            \
-       FN(skb_pull_data),              \
-       FN(csum_update),                \
-       FN(set_hash_invalid),           \
-       FN(get_numa_node_id),           \
-       FN(skb_change_head),            \
-       FN(xdp_adjust_head),            \
-       FN(probe_read_str),             \
-       FN(get_socket_cookie),          \
-       FN(get_socket_uid),             \
-       FN(set_hash),                   \
-       FN(setsockopt),                 \
-       FN(skb_adjust_room),            \
-       FN(redirect_map),               \
-       FN(sk_redirect_map),            \
-       FN(sock_map_update),            \
-       FN(xdp_adjust_meta),            \
-       FN(perf_event_read_value),      \
-       FN(perf_prog_read_value),       \
-       FN(getsockopt),                 \
-       FN(override_return),            \
-       FN(sock_ops_cb_flags_set),      \
-       FN(msg_redirect_map),           \
-       FN(msg_apply_bytes),            \
+ *
+ * long bpf_spin_lock(struct bpf_spin_lock *lock)
+ *     Description
+ *             Acquire a spinlock represented by the pointer *lock*, which is
+ *             stored as part of a value of a map. Taking the lock allows to
+ *             safely update the rest of the fields in that value. The
+ *             spinlock can (and must) later be released with a call to
+ *             **bpf_spin_unlock**\ (\ *lock*\ ).
+ *
+ *             Spinlocks in BPF programs come with a number of restrictions
+ *             and constraints:
+ *
+ *             * **bpf_spin_lock** objects are only allowed inside maps of
+ *               types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this
+ *               list could be extended in the future).
+ *             * BTF description of the map is mandatory.
+ *             * The BPF program can take ONE lock at a time, since taking two
+ *               or more could cause dead locks.
+ *             * Only one **struct bpf_spin_lock** is allowed per map element.
+ *             * When the lock is taken, calls (either BPF to BPF or helpers)
+ *               are not allowed.
+ *             * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not
+ *               allowed inside a spinlock-ed region.
+ *             * The BPF program MUST call **bpf_spin_unlock**\ () to release
+ *               the lock, on all execution paths, before it returns.
+ *             * The BPF program can access **struct bpf_spin_lock** only via
+ *               the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ ()
+ *               helpers. Loading or storing data into the **struct
+ *               bpf_spin_lock** *lock*\ **;** field of a map is not allowed.
+ *             * To use the **bpf_spin_lock**\ () helper, the BTF description
+ *               of the map value must be a struct and have **struct
+ *               bpf_spin_lock** *anyname*\ **;** field at the top level.
+ *               Nested lock inside another struct is not allowed.
+ *             * The **struct bpf_spin_lock** *lock* field in a map value must
+ *               be aligned on a multiple of 4 bytes in that value.
+ *             * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy
+ *               the **bpf_spin_lock** field to user space.
+ *             * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from
+ *               a BPF program, do not update the **bpf_spin_lock** field.
+ *             * **bpf_spin_lock** cannot be on the stack or inside a
+ *               networking packet (it can only be inside of a map values).
+ *             * **bpf_spin_lock** is available to root only.
+ *             * Tracing programs and socket filter programs cannot use
+ *               **bpf_spin_lock**\ () due to insufficient preemption checks
+ *               (but this may change in the future).
+ *             * **bpf_spin_lock** is not allowed in inner maps of map-in-map.
+ *     Return
+ *             0
+ *
+ * long bpf_spin_unlock(struct bpf_spin_lock *lock)
+ *     Description
+ *             Release the *lock* previously locked by a call to
+ *             **bpf_spin_lock**\ (\ *lock*\ ).
+ *     Return
+ *             0
+ *
+ * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk)
+ *     Description
+ *             This helper gets a **struct bpf_sock** pointer such
+ *             that all the fields in this **bpf_sock** can be accessed.
+ *     Return
+ *             A **struct bpf_sock** pointer on success, or **NULL** in
+ *             case of failure.
+ *
+ * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk)
+ *     Description
+ *             This helper gets a **struct bpf_tcp_sock** pointer from a
+ *             **struct bpf_sock** pointer.
+ *     Return
+ *             A **struct bpf_tcp_sock** pointer on success, or **NULL** in
+ *             case of failure.
+ *
+ * long bpf_skb_ecn_set_ce(struct sk_buff *skb)
+ *     Description
+ *             Set ECN (Explicit Congestion Notification) field of IP header
+ *             to **CE** (Congestion Encountered) if current value is **ECT**
+ *             (ECN Capable Transport). Otherwise, do nothing. Works with IPv6
+ *             and IPv4.
+ *     Return
+ *             1 if the **CE** flag is set (either by the current helper call
+ *             or because it was already present), 0 if it is not set.
+ *
+ * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk)
+ *     Description
+ *             Return a **struct bpf_sock** pointer in **TCP_LISTEN** state.
+ *             **bpf_sk_release**\ () is unnecessary and not allowed.
+ *     Return
+ *             A **struct bpf_sock** pointer on success, or **NULL** in
+ *             case of failure.
+ *
+ * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags)
+ *     Description
+ *             Look for TCP socket matching *tuple*, optionally in a child
+ *             network namespace *netns*. The return value must be checked,
+ *             and if non-**NULL**, released via **bpf_sk_release**\ ().
+ *
+ *             This function is identical to **bpf_sk_lookup_tcp**\ (), except
+ *             that it also returns timewait or request sockets. Use
+ *             **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the
+ *             full structure.
+ *
+ *             This helper is available only if the kernel was compiled with
+ *             **CONFIG_NET** configuration option.
+ *     Return
+ *             Pointer to **struct bpf_sock**, or **NULL** in case of failure.
+ *             For sockets with reuseport option, the **struct bpf_sock**
+ *             result is from *reuse*\ **->socks**\ [] using the hash of the
+ *             tuple.
+ *
+ * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
+ *     Description
+ *             Check whether *iph* and *th* contain a valid SYN cookie ACK for
+ *             the listening socket in *sk*.
+ *
+ *             *iph* points to the start of the IPv4 or IPv6 header, while
+ *             *iph_len* contains **sizeof**\ (**struct iphdr**) or
+ *             **sizeof**\ (**struct ip6hdr**).
+ *
+ *             *th* points to the start of the TCP header, while *th_len*
+ *             contains **sizeof**\ (**struct tcphdr**).
+ *     Return
+ *             0 if *iph* and *th* are a valid SYN cookie ACK, or a negative
+ *             error otherwise.
+ *
+ * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags)
+ *     Description
+ *             Get name of sysctl in /proc/sys/ and copy it into provided by
+ *             program buffer *buf* of size *buf_len*.
+ *
+ *             The buffer is always NUL terminated, unless it's zero-sized.
+ *
+ *             If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is
+ *             copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name
+ *             only (e.g. "tcp_mem").
+ *     Return
+ *             Number of character copied (not including the trailing NUL).
+ *
+ *             **-E2BIG** if the buffer wasn't big enough (*buf* will contain
+ *             truncated name in this case).
+ *
+ * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
+ *     Description
+ *             Get current value of sysctl as it is presented in /proc/sys
+ *             (incl. newline, etc), and copy it as a string into provided
+ *             by program buffer *buf* of size *buf_len*.
+ *
+ *             The whole value is copied, no matter what file position user
+ *             space issued e.g. sys_read at.
+ *
+ *             The buffer is always NUL terminated, unless it's zero-sized.
+ *     Return
+ *             Number of character copied (not including the trailing NUL).
+ *
+ *             **-E2BIG** if the buffer wasn't big enough (*buf* will contain
+ *             truncated name in this case).
+ *
+ *             **-EINVAL** if current value was unavailable, e.g. because
+ *             sysctl is uninitialized and read returns -EIO for it.
+ *
+ * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len)
+ *     Description
+ *             Get new value being written by user space to sysctl (before
+ *             the actual write happens) and copy it as a string into
+ *             provided by program buffer *buf* of size *buf_len*.
+ *
+ *             User space may write new value at file position > 0.
+ *
+ *             The buffer is always NUL terminated, unless it's zero-sized.
+ *     Return
+ *             Number of character copied (not including the trailing NUL).
+ *
+ *             **-E2BIG** if the buffer wasn't big enough (*buf* will contain
+ *             truncated name in this case).
+ *
+ *             **-EINVAL** if sysctl is being read.
+ *
+ * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len)
+ *     Description
+ *             Override new value being written by user space to sysctl with
+ *             value provided by program in buffer *buf* of size *buf_len*.
+ *
+ *             *buf* should contain a string in same form as provided by user
+ *             space on sysctl write.
+ *
+ *             User space may write new value at file position > 0. To override
+ *             the whole sysctl value file position should be set to zero.
+ *     Return
+ *             0 on success.
+ *
+ *             **-E2BIG** if the *buf_len* is too big.
+ *
+ *             **-EINVAL** if sysctl is being read.
+ *
+ * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res)
+ *     Description
+ *             Convert the initial part of the string from buffer *buf* of
+ *             size *buf_len* to a long integer according to the given base
+ *             and save the result in *res*.
+ *
+ *             The string may begin with an arbitrary amount of white space
+ *             (as determined by **isspace**\ (3)) followed by a single
+ *             optional '**-**' sign.
+ *
+ *             Five least significant bits of *flags* encode base, other bits
+ *             are currently unused.
+ *
+ *             Base must be either 8, 10, 16 or 0 to detect it automatically
+ *             similar to user space **strtol**\ (3).
+ *     Return
+ *             Number of characters consumed on success. Must be positive but
+ *             no more than *buf_len*.
+ *
+ *             **-EINVAL** if no valid digits were found or unsupported base
+ *             was provided.
+ *
+ *             **-ERANGE** if resulting value was out of range.
+ *
+ * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res)
+ *     Description
+ *             Convert the initial part of the string from buffer *buf* of
+ *             size *buf_len* to an unsigned long integer according to the
+ *             given base and save the result in *res*.
+ *
+ *             The string may begin with an arbitrary amount of white space
+ *             (as determined by **isspace**\ (3)).
+ *
+ *             Five least significant bits of *flags* encode base, other bits
+ *             are currently unused.
+ *
+ *             Base must be either 8, 10, 16 or 0 to detect it automatically
+ *             similar to user space **strtoul**\ (3).
+ *     Return
+ *             Number of characters consumed on success. Must be positive but
+ *             no more than *buf_len*.
+ *
+ *             **-EINVAL** if no valid digits were found or unsupported base
+ *             was provided.
+ *
+ *             **-ERANGE** if resulting value was out of range.
+ *
+ * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags)
+ *     Description
+ *             Get a bpf-local-storage from a *sk*.
+ *
+ *             Logically, it could be thought of getting the value from
+ *             a *map* with *sk* as the **key**.  From this
+ *             perspective,  the usage is not much different from
+ *             **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this
+ *             helper enforces the key must be a full socket and the map must
+ *             be a **BPF_MAP_TYPE_SK_STORAGE** also.
+ *
+ *             Underneath, the value is stored locally at *sk* instead of
+ *             the *map*.  The *map* is used as the bpf-local-storage
+ *             "type". The bpf-local-storage "type" (i.e. the *map*) is
+ *             searched against all bpf-local-storages residing at *sk*.
+ *
+ *             *sk* is a kernel **struct sock** pointer for LSM program.
+ *             *sk* is a **struct bpf_sock** pointer for other program types.
+ *
+ *             An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be
+ *             used such that a new bpf-local-storage will be
+ *             created if one does not exist.  *value* can be used
+ *             together with **BPF_SK_STORAGE_GET_F_CREATE** to specify
+ *             the initial value of a bpf-local-storage.  If *value* is
+ *             **NULL**, the new bpf-local-storage will be zero initialized.
+ *     Return
+ *             A bpf-local-storage pointer is returned on success.
+ *
+ *             **NULL** if not found or there was an error in adding
+ *             a new bpf-local-storage.
+ *
+ * long bpf_sk_storage_delete(struct bpf_map *map, void *sk)
+ *     Description
+ *             Delete a bpf-local-storage from a *sk*.
+ *     Return
+ *             0 on success.
+ *
+ *             **-ENOENT** if the bpf-local-storage cannot be found.
+ *             **-EINVAL** if sk is not a fullsock (e.g. a request_sock).
+ *
+ * long bpf_send_signal(u32 sig)
+ *     Description
+ *             Send signal *sig* to the process of the current task.
+ *             The signal may be delivered to any of this process's threads.
+ *     Return
+ *             0 on success or successfully queued.
+ *
+ *             **-EBUSY** if work queue under nmi is full.
+ *
+ *             **-EINVAL** if *sig* is invalid.
+ *
+ *             **-EPERM** if no permission to send the *sig*.
+ *
+ *             **-EAGAIN** if bpf program can try again.
+ *
+ * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len)
+ *     Description
+ *             Try to issue a SYN cookie for the packet with corresponding
+ *             IP/TCP headers, *iph* and *th*, on the listening socket in *sk*.
+ *
+ *             *iph* points to the start of the IPv4 or IPv6 header, while
+ *             *iph_len* contains **sizeof**\ (**struct iphdr**) or
+ *             **sizeof**\ (**struct ip6hdr**).
+ *
+ *             *th* points to the start of the TCP header, while *th_len*
+ *             contains the length of the TCP header.
+ *     Return
+ *             On success, lower 32 bits hold the generated SYN cookie in
+ *             followed by 16 bits which hold the MSS value for that cookie,
+ *             and the top 16 bits are unused.
+ *
+ *             On failure, the returned value is one of the following:
+ *
+ *             **-EINVAL** SYN cookie cannot be issued due to error
+ *
+ *             **-ENOENT** SYN cookie should not be issued (no SYN flood)
+ *
+ *             **-EOPNOTSUPP** kernel configuration does not enable SYN cookies
+ *
+ *             **-EPROTONOSUPPORT** IP packet version is not 4 or 6
+ *
+ * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
+ *     Description
+ *             Write raw *data* blob into a special BPF perf event held by
+ *             *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf
+ *             event must have the following attributes: **PERF_SAMPLE_RAW**
+ *             as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and
+ *             **PERF_COUNT_SW_BPF_OUTPUT** as **config**.
+ *
+ *             The *flags* are used to indicate the index in *map* for which
+ *             the value must be put, masked with **BPF_F_INDEX_MASK**.
+ *             Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU**
+ *             to indicate that the index of the current CPU core should be
+ *             used.
+ *
+ *             The value to write, of *size*, is passed through eBPF stack and
+ *             pointed by *data*.
+ *
+ *             *ctx* is a pointer to in-kernel struct sk_buff.
+ *
+ *             This helper is similar to **bpf_perf_event_output**\ () but
+ *             restricted to raw_tracepoint bpf programs.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr)
+ *     Description
+ *             Safely attempt to read *size* bytes from user space address
+ *             *unsafe_ptr* and store the data in *dst*.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr)
+ *     Description
+ *             Safely attempt to read *size* bytes from kernel space address
+ *             *unsafe_ptr* and store the data in *dst*.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr)
+ *     Description
+ *             Copy a NUL terminated string from an unsafe user address
+ *             *unsafe_ptr* to *dst*. The *size* should include the
+ *             terminating NUL byte. In case the string length is smaller than
+ *             *size*, the target is not padded with further NUL bytes. If the
+ *             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:
+ *
+ *             ::
+ *
+ *                     SEC("kprobe/sys_open")
+ *                     void bpf_sys_open(struct pt_regs *ctx)
+ *                     {
+ *                             char buf[PATHLEN]; // PATHLEN is defined to 256
+ *                             int res = bpf_probe_read_user_str(buf, sizeof(buf),
+ *                                                               ctx->di);
+ *
+ *                             // Consume buf, for example push it to
+ *                             // userspace via bpf_perf_event_output(); we
+ *                             // can use res (the string length) as event
+ *                             // size, after checking its boundaries.
+ *                     }
+ *
+ *             In comparison, using **bpf_probe_read_user**\ () helper here
+ *             instead to read the string would require to estimate the length
+ *             at compile time, and would often result in copying more memory
+ *             than necessary.
+ *
+ *             Another useful use case is when parsing individual process
+ *             arguments or individual environment variables navigating
+ *             *current*\ **->mm->arg_start** and *current*\
+ *             **->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,
+ *             including the trailing NUL character. On error, a negative
+ *             value.
+ *
+ * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr)
+ *     Description
+ *             Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr*
+ *             to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply.
+ *     Return
+ *             On success, the strictly positive length of the string, including
+ *             the trailing NUL character. On error, a negative value.
+ *
+ * long bpf_tcp_send_ack(void *tp, u32 rcv_nxt)
+ *     Description
+ *             Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**.
+ *             *rcv_nxt* is the ack_seq to be sent out.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_send_signal_thread(u32 sig)
+ *     Description
+ *             Send signal *sig* to the thread corresponding to the current task.
+ *     Return
+ *             0 on success or successfully queued.
+ *
+ *             **-EBUSY** if work queue under nmi is full.
+ *
+ *             **-EINVAL** if *sig* is invalid.
+ *
+ *             **-EPERM** if no permission to send the *sig*.
+ *
+ *             **-EAGAIN** if bpf program can try again.
+ *
+ * u64 bpf_jiffies64(void)
+ *     Description
+ *             Obtain the 64bit jiffies
+ *     Return
+ *             The 64 bit jiffies
+ *
+ * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags)
+ *     Description
+ *             For an eBPF program attached to a perf event, retrieve the
+ *             branch records (**struct perf_branch_entry**) associated to *ctx*
+ *             and store it in the buffer pointed by *buf* up to size
+ *             *size* bytes.
+ *     Return
+ *             On success, number of bytes written to *buf*. On error, a
+ *             negative value.
+ *
+ *             The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to
+ *             instead return the number of bytes required to store all the
+ *             branch entries. If this flag is set, *buf* may be NULL.
+ *
+ *             **-EINVAL** if arguments invalid or **size** not a multiple
+ *             of **sizeof**\ (**struct perf_branch_entry**\ ).
+ *
+ *             **-ENOENT** if architecture does not support branch records.
+ *
+ * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size)
+ *     Description
+ *             Returns 0 on success, values for *pid* and *tgid* as seen from the current
+ *             *namespace* will be returned in *nsdata*.
+ *     Return
+ *             0 on success, or one of the following in case of failure:
+ *
+ *             **-EINVAL** if dev and inum supplied don't match dev_t and inode number
+ *              with nsfs of current task, or if dev conversion to dev_t lost high bits.
+ *
+ *             **-ENOENT** if pidns does not exists for the current task.
+ *
+ * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size)
+ *     Description
+ *             Write raw *data* blob into a special BPF perf event held by
+ *             *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf
+ *             event must have the following attributes: **PERF_SAMPLE_RAW**
+ *             as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and
+ *             **PERF_COUNT_SW_BPF_OUTPUT** as **config**.
+ *
+ *             The *flags* are used to indicate the index in *map* for which
+ *             the value must be put, masked with **BPF_F_INDEX_MASK**.
+ *             Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU**
+ *             to indicate that the index of the current CPU core should be
+ *             used.
+ *
+ *             The value to write, of *size*, is passed through eBPF stack and
+ *             pointed by *data*.
+ *
+ *             *ctx* is a pointer to in-kernel struct xdp_buff.
+ *
+ *             This helper is similar to **bpf_perf_eventoutput**\ () but
+ *             restricted to raw_tracepoint bpf programs.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * u64 bpf_get_netns_cookie(void *ctx)
+ *     Description
+ *             Retrieve the cookie (generated by the kernel) of the network
+ *             namespace the input *ctx* is associated with. The network
+ *             namespace cookie remains stable for its lifetime and provides
+ *             a global identifier that can be assumed unique. If *ctx* is
+ *             NULL, then the helper returns the cookie for the initial
+ *             network namespace. The cookie itself is very similar to that
+ *             of **bpf_get_socket_cookie**\ () helper, but for network
+ *             namespaces instead of sockets.
+ *     Return
+ *             A 8-byte long opaque number.
+ *
+ * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level)
+ *     Description
+ *             Return id of cgroup v2 that is ancestor of the cgroup associated
+ *             with the current task at the *ancestor_level*. The root cgroup
+ *             is at *ancestor_level* zero and each step down the hierarchy
+ *             increments the level. If *ancestor_level* == level of cgroup
+ *             associated with the current task, then return value will be the
+ *             same as that of **bpf_get_current_cgroup_id**\ ().
+ *
+ *             The helper is useful to implement policies based on cgroups
+ *             that are upper in hierarchy than immediate cgroup associated
+ *             with the current task.
+ *
+ *             The format of returned id and helper limitations are same as in
+ *             **bpf_get_current_cgroup_id**\ ().
+ *     Return
+ *             The id is returned or 0 in case the id could not be retrieved.
+ *
+ * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags)
+ *     Description
+ *             Helper is overloaded depending on BPF program type. This
+ *             description applies to **BPF_PROG_TYPE_SCHED_CLS** and
+ *             **BPF_PROG_TYPE_SCHED_ACT** programs.
+ *
+ *             Assign the *sk* to the *skb*. When combined with appropriate
+ *             routing configuration to receive the packet towards the socket,
+ *             will cause *skb* to be delivered to the specified socket.
+ *             Subsequent redirection of *skb* via  **bpf_redirect**\ (),
+ *             **bpf_clone_redirect**\ () or other methods outside of BPF may
+ *             interfere with successful delivery to the socket.
+ *
+ *             This operation is only valid from TC ingress path.
+ *
+ *             The *flags* argument must be zero.
+ *     Return
+ *             0 on success, or a negative error in case of failure:
+ *
+ *             **-EINVAL** if specified *flags* are not supported.
+ *
+ *             **-ENOENT** if the socket is unavailable for assignment.
+ *
+ *             **-ENETUNREACH** if the socket is unreachable (wrong netns).
+ *
+ *             **-EOPNOTSUPP** if the operation is not supported, for example
+ *             a call from outside of TC ingress.
+ *
+ *             **-ESOCKTNOSUPPORT** if the socket type is not supported
+ *             (reuseport).
+ *
+ * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags)
+ *     Description
+ *             Helper is overloaded depending on BPF program type. This
+ *             description applies to **BPF_PROG_TYPE_SK_LOOKUP** programs.
+ *
+ *             Select the *sk* as a result of a socket lookup.
+ *
+ *             For the operation to succeed passed socket must be compatible
+ *             with the packet description provided by the *ctx* object.
+ *
+ *             L4 protocol (**IPPROTO_TCP** or **IPPROTO_UDP**) must
+ *             be an exact match. While IP family (**AF_INET** or
+ *             **AF_INET6**) must be compatible, that is IPv6 sockets
+ *             that are not v6-only can be selected for IPv4 packets.
+ *
+ *             Only TCP listeners and UDP unconnected sockets can be
+ *             selected. *sk* can also be NULL to reset any previous
+ *             selection.
+ *
+ *             *flags* argument can combination of following values:
+ *
+ *             * **BPF_SK_LOOKUP_F_REPLACE** to override the previous
+ *               socket selection, potentially done by a BPF program
+ *               that ran before us.
+ *
+ *             * **BPF_SK_LOOKUP_F_NO_REUSEPORT** to skip
+ *               load-balancing within reuseport group for the socket
+ *               being selected.
+ *
+ *             On success *ctx->sk* will point to the selected socket.
+ *
+ *     Return
+ *             0 on success, or a negative errno in case of failure.
+ *
+ *             * **-EAFNOSUPPORT** if socket family (*sk->family*) is
+ *               not compatible with packet family (*ctx->family*).
+ *
+ *             * **-EEXIST** if socket has been already selected,
+ *               potentially by another program, and
+ *               **BPF_SK_LOOKUP_F_REPLACE** flag was not specified.
+ *
+ *             * **-EINVAL** if unsupported flags were specified.
+ *
+ *             * **-EPROTOTYPE** if socket L4 protocol
+ *               (*sk->protocol*) doesn't match packet protocol
+ *               (*ctx->protocol*).
+ *
+ *             * **-ESOCKTNOSUPPORT** if socket is not in allowed
+ *               state (TCP listening or UDP unconnected).
+ *
+ * u64 bpf_ktime_get_boot_ns(void)
+ *     Description
+ *             Return the time elapsed since system boot, in nanoseconds.
+ *             Does include the time the system was suspended.
+ *             See: **clock_gettime**\ (**CLOCK_BOOTTIME**)
+ *     Return
+ *             Current *ktime*.
+ *
+ * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len)
+ *     Description
+ *             **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print
+ *             out the format string.
+ *             The *m* represents the seq_file. The *fmt* and *fmt_size* are for
+ *             the format string itself. The *data* and *data_len* are format string
+ *             arguments. The *data* are a **u64** array and corresponding format string
+ *             values are stored in the array. For strings and pointers where pointees
+ *             are accessed, only the pointer values are stored in the *data* array.
+ *             The *data_len* is the size of *data* in bytes.
+ *
+ *             Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory.
+ *             Reading kernel memory may fail due to either invalid address or
+ *             valid address but requiring a major memory fault. If reading kernel memory
+ *             fails, the string for **%s** will be an empty string, and the ip
+ *             address for **%p{i,I}{4,6}** will be 0. Not returning error to
+ *             bpf program is consistent with what **bpf_trace_printk**\ () does for now.
+ *     Return
+ *             0 on success, or a negative error in case of failure:
+ *
+ *             **-EBUSY** if per-CPU memory copy buffer is busy, can try again
+ *             by returning 1 from bpf program.
+ *
+ *             **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported.
+ *
+ *             **-E2BIG** if *fmt* contains too many format specifiers.
+ *
+ *             **-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ *
+ * long bpf_seq_write(struct seq_file *m, const void *data, u32 len)
+ *     Description
+ *             **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data.
+ *             The *m* represents the seq_file. The *data* and *len* represent the
+ *             data to write in bytes.
+ *     Return
+ *             0 on success, or a negative error in case of failure:
+ *
+ *             **-EOVERFLOW** if an overflow happened: The same object will be tried again.
+ *
+ * u64 bpf_sk_cgroup_id(void *sk)
+ *     Description
+ *             Return the cgroup v2 id of the socket *sk*.
+ *
+ *             *sk* must be a non-**NULL** pointer to a socket, e.g. one
+ *             returned from **bpf_sk_lookup_xxx**\ (),
+ *             **bpf_sk_fullsock**\ (), etc. The format of returned id is
+ *             same as in **bpf_skb_cgroup_id**\ ().
+ *
+ *             This helper is available only if the kernel was compiled with
+ *             the **CONFIG_SOCK_CGROUP_DATA** configuration option.
+ *     Return
+ *             The id is returned or 0 in case the id could not be retrieved.
+ *
+ * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level)
+ *     Description
+ *             Return id of cgroup v2 that is ancestor of cgroup associated
+ *             with the *sk* at the *ancestor_level*.  The root cgroup is at
+ *             *ancestor_level* zero and each step down the hierarchy
+ *             increments the level. If *ancestor_level* == level of cgroup
+ *             associated with *sk*, then return value will be same as that
+ *             of **bpf_sk_cgroup_id**\ ().
+ *
+ *             The helper is useful to implement policies based on cgroups
+ *             that are upper in hierarchy than immediate cgroup associated
+ *             with *sk*.
+ *
+ *             The format of returned id and helper limitations are same as in
+ *             **bpf_sk_cgroup_id**\ ().
+ *     Return
+ *             The id is returned or 0 in case the id could not be retrieved.
+ *
+ * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags)
+ *     Description
+ *             Copy *size* bytes from *data* into a ring buffer *ringbuf*.
+ *             If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification
+ *             of new data availability is sent.
+ *             If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification
+ *             of new data availability is sent unconditionally.
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags)
+ *     Description
+ *             Reserve *size* bytes of payload in a ring buffer *ringbuf*.
+ *     Return
+ *             Valid pointer with *size* bytes of memory available; NULL,
+ *             otherwise.
+ *
+ * void bpf_ringbuf_submit(void *data, u64 flags)
+ *     Description
+ *             Submit reserved ring buffer sample, pointed to by *data*.
+ *             If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification
+ *             of new data availability is sent.
+ *             If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification
+ *             of new data availability is sent unconditionally.
+ *     Return
+ *             Nothing. Always succeeds.
+ *
+ * void bpf_ringbuf_discard(void *data, u64 flags)
+ *     Description
+ *             Discard reserved ring buffer sample, pointed to by *data*.
+ *             If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification
+ *             of new data availability is sent.
+ *             If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification
+ *             of new data availability is sent unconditionally.
+ *     Return
+ *             Nothing. Always succeeds.
+ *
+ * u64 bpf_ringbuf_query(void *ringbuf, u64 flags)
+ *     Description
+ *             Query various characteristics of provided ring buffer. What
+ *             exactly is queries is determined by *flags*:
+ *
+ *             * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed.
+ *             * **BPF_RB_RING_SIZE**: The size of ring buffer.
+ *             * **BPF_RB_CONS_POS**: Consumer position (can wrap around).
+ *             * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around).
+ *
+ *             Data returned is just a momentary snapshot of actual values
+ *             and could be inaccurate, so this facility should be used to
+ *             power heuristics and for reporting, not to make 100% correct
+ *             calculation.
+ *     Return
+ *             Requested value, or 0, if *flags* are not recognized.
+ *
+ * long bpf_csum_level(struct sk_buff *skb, u64 level)
+ *     Description
+ *             Change the skbs checksum level by one layer up or down, or
+ *             reset it entirely to none in order to have the stack perform
+ *             checksum validation. The level is applicable to the following
+ *             protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of
+ *             | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP |
+ *             through **bpf_skb_adjust_room**\ () helper with passing in
+ *             **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call
+ *             to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since
+ *             the UDP header is removed. Similarly, an encap of the latter
+ *             into the former could be accompanied by a helper call to
+ *             **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the
+ *             skb is still intended to be processed in higher layers of the
+ *             stack instead of just egressing at tc.
+ *
+ *             There are three supported level settings at this time:
+ *
+ *             * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs
+ *               with CHECKSUM_UNNECESSARY.
+ *             * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs
+ *               with CHECKSUM_UNNECESSARY.
+ *             * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and
+ *               sets CHECKSUM_NONE to force checksum validation by the stack.
+ *             * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current
+ *               skb->csum_level.
+ *     Return
+ *             0 on success, or a negative error in case of failure. In the
+ *             case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level
+ *             is returned or the error code -EACCES in case the skb is not
+ *             subject to CHECKSUM_UNNECESSARY.
+ *
+ * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk)
+ *     Description
+ *             Dynamically cast a *sk* pointer to a *tcp6_sock* pointer.
+ *     Return
+ *             *sk* if casting is valid, or **NULL** otherwise.
+ *
+ * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk)
+ *     Description
+ *             Dynamically cast a *sk* pointer to a *tcp_sock* pointer.
+ *     Return
+ *             *sk* if casting is valid, or **NULL** otherwise.
+ *
+ * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk)
+ *     Description
+ *             Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer.
+ *     Return
+ *             *sk* if casting is valid, or **NULL** otherwise.
+ *
+ * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk)
+ *     Description
+ *             Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer.
+ *     Return
+ *             *sk* if casting is valid, or **NULL** otherwise.
+ *
+ * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk)
+ *     Description
+ *             Dynamically cast a *sk* pointer to a *udp6_sock* pointer.
+ *     Return
+ *             *sk* if casting is valid, or **NULL** otherwise.
+ *
+ * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags)
+ *     Description
+ *             Return a user or a kernel stack in bpf program provided buffer.
+ *             To achieve this, the helper needs *task*, which is a valid
+ *             pointer to **struct task_struct**. To store the stacktrace, the
+ *             bpf program provides *buf* with a nonnegative *size*.
+ *
+ *             The last argument, *flags*, holds the number of stack frames to
+ *             skip (from 0 to 255), masked with
+ *             **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set
+ *             the following flags:
+ *
+ *             **BPF_F_USER_STACK**
+ *                     Collect a user space stack instead of a kernel stack.
+ *             **BPF_F_USER_BUILD_ID**
+ *                     Collect buildid+offset instead of ips for user stack,
+ *                     only valid if **BPF_F_USER_STACK** is also specified.
+ *
+ *             **bpf_get_task_stack**\ () can collect up to
+ *             **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject
+ *             to sufficient large buffer size. Note that
+ *             this limit can be controlled with the **sysctl** program, and
+ *             that it should be manually increased in order to profile long
+ *             user stacks (such as stacks for Java programs). To do so, use:
+ *
+ *             ::
+ *
+ *                     # sysctl kernel.perf_event_max_stack=<new value>
+ *     Return
+ *             A non-negative value equal to or less than *size* on success,
+ *             or a negative error in case of failure.
+ *
+ * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags)
+ *     Description
+ *             Load header option.  Support reading a particular TCP header
+ *             option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**).
+ *
+ *             If *flags* is 0, it will search the option from the
+ *             *skops*\ **->skb_data**.  The comment in **struct bpf_sock_ops**
+ *             has details on what skb_data contains under different
+ *             *skops*\ **->op**.
+ *
+ *             The first byte of the *searchby_res* specifies the
+ *             kind that it wants to search.
+ *
+ *             If the searching kind is an experimental kind
+ *             (i.e. 253 or 254 according to RFC6994).  It also
+ *             needs to specify the "magic" which is either
+ *             2 bytes or 4 bytes.  It then also needs to
+ *             specify the size of the magic by using
+ *             the 2nd byte which is "kind-length" of a TCP
+ *             header option and the "kind-length" also
+ *             includes the first 2 bytes "kind" and "kind-length"
+ *             itself as a normal TCP header option also does.
+ *
+ *             For example, to search experimental kind 254 with
+ *             2 byte magic 0xeB9F, the searchby_res should be
+ *             [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ].
+ *
+ *             To search for the standard window scale option (3),
+ *             the *searchby_res* should be [ 3, 0, 0, .... 0 ].
+ *             Note, kind-length must be 0 for regular option.
+ *
+ *             Searching for No-Op (0) and End-of-Option-List (1) are
+ *             not supported.
+ *
+ *             *len* must be at least 2 bytes which is the minimal size
+ *             of a header option.
+ *
+ *             Supported flags:
+ *
+ *             * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the
+ *               saved_syn packet or the just-received syn packet.
+ *
+ *     Return
+ *             > 0 when found, the header option is copied to *searchby_res*.
+ *             The return value is the total length copied. On failure, a
+ *             negative error code is returned:
+ *
+ *             **-EINVAL** if a parameter is invalid.
+ *
+ *             **-ENOMSG** if the option is not found.
+ *
+ *             **-ENOENT** if no syn packet is available when
+ *             **BPF_LOAD_HDR_OPT_TCP_SYN** is used.
+ *
+ *             **-ENOSPC** if there is not enough space.  Only *len* number of
+ *             bytes are copied.
+ *
+ *             **-EFAULT** on failure to parse the header options in the
+ *             packet.
+ *
+ *             **-EPERM** if the helper cannot be used under the current
+ *             *skops*\ **->op**.
+ *
+ * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags)
+ *     Description
+ *             Store header option.  The data will be copied
+ *             from buffer *from* with length *len* to the TCP header.
+ *
+ *             The buffer *from* should have the whole option that
+ *             includes the kind, kind-length, and the actual
+ *             option data.  The *len* must be at least kind-length
+ *             long.  The kind-length does not have to be 4 byte
+ *             aligned.  The kernel will take care of the padding
+ *             and setting the 4 bytes aligned value to th->doff.
+ *
+ *             This helper will check for duplicated option
+ *             by searching the same option in the outgoing skb.
+ *
+ *             This helper can only be called during
+ *             **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**.
+ *
+ *     Return
+ *             0 on success, or negative error in case of failure:
+ *
+ *             **-EINVAL** If param is invalid.
+ *
+ *             **-ENOSPC** if there is not enough space in the header.
+ *             Nothing has been written
+ *
+ *             **-EEXIST** if the option already exists.
+ *
+ *             **-EFAULT** on failrue to parse the existing header options.
+ *
+ *             **-EPERM** if the helper cannot be used under the current
+ *             *skops*\ **->op**.
+ *
+ * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags)
+ *     Description
+ *             Reserve *len* bytes for the bpf header option.  The
+ *             space will be used by **bpf_store_hdr_opt**\ () later in
+ *             **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**.
+ *
+ *             If **bpf_reserve_hdr_opt**\ () is called multiple times,
+ *             the total number of bytes will be reserved.
+ *
+ *             This helper can only be called during
+ *             **BPF_SOCK_OPS_HDR_OPT_LEN_CB**.
+ *
+ *     Return
+ *             0 on success, or negative error in case of failure:
+ *
+ *             **-EINVAL** if a parameter is invalid.
+ *
+ *             **-ENOSPC** if there is not enough space in the header.
+ *
+ *             **-EPERM** if the helper cannot be used under the current
+ *             *skops*\ **->op**.
+ *
+ * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags)
+ *     Description
+ *             Get a bpf_local_storage from an *inode*.
+ *
+ *             Logically, it could be thought of as getting the value from
+ *             a *map* with *inode* as the **key**.  From this
+ *             perspective,  the usage is not much different from
+ *             **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this
+ *             helper enforces the key must be an inode and the map must also
+ *             be a **BPF_MAP_TYPE_INODE_STORAGE**.
+ *
+ *             Underneath, the value is stored locally at *inode* instead of
+ *             the *map*.  The *map* is used as the bpf-local-storage
+ *             "type". The bpf-local-storage "type" (i.e. the *map*) is
+ *             searched against all bpf_local_storage residing at *inode*.
+ *
+ *             An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be
+ *             used such that a new bpf_local_storage will be
+ *             created if one does not exist.  *value* can be used
+ *             together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify
+ *             the initial value of a bpf_local_storage.  If *value* is
+ *             **NULL**, the new bpf_local_storage will be zero initialized.
+ *     Return
+ *             A bpf_local_storage pointer is returned on success.
+ *
+ *             **NULL** if not found or there was an error in adding
+ *             a new bpf_local_storage.
+ *
+ * int bpf_inode_storage_delete(struct bpf_map *map, void *inode)
+ *     Description
+ *             Delete a bpf_local_storage from an *inode*.
+ *     Return
+ *             0 on success.
+ *
+ *             **-ENOENT** if the bpf_local_storage cannot be found.
+ *
+ * long bpf_d_path(struct path *path, char *buf, u32 sz)
+ *     Description
+ *             Return full path for given **struct path** object, which
+ *             needs to be the kernel BTF *path* object. The path is
+ *             returned in the provided buffer *buf* of size *sz* and
+ *             is zero terminated.
+ *
+ *     Return
+ *             On success, the strictly positive length of the string,
+ *             including the trailing NUL character. On error, a negative
+ *             value.
+ *
+ * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr)
+ *     Description
+ *             Read *size* bytes from user space address *user_ptr* and store
+ *             the data in *dst*. This is a wrapper of **copy_from_user**\ ().
+ *     Return
+ *             0 on success, or a negative error in case of failure.
+ *
+ * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags)
+ *     Description
+ *             Use BTF to store a string representation of *ptr*->ptr in *str*,
+ *             using *ptr*->type_id.  This value should specify the type
+ *             that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1)
+ *             can be used to look up vmlinux BTF type ids. Traversing the
+ *             data structure using BTF, the type information and values are
+ *             stored in the first *str_size* - 1 bytes of *str*.  Safe copy of
+ *             the pointer data is carried out to avoid kernel crashes during
+ *             operation.  Smaller types can use string space on the stack;
+ *             larger programs can use map data to store the string
+ *             representation.
+ *
+ *             The string can be subsequently shared with userspace via
+ *             bpf_perf_event_output() or ring buffer interfaces.
+ *             bpf_trace_printk() is to be avoided as it places too small
+ *             a limit on string size to be useful.
+ *
+ *             *flags* is a combination of
+ *
+ *             **BTF_F_COMPACT**
+ *                     no formatting around type information
+ *             **BTF_F_NONAME**
+ *                     no struct/union member names/types
+ *             **BTF_F_PTR_RAW**
+ *                     show raw (unobfuscated) pointer values;
+ *                     equivalent to printk specifier %px.
+ *             **BTF_F_ZERO**
+ *                     show zero-valued struct/union members; they
+ *                     are not displayed by default
+ *
+ *     Return
+ *             The number of bytes that were written (or would have been
+ *             written if output had to be truncated due to string size),
+ *             or a negative error in cases of failure.
+ *
+ * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags)
+ *     Description
+ *             Use BTF to write to seq_write a string representation of
+ *             *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf().
+ *             *flags* are identical to those used for bpf_snprintf_btf.
+ *     Return
+ *             0 on success or a negative error in case of failure.
+ *
+ * u64 bpf_skb_cgroup_classid(struct sk_buff *skb)
+ *     Description
+ *             See **bpf_get_cgroup_classid**\ () for the main description.
+ *             This helper differs from **bpf_get_cgroup_classid**\ () in that
+ *             the cgroup v1 net_cls class is retrieved only from the *skb*'s
+ *             associated socket instead of the current process.
+ *     Return
+ *             The id is returned or 0 in case the id could not be retrieved.
+ *
+ * long bpf_redirect_neigh(u32 ifindex, struct bpf_redir_neigh *params, int plen, u64 flags)
+ *     Description
+ *             Redirect the packet to another net device of index *ifindex*
+ *             and fill in L2 addresses from neighboring subsystem. This helper
+ *             is somewhat similar to **bpf_redirect**\ (), except that it
+ *             populates L2 addresses as well, meaning, internally, the helper
+ *             relies on the neighbor lookup for the L2 address of the nexthop.
+ *
+ *             The helper will perform a FIB lookup based on the skb's
+ *             networking header to get the address of the next hop, unless
+ *             this is supplied by the caller in the *params* argument. The
+ *             *plen* argument indicates the len of *params* and should be set
+ *             to 0 if *params* is NULL.
+ *
+ *             The *flags* argument is reserved and must be 0. The helper is
+ *             currently only supported for tc BPF program types, and enabled
+ *             for IPv4 and IPv6 protocols.
+ *     Return
+ *             The helper returns **TC_ACT_REDIRECT** on success or
+ *             **TC_ACT_SHOT** on error.
+ *
+ * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu)
+ *     Description
+ *             Take a pointer to a percpu ksym, *percpu_ptr*, and return a
+ *             pointer to the percpu kernel variable on *cpu*. A ksym is an
+ *             extern variable decorated with '__ksym'. For ksym, there is a
+ *             global var (either static or global) defined of the same name
+ *             in the kernel. The ksym is percpu if the global var is percpu.
+ *             The returned pointer points to the global percpu var on *cpu*.
+ *
+ *             bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the
+ *             kernel, except that bpf_per_cpu_ptr() may return NULL. This
+ *             happens if *cpu* is larger than nr_cpu_ids. The caller of
+ *             bpf_per_cpu_ptr() must check the returned value.
+ *     Return
+ *             A pointer pointing to the kernel percpu variable on *cpu*, or
+ *             NULL, if *cpu* is invalid.
+ *
+ * void *bpf_this_cpu_ptr(const void *percpu_ptr)
+ *     Description
+ *             Take a pointer to a percpu ksym, *percpu_ptr*, and return a
+ *             pointer to the percpu kernel variable on this cpu. See the
+ *             description of 'ksym' in **bpf_per_cpu_ptr**\ ().
+ *
+ *             bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in
+ *             the kernel. Different from **bpf_per_cpu_ptr**\ (), it would
+ *             never return NULL.
+ *     Return
+ *             A pointer pointing to the kernel percpu variable on this cpu.
+ *
+ * long bpf_redirect_peer(u32 ifindex, u64 flags)
+ *     Description
+ *             Redirect the packet to another net device of index *ifindex*.
+ *             This helper is somewhat similar to **bpf_redirect**\ (), except
+ *             that the redirection happens to the *ifindex*' peer device and
+ *             the netns switch takes place from ingress to ingress without
+ *             going through the CPU's backlog queue.
+ *
+ *             The *flags* argument is reserved and must be 0. The helper is
+ *             currently only supported for tc BPF program types at the ingress
+ *             hook and for veth device types. The peer device must reside in a
+ *             different network namespace.
+ *     Return
+ *             The helper returns **TC_ACT_REDIRECT** on success or
+ *             **TC_ACT_SHOT** on error.
+ */
+#define __BPF_FUNC_MAPPER(FN)          \
+       FN(unspec),                     \
+       FN(map_lookup_elem),            \
+       FN(map_update_elem),            \
+       FN(map_delete_elem),            \
+       FN(probe_read),                 \
+       FN(ktime_get_ns),               \
+       FN(trace_printk),               \
+       FN(get_prandom_u32),            \
+       FN(get_smp_processor_id),       \
+       FN(skb_store_bytes),            \
+       FN(l3_csum_replace),            \
+       FN(l4_csum_replace),            \
+       FN(tail_call),                  \
+       FN(clone_redirect),             \
+       FN(get_current_pid_tgid),       \
+       FN(get_current_uid_gid),        \
+       FN(get_current_comm),           \
+       FN(get_cgroup_classid),         \
+       FN(skb_vlan_push),              \
+       FN(skb_vlan_pop),               \
+       FN(skb_get_tunnel_key),         \
+       FN(skb_set_tunnel_key),         \
+       FN(perf_event_read),            \
+       FN(redirect),                   \
+       FN(get_route_realm),            \
+       FN(perf_event_output),          \
+       FN(skb_load_bytes),             \
+       FN(get_stackid),                \
+       FN(csum_diff),                  \
+       FN(skb_get_tunnel_opt),         \
+       FN(skb_set_tunnel_opt),         \
+       FN(skb_change_proto),           \
+       FN(skb_change_type),            \
+       FN(skb_under_cgroup),           \
+       FN(get_hash_recalc),            \
+       FN(get_current_task),           \
+       FN(probe_write_user),           \
+       FN(current_task_under_cgroup),  \
+       FN(skb_change_tail),            \
+       FN(skb_pull_data),              \
+       FN(csum_update),                \
+       FN(set_hash_invalid),           \
+       FN(get_numa_node_id),           \
+       FN(skb_change_head),            \
+       FN(xdp_adjust_head),            \
+       FN(probe_read_str),             \
+       FN(get_socket_cookie),          \
+       FN(get_socket_uid),             \
+       FN(set_hash),                   \
+       FN(setsockopt),                 \
+       FN(skb_adjust_room),            \
+       FN(redirect_map),               \
+       FN(sk_redirect_map),            \
+       FN(sock_map_update),            \
+       FN(xdp_adjust_meta),            \
+       FN(perf_event_read_value),      \
+       FN(perf_prog_read_value),       \
+       FN(getsockopt),                 \
+       FN(override_return),            \
+       FN(sock_ops_cb_flags_set),      \
+       FN(msg_redirect_map),           \
+       FN(msg_apply_bytes),            \
        FN(msg_cork_bytes),             \
        FN(msg_pull_data),              \
        FN(bind),                       \
@@ -2421,7 +3836,71 @@ union bpf_attr {
        FN(map_peek_elem),              \
        FN(msg_push_data),              \
        FN(msg_pop_data),               \
-       FN(rc_pointer_rel),
+       FN(rc_pointer_rel),             \
+       FN(spin_lock),                  \
+       FN(spin_unlock),                \
+       FN(sk_fullsock),                \
+       FN(tcp_sock),                   \
+       FN(skb_ecn_set_ce),             \
+       FN(get_listener_sock),          \
+       FN(skc_lookup_tcp),             \
+       FN(tcp_check_syncookie),        \
+       FN(sysctl_get_name),            \
+       FN(sysctl_get_current_value),   \
+       FN(sysctl_get_new_value),       \
+       FN(sysctl_set_new_value),       \
+       FN(strtol),                     \
+       FN(strtoul),                    \
+       FN(sk_storage_get),             \
+       FN(sk_storage_delete),          \
+       FN(send_signal),                \
+       FN(tcp_gen_syncookie),          \
+       FN(skb_output),                 \
+       FN(probe_read_user),            \
+       FN(probe_read_kernel),          \
+       FN(probe_read_user_str),        \
+       FN(probe_read_kernel_str),      \
+       FN(tcp_send_ack),               \
+       FN(send_signal_thread),         \
+       FN(jiffies64),                  \
+       FN(read_branch_records),        \
+       FN(get_ns_current_pid_tgid),    \
+       FN(xdp_output),                 \
+       FN(get_netns_cookie),           \
+       FN(get_current_ancestor_cgroup_id),     \
+       FN(sk_assign),                  \
+       FN(ktime_get_boot_ns),          \
+       FN(seq_printf),                 \
+       FN(seq_write),                  \
+       FN(sk_cgroup_id),               \
+       FN(sk_ancestor_cgroup_id),      \
+       FN(ringbuf_output),             \
+       FN(ringbuf_reserve),            \
+       FN(ringbuf_submit),             \
+       FN(ringbuf_discard),            \
+       FN(ringbuf_query),              \
+       FN(csum_level),                 \
+       FN(skc_to_tcp6_sock),           \
+       FN(skc_to_tcp_sock),            \
+       FN(skc_to_tcp_timewait_sock),   \
+       FN(skc_to_tcp_request_sock),    \
+       FN(skc_to_udp6_sock),           \
+       FN(get_task_stack),             \
+       FN(load_hdr_opt),               \
+       FN(store_hdr_opt),              \
+       FN(reserve_hdr_opt),            \
+       FN(inode_storage_get),          \
+       FN(inode_storage_delete),       \
+       FN(d_path),                     \
+       FN(copy_from_user),             \
+       FN(snprintf_btf),               \
+       FN(seq_printf_btf),             \
+       FN(skb_cgroup_classid),         \
+       FN(redirect_neigh),             \
+       FN(bpf_per_cpu_ptr),            \
+       FN(bpf_this_cpu_ptr),           \
+       FN(redirect_peer),              \
+       /* */
 
 /* integer value in 'imm' field of BPF_CALL instruction selects which helper
  * function eBPF program intends to call
@@ -2436,53 +3915,147 @@ enum bpf_func_id {
 /* All flags used by eBPF helper functions, placed here. */
 
 /* BPF_FUNC_skb_store_bytes flags. */
-#define BPF_F_RECOMPUTE_CSUM           (1ULL << 0)
-#define BPF_F_INVALIDATE_HASH          (1ULL << 1)
+enum {
+       BPF_F_RECOMPUTE_CSUM            = (1ULL << 0),
+       BPF_F_INVALIDATE_HASH           = (1ULL << 1),
+};
 
 /* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags.
  * First 4 bits are for passing the header field size.
  */
-#define BPF_F_HDR_FIELD_MASK           0xfULL
+enum {
+       BPF_F_HDR_FIELD_MASK            = 0xfULL,
+};
 
 /* BPF_FUNC_l4_csum_replace flags. */
-#define BPF_F_PSEUDO_HDR               (1ULL << 4)
-#define BPF_F_MARK_MANGLED_0           (1ULL << 5)
-#define BPF_F_MARK_ENFORCE             (1ULL << 6)
+enum {
+       BPF_F_PSEUDO_HDR                = (1ULL << 4),
+       BPF_F_MARK_MANGLED_0            = (1ULL << 5),
+       BPF_F_MARK_ENFORCE              = (1ULL << 6),
+};
 
 /* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */
-#define BPF_F_INGRESS                  (1ULL << 0)
+enum {
+       BPF_F_INGRESS                   = (1ULL << 0),
+};
 
 /* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */
-#define BPF_F_TUNINFO_IPV6             (1ULL << 0)
+enum {
+       BPF_F_TUNINFO_IPV6              = (1ULL << 0),
+};
 
 /* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */
-#define BPF_F_SKIP_FIELD_MASK          0xffULL
-#define BPF_F_USER_STACK               (1ULL << 8)
+enum {
+       BPF_F_SKIP_FIELD_MASK           = 0xffULL,
+       BPF_F_USER_STACK                = (1ULL << 8),
 /* flags used by BPF_FUNC_get_stackid only. */
-#define BPF_F_FAST_STACK_CMP           (1ULL << 9)
-#define BPF_F_REUSE_STACKID            (1ULL << 10)
+       BPF_F_FAST_STACK_CMP            = (1ULL << 9),
+       BPF_F_REUSE_STACKID             = (1ULL << 10),
 /* flags used by BPF_FUNC_get_stack only. */
-#define BPF_F_USER_BUILD_ID            (1ULL << 11)
+       BPF_F_USER_BUILD_ID             = (1ULL << 11),
+};
 
 /* BPF_FUNC_skb_set_tunnel_key flags. */
-#define BPF_F_ZERO_CSUM_TX             (1ULL << 1)
-#define BPF_F_DONT_FRAGMENT            (1ULL << 2)
-#define BPF_F_SEQ_NUMBER               (1ULL << 3)
+enum {
+       BPF_F_ZERO_CSUM_TX              = (1ULL << 1),
+       BPF_F_DONT_FRAGMENT             = (1ULL << 2),
+       BPF_F_SEQ_NUMBER                = (1ULL << 3),
+};
 
 /* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and
  * BPF_FUNC_perf_event_read_value flags.
  */
-#define BPF_F_INDEX_MASK               0xffffffffULL
-#define BPF_F_CURRENT_CPU              BPF_F_INDEX_MASK
+enum {
+       BPF_F_INDEX_MASK                = 0xffffffffULL,
+       BPF_F_CURRENT_CPU               = BPF_F_INDEX_MASK,
 /* BPF_FUNC_perf_event_output for sk_buff input context. */
-#define BPF_F_CTXLEN_MASK              (0xfffffULL << 32)
+       BPF_F_CTXLEN_MASK               = (0xfffffULL << 32),
+};
 
 /* Current network namespace */
-#define BPF_F_CURRENT_NETNS            (-1L)
+enum {
+       BPF_F_CURRENT_NETNS             = (-1L),
+};
+
+/* BPF_FUNC_csum_level level values. */
+enum {
+       BPF_CSUM_LEVEL_QUERY,
+       BPF_CSUM_LEVEL_INC,
+       BPF_CSUM_LEVEL_DEC,
+       BPF_CSUM_LEVEL_RESET,
+};
+
+/* BPF_FUNC_skb_adjust_room flags. */
+enum {
+       BPF_F_ADJ_ROOM_FIXED_GSO        = (1ULL << 0),
+       BPF_F_ADJ_ROOM_ENCAP_L3_IPV4    = (1ULL << 1),
+       BPF_F_ADJ_ROOM_ENCAP_L3_IPV6    = (1ULL << 2),
+       BPF_F_ADJ_ROOM_ENCAP_L4_GRE     = (1ULL << 3),
+       BPF_F_ADJ_ROOM_ENCAP_L4_UDP     = (1ULL << 4),
+       BPF_F_ADJ_ROOM_NO_CSUM_RESET    = (1ULL << 5),
+};
+
+enum {
+       BPF_ADJ_ROOM_ENCAP_L2_MASK      = 0xff,
+       BPF_ADJ_ROOM_ENCAP_L2_SHIFT     = 56,
+};
+
+#define BPF_F_ADJ_ROOM_ENCAP_L2(len)   (((__u64)len & \
+                                         BPF_ADJ_ROOM_ENCAP_L2_MASK) \
+                                        << BPF_ADJ_ROOM_ENCAP_L2_SHIFT)
+
+/* BPF_FUNC_sysctl_get_name flags. */
+enum {
+       BPF_F_SYSCTL_BASE_NAME          = (1ULL << 0),
+};
+
+/* BPF_FUNC_<kernel_obj>_storage_get flags */
+enum {
+       BPF_LOCAL_STORAGE_GET_F_CREATE  = (1ULL << 0),
+       /* BPF_SK_STORAGE_GET_F_CREATE is only kept for backward compatibility
+        * and BPF_LOCAL_STORAGE_GET_F_CREATE must be used instead.
+        */
+       BPF_SK_STORAGE_GET_F_CREATE  = BPF_LOCAL_STORAGE_GET_F_CREATE,
+};
+
+/* BPF_FUNC_read_branch_records flags. */
+enum {
+       BPF_F_GET_BRANCH_RECORDS_SIZE   = (1ULL << 0),
+};
+
+/* BPF_FUNC_bpf_ringbuf_commit, BPF_FUNC_bpf_ringbuf_discard, and
+ * BPF_FUNC_bpf_ringbuf_output flags.
+ */
+enum {
+       BPF_RB_NO_WAKEUP                = (1ULL << 0),
+       BPF_RB_FORCE_WAKEUP             = (1ULL << 1),
+};
+
+/* BPF_FUNC_bpf_ringbuf_query flags */
+enum {
+       BPF_RB_AVAIL_DATA = 0,
+       BPF_RB_RING_SIZE = 1,
+       BPF_RB_CONS_POS = 2,
+       BPF_RB_PROD_POS = 3,
+};
+
+/* BPF ring buffer constants */
+enum {
+       BPF_RINGBUF_BUSY_BIT            = (1U << 31),
+       BPF_RINGBUF_DISCARD_BIT         = (1U << 30),
+       BPF_RINGBUF_HDR_SZ              = 8,
+};
+
+/* BPF_FUNC_sk_assign flags in bpf_sk_lookup context. */
+enum {
+       BPF_SK_LOOKUP_F_REPLACE         = (1ULL << 0),
+       BPF_SK_LOOKUP_F_NO_REUSEPORT    = (1ULL << 1),
+};
 
 /* Mode for BPF_FUNC_skb_adjust_room helper. */
 enum bpf_adj_room_mode {
        BPF_ADJ_ROOM_NET,
+       BPF_ADJ_ROOM_MAC,
 };
 
 /* Mode for BPF_FUNC_skb_load_bytes_relative helper. */
@@ -2494,7 +4067,8 @@ enum bpf_hdr_start_off {
 /* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */
 enum bpf_lwt_encap_mode {
        BPF_LWT_ENCAP_SEG6,
-       BPF_LWT_ENCAP_SEG6_INLINE
+       BPF_LWT_ENCAP_SEG6_INLINE,
+       BPF_LWT_ENCAP_IP,
 };
 
 #define __bpf_md_ptr(type, name)       \
@@ -2540,6 +4114,9 @@ struct __sk_buff {
        __bpf_md_ptr(struct bpf_flow_keys *, flow_keys);
        __u64 tstamp;
        __u32 wire_len;
+       __u32 gso_segs;
+       __bpf_md_ptr(struct bpf_sock *, sk);
+       __u32 gso_size;
 };
 
 struct bpf_tunnel_key {
@@ -2581,7 +4158,15 @@ enum bpf_ret_code {
        BPF_DROP = 2,
        /* 3-6 reserved */
        BPF_REDIRECT = 7,
-       /* >127 are reserved for prog type specific return codes */
+       /* >127 are reserved for prog type specific return codes.
+        *
+        * BPF_LWT_REROUTE: used by BPF_PROG_TYPE_LWT_IN and
+        *    BPF_PROG_TYPE_LWT_XMIT to indicate that skb had been
+        *    changed and should be routed based on its new L3 header.
+        *    (This is an L3 redirect, as opposed to L2 redirect
+        *    represented by BPF_REDIRECT above).
+        */
+       BPF_LWT_REROUTE = 128,
 };
 
 struct bpf_sock {
@@ -2591,15 +4176,60 @@ struct bpf_sock {
        __u32 protocol;
        __u32 mark;
        __u32 priority;
-       __u32 src_ip4;          /* Allows 1,2,4-byte read.
-                                * Stored in network byte order.
+       /* IP address also allows 1 and 2 bytes access */
+       __u32 src_ip4;
+       __u32 src_ip6[4];
+       __u32 src_port;         /* host byte order */
+       __u32 dst_port;         /* network byte order */
+       __u32 dst_ip4;
+       __u32 dst_ip6[4];
+       __u32 state;
+       __s32 rx_queue_mapping;
+};
+
+struct bpf_tcp_sock {
+       __u32 snd_cwnd;         /* Sending congestion window            */
+       __u32 srtt_us;          /* smoothed round trip time << 3 in usecs */
+       __u32 rtt_min;
+       __u32 snd_ssthresh;     /* Slow start size threshold            */
+       __u32 rcv_nxt;          /* What we want to receive next         */
+       __u32 snd_nxt;          /* Next sequence we send                */
+       __u32 snd_una;          /* First byte we want an ack for        */
+       __u32 mss_cache;        /* Cached effective mss, not including SACKS */
+       __u32 ecn_flags;        /* ECN status bits.                     */
+       __u32 rate_delivered;   /* saved rate sample: packets delivered */
+       __u32 rate_interval_us; /* saved rate sample: time elapsed */
+       __u32 packets_out;      /* Packets which are "in flight"        */
+       __u32 retrans_out;      /* Retransmitted packets out            */
+       __u32 total_retrans;    /* Total retransmits for entire connection */
+       __u32 segs_in;          /* RFC4898 tcpEStatsPerfSegsIn
+                                * total number of segments in.
                                 */
-       __u32 src_ip6[4];       /* Allows 1,2,4-byte read.
-                                * Stored in network byte order.
+       __u32 data_segs_in;     /* RFC4898 tcpEStatsPerfDataSegsIn
+                                * total number of data segments in.
+                                */
+       __u32 segs_out;         /* RFC4898 tcpEStatsPerfSegsOut
+                                * The total number of segments sent.
+                                */
+       __u32 data_segs_out;    /* RFC4898 tcpEStatsPerfDataSegsOut
+                                * total number of data segments sent.
+                                */
+       __u32 lost_out;         /* Lost packets                 */
+       __u32 sacked_out;       /* SACK'd packets                       */
+       __u64 bytes_received;   /* RFC4898 tcpEStatsAppHCThruOctetsReceived
+                                * sum(delta(rcv_nxt)), or how many bytes
+                                * were acked.
                                 */
-       __u32 src_port;         /* Allows 4-byte read.
-                                * Stored in host byte order
+       __u64 bytes_acked;      /* RFC4898 tcpEStatsAppHCThruOctetsAcked
+                                * sum(delta(snd_una)), or how many bytes
+                                * were acked.
                                 */
+       __u32 dsack_dups;       /* RFC4898 tcpEStatsStackDSACKDups
+                                * total number of DSACK blocks received
+                                */
+       __u32 delivered;        /* Total data packets delivered incl. rexmits */
+       __u32 delivered_ce;     /* Like the above but only ECE marked packets */
+       __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */
 };
 
 struct bpf_sock_tuple {
@@ -2619,6 +4249,10 @@ struct bpf_sock_tuple {
        };
 };
 
+struct bpf_xdp_sock {
+       __u32 queue_id;
+};
+
 #define XDP_PACKET_HEADROOM 256
 
 /* User return codes for XDP prog type.
@@ -2644,6 +4278,34 @@ struct xdp_md {
        /* Below access go through struct xdp_rxq_info */
        __u32 ingress_ifindex; /* rxq->dev->ifindex */
        __u32 rx_queue_index;  /* rxq->queue_index  */
+
+       __u32 egress_ifindex;  /* txq->dev->ifindex */
+};
+
+/* DEVMAP map-value layout
+ *
+ * The struct data-layout of map-value is a configuration interface.
+ * New members can only be added to the end of this structure.
+ */
+struct bpf_devmap_val {
+       __u32 ifindex;   /* device index */
+       union {
+               int   fd;  /* prog fd on map write */
+               __u32 id;  /* prog id on map read */
+       } bpf_prog;
+};
+
+/* CPUMAP map-value layout
+ *
+ * The struct data-layout of map-value is a configuration interface.
+ * New members can only be added to the end of this structure.
+ */
+struct bpf_cpumap_val {
+       __u32 qsize;    /* queue size to remote target CPU */
+       union {
+               int   fd;       /* prog fd on map write */
+               __u32 id;       /* prog id on map read */
+       } bpf_prog;
 };
 
 enum sk_action {
@@ -2666,6 +4328,8 @@ struct sk_msg_md {
        __u32 remote_port;      /* Stored in network byte order */
        __u32 local_port;       /* stored in host byte order */
        __u32 size;             /* Total size of sk_msg */
+
+       __bpf_md_ptr(struct bpf_sock *, sk); /* current socket */
 };
 
 struct sk_reuseport_md {
@@ -2710,6 +4374,7 @@ struct bpf_prog_info {
        char name[BPF_OBJ_NAME_LEN];
        __u32 ifindex;
        __u32 gpl_compatible:1;
+       __u32 :31; /* alignment pad */
        __u64 netns_dev;
        __u64 netns_ino;
        __u32 nr_jited_ksyms;
@@ -2728,6 +4393,8 @@ struct bpf_prog_info {
        __u32 jited_line_info_rec_size;
        __u32 nr_prog_tags;
        __aligned_u64 prog_tags;
+       __u64 run_time_ns;
+       __u64 run_cnt;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {
@@ -2739,7 +4406,7 @@ struct bpf_map_info {
        __u32 map_flags;
        char  name[BPF_OBJ_NAME_LEN];
        __u32 ifindex;
-       __u32 :32;
+       __u32 btf_vmlinux_value_type_id;
        __u64 netns_dev;
        __u64 netns_ino;
        __u32 btf_id;
@@ -2753,30 +4420,66 @@ struct bpf_btf_info {
        __u32 id;
 } __attribute__((aligned(8)));
 
+struct bpf_link_info {
+       __u32 type;
+       __u32 id;
+       __u32 prog_id;
+       union {
+               struct {
+                       __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */
+                       __u32 tp_name_len;     /* in/out: tp_name buffer len */
+               } raw_tracepoint;
+               struct {
+                       __u32 attach_type;
+               } tracing;
+               struct {
+                       __u64 cgroup_id;
+                       __u32 attach_type;
+               } cgroup;
+               struct {
+                       __aligned_u64 target_name; /* in/out: target_name buffer ptr */
+                       __u32 target_name_len;     /* in/out: target_name buffer len */
+                       union {
+                               struct {
+                                       __u32 map_id;
+                               } map;
+                       };
+               } iter;
+               struct  {
+                       __u32 netns_ino;
+                       __u32 attach_type;
+               } netns;
+               struct {
+                       __u32 ifindex;
+               } xdp;
+       };
+} __attribute__((aligned(8)));
+
 /* User bpf_sock_addr struct to access socket fields and sockaddr struct passed
  * by user and intended to be used by socket (e.g. to bind to, depends on
- * attach attach type).
+ * attach type).
  */
 struct bpf_sock_addr {
        __u32 user_family;      /* Allows 4-byte read, but no write. */
        __u32 user_ip4;         /* Allows 1,2,4-byte read and 4-byte write.
                                 * Stored in network byte order.
                                 */
-       __u32 user_ip6[4];      /* Allows 1,2,4-byte read an 4-byte write.
+       __u32 user_ip6[4];      /* Allows 1,2,4,8-byte read and 4,8-byte write.
                                 * Stored in network byte order.
                                 */
-       __u32 user_port;        /* Allows 4-byte read and write.
+       __u32 user_port;        /* Allows 1,2,4-byte read and 4-byte write.
                                 * Stored in network byte order
                                 */
        __u32 family;           /* Allows 4-byte read, but no write */
        __u32 type;             /* Allows 4-byte read, but no write */
        __u32 protocol;         /* Allows 4-byte read, but no write */
-       __u32 msg_src_ip4;      /* Allows 1,2,4-byte read an 4-byte write.
+       __u32 msg_src_ip4;      /* Allows 1,2,4-byte read and 4-byte write.
                                 * Stored in network byte order.
                                 */
-       __u32 msg_src_ip6[4];   /* Allows 1,2,4-byte read an 4-byte write.
+       __u32 msg_src_ip6[4];   /* Allows 1,2,4,8-byte read and 4,8-byte write.
                                 * Stored in network byte order.
                                 */
+       __bpf_md_ptr(struct bpf_sock *, sk);
 };
 
 /* User bpf_sock_ops struct to access socket values and specify request ops
@@ -2828,15 +4531,91 @@ struct bpf_sock_ops {
        __u32 sk_txhash;
        __u64 bytes_received;
        __u64 bytes_acked;
+       __bpf_md_ptr(struct bpf_sock *, sk);
+       /* [skb_data, skb_data_end) covers the whole TCP header.
+        *
+        * BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received
+        * BPF_SOCK_OPS_HDR_OPT_LEN_CB:   Not useful because the
+        *                                header has not been written.
+        * BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have
+        *                                been written so far.
+        * BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB:  The SYNACK that concludes
+        *                                      the 3WHS.
+        * BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes
+        *                                      the 3WHS.
+        *
+        * bpf_load_hdr_opt() can also be used to read a particular option.
+        */
+       __bpf_md_ptr(void *, skb_data);
+       __bpf_md_ptr(void *, skb_data_end);
+       __u32 skb_len;          /* The total length of a packet.
+                                * It includes the header, options,
+                                * and payload.
+                                */
+       __u32 skb_tcp_flags;    /* tcp_flags of the header.  It provides
+                                * an easy way to check for tcp_flags
+                                * without parsing skb_data.
+                                *
+                                * In particular, the skb_tcp_flags
+                                * will still be available in
+                                * BPF_SOCK_OPS_HDR_OPT_LEN even though
+                                * the outgoing header has not
+                                * been written yet.
+                                */
 };
 
 /* Definitions for bpf_sock_ops_cb_flags */
-#define BPF_SOCK_OPS_RTO_CB_FLAG       (1<<0)
-#define BPF_SOCK_OPS_RETRANS_CB_FLAG   (1<<1)
-#define BPF_SOCK_OPS_STATE_CB_FLAG     (1<<2)
-#define BPF_SOCK_OPS_ALL_CB_FLAGS       0x7            /* Mask of all currently
-                                                        * supported cb flags
-                                                        */
+enum {
+       BPF_SOCK_OPS_RTO_CB_FLAG        = (1<<0),
+       BPF_SOCK_OPS_RETRANS_CB_FLAG    = (1<<1),
+       BPF_SOCK_OPS_STATE_CB_FLAG      = (1<<2),
+       BPF_SOCK_OPS_RTT_CB_FLAG        = (1<<3),
+       /* Call bpf for all received TCP headers.  The bpf prog will be
+        * called under sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB
+        *
+        * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB
+        * for the header option related helpers that will be useful
+        * to the bpf programs.
+        *
+        * It could be used at the client/active side (i.e. connect() side)
+        * when the server told it that the server was in syncookie
+        * mode and required the active side to resend the bpf-written
+        * options.  The active side can keep writing the bpf-options until
+        * it received a valid packet from the server side to confirm
+        * the earlier packet (and options) has been received.  The later
+        * example patch is using it like this at the active side when the
+        * server is in syncookie mode.
+        *
+        * The bpf prog will usually turn this off in the common cases.
+        */
+       BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG  = (1<<4),
+       /* Call bpf when kernel has received a header option that
+        * the kernel cannot handle.  The bpf prog will be called under
+        * sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB.
+        *
+        * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB
+        * for the header option related helpers that will be useful
+        * to the bpf programs.
+        */
+       BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = (1<<5),
+       /* Call bpf when the kernel is writing header options for the
+        * outgoing packet.  The bpf prog will first be called
+        * to reserve space in a skb under
+        * sock_ops->op == BPF_SOCK_OPS_HDR_OPT_LEN_CB.  Then
+        * the bpf prog will be called to write the header option(s)
+        * under sock_ops->op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB.
+        *
+        * Please refer to the comment in BPF_SOCK_OPS_HDR_OPT_LEN_CB
+        * and BPF_SOCK_OPS_WRITE_HDR_OPT_CB for the header option
+        * related helpers that will be useful to the bpf programs.
+        *
+        * The kernel gets its chance to reserve space and write
+        * options first before the BPF program does.
+        */
+       BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6),
+/* Mask of all currently supported cb flags */
+       BPF_SOCK_OPS_ALL_CB_FLAGS       = 0x7F,
+};
 
 /* List of known BPF sock_ops operators.
  * New entries can only be added at the end
@@ -2889,6 +4668,65 @@ enum {
        BPF_SOCK_OPS_TCP_LISTEN_CB,     /* Called on listen(2), right after
                                         * socket transition to LISTEN state.
                                         */
+       BPF_SOCK_OPS_RTT_CB,            /* Called on every RTT.
+                                        */
+       BPF_SOCK_OPS_PARSE_HDR_OPT_CB,  /* Parse the header option.
+                                        * It will be called to handle
+                                        * the packets received at
+                                        * an already established
+                                        * connection.
+                                        *
+                                        * sock_ops->skb_data:
+                                        * Referring to the received skb.
+                                        * It covers the TCP header only.
+                                        *
+                                        * bpf_load_hdr_opt() can also
+                                        * be used to search for a
+                                        * particular option.
+                                        */
+       BPF_SOCK_OPS_HDR_OPT_LEN_CB,    /* Reserve space for writing the
+                                        * header option later in
+                                        * BPF_SOCK_OPS_WRITE_HDR_OPT_CB.
+                                        * Arg1: bool want_cookie. (in
+                                        *       writing SYNACK only)
+                                        *
+                                        * sock_ops->skb_data:
+                                        * Not available because no header has
+                                        * been written yet.
+                                        *
+                                        * sock_ops->skb_tcp_flags:
+                                        * The tcp_flags of the
+                                        * outgoing skb. (e.g. SYN, ACK, FIN).
+                                        *
+                                        * bpf_reserve_hdr_opt() should
+                                        * be used to reserve space.
+                                        */
+       BPF_SOCK_OPS_WRITE_HDR_OPT_CB,  /* Write the header options
+                                        * Arg1: bool want_cookie. (in
+                                        *       writing SYNACK only)
+                                        *
+                                        * sock_ops->skb_data:
+                                        * Referring to the outgoing skb.
+                                        * It covers the TCP header
+                                        * that has already been written
+                                        * by the kernel and the
+                                        * earlier bpf-progs.
+                                        *
+                                        * sock_ops->skb_tcp_flags:
+                                        * The tcp_flags of the outgoing
+                                        * skb. (e.g. SYN, ACK, FIN).
+                                        *
+                                        * bpf_store_hdr_opt() should
+                                        * be used to write the
+                                        * option.
+                                        *
+                                        * bpf_load_hdr_opt() can also
+                                        * be used to search for a
+                                        * particular option that
+                                        * has already been written
+                                        * by the kernel or the
+                                        * earlier bpf-progs.
+                                        */
 };
 
 /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
@@ -2913,8 +4751,67 @@ enum {
        BPF_TCP_MAX_STATES      /* Leave at the end! */
 };
 
-#define TCP_BPF_IW             1001    /* Set TCP initial congestion window */
-#define TCP_BPF_SNDCWND_CLAMP  1002    /* Set sndcwnd_clamp */
+enum {
+       TCP_BPF_IW              = 1001, /* Set TCP initial congestion window */
+       TCP_BPF_SNDCWND_CLAMP   = 1002, /* Set sndcwnd_clamp */
+       TCP_BPF_DELACK_MAX      = 1003, /* Max delay ack in usecs */
+       TCP_BPF_RTO_MIN         = 1004, /* Min delay ack in usecs */
+       /* Copy the SYN pkt to optval
+        *
+        * BPF_PROG_TYPE_SOCK_OPS only.  It is similar to the
+        * bpf_getsockopt(TCP_SAVED_SYN) but it does not limit
+        * to only getting from the saved_syn.  It can either get the
+        * syn packet from:
+        *
+        * 1. the just-received SYN packet (only available when writing the
+        *    SYNACK).  It will be useful when it is not necessary to
+        *    save the SYN packet for latter use.  It is also the only way
+        *    to get the SYN during syncookie mode because the syn
+        *    packet cannot be saved during syncookie.
+        *
+        * OR
+        *
+        * 2. the earlier saved syn which was done by
+        *    bpf_setsockopt(TCP_SAVE_SYN).
+        *
+        * The bpf_getsockopt(TCP_BPF_SYN*) option will hide where the
+        * SYN packet is obtained.
+        *
+        * If the bpf-prog does not need the IP[46] header,  the
+        * bpf-prog can avoid parsing the IP header by using
+        * TCP_BPF_SYN.  Otherwise, the bpf-prog can get both
+        * IP[46] and TCP header by using TCP_BPF_SYN_IP.
+        *
+        *      >0: Total number of bytes copied
+        * -ENOSPC: Not enough space in optval. Only optlen number of
+        *          bytes is copied.
+        * -ENOENT: The SYN skb is not available now and the earlier SYN pkt
+        *          is not saved by setsockopt(TCP_SAVE_SYN).
+        */
+       TCP_BPF_SYN             = 1005, /* Copy the TCP header */
+       TCP_BPF_SYN_IP          = 1006, /* Copy the IP[46] and TCP header */
+       TCP_BPF_SYN_MAC         = 1007, /* Copy the MAC, IP[46], and TCP header */
+};
+
+enum {
+       BPF_LOAD_HDR_OPT_TCP_SYN = (1ULL << 0),
+};
+
+/* args[0] value during BPF_SOCK_OPS_HDR_OPT_LEN_CB and
+ * BPF_SOCK_OPS_WRITE_HDR_OPT_CB.
+ */
+enum {
+       BPF_WRITE_HDR_TCP_CURRENT_MSS = 1,      /* Kernel is finding the
+                                                * total option spaces
+                                                * required for an established
+                                                * sk in order to calculate the
+                                                * MSS.  No skb is actually
+                                                * sent.
+                                                */
+       BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2,    /* Kernel is in syncookie mode
+                                                * when sending a SYN.
+                                                */
+};
 
 struct bpf_perf_event_value {
        __u64 counter;
@@ -2922,12 +4819,16 @@ struct bpf_perf_event_value {
        __u64 running;
 };
 
-#define BPF_DEVCG_ACC_MKNOD    (1ULL << 0)
-#define BPF_DEVCG_ACC_READ     (1ULL << 1)
-#define BPF_DEVCG_ACC_WRITE    (1ULL << 2)
+enum {
+       BPF_DEVCG_ACC_MKNOD     = (1ULL << 0),
+       BPF_DEVCG_ACC_READ      = (1ULL << 1),
+       BPF_DEVCG_ACC_WRITE     = (1ULL << 2),
+};
 
-#define BPF_DEVCG_DEV_BLOCK    (1ULL << 0)
-#define BPF_DEVCG_DEV_CHAR     (1ULL << 1)
+enum {
+       BPF_DEVCG_DEV_BLOCK     = (1ULL << 0),
+       BPF_DEVCG_DEV_CHAR      = (1ULL << 1),
+};
 
 struct bpf_cgroup_dev_ctx {
        /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */
@@ -2943,8 +4844,10 @@ struct bpf_raw_tracepoint_args {
 /* DIRECT:  Skip the FIB rules and go to FIB table associated with device
  * OUTPUT:  Do lookup from egress perspective; default is ingress
  */
-#define BPF_FIB_LOOKUP_DIRECT  BIT(0)
-#define BPF_FIB_LOOKUP_OUTPUT  BIT(1)
+enum {
+       BPF_FIB_LOOKUP_DIRECT  = (1U << 0),
+       BPF_FIB_LOOKUP_OUTPUT  = (1U << 1),
+};
 
 enum {
        BPF_FIB_LKUP_RET_SUCCESS,      /* lookup successful */
@@ -3007,6 +4910,16 @@ struct bpf_fib_lookup {
        __u8    dmac[6];     /* ETH_ALEN */
 };
 
+struct bpf_redir_neigh {
+       /* network family for lookup (AF_INET, AF_INET6) */
+       __u32 nh_family;
+       /* network address of nexthop; skips fib lookup to find gateway */
+       union {
+               __be32          ipv4_nh;
+               __u32           ipv6_nh[4];  /* in6_addr; network order */
+       };
+};
+
 enum bpf_task_fd_type {
        BPF_FD_TYPE_RAW_TRACEPOINT,     /* tp name */
        BPF_FD_TYPE_TRACEPOINT,         /* tp name */
@@ -3016,6 +4929,12 @@ enum bpf_task_fd_type {
        BPF_FD_TYPE_URETPROBE,          /* filename + offset */
 };
 
+enum {
+       BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG             = (1U << 0),
+       BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL         = (1U << 1),
+       BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP              = (1U << 2),
+};
+
 struct bpf_flow_keys {
        __u16   nhoff;
        __u16   thoff;
@@ -3037,6 +4956,8 @@ struct bpf_flow_keys {
                        __u32   ipv6_dst[4];    /* in6_addr; network order */
                };
        };
+       __u32   flags;
+       __be32  flow_label;
 };
 
 struct bpf_func_info {
@@ -3054,4 +4975,77 @@ struct bpf_line_info {
        __u32   line_col;
 };
 
+struct bpf_spin_lock {
+       __u32   val;
+};
+
+struct bpf_sysctl {
+       __u32   write;          /* Sysctl is being read (= 0) or written (= 1).
+                                * Allows 1,2,4-byte read, but no write.
+                                */
+       __u32   file_pos;       /* Sysctl file position to read from, write to.
+                                * Allows 1,2,4-byte read an 4-byte write.
+                                */
+};
+
+struct bpf_sockopt {
+       __bpf_md_ptr(struct bpf_sock *, sk);
+       __bpf_md_ptr(void *, optval);
+       __bpf_md_ptr(void *, optval_end);
+
+       __s32   level;
+       __s32   optname;
+       __s32   optlen;
+       __s32   retval;
+};
+
+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 {
+       __bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */
+
+       __u32 family;           /* Protocol family (AF_INET, AF_INET6) */
+       __u32 protocol;         /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */
+       __u32 remote_ip4;       /* Network byte order */
+       __u32 remote_ip6[4];    /* Network byte order */
+       __u32 remote_port;      /* Network byte order */
+       __u32 local_ip4;        /* Network byte order */
+       __u32 local_ip6[4];     /* Network byte order */
+       __u32 local_port;       /* Host byte order */
+};
+
+/*
+ * struct btf_ptr is used for typed pointer representation; the
+ * type id is used to render the pointer data as the appropriate type
+ * via the bpf_snprintf_btf() helper described above.  A flags field -
+ * potentially to specify additional details about the BTF pointer
+ * (rather than its mode of display) - is included for future use.
+ * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately.
+ */
+struct btf_ptr {
+       void *ptr;
+       __u32 type_id;
+       __u32 flags;            /* BTF ptr flags; unused at present. */
+};
+
+/*
+ * Flags to control bpf_snprintf_btf() behaviour.
+ *     - BTF_F_COMPACT: no formatting around type information
+ *     - BTF_F_NONAME: no struct/union member names/types
+ *     - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values;
+ *       equivalent to %px.
+ *     - BTF_F_ZERO: show zero-valued struct/union members; they
+ *       are not displayed by default
+ */
+enum {
+       BTF_F_COMPACT   =       (1ULL << 0),
+       BTF_F_NONAME    =       (1ULL << 1),
+       BTF_F_PTR_RAW   =       (1ULL << 2),
+       BTF_F_ZERO      =       (1ULL << 3),
+};
+
 #endif /* _UAPI__LINUX_BPF_H__ */
index b3aeec70f9a31280fddc02615f61b73957a6099f..ab312e13fbcb9cc8afe6913905f3a1edbc02430a 100644 (file)
@@ -243,6 +243,7 @@ enum {
        DM_TARGET_MSG_CMD,
        DM_DEV_SET_GEOMETRY_CMD,
        DM_DEV_ARM_POLL_CMD,
+       DM_GET_TARGET_VERSION_CMD,
 };
 
 #define DM_IOCTL 0xfd
@@ -265,6 +266,7 @@ enum {
 #define DM_TABLE_STATUS  _IOWR(DM_IOCTL, DM_TABLE_STATUS_CMD, struct dm_ioctl)
 
 #define DM_LIST_VERSIONS _IOWR(DM_IOCTL, DM_LIST_VERSIONS_CMD, struct dm_ioctl)
+#define DM_GET_TARGET_VERSION _IOWR(DM_IOCTL, DM_GET_TARGET_VERSION_CMD, struct dm_ioctl)
 
 #define DM_TARGET_MSG   _IOWR(DM_IOCTL, DM_TARGET_MSG_CMD, struct dm_ioctl)
 #define DM_DEV_SET_GEOMETRY    _IOWR(DM_IOCTL, DM_DEV_SET_GEOMETRY_CMD, struct dm_ioctl)
@@ -272,7 +274,7 @@ enum {
 #define DM_VERSION_MAJOR       4
 #define DM_VERSION_MINOR       27
 #define DM_VERSION_PATCHLEVEL  0
-#define DM_VERSION_EXTRA       "-ioctl (2019-01-18)"
+#define DM_VERSION_EXTRA       "-ioctl (2020-10-01)"
 
 /* Status bits */
 #define DM_READONLY_FLAG       (1 << 0) /* In/Out */
index b06c6302fbd19bc135dffe8f447f2a2c0b506f13..974d4292e7d91ebdef2c594d8812e6aeb83d7b12 100644 (file)
@@ -1621,6 +1621,8 @@ enum ethtool_link_mode_bit_indices {
        ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 87,
        ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT         = 88,
        ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT         = 89,
+       ETHTOOL_LINK_MODE_100baseFX_Half_BIT             = 90,
+       ETHTOOL_LINK_MODE_100baseFX_Full_BIT             = 91,
        /* must be last entry */
        __ETHTOOL_LINK_MODE_MASK_NBITS
 };
index 65edfff1ca4bda0112d7e3e7755242e2369ed8fa..47700a2b9af962f387a7759af4092e2a6a04412a 100644 (file)
@@ -1,5 +1,3 @@
-/* SPDX-License-Identifier: MIT */
-
 #ifndef __LINUX_NL80211_H
 #define __LINUX_NL80211_H
 /*
@@ -13,7 +11,7 @@
  * Copyright 2008 Jouni Malinen <jouni.malinen@atheros.com>
  * Copyright 2008 Colin McCabe <colin@cozybit.com>
  * Copyright 2015-2017 Intel Deutschland GmbH
- * Copyright (C) 2018-2019 Intel Corporation
+ * Copyright (C) 2018-2020 Intel Corporation
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  *
  * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK flag drivers
  * can indicate they support offloading EAPOL handshakes for WPA/WPA2
- * preshared key authentication. In %NL80211_CMD_CONNECT the preshared
- * key should be specified using %NL80211_ATTR_PMK. Drivers supporting
- * this offload may reject the %NL80211_CMD_CONNECT when no preshared
- * key material is provided, for example when that driver does not
- * support setting the temporal keys through %CMD_NEW_KEY.
+ * preshared key authentication in station mode. In %NL80211_CMD_CONNECT
+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
+ * supporting this offload may reject the %NL80211_CMD_CONNECT when no
+ * preshared key material is provided, for example when that driver does
+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
  *
  * Similarly @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_1X flag can be
  * set by drivers indicating offload support of the PTK/GTK EAPOL
- * handshakes during 802.1X authentication. In order to use the offload
- * the %NL80211_CMD_CONNECT should have %NL80211_ATTR_WANT_1X_4WAY_HS
- * attribute flag. Drivers supporting this offload may reject the
- * %NL80211_CMD_CONNECT when the attribute flag is not present.
+ * handshakes during 802.1X authentication in station mode. In order to
+ * use the offload the %NL80211_CMD_CONNECT should have
+ * %NL80211_ATTR_WANT_1X_4WAY_HS attribute flag. Drivers supporting this
+ * offload may reject the %NL80211_CMD_CONNECT when the attribute flag is
+ * not present.
+ *
+ * By setting @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK flag drivers
+ * can indicate they support offloading EAPOL handshakes for WPA/WPA2
+ * preshared key authentication in AP mode. In %NL80211_CMD_START_AP
+ * the preshared key should be specified using %NL80211_ATTR_PMK. Drivers
+ * supporting this offload may reject the %NL80211_CMD_START_AP when no
+ * preshared key material is provided, for example when that driver does
+ * not support setting the temporal keys through %NL80211_CMD_NEW_KEY.
  *
  * For 802.1X the PMK or PMK-R0 are set by providing %NL80211_ATTR_PMK
  * using %NL80211_CMD_SET_PMK. For offloaded FT support also
  * DOC: SAE authentication offload
  *
  * By setting @NL80211_EXT_FEATURE_SAE_OFFLOAD flag drivers can indicate they
- * support offloading SAE authentication for WPA3-Personal networks. In
- * %NL80211_CMD_CONNECT the password for SAE should be specified using
- * %NL80211_ATTR_SAE_PASSWORD.
+ * support offloading SAE authentication for WPA3-Personal networks in station
+ * mode. Similarly @NL80211_EXT_FEATURE_SAE_OFFLOAD_AP flag can be set by
+ * drivers indicating the offload support in AP mode.
+ *
+ * The password for SAE should be specified using %NL80211_ATTR_SAE_PASSWORD in
+ * %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP for station and AP mode
+ * respectively.
+ */
+
+/**
+ * DOC: VLAN offload support for setting group keys and binding STAs to VLANs
+ *
+ * By setting @NL80211_EXT_FEATURE_VLAN_OFFLOAD flag drivers can indicate they
+ * support offloading VLAN functionality in a manner where the driver exposes a
+ * single netdev that uses VLAN tagged frames and separate VLAN-specific netdevs
+ * can then be added using RTM_NEWLINK/IFLA_VLAN_ID similarly to the Ethernet
+ * case. Frames received from stations that are not assigned to any VLAN are
+ * delivered on the main netdev and frames to such stations can be sent through
+ * that main netdev.
+ *
+ * %NL80211_CMD_NEW_KEY (for group keys), %NL80211_CMD_NEW_STATION, and
+ * %NL80211_CMD_SET_STATION will optionally specify vlan_id using
+ * %NL80211_ATTR_VLAN_ID.
+ */
+
+/**
+ * DOC: TID configuration
+ *
+ * TID config support can be checked in the %NL80211_ATTR_TID_CONFIG
+ * attribute given in wiphy capabilities.
+ *
+ * The necessary configuration parameters are mentioned in
+ * &enum nl80211_tid_config_attr and it will be passed to the
+ * %NL80211_CMD_SET_TID_CONFIG command in %NL80211_ATTR_TID_CONFIG.
+ *
+ * If the configuration needs to be applied for specific peer then the MAC
+ * address of the peer needs to be passed in %NL80211_ATTR_MAC, otherwise the
+ * configuration will be applied for all the connected peers in the vif except
+ * any peers that have peer specific configuration for the TID by default; if
+ * the %NL80211_TID_CONFIG_ATTR_OVERRIDE flag is set, peer specific values
+ * will be overwritten.
+ *
+ * All this configuration is valid only for STA's current connection
+ * i.e. the configuration will be reset to default when the STA connects back
+ * after disconnection/roaming, and this configuration will be cleared when
+ * the interface goes down.
  */
 
 /**
  *     to get a list of all present wiphys.
  * @NL80211_CMD_SET_WIPHY: set wiphy parameters, needs %NL80211_ATTR_WIPHY or
  *     %NL80211_ATTR_IFINDEX; can be used to set %NL80211_ATTR_WIPHY_NAME,
- *     %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ (and the
- *     attributes determining the channel width; this is used for setting
- *     monitor mode channel),  %NL80211_ATTR_WIPHY_RETRY_SHORT,
- *     %NL80211_ATTR_WIPHY_RETRY_LONG, %NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
- *     and/or %NL80211_ATTR_WIPHY_RTS_THRESHOLD.
- *     However, for setting the channel, see %NL80211_CMD_SET_CHANNEL
- *     instead, the support here is for backward compatibility only.
+ *     %NL80211_ATTR_WIPHY_TXQ_PARAMS, %NL80211_ATTR_WIPHY_FREQ,
+ *     %NL80211_ATTR_WIPHY_FREQ_OFFSET (and the attributes determining the
+ *     channel width; this is used for setting monitor mode channel),
+ *     %NL80211_ATTR_WIPHY_RETRY_SHORT, %NL80211_ATTR_WIPHY_RETRY_LONG,
+ *     %NL80211_ATTR_WIPHY_FRAG_THRESHOLD, and/or
+ *     %NL80211_ATTR_WIPHY_RTS_THRESHOLD.  However, for setting the channel,
+ *     see %NL80211_CMD_SET_CHANNEL instead, the support here is for backward
+ *     compatibility only.
  * @NL80211_CMD_NEW_WIPHY: Newly created wiphy, response to get request
  *     or rename notification. Has attributes %NL80211_ATTR_WIPHY and
  *     %NL80211_ATTR_WIPHY_NAME.
  *     %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_INACTIVITY_TIMEOUT,
  *     %NL80211_ATTR_ACL_POLICY and %NL80211_ATTR_MAC_ADDRS.
  *     The channel to use can be set on the interface or be given using the
- *     %NL80211_ATTR_WIPHY_FREQ and the attributes determining channel width.
+ *     %NL80211_ATTR_WIPHY_FREQ and %NL80211_ATTR_WIPHY_FREQ_OFFSET, and the
+ *     attributes determining channel width.
  * @NL80211_CMD_NEW_BEACON: old alias for %NL80211_CMD_START_AP
  * @NL80211_CMD_STOP_AP: Stop AP operation on the given interface
  * @NL80211_CMD_DEL_BEACON: old alias for %NL80211_CMD_STOP_AP
  * @NL80211_CMD_SET_STATION: Set station attributes for station identified by
  *     %NL80211_ATTR_MAC on the interface identified by %NL80211_ATTR_IFINDEX.
  * @NL80211_CMD_NEW_STATION: Add a station with given attributes to the
- *     the interface identified by %NL80211_ATTR_IFINDEX.
+ *     interface identified by %NL80211_ATTR_IFINDEX.
  * @NL80211_CMD_DEL_STATION: Remove a station identified by %NL80211_ATTR_MAC
  *     or, if no MAC address given, all stations, on the interface identified
  *     by %NL80211_ATTR_IFINDEX. %NL80211_ATTR_MGMT_SUBTYPE and
  * @NL80211_CMD_DEL_MPATH: Delete a mesh path to the destination given by
  *     %NL80211_ATTR_MAC.
  * @NL80211_CMD_NEW_PATH: Add a mesh path with given attributes to the
- *     the interface identified by %NL80211_ATTR_IFINDEX.
+ *     interface identified by %NL80211_ATTR_IFINDEX.
  * @NL80211_CMD_DEL_PATH: Remove a mesh path identified by %NL80211_ATTR_MAC
  *     or, if no MAC address given, all mesh paths, on the interface identified
  *     by %NL80211_ATTR_IFINDEX.
  *     interface. %NL80211_ATTR_MAC is used to specify PeerSTAAddress (and
  *     BSSID in case of station mode). %NL80211_ATTR_SSID is used to specify
  *     the SSID (mainly for association, but is included in authentication
- *     request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ is used
- *     to specify the frequence of the channel in MHz. %NL80211_ATTR_AUTH_TYPE
- *     is used to specify the authentication type. %NL80211_ATTR_IE is used to
- *     define IEs (VendorSpecificInfo, but also including RSN IE and FT IEs)
- *     to be added to the frame.
+ *     request, too, to help BSS selection. %NL80211_ATTR_WIPHY_FREQ +
+ *     %NL80211_ATTR_WIPHY_FREQ_OFFSET is used to specify the frequence of the
+ *     channel in MHz. %NL80211_ATTR_AUTH_TYPE is used to specify the
+ *     authentication type. %NL80211_ATTR_IE is used to define IEs
+ *     (VendorSpecificInfo, but also including RSN IE and FT IEs) to be added
+ *     to the frame.
  *     When used as an event, this reports reception of an Authentication
  *     frame in station and IBSS modes when the local MLME processed the
  *     frame, i.e., it was for the local STA and was received in correct
  *     requests to connect to a specified network but without separating
  *     auth and assoc steps. For this, you need to specify the SSID in a
  *     %NL80211_ATTR_SSID attribute, and can optionally specify the association
- *     IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE, %NL80211_ATTR_USE_MFP,
- *     %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ, %NL80211_ATTR_CONTROL_PORT,
+ *     IEs in %NL80211_ATTR_IE, %NL80211_ATTR_AUTH_TYPE,
+ *     %NL80211_ATTR_USE_MFP, %NL80211_ATTR_MAC, %NL80211_ATTR_WIPHY_FREQ,
+ *     %NL80211_ATTR_WIPHY_FREQ_OFFSET, %NL80211_ATTR_CONTROL_PORT,
  *     %NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
  *     %NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,
  *     %NL80211_ATTR_CONTROL_PORT_OVER_NL80211, %NL80211_ATTR_MAC_HINT, and
  *     set of BSSID,frequency parameters is used (i.e., either the enforcing
  *     %NL80211_ATTR_MAC,%NL80211_ATTR_WIPHY_FREQ or the less strict
  *     %NL80211_ATTR_MAC_HINT and %NL80211_ATTR_WIPHY_FREQ_HINT).
+ *     Driver shall not modify the IEs specified through %NL80211_ATTR_IE if
+ *     %NL80211_ATTR_MAC is included. However, if %NL80211_ATTR_MAC_HINT is
+ *     included, these IEs through %NL80211_ATTR_IE are specified by the user
+ *     space based on the best possible BSS selected. Thus, if the driver ends
+ *     up selecting a different BSS, it can modify these IEs accordingly (e.g.
+ *     userspace asks the driver to perform PMKSA caching with BSS1 and the
+ *     driver ends up selecting BSS2 with different PMKSA cache entry; RSNIE
+ *     has to get updated with the apt PMKID).
  *     %NL80211_ATTR_PREV_BSSID can be used to request a reassociation within
  *     the ESS in case the device is already associated and an association with
  *     a different BSS is desired.
  *     authentication/association or not receiving a response from the AP.
  *     Non-zero %NL80211_ATTR_STATUS_CODE value is indicated in that case as
  *     well to remain backwards compatible.
- *     When establishing a security association, drivers that support 4 way
- *     handshake offload should send %NL80211_CMD_PORT_AUTHORIZED event when
- *     the 4 way handshake is completed successfully.
  * @NL80211_CMD_ROAM: Notification indicating the card/driver roamed by itself.
- *     When a security association was established with the new AP (e.g. if
- *     the FT protocol was used for roaming or the driver completed the 4 way
- *     handshake), this event should be followed by an
+ *     When a security association was established on an 802.1X network using
+ *     fast transition, this event should be followed by an
  *     %NL80211_CMD_PORT_AUTHORIZED event.
  * @NL80211_CMD_DISCONNECT: drop a given connection; also used to notify
  *     userspace that a connection was dropped by the AP or due to other
  *     four bytes for vendor frames including the OUI. The registration
  *     cannot be dropped, but is removed automatically when the netlink
  *     socket is closed. Multiple registrations can be made.
+ *     The %NL80211_ATTR_RECEIVE_MULTICAST flag attribute can be given if
+ *     %NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS is available, in which
+ *     case the registration can also be modified to include/exclude the
+ *     flag, rather than requiring unregistration to change it.
  * @NL80211_CMD_REGISTER_ACTION: Alias for @NL80211_CMD_REGISTER_FRAME for
  *     backward compatibility
  * @NL80211_CMD_FRAME: Management frame TX request and RX notification. This
  *     various triggers. These triggers can be configured through this
  *     command with the %NL80211_ATTR_WOWLAN_TRIGGERS attribute. For
  *     more background information, see
- *     http://wireless.kernel.org/en/users/Documentation/WoWLAN.
+ *     https://wireless.wiki.kernel.org/en/users/Documentation/WoWLAN.
  *     The @NL80211_CMD_SET_WOWLAN command can also be used as a notification
  *     from the driver reporting the wakeup reason. In this case, the
  *     @NL80211_ATTR_WOWLAN_TRIGGERS attribute will contain the reason
  * @NL80211_CMD_SET_COALESCE: Configure coalesce rules or clear existing rules.
  *
  * @NL80211_CMD_CHANNEL_SWITCH: Perform a channel switch by announcing the
- *     the new channel information (Channel Switch Announcement - CSA)
+ *     new channel information (Channel Switch Announcement - CSA)
  *     in the beacon for some time (as defined in the
  *     %NL80211_ATTR_CH_SWITCH_COUNT parameter) and then change to the
  *     new channel. Userspace provides the new channel information (using
  * @NL80211_CMD_DEL_PMK: For offloaded 4-Way handshake, delete the previously
  *     configured PMK for the authenticator address identified by
  *     %NL80211_ATTR_MAC.
- * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates that the 4 way
- *     handshake was completed successfully by the driver. The BSSID is
- *     specified with %NL80211_ATTR_MAC. Drivers that support 4 way handshake
- *     offload should send this event after indicating 802.11 association with
- *     %NL80211_CMD_CONNECT or %NL80211_CMD_ROAM. If the 4 way handshake failed
- *     %NL80211_CMD_DISCONNECT should be indicated instead.
- *
+ * @NL80211_CMD_PORT_AUTHORIZED: An event that indicates an 802.1X FT roam was
+ *     completed successfully. Drivers that support 4 way handshake offload
+ *     should send this event after indicating 802.1X FT assocation with
+ *     %NL80211_CMD_ROAM. If the 4 way handshake failed %NL80211_CMD_DISCONNECT
+ *     should be indicated instead.
  * @NL80211_CMD_CONTROL_PORT_FRAME: Control Port (e.g. PAE) frame TX request
  *     and RX notification.  This command is used both as a request to transmit
  *     a control port frame and as a notification that a control port frame
  *     randomization may be enabled and configured by specifying the
  *     %NL80211_ATTR_MAC and %NL80211_ATTR_MAC_MASK attributes.
  *     If a timeout is requested, use the %NL80211_ATTR_TIMEOUT attribute.
- *     A u64 cookie for further %NL80211_ATTR_COOKIE use is is returned in
+ *     A u64 cookie for further %NL80211_ATTR_COOKIE use is returned in
  *     the netlink extended ack message.
  *
  *     To cancel a measurement, close the socket that requested it.
  *     peer MAC address and %NL80211_ATTR_FRAME is used to specify the frame
  *     content. The frame is ethernet data.
  *
+ * @NL80211_CMD_SET_TID_CONFIG: Data frame TID specific configuration
+ *     is passed using %NL80211_ATTR_TID_CONFIG attribute.
+ *
+ * @NL80211_CMD_UNPROT_BEACON: Unprotected or incorrectly protected Beacon
+ *     frame. This event is used to indicate that a received Beacon frame was
+ *     dropped because it did not include a valid MME MIC while beacon
+ *     protection was enabled (BIGTK configured in station mode).
+ *
+ * @NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS: Report TX status of a control
+ *     port frame transmitted with %NL80211_CMD_CONTROL_PORT_FRAME.
+ *     %NL80211_ATTR_COOKIE identifies the TX command and %NL80211_ATTR_FRAME
+ *     includes the contents of the frame. %NL80211_ATTR_ACK flag is included
+ *     if the recipient acknowledged the frame.
+ *
  * @NL80211_CMD_MAX: highest used command number
  * @__NL80211_CMD_AFTER_LAST: internal use
  */
@@ -1327,6 +1401,12 @@ enum nl80211_commands {
 
        NL80211_CMD_PROBE_MESH_LINK,
 
+       NL80211_CMD_SET_TID_CONFIG,
+
+       NL80211_CMD_UNPROT_BEACON,
+
+       NL80211_CMD_CONTROL_PORT_FRAME_TX_STATUS,
+
        /* add new commands above here */
 
        /* used to define NL80211_CMD_MAX below */
@@ -1372,7 +1452,8 @@ enum nl80211_commands {
  *     of &enum nl80211_chan_width, describing the channel width. See the
  *     documentation of the enum for more information.
  * @NL80211_ATTR_CENTER_FREQ1: Center frequency of the first part of the
- *     channel, used for anything but 20 MHz bandwidth
+ *     channel, used for anything but 20 MHz bandwidth. In S1G this is the
+ *     operating channel center frequency.
  * @NL80211_ATTR_CENTER_FREQ2: Center frequency of the second part of the
  *     channel, used only for 80+80 MHz bandwidth
  * @NL80211_ATTR_WIPHY_CHANNEL_TYPE: included with NL80211_ATTR_WIPHY_FREQ
@@ -1582,7 +1663,8 @@ enum nl80211_commands {
  *     flag is included, then control port frames are sent over NL80211 instead
  *     using %CMD_CONTROL_PORT_FRAME.  If control port routing over NL80211 is
  *     to be used then userspace must also use the %NL80211_ATTR_SOCKET_OWNER
- *     flag.
+ *     flag. When used with %NL80211_ATTR_CONTROL_PORT_NO_PREAUTH, pre-auth
+ *     frames are not forwared over the control port.
  *
  * @NL80211_ATTR_TESTDATA: Testmode data blob, passed through to the driver.
  *     We recommend using nested, driver-specific attributes within this.
@@ -1998,10 +2080,10 @@ enum nl80211_commands {
  *     operation).
  * @NL80211_ATTR_CSA_IES: Nested set of attributes containing the IE information
  *     for the time while performing a channel switch.
- * @NL80211_ATTR_CSA_C_OFF_BEACON: An array of offsets (u16) to the channel
- *     switch counters in the beacons tail (%NL80211_ATTR_BEACON_TAIL).
- * @NL80211_ATTR_CSA_C_OFF_PRESP: An array of offsets (u16) to the channel
- *     switch counters in the probe response (%NL80211_ATTR_PROBE_RESP).
+ * @NL80211_ATTR_CNTDWN_OFFS_BEACON: An array of offsets (u16) to the channel
+ *     switch or color change counters in the beacons tail (%NL80211_ATTR_BEACON_TAIL).
+ * @NL80211_ATTR_CNTDWN_OFFS_PRESP: An array of offsets (u16) to the channel
+ *     switch or color change counters in the probe response (%NL80211_ATTR_PROBE_RESP).
  *
  * @NL80211_ATTR_RXMGMT_FLAGS: flags for nl80211_send_mgmt(), u32.
  *     As specified in the &enum nl80211_rxmgmt_flags.
@@ -2009,7 +2091,7 @@ enum nl80211_commands {
  * @NL80211_ATTR_STA_SUPPORTED_CHANNELS: array of supported channels.
  *
  * @NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES: array of supported
- *      supported operating classes.
+ *      operating classes.
  *
  * @NL80211_ATTR_HANDLE_DFS: A flag indicating whether user space
  *     controls DFS operation in IBSS mode. If the flag is included in
@@ -2287,10 +2369,11 @@ enum nl80211_commands {
  *
  * @NL80211_ATTR_PMK: attribute for passing PMK key material. Used with
  *     %NL80211_CMD_SET_PMKSA for the PMKSA identified by %NL80211_ATTR_PMKID.
- *     For %NL80211_CMD_CONNECT it is used to provide PSK for offloading 4-way
- *     handshake for WPA/WPA2-PSK networks. For 802.1X authentication it is
- *     used with %NL80211_CMD_SET_PMK. For offloaded FT support this attribute
- *     specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME is included as well.
+ *     For %NL80211_CMD_CONNECT and %NL80211_CMD_START_AP it is used to provide
+ *     PSK for offloading 4-way handshake for WPA/WPA2-PSK networks. For 802.1X
+ *     authentication it is used with %NL80211_CMD_SET_PMK. For offloaded FT
+ *     support this attribute specifies the PMK-R0 if NL80211_ATTR_PMKR0_NAME
+ *     is included as well.
  *
  * @NL80211_ATTR_SCHED_SCAN_MULTI: flag attribute which user-space shall use to
  *     indicate that it supports multiple active scheduled scan requests.
@@ -2320,7 +2403,7 @@ enum nl80211_commands {
  *      nl80211_txq_stats)
  * @NL80211_ATTR_TXQ_LIMIT: Total packet limit for the TXQ queues for this phy.
  *      The smaller of this and the memory limit is enforced.
- * @NL80211_ATTR_TXQ_MEMORY_LIMIT: Total memory memory limit (in bytes) for the
+ * @NL80211_ATTR_TXQ_MEMORY_LIMIT: Total memory limit (in bytes) for the
  *      TXQ queues for this phy. The smaller of this and the packet limit is
  *      enforced.
  * @NL80211_ATTR_TXQ_QUANTUM: TXQ scheduler quantum (bytes). Number of bytes
@@ -2375,6 +2458,75 @@ enum nl80211_commands {
  *     the allowed channel bandwidth configurations. (u8 attribute)
  *     Defined by IEEE P802.11ay/D4.0 section 9.4.2.251, Table 13.
  *
+ * @NL80211_ATTR_VLAN_ID: VLAN ID (1..4094) for the station and VLAN group key
+ *     (u16).
+ *
+ * @NL80211_ATTR_HE_BSS_COLOR: nested attribute for BSS Color Settings.
+ *
+ * @NL80211_ATTR_IFTYPE_AKM_SUITES: nested array attribute, with each entry
+ *     using attributes from &enum nl80211_iftype_akm_attributes. This
+ *     attribute is sent in a response to %NL80211_CMD_GET_WIPHY indicating
+ *     supported AKM suites capability per interface. AKMs advertised in
+ *     %NL80211_ATTR_AKM_SUITES are default capabilities if AKM suites not
+ *     advertised for a specific interface type.
+ *
+ * @NL80211_ATTR_TID_CONFIG: TID specific configuration in a
+ *     nested attribute with &enum nl80211_tid_config_attr sub-attributes;
+ *     on output (in wiphy attributes) it contains only the feature sub-
+ *     attributes.
+ *
+ * @NL80211_ATTR_CONTROL_PORT_NO_PREAUTH: disable preauth frame rx on control
+ *     port in order to forward/receive them as ordinary data frames.
+ *
+ * @NL80211_ATTR_PMK_LIFETIME: Maximum lifetime for PMKSA in seconds (u32,
+ *     dot11RSNAConfigPMKReauthThreshold; 0 is not a valid value).
+ *     An optional parameter configured through %NL80211_CMD_SET_PMKSA.
+ *     Drivers that trigger roaming need to know the lifetime of the
+ *     configured PMKSA for triggering the full vs. PMKSA caching based
+ *     authentication. This timeout helps authentication methods like SAE,
+ *     where PMK gets updated only by going through a full (new SAE)
+ *     authentication instead of getting updated during an association for EAP
+ *     authentication. No new full authentication within the PMK expiry shall
+ *     result in a disassociation at the end of the lifetime.
+ *
+ * @NL80211_ATTR_PMK_REAUTH_THRESHOLD: Reauthentication threshold time, in
+ *     terms of percentage of %NL80211_ATTR_PMK_LIFETIME
+ *     (u8, dot11RSNAConfigPMKReauthThreshold, 1..100). This is an optional
+ *     parameter configured through %NL80211_CMD_SET_PMKSA. Requests the
+ *     driver to trigger a full authentication roam (without PMKSA caching)
+ *     after the reauthentication threshold time, but before the PMK lifetime
+ *     has expired.
+ *
+ *     Authentication methods like SAE need to be able to generate a new PMKSA
+ *     entry without having to force a disconnection after the PMK timeout. If
+ *     no roaming occurs between the reauth threshold and PMK expiration,
+ *     disassociation is still forced.
+ * @NL80211_ATTR_RECEIVE_MULTICAST: multicast flag for the
+ *     %NL80211_CMD_REGISTER_FRAME command, see the description there.
+ * @NL80211_ATTR_WIPHY_FREQ_OFFSET: offset of the associated
+ *     %NL80211_ATTR_WIPHY_FREQ in positive KHz. Only valid when supplied with
+ *     an %NL80211_ATTR_WIPHY_FREQ_OFFSET.
+ * @NL80211_ATTR_CENTER_FREQ1_OFFSET: Center frequency offset in KHz for the
+ *     first channel segment specified in %NL80211_ATTR_CENTER_FREQ1.
+ * @NL80211_ATTR_SCAN_FREQ_KHZ: nested attribute with KHz frequencies
+ *
+ * @NL80211_ATTR_HE_6GHZ_CAPABILITY: HE 6 GHz Band Capability element (from
+ *     association request when used with NL80211_CMD_NEW_STATION).
+ *
+ * @NL80211_ATTR_FILS_DISCOVERY: Optional parameter to configure FILS
+ *     discovery. It is a nested attribute, see
+ *     &enum nl80211_fils_discovery_attributes.
+ *
+ * @NL80211_ATTR_UNSOL_BCAST_PROBE_RESP: Optional parameter to configure
+ *     unsolicited broadcast probe response. It is a nested attribute, see
+ *     &enum nl80211_unsol_bcast_probe_resp_attributes.
+ *
+ * @NL80211_ATTR_S1G_CAPABILITY: S1G Capability information element (from
+ *     association request when used with NL80211_CMD_NEW_STATION)
+ * @NL80211_ATTR_S1G_CAPABILITY_MASK: S1G Capability Information element
+ *     override mask. Used with NL80211_ATTR_S1G_CAPABILITY in
+ *     NL80211_CMD_ASSOCIATE or NL80211_CMD_CONNECT.
+ *
  * @NUM_NL80211_ATTR: total number of nl80211_attrs available
  * @NL80211_ATTR_MAX: highest attribute number currently defined
  * @__NL80211_ATTR_AFTER_LAST: internal use
@@ -2681,8 +2833,8 @@ enum nl80211_attrs {
        NL80211_ATTR_CH_SWITCH_COUNT,
        NL80211_ATTR_CH_SWITCH_BLOCK_TX,
        NL80211_ATTR_CSA_IES,
-       NL80211_ATTR_CSA_C_OFF_BEACON,
-       NL80211_ATTR_CSA_C_OFF_PRESP,
+       NL80211_ATTR_CNTDWN_OFFS_BEACON,
+       NL80211_ATTR_CNTDWN_OFFS_PRESP,
 
        NL80211_ATTR_RXMGMT_FLAGS,
 
@@ -2837,6 +2989,33 @@ enum nl80211_attrs {
        NL80211_ATTR_WIPHY_EDMG_CHANNELS,
        NL80211_ATTR_WIPHY_EDMG_BW_CONFIG,
 
+       NL80211_ATTR_VLAN_ID,
+
+       NL80211_ATTR_HE_BSS_COLOR,
+
+       NL80211_ATTR_IFTYPE_AKM_SUITES,
+
+       NL80211_ATTR_TID_CONFIG,
+
+       NL80211_ATTR_CONTROL_PORT_NO_PREAUTH,
+
+       NL80211_ATTR_PMK_LIFETIME,
+       NL80211_ATTR_PMK_REAUTH_THRESHOLD,
+
+       NL80211_ATTR_RECEIVE_MULTICAST,
+       NL80211_ATTR_WIPHY_FREQ_OFFSET,
+       NL80211_ATTR_CENTER_FREQ1_OFFSET,
+       NL80211_ATTR_SCAN_FREQ_KHZ,
+
+       NL80211_ATTR_HE_6GHZ_CAPABILITY,
+
+       NL80211_ATTR_FILS_DISCOVERY,
+
+       NL80211_ATTR_UNSOL_BCAST_PROBE_RESP,
+
+       NL80211_ATTR_S1G_CAPABILITY,
+       NL80211_ATTR_S1G_CAPABILITY_MASK,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
@@ -2849,6 +3028,8 @@ enum nl80211_attrs {
 #define        NL80211_ATTR_MESH_PARAMS NL80211_ATTR_MESH_CONFIG
 #define NL80211_ATTR_IFACE_SOCKET_OWNER NL80211_ATTR_SOCKET_OWNER
 #define NL80211_ATTR_SAE_DATA NL80211_ATTR_AUTH_DATA
+#define NL80211_ATTR_CSA_C_OFF_BEACON NL80211_ATTR_CNTDWN_OFFS_BEACON
+#define NL80211_ATTR_CSA_C_OFF_PRESP NL80211_ATTR_CNTDWN_OFFS_PRESP
 
 /*
  * Allow user space programs to use #ifdef on new attributes by defining them
@@ -3026,6 +3207,18 @@ enum nl80211_he_gi {
        NL80211_RATE_INFO_HE_GI_3_2,
 };
 
+/**
+ * enum nl80211_he_ltf - HE long training field
+ * @NL80211_RATE_INFO_HE_1xLTF: 3.2 usec
+ * @NL80211_RATE_INFO_HE_2xLTF: 6.4 usec
+ * @NL80211_RATE_INFO_HE_4xLTF: 12.8 usec
+ */
+enum nl80211_he_ltf {
+       NL80211_RATE_INFO_HE_1XLTF,
+       NL80211_RATE_INFO_HE_2XLTF,
+       NL80211_RATE_INFO_HE_4XLTF,
+};
+
 /**
  * enum nl80211_he_ru_alloc - HE RU allocation values
  * @NL80211_RATE_INFO_HE_RU_ALLOC_26: 26-tone RU allocation
@@ -3220,6 +3413,8 @@ enum nl80211_sta_bss_param {
  * @NL80211_STA_INFO_AIRTIME_LINK_METRIC: airtime link metric for mesh station
  * @NL80211_STA_INFO_ASSOC_AT_BOOTTIME: Timestamp (CLOCK_BOOTTIME, nanoseconds)
  *     of STA's association
+ * @NL80211_STA_INFO_CONNECTED_TO_AS: set to true if STA has a path to a
+ *     authentication server (u8, 0 or 1)
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -3267,6 +3462,7 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_AIRTIME_WEIGHT,
        NL80211_STA_INFO_AIRTIME_LINK_METRIC,
        NL80211_STA_INFO_ASSOC_AT_BOOTTIME,
+       NL80211_STA_INFO_CONNECTED_TO_AS,
 
        /* keep last */
        __NL80211_STA_INFO_AFTER_LAST,
@@ -3415,6 +3611,8 @@ enum nl80211_mpath_info {
  *     defined in HE capabilities IE
  * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
  *     defined
+ * @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
+ *     given for all 6 GHz band channels
  * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
  */
 enum nl80211_band_iftype_attr {
@@ -3425,6 +3623,7 @@ enum nl80211_band_iftype_attr {
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
        NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
+       NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
 
        /* keep last */
        __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
@@ -3556,6 +3755,19 @@ enum nl80211_wmm_rule {
  * @NL80211_FREQUENCY_ATTR_WMM: this channel has wmm limitations.
  *     This is a nested attribute that contains the wmm limitation per AC.
  *     (see &enum nl80211_wmm_rule)
+ * @NL80211_FREQUENCY_ATTR_NO_HE: HE operation is not allowed on this channel
+ *     in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_OFFSET: frequency offset in KHz
+ * @NL80211_FREQUENCY_ATTR_1MHZ: 1 MHz operation is allowed
+ *     on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_2MHZ: 2 MHz operation is allowed
+ *     on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_4MHZ: 4 MHz operation is allowed
+ *     on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_8MHZ: 8 MHz operation is allowed
+ *     on this channel in current regulatory domain.
+ * @NL80211_FREQUENCY_ATTR_16MHZ: 16 MHz operation is allowed
+ *     on this channel in current regulatory domain.
  * @NL80211_FREQUENCY_ATTR_MAX: highest frequency attribute number
  *     currently defined
  * @__NL80211_FREQUENCY_ATTR_AFTER_LAST: internal use
@@ -3585,6 +3797,13 @@ enum nl80211_frequency_attr {
        NL80211_FREQUENCY_ATTR_NO_20MHZ,
        NL80211_FREQUENCY_ATTR_NO_10MHZ,
        NL80211_FREQUENCY_ATTR_WMM,
+       NL80211_FREQUENCY_ATTR_NO_HE,
+       NL80211_FREQUENCY_ATTR_OFFSET,
+       NL80211_FREQUENCY_ATTR_1MHZ,
+       NL80211_FREQUENCY_ATTR_2MHZ,
+       NL80211_FREQUENCY_ATTR_4MHZ,
+       NL80211_FREQUENCY_ATTR_8MHZ,
+       NL80211_FREQUENCY_ATTR_16MHZ,
 
        /* keep last */
        __NL80211_FREQUENCY_ATTR_AFTER_LAST,
@@ -3782,6 +4001,7 @@ enum nl80211_sched_scan_match_attr {
  * @NL80211_RRF_NO_HT40PLUS: channels can't be used in HT40+ operation
  * @NL80211_RRF_NO_80MHZ: 80MHz operation not allowed
  * @NL80211_RRF_NO_160MHZ: 160MHz operation not allowed
+ * @NL80211_RRF_NO_HE: HE operation not allowed
  */
 enum nl80211_reg_rule_flags {
        NL80211_RRF_NO_OFDM             = 1<<0,
@@ -3799,6 +4019,7 @@ enum nl80211_reg_rule_flags {
        NL80211_RRF_NO_HT40PLUS         = 1<<14,
        NL80211_RRF_NO_80MHZ            = 1<<15,
        NL80211_RRF_NO_160MHZ           = 1<<16,
+       NL80211_RRF_NO_HE               = 1<<17,
 };
 
 #define NL80211_RRF_PASSIVE_SCAN       NL80211_RRF_NO_IR
@@ -3876,6 +4097,7 @@ enum nl80211_user_reg_hint_type {
  *     receiving frames destined to the local BSS
  * @NL80211_SURVEY_INFO_MAX: highest survey info attribute number
  *     currently defined
+ * @NL80211_SURVEY_INFO_FREQUENCY_OFFSET: center frequency offset in KHz
  * @__NL80211_SURVEY_INFO_AFTER_LAST: internal use
  */
 enum nl80211_survey_info {
@@ -3891,6 +4113,7 @@ enum nl80211_survey_info {
        NL80211_SURVEY_INFO_TIME_SCAN,
        NL80211_SURVEY_INFO_PAD,
        NL80211_SURVEY_INFO_TIME_BSS_RX,
+       NL80211_SURVEY_INFO_FREQUENCY_OFFSET,
 
        /* keep last */
        __NL80211_SURVEY_INFO_AFTER_LAST,
@@ -4076,6 +4299,16 @@ enum nl80211_mesh_power_mode {
  *     field.  If left unset then the mesh formation field will only
  *     advertise such if there is an active root mesh path.
  *
+ * @NL80211_MESHCONF_NOLEARN: Try to avoid multi-hop path discovery (e.g.
+ *      PREQ/PREP for HWMP) if the destination is a direct neighbor. Note that
+ *      this might not be the optimal decision as a multi-hop route might be
+ *      better. So if using this setting you will likely also want to disable
+ *      dot11MeshForwarding and use another mesh routing protocol on top.
+ *
+ * @NL80211_MESHCONF_CONNECTED_TO_AS: If set to true then this mesh STA
+ *     will advertise that it is connected to a authentication server
+ *     in the mesh formation field.
+ *
  * @__NL80211_MESHCONF_ATTR_AFTER_LAST: internal use
  */
 enum nl80211_meshconf_params {
@@ -4109,6 +4342,8 @@ enum nl80211_meshconf_params {
        NL80211_MESHCONF_AWAKE_WINDOW,
        NL80211_MESHCONF_PLINK_TIMEOUT,
        NL80211_MESHCONF_CONNECTED_TO_GATE,
+       NL80211_MESHCONF_NOLEARN,
+       NL80211_MESHCONF_CONNECTED_TO_AS,
 
        /* keep last */
        __NL80211_MESHCONF_ATTR_AFTER_LAST,
@@ -4277,6 +4512,11 @@ enum nl80211_key_mode {
  *     attribute must be provided as well
  * @NL80211_CHAN_WIDTH_5: 5 MHz OFDM channel
  * @NL80211_CHAN_WIDTH_10: 10 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_1: 1 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_2: 2 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_4: 4 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_8: 8 MHz OFDM channel
+ * @NL80211_CHAN_WIDTH_16: 16 MHz OFDM channel
  */
 enum nl80211_chan_width {
        NL80211_CHAN_WIDTH_20_NOHT,
@@ -4287,6 +4527,11 @@ enum nl80211_chan_width {
        NL80211_CHAN_WIDTH_160,
        NL80211_CHAN_WIDTH_5,
        NL80211_CHAN_WIDTH_10,
+       NL80211_CHAN_WIDTH_1,
+       NL80211_CHAN_WIDTH_2,
+       NL80211_CHAN_WIDTH_4,
+       NL80211_CHAN_WIDTH_8,
+       NL80211_CHAN_WIDTH_16,
 };
 
 /**
@@ -4297,11 +4542,15 @@ enum nl80211_chan_width {
  * @NL80211_BSS_CHAN_WIDTH_20: control channel is 20 MHz wide or compatible
  * @NL80211_BSS_CHAN_WIDTH_10: control channel is 10 MHz wide
  * @NL80211_BSS_CHAN_WIDTH_5: control channel is 5 MHz wide
+ * @NL80211_BSS_CHAN_WIDTH_1: control channel is 1 MHz wide
+ * @NL80211_BSS_CHAN_WIDTH_2: control channel is 2 MHz wide
  */
 enum nl80211_bss_scan_width {
        NL80211_BSS_CHAN_WIDTH_20,
        NL80211_BSS_CHAN_WIDTH_10,
        NL80211_BSS_CHAN_WIDTH_5,
+       NL80211_BSS_CHAN_WIDTH_1,
+       NL80211_BSS_CHAN_WIDTH_2,
 };
 
 /**
@@ -4353,6 +4602,7 @@ enum nl80211_bss_scan_width {
  * @NL80211_BSS_CHAIN_SIGNAL: per-chain signal strength of last BSS update.
  *     Contains a nested array of signal strength attributes (u8, dBm),
  *     using the nesting index as the antenna number.
+ * @NL80211_BSS_FREQUENCY_OFFSET: frequency offset in KHz
  * @__NL80211_BSS_AFTER_LAST: internal
  * @NL80211_BSS_MAX: highest BSS attribute
  */
@@ -4377,6 +4627,7 @@ enum nl80211_bss {
        NL80211_BSS_PARENT_TSF,
        NL80211_BSS_PARENT_BSSID,
        NL80211_BSS_CHAIN_SIGNAL,
+       NL80211_BSS_FREQUENCY_OFFSET,
 
        /* keep last */
        __NL80211_BSS_AFTER_LAST,
@@ -4505,6 +4756,7 @@ enum nl80211_key_default_types {
  *     See &enum nl80211_key_default_types.
  * @NL80211_KEY_MODE: the mode from enum nl80211_key_mode.
  *     Defaults to @NL80211_KEY_RX_TX.
+ * @NL80211_KEY_DEFAULT_BEACON: flag indicating default Beacon frame key
  *
  * @__NL80211_KEY_AFTER_LAST: internal
  * @NL80211_KEY_MAX: highest key attribute
@@ -4520,6 +4772,7 @@ enum nl80211_key_attributes {
        NL80211_KEY_TYPE,
        NL80211_KEY_DEFAULT_TYPES,
        NL80211_KEY_MODE,
+       NL80211_KEY_DEFAULT_BEACON,
 
        /* keep last */
        __NL80211_KEY_AFTER_LAST,
@@ -4538,6 +4791,10 @@ enum nl80211_key_attributes {
  * @NL80211_TXRATE_VHT: VHT rates allowed for TX rate selection,
  *     see &struct nl80211_txrate_vht
  * @NL80211_TXRATE_GI: configure GI, see &enum nl80211_txrate_gi
+ * @NL80211_TXRATE_HE: HE rates allowed for TX rate selection,
+ *     see &struct nl80211_txrate_he
+ * @NL80211_TXRATE_HE_GI: configure HE GI, 0.8us, 1.6us and 3.2us.
+ * @NL80211_TXRATE_HE_LTF: configure HE LTF, 1XLTF, 2XLTF and 4XLTF.
  * @__NL80211_TXRATE_AFTER_LAST: internal
  * @NL80211_TXRATE_MAX: highest TX rate attribute
  */
@@ -4547,6 +4804,9 @@ enum nl80211_tx_rate_attributes {
        NL80211_TXRATE_HT,
        NL80211_TXRATE_VHT,
        NL80211_TXRATE_GI,
+       NL80211_TXRATE_HE,
+       NL80211_TXRATE_HE_GI,
+       NL80211_TXRATE_HE_LTF,
 
        /* keep last */
        __NL80211_TXRATE_AFTER_LAST,
@@ -4564,6 +4824,15 @@ struct nl80211_txrate_vht {
        __u16 mcs[NL80211_VHT_NSS_MAX];
 };
 
+#define NL80211_HE_NSS_MAX             8
+/**
+ * struct nl80211_txrate_he - HE MCS/NSS txrate bitmap
+ * @mcs: MCS bitmap table for each NSS (array index 0 for 1 stream, etc.)
+ */
+struct nl80211_txrate_he {
+       __u16 mcs[NL80211_HE_NSS_MAX];
+};
+
 enum nl80211_txrate_gi {
        NL80211_TXRATE_DEFAULT_GI,
        NL80211_TXRATE_FORCE_SGI,
@@ -4576,6 +4845,7 @@ enum nl80211_txrate_gi {
  * @NL80211_BAND_5GHZ: around 5 GHz band (4.9 - 5.7 GHz)
  * @NL80211_BAND_60GHZ: around 60 GHz band (58.32 - 69.12 GHz)
  * @NL80211_BAND_6GHZ: around 6 GHz band (5.9 - 7.2 GHz)
+ * @NL80211_BAND_S1GHZ: around 900MHz, supported by S1G PHYs
  * @NUM_NL80211_BANDS: number of bands, avoid using this in userspace
  *     since newer kernel versions may support more bands
  */
@@ -4584,6 +4854,7 @@ enum nl80211_band {
        NL80211_BAND_5GHZ,
        NL80211_BAND_60GHZ,
        NL80211_BAND_6GHZ,
+       NL80211_BAND_S1GHZ,
 
        NUM_NL80211_BANDS,
 };
@@ -4675,6 +4946,92 @@ enum nl80211_tx_power_setting {
        NL80211_TX_POWER_FIXED,
 };
 
+/**
+ * enum nl80211_tid_config - TID config state
+ * @NL80211_TID_CONFIG_ENABLE: Enable config for the TID
+ * @NL80211_TID_CONFIG_DISABLE: Disable config for the TID
+ */
+enum nl80211_tid_config {
+       NL80211_TID_CONFIG_ENABLE,
+       NL80211_TID_CONFIG_DISABLE,
+};
+
+/* enum nl80211_tx_rate_setting - TX rate configuration type
+ * @NL80211_TX_RATE_AUTOMATIC: automatically determine TX rate
+ * @NL80211_TX_RATE_LIMITED: limit the TX rate by the TX rate parameter
+ * @NL80211_TX_RATE_FIXED: fix TX rate to the TX rate parameter
+ */
+enum nl80211_tx_rate_setting {
+       NL80211_TX_RATE_AUTOMATIC,
+       NL80211_TX_RATE_LIMITED,
+       NL80211_TX_RATE_FIXED,
+};
+
+/* enum nl80211_tid_config_attr - TID specific configuration.
+ * @NL80211_TID_CONFIG_ATTR_PAD: pad attribute for 64-bit values
+ * @NL80211_TID_CONFIG_ATTR_VIF_SUPP: a bitmap (u64) of attributes supported
+ *     for per-vif configuration; doesn't list the ones that are generic
+ *     (%NL80211_TID_CONFIG_ATTR_TIDS, %NL80211_TID_CONFIG_ATTR_OVERRIDE).
+ * @NL80211_TID_CONFIG_ATTR_PEER_SUPP: same as the previous per-vif one, but
+ *     per peer instead.
+ * @NL80211_TID_CONFIG_ATTR_OVERRIDE: flag attribue, if set indicates
+ *     that the new configuration overrides all previous peer
+ *     configurations, otherwise previous peer specific configurations
+ *     should be left untouched.
+ * @NL80211_TID_CONFIG_ATTR_TIDS: a bitmask value of TIDs (bit 0 to 7)
+ *     Its type is u16.
+ * @NL80211_TID_CONFIG_ATTR_NOACK: Configure ack policy for the TID.
+ *     specified in %NL80211_TID_CONFIG_ATTR_TID. see %enum nl80211_tid_config.
+ *     Its type is u8.
+ * @NL80211_TID_CONFIG_ATTR_RETRY_SHORT: Number of retries used with data frame
+ *     transmission, user-space sets this configuration in
+ *     &NL80211_CMD_SET_TID_CONFIG. It is u8 type, min value is 1 and
+ *     the max value is advertised by the driver in this attribute on
+ *     output in wiphy capabilities.
+ * @NL80211_TID_CONFIG_ATTR_RETRY_LONG: Number of retries used with data frame
+ *     transmission, user-space sets this configuration in
+ *     &NL80211_CMD_SET_TID_CONFIG. Its type is u8, min value is 1 and
+ *     the max value is advertised by the driver in this attribute on
+ *     output in wiphy capabilities.
+ * @NL80211_TID_CONFIG_ATTR_AMPDU_CTRL: Enable/Disable MPDU aggregation
+ *     for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS.
+ *     Its type is u8, using the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL: Enable/Disable RTS_CTS for the TIDs
+ *     specified in %NL80211_TID_CONFIG_ATTR_TIDS. It is u8 type, using
+ *     the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_AMSDU_CTRL: Enable/Disable MSDU aggregation
+ *     for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS.
+ *     Its type is u8, using the values from &nl80211_tid_config.
+ * @NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE: This attribute will be useful
+ *     to notfiy the driver that what type of txrate should be used
+ *     for the TIDs specified in %NL80211_TID_CONFIG_ATTR_TIDS. using
+ *     the values form &nl80211_tx_rate_setting.
+ * @NL80211_TID_CONFIG_ATTR_TX_RATE: Data frame TX rate mask should be applied
+ *     with the parameters passed through %NL80211_ATTR_TX_RATES.
+ *     configuration is applied to the data frame for the tid to that connected
+ *     station.
+ */
+enum nl80211_tid_config_attr {
+       __NL80211_TID_CONFIG_ATTR_INVALID,
+       NL80211_TID_CONFIG_ATTR_PAD,
+       NL80211_TID_CONFIG_ATTR_VIF_SUPP,
+       NL80211_TID_CONFIG_ATTR_PEER_SUPP,
+       NL80211_TID_CONFIG_ATTR_OVERRIDE,
+       NL80211_TID_CONFIG_ATTR_TIDS,
+       NL80211_TID_CONFIG_ATTR_NOACK,
+       NL80211_TID_CONFIG_ATTR_RETRY_SHORT,
+       NL80211_TID_CONFIG_ATTR_RETRY_LONG,
+       NL80211_TID_CONFIG_ATTR_AMPDU_CTRL,
+       NL80211_TID_CONFIG_ATTR_RTSCTS_CTRL,
+       NL80211_TID_CONFIG_ATTR_AMSDU_CTRL,
+       NL80211_TID_CONFIG_ATTR_TX_RATE_TYPE,
+       NL80211_TID_CONFIG_ATTR_TX_RATE,
+
+       /* keep last */
+       __NL80211_TID_CONFIG_ATTR_AFTER_LAST,
+       NL80211_TID_CONFIG_ATTR_MAX = __NL80211_TID_CONFIG_ATTR_AFTER_LAST - 1
+};
+
 /**
  * enum nl80211_packet_pattern_attr - packet pattern attribute
  * @__NL80211_PKTPAT_INVALID: invalid number for nested attribute
@@ -5146,6 +5503,8 @@ enum plink_actions {
 
 #define NL80211_KCK_LEN                        16
 #define NL80211_KEK_LEN                        16
+#define NL80211_KCK_EXT_LEN            24
+#define NL80211_KEK_EXT_LEN            32
 #define NL80211_REPLAY_CTR_LEN         8
 
 /**
@@ -5154,6 +5513,7 @@ enum plink_actions {
  * @NL80211_REKEY_DATA_KEK: key encryption key (binary)
  * @NL80211_REKEY_DATA_KCK: key confirmation key (binary)
  * @NL80211_REKEY_DATA_REPLAY_CTR: replay counter (binary)
+ * @NL80211_REKEY_DATA_AKM: AKM data (OUI, suite type)
  * @NUM_NL80211_REKEY_DATA: number of rekey attributes (internal)
  * @MAX_NL80211_REKEY_DATA: highest rekey attribute (internal)
  */
@@ -5162,6 +5522,7 @@ enum nl80211_rekey_data {
        NL80211_REKEY_DATA_KEK,
        NL80211_REKEY_DATA_KCK,
        NL80211_REKEY_DATA_REPLAY_CTR,
+       NL80211_REKEY_DATA_AKM,
 
        /* keep last */
        NUM_NL80211_REKEY_DATA,
@@ -5382,7 +5743,7 @@ enum nl80211_feature_flags {
  * enum nl80211_ext_feature_index - bit index of extended features.
  * @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates.
  * @NL80211_EXT_FEATURE_RRM: This driver supports RRM. When featured, user can
- *     can request to use RRM (see %NL80211_ATTR_USE_RRM) with
+ *     request to use RRM (see %NL80211_ATTR_USE_RRM) with
  *     %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests, which will set
  *     the ASSOC_REQ_USE_RRM flag in the association request even if
  *     NL80211_FEATURE_QUIET is not advertized.
@@ -5486,6 +5847,55 @@ enum nl80211_feature_flags {
  * @NL80211_EXT_FEATURE_SAE_OFFLOAD: Device wants to do SAE authentication in
  *     station mode (SAE password is passed as part of the connect command).
  *
+ * @NL80211_EXT_FEATURE_VLAN_OFFLOAD: The driver supports a single netdev
+ *     with VLAN tagged frames and separate VLAN-specific netdevs added using
+ *     vconfig similarly to the Ethernet case.
+ *
+ * @NL80211_EXT_FEATURE_AQL: The driver supports the Airtime Queue Limit (AQL)
+ *     feature, which prevents bufferbloat by using the expected transmission
+ *     time to limit the amount of data buffered in the hardware.
+ *
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION: The driver supports Beacon protection
+ *     and can receive key configuration for BIGTK using key indexes 6 and 7.
+ * @NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT: The driver supports Beacon
+ *     protection as a client only and cannot transmit protected beacons.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH: The driver can disable the
+ *     forwarding of preauth frames over the control port. They are then
+ *     handled as ordinary data frames.
+ *
+ * @NL80211_EXT_FEATURE_PROTECTED_TWT: Driver supports protected TWT frames
+ *
+ * @NL80211_EXT_FEATURE_DEL_IBSS_STA: The driver supports removing stations
+ *      in IBSS mode, essentially by dropping their state.
+ *
+ * @NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS: management frame registrations
+ *     are possible for multicast frames and those will be reported properly.
+ *
+ * @NL80211_EXT_FEATURE_SCAN_FREQ_KHZ: This driver supports receiving and
+ *     reporting scan request with %NL80211_ATTR_SCAN_FREQ_KHZ. In order to
+ *     report %NL80211_ATTR_SCAN_FREQ_KHZ, %NL80211_SCAN_FLAG_FREQ_KHZ must be
+ *     included in the scan request.
+ *
+ * @NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS: The driver
+ *     can report tx status for control port over nl80211 tx operations.
+ *
+ * @NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION: Driver supports Operating
+ *     Channel Validation (OCV) when using driver's SME for RSNA handshakes.
+ *
+ * @NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK: Device wants to do 4-way
+ *     handshake with PSK in AP mode (PSK is passed as part of the start AP
+ *     command).
+ *
+ * @NL80211_EXT_FEATURE_SAE_OFFLOAD_AP: Device wants to do SAE authentication
+ *     in AP mode (SAE password is passed as part of the start AP command).
+ *
+ * @NL80211_EXT_FEATURE_FILS_DISCOVERY: Driver/device supports FILS discovery
+ *     frames transmission
+ *
+ * @NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP: Driver/device supports
+ *     unsolicited broadcast probe response transmission
+ *
  * @NUM_NL80211_EXT_FEATURES: number of extended features.
  * @MAX_NL80211_EXT_FEATURES: highest extended feature index.
  */
@@ -5531,6 +5941,21 @@ enum nl80211_ext_feature_index {
        NL80211_EXT_FEATURE_EXT_KEY_ID,
        NL80211_EXT_FEATURE_STA_TX_PWR,
        NL80211_EXT_FEATURE_SAE_OFFLOAD,
+       NL80211_EXT_FEATURE_VLAN_OFFLOAD,
+       NL80211_EXT_FEATURE_AQL,
+       NL80211_EXT_FEATURE_BEACON_PROTECTION,
+       NL80211_EXT_FEATURE_CONTROL_PORT_NO_PREAUTH,
+       NL80211_EXT_FEATURE_PROTECTED_TWT,
+       NL80211_EXT_FEATURE_DEL_IBSS_STA,
+       NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS,
+       NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT,
+       NL80211_EXT_FEATURE_SCAN_FREQ_KHZ,
+       NL80211_EXT_FEATURE_CONTROL_PORT_OVER_NL80211_TX_STATUS,
+       NL80211_EXT_FEATURE_OPERATING_CHANNEL_VALIDATION,
+       NL80211_EXT_FEATURE_4WAY_HANDSHAKE_AP_PSK,
+       NL80211_EXT_FEATURE_SAE_OFFLOAD_AP,
+       NL80211_EXT_FEATURE_FILS_DISCOVERY,
+       NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP,
 
        /* add new features before the definition below */
        NUM_NL80211_EXT_FEATURES,
@@ -5642,6 +6067,11 @@ enum nl80211_timeout_reason {
  * @NL80211_SCAN_FLAG_MIN_PREQ_CONTENT: minimize probe request content to
  *     only have supported rates and no additional capabilities (unless
  *     added by userspace explicitly.)
+ * @NL80211_SCAN_FLAG_FREQ_KHZ: report scan results with
+ *     %NL80211_ATTR_SCAN_FREQ_KHZ. This also means
+ *     %NL80211_ATTR_SCAN_FREQUENCIES will not be included.
+ * @NL80211_SCAN_FLAG_COLOCATED_6GHZ: scan for colocated APs reported by
+ *     2.4/5 GHz APs
  */
 enum nl80211_scan_flags {
        NL80211_SCAN_FLAG_LOW_PRIORITY                          = 1<<0,
@@ -5657,6 +6087,8 @@ enum nl80211_scan_flags {
        NL80211_SCAN_FLAG_HIGH_ACCURACY                         = 1<<10,
        NL80211_SCAN_FLAG_RANDOM_SN                             = 1<<11,
        NL80211_SCAN_FLAG_MIN_PREQ_CONTENT                      = 1<<12,
+       NL80211_SCAN_FLAG_FREQ_KHZ                              = 1<<13,
+       NL80211_SCAN_FLAG_COLOCATED_6GHZ                        = 1<<14,
 };
 
 /**
@@ -5744,7 +6176,7 @@ enum nl80211_dfs_state {
 };
 
 /**
- * enum enum nl80211_protocol_features - nl80211 protocol features
+ * enum nl80211_protocol_features - nl80211 protocol features
  * @NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP: nl80211 supports splitting
  *     wiphy dumps (if requested by the application with the attribute
  *     %NL80211_ATTR_SPLIT_WIPHY_DUMP. Also supported is filtering the
@@ -6153,12 +6585,14 @@ enum nl80211_ftm_responder_stats {
  * @NL80211_PREAMBLE_HT: HT preamble
  * @NL80211_PREAMBLE_VHT: VHT preamble
  * @NL80211_PREAMBLE_DMG: DMG preamble
+ * @NL80211_PREAMBLE_HE: HE preamble
  */
 enum nl80211_preamble {
        NL80211_PREAMBLE_LEGACY,
        NL80211_PREAMBLE_HT,
        NL80211_PREAMBLE_VHT,
        NL80211_PREAMBLE_DMG,
+       NL80211_PREAMBLE_HE,
 };
 
 /**
@@ -6351,6 +6785,10 @@ enum nl80211_peer_measurement_attrs {
  *     is valid)
  * @NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST: u32 attribute indicating
  *     the maximum FTMs per burst (if not present anything is valid)
+ * @NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED: flag attribute indicating if
+ *     trigger based ranging measurement is supported
+ * @NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED: flag attribute indicating
+ *     if non trigger based ranging measurement is supported
  *
  * @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
  * @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
@@ -6366,6 +6804,8 @@ enum nl80211_peer_measurement_ftm_capa {
        NL80211_PMSR_FTM_CAPA_ATTR_BANDWIDTHS,
        NL80211_PMSR_FTM_CAPA_ATTR_MAX_BURSTS_EXPONENT,
        NL80211_PMSR_FTM_CAPA_ATTR_MAX_FTMS_PER_BURST,
+       NL80211_PMSR_FTM_CAPA_ATTR_TRIGGER_BASED,
+       NL80211_PMSR_FTM_CAPA_ATTR_NON_TRIGGER_BASED,
 
        /* keep last */
        NUM_NL80211_PMSR_FTM_CAPA_ATTR,
@@ -6395,6 +6835,20 @@ enum nl80211_peer_measurement_ftm_capa {
  * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI: request LCI data (flag)
  * @NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC: request civic location data
  *     (flag)
+ * @NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED: request trigger based ranging
+ *     measurement (flag).
+ *     This attribute and %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED are
+ *     mutually exclusive.
+ *      if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
+ *     %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
+ *     ranging will be used.
+ * @NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED: request non trigger based
+ *     ranging measurement (flag)
+ *     This attribute and %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED are
+ *     mutually exclusive.
+ *      if neither %NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED nor
+ *     %NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED is set, EDCA based
+ *     ranging will be used.
  *
  * @NUM_NL80211_PMSR_FTM_REQ_ATTR: internal
  * @NL80211_PMSR_FTM_REQ_ATTR_MAX: highest attribute number
@@ -6411,6 +6865,8 @@ enum nl80211_peer_measurement_ftm_req {
        NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES,
        NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI,
        NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC,
+       NL80211_PMSR_FTM_REQ_ATTR_TRIGGER_BASED,
+       NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED,
 
        /* keep last */
        NUM_NL80211_PMSR_FTM_REQ_ATTR,
@@ -6535,6 +6991,13 @@ enum nl80211_peer_measurement_ftm_resp {
  *
  * @NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET: the OBSS PD minimum tx power offset.
  * @NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET: the OBSS PD maximum tx power offset.
+ * @NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET: the non-SRG OBSS PD maximum
+ *     tx power offset.
+ * @NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP: bitmap that indicates the BSS color
+ *     values used by members of the SRG.
+ * @NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP: bitmap that indicates the partial
+ *     BSSID values used by members of the SRG.
+ * @NL80211_HE_OBSS_PD_ATTR_SR_CTRL: The SR Control field of SRP element.
  *
  * @__NL80211_HE_OBSS_PD_ATTR_LAST: Internal
  * @NL80211_HE_OBSS_PD_ATTR_MAX: highest OBSS PD attribute.
@@ -6544,11 +7007,121 @@ enum nl80211_obss_pd_attributes {
 
        NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET,
        NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET,
+       NL80211_HE_OBSS_PD_ATTR_NON_SRG_MAX_OFFSET,
+       NL80211_HE_OBSS_PD_ATTR_BSS_COLOR_BITMAP,
+       NL80211_HE_OBSS_PD_ATTR_PARTIAL_BSSID_BITMAP,
+       NL80211_HE_OBSS_PD_ATTR_SR_CTRL,
 
        /* keep last */
        __NL80211_HE_OBSS_PD_ATTR_LAST,
        NL80211_HE_OBSS_PD_ATTR_MAX = __NL80211_HE_OBSS_PD_ATTR_LAST - 1,
 };
 
+/**
+ * enum nl80211_bss_color_attributes - BSS Color attributes
+ * @__NL80211_HE_BSS_COLOR_ATTR_INVALID: Invalid
+ *
+ * @NL80211_HE_BSS_COLOR_ATTR_COLOR: the current BSS Color.
+ * @NL80211_HE_BSS_COLOR_ATTR_DISABLED: is BSS coloring disabled.
+ * @NL80211_HE_BSS_COLOR_ATTR_PARTIAL: the AID equation to be used..
+ *
+ * @__NL80211_HE_BSS_COLOR_ATTR_LAST: Internal
+ * @NL80211_HE_BSS_COLOR_ATTR_MAX: highest BSS Color attribute.
+ */
+enum nl80211_bss_color_attributes {
+       __NL80211_HE_BSS_COLOR_ATTR_INVALID,
+
+       NL80211_HE_BSS_COLOR_ATTR_COLOR,
+       NL80211_HE_BSS_COLOR_ATTR_DISABLED,
+       NL80211_HE_BSS_COLOR_ATTR_PARTIAL,
 
+       /* keep last */
+       __NL80211_HE_BSS_COLOR_ATTR_LAST,
+       NL80211_HE_BSS_COLOR_ATTR_MAX = __NL80211_HE_BSS_COLOR_ATTR_LAST - 1,
+};
+
+/**
+ * enum nl80211_iftype_akm_attributes - interface type AKM attributes
+ * @__NL80211_IFTYPE_AKM_ATTR_INVALID: Invalid
+ *
+ * @NL80211_IFTYPE_AKM_ATTR_IFTYPES: nested attribute containing a flag
+ *     attribute for each interface type that supports AKM suites specified in
+ *     %NL80211_IFTYPE_AKM_ATTR_SUITES
+ * @NL80211_IFTYPE_AKM_ATTR_SUITES: an array of u32. Used to indicate supported
+ *     AKM suites for the specified interface types.
+ *
+ * @__NL80211_IFTYPE_AKM_ATTR_LAST: Internal
+ * @NL80211_IFTYPE_AKM_ATTR_MAX: highest interface type AKM attribute.
+ */
+enum nl80211_iftype_akm_attributes {
+       __NL80211_IFTYPE_AKM_ATTR_INVALID,
+
+       NL80211_IFTYPE_AKM_ATTR_IFTYPES,
+       NL80211_IFTYPE_AKM_ATTR_SUITES,
+
+       /* keep last */
+       __NL80211_IFTYPE_AKM_ATTR_LAST,
+       NL80211_IFTYPE_AKM_ATTR_MAX = __NL80211_IFTYPE_AKM_ATTR_LAST - 1,
+};
+
+/**
+ * enum nl80211_fils_discovery_attributes - FILS discovery configuration
+ * from IEEE Std 802.11ai-2016, Annex C.3 MIB detail.
+ *
+ * @__NL80211_FILS_DISCOVERY_ATTR_INVALID: Invalid
+ *
+ * @NL80211_FILS_DISCOVERY_ATTR_INT_MIN: Minimum packet interval (u32, TU).
+ *     Allowed range: 0..10000 (TU = Time Unit)
+ * @NL80211_FILS_DISCOVERY_ATTR_INT_MAX: Maximum packet interval (u32, TU).
+ *     Allowed range: 0..10000 (TU = Time Unit)
+ * @NL80211_FILS_DISCOVERY_ATTR_TMPL: Template data for FILS discovery action
+ *     frame including the headers.
+ *
+ * @__NL80211_FILS_DISCOVERY_ATTR_LAST: Internal
+ * @NL80211_FILS_DISCOVERY_ATTR_MAX: highest attribute
+ */
+enum nl80211_fils_discovery_attributes {
+       __NL80211_FILS_DISCOVERY_ATTR_INVALID,
+
+       NL80211_FILS_DISCOVERY_ATTR_INT_MIN,
+       NL80211_FILS_DISCOVERY_ATTR_INT_MAX,
+       NL80211_FILS_DISCOVERY_ATTR_TMPL,
+
+       /* keep last */
+       __NL80211_FILS_DISCOVERY_ATTR_LAST,
+       NL80211_FILS_DISCOVERY_ATTR_MAX = __NL80211_FILS_DISCOVERY_ATTR_LAST - 1
+};
+
+/*
+ * FILS discovery template minimum length with action frame headers and
+ * mandatory fields.
+ */
+#define NL80211_FILS_DISCOVERY_TMPL_MIN_LEN 42
+
+/**
+ * enum nl80211_unsol_bcast_probe_resp_attributes - Unsolicited broadcast probe
+ *     response configuration. Applicable only in 6GHz.
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INVALID: Invalid
+ *
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT: Maximum packet interval (u32, TU).
+ *     Allowed range: 0..20 (TU = Time Unit). IEEE P802.11ax/D6.0
+ *     26.17.2.3.2 (AP behavior for fast passive scanning).
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL: Unsolicited broadcast probe response
+ *     frame template (binary).
+ *
+ * @__NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST: Internal
+ * @NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX: highest attribute
+ */
+enum nl80211_unsol_bcast_probe_resp_attributes {
+       __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INVALID,
+
+       NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT,
+       NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL,
+
+       /* keep last */
+       __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST,
+       NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_MAX =
+               __NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_LAST - 1
+};
 #endif /* __LINUX_NL80211_H */