aboutsummaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2016-01-20 10:26:16 +0200
committerMaxim Uvarov <maxim.uvarov@linaro.org>2016-02-08 20:45:24 +0300
commita1103e3048df459b356397e9794659c8cb9f65cc (patch)
tree9bb220a1d06e45752b5581f80d091c8953f567cc /platform
parent07037ebd529eef8547fd9d011fe3edacadd57efd (diff)
linux-generic: pktio: added poll type input queue
Added support for poll type input queues. Signed-off-by: Petri Savolainen <petri.savolainen@nokia.com> Reviewed-and-tested-by: Stuart Haslam <stuart.haslam@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
Diffstat (limited to 'platform')
-rw-r--r--platform/linux-generic/include/odp_queue_internal.h2
-rw-r--r--platform/linux-generic/odp_packet_io.c23
-rw-r--r--platform/linux-generic/odp_queue.c2
3 files changed, 22 insertions, 5 deletions
diff --git a/platform/linux-generic/include/odp_queue_internal.h b/platform/linux-generic/include/odp_queue_internal.h
index 1cc0ed26e..2d349466f 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -76,7 +76,7 @@ struct queue_entry_s {
odp_event_t cmd_ev;
odp_queue_type_t type;
odp_queue_param_t param;
- odp_pktio_t pktin;
+ odp_pktin_queue_t pktin;
odp_pktio_t pktout;
char name[ODP_QUEUE_NAME_LEN];
uint64_t order_in;
diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c
index 1fa611d28..ba776f458 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -499,7 +499,8 @@ int odp_pktio_inq_setdef(odp_pktio_t id, odp_queue_t queue)
/* User polls the input queue */
queue_lock(qentry);
- qentry->s.pktin = id;
+ qentry->s.pktin.pktio = id;
+ qentry->s.pktin.index = 0;
queue_unlock(qentry);
return 0;
@@ -525,7 +526,7 @@ int odp_pktio_inq_remdef(odp_pktio_t id)
qentry = queue_to_qentry(queue);
queue_lock(qentry);
- qentry->s.pktin = ODP_PKTIO_INVALID;
+ qentry->s.pktin = PKTIN_INVALID;
queue_unlock(qentry);
pktio_entry->s.in_queue[0].queue = ODP_QUEUE_INVALID;
@@ -616,7 +617,7 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
if (buf_hdr != NULL)
return buf_hdr;
- pktio = qentry->s.pktin;
+ pktio = qentry->s.pktin.pktio;
pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX);
if (pkts <= 0)
@@ -661,7 +662,7 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num)
if (nbr == num)
return nbr;
- pktio = qentry->s.pktin;
+ pktio = qentry->s.pktin.pktio;
pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX);
if (pkts <= 0)
@@ -1105,6 +1106,20 @@ int odp_pktio_input_queues_config(odp_pktio_t pktio,
destroy_in_queues(entry, i + 1);
return -1;
}
+
+ if (mode == ODP_PKTIN_MODE_POLL) {
+ queue_entry_t *qentry;
+
+ qentry = queue_to_qentry(queue);
+ qentry->s.pktin.index = i;
+ qentry->s.pktin.pktio = pktio;
+
+ qentry->s.enqueue = pktin_enqueue;
+ qentry->s.dequeue = pktin_dequeue;
+ qentry->s.enqueue_multi = pktin_enq_multi;
+ qentry->s.dequeue_multi = pktin_deq_multi;
+ }
+
entry->s.in_queue[i].queue = queue;
} else {
entry->s.in_queue[i].queue = ODP_QUEUE_INVALID;
diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c
index 7f1147825..7817afe22 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -126,6 +126,8 @@ static int queue_init(queue_entry_t *queue, const char *name,
break;
}
+ queue->s.pktin = PKTIN_INVALID;
+
queue->s.head = NULL;
queue->s.tail = NULL;