Lines Matching defs:xsk

21 #include "xsk.h"
48 struct xsk {
60 struct xsk *rx_xsk;
70 static int open_xsk(int ifindex, struct xsk *xsk, __u32 queue_id)
90 xsk->umem_area = mmap(NULL, UMEM_SIZE, PROT_READ | PROT_WRITE, mmap_flags, -1, 0);
91 if (xsk->umem_area == MAP_FAILED)
94 ret = xsk_umem__create(&xsk->umem,
95 xsk->umem_area, UMEM_SIZE,
96 &xsk->fill,
97 &xsk->comp,
102 ret = xsk_socket__create(&xsk->socket, ifindex, queue_id,
103 xsk->umem,
104 &xsk->rx,
105 &xsk->tx,
116 printf("%p: tx_desc[%d] -> %lx\n", xsk, i, addr);
121 ret = xsk_ring_prod__reserve(&xsk->fill, UMEM_NUM / 2, &idx);
124 printf("%p: rx_desc[%d] -> %lx\n", xsk, i, addr);
125 *xsk_ring_prod__fill_addr(&xsk->fill, idx + i) = addr;
127 xsk_ring_prod__submit(&xsk->fill, ret);
132 static void close_xsk(struct xsk *xsk)
134 if (xsk->umem)
135 xsk_umem__delete(xsk->umem);
136 if (xsk->socket)
137 xsk_socket__delete(xsk->socket);
138 munmap(xsk->umem_area, UMEM_SIZE);
141 static void refill_rx(struct xsk *xsk, __u64 addr)
145 if (xsk_ring_prod__reserve(&xsk->fill, 1, &idx) == 1) {
146 printf("%p: complete rx idx=%u addr=%llx\n", xsk, idx, addr);
147 *xsk_ring_prod__fill_addr(&xsk->fill, idx) = addr;
148 xsk_ring_prod__submit(&xsk->fill, 1);
152 static int kick_tx(struct xsk *xsk)
154 return sendto(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, 0);
157 static int kick_rx(struct xsk *xsk)
159 return recvfrom(xsk_socket__fd(xsk->socket), NULL, 0, MSG_DONTWAIT, NULL, NULL);
282 static bool complete_tx(struct xsk *xsk, clockid_t clock_id)
289 if (!xsk_ring_cons__peek(&xsk->comp, 1, &idx))
292 addr = *xsk_ring_cons__comp_addr(&xsk->comp, idx);
293 data = xsk_umem__get_data(xsk->umem_area, addr);
296 printf("%p: complete tx idx=%u addr=%llx\n", xsk, idx, addr);
311 xsk_ring_cons__release(&xsk->comp, 1);
324 static void ping_pong(struct xsk *xsk, void *rx_packet, clockid_t clock_id)
338 ret = xsk_ring_prod__reserve(&xsk->tx, 1, &idx);
340 printf("%p: failed to reserve tx slot\n", xsk);
344 tx_desc = xsk_ring_prod__tx_desc(&xsk->tx, idx);
346 data = xsk_umem__get_data(xsk->umem_area, tx_desc->addr);
361 printf("%p: failed to detect IP version for ping pong %04x\n", xsk, eth->h_proto);
362 xsk_ring_prod__cancel(&xsk->tx, 1);
395 xsk, ntohs(udph->check), ntohs(want_csum),
402 xsk_ring_prod__submit(&xsk->tx, 1);
405 static int verify_metadata(struct xsk *rx_xsk, int rxq, int server_fd, clockid_t clock_id)
453 struct xsk *xsk = &rx_xsk[i];
455 ret = xsk_ring_cons__peek(&xsk->rx, 1, &idx);
460 rx_desc = xsk_ring_cons__rx_desc(&xsk->rx, idx);
465 xsk, idx, rx_desc->addr, addr, comp_addr, is_eop ? " EoP" : "");
467 verify_xdp_metadata(xsk_umem__get_data(xsk->umem_area, addr),
473 ping_pong(xsk, xsk_umem__get_data(xsk->umem_area, addr),
476 ret = kick_tx(xsk);
481 if (complete_tx(xsk, clock_id))
488 xsk_ring_cons__release(&xsk->rx, 1);
489 refill_rx(xsk, comp_addr);
688 rx_xsk = malloc(sizeof(struct xsk) * rxq);
723 printf("prepare xsk map...\n");
729 ret = bpf_map_update_elem(bpf_map__fd(bpf_obj->maps.xsk), &queue_id, &sock_fd, 0);