174b46340SCiara Loftus /* SPDX-License-Identifier: BSD-3-Clause
274b46340SCiara Loftus * Copyright(c) 2020 Intel Corporation.
374b46340SCiara Loftus */
474b46340SCiara Loftus
5fa4dfda5SCiara Loftus #ifdef RTE_NET_AF_XDP_LIBXDP
6fa4dfda5SCiara Loftus #include <xdp/xsk.h>
7fa4dfda5SCiara Loftus #else
874b46340SCiara Loftus #include <bpf/xsk.h>
9fa4dfda5SCiara Loftus #endif
108d3d9c72SCiara Loftus #include <bpf/bpf.h>
1174b46340SCiara Loftus #include <linux/version.h>
12b42cffabSCiara Loftus #include <poll.h>
1374b46340SCiara Loftus
1474b46340SCiara Loftus #if KERNEL_VERSION(5, 10, 0) <= LINUX_VERSION_CODE && \
15fa4dfda5SCiara Loftus defined(RTE_NET_AF_XDP_SHARED_UMEM)
1674b46340SCiara Loftus #define ETH_AF_XDP_SHARED_UMEM 1
1774b46340SCiara Loftus #endif
1874b46340SCiara Loftus
1974b46340SCiara Loftus #ifdef ETH_AF_XDP_SHARED_UMEM
2074b46340SCiara Loftus static __rte_always_inline int
create_shared_socket(struct xsk_socket ** xsk_ptr,const char * ifname,__u32 queue_id,struct xsk_umem * umem,struct xsk_ring_cons * rx,struct xsk_ring_prod * tx,struct xsk_ring_prod * fill,struct xsk_ring_cons * comp,const struct xsk_socket_config * config)2174b46340SCiara Loftus create_shared_socket(struct xsk_socket **xsk_ptr,
2274b46340SCiara Loftus const char *ifname,
2374b46340SCiara Loftus __u32 queue_id, struct xsk_umem *umem,
2474b46340SCiara Loftus struct xsk_ring_cons *rx,
2574b46340SCiara Loftus struct xsk_ring_prod *tx,
2674b46340SCiara Loftus struct xsk_ring_prod *fill,
2774b46340SCiara Loftus struct xsk_ring_cons *comp,
2874b46340SCiara Loftus const struct xsk_socket_config *config)
2974b46340SCiara Loftus {
3074b46340SCiara Loftus return xsk_socket__create_shared(xsk_ptr, ifname, queue_id, umem, rx,
3174b46340SCiara Loftus tx, fill, comp, config);
3274b46340SCiara Loftus }
3374b46340SCiara Loftus #else
3474b46340SCiara Loftus static __rte_always_inline int
create_shared_socket(struct xsk_socket ** xsk_ptr __rte_unused,const char * ifname __rte_unused,__u32 queue_id __rte_unused,struct xsk_umem * umem __rte_unused,struct xsk_ring_cons * rx __rte_unused,struct xsk_ring_prod * tx __rte_unused,struct xsk_ring_prod * fill __rte_unused,struct xsk_ring_cons * comp __rte_unused,const struct xsk_socket_config * config __rte_unused)3574b46340SCiara Loftus create_shared_socket(struct xsk_socket **xsk_ptr __rte_unused,
3674b46340SCiara Loftus const char *ifname __rte_unused,
3774b46340SCiara Loftus __u32 queue_id __rte_unused,
3874b46340SCiara Loftus struct xsk_umem *umem __rte_unused,
3974b46340SCiara Loftus struct xsk_ring_cons *rx __rte_unused,
4074b46340SCiara Loftus struct xsk_ring_prod *tx __rte_unused,
4174b46340SCiara Loftus struct xsk_ring_prod *fill __rte_unused,
4274b46340SCiara Loftus struct xsk_ring_cons *comp __rte_unused,
4374b46340SCiara Loftus const struct xsk_socket_config *config __rte_unused)
4474b46340SCiara Loftus {
4574b46340SCiara Loftus return -1;
4674b46340SCiara Loftus }
4774b46340SCiara Loftus #endif
48055a3936SCiara Loftus
49*9c132373SMaryam Tahhan #ifdef ETH_AF_XDP_UPDATE_XSKMAP
50*9c132373SMaryam Tahhan static __rte_always_inline int
update_xskmap(struct xsk_socket * xsk,int map_fd,int xsk_queue_idx __rte_unused)51*9c132373SMaryam Tahhan update_xskmap(struct xsk_socket *xsk, int map_fd, int xsk_queue_idx __rte_unused)
52*9c132373SMaryam Tahhan {
53*9c132373SMaryam Tahhan return xsk_socket__update_xskmap(xsk, map_fd);
54*9c132373SMaryam Tahhan }
55*9c132373SMaryam Tahhan #else
56*9c132373SMaryam Tahhan static __rte_always_inline int
update_xskmap(struct xsk_socket * xsk,int map_fd,int xsk_queue_idx)57*9c132373SMaryam Tahhan update_xskmap(struct xsk_socket *xsk, int map_fd, int xsk_queue_idx)
58*9c132373SMaryam Tahhan {
59*9c132373SMaryam Tahhan int fd = xsk_socket__fd(xsk);
60*9c132373SMaryam Tahhan return bpf_map_update_elem(map_fd, &xsk_queue_idx, &fd, 0);
61*9c132373SMaryam Tahhan }
62*9c132373SMaryam Tahhan #endif
63*9c132373SMaryam Tahhan
64055a3936SCiara Loftus #ifdef XDP_USE_NEED_WAKEUP
652aa51cddSCiara Loftus static int
tx_syscall_needed(struct xsk_ring_prod * q)662aa51cddSCiara Loftus tx_syscall_needed(struct xsk_ring_prod *q)
672aa51cddSCiara Loftus {
682aa51cddSCiara Loftus return xsk_ring_prod__needs_wakeup(q);
692aa51cddSCiara Loftus }
70055a3936SCiara Loftus #else
712aa51cddSCiara Loftus static int
tx_syscall_needed(struct xsk_ring_prod * q __rte_unused)722aa51cddSCiara Loftus tx_syscall_needed(struct xsk_ring_prod *q __rte_unused)
732aa51cddSCiara Loftus {
742aa51cddSCiara Loftus return 1;
752aa51cddSCiara Loftus }
76055a3936SCiara Loftus #endif
778d3d9c72SCiara Loftus
788d3d9c72SCiara Loftus #ifdef RTE_NET_AF_XDP_LIBBPF_OBJ_OPEN
load_program(const char * prog_path,struct bpf_object ** obj)798d3d9c72SCiara Loftus static int load_program(const char *prog_path, struct bpf_object **obj)
808d3d9c72SCiara Loftus {
818d3d9c72SCiara Loftus struct bpf_program *prog;
828d3d9c72SCiara Loftus int err;
838d3d9c72SCiara Loftus
848d3d9c72SCiara Loftus *obj = bpf_object__open_file(prog_path, NULL);
858d3d9c72SCiara Loftus err = libbpf_get_error(*obj);
868d3d9c72SCiara Loftus if (err)
878d3d9c72SCiara Loftus return -1;
888d3d9c72SCiara Loftus
898d3d9c72SCiara Loftus err = bpf_object__load(*obj);
908d3d9c72SCiara Loftus if (err)
918d3d9c72SCiara Loftus goto out;
928d3d9c72SCiara Loftus
938d3d9c72SCiara Loftus prog = bpf_object__next_program(*obj, NULL);
948d3d9c72SCiara Loftus if (!prog)
958d3d9c72SCiara Loftus goto out;
968d3d9c72SCiara Loftus
978d3d9c72SCiara Loftus return bpf_program__fd(prog);
988d3d9c72SCiara Loftus
998d3d9c72SCiara Loftus out:
1008d3d9c72SCiara Loftus bpf_object__close(*obj);
1018d3d9c72SCiara Loftus return -1;
1028d3d9c72SCiara Loftus }
1038d3d9c72SCiara Loftus #else
load_program(const char * prog_path,struct bpf_object ** obj)1048d3d9c72SCiara Loftus static int load_program(const char *prog_path, struct bpf_object **obj)
1058d3d9c72SCiara Loftus {
1068d3d9c72SCiara Loftus int ret, prog_fd;
1078d3d9c72SCiara Loftus
1088d3d9c72SCiara Loftus ret = bpf_prog_load(prog_path, BPF_PROG_TYPE_XDP, obj, &prog_fd);
1098d3d9c72SCiara Loftus if (ret)
1108d3d9c72SCiara Loftus return -1;
1118d3d9c72SCiara Loftus
1128d3d9c72SCiara Loftus return prog_fd;
1138d3d9c72SCiara Loftus }
1148d3d9c72SCiara Loftus #endif
115