enum ofp_return_code send_pkt_loop(struct ofp_ifnet *dev, odp_packet_t pkt) { if (odp_queue_enq(ofp_get_ifnet(dev->port, 0)->loopq_def, odp_packet_to_event(pkt))) return OFP_PKT_DROP; return OFP_PKT_PROCESSED; }
static inline void enqueue_loop_interface(odp_packet_t pkt) { odp_event_t ev; odp_queue_t defqueue = odp_pktio_outq_getdef(pktio_loop); ev = odp_packet_to_event(pkt); if (!(CU_ASSERT(odp_queue_enq(defqueue, ev) == 0))) odp_packet_free(pkt); }
void enqueue_pktio_interface(odp_packet_t pkt, odp_pktio_t pktio) { odp_event_t ev; odp_queue_t defqueue; defqueue = odp_pktio_outq_getdef(pktio); CU_ASSERT(defqueue != ODP_QUEUE_INVALID); ev = odp_packet_to_event(pkt); CU_ASSERT(odp_queue_enq(defqueue, ev) == 0); }
/* * Allocate packets for transmission. */ static int alloc_packets(odp_event_t *event_tbl, int num_pkts) { odp_packet_t pkt_tbl[num_pkts]; int n; for (n = 0; n < num_pkts; ++n) { pkt_tbl[n] = pktio_create_packet(); if (pkt_tbl[n] == ODP_PACKET_INVALID) break; event_tbl[n] = odp_packet_to_event(pkt_tbl[n]); } return n; }
enum ofp_return_code send_pkt_out(struct ofp_ifnet *dev, odp_packet_t pkt) { OFP_DBG("Sent packet out %s", dev->if_name); if (odp_queue_enq(ofp_get_ifnet(dev->port, 0)->outq_def, odp_packet_to_event(pkt))) { OFP_DBG("odp_queue_enq failed"); return OFP_PKT_DROP; } OFP_DEBUG_PACKET(OFP_DEBUG_PKT_SEND_NIC, pkt, dev->port); OFP_UPDATE_PACKET_STAT(tx_fp, 1); return OFP_PKT_PROCESSED; }
int create_stream_db_inputs(void) { int created = 0; odp_pool_t pkt_pool; stream_db_entry_t *stream = NULL; /* Lookup the packet pool */ pkt_pool = odp_pool_lookup("packet_pool"); if (pkt_pool == ODP_POOL_INVALID) { EXAMPLE_ERR("Error: pkt_pool not found\n"); exit(EXIT_FAILURE); } /* For each stream create corresponding input packets */ for (stream = stream_db->list; NULL != stream; stream = stream->next) { int count; uint8_t *dmac = query_loopback_db_mac(stream->input.loop); odp_queue_t queue = query_loopback_db_inq(stream->input.loop); for (count = stream->count; count > 0; count--) { odp_packet_t pkt; pkt = create_ipv4_packet(stream, dmac, pkt_pool); if (ODP_PACKET_INVALID == pkt) { printf("Packet buffers exhausted\n"); break; } stream->created++; if (odp_queue_enq(queue, odp_packet_to_event(pkt))) { odp_packet_free(pkt); printf("Queue enqueue failed\n"); break; } /* Count this stream when we create first packet */ if (1 == stream->created) created++; } } return created; }
void pktio_test_start_stop(void) { odp_pktio_t pktio[MAX_NUM_IFACES]; odp_packet_t pkt; odp_event_t tx_ev[100]; odp_event_t ev; int i, pkts, ret, alloc = 0; odp_queue_t outq; uint64_t wait = odp_schedule_wait_time(ODP_TIME_MSEC_IN_NS); for (i = 0; i < num_ifaces; i++) { pktio[i] = create_pktio(i, ODP_PKTIN_MODE_SCHED, ODP_PKTOUT_MODE_SEND); CU_ASSERT_FATAL(pktio[i] != ODP_PKTIO_INVALID); create_inq(pktio[i], ODP_QUEUE_TYPE_SCHED); } outq = odp_pktio_outq_getdef(pktio[0]); /* Interfaces are stopped by default, * Check that stop when stopped generates an error */ ret = odp_pktio_stop(pktio[0]); CU_ASSERT(ret <= 0); /* start first */ ret = odp_pktio_start(pktio[0]); CU_ASSERT(ret == 0); /* Check that start when started generates an error */ ret = odp_pktio_start(pktio[0]); CU_ASSERT(ret < 0); /* Test Rx on a stopped interface. Only works if there are 2 */ if (num_ifaces > 1) { for (alloc = 0; alloc < 100; alloc++) { pkt = odp_packet_alloc(default_pkt_pool, packet_len); if (pkt == ODP_PACKET_INVALID) break; pktio_init_packet(pkt); pktio_pkt_set_macs(pkt, pktio[0], pktio[1]); if (pktio_fixup_checksums(pkt) != 0) { odp_packet_free(pkt); break; } tx_ev[alloc] = odp_packet_to_event(pkt); } for (pkts = 0; pkts != alloc; ) { ret = odp_queue_enq_multi(outq, &tx_ev[pkts], alloc - pkts); if (ret < 0) { CU_FAIL("unable to enqueue packet\n"); break; } pkts += ret; } /* check that packets did not arrive */ for (i = 0, pkts = 0; i < 1000; i++) { ev = odp_schedule(NULL, wait); if (ev == ODP_EVENT_INVALID) continue; if (odp_event_type(ev) == ODP_EVENT_PACKET) { pkt = odp_packet_from_event(ev); if (pktio_pkt_seq(pkt) != TEST_SEQ_INVALID) pkts++; } odp_event_free(ev); } if (pkts) CU_FAIL("pktio stopped, received unexpected events"); /* start both, send and get packets */ /* 0 already started */ ret = odp_pktio_start(pktio[1]); CU_ASSERT(ret == 0); /* flush packets with magic number in pipes */ for (i = 0; i < 1000; i++) { ev = odp_schedule(NULL, wait); if (ev != ODP_EVENT_INVALID) odp_event_free(ev); } } /* alloc */ for (alloc = 0; alloc < 100; alloc++) { pkt = odp_packet_alloc(default_pkt_pool, packet_len); if (pkt == ODP_PACKET_INVALID) break; pktio_init_packet(pkt); if (num_ifaces > 1) { pktio_pkt_set_macs(pkt, pktio[0], pktio[1]); if (pktio_fixup_checksums(pkt) != 0) { odp_packet_free(pkt); break; } } tx_ev[alloc] = odp_packet_to_event(pkt); } /* send */ for (pkts = 0; pkts != alloc; ) { ret = odp_queue_enq_multi(outq, &tx_ev[pkts], alloc - pkts); if (ret < 0) { CU_FAIL("unable to enqueue packet\n"); break; } pkts += ret; } /* get */ for (i = 0, pkts = 0; i < 100; i++) { ev = odp_schedule(NULL, wait); if (ev != ODP_EVENT_INVALID) { if (odp_event_type(ev) == ODP_EVENT_PACKET) { pkt = odp_packet_from_event(ev); if (pktio_pkt_seq(pkt) != TEST_SEQ_INVALID) pkts++; } odp_event_free(ev); } } CU_ASSERT(pkts == alloc); for (i = 0; i < num_ifaces; i++) { CU_ASSERT(odp_pktio_stop(pktio[i]) == 0); destroy_inq(pktio[i]); CU_ASSERT(odp_pktio_close(pktio[i]) == 0); } }
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); }