static void evq_poll(struct client_state* cs) { ef_request_id ids[EF_VI_TRANSMIT_BATCH]; ef_event evs[EF_VI_EVENT_POLL_MIN_EVS]; int n_ev, i; n_ev = ef_eventq_poll(&(cs->vi), evs, sizeof(evs) / sizeof(evs[0])); for( i = 0; i < n_ev; ++i ) switch( EF_EVENT_TYPE(evs[i]) ) { case EF_EVENT_TYPE_TX: if( ef_vi_transmit_unbundle(&(cs->vi), &evs[i], ids) ) cs->pio_in_use = false; break; default: fprintf(stderr, "ERROR: unexpected event "EF_EVENT_FMT"\n", EF_EVENT_PRI_ARG(evs[i])); TEST(0); break; } }
static void rx_wait(void) { ef_request_id ids[EF_VI_TRANSMIT_BATCH]; ef_event evs[EF_VI_EVENT_POLL_MIN_EVS]; int n_ev, i; while( 1 ) { n_ev = ef_eventq_poll(&vi, evs, sizeof(evs) / sizeof(evs[0])); if( n_ev > 0 ) for( i = 0; i < n_ev; ++i ) switch( EF_EVENT_TYPE(evs[i]) ) { case EF_EVENT_TYPE_RX: TEST(EF_EVENT_RX_SOP(evs[i]) == 1); TEST(EF_EVENT_RX_CONT(evs[i]) == 0); TEST((int) (rx_posted - rx_completed) > 0); ++rx_completed; return; case EF_EVENT_TYPE_TX: ef_vi_transmit_unbundle(&vi, &evs[i], ids); break; case EF_EVENT_TYPE_RX_DISCARD: fprintf(stderr, "ERROR: RX_DISCARD type=%d\n", EF_EVENT_RX_DISCARD_TYPE(evs[i])); break; case EF_EVENT_TYPE_TX_ERROR: fprintf(stderr, "ERROR: TX_ERROR type=%d\n", EF_EVENT_TX_ERROR_TYPE(evs[i])); break; default: fprintf(stderr, "ERROR: unexpected event "EF_EVENT_FMT"\n", EF_EVENT_PRI_ARG(evs[i])); break; } else if( cfg_wait ) TRY(ef_eventq_wait(&vi, driver_handle, ef_eventq_current(&vi), 0)); } }
static void rx_wait(void) { ef_request_id ids[EF_VI_TRANSMIT_BATCH]; ef_event evs[EF_VI_EVENT_POLL_MIN_EVS]; int n_ev, i; while( 1 ) { n_ev = ef_eventq_poll(&vi, evs, sizeof(evs) / sizeof(evs[0])); if( n_ev > 0 ) { for( i = 0; i < n_ev; ++i ) switch( EF_EVENT_TYPE(evs[i]) ) { case EF_EVENT_TYPE_RX: TEST(EF_EVENT_RX_SOP(evs[i]) == 1); TEST(EF_EVENT_RX_CONT(evs[i]) == 0); TEST((int) (rx_posted - rx_completed) > 0); ++rx_completed; return; case EF_EVENT_TYPE_TX: ef_vi_transmit_unbundle(&vi, &evs[i], ids); break; case EF_EVENT_TYPE_RX_DISCARD: fprintf(stderr, "ERROR: RX_DISCARD type=%d\n", EF_EVENT_RX_DISCARD_TYPE(evs[i])); break; case EF_EVENT_TYPE_TX_ERROR: fprintf(stderr, "ERROR: TX_ERROR type=%d\n", EF_EVENT_TX_ERROR_TYPE(evs[i])); break; default: fprintf(stderr, "ERROR: unexpected event "EF_EVENT_FMT"\n", EF_EVENT_PRI_ARG(evs[i])); break; } } else if( cfg_eventq_wait ) { TRY(ef_eventq_wait(&vi, driver_handle, ef_eventq_current(&vi), 0)); } else if( cfg_fd_wait ) { TRY(ef_vi_prime(&vi, driver_handle, ef_eventq_current(&vi))); struct pollfd pollfd = { .fd = driver_handle, .events = POLLIN, .revents = 0, }; TRY(poll(&pollfd, 1, -1)); } } } static void tx_send(void) { struct pkt_buf* pb = pkt_bufs[FIRST_TX_BUF]; ef_vi_transmit(&vi, pb->dma_buf_addr, tx_frame_len, 0); } /**********************************************************************/ static void pong_test(void) { int i; rx_post_8(); for( i = 0; i < cfg_iter; ++i ) { rx_wait(); tx_send(); if( i % 8 == 0 ) rx_post_8(); } }