@@ -74,6 +74,29 @@ pkt_segmented_e pool_segmentation = PKT_POOL_UNSEGMENTED;
odp_pool_t pool[MAX_NUM_IFACES] = {ODP_POOL_INVALID, ODP_POOL_INVALID};
+static inline void _pktio_wait_linkup(odp_pktio_t pktio)
+{
+ /* wait 1 second for link up */
+ uint64_t wait_ns = (10 * ODP_TIME_MSEC_IN_NS);
+ int wait_num = 10;
+ int i;
+ int ret = -1;
+
+ for (i = 0; i < wait_num; i++) {
+ ret = odp_pktio_link_status(pktio);
+ if (ret < 0 || ret == 1)
+ break;
+ /* link is down, call status again after delay */
+ odp_time_wait_ns(wait_ns);
+ }
+
+ if (ret != -1) {
+ /* assert only if link state supported and
+ * it's down. */
+ CU_ASSERT_FATAL(ret == 1);
+ }
+}
+
static void set_pool_len(odp_pool_param_t *params)
{
switch (pool_segmentation) {
@@ -514,6 +537,8 @@ static void test_txrx(odp_pktio_input_mode_t in_mode, int num_pkts)
ret = odp_pktio_start(io->id);
CU_ASSERT(ret == 0);
+
+ _pktio_wait_linkup(io->id);
}
/* if we have two interfaces then send through one and receive on
@@ -757,6 +782,8 @@ void pktio_test_start_stop(void)
ret = odp_pktio_start(pktio[0]);
CU_ASSERT(ret < 0);
+ _pktio_wait_linkup(pktio[0]);
+
/* Test Rx on a stopped interface. Only works if there are 2 */
if (num_ifaces > 1) {
for (alloc = 0; alloc < 1000; alloc++) {
@@ -804,6 +831,8 @@ void pktio_test_start_stop(void)
ret = odp_pktio_start(pktio[1]);
CU_ASSERT(ret == 0);
+ _pktio_wait_linkup(pktio[1]);
+
/* flush packets with magic number in pipes */
for (i = 0; i < 1000; i++) {
ev = odp_schedule(NULL, wait);
@@ -915,6 +944,8 @@ void pktio_test_send_failure(void)
ret = odp_pktio_start(pktio_tx);
CU_ASSERT_FATAL(ret == 0);
+ _pktio_wait_linkup(pktio_tx);
+
/* configure the pool so that we can generate test packets larger
* than the interface MTU */
memset(&pool_params, 0, sizeof(pool_params));
@@ -930,6 +961,8 @@ void pktio_test_send_failure(void)
ODP_PKTOUT_MODE_SEND);
ret = odp_pktio_start(pktio_rx);
CU_ASSERT_FATAL(ret == 0);
+
+ _pktio_wait_linkup(pktio_rx);
} else {
pktio_rx = pktio_tx;
}
@@ -1052,6 +1085,8 @@ void pktio_test_recv_on_wonly(void)
ret = odp_pktio_start(pktio);
CU_ASSERT_FATAL(ret == 0);
+ _pktio_wait_linkup(pktio);
+
ret = odp_pktio_recv(pktio, &pkt, 1);
CU_ASSERT(ret < 0);
@@ -1082,6 +1117,8 @@ void pktio_test_send_on_ronly(void)
ret = odp_pktio_start(pktio);
CU_ASSERT_FATAL(ret == 0);
+ _pktio_wait_linkup(pktio);
+
pkt = odp_packet_alloc(default_pkt_pool, packet_len);
CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID)
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org> --- test/validation/pktio/pktio.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+)