aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-dpdk
diff options
context:
space:
mode:
authorZoltan Kiss <zoltan.kiss@linaro.org>2015-12-10 14:45:35 +0000
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-12-10 14:45:35 +0000
commit412a8da2ae1ccf9b596ae2eed84ae1d2f3ba4010 (patch)
tree09d90ca71c5a88ab0642baa63f8101148757157d /platform/linux-dpdk
parent4c13c58dc2df1ff86d15697139ec4225899e8fea (diff)
Port "ed10cea1 linux-generic: pktio: check interface mode is compatible before receiving or sending"
And "45259bf4 linux-generic: pktio: factor state management into packet_io", plus add some extra logging. Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
Diffstat (limited to 'platform/linux-dpdk')
-rw-r--r--platform/linux-dpdk/odp_packet_io.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/platform/linux-dpdk/odp_packet_io.c b/platform/linux-dpdk/odp_packet_io.c
index 1e90d5fdd..ff767fb04 100644
--- a/platform/linux-dpdk/odp_packet_io.c
+++ b/platform/linux-dpdk/odp_packet_io.c
@@ -381,10 +381,21 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len)
pktio_entry_t *pktio_entry = get_pktio_entry(id);
int pkts, i;
- if (pktio_entry == NULL)
+ if (pktio_entry == NULL) {
+ ODP_ERR("No pktio found for this handle: %d\n", id);
return -1;
+ }
odp_ticketlock_lock(&pktio_entry->s.rxl);
+ if (pktio_entry->s.state == STATE_STOP ||
+ pktio_entry->s.param.in_mode == ODP_PKTIN_MODE_DISABLED) {
+ odp_ticketlock_unlock(&pktio_entry->s.rxl);
+ ODP_ERR("Pktio name: %s State: %s In mode: %d\n",
+ pktio_entry->s.name, pktio_entry->s.state ?
+ "stopped" : "started", pktio_entry->s.param.in_mode);
+ rte_errno = EPERM;
+ return -1;
+ }
if (odp_likely(pktio_entry->s.type == ODP_PKTIO_TYPE_DPDK)) {
pkts = recv_pkt_dpdk(&pktio_entry->s.pkt_dpdk, pkt_table, len);
if (pkts == 0) {
@@ -426,11 +437,22 @@ int odp_pktio_send(odp_pktio_t id, odp_packet_t pkt_table[], int len)
pkt_dpdk_t *pkt_dpdk;
int pkts;
- if (pktio_entry == NULL)
+ if (pktio_entry == NULL) {
+ ODP_ERR("No pktio found for this handle: %d\n", id);
return -1;
+ }
pkt_dpdk = &pktio_entry->s.pkt_dpdk;
odp_ticketlock_lock(&pktio_entry->s.txl);
+ if (pktio_entry->s.state == STATE_STOP ||
+ pktio_entry->s.param.out_mode == ODP_PKTOUT_MODE_DISABLED) {
+ odp_ticketlock_unlock(&pktio_entry->s.txl);
+ ODP_ERR("Pktio name: %s State: %s In mode: %d\n",
+ pktio_entry->s.name, pktio_entry->s.state ?
+ "stopped" : "started", pktio_entry->s.param.in_mode);
+ rte_errno = EPERM;
+ return -1;
+ }
if (odp_likely(pktio_entry->s.type == ODP_PKTIO_TYPE_DPDK))
pkts = rte_eth_tx_burst(pkt_dpdk->portid, pkt_dpdk->queueid,
(struct rte_mbuf **)pkt_table, len);