1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2010-2014 Intel Corporation 3 */ 4 5 #include "test_table_ports.h" 6 #include "test_table.h" 7 8 port_test port_tests[] = { 9 test_port_ring_reader, 10 test_port_ring_writer, 11 }; 12 13 unsigned n_port_tests = RTE_DIM(port_tests); 14 15 /* Port tests */ 16 int 17 test_port_ring_reader(void) 18 { 19 int status, i; 20 struct rte_port_ring_reader_params port_ring_reader_params; 21 void *port; 22 23 /* Invalid params */ 24 port = rte_port_ring_reader_ops.f_create(NULL, 0); 25 if (port != NULL) 26 return -1; 27 28 status = rte_port_ring_reader_ops.f_free(port); 29 if (status >= 0) 30 return -2; 31 32 /* Create and free */ 33 port_ring_reader_params.ring = RING_RX; 34 port = rte_port_ring_reader_ops.f_create(&port_ring_reader_params, 0); 35 if (port == NULL) 36 return -3; 37 38 status = rte_port_ring_reader_ops.f_free(port); 39 if (status != 0) 40 return -4; 41 42 /* -- Traffic RX -- */ 43 int expected_pkts, received_pkts; 44 struct rte_mbuf *res_mbuf[RTE_PORT_IN_BURST_SIZE_MAX]; 45 void *mbuf[RTE_PORT_IN_BURST_SIZE_MAX]; 46 47 port_ring_reader_params.ring = RING_RX; 48 port = rte_port_ring_reader_ops.f_create(&port_ring_reader_params, 0); 49 50 /* Single packet */ 51 mbuf[0] = (void *)rte_pktmbuf_alloc(pool); 52 53 expected_pkts = rte_ring_sp_enqueue_burst(port_ring_reader_params.ring, 54 mbuf, 1, NULL); 55 received_pkts = rte_port_ring_reader_ops.f_rx(port, res_mbuf, 1); 56 57 if (received_pkts < expected_pkts) 58 return -5; 59 60 rte_pktmbuf_free(res_mbuf[0]); 61 62 /* Multiple packets */ 63 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 64 mbuf[i] = rte_pktmbuf_alloc(pool); 65 66 expected_pkts = rte_ring_sp_enqueue_burst(port_ring_reader_params.ring, 67 (void * const *) mbuf, RTE_PORT_IN_BURST_SIZE_MAX, NULL); 68 received_pkts = rte_port_ring_reader_ops.f_rx(port, res_mbuf, 69 RTE_PORT_IN_BURST_SIZE_MAX); 70 71 if (received_pkts < expected_pkts) 72 return -6; 73 74 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 75 rte_pktmbuf_free(res_mbuf[i]); 76 77 return 0; 78 } 79 80 int 81 test_port_ring_writer(void) 82 { 83 int status, i; 84 struct rte_port_ring_writer_params port_ring_writer_params; 85 void *port; 86 87 /* Invalid params */ 88 port = rte_port_ring_writer_ops.f_create(NULL, 0); 89 if (port != NULL) 90 return -1; 91 92 status = rte_port_ring_writer_ops.f_free(port); 93 if (status >= 0) 94 return -2; 95 96 port_ring_writer_params.ring = NULL; 97 98 port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0); 99 if (port != NULL) 100 return -3; 101 102 port_ring_writer_params.ring = RING_TX; 103 port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX + 1; 104 105 port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0); 106 if (port != NULL) 107 return -4; 108 109 /* Create and free */ 110 port_ring_writer_params.ring = RING_TX; 111 port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX; 112 113 port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0); 114 if (port == NULL) 115 return -5; 116 117 status = rte_port_ring_writer_ops.f_free(port); 118 if (status != 0) 119 return -6; 120 121 /* -- Traffic TX -- */ 122 int expected_pkts, received_pkts; 123 struct rte_mbuf *mbuf[RTE_PORT_IN_BURST_SIZE_MAX]; 124 struct rte_mbuf *res_mbuf[RTE_PORT_IN_BURST_SIZE_MAX]; 125 126 port_ring_writer_params.ring = RING_TX; 127 port_ring_writer_params.tx_burst_sz = RTE_PORT_IN_BURST_SIZE_MAX; 128 port = rte_port_ring_writer_ops.f_create(&port_ring_writer_params, 0); 129 130 /* Single packet */ 131 mbuf[0] = rte_pktmbuf_alloc(pool); 132 133 rte_port_ring_writer_ops.f_tx(port, mbuf[0]); 134 rte_port_ring_writer_ops.f_flush(port); 135 expected_pkts = 1; 136 received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring, 137 (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL); 138 139 if (received_pkts < expected_pkts) 140 return -7; 141 142 rte_pktmbuf_free(res_mbuf[0]); 143 144 /* Multiple packets */ 145 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) { 146 mbuf[i] = rte_pktmbuf_alloc(pool); 147 rte_port_ring_writer_ops.f_tx(port, mbuf[i]); 148 } 149 150 expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX; 151 received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring, 152 (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL); 153 154 if (received_pkts < expected_pkts) 155 return -8; 156 157 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 158 rte_pktmbuf_free(res_mbuf[i]); 159 160 /* TX Bulk */ 161 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 162 mbuf[i] = rte_pktmbuf_alloc(pool); 163 rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)-1); 164 165 expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX; 166 received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring, 167 (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL); 168 169 if (received_pkts < expected_pkts) 170 return -8; 171 172 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 173 rte_pktmbuf_free(res_mbuf[i]); 174 175 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 176 mbuf[i] = rte_pktmbuf_alloc(pool); 177 rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)-3); 178 rte_port_ring_writer_ops.f_tx_bulk(port, mbuf, (uint64_t)2); 179 180 expected_pkts = RTE_PORT_IN_BURST_SIZE_MAX; 181 received_pkts = rte_ring_sc_dequeue_burst(port_ring_writer_params.ring, 182 (void **)res_mbuf, port_ring_writer_params.tx_burst_sz, NULL); 183 184 if (received_pkts < expected_pkts) 185 return -9; 186 187 for (i = 0; i < RTE_PORT_IN_BURST_SIZE_MAX; i++) 188 rte_pktmbuf_free(res_mbuf[i]); 189 190 return 0; 191 } 192