aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/pktio
diff options
context:
space:
mode:
authorMatias Elo <matias.elo@nokia.com>2022-01-21 11:30:18 +0200
committerPetri Savolainen <petri.savolainen@nokia.com>2022-03-02 09:12:47 +0200
commitb99394dbd484f5f538a41baa4fef2f62830b69ac (patch)
tree7034e21724724dfc147010e61881cfa871066001 /platform/linux-generic/pktio
parent8210dab31c2a7e969cd97de7f1ca5bf53b36a97f (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.c62
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,
};