|
@@ -126,6 +126,7 @@ enum bpf_map_type {
|
|
BPF_MAP_TYPE_XSKMAP,
|
|
BPF_MAP_TYPE_XSKMAP,
|
|
BPF_MAP_TYPE_SOCKHASH,
|
|
BPF_MAP_TYPE_SOCKHASH,
|
|
BPF_MAP_TYPE_CGROUP_STORAGE,
|
|
BPF_MAP_TYPE_CGROUP_STORAGE,
|
|
|
|
+ BPF_MAP_TYPE_REUSEPORT_SOCKARRAY,
|
|
};
|
|
};
|
|
|
|
|
|
enum bpf_prog_type {
|
|
enum bpf_prog_type {
|
|
@@ -150,6 +151,7 @@ enum bpf_prog_type {
|
|
BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
|
|
BPF_PROG_TYPE_CGROUP_SOCK_ADDR,
|
|
BPF_PROG_TYPE_LWT_SEG6LOCAL,
|
|
BPF_PROG_TYPE_LWT_SEG6LOCAL,
|
|
BPF_PROG_TYPE_LIRC_MODE2,
|
|
BPF_PROG_TYPE_LIRC_MODE2,
|
|
|
|
+ BPF_PROG_TYPE_SK_REUSEPORT,
|
|
};
|
|
};
|
|
|
|
|
|
enum bpf_attach_type {
|
|
enum bpf_attach_type {
|
|
@@ -2113,6 +2115,14 @@ union bpf_attr {
|
|
* the shared data.
|
|
* the shared data.
|
|
* Return
|
|
* Return
|
|
* Pointer to the local storage area.
|
|
* Pointer to the local storage area.
|
|
|
|
+ *
|
|
|
|
+ * int bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags)
|
|
|
|
+ * Description
|
|
|
|
+ * Select a SO_REUSEPORT sk from a BPF_MAP_TYPE_REUSEPORT_ARRAY map
|
|
|
|
+ * It checks the selected sk is matching the incoming
|
|
|
|
+ * request in the skb.
|
|
|
|
+ * Return
|
|
|
|
+ * 0 on success, or a negative error in case of failure.
|
|
*/
|
|
*/
|
|
#define __BPF_FUNC_MAPPER(FN) \
|
|
#define __BPF_FUNC_MAPPER(FN) \
|
|
FN(unspec), \
|
|
FN(unspec), \
|
|
@@ -2196,7 +2206,8 @@ union bpf_attr {
|
|
FN(rc_keydown), \
|
|
FN(rc_keydown), \
|
|
FN(skb_cgroup_id), \
|
|
FN(skb_cgroup_id), \
|
|
FN(get_current_cgroup_id), \
|
|
FN(get_current_cgroup_id), \
|
|
- FN(get_local_storage),
|
|
|
|
|
|
+ FN(get_local_storage), \
|
|
|
|
+ FN(sk_select_reuseport),
|
|
|
|
|
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
|
/* integer value in 'imm' field of BPF_CALL instruction selects which helper
|
|
* function eBPF program intends to call
|
|
* function eBPF program intends to call
|
|
@@ -2413,6 +2424,30 @@ struct sk_msg_md {
|
|
__u32 local_port; /* stored in host byte order */
|
|
__u32 local_port; /* stored in host byte order */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+struct sk_reuseport_md {
|
|
|
|
+ /*
|
|
|
|
+ * Start of directly accessible data. It begins from
|
|
|
|
+ * the tcp/udp header.
|
|
|
|
+ */
|
|
|
|
+ void *data;
|
|
|
|
+ void *data_end; /* End of directly accessible data */
|
|
|
|
+ /*
|
|
|
|
+ * Total length of packet (starting from the tcp/udp header).
|
|
|
|
+ * Note that the directly accessible bytes (data_end - data)
|
|
|
|
+ * could be less than this "len". Those bytes could be
|
|
|
|
+ * indirectly read by a helper "bpf_skb_load_bytes()".
|
|
|
|
+ */
|
|
|
|
+ __u32 len;
|
|
|
|
+ /*
|
|
|
|
+ * Eth protocol in the mac header (network byte order). e.g.
|
|
|
|
+ * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD)
|
|
|
|
+ */
|
|
|
|
+ __u32 eth_protocol;
|
|
|
|
+ __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */
|
|
|
|
+ __u32 bind_inany; /* Is sock bound to an INANY address? */
|
|
|
|
+ __u32 hash; /* A hash of the packet 4 tuples */
|
|
|
|
+};
|
|
|
|
+
|
|
#define BPF_TAG_SIZE 8
|
|
#define BPF_TAG_SIZE 8
|
|
|
|
|
|
struct bpf_prog_info {
|
|
struct bpf_prog_info {
|