From: Honnappa Nagarahalli <[email protected]>

interface functions towards internal components use abstract queue type.

Signed-off-by: Honnappa Nagarahalli <[email protected]>
---
/** Email created from pull request 43 (nagarahalli:api-next-mod-queue1)
 ** https://github.com/Linaro/odp/pull/43
 ** Patch: https://github.com/Linaro/odp/pull/43.patch
 ** Base sha: 552817483e9d4b6a84d49960920f1de50029f111
 ** Merge commit sha: 45b775366fd2c3c85b8e1a4c3e661cc26deb5a71
 **/
 .../include/odp_classification_datamodel.h         |   4 +-
 .../include/odp_forward_typedefs_internal.h        |   1 -
 .../linux-generic/include/odp_packet_io_queue.h    |  20 ++-
 .../linux-generic/include/odp_queue_internal.h     |  34 ++---
 platform/linux-generic/include/odp_schedule_if.h   |  84 ++++++-----
 .../include/odp_traffic_mngr_internal.h            |   4 +-
 platform/linux-generic/odp_classification.c        |  10 +-
 platform/linux-generic/odp_init.c                  |   4 +-
 platform/linux-generic/odp_packet_io.c             |  92 ++++++------
 platform/linux-generic/odp_queue.c                 | 161 +++++++++++++--------
 platform/linux-generic/odp_schedule.c              |   8 +-
 platform/linux-generic/odp_schedule_iquery.c       |  11 +-
 platform/linux-generic/odp_schedule_sp.c           |   6 +-
 platform/linux-generic/odp_traffic_mngr.c          |  22 ++-
 platform/linux-generic/pktio/loop.c                |  12 +-
 15 files changed, 259 insertions(+), 214 deletions(-)

diff --git a/platform/linux-generic/include/odp_classification_datamodel.h 
b/platform/linux-generic/include/odp_classification_datamodel.h
index 9df756bf..e673a274 100644
--- a/platform/linux-generic/include/odp_classification_datamodel.h
+++ b/platform/linux-generic/include/odp_classification_datamodel.h
@@ -24,7 +24,7 @@ extern "C" {
 #include <odp_pool_internal.h>
 #include <odp_packet_internal.h>
 #include <odp_packet_io_internal.h>
-#include <odp_queue_internal.h>
+#include <odp_schedule_if.h>
 #include <protocols/ip.h>
 
 /* Maximum Class Of Service Entry */
@@ -85,7 +85,7 @@ typedef struct pmr_term_value {
 Class Of Service
 */
 struct cos_s {
-       queue_entry_t *queue;           /* Associated Queue */
+       queue_t queue;                  /* Associated Queue */
        odp_pool_t pool;                /* Associated Buffer pool */
        union pmr_u *pmr[ODP_PMR_PER_COS_MAX];  /* Chained PMR */
        union cos_u *linked_cos[ODP_PMR_PER_COS_MAX]; /* Chained CoS with PMR*/
diff --git a/platform/linux-generic/include/odp_forward_typedefs_internal.h 
b/platform/linux-generic/include/odp_forward_typedefs_internal.h
index f8832f77..5213db71 100644
--- a/platform/linux-generic/include/odp_forward_typedefs_internal.h
+++ b/platform/linux-generic/include/odp_forward_typedefs_internal.h
@@ -23,7 +23,6 @@ extern "C" {
 #endif
 
 typedef struct odp_buffer_hdr_t odp_buffer_hdr_t;
-typedef union queue_entry_u queue_entry_t;
 
 #ifdef __cplusplus
 }
diff --git a/platform/linux-generic/include/odp_packet_io_queue.h 
b/platform/linux-generic/include/odp_packet_io_queue.h
index d1d4b225..c24dbb63 100644
--- a/platform/linux-generic/include/odp_packet_io_queue.h
+++ b/platform/linux-generic/include/odp_packet_io_queue.h
@@ -18,7 +18,7 @@
 extern "C" {
 #endif
 
-#include <odp_queue_internal.h>
+#include <odp_schedule_if.h>
 #include <odp_buffer_internal.h>
 #include <odp_config_internal.h>
 
@@ -28,20 +28,18 @@ extern "C" {
 ODP_STATIC_ASSERT(ODP_PKTIN_QUEUE_MAX_BURST >= QUEUE_MULTI_MAX,
                  "ODP_PKTIN_DEQ_MULTI_MAX_ERROR");
 
-int pktin_enqueue(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
-odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *queue);
+int pktin_enqueue(queue_t queue, odp_buffer_hdr_t *buf_hdr);
+odp_buffer_hdr_t *pktin_dequeue(queue_t queue);
 
-int pktin_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num);
-int pktin_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num);
+int pktin_enq_multi(queue_t queue, odp_buffer_hdr_t *buf_hdr[], int num);
+int pktin_deq_multi(queue_t queue, odp_buffer_hdr_t *buf_hdr[], int num);
 
 
-int pktout_enqueue(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
-odp_buffer_hdr_t *pktout_dequeue(queue_entry_t *queue);
+int pktout_enqueue(queue_t queue, odp_buffer_hdr_t *buf_hdr);
+odp_buffer_hdr_t *pktout_dequeue(queue_t queue);
 
-int pktout_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
-                    int num);
-int pktout_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
-                    int num);
+int pktout_enq_multi(queue_t queue, odp_buffer_hdr_t *buf_hdr[], int num);
+int pktout_deq_multi(queue_t queue, odp_buffer_hdr_t *buf_hdr[], int num);
 
 #ifdef __cplusplus
 }
diff --git a/platform/linux-generic/include/odp_queue_internal.h 
b/platform/linux-generic/include/odp_queue_internal.h
index 8f46ba2e..418a62eb 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -29,25 +29,12 @@ extern "C" {
 #include <odp/api/ticketlock.h>
 #include <odp_config_internal.h>
 
-#define QUEUE_MULTI_MAX CONFIG_BURST_SIZE
-
 #define QUEUE_STATUS_FREE         0
 #define QUEUE_STATUS_DESTROYED    1
 #define QUEUE_STATUS_READY        2
 #define QUEUE_STATUS_NOTSCHED     3
 #define QUEUE_STATUS_SCHED        4
 
-
-/* forward declaration */
-union queue_entry_u;
-typedef int (*enq_func_t)(union queue_entry_u *, odp_buffer_hdr_t *);
-typedef        odp_buffer_hdr_t *(*deq_func_t)(union queue_entry_u *);
-
-typedef int (*enq_multi_func_t)(union queue_entry_u *,
-                               odp_buffer_hdr_t **, int);
-typedef        int (*deq_multi_func_t)(union queue_entry_u *,
-                               odp_buffer_hdr_t **, int);
-
 struct queue_entry_s {
        odp_ticketlock_t  lock ODP_ALIGNED_CACHE;
 
@@ -62,10 +49,10 @@ struct queue_entry_s {
                odp_atomic_u64_t  lock[CONFIG_QUEUE_MAX_ORD_LOCKS];
        } ordered ODP_ALIGNED_CACHE;
 
-       enq_func_t       enqueue ODP_ALIGNED_CACHE;
-       deq_func_t       dequeue;
-       enq_multi_func_t enqueue_multi;
-       deq_multi_func_t dequeue_multi;
+       queue_enq_fn_t       enqueue ODP_ALIGNED_CACHE;
+       queue_deq_fn_t       dequeue;
+       queue_enq_multi_fn_t enqueue_multi;
+       queue_deq_multi_fn_t dequeue_multi;
 
        uint32_t          index;
        odp_queue_t       handle;
@@ -76,19 +63,18 @@ struct queue_entry_s {
        char              name[ODP_QUEUE_NAME_LEN];
 };
 
-union queue_entry_u {
+typedef union queue_entry_u {
        struct queue_entry_s s;
        uint8_t pad[ROUNDUP_CACHE_LINE(sizeof(struct queue_entry_s))];
-};
-
+} queue_entry_t;
 
 queue_entry_t *get_qentry(uint32_t queue_id);
 
-int _queue_enq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
-odp_buffer_hdr_t *_queue_deq(queue_entry_t *queue);
+int _queue_enq(queue_t handle, odp_buffer_hdr_t *buf_hdr);
+odp_buffer_hdr_t *_queue_deq(queue_t handle);
 
-int _queue_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num);
-int _queue_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num);
+int _queue_enq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], int num);
+int _queue_deq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], int num);
 
 void queue_lock(queue_entry_t *queue);
 void queue_unlock(queue_entry_t *queue);
diff --git a/platform/linux-generic/include/odp_schedule_if.h 
b/platform/linux-generic/include/odp_schedule_if.h
index f3989ef8..e6861064 100644
--- a/platform/linux-generic/include/odp_schedule_if.h
+++ b/platform/linux-generic/include/odp_schedule_if.h
@@ -12,9 +12,11 @@ extern "C" {
 #endif
 
 #include <odp/api/queue.h>
-#include <odp_queue_internal.h>
 #include <odp/api/schedule.h>
 #include <odp/api/packet_io.h>
+#include <odp_forward_typedefs_internal.h>
+
+#define QUEUE_MULTI_MAX CONFIG_BURST_SIZE
 
 /* Queue API functions */
 typedef struct {
@@ -24,14 +26,14 @@ typedef struct {
        odp_queue_t (*queue_lookup)(const char *name);
        int (*queue_capability)(odp_queue_capability_t *capa);
        int (*queue_context_set)(odp_queue_t queue, void *context,
-                                    uint32_t len);
+                                uint32_t len);
        void *(*queue_context)(odp_queue_t queue);
        int (*queue_enq)(odp_queue_t queue, odp_event_t ev);
        int (*queue_enq_multi)(odp_queue_t queue, const odp_event_t events[],
                               int num);
        odp_event_t (*queue_deq)(odp_queue_t queue);
        int (*queue_deq_multi)(odp_queue_t queue, odp_event_t events[],
-                                  int num);
+                              int num);
        odp_queue_type_t (*queue_type)(odp_queue_t queue);
        odp_schedule_sync_t (*queue_sched_type)(odp_queue_t queue);
        odp_schedule_prio_t (*queue_sched_prio)(odp_queue_t queue);
@@ -42,40 +44,50 @@ typedef struct {
        int (*queue_info)(odp_queue_t queue, odp_queue_info_t *info);
 } queue_api_t;
 
-/* Internal abstract queue type */
-typedef void* queue_t;
-
-typedef int (*enq_func_t)(union queue_entry_u *, odp_buffer_hdr_t *);
-typedef        odp_buffer_hdr_t *(*deq_func_t)(union queue_entry_u *);
-
-typedef int (*enq_multi_func_t)(union queue_entry_u *,
-                               odp_buffer_hdr_t **, int);
-typedef        int (*deq_multi_func_t)(union queue_entry_u *,
-                               odp_buffer_hdr_t **, int);
+/* Internal abstract queue handle */
+typedef void *queue_t;
+
+typedef        int (*queue_init_global_fn_t)(void);
+typedef int (*queue_term_global_fn_t)(void);
+typedef queue_t (*queue_from_ext_fn_t)(odp_queue_t handle);
+typedef odp_queue_t (*queue_to_ext_fn_t)(queue_t handle);
+typedef int (*queue_enq_fn_t)(queue_t handle, odp_buffer_hdr_t *);
+typedef int (*queue_enq_multi_fn_t)(queue_t handle, odp_buffer_hdr_t **, int);
+typedef        odp_buffer_hdr_t *(*queue_deq_fn_t)(queue_t handle);
+typedef        int (*queue_deq_multi_fn_t)(queue_t handle, odp_buffer_hdr_t 
**, int);
+typedef odp_pktout_queue_t (*queue_get_pktout_fn_t)(queue_t handle);
+typedef void (*queue_set_pktout_fn_t)(queue_t handle, odp_pktio_t pktio,
+                                     int index);
+typedef odp_pktin_queue_t (*queue_get_pktin_fn_t)(queue_t handle);
+typedef void (*queue_set_pktin_fn_t)(queue_t handle, odp_pktio_t pktio,
+                                    int index);
+typedef void (*queue_set_enq_fn_t)(queue_t handle, queue_enq_fn_t func);
+typedef void (*queue_set_enq_multi_fn_t)(queue_t handle,
+                                        queue_enq_multi_fn_t func);
+typedef void (*queue_set_deq_fn_t)(queue_t handle, queue_deq_fn_t func);
+typedef void (*queue_set_deq_multi_fn_t)(queue_t handle,
+                                        queue_deq_multi_fn_t func);
+typedef void (*queue_set_type_fn_t)(queue_t handle, odp_queue_type_t type);
 
 /* Queue functions towards other internal components */
 typedef struct {
-       int (*queue_init_global)(void);
-       int (*queue_term_global)(void);
-       int (*queue_enq)(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
-       int (*queue_enq_multi)(queue_entry_t *queue,
-                              odp_buffer_hdr_t *buf_hdr[], int num);
-       odp_buffer_hdr_t *(*queue_deq)(queue_entry_t *queue);
-       int (*queue_deq_multi)(queue_entry_t *queue,
-                              odp_buffer_hdr_t *buf_hdr[], int num);
-       odp_pktout_queue_t (*queue_get_pktout)(queue_entry_t *queue);
-       void (*queue_set_pktout)(queue_entry_t *queue, odp_pktio_t pktio,
-                                int index);
-       odp_pktin_queue_t (*queue_get_pktin)(queue_entry_t *queue);
-       void (*queue_set_pktin)(queue_entry_t *queue, odp_pktio_t pktio,
-                               int index);
-       void (*queue_set_enq_func)(queue_entry_t *queue, enq_func_t func);
-       void (*queue_set_enq_multi_func)(queue_entry_t *queue,
-                                        enq_multi_func_t func);
-       void (*queue_set_deq_func)(queue_entry_t *queue, deq_func_t func);
-       void (*queue_set_deq_multi_func)(queue_entry_t *queue,
-                                        deq_multi_func_t func);
-       void (*queue_set_type)(queue_entry_t *queue, odp_queue_type_t type);
+       queue_init_global_fn_t init_global;
+       queue_term_global_fn_t term_global;
+       queue_from_ext_fn_t from_ext;
+       queue_to_ext_fn_t to_ext;
+       queue_enq_fn_t enq;
+       queue_enq_multi_fn_t enq_multi;
+       queue_deq_fn_t deq;
+       queue_deq_multi_fn_t deq_multi;
+       queue_get_pktout_fn_t get_pktout;
+       queue_set_pktout_fn_t set_pktout;
+       queue_get_pktin_fn_t get_pktin;
+       queue_set_pktin_fn_t set_pktin;
+       queue_set_enq_fn_t set_enq_fn;
+       queue_set_enq_multi_fn_t set_enq_multi_fn;
+       queue_set_deq_fn_t set_deq_fn;
+       queue_set_deq_multi_fn_t set_deq_multi_fn;
+       queue_set_type_fn_t set_type;
 } queue_fn_t;
 
 extern const queue_fn_t *queue_fn;
@@ -91,7 +103,7 @@ typedef int (*schedule_init_queue_fn_t)(uint32_t queue_index,
 typedef void (*schedule_destroy_queue_fn_t)(uint32_t queue_index);
 typedef int (*schedule_sched_queue_fn_t)(uint32_t queue_index);
 typedef int (*schedule_unsched_queue_fn_t)(uint32_t queue_index);
-typedef int (*schedule_ord_enq_multi_fn_t)(uint32_t queue_index,
+typedef int (*schedule_ord_enq_multi_fn_t)(queue_t handle,
                                           void *buf_hdr[], int num, int *ret);
 typedef int (*schedule_init_global_fn_t)(void);
 typedef int (*schedule_term_global_fn_t)(void);
@@ -100,7 +112,7 @@ typedef int (*schedule_term_local_fn_t)(void);
 typedef void (*schedule_order_lock_fn_t)(void);
 typedef void (*schedule_order_unlock_fn_t)(void);
 typedef unsigned (*schedule_max_ordered_locks_fn_t)(void);
-typedef void (*schedule_save_context_fn_t)(queue_entry_t *queue);
+typedef void (*schedule_save_context_fn_t)(queue_t handle);
 
 typedef struct schedule_fn_t {
        schedule_pktio_start_fn_t   pktio_start;
diff --git a/platform/linux-generic/include/odp_traffic_mngr_internal.h 
b/platform/linux-generic/include/odp_traffic_mngr_internal.h
index 9f821fe4..6557fdd7 100644
--- a/platform/linux-generic/include/odp_traffic_mngr_internal.h
+++ b/platform/linux-generic/include/odp_traffic_mngr_internal.h
@@ -29,7 +29,7 @@ extern "C" {
 #include <odp_internal.h>
 #include <odp_debug_internal.h>
 #include <odp_buffer_internal.h>
-#include <odp_queue_internal.h>
+#include <odp_schedule_if.h>
 #include <odp_packet_internal.h>
 
 typedef struct stat  file_stat_t;
@@ -286,7 +286,7 @@ struct tm_queue_obj_s {
        uint8_t tm_idx;
        uint8_t delayed_cnt;
        uint8_t blocked_cnt;
-       queue_entry_t tm_qentry;
+       queue_t tm_qentry;
 };
 
 struct tm_node_obj_s {
diff --git a/platform/linux-generic/odp_classification.c 
b/platform/linux-generic/odp_classification.c
index 7ebc47d7..5f153e73 100644
--- a/platform/linux-generic/odp_classification.c
+++ b/platform/linux-generic/odp_classification.c
@@ -157,14 +157,14 @@ int odp_cls_capability(odp_cls_capability_t *capability)
 odp_cos_t odp_cls_cos_create(const char *name, odp_cls_cos_param_t *param)
 {
        int i, j;
-       queue_entry_t *queue;
+       queue_t queue;
        odp_cls_drop_t drop_policy;
 
        /* Packets are dropped if Queue or Pool is invalid*/
        if (param->queue == ODP_QUEUE_INVALID)
                queue = NULL;
        else
-               queue = queue_to_qentry(param->queue);
+               queue = queue_fn->from_ext(param->queue);
 
        drop_policy = param->drop_policy;
 
@@ -266,7 +266,7 @@ int odp_cos_queue_set(odp_cos_t cos_id, odp_queue_t 
queue_id)
        if (queue_id == ODP_QUEUE_INVALID)
                cos->s.queue = NULL;
        else
-               cos->s.queue = queue_to_qentry(queue_id);
+               cos->s.queue = queue_fn->from_ext(queue_id);
        return 0;
 }
 
@@ -282,7 +282,7 @@ odp_queue_t odp_cos_queue(odp_cos_t cos_id)
        if (!cos->s.queue)
                return ODP_QUEUE_INVALID;
 
-       return cos->s.queue->s.handle;
+       return queue_fn->to_ext(cos->s.queue);
 }
 
 int odp_cos_drop_set(odp_cos_t cos_id, odp_cls_drop_t drop_policy)
@@ -846,7 +846,7 @@ int cls_classify_packet(pktio_entry_t *entry, const uint8_t 
*base,
 
        *pool = cos->s.pool;
        pkt_hdr->p.input_flags.dst_queue = 1;
-       pkt_hdr->dst_queue = cos->s.queue->s.handle;
+       pkt_hdr->dst_queue = queue_fn->to_ext(cos->s.queue);
 
        return 0;
 }
diff --git a/platform/linux-generic/odp_init.c 
b/platform/linux-generic/odp_init.c
index 73ba65e6..46597567 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -218,7 +218,7 @@ int odp_init_global(odp_instance_t *instance,
        }
        stage = POOL_INIT;
 
-       if (queue_fn->queue_init_global()) {
+       if (queue_fn->init_global()) {
                ODP_ERR("ODP queue init failed.\n");
                goto init_failed;
        }
@@ -346,7 +346,7 @@ int _odp_term_global(enum init_stage stage)
                /* Fall through */
 
        case QUEUE_INIT:
-               if (queue_fn->queue_term_global()) {
+               if (queue_fn->term_global()) {
                        ODP_ERR("ODP queue term failed.\n");
                        rc = -1;
                }
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index 19ff5a28..3776aed7 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -16,7 +16,6 @@
 #include <odp/api/shared_memory.h>
 #include <odp_packet_socket.h>
 #include <odp_config_internal.h>
-#include <odp_queue_internal.h>
 #include <odp_schedule_if.h>
 #include <odp_classification_internal.h>
 #include <odp_debug_internal.h>
@@ -568,11 +567,11 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
                buf_hdr = buf_hdl_to_hdr(buf);
 
                if (pkt_hdr->p.input_flags.dst_queue) {
-                       queue_entry_t *dst_queue;
+                       queue_t dst_queue;
                        int ret;
 
-                       dst_queue = queue_to_qentry(pkt_hdr->dst_queue);
-                       ret = queue_fn->queue_enq(dst_queue, buf_hdr);
+                       dst_queue = queue_fn->from_ext(pkt_hdr->dst_queue);
+                       ret = queue_fn->enq(dst_queue, buf_hdr);
                        if (ret < 0)
                                odp_packet_free(pkt);
                        continue;
@@ -582,45 +581,42 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
        return num_rx;
 }
 
-int pktout_enqueue(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr)
+int pktout_enqueue(queue_t qentry, odp_buffer_hdr_t *buf_hdr)
 {
        odp_packet_t pkt = _odp_packet_from_buffer(buf_hdr->handle.handle);
        int len = 1;
        int nbr;
 
-       if (sched_fn->ord_enq_multi(qentry->s.index, (void **)buf_hdr, len,
-                                   &nbr))
+       if (sched_fn->ord_enq_multi(qentry, (void **)buf_hdr, len, &nbr))
                return (nbr == len ? 0 : -1);
 
-       nbr = odp_pktout_send(queue_fn->queue_get_pktout(qentry), &pkt, len);
+       nbr = odp_pktout_send(queue_fn->get_pktout(qentry), &pkt, len);
        return (nbr == len ? 0 : -1);
 }
 
-odp_buffer_hdr_t *pktout_dequeue(queue_entry_t *qentry ODP_UNUSED)
+odp_buffer_hdr_t *pktout_dequeue(queue_t qentry ODP_UNUSED)
 {
        ODP_ABORT("attempted dequeue from a pktout queue");
        return NULL;
 }
 
-int pktout_enq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[],
-                    int num)
+int pktout_enq_multi(queue_t qentry, odp_buffer_hdr_t *buf_hdr[], int num)
 {
        odp_packet_t pkt_tbl[QUEUE_MULTI_MAX];
        int nbr;
        int i;
 
-       if (sched_fn->ord_enq_multi(qentry->s.index, (void **)buf_hdr, num,
-                                   &nbr))
+       if (sched_fn->ord_enq_multi(qentry, (void **)buf_hdr, num, &nbr))
                return nbr;
 
        for (i = 0; i < num; ++i)
                pkt_tbl[i] = _odp_packet_from_buffer(buf_hdr[i]->handle.handle);
 
-       nbr = odp_pktout_send(queue_fn->queue_get_pktout(qentry), pkt_tbl, num);
+       nbr = odp_pktout_send(queue_fn->get_pktout(qentry), pkt_tbl, num);
        return nbr;
 }
 
-int pktout_deq_multi(queue_entry_t *qentry ODP_UNUSED,
+int pktout_deq_multi(queue_t qentry ODP_UNUSED,
                     odp_buffer_hdr_t *buf_hdr[] ODP_UNUSED,
                     int num ODP_UNUSED)
 {
@@ -628,49 +624,49 @@ int pktout_deq_multi(queue_entry_t *qentry ODP_UNUSED,
        return 0;
 }
 
-int pktin_enqueue(queue_entry_t *qentry ODP_UNUSED,
+int pktin_enqueue(queue_t qentry ODP_UNUSED,
                  odp_buffer_hdr_t *buf_hdr ODP_UNUSED)
 {
        ODP_ABORT("attempted enqueue to a pktin queue");
        return -1;
 }
 
-odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
+odp_buffer_hdr_t *pktin_dequeue(queue_t qentry)
 {
        odp_buffer_hdr_t *buf_hdr;
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int pkts;
 
-       buf_hdr = queue_fn->queue_deq(qentry);
+       buf_hdr = queue_fn->deq(qentry);
        if (buf_hdr != NULL)
                return buf_hdr;
 
-       pkts = pktin_recv_buf(queue_fn->queue_get_pktin(qentry),
+       pkts = pktin_recv_buf(queue_fn->get_pktin(qentry),
                              hdr_tbl, QUEUE_MULTI_MAX);
 
        if (pkts <= 0)
                return NULL;
 
        if (pkts > 1)
-               queue_fn->queue_enq_multi(qentry, &hdr_tbl[1], pkts - 1);
+               queue_fn->enq_multi(qentry, &hdr_tbl[1], pkts - 1);
        buf_hdr = hdr_tbl[0];
        return buf_hdr;
 }
 
-int pktin_enq_multi(queue_entry_t *qentry ODP_UNUSED,
+int pktin_enq_multi(queue_t qentry ODP_UNUSED,
                    odp_buffer_hdr_t *buf_hdr[] ODP_UNUSED, int num ODP_UNUSED)
 {
        ODP_ABORT("attempted enqueue to a pktin queue");
        return 0;
 }
 
-int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int 
num)
+int pktin_deq_multi(queue_t qentry, odp_buffer_hdr_t *buf_hdr[], int num)
 {
        int nbr;
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int pkts, i, j;
 
-       nbr = queue_fn->queue_deq_multi(qentry, buf_hdr, num);
+       nbr = queue_fn->deq_multi(qentry, buf_hdr, num);
        if (odp_unlikely(nbr > num))
                ODP_ABORT("queue_deq_multi req: %d, returned %d\n", num, nbr);
 
@@ -680,7 +676,7 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t 
*buf_hdr[], int num)
        if (nbr == num)
                return nbr;
 
-       pkts = pktin_recv_buf(queue_fn->queue_get_pktin(qentry),
+       pkts = pktin_recv_buf(queue_fn->get_pktin(qentry),
                              hdr_tbl, QUEUE_MULTI_MAX);
        if (pkts <= 0)
                return nbr;
@@ -693,7 +689,7 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t 
*buf_hdr[], int num)
                hdr_tbl[j] = hdr_tbl[i];
 
        if (j)
-               queue_fn->queue_enq_multi(qentry, hdr_tbl, j);
+               queue_fn->enq_multi(qentry, hdr_tbl, j);
        return nbr;
 }
 
@@ -715,7 +711,7 @@ int sched_cb_pktin_poll(int pktio_index, int num_queue, int 
index[])
        }
 
        for (idx = 0; idx < num_queue; idx++) {
-               queue_entry_t *qentry;
+               queue_t qentry;
                odp_queue_t queue;
                odp_pktin_queue_t pktin = entry->s.in_queue[index[idx]].pktin;
 
@@ -730,8 +726,8 @@ int sched_cb_pktin_poll(int pktio_index, int num_queue, int 
index[])
                }
 
                queue = entry->s.in_queue[index[idx]].queue;
-               qentry = queue_to_qentry(queue);
-               queue_fn->queue_enq_multi(qentry, hdr_tbl, num);
+               qentry = queue_fn->from_ext(queue);
+               queue_fn->enq_multi(qentry, hdr_tbl, num);
        }
 
        return 0;
@@ -1275,18 +1271,16 @@ int odp_pktin_queue_config(odp_pktio_t pktio,
                        }
 
                        if (mode == ODP_PKTIN_MODE_QUEUE) {
-                               queue_entry_t *qentry;
-
-                               qentry = queue_to_qentry(queue);
-                               queue_fn->queue_set_pktin(qentry, pktio, i);
-                               queue_fn->queue_set_enq_func(qentry,
-                                                            pktin_enqueue);
-                               queue_fn->queue_set_deq_func(qentry,
-                                                            pktin_dequeue);
-                               queue_fn->queue_set_enq_multi_func(qentry,
-                                                        pktin_enq_multi);
-                               queue_fn->queue_set_deq_multi_func(qentry,
-                                                        pktin_deq_multi);
+                               queue_t qentry;
+
+                               qentry = queue_fn->from_ext(queue);
+                               queue_fn->set_pktin(qentry, pktio, i);
+                               queue_fn->set_enq_fn(qentry, pktin_enqueue);
+                               queue_fn->set_deq_fn(qentry, pktin_dequeue);
+                               queue_fn->set_enq_multi_fn(qentry,
+                                                          pktin_enq_multi);
+                               queue_fn->set_deq_multi_fn(qentry,
+                                                          pktin_deq_multi);
                        }
 
                        entry->s.in_queue[i].queue = queue;
@@ -1383,7 +1377,7 @@ int odp_pktout_queue_config(odp_pktio_t pktio,
                for (i = 0; i < num_queues; i++) {
                        odp_queue_t queue;
                        odp_queue_param_t queue_param;
-                       queue_entry_t *qentry;
+                       queue_t qentry;
                        char name[ODP_QUEUE_NAME_LEN];
                        int pktio_id = pktio_to_id(pktio);
 
@@ -1403,18 +1397,14 @@ int odp_pktout_queue_config(odp_pktio_t pktio,
                                return -1;
                        }
 
-                       qentry = queue_to_qentry(queue);
-                       queue_fn->queue_set_pktout(qentry, pktio, i);
+                       qentry = queue_fn->from_ext(queue);
+                       queue_fn->set_pktout(qentry, pktio, i);
 
                        /* Override default enqueue / dequeue functions */
-                       queue_fn->queue_set_enq_func(qentry,
-                                                    pktout_enqueue);
-                       queue_fn->queue_set_deq_func(qentry,
-                                                    pktout_dequeue);
-                       queue_fn->queue_set_enq_multi_func(qentry,
-                                                          pktout_enq_multi);
-                       queue_fn->queue_set_deq_multi_func(qentry,
-                                                          pktout_deq_multi);
+                       queue_fn->set_enq_fn(qentry, pktout_enqueue);
+                       queue_fn->set_deq_fn(qentry, pktout_dequeue);
+                       queue_fn->set_enq_multi_fn(qentry, pktout_enq_multi);
+                       queue_fn->set_deq_multi_fn(qentry, pktout_deq_multi);
 
                        entry->s.out_queue[i].queue = queue;
                }
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index 06d2e263..a2255c51 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -226,7 +226,8 @@ static int queue_lock_count(odp_queue_t handle)
                (int)queue->s.param.sched.lock_count : -1;
 }
 
-static odp_queue_t queue_create(const char *name, const odp_queue_param_t 
*param)
+static odp_queue_t queue_create(const char *name,
+                               const odp_queue_param_t *param)
 {
        uint32_t i;
        queue_entry_t *queue;
@@ -344,7 +345,7 @@ static int queue_destroy(odp_queue_t handle)
 }
 
 static int queue_context_set(odp_queue_t handle, void *context,
-                         uint32_t len ODP_UNUSED)
+                            uint32_t len ODP_UNUSED)
 {
        queue_entry_t *queue;
        queue = queue_to_qentry(handle);
@@ -384,15 +385,16 @@ static odp_queue_t queue_lookup(const char *name)
        return ODP_QUEUE_INVALID;
 }
 
-static inline int enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
+static inline int enq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[],
                            int num)
 {
        int sched = 0;
        int i, ret;
+       queue_entry_t *queue;
        odp_buffer_hdr_t *hdr, *tail, *next_hdr;
 
-       if (sched_fn->ord_enq_multi(queue->s.index, (void **)buf_hdr, num,
-                       &ret))
+       queue = (queue_entry_t *)handle;
+       if (sched_fn->ord_enq_multi(handle, (void **)buf_hdr, num, &ret))
                return ret;
 
        /* Optimize the common case of single enqueue */
@@ -460,16 +462,16 @@ static inline int enq_multi(queue_entry_t *queue, 
odp_buffer_hdr_t *buf_hdr[],
        return num; /* All events enqueued */
 }
 
-int _queue_enq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num)
+int _queue_enq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], int num)
 {
-       return enq_multi(queue, buf_hdr, num);
+       return enq_multi(handle, buf_hdr, num);
 }
 
-int _queue_enq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr)
+int _queue_enq(queue_t handle, odp_buffer_hdr_t *buf_hdr)
 {
        int ret;
 
-       ret = enq_multi(queue, &buf_hdr, 1);
+       ret = enq_multi(handle, &buf_hdr, 1);
 
        if (ret == 1)
                return 0;
@@ -491,7 +493,7 @@ static int queue_enq_multi(odp_queue_t handle, const 
odp_event_t ev[], int num)
        for (i = 0; i < num; i++)
                buf_hdr[i] = buf_hdl_to_hdr(odp_buffer_from_event(ev[i]));
 
-       return num == 0 ? 0 : queue->s.enqueue_multi(queue, buf_hdr,
+       return num == 0 ? 0 : queue->s.enqueue_multi((queue_t)queue, buf_hdr,
                                                     num);
 }
 
@@ -503,16 +505,18 @@ static int queue_enq(odp_queue_t handle, odp_event_t ev)
        queue   = queue_to_qentry(handle);
        buf_hdr = buf_hdl_to_hdr(odp_buffer_from_event(ev));
 
-       return queue->s.enqueue(queue, buf_hdr);
+       return queue->s.enqueue((queue_t)queue, buf_hdr);
 }
 
-static inline int deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[],
+static inline int deq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[],
                            int num)
 {
        odp_buffer_hdr_t *hdr, *next;
        int i, j;
+       queue_entry_t *queue;
        int updated = 0;
 
+       queue = (queue_entry_t *)handle;
        LOCK(&queue->s.lock);
        if (odp_unlikely(queue->s.status < QUEUE_STATUS_READY)) {
                /* Bad queue, or queue has been destroyed.
@@ -571,24 +575,24 @@ static inline int deq_multi(queue_entry_t *queue, 
odp_buffer_hdr_t *buf_hdr[],
                queue->s.tail = NULL;
 
        if (queue->s.type == ODP_QUEUE_TYPE_SCHED)
-               sched_fn->save_context(queue);
+               sched_fn->save_context(handle);
 
        UNLOCK(&queue->s.lock);
 
        return i;
 }
 
-int _queue_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num)
+int _queue_deq_multi(queue_t handle, odp_buffer_hdr_t *buf_hdr[], int num)
 {
-       return deq_multi(queue, buf_hdr, num);
+       return deq_multi(handle, buf_hdr, num);
 }
 
-odp_buffer_hdr_t *_queue_deq(queue_entry_t *queue)
+odp_buffer_hdr_t *_queue_deq(queue_t handle)
 {
        odp_buffer_hdr_t *buf_hdr = NULL;
        int ret;
 
-       ret = deq_multi(queue, &buf_hdr, 1);
+       ret = deq_multi(handle, &buf_hdr, 1);
 
        if (ret == 1)
                return buf_hdr;
@@ -607,7 +611,7 @@ static int queue_deq_multi(odp_queue_t handle, odp_event_t 
events[], int num)
 
        queue = queue_to_qentry(handle);
 
-       ret = queue->s.dequeue_multi(queue, buf_hdr, num);
+       ret = queue->s.dequeue_multi((queue_t)queue, buf_hdr, num);
 
        for (i = 0; i < ret; i++)
                events[i] = odp_buffer_to_event(buf_hdr[i]->handle.handle);
@@ -622,7 +626,7 @@ static odp_event_t queue_deq(odp_queue_t handle)
        odp_buffer_hdr_t *buf_hdr;
 
        queue   = queue_to_qentry(handle);
-       buf_hdr = queue->s.dequeue(queue);
+       buf_hdr = queue->s.dequeue((queue_t)queue);
 
        if (buf_hdr)
                return odp_buffer_to_event(buf_hdr->handle.handle);
@@ -730,7 +734,7 @@ int sched_cb_queue_deq_multi(uint32_t queue_index, 
odp_event_t ev[], int num)
        queue_entry_t *qe = get_qentry(queue_index);
        odp_buffer_hdr_t *buf_hdr[num];
 
-       ret = deq_multi(qe, buf_hdr, num);
+       ret = deq_multi((queue_t)qe, buf_hdr, num);
 
        if (ret > 0)
                for (i = 0; i < ret; i++)
@@ -770,53 +774,94 @@ static uint64_t queue_to_u64(odp_queue_t hdl)
        return _odp_pri(hdl);
 }
 
-static odp_pktout_queue_t queue_get_pktout(queue_entry_t *queue)
+static odp_pktout_queue_t queue_get_pktout(queue_t handle)
+{
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       return qentry->s.pktout;
+}
+
+static void queue_set_pktout(queue_t handle, odp_pktio_t pktio, int index)
 {
-       return queue->s.pktout;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.pktout.pktio = pktio;
+       qentry->s.pktout.index = index;
+}
+
+static odp_pktin_queue_t queue_get_pktin(queue_t handle)
+{
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       return qentry->s.pktin;
 }
 
-static void queue_set_pktout(queue_entry_t *queue, odp_pktio_t pktio, int 
index)
+static void queue_set_pktin(queue_t handle, odp_pktio_t pktio, int index)
 {
-       queue->s.pktout.pktio = pktio;
-       queue->s.pktout.index = index;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.pktin.pktio = pktio;
+       qentry->s.pktin.index = index;
 }
 
-static odp_pktin_queue_t queue_get_pktin(queue_entry_t *queue)
+static void queue_set_enq_func(queue_t handle, queue_enq_fn_t func)
 {
-       return queue->s.pktin;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.enqueue = func;
 }
 
-static void queue_set_pktin(queue_entry_t *queue, odp_pktio_t pktio, int index)
+static void queue_set_enq_multi_func(queue_t handle, queue_enq_multi_fn_t func)
 {
-       queue->s.pktin.pktio = pktio;
-       queue->s.pktin.index = index;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.enqueue_multi = func;
 }
 
-static void queue_set_enq_func(queue_entry_t *queue, enq_func_t func)
+static void queue_set_deq_func(queue_t handle, queue_deq_fn_t func)
 {
-       queue->s.enqueue = func;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.dequeue = func;
 }
 
-static void queue_set_enq_multi_func(queue_entry_t *queue,
-                                    enq_multi_func_t func)
+static void queue_set_deq_multi_func(queue_t handle, queue_deq_multi_fn_t func)
 {
-       queue->s.enqueue_multi = func;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.dequeue_multi = func;
 }
 
-static void queue_set_deq_func(queue_entry_t *queue, deq_func_t func)
+static void queue_set_type(queue_t handle, odp_queue_type_t type)
 {
-       queue->s.dequeue = func;
+       queue_entry_t *qentry;
+
+       qentry = (queue_entry_t *)handle;
+       qentry->s.type = type;
 }
 
-static void queue_set_deq_multi_func(queue_entry_t *queue,
-                                           deq_multi_func_t func)
+static queue_t queue_from_ext(odp_queue_t handle)
 {
-       queue->s.dequeue_multi = func;
+       uint32_t queue_id;
+
+       queue_id = queue_to_id(handle);
+       return get_qentry(queue_id);
 }
 
-static void queue_set_type(queue_entry_t *queue, odp_queue_type_t type)
+static odp_queue_t queue_to_ext(queue_t handle)
 {
-       queue->s.type = type;
+       queue_entry_t *queue;
+
+       queue = (queue_entry_t *)handle;
+       return queue->s.handle;
 }
 
 /* API functions */
@@ -843,19 +888,21 @@ queue_api_t queue_default_api = {
 
 /* Functions towards internal components */
 queue_fn_t queue_default_fn = {
-       .queue_init_global = queue_init_global,
-       .queue_term_global = queue_term_global,
-       .queue_enq = _queue_enq,
-       .queue_enq_multi = _queue_enq_multi,
-       .queue_deq = _queue_deq,
-       .queue_deq_multi = _queue_deq_multi,
-       .queue_get_pktout = queue_get_pktout,
-       .queue_set_pktout = queue_set_pktout,
-       .queue_get_pktin = queue_get_pktin,
-       .queue_set_pktin = queue_set_pktin,
-       .queue_set_enq_func = queue_set_enq_func,
-       .queue_set_enq_multi_func = queue_set_enq_multi_func,
-       .queue_set_deq_func = queue_set_deq_func,
-       .queue_set_deq_multi_func = queue_set_deq_multi_func,
-       .queue_set_type = queue_set_type
+       .init_global = queue_init_global,
+       .term_global = queue_term_global,
+       .from_ext = queue_from_ext,
+       .to_ext = queue_to_ext,
+       .enq = _queue_enq,
+       .enq_multi = _queue_enq_multi,
+       .deq = _queue_deq,
+       .deq_multi = _queue_deq_multi,
+       .get_pktout = queue_get_pktout,
+       .set_pktout = queue_set_pktout,
+       .get_pktin = queue_get_pktin,
+       .set_pktin = queue_set_pktin,
+       .set_enq_fn = queue_set_enq_func,
+       .set_enq_multi_fn = queue_set_enq_multi_func,
+       .set_deq_fn = queue_set_deq_func,
+       .set_deq_multi_fn = queue_set_deq_multi_func,
+       .set_type = queue_set_type
 };
diff --git a/platform/linux-generic/odp_schedule.c 
b/platform/linux-generic/odp_schedule.c
index 0f5bd52b..3d82a5c7 100644
--- a/platform/linux-generic/odp_schedule.c
+++ b/platform/linux-generic/odp_schedule.c
@@ -646,7 +646,7 @@ static inline void ordered_stash_release(void)
                buf_hdr = sched_local.ordered.stash[i].buf_hdr;
                num = sched_local.ordered.stash[i].num;
 
-               queue_fn->queue_enq_multi(queue, buf_hdr, num);
+               queue_fn->enq_multi((queue_t)queue, buf_hdr, num);
        }
        sched_local.ordered.stash_num = 0;
 }
@@ -712,12 +712,12 @@ static inline int copy_events(odp_event_t out_ev[], 
unsigned int max)
        return i;
 }
 
-static int schedule_ord_enq_multi(uint32_t queue_index, void *buf_hdr[],
+static int schedule_ord_enq_multi(queue_t handle, void *buf_hdr[],
                                  int num, int *ret)
 {
        int i;
        uint32_t stash_num = sched_local.ordered.stash_num;
-       queue_entry_t *dst_queue = get_qentry(queue_index);
+       queue_entry_t *dst_queue = (queue_entry_t *)(handle);
        queue_entry_t *src_queue = sched_local.ordered.src_queue;
 
        if (!sched_local.ordered.src_queue || sched_local.ordered.in_order)
@@ -1347,7 +1347,7 @@ static int schedule_num_grps(void)
        return NUM_SCHED_GRPS;
 }
 
-static void schedule_save_context(queue_entry_t *queue ODP_UNUSED)
+static void schedule_save_context(queue_t handle ODP_UNUSED)
 {
 }
 
diff --git a/platform/linux-generic/odp_schedule_iquery.c 
b/platform/linux-generic/odp_schedule_iquery.c
index ac5cdacd..99185e6d 100644
--- a/platform/linux-generic/odp_schedule_iquery.c
+++ b/platform/linux-generic/odp_schedule_iquery.c
@@ -1108,7 +1108,7 @@ static inline void ordered_stash_release(void)
                buf_hdr = thread_local.ordered.stash[i].buf_hdr;
                num = thread_local.ordered.stash[i].num;
 
-               queue_fn->queue_enq_multi(queue, buf_hdr, num);
+               queue_fn->enq_multi((queue_t)queue, buf_hdr, num);
        }
        thread_local.ordered.stash_num = 0;
 }
@@ -1159,12 +1159,12 @@ static inline void schedule_release_context(void)
                schedule_release_atomic();
 }
 
-static int schedule_ord_enq_multi(uint32_t queue_index, void *buf_hdr[],
+static int schedule_ord_enq_multi(queue_t handle, void *buf_hdr[],
                                  int num, int *ret)
 {
        int i;
        uint32_t stash_num = thread_local.ordered.stash_num;
-       queue_entry_t *dst_queue = get_qentry(queue_index);
+       queue_entry_t *dst_queue = (queue_entry_t *)(handle);
        queue_entry_t *src_queue = thread_local.ordered.src_queue;
 
        if (!thread_local.ordered.src_queue || thread_local.ordered.in_order)
@@ -1264,8 +1264,11 @@ static unsigned schedule_max_ordered_locks(void)
        return MAX_ORDERED_LOCKS_PER_QUEUE;
 }
 
-static void schedule_save_context(queue_entry_t *queue)
+static void schedule_save_context(queue_t handle)
 {
+       queue_entry_t *queue;
+
+       queue = (queue_entry_t *)handle;
        if (queue->s.param.sched.sync == ODP_SCHED_SYNC_ATOMIC) {
                thread_local.atomic = &sched->availables[queue->s.index];
        } else if (queue->s.param.sched.sync == ODP_SCHED_SYNC_ORDERED) {
diff --git a/platform/linux-generic/odp_schedule_sp.c 
b/platform/linux-generic/odp_schedule_sp.c
index 0fd4d87d..5608d323 100644
--- a/platform/linux-generic/odp_schedule_sp.c
+++ b/platform/linux-generic/odp_schedule_sp.c
@@ -414,10 +414,10 @@ static int unsched_queue(uint32_t qi ODP_UNUSED)
        return 0;
 }
 
-static int ord_enq_multi(uint32_t queue_index, void *buf_hdr[], int num,
+static int ord_enq_multi(queue_t handle, void *buf_hdr[], int num,
                         int *ret)
 {
-       (void)queue_index;
+       (void)handle;
        (void)buf_hdr;
        (void)num;
        (void)ret;
@@ -827,7 +827,7 @@ static void order_unlock(void)
 {
 }
 
-static void save_context(queue_entry_t *queue ODP_UNUSED)
+static void save_context(queue_t handle ODP_UNUSED)
 {
 }
 
diff --git a/platform/linux-generic/odp_traffic_mngr.c 
b/platform/linux-generic/odp_traffic_mngr.c
index 5008defe..8b5f3187 100644
--- a/platform/linux-generic/odp_traffic_mngr.c
+++ b/platform/linux-generic/odp_traffic_mngr.c
@@ -102,7 +102,7 @@ static odp_bool_t tm_demote_pkt_desc(tm_system_t *tm_system,
                                     tm_shaper_obj_t *timer_shaper,
                                     pkt_desc_t *demoted_pkt_desc);
 
-static int queue_tm_reenq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr)
+static int queue_tm_reenq(queue_t queue, odp_buffer_hdr_t *buf_hdr)
 {
        odp_tm_queue_t tm_queue = MAKE_ODP_TM_QUEUE((uint8_t *)queue -
                                                    offsetof(tm_queue_obj_t,
@@ -112,7 +112,7 @@ static int queue_tm_reenq(queue_entry_t *queue, 
odp_buffer_hdr_t *buf_hdr)
        return odp_tm_enq(tm_queue, pkt);
 }
 
-static int queue_tm_reenq_multi(queue_entry_t *queue ODP_UNUSED,
+static int queue_tm_reenq_multi(queue_t queue ODP_UNUSED,
                                odp_buffer_hdr_t *buf[] ODP_UNUSED,
                                int num ODP_UNUSED)
 {
@@ -3882,6 +3882,7 @@ odp_tm_queue_t odp_tm_queue_create(odp_tm_t odp_tm,
        tm_queue_obj_t *tm_queue_obj;
        tm_wred_node_t *tm_wred_node;
        odp_tm_queue_t odp_tm_queue;
+       odp_queue_t queue;
        odp_tm_wred_t wred_profile;
        tm_system_t *tm_system;
        uint32_t color;
@@ -3918,10 +3919,17 @@ odp_tm_queue_t odp_tm_queue_create(odp_tm_t odp_tm,
        tm_queue_obj->pkt = ODP_PACKET_INVALID;
        odp_ticketlock_init(&tm_wred_node->tm_wred_node_lock);
 
-       queue_fn->queue_set_type(&tm_queue_obj->tm_qentry, QUEUE_TYPE_TM);
-       queue_fn->queue_set_enq_func(&tm_queue_obj->tm_qentry, queue_tm_reenq);
-       queue_fn->queue_set_enq_multi_func(&tm_queue_obj->tm_qentry,
-                                          queue_tm_reenq_multi);
+       queue = odp_queue_create(NULL, NULL);
+       if (queue == ODP_QUEUE_INVALID) {
+               free(tm_wred_node);
+               free(tm_queue_obj);
+               return ODP_TM_INVALID;
+       }
+       tm_queue_obj->tm_qentry = queue_fn->from_ext(queue);
+       queue_fn->set_type(tm_queue_obj->tm_qentry, QUEUE_TYPE_TM);
+       queue_fn->set_enq_fn(tm_queue_obj->tm_qentry, queue_tm_reenq);
+       queue_fn->set_enq_multi_fn(tm_queue_obj->tm_qentry,
+                                  queue_tm_reenq_multi);
 
        tm_system->queue_num_tbl[tm_queue_obj->queue_num - 1] = tm_queue_obj;
        odp_ticketlock_lock(&tm_system->tm_system_lock);
@@ -3993,6 +4001,8 @@ int odp_tm_queue_destroy(odp_tm_queue_t tm_queue)
        odp_ticketlock_lock(&tm_system->tm_system_lock);
        tm_system->queue_num_tbl[tm_queue_obj->queue_num - 1] = NULL;
 
+       odp_queue_destroy(queue_fn->to_ext(tm_queue_obj->tm_qentry));
+
        /* First delete any associated tm_wred_node and then the tm_queue_obj
         * itself */
        free(tm_queue_obj->tm_wred_node);
diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index 1f48a000..aa687186 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -55,7 +55,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
 {
        int nbr, i;
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
-       queue_entry_t *qentry;
+       queue_t queue;
        odp_packet_hdr_t *pkt_hdr;
        odp_packet_hdr_t parsed_hdr;
        odp_packet_t pkt;
@@ -69,8 +69,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
 
        odp_ticketlock_lock(&pktio_entry->s.rxl);
 
-       qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq);
-       nbr = queue_fn->queue_deq_multi(qentry, hdr_tbl, len);
+       queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq);
+       nbr = queue_fn->deq_multi(queue, hdr_tbl, len);
 
        if (pktio_entry->s.config.pktin.bit.ts_all ||
            pktio_entry->s.config.pktin.bit.ts_ptp) {
@@ -154,7 +154,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
                         const odp_packet_t pkt_tbl[], int len)
 {
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
-       queue_entry_t *qentry;
+       queue_t queue;
        int i;
        int ret;
        uint32_t bytes = 0;
@@ -169,8 +169,8 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
 
        odp_ticketlock_lock(&pktio_entry->s.txl);
 
-       qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq);
-       ret = queue_fn->queue_enq_multi(qentry, hdr_tbl, len);
+       queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq);
+       ret = queue_fn->enq_multi(queue, hdr_tbl, len);
 
        if (ret > 0) {
                pktio_entry->s.stats.out_ucast_pkts += ret;

Reply via email to