From: Honnappa Nagarahalli <[email protected]>

Queue APIs and functions towards the internal components are converted into 
function pointers and function pointer tables

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
 **/
 .../linux-generic/include/odp_queue_internal.h     |  8 +-
 platform/linux-generic/include/odp_schedule_if.h   | 43 ++++++++++
 platform/linux-generic/odp_init.c                  |  4 +-
 platform/linux-generic/odp_packet_io.c             | 12 +--
 platform/linux-generic/odp_queue.c                 | 88 +++++++++++++-------
 platform/linux-generic/odp_schedule.c              |  2 +-
 platform/linux-generic/odp_schedule_if.c           | 96 ++++++++++++++++++++++
 platform/linux-generic/odp_schedule_iquery.c       |  2 +-
 platform/linux-generic/pktio/loop.c                |  4 +-
 9 files changed, 215 insertions(+), 44 deletions(-)

diff --git a/platform/linux-generic/include/odp_queue_internal.h 
b/platform/linux-generic/include/odp_queue_internal.h
index 560f826e..759d36e0 100644
--- a/platform/linux-generic/include/odp_queue_internal.h
+++ b/platform/linux-generic/include/odp_queue_internal.h
@@ -85,11 +85,11 @@ union queue_entry_u {
 
 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_entry_t *queue, odp_buffer_hdr_t *buf_hdr);
+odp_buffer_hdr_t *_queue_deq(queue_entry_t *queue);
 
-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_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);
 
 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 530d157f..e5d76103 100644
--- a/platform/linux-generic/include/odp_schedule_if.h
+++ b/platform/linux-generic/include/odp_schedule_if.h
@@ -15,6 +15,49 @@ extern "C" {
 #include <odp_queue_internal.h>
 #include <odp/api/schedule.h>
 
+/* Internal abstract queue type */
+typedef void* queue_t;
+
+/* Queue API functions */
+typedef struct {
+       odp_queue_t (*queue_create)(const char *name,
+                                   const odp_queue_param_t *param);
+       int (*queue_destroy)(odp_queue_t queue);
+       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);
+       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);
+       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);
+       odp_schedule_group_t (*queue_sched_group)(odp_queue_t queue);
+       int (*queue_lock_count)(odp_queue_t queue);
+       uint64_t (*queue_to_u64)(odp_queue_t hdl);
+       void (*queue_param_init)(odp_queue_param_t *param);
+       int (*queue_info)(odp_queue_t queue, odp_queue_info_t *info);
+} queue_api_t;
+
+/* 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);
+} queue_fn_t;
+
+const queue_fn_t *queue_fn;
+
 typedef void (*schedule_pktio_start_fn_t)(int pktio_index, int num_in_queue,
                                          int in_queue_idx[]);
 typedef int (*schedule_thr_add_fn_t)(odp_schedule_group_t group, int thr);
diff --git a/platform/linux-generic/odp_init.c 
b/platform/linux-generic/odp_init.c
index 685e02fa..73ba65e6 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 (odp_queue_init_global()) {
+       if (queue_fn->queue_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 (odp_queue_term_global()) {
+               if (queue_fn->queue_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 877978ba..4d1ab519 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -572,7 +572,7 @@ static inline int pktin_recv_buf(odp_pktin_queue_t queue,
                        int ret;
 
                        dst_queue = queue_to_qentry(pkt_hdr->dst_queue);
-                       ret = queue_enq(dst_queue, buf_hdr);
+                       ret = queue_fn->queue_enq(dst_queue, buf_hdr);
                        if (ret < 0)
                                odp_packet_free(pkt);
                        continue;
@@ -641,7 +641,7 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int pkts;
 
-       buf_hdr = queue_deq(qentry);
+       buf_hdr = queue_fn->queue_deq(qentry);
        if (buf_hdr != NULL)
                return buf_hdr;
 
@@ -651,7 +651,7 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry)
                return NULL;
 
        if (pkts > 1)
-               queue_enq_multi(qentry, &hdr_tbl[1], pkts - 1);
+               queue_fn->queue_enq_multi(qentry, &hdr_tbl[1], pkts - 1);
        buf_hdr = hdr_tbl[0];
        return buf_hdr;
 }
@@ -669,7 +669,7 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t 
*buf_hdr[], int num)
        odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX];
        int pkts, i, j;
 
-       nbr = queue_deq_multi(qentry, buf_hdr, num);
+       nbr = queue_fn->queue_deq_multi(qentry, buf_hdr, num);
        if (odp_unlikely(nbr > num))
                ODP_ABORT("queue_deq_multi req: %d, returned %d\n", num, nbr);
 
@@ -691,7 +691,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_enq_multi(qentry, hdr_tbl, j);
+               queue_fn->queue_enq_multi(qentry, hdr_tbl, j);
        return nbr;
 }
 
@@ -729,7 +729,7 @@ 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_enq_multi(qentry, hdr_tbl, num);
+               queue_fn->queue_enq_multi(qentry, hdr_tbl, num);
        }
 
        return 0;
diff --git a/platform/linux-generic/odp_queue.c 
b/platform/linux-generic/odp_queue.c
index dd430cd1..928d767a 100644
--- a/platform/linux-generic/odp_queue.c
+++ b/platform/linux-generic/odp_queue.c
@@ -89,10 +89,10 @@ static int queue_init(queue_entry_t *queue, const char 
*name,
        }
        queue->s.type = queue->s.param.type;
 
-       queue->s.enqueue = queue_enq;
-       queue->s.dequeue = queue_deq;
-       queue->s.enqueue_multi = queue_enq_multi;
-       queue->s.dequeue_multi = queue_deq_multi;
+       queue->s.enqueue = _queue_enq;
+       queue->s.dequeue = _queue_deq;
+       queue->s.enqueue_multi = _queue_enq_multi;
+       queue->s.dequeue_multi = _queue_deq_multi;
 
        queue->s.pktin = PKTIN_INVALID;
        queue->s.pktout = PKTOUT_INVALID;
@@ -104,7 +104,7 @@ static int queue_init(queue_entry_t *queue, const char 
*name,
 }
 
 
-int odp_queue_init_global(void)
+static int queue_init_global(void)
 {
        uint32_t i;
        odp_shm_t shm;
@@ -141,7 +141,7 @@ int odp_queue_init_global(void)
        return 0;
 }
 
-int odp_queue_term_global(void)
+static int queue_term_global(void)
 {
        int ret = 0;
        int rc = 0;
@@ -167,7 +167,7 @@ int odp_queue_term_global(void)
        return rc;
 }
 
-int odp_queue_capability(odp_queue_capability_t *capa)
+static int queue_capability(odp_queue_capability_t *capa)
 {
        memset(capa, 0, sizeof(odp_queue_capability_t));
 
@@ -182,7 +182,7 @@ int odp_queue_capability(odp_queue_capability_t *capa)
        return 0;
 }
 
-odp_queue_type_t odp_queue_type(odp_queue_t handle)
+static odp_queue_type_t queue_type(odp_queue_t handle)
 {
        queue_entry_t *queue;
 
@@ -191,7 +191,7 @@ odp_queue_type_t odp_queue_type(odp_queue_t handle)
        return queue->s.type;
 }
 
-odp_schedule_sync_t odp_queue_sched_type(odp_queue_t handle)
+static odp_schedule_sync_t queue_sched_type(odp_queue_t handle)
 {
        queue_entry_t *queue;
 
@@ -200,7 +200,7 @@ odp_schedule_sync_t odp_queue_sched_type(odp_queue_t handle)
        return queue->s.param.sched.sync;
 }
 
-odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t handle)
+static odp_schedule_prio_t queue_sched_prio(odp_queue_t handle)
 {
        queue_entry_t *queue;
 
@@ -209,7 +209,7 @@ odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t handle)
        return queue->s.param.sched.prio;
 }
 
-odp_schedule_group_t odp_queue_sched_group(odp_queue_t handle)
+static odp_schedule_group_t queue_sched_group(odp_queue_t handle)
 {
        queue_entry_t *queue;
 
@@ -218,7 +218,7 @@ odp_schedule_group_t odp_queue_sched_group(odp_queue_t 
handle)
        return queue->s.param.sched.group;
 }
 
-int odp_queue_lock_count(odp_queue_t handle)
+static int queue_lock_count(odp_queue_t handle)
 {
        queue_entry_t *queue = queue_to_qentry(handle);
 
@@ -226,7 +226,7 @@ int odp_queue_lock_count(odp_queue_t handle)
                (int)queue->s.param.sched.lock_count : -1;
 }
 
-odp_queue_t odp_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;
@@ -291,7 +291,7 @@ void sched_cb_queue_destroy_finalize(uint32_t queue_index)
        UNLOCK(&queue->s.lock);
 }
 
-int odp_queue_destroy(odp_queue_t handle)
+static int queue_destroy(odp_queue_t handle)
 {
        queue_entry_t *queue;
        queue = queue_to_qentry(handle);
@@ -343,7 +343,7 @@ int odp_queue_destroy(odp_queue_t handle)
        return 0;
 }
 
-int odp_queue_context_set(odp_queue_t handle, void *context,
+static int queue_context_set(odp_queue_t handle, void *context,
                          uint32_t len ODP_UNUSED)
 {
        queue_entry_t *queue;
@@ -354,14 +354,14 @@ int odp_queue_context_set(odp_queue_t handle, void 
*context,
        return 0;
 }
 
-void *odp_queue_context(odp_queue_t handle)
+static void *queue_context(odp_queue_t handle)
 {
        queue_entry_t *queue;
        queue = queue_to_qentry(handle);
        return queue->s.param.context;
 }
 
-odp_queue_t odp_queue_lookup(const char *name)
+static odp_queue_t queue_lookup(const char *name)
 {
        uint32_t i;
 
@@ -460,12 +460,12 @@ 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_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int 
num)
 {
        return enq_multi(queue, buf_hdr, num);
 }
 
-int queue_enq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr)
+int _queue_enq(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr)
 {
        int ret;
 
@@ -477,7 +477,7 @@ int queue_enq(queue_entry_t *queue, odp_buffer_hdr_t 
*buf_hdr)
                return -1;
 }
 
-int odp_queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
+static int queue_enq_multi(odp_queue_t handle, const odp_event_t ev[], int num)
 {
        odp_buffer_hdr_t *buf_hdr[QUEUE_MULTI_MAX];
        queue_entry_t *queue;
@@ -495,7 +495,7 @@ int odp_queue_enq_multi(odp_queue_t handle, const 
odp_event_t ev[], int num)
                                                     num);
 }
 
-int odp_queue_enq(odp_queue_t handle, odp_event_t ev)
+static int queue_enq(odp_queue_t handle, odp_event_t ev)
 {
        odp_buffer_hdr_t *buf_hdr;
        queue_entry_t *queue;
@@ -578,12 +578,12 @@ static inline int deq_multi(queue_entry_t *queue, 
odp_buffer_hdr_t *buf_hdr[],
        return i;
 }
 
-int queue_deq_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)
 {
        return deq_multi(queue, buf_hdr, num);
 }
 
-odp_buffer_hdr_t *queue_deq(queue_entry_t *queue)
+odp_buffer_hdr_t *_queue_deq(queue_entry_t *queue)
 {
        odp_buffer_hdr_t *buf_hdr = NULL;
        int ret;
@@ -596,7 +596,7 @@ odp_buffer_hdr_t *queue_deq(queue_entry_t *queue)
                return NULL;
 }
 
-int odp_queue_deq_multi(odp_queue_t handle, odp_event_t events[], int num)
+static int queue_deq_multi(odp_queue_t handle, odp_event_t events[], int num)
 {
        queue_entry_t *queue;
        odp_buffer_hdr_t *buf_hdr[QUEUE_MULTI_MAX];
@@ -616,7 +616,7 @@ int odp_queue_deq_multi(odp_queue_t handle, odp_event_t 
events[], int num)
 }
 
 
-odp_event_t odp_queue_deq(odp_queue_t handle)
+static odp_event_t queue_deq(odp_queue_t handle)
 {
        queue_entry_t *queue;
        odp_buffer_hdr_t *buf_hdr;
@@ -640,7 +640,7 @@ void queue_unlock(queue_entry_t *queue)
        UNLOCK(&queue->s.lock);
 }
 
-void odp_queue_param_init(odp_queue_param_t *params)
+static void queue_param_init(odp_queue_param_t *params)
 {
        memset(params, 0, sizeof(odp_queue_param_t));
        params->type = ODP_QUEUE_TYPE_PLAIN;
@@ -651,7 +651,7 @@ void odp_queue_param_init(odp_queue_param_t *params)
        params->sched.group = ODP_SCHED_GROUP_ALL;
 }
 
-int odp_queue_info(odp_queue_t handle, odp_queue_info_t *info)
+static int queue_info(odp_queue_t handle, odp_queue_info_t *info)
 {
        uint32_t queue_id;
        queue_entry_t *queue;
@@ -765,7 +765,39 @@ int sched_cb_queue_empty(uint32_t queue_index)
        return ret;
 }
 
-uint64_t odp_queue_to_u64(odp_queue_t hdl)
+static uint64_t queue_to_u64(odp_queue_t hdl)
 {
        return _odp_pri(hdl);
 }
+
+/* API functions */
+queue_api_t queue_default_api = {
+       .queue_create = queue_create,
+       .queue_destroy = queue_destroy,
+       .queue_lookup = queue_lookup,
+       .queue_capability = queue_capability,
+       .queue_context_set = queue_context_set,
+       .queue_context = queue_context,
+       .queue_enq = queue_enq,
+       .queue_enq_multi = queue_enq_multi,
+       .queue_deq = queue_deq,
+       .queue_deq_multi = queue_deq_multi,
+       .queue_type = queue_type,
+       .queue_sched_type = queue_sched_type,
+       .queue_sched_prio = queue_sched_prio,
+       .queue_sched_group = queue_sched_group,
+       .queue_lock_count = queue_lock_count,
+       .queue_to_u64 = queue_to_u64,
+       .queue_param_init = queue_param_init,
+       .queue_info = queue_info
+};
+
+/* 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
+};
diff --git a/platform/linux-generic/odp_schedule.c 
b/platform/linux-generic/odp_schedule.c
index c4567d81..0f5bd52b 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_enq_multi(queue, buf_hdr, num);
+               queue_fn->queue_enq_multi(queue, buf_hdr, num);
        }
        sched_local.ordered.stash_num = 0;
 }
diff --git a/platform/linux-generic/odp_schedule_if.c 
b/platform/linux-generic/odp_schedule_if.c
index a9ede98d..8eef5235 100644
--- a/platform/linux-generic/odp_schedule_if.c
+++ b/platform/linux-generic/odp_schedule_if.c
@@ -6,6 +6,12 @@
 
 #include <odp_schedule_if.h>
 
+extern const queue_api_t queue_default_api;
+extern const queue_fn_t queue_default_fn;
+
+const queue_api_t *queue_api = &queue_default_api;
+const queue_fn_t *queue_fn = &queue_default_fn;
+
 extern const schedule_fn_t schedule_sp_fn;
 extern const schedule_api_t schedule_sp_api;
 
@@ -26,6 +32,96 @@ const schedule_fn_t  *sched_fn  = &schedule_default_fn;
 const schedule_api_t *sched_api = &schedule_default_api;
 #endif
 
+odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
+{
+       return queue_api->queue_create(name, param);
+}
+
+int odp_queue_destroy(odp_queue_t queue)
+{
+       return queue_api->queue_destroy(queue);
+}
+
+odp_queue_t odp_queue_lookup(const char *name)
+{
+       return queue_api->queue_lookup(name);
+}
+
+int odp_queue_capability(odp_queue_capability_t *capa)
+{
+       return queue_api->queue_capability(capa);
+}
+
+int odp_queue_context_set(odp_queue_t queue, void *context, uint32_t len)
+{
+       return queue_api->queue_context_set(queue, context, len);
+}
+
+void *odp_queue_context(odp_queue_t queue)
+{
+       return queue_api->queue_context(queue);
+}
+
+int odp_queue_enq(odp_queue_t queue, odp_event_t ev)
+{
+       return queue_api->queue_enq(queue, ev);
+}
+
+int odp_queue_enq_multi(odp_queue_t queue, const odp_event_t events[], int num)
+{
+       return queue_api->queue_enq_multi(queue, events, num);
+}
+
+odp_event_t odp_queue_deq(odp_queue_t queue)
+{
+       return queue_api->queue_deq(queue);
+}
+
+int odp_queue_deq_multi(odp_queue_t queue, odp_event_t events[], int num)
+{
+       return queue_api->queue_deq_multi(queue, events, num);
+}
+
+odp_queue_type_t odp_queue_type(odp_queue_t queue)
+{
+       return queue_api->queue_type(queue);
+}
+
+odp_schedule_sync_t odp_queue_sched_type(odp_queue_t queue)
+{
+       return queue_api->queue_sched_type(queue);
+}
+
+odp_schedule_prio_t odp_queue_sched_prio(odp_queue_t queue)
+{
+       return queue_api->queue_sched_prio(queue);
+}
+
+odp_schedule_group_t odp_queue_sched_group(odp_queue_t queue)
+{
+       return queue_api->queue_sched_group(queue);
+}
+
+int odp_queue_lock_count(odp_queue_t queue)
+{
+       return queue_api->queue_lock_count(queue);
+}
+
+uint64_t odp_queue_to_u64(odp_queue_t hdl)
+{
+       return queue_api->queue_to_u64(hdl);
+}
+
+void odp_queue_param_init(odp_queue_param_t *param)
+{
+       return queue_api->queue_param_init(param);
+}
+
+int odp_queue_info(odp_queue_t queue, odp_queue_info_t *info)
+{
+       return queue_api->queue_info(queue, info);
+}
+
 uint64_t odp_schedule_wait_time(uint64_t ns)
 {
        return sched_api->schedule_wait_time(ns);
diff --git a/platform/linux-generic/odp_schedule_iquery.c 
b/platform/linux-generic/odp_schedule_iquery.c
index 75470aff..ac5cdacd 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_enq_multi(queue, buf_hdr, num);
+               queue_fn->queue_enq_multi(queue, buf_hdr, num);
        }
        thread_local.ordered.stash_num = 0;
 }
diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index e9ad22ba..1f48a000 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -70,7 +70,7 @@ 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_deq_multi(qentry, hdr_tbl, len);
+       nbr = queue_fn->queue_deq_multi(qentry, hdr_tbl, len);
 
        if (pktio_entry->s.config.pktin.bit.ts_all ||
            pktio_entry->s.config.pktin.bit.ts_ptp) {
@@ -170,7 +170,7 @@ 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_enq_multi(qentry, hdr_tbl, len);
+       ret = queue_fn->queue_enq_multi(qentry, hdr_tbl, len);
 
        if (ret > 0) {
                pktio_entry->s.stats.out_ucast_pkts += ret;

Reply via email to