1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Intel Corporation.
7 #include <linux/version.h>
10 #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \
11 defined(RTE_LIBRTE_AF_XDP_PMD_SHARED_UMEM)
12 #define ETH_AF_XDP_SHARED_UMEM 1
15 #ifdef ETH_AF_XDP_SHARED_UMEM
16 static __rte_always_inline int
17 create_shared_socket(struct xsk_socket **xsk_ptr,
19 __u32 queue_id, struct xsk_umem *umem,
20 struct xsk_ring_cons *rx,
21 struct xsk_ring_prod *tx,
22 struct xsk_ring_prod *fill,
23 struct xsk_ring_cons *comp,
24 const struct xsk_socket_config *config)
26 return xsk_socket__create_shared(xsk_ptr, ifname, queue_id, umem, rx,
27 tx, fill, comp, config);
30 static __rte_always_inline int
31 create_shared_socket(struct xsk_socket **xsk_ptr __rte_unused,
32 const char *ifname __rte_unused,
33 __u32 queue_id __rte_unused,
34 struct xsk_umem *umem __rte_unused,
35 struct xsk_ring_cons *rx __rte_unused,
36 struct xsk_ring_prod *tx __rte_unused,
37 struct xsk_ring_prod *fill __rte_unused,
38 struct xsk_ring_cons *comp __rte_unused,
39 const struct xsk_socket_config *config __rte_unused)
45 #ifdef XDP_USE_NEED_WAKEUP
47 tx_syscall_needed(struct xsk_ring_prod *q)
49 return xsk_ring_prod__needs_wakeup(q);
53 tx_syscall_needed(struct xsk_ring_prod *q __rte_unused)
59 #ifdef RTE_LIBRTE_AF_XDP_PMD_BPF_LINK
60 static int link_lookup(int ifindex, int *link_fd)
62 struct bpf_link_info link_info;
69 err = bpf_link_get_next_id(id, &id);
71 if (errno == ENOENT) {
78 fd = bpf_link_get_fd_by_id(id);
86 link_len = sizeof(struct bpf_link_info);
87 memset(&link_info, 0, link_len);
88 err = bpf_obj_get_info_by_fd(fd, &link_info, &link_len);
93 if (link_info.type == BPF_LINK_TYPE_XDP) {
94 if ((int)link_info.xdp.ifindex == ifindex) {
105 static bool probe_bpf_link(void)
107 DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts,
108 .flags = XDP_FLAGS_SKB_MODE);
109 struct bpf_load_program_attr prog_attr;
110 struct bpf_insn insns[2];
111 int prog_fd, link_fd = -1;
116 err = link_lookup(ifindex_lo, &link_fd);
123 /* BPF_MOV64_IMM(BPF_REG_0, XDP_PASS), */
124 insns[0].code = BPF_ALU64 | BPF_MOV | BPF_K;
125 insns[0].dst_reg = BPF_REG_0;
126 insns[0].imm = XDP_PASS;
128 /* BPF_EXIT_INSN() */
129 insns[1].code = BPF_JMP | BPF_EXIT;
131 memset(&prog_attr, 0, sizeof(prog_attr));
132 prog_attr.prog_type = BPF_PROG_TYPE_XDP;
133 prog_attr.insns = insns;
134 prog_attr.insns_cnt = RTE_DIM(insns);
135 prog_attr.license = "GPL";
137 prog_fd = bpf_load_program_xattr(&prog_attr, NULL, 0);
141 link_fd = bpf_link_create(prog_fd, ifindex_lo, BPF_XDP, &opts);
152 static int link_xdp_program(int if_index, int prog_fd, bool use_bpf_link)
154 DECLARE_LIBBPF_OPTS(bpf_link_create_opts, opts);
155 int link_fd, ret = 0;
158 return bpf_set_link_xdp_fd(if_index, prog_fd,
159 XDP_FLAGS_UPDATE_IF_NOEXIST);
162 link_fd = bpf_link_create(prog_fd, if_index, BPF_XDP, &opts);
169 static bool probe_bpf_link(void)
174 static int link_xdp_program(int if_index, int prog_fd,
175 bool use_bpf_link __rte_unused)
177 return bpf_set_link_xdp_fd(if_index, prog_fd,
178 XDP_FLAGS_UPDATE_IF_NOEXIST);