Lines Matching defs:xsk
35 #include <bpf/xsk.h>
147 struct xsk_socket *xsk;
193 static int xsk_get_xdp_stats(int fd, struct xsk_socket_info *xsk)
205 xsk->ring_stats.rx_dropped_npkts = stats.rx_dropped;
206 xsk->ring_stats.rx_invalid_npkts = stats.rx_invalid_descs;
207 xsk->ring_stats.tx_invalid_npkts = stats.tx_invalid_descs;
208 xsk->ring_stats.rx_full_npkts = stats.rx_ring_full;
209 xsk->ring_stats.rx_fill_empty_npkts = stats.rx_fill_ring_empty_descs;
210 xsk->ring_stats.tx_empty_npkts = stats.tx_ring_empty_descs;
381 if (!xsk_get_xdp_stats(xsk_socket__fd(xsks[i]->xsk), xsks[i])) {
488 xsk_socket__delete(xsks[i]->xsk);
844 struct xsk_socket_info *xsk;
849 xsk = calloc(1, sizeof(*xsk));
850 if (!xsk)
853 xsk->umem = umem;
863 rxr = rx ? &xsk->rx : NULL;
864 txr = tx ? &xsk->tx : NULL;
865 ret = xsk_socket__create(&xsk->xsk, opt_if, opt_queue, umem->umem,
874 xsk->app_stats.rx_empty_polls = 0;
875 xsk->app_stats.fill_fail_polls = 0;
876 xsk->app_stats.copy_tx_sendtos = 0;
877 xsk->app_stats.tx_wakeup_sendtos = 0;
878 xsk->app_stats.opt_polls = 0;
879 xsk->app_stats.prev_rx_empty_polls = 0;
880 xsk->app_stats.prev_fill_fail_polls = 0;
881 xsk->app_stats.prev_copy_tx_sendtos = 0;
882 xsk->app_stats.prev_tx_wakeup_sendtos = 0;
883 xsk->app_stats.prev_opt_polls = 0;
885 return xsk;
1090 static void kick_tx(struct xsk_socket_info *xsk)
1094 ret = sendto(xsk_socket__fd(xsk->xsk), NULL, 0, MSG_DONTWAIT, NULL, 0);
1101 static inline void complete_tx_l2fwd(struct xsk_socket_info *xsk,
1104 struct xsk_umem_info *umem = xsk->umem;
1109 if (!xsk->outstanding_tx)
1118 xsk->app_stats.copy_tx_sendtos++;
1119 kick_tx(xsk);
1122 ndescs = (xsk->outstanding_tx > opt_batch_size) ? opt_batch_size :
1123 xsk->outstanding_tx;
1136 xsk->app_stats.fill_fail_polls++;
1146 xsk_ring_prod__submit(&xsk->umem->fq, rcvd);
1147 xsk_ring_cons__release(&xsk->umem->cq, rcvd);
1148 xsk->outstanding_tx -= rcvd;
1149 xsk->ring_stats.tx_npkts += rcvd;
1153 static inline void complete_tx_only(struct xsk_socket_info *xsk,
1159 if (!xsk->outstanding_tx)
1162 if (!opt_need_wakeup || xsk_ring_prod__needs_wakeup(&xsk->tx)) {
1163 xsk->app_stats.tx_wakeup_sendtos++;
1164 kick_tx(xsk);
1167 rcvd = xsk_ring_cons__peek(&xsk->umem->cq, batch_size, &idx);
1169 xsk_ring_cons__release(&xsk->umem->cq, rcvd);
1170 xsk->outstanding_tx -= rcvd;
1171 xsk->ring_stats.tx_npkts += rcvd;
1175 static void rx_drop(struct xsk_socket_info *xsk, struct pollfd *fds)
1181 rcvd = xsk_ring_cons__peek(&xsk->rx, opt_batch_size, &idx_rx);
1183 if (xsk_ring_prod__needs_wakeup(&xsk->umem->fq)) {
1184 xsk->app_stats.rx_empty_polls++;
1190 ret = xsk_ring_prod__reserve(&xsk->umem->fq, rcvd, &idx_fq);
1194 if (xsk_ring_prod__needs_wakeup(&xsk->umem->fq)) {
1195 xsk->app_stats.fill_fail_polls++;
1198 ret = xsk_ring_prod__reserve(&xsk->umem->fq, rcvd, &idx_fq);
1202 u64 addr = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx)->addr;
1203 u32 len = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx++)->len;
1207 char *pkt = xsk_umem__get_data(xsk->umem->buffer, addr);
1210 *xsk_ring_prod__fill_addr(&xsk->umem->fq, idx_fq++) = orig;
1213 xsk_ring_prod__submit(&xsk->umem->fq, rcvd);
1214 xsk_ring_cons__release(&xsk->rx, rcvd);
1215 xsk->ring_stats.rx_npkts += rcvd;
1224 fds[i].fd = xsk_socket__fd(xsks[i]->xsk);
1245 static void tx_only(struct xsk_socket_info *xsk, u32 *frame_nb, int batch_size)
1250 while (xsk_ring_prod__reserve(&xsk->tx, batch_size, &idx) <
1252 complete_tx_only(xsk, batch_size);
1258 struct xdp_desc *tx_desc = xsk_ring_prod__tx_desc(&xsk->tx,
1264 xsk_ring_prod__submit(&xsk->tx, batch_size);
1265 xsk->outstanding_tx += batch_size;
1268 complete_tx_only(xsk, batch_size);
1306 fds[0].fd = xsk_socket__fd(xsks[i]->xsk);
1337 static void l2fwd(struct xsk_socket_info *xsk, struct pollfd *fds)
1343 complete_tx_l2fwd(xsk, fds);
1345 rcvd = xsk_ring_cons__peek(&xsk->rx, opt_batch_size, &idx_rx);
1347 if (xsk_ring_prod__needs_wakeup(&xsk->umem->fq)) {
1348 xsk->app_stats.rx_empty_polls++;
1354 ret = xsk_ring_prod__reserve(&xsk->tx, rcvd, &idx_tx);
1358 complete_tx_l2fwd(xsk, fds);
1359 if (xsk_ring_prod__needs_wakeup(&xsk->tx)) {
1360 xsk->app_stats.tx_wakeup_sendtos++;
1361 kick_tx(xsk);
1363 ret = xsk_ring_prod__reserve(&xsk->tx, rcvd, &idx_tx);
1367 u64 addr = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx)->addr;
1368 u32 len = xsk_ring_cons__rx_desc(&xsk->rx, idx_rx++)->len;
1372 char *pkt = xsk_umem__get_data(xsk->umem->buffer, addr);
1377 xsk_ring_prod__tx_desc(&xsk->tx, idx_tx)->addr = orig;
1378 xsk_ring_prod__tx_desc(&xsk->tx, idx_tx++)->len = len;
1381 xsk_ring_prod__submit(&xsk->tx, rcvd);
1382 xsk_ring_cons__release(&xsk->rx, rcvd);
1384 xsk->ring_stats.rx_npkts += rcvd;
1385 xsk->outstanding_tx += rcvd;
1394 fds[i].fd = xsk_socket__fd(xsks[i]->xsk);
1454 int fd = xsk_socket__fd(xsks[i]->xsk);