Lines Matching full:xsk
7 #include "xsk.h"
49 struct xsk {
59 static int open_xsk(int ifindex, struct xsk *xsk)
80 xsk->umem_area = mmap(NULL, UMEM_SIZE, PROT_READ | PROT_WRITE, mmap_flags, -1, 0);
81 if (!ASSERT_NEQ(xsk->umem_area, MAP_FAILED, "mmap"))
84 ret = xsk_umem__create(&xsk->umem,
85 xsk->umem_area, UMEM_SIZE,
86 &xsk->fill,
87 &xsk->comp,
92 ret = xsk_socket__create(&xsk->socket, ifindex, QUEUE_ID,
93 xsk->umem,
94 &xsk->rx,
95 &xsk->tx,
106 printf("%p: tx_desc[%d] -> %lx\n", xsk, i, addr);
111 ret = xsk_ring_prod__reserve(&xsk->fill, UMEM_NUM / 2, &idx);
119 printf("%p: rx_desc[%d] -> %lx\n", xsk, i, addr);
120 *xsk_ring_prod__fill_addr(&xsk->fill, i) = addr;
122 xsk_ring_prod__submit(&xsk->fill, ret);
127 static void close_xsk(struct xsk *xsk)
129 if (xsk->umem)
130 xsk_umem__delete(xsk->umem);
131 if (xsk->socket)
132 xsk_socket__delete(xsk->socket);
133 munmap(xsk->umem_area, UMEM_SIZE);
136 static int generate_packet(struct xsk *xsk, __u16 dst_port)
147 ret = xsk_ring_prod__reserve(&xsk->tx, 1, &idx);
151 tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx);
153 printf("%p: tx_desc[%u]->addr=%llx\n", xsk, idx, tx_desc->addr);
154 data = xsk_umem__get_data(xsk->umem_area, tx_desc->addr);
194 xsk_ring_prod__submit(&xsk->tx, 1);
196 ret = sendto(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, 0);
227 static void complete_tx(struct xsk *xsk)
234 if (ASSERT_EQ(xsk_ring_cons__peek(&xsk->comp, 1, &idx), 1, "xsk_ring_cons__peek")) {
235 addr = *xsk_ring_cons__comp_addr(&xsk->comp, idx);
237 printf("%p: complete tx idx=%u addr=%llx\n", xsk, idx, addr);
239 data = xsk_umem__get_data(xsk->umem_area, addr);
244 xsk_ring_cons__release(&xsk->comp, 1);
248 static void refill_rx(struct xsk *xsk, __u64 addr)
252 if (ASSERT_EQ(xsk_ring_prod__reserve(&xsk->fill, 1, &idx), 1, "xsk_ring_prod__reserve")) {
253 printf("%p: complete idx=%u addr=%llx\n", xsk, idx, addr);
254 *xsk_ring_prod__fill_addr(&xsk->fill, idx) = addr;
255 xsk_ring_prod__submit(&xsk->fill, 1);
259 static int verify_xsk_metadata(struct xsk *xsk, bool sent_from_af_xdp)
273 ret = recvfrom(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, NULL);
277 fds.fd = xsk_socket__fd(xsk->socket);
284 ret = xsk_ring_cons__peek(&xsk->rx, 1, &idx);
288 rx_desc = xsk_ring_cons__rx_desc(&xsk->rx, idx);
292 xsk, idx, rx_desc->addr, addr, comp_addr);
293 data = xsk_umem__get_data(xsk->umem_area, addr);
331 xsk_ring_cons__release(&xsk->rx, 1);
332 refill_rx(xsk, comp_addr);
358 struct xsk tx_xsk = {};
359 struct xsk rx_xsk = {};
455 ret = bpf_map_update_elem(bpf_map__fd(bpf_obj->maps.xsk), &queue_id, &sock_fd, 0);