From: Honnappa Nagarahalli <[email protected]> Pkt I/O and TM access queue internal structure members. Introduced functions in the function pointer table to access these members.
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 | 1 - platform/linux-generic/include/odp_schedule_if.h | 30 +++++++++-- platform/linux-generic/odp_packet_io.c | 41 +++++++++------ platform/linux-generic/odp_queue.c | 60 +++++++++++++++++++++- platform/linux-generic/odp_traffic_mngr.c | 7 +-- 5 files changed, 113 insertions(+), 26 deletions(-) diff --git a/platform/linux-generic/include/odp_queue_internal.h b/platform/linux-generic/include/odp_queue_internal.h index 759d36e0..8f46ba2e 100644 --- a/platform/linux-generic/include/odp_queue_internal.h +++ b/platform/linux-generic/include/odp_queue_internal.h @@ -40,7 +40,6 @@ extern "C" { /* 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 *); diff --git a/platform/linux-generic/include/odp_schedule_if.h b/platform/linux-generic/include/odp_schedule_if.h index e5d76103..f3989ef8 100644 --- a/platform/linux-generic/include/odp_schedule_if.h +++ b/platform/linux-generic/include/odp_schedule_if.h @@ -14,9 +14,7 @@ extern "C" { #include <odp/api/queue.h> #include <odp_queue_internal.h> #include <odp/api/schedule.h> - -/* Internal abstract queue type */ -typedef void* queue_t; +#include <odp/api/packet_io.h> /* Queue API functions */ typedef struct { @@ -44,6 +42,17 @@ 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); + /* Queue functions towards other internal components */ typedef struct { int (*queue_init_global)(void); @@ -54,9 +63,22 @@ typedef struct { 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_fn_t; -const queue_fn_t *queue_fn; +extern const queue_fn_t *queue_fn; typedef void (*schedule_pktio_start_fn_t)(int pktio_index, int num_in_queue, int in_queue_idx[]); diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 4d1ab519..19ff5a28 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -592,7 +592,7 @@ int pktout_enqueue(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr) &nbr)) return (nbr == len ? 0 : -1); - nbr = odp_pktout_send(qentry->s.pktout, &pkt, len); + nbr = odp_pktout_send(queue_fn->queue_get_pktout(qentry), &pkt, len); return (nbr == len ? 0 : -1); } @@ -616,7 +616,7 @@ int pktout_enq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], for (i = 0; i < num; ++i) pkt_tbl[i] = _odp_packet_from_buffer(buf_hdr[i]->handle.handle); - nbr = odp_pktout_send(qentry->s.pktout, pkt_tbl, num); + nbr = odp_pktout_send(queue_fn->queue_get_pktout(qentry), pkt_tbl, num); return nbr; } @@ -645,7 +645,8 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry) if (buf_hdr != NULL) return buf_hdr; - pkts = pktin_recv_buf(qentry->s.pktin, hdr_tbl, QUEUE_MULTI_MAX); + pkts = pktin_recv_buf(queue_fn->queue_get_pktin(qentry), + hdr_tbl, QUEUE_MULTI_MAX); if (pkts <= 0) return NULL; @@ -679,7 +680,8 @@ 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(qentry->s.pktin, hdr_tbl, QUEUE_MULTI_MAX); + pkts = pktin_recv_buf(queue_fn->queue_get_pktin(qentry), + hdr_tbl, QUEUE_MULTI_MAX); if (pkts <= 0) return nbr; @@ -1276,13 +1278,15 @@ int odp_pktin_queue_config(odp_pktio_t pktio, 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; + 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); } entry->s.in_queue[i].queue = queue; @@ -1400,14 +1404,17 @@ int odp_pktout_queue_config(odp_pktio_t pktio, } qentry = queue_to_qentry(queue); - qentry->s.pktout.index = i; - qentry->s.pktout.pktio = pktio; + queue_fn->queue_set_pktout(qentry, pktio, i); /* Override default enqueue / dequeue functions */ - qentry->s.enqueue = pktout_enqueue; - qentry->s.dequeue = pktout_dequeue; - qentry->s.enqueue_multi = pktout_enq_multi; - qentry->s.dequeue_multi = pktout_deq_multi; + 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); entry->s.out_queue[i].queue = queue; } diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c index 928d767a..06d2e263 100644 --- a/platform/linux-generic/odp_queue.c +++ b/platform/linux-generic/odp_queue.c @@ -770,6 +770,55 @@ 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) +{ + return queue->s.pktout; +} + +static void queue_set_pktout(queue_entry_t *queue, odp_pktio_t pktio, int index) +{ + queue->s.pktout.pktio = pktio; + queue->s.pktout.index = index; +} + +static odp_pktin_queue_t queue_get_pktin(queue_entry_t *queue) +{ + return queue->s.pktin; +} + +static void queue_set_pktin(queue_entry_t *queue, odp_pktio_t pktio, int index) +{ + queue->s.pktin.pktio = pktio; + queue->s.pktin.index = index; +} + +static void queue_set_enq_func(queue_entry_t *queue, enq_func_t func) +{ + queue->s.enqueue = func; +} + +static void queue_set_enq_multi_func(queue_entry_t *queue, + enq_multi_func_t func) +{ + queue->s.enqueue_multi = func; +} + +static void queue_set_deq_func(queue_entry_t *queue, deq_func_t func) +{ + queue->s.dequeue = func; +} + +static void queue_set_deq_multi_func(queue_entry_t *queue, + deq_multi_func_t func) +{ + queue->s.dequeue_multi = func; +} + +static void queue_set_type(queue_entry_t *queue, odp_queue_type_t type) +{ + queue->s.type = type; +} + /* API functions */ queue_api_t queue_default_api = { .queue_create = queue_create, @@ -799,5 +848,14 @@ queue_fn_t queue_default_fn = { .queue_enq = _queue_enq, .queue_enq_multi = _queue_enq_multi, .queue_deq = _queue_deq, - .queue_deq_multi = _queue_deq_multi + .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 }; diff --git a/platform/linux-generic/odp_traffic_mngr.c b/platform/linux-generic/odp_traffic_mngr.c index a93b3ba9..5008defe 100644 --- a/platform/linux-generic/odp_traffic_mngr.c +++ b/platform/linux-generic/odp_traffic_mngr.c @@ -3918,9 +3918,10 @@ 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); - tm_queue_obj->tm_qentry.s.type = QUEUE_TYPE_TM; - tm_queue_obj->tm_qentry.s.enqueue = queue_tm_reenq; - tm_queue_obj->tm_qentry.s.enqueue_multi = queue_tm_reenq_multi; + 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); tm_system->queue_num_tbl[tm_queue_obj->queue_num - 1] = tm_queue_obj; odp_ticketlock_lock(&tm_system->tm_system_lock);
