ifobject
static int __send_pkts(struct ifobject *ifobject, struct xsk_socket_info *xsk,
bool use_poll = ifobject->use_poll;
static int send_pkts(struct test_spec *test, struct ifobject *ifobject)
pkt_stream = ifobject->xsk_arr[i].pkt_stream;
ret = __send_pkts(ifobject, &ifobject->xsk_arr[i], test->poll_tmout);
ret = wait_for_tx_completion(&ifobject->xsk_arr[i]);
static int validate_rx_dropped(struct ifobject *ifobject)
struct xsk_socket *xsk = ifobject->xsk->xsk;
err = kick_rx(ifobject->xsk);
if (stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 ||
stats.rx_dropped == ifobject->xsk->pkt_stream->nb_pkts / 2 - 1)
static int validate_rx_full(struct ifobject *ifobject)
struct xsk_socket *xsk = ifobject->xsk->xsk;
err = kick_rx(ifobject->xsk);
static int validate_fill_empty(struct ifobject *ifobject)
struct xsk_socket *xsk = ifobject->xsk->xsk;
err = kick_rx(ifobject->xsk);
static int validate_tx_invalid_descs(struct ifobject *ifobject)
struct xsk_socket *xsk = ifobject->xsk->xsk;
if (stats.tx_invalid_descs != ifobject->xsk->pkt_stream->nb_pkts / 2) {
ifobject->xsk->pkt_stream->nb_pkts);
static int xsk_configure(struct test_spec *test, struct ifobject *ifobject,
bool shared = (ifobject->shared_umem && tx) ? true : !!i;
ret = xsk_configure_socket(&ifobject->xsk_arr[i], umem,
ifobject, shared);
if (ifobject->busy_poll) {
ret = enable_busy_poll(&ifobject->xsk_arr[i]);
static int thread_common_ops_tx(struct test_spec *test, struct ifobject *ifobject)
umem_tx = ifobject->xsk_arr[0].umem_real;
ret = xsk_configure(test, ifobject, umem_tx, true);
ifobject->xsk = &ifobject->xsk_arr[0];
struct ifobject *ifobject, bool shared)
ifobject->xskmap = test->ifobj_rx->xskmap;
static int thread_common_ops(struct test_spec *test, struct ifobject *ifobject)
struct xsk_umem_info *umem = ifobject->xsk->umem;
if (ifobject->shared_umem)
ret = xsk_configure_umem(ifobject, umem, bufs, umem_sz);
ret = xsk_configure(test, ifobject, umem, false);
ifobject->xsk = &ifobject->xsk_arr[0];
if (!ifobject->rx_on)
cfg.bind_flags = ifobject->bind_flags;
ret = xsk_populate_fill_ring(umem, ifobject->xsk->pkt_stream,
ifobject->use_fill_ring);
ret = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk_arr[i].xsk, i);
struct ifobject *ifobject = test->ifobj_tx;
if (!ifobject->shared_umem) {
if (thread_common_ops(test, ifobject)) {
if (thread_common_ops_tx(test, ifobject)) {
if (ifobject->mtu > MAX_ETH_PKT_SIZE)
err = send_pkts(test, ifobject);
if (!err && ifobject->validation_func)
err = ifobject->validation_func(ifobject);
struct ifobject *ifobject = test->ifobj_rx;
err = thread_common_ops(test, ifobject);
xsk_clear_xskmap(ifobject->xskmap);
err = xsk_update_xskmap(ifobject->xskmap, ifobject->xsk->xsk, 0);
if (!err && ifobject->validation_func)
err = ifobject->validation_func(ifobject);
if (is_adjust_tail_supported(ifobject->xdp_progs, &supported))
static void testapp_clean_xsk_umem(struct ifobject *ifobj)
txr = ifobject->tx_on ? &xsk->tx : NULL;
struct ifobject *ifobj = test->ifobj_rx;
rxr = ifobject->rx_on ? &xsk->rx : NULL;
struct ifobject *ifobj = test->ifobj_tx;
static int xsk_reattach_xdp(struct ifobject *ifobj, struct bpf_program *xdp_prog,
return xsk_socket__create(&xsk->xsk, ifobject->ifindex, 0, umem->umem, rxr, txr, &cfg);
static int xsk_attach_xdp_progs(struct test_spec *test, struct ifobject *ifobj_rx,
struct ifobject *ifobj_tx)
static int set_ring_size(struct ifobject *ifobj)
static void clean_sockets(struct test_spec *test, struct ifobject *ifobj)
static void clean_umem(struct test_spec *test, struct ifobject *ifobj1, struct ifobject *ifobj2)
static int __testapp_validate_traffic(struct test_spec *test, struct ifobject *ifobj1,
struct ifobject *ifobj2)
struct ifobject *ifobj_rx = test->ifobj_rx;
struct ifobject *ifobj_tx = test->ifobj_tx;
static int testapp_validate_traffic_single_thread(struct test_spec *test, struct ifobject *ifobj)
static void swap_directions(struct ifobject **ifobj1, struct ifobject **ifobj2)
struct ifobject *tmp_ifobj = (*ifobj1);
int hw_ring_size_reset(struct ifobject *ifobj)
static void __test_spec_init(struct test_spec *test, struct ifobject *ifobj_tx,
struct ifobject *ifobj_rx)
struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
static int xsk_load_xdp_programs(struct ifobject *ifobj)
int init_iface(struct ifobject *ifobj, thread_func_t func_ptr)
struct ifobject *ifobject_create(void)
struct ifobject *ifobj;
ifobj = calloc(1, sizeof(struct ifobject));
void ifobject_delete(struct ifobject *ifobj)
void test_init(struct test_spec *test, struct ifobject *ifobj_tx,
struct ifobject *ifobj_rx, enum test_mode mode,
struct ifobject *ifobj = i ? ifobj_rx : ifobj_tx;
static int pkt_stream_replace_ifobject(struct ifobject *ifobj, u32 nb_pkts, u32 pkt_len)
static int __pkt_stream_replace_half(struct ifobject *ifobj, u32 pkt_len,
static struct pkt_stream *__pkt_stream_generate_custom(struct ifobject *ifobj, struct pkt *frames,
int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer,
struct ifobject *ifobj = test->ifobj_rx;
int hw_ring_size_reset(struct ifobject *ifobj);
struct ifobject *ifobject_create(void);
void ifobject_delete(struct ifobject *ifobj);
int init_iface(struct ifobject *ifobj, thread_func_t func_ptr);
int xsk_configure_umem(struct ifobject *ifobj, struct xsk_umem_info *umem, void *buffer, u64 size);
struct ifobject *ifobject, bool shared);
struct ifobject *ifobj_tx;
struct ifobject *ifobj_rx;
void test_init(struct test_spec *test, struct ifobject *ifobj_tx,
struct ifobject *ifobj_rx, enum test_mode mode,
struct ifobject;
typedef int (*validation_func_t)(struct ifobject *ifobj);
int configure_ifobj(struct ifobject *tx, struct ifobject *rx)
struct ifobject *ifobj_tx, *ifobj_rx;
static bool ifobj_zc_avail(struct ifobject *ifobject)
ret = xsk_configure_umem(ifobject, umem, bufs, umem_sz);
ifobject->bind_flags = XDP_USE_NEED_WAKEUP | XDP_ZEROCOPY;
ifobject->rx_on = true;
ret = xsk_configure_socket(xsk, umem, ifobject, false);
static bool validate_interface(struct ifobject *ifobj)
static void parse_command_line(struct ifobject *ifobj_tx, struct ifobject *ifobj_rx, int argc,
struct ifobject *ifobj;
static void xsk_unload_xdp_programs(struct ifobject *ifobj)
struct ifobject *ifobj_tx, *ifobj_rx;