/** * Lookup the destination port for a given packet * * @param pkt ODP packet handle */ static inline int lookup_dest_port(odp_packet_t pkt) { int i, src_idx; odp_pktio_t pktio_src; pktio_src = odp_packet_input(pkt); for (src_idx = -1, i = 0; gbl_args->pktios[i] != ODP_PKTIO_INVALID; ++i) if (gbl_args->pktios[i] == pktio_src) src_idx = i; if (src_idx == -1) LOG_ABORT("Failed to determine pktio input\n"); return gbl_args->dst_port[src_idx]; }
/** * Lookup the destination pktio for a given packet */ static inline odp_queue_t lookup_dest_q(odp_packet_t pkt) { int i, src_idx, dst_idx; odp_pktio_t pktio_src, pktio_dst; pktio_src = odp_packet_input(pkt); for (src_idx = -1, i = 0; gbl_args->pktios[i] != ODP_PKTIO_INVALID; ++i) if (gbl_args->pktios[i] == pktio_src) src_idx = i; if (src_idx == -1) LOG_ABORT("Failed to determine pktio input\n"); dst_idx = (src_idx % 2 == 0) ? src_idx+1 : src_idx-1; pktio_dst = gbl_args->pktios[dst_idx]; return odp_pktio_outq_getdef(pktio_dst); }
static void pktio_txrx_multi(pktio_info_t *pktio_a, pktio_info_t *pktio_b, int num_pkts) { odp_packet_t tx_pkt[num_pkts]; odp_event_t tx_ev[num_pkts]; odp_packet_t rx_pkt; uint32_t tx_seq[num_pkts]; int i, ret; /* generate test packets to send */ for (i = 0; i < num_pkts; ++i) { tx_pkt[i] = odp_packet_alloc(default_pkt_pool, packet_len); if (tx_pkt[i] == ODP_PACKET_INVALID) break; tx_seq[i] = pktio_init_packet(tx_pkt[i]); if (tx_seq[i] == TEST_SEQ_INVALID) { odp_packet_free(tx_pkt[i]); break; } pktio_pkt_set_macs(tx_pkt[i], pktio_a->id, pktio_b->id); if (pktio_fixup_checksums(tx_pkt[i]) != 0) { odp_packet_free(tx_pkt[i]); break; } tx_ev[i] = odp_packet_to_event(tx_pkt[i]); } if (i != num_pkts) { CU_FAIL("failed to generate test packets"); return; } /* send packet(s) out */ if (num_pkts == 1) { ret = odp_queue_enq(pktio_a->outq, tx_ev[0]); if (ret != 0) { CU_FAIL("failed to enqueue test packet"); odp_packet_free(tx_pkt[0]); return; } } else { ret = odp_queue_enq_multi(pktio_a->outq, tx_ev, num_pkts); if (ret != num_pkts) { CU_FAIL("failed to enqueue test packets"); i = ret < 0 ? 0 : ret; for ( ; i < num_pkts; i++) odp_packet_free(tx_pkt[i]); return; } } /* and wait for them to arrive back */ for (i = 0; i < num_pkts; ++i) { rx_pkt = wait_for_packet(pktio_b, tx_seq[i], ODP_TIME_SEC_IN_NS); if (rx_pkt == ODP_PACKET_INVALID) break; CU_ASSERT(odp_packet_input(rx_pkt) == pktio_b->id); CU_ASSERT(odp_packet_has_error(rx_pkt) == 0); odp_packet_free(rx_pkt); } CU_ASSERT(i == num_pkts); }