aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-12-09 18:24:08 +0000
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-12-09 18:24:08 +0000
commit05f880c9f71e617bdf8fe91b9caa8c08d8918f39 (patch)
tree1c7c00d3442767329c86d5f3c97a6084f52fab6d
parentb0c8cca3ddfe1c63d6e450580955764f7fc122ac (diff)
linux-dpdk: pktio: check for pktio_start when started and pktio_stop when stopped
DPDK checks that too but it doesn't return an error, so we should maintain the status too. Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r--platform/linux-dpdk/include/odp_packet_io_internal.h4
-rw-r--r--platform/linux-dpdk/odp_packet_io.c8
2 files changed, 12 insertions, 0 deletions
diff --git a/platform/linux-dpdk/include/odp_packet_io_internal.h b/platform/linux-dpdk/include/odp_packet_io_internal.h
index dffc556d0..2d8aae1d7 100644
--- a/platform/linux-dpdk/include/odp_packet_io_internal.h
+++ b/platform/linux-dpdk/include/odp_packet_io_internal.h
@@ -50,6 +50,10 @@ struct pktio_entry {
odp_queue_t loopq; /**< loopback queue for "loop" device */
odp_pktio_type_t type; /**< pktio type */
pkt_dpdk_t pkt_dpdk; /**< using DPDK API for IO */
+ enum {
+ STATE_START = 0,
+ STATE_STOP
+ } state;
classifier_t cls; /**< classifier linked with this pktio*/
char name[IFNAMSIZ]; /**< name of pktio provided to
pktio_open() */
diff --git a/platform/linux-dpdk/odp_packet_io.c b/platform/linux-dpdk/odp_packet_io.c
index 4fc717d6b..6625fd9d8 100644
--- a/platform/linux-dpdk/odp_packet_io.c
+++ b/platform/linux-dpdk/odp_packet_io.c
@@ -236,6 +236,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
pktio_entry->s.handle = id;
odp_ticketlock_init(&pktio_entry->s.rxl);
odp_ticketlock_init(&pktio_entry->s.txl);
+ pktio_entry->s.state = STATE_STOP;
unlock_entry(pktio_entry);
/*unlock_entry_classifier(pktio_entry);*/
@@ -953,6 +954,10 @@ int odp_pktio_start(odp_pktio_t id)
return -1;
}
+ if (pktio_entry->s.state == STATE_START)
+ return -1;
+ pktio_entry->s.state = STATE_START;
+
ret = rte_eth_dev_start(pktio_entry->s.pkt_dpdk.portid);
if (ret < 0) {
ODP_ERR("rte_eth_dev_start:err=%d, port=%u\n",
@@ -970,6 +975,9 @@ int odp_pktio_stop(odp_pktio_t id)
ODP_ERR("No pktio found!\n");
return -1;
}
+ if (pktio_entry->s.state == STATE_STOP)
+ return -1;
+ pktio_entry->s.state = STATE_STOP;
rte_eth_dev_stop(pktio_entry->s.pkt_dpdk.portid);
return 0;
}