diff options
author | Matias Elo <matias.elo@nokia.com> | 2022-01-21 11:30:18 +0200 |
---|---|---|
committer | Petri Savolainen <petri.savolainen@nokia.com> | 2022-03-02 09:12:47 +0200 |
commit | b99394dbd484f5f538a41baa4fef2f62830b69ac (patch) | |
tree | 7034e21724724dfc147010e61881cfa871066001 /platform/linux-generic/pktio | |
parent | 8210dab31c2a7e969cd97de7f1ca5bf53b36a97f (diff) |
linux-gen: loop: implement new packet output queue size parameter
Implement new packet output queue size API for loop pktio.
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Reviewed-by: Jere Leppänen <jere.leppanen@nokia.com>
Reviewed-by: Petri Savolainen <petri.savolainen@nokia.com>
Diffstat (limited to 'platform/linux-generic/pktio')
-rw-r--r-- | platform/linux-generic/pktio/loop.c | 62 |
1 files changed, 52 insertions, 10 deletions
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index c2c26603e..edb616175 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -42,6 +42,8 @@ #define LOOP_MTU_MIN 68 #define LOOP_MTU_MAX UINT16_MAX +#define LOOP_MAX_TX_QUEUE_SIZE 1024 + typedef struct { odp_queue_t loopq; /**< loopback queue for "loop" device */ odp_bool_t promisc; /**< promiscuous mode state */ @@ -63,12 +65,11 @@ static const uint8_t pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01}; static int loopback_stats_reset(pktio_entry_t *pktio_entry); static int loopback_init_capability(pktio_entry_t *pktio_entry); -static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, +static int loopback_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, const char *devname, odp_pool_t pool ODP_UNUSED) { pkt_loop_t *pkt_loop = pkt_priv(pktio_entry); long idx; - char loopq_name[ODP_QUEUE_NAME_LEN]; if (!strcmp(devname, "loop")) { idx = 0; @@ -82,14 +83,9 @@ static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, return -1; } - snprintf(loopq_name, sizeof(loopq_name), "%" PRIu64 "-pktio_loopq", - odp_pktio_to_u64(id)); pkt_loop->idx = idx; pkt_loop->mtu = LOOP_MTU_MAX; - pkt_loop->loopq = odp_queue_create(loopq_name, NULL); - - if (pkt_loop->loopq == ODP_QUEUE_INVALID) - return -1; + pkt_loop->loopq = ODP_QUEUE_INVALID; loopback_stats_reset(pktio_entry); loopback_init_capability(pktio_entry); @@ -97,9 +93,44 @@ static int loopback_open(odp_pktio_t id, pktio_entry_t *pktio_entry, return 0; } +static int loopback_pktout_queue_config(pktio_entry_t *pktio_entry, + const odp_pktout_queue_param_t *param) +{ + pkt_loop_t *pkt_loop = pkt_priv(pktio_entry); + odp_queue_param_t queue_param; + char queue_name[ODP_QUEUE_NAME_LEN]; + + /* Destroy old queue */ + if (pkt_loop->loopq != ODP_QUEUE_INVALID) { + if (odp_queue_destroy(pkt_loop->loopq)) { + ODP_ERR("Destroying old loopback pktio queue failed\n"); + return -1; + } + } + + odp_queue_param_init(&queue_param); + queue_param.size = param->queue_size[0]; + + snprintf(queue_name, sizeof(queue_name), "_odp_pktio_loopq-%" PRIu64 "", + odp_pktio_to_u64(pktio_entry->s.handle)); + + pkt_loop->loopq = odp_queue_create(queue_name, &queue_param); + if (pkt_loop->loopq == ODP_QUEUE_INVALID) { + ODP_ERR("Creating loopback pktio queue failed\n"); + return -1; + } + + return 0; +} + static int loopback_close(pktio_entry_t *pktio_entry) { - return odp_queue_destroy(pkt_priv(pktio_entry)->loopq); + pkt_loop_t *pkt_loop = pkt_priv(pktio_entry); + + if (pkt_loop->loopq != ODP_QUEUE_INVALID) + return odp_queue_destroy(pkt_loop->loopq); + + return 0; } static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, @@ -432,6 +463,12 @@ static int loopback_link_info(pktio_entry_t *pktio_entry ODP_UNUSED, odp_pktio_l static int loopback_init_capability(pktio_entry_t *pktio_entry) { odp_pktio_capability_t *capa = &pktio_entry->s.capa; + odp_queue_capability_t queue_capa; + + if (odp_queue_capability(&queue_capa)) { + ODP_ERR("Queue capability failed\n"); + return -1; + } memset(capa, 0, sizeof(odp_pktio_capability_t)); @@ -446,6 +483,11 @@ static int loopback_init_capability(pktio_entry_t *pktio_entry) capa->maxlen.min_output = LOOP_MTU_MIN; capa->maxlen.max_output = LOOP_MTU_MAX; + capa->min_output_queue_size = 1; + capa->max_output_queue_size = queue_capa.plain.max_size; + if (capa->max_output_queue_size == 0) + capa->max_output_queue_size = LOOP_MAX_TX_QUEUE_SIZE; + odp_pktio_config_init(&capa->config); capa->config.enable_loop = 1; capa->config.pktin.bit.ts_all = 1; @@ -576,5 +618,5 @@ const pktio_if_ops_t _odp_loopback_pktio_ops = { .pktio_time = NULL, .config = NULL, .input_queues_config = NULL, - .output_queues_config = NULL, + .output_queues_config = loopback_pktout_queue_config, }; |