Packet IO interface level parameters are needed e.g. to
select input mode. User must select and use one input mode
(sched, poll or recv) per pktio interface.

Signed-off-by: Petri Savolainen <[email protected]>
---
 example/generator/odp_generator.c                  |  6 +++-
 example/ipsec/odp_ipsec.c                          | 11 +++++-
 example/l2fwd/odp_l2fwd.c                          | 10 +++++-
 example/packet/odp_pktio.c                         | 19 +++++++++-
 include/odp/api/packet_io.h                        | 28 ++++++++++++++-
 .../linux-generic/include/odp_packet_io_internal.h |  1 +
 platform/linux-generic/odp_packet_io.c             | 10 ++++--
 .../classification/odp_classification_tests.c      |  6 +++-
 test/validation/odp_pktio.c                        | 41 +++++++++++++++-------
 9 files changed, 111 insertions(+), 21 deletions(-)

diff --git a/example/generator/odp_generator.c 
b/example/generator/odp_generator.c
index 3870fd1..953ae4b 100644
--- a/example/generator/odp_generator.c
+++ b/example/generator/odp_generator.c
@@ -307,9 +307,13 @@ static odp_pktio_t create_pktio(const char *dev, 
odp_pool_t pool)
        odp_pktio_t pktio;
        int ret;
        odp_queue_t inq_def;
+       odp_pktio_param_t pktio_param;
+
+       memset(&pktio_param, 0, sizeof(pktio_param));
+       pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
 
        /* Open a packet IO instance */
-       pktio = odp_pktio_open(dev, pool);
+       pktio = odp_pktio_open(dev, pool, &pktio_param);
 
        if (pktio == ODP_PKTIO_INVALID)
                EXAMPLE_ABORT("Error: pktio create failed for %s\n", dev);
diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c
index 82ed0cb..5f622a4 100644
--- a/example/ipsec/odp_ipsec.c
+++ b/example/ipsec/odp_ipsec.c
@@ -504,11 +504,20 @@ void initialize_intf(char *intf)
        int ret;
        uint8_t src_mac[ODPH_ETHADDR_LEN];
        char src_mac_str[MAX_STRING];
+       odp_pktio_param_t pktio_param;
+
+       memset(&pktio_param, 0, sizeof(pktio_param));
+
+#ifdef IPSEC_POLL_QUEUES
+       pktio_param.in_mode = ODP_PKTIN_MODE_POLL;
+#else
+       pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+#endif
 
        /*
         * Open a packet IO instance for thread and get default output queue
         */
-       pktio = odp_pktio_open(intf, pkt_pool);
+       pktio = odp_pktio_open(intf, pkt_pool, &pktio_param);
        if (ODP_PKTIO_INVALID == pktio) {
                EXAMPLE_ERR("Error: pktio create failed for %s\n", intf);
                exit(EXIT_FAILURE);
diff --git a/example/l2fwd/odp_l2fwd.c b/example/l2fwd/odp_l2fwd.c
index a6ce478..4105961 100644
--- a/example/l2fwd/odp_l2fwd.c
+++ b/example/l2fwd/odp_l2fwd.c
@@ -258,8 +258,16 @@ static odp_pktio_t create_pktio(const char *dev, 
odp_pool_t pool,
        odp_queue_t inq_def;
        odp_pktio_t pktio;
        int ret;
+       odp_pktio_param_t pktio_param;
 
-       pktio = odp_pktio_open(dev, pool);
+       memset(&pktio_param, 0, sizeof(pktio_param));
+
+       if (mode == APPL_MODE_PKT_BURST)
+               pktio_param.in_mode = ODP_PKTIN_MODE_RECV;
+       else
+               pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       pktio = odp_pktio_open(dev, pool, &pktio_param);
        if (pktio == ODP_PKTIO_INVALID) {
                EXAMPLE_ERR("Error: failed to open %s\n", dev);
                return ODP_PKTIO_INVALID;
diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c
index 61af855..6f638c6 100644
--- a/example/packet/odp_pktio.c
+++ b/example/packet/odp_pktio.c
@@ -122,9 +122,26 @@ static odp_pktio_t create_pktio(const char *dev, 
odp_pool_t pool, int mode)
        odp_queue_param_t qparam;
        char inq_name[ODP_QUEUE_NAME_LEN];
        int ret;
+       odp_pktio_param_t pktio_param;
+
+       memset(&pktio_param, 0, sizeof(pktio_param));
+
+       switch (mode) {
+       case  APPL_MODE_PKT_BURST:
+               pktio_param.in_mode = ODP_PKTIN_MODE_RECV;
+               break;
+       case APPL_MODE_PKT_QUEUE:
+               pktio_param.in_mode = ODP_PKTIN_MODE_POLL;
+               break;
+       case APPL_MODE_PKT_SCHED:
+               pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+               break;
+       default:
+               EXAMPLE_ABORT("invalid mode %d\n", mode);
+       }
 
        /* Open a packet IO instance */
-       pktio = odp_pktio_open(dev, pool);
+       pktio = odp_pktio_open(dev, pool, &pktio_param);
        if (pktio == ODP_PKTIO_INVALID)
                EXAMPLE_ABORT("Error: pktio create failed for %s\n", dev);
 
diff --git a/include/odp/api/packet_io.h b/include/odp/api/packet_io.h
index 8f10863..d34041c 100644
--- a/include/odp/api/packet_io.h
+++ b/include/odp/api/packet_io.h
@@ -44,6 +44,27 @@ extern "C" {
  * Actual MAC address sizes may be different.
  */
 
+
+/**
+ * Packet input mode
+ */
+enum odp_pktio_input_mode {
+       /** Application polls packet input directly with odp_pktio_recv() */
+       ODP_PKTIN_MODE_RECV = 0,
+       /** Packet input through scheduled queues */
+       ODP_PKTIN_MODE_SCHED,
+       /** Application polls packet input queues */
+       ODP_PKTIN_MODE_POLL
+};
+
+/**
+ * Packet IO parameters
+ */
+typedef struct odp_pktio_param_t {
+       /** Packet input mode */
+       enum odp_pktio_input_mode in_mode;
+} odp_pktio_param_t;
+
 /**
  * Open a packet IO interface
  *
@@ -52,9 +73,13 @@ extern "C" {
  * errno set. Use odp_pktio_lookup() to obtain a handle to an already open
  * device.
  *
+ * Packet IO parameters provide interface level configuration options.
+ * In minimum, user must select the input mode. Use 0 for defaults.
+ *
  * @param dev    Packet IO device name
  * @param pool   Pool from which to allocate buffers for storing packets
  *               received over this packet IO
+ * @param param  Packet IO parameters
  *
  * @return Packet IO handle
  * @retval ODP_PKTIO_INVALID on failure
@@ -63,7 +88,8 @@ extern "C" {
  *      device used for testing. Usually it's loop back
  *      interface.
  */
-odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool);
+odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
+                          const odp_pktio_param_t *param);
 
 /**
  * Close a packet IO interface
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h 
b/platform/linux-generic/include/odp_packet_io_internal.h
index 47b8992..116b4d9 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -50,6 +50,7 @@ struct pktio_entry {
        char name[IFNAMSIZ];            /**< name of pktio provided to
                                           pktio_open() */
        odp_bool_t promisc;             /**< promiscuous mode state */
+       odp_pktio_param_t param;
 };
 
 typedef union {
diff --git a/platform/linux-generic/odp_packet_io.c 
b/platform/linux-generic/odp_packet_io.c
index 21f0c17..a14c9df 100644
--- a/platform/linux-generic/odp_packet_io.c
+++ b/platform/linux-generic/odp_packet_io.c
@@ -234,7 +234,8 @@ static int init_loop(pktio_entry_t *entry, odp_pktio_t id)
        return 0;
 }
 
-static odp_pktio_t setup_pktio_entry(const char *dev, odp_pool_t pool)
+static odp_pktio_t setup_pktio_entry(const char *dev, odp_pool_t pool,
+                                    const odp_pktio_param_t *param)
 {
        odp_pktio_t id;
        pktio_entry_t *pktio_entry;
@@ -258,6 +259,8 @@ static odp_pktio_t setup_pktio_entry(const char *dev, 
odp_pool_t pool)
        if (!pktio_entry)
                return ODP_PKTIO_INVALID;
 
+       memcpy(&pktio_entry->s.param, param, sizeof(odp_pktio_param_t));
+
        if (strcmp(dev, "loop") == 0)
                ret = init_loop(pktio_entry, id);
        else
@@ -276,7 +279,8 @@ static odp_pktio_t setup_pktio_entry(const char *dev, 
odp_pool_t pool)
        return id;
 }
 
-odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool)
+odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool,
+                          const odp_pktio_param_t *param)
 {
        odp_pktio_t id;
 
@@ -288,7 +292,7 @@ odp_pktio_t odp_pktio_open(const char *dev, odp_pool_t pool)
        }
 
        odp_spinlock_lock(&pktio_tbl->lock);
-       id = setup_pktio_entry(dev, pool);
+       id = setup_pktio_entry(dev, pool, param);
        odp_spinlock_unlock(&pktio_tbl->lock);
 
        return id;
diff --git a/test/validation/classification/odp_classification_tests.c 
b/test/validation/classification/odp_classification_tests.c
index 0530f99..7dcc447 100644
--- a/test/validation/classification/odp_classification_tests.c
+++ b/test/validation/classification/odp_classification_tests.c
@@ -275,6 +275,7 @@ int classification_tests_init(void)
        char queuename[ODP_QUEUE_NAME_LEN];
        int i;
        int ret;
+       odp_pktio_param_t pktio_param;
 
        memset(&param, 0, sizeof(param));
        param.pkt.seg_len = SHM_PKT_BUF_SIZE;
@@ -293,7 +294,10 @@ int classification_tests_init(void)
        if (pool_default == ODP_POOL_INVALID)
                return -1;
 
-       pktio_loop = odp_pktio_open("loop", pool_default);
+       memset(&pktio_param, 0, sizeof(pktio_param));
+       pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       pktio_loop = odp_pktio_open("loop", pool_default, &pktio_param);
        if (pktio_loop == ODP_PKTIO_INVALID) {
                ret = odp_pool_destroy(pool_default);
                if (ret)
diff --git a/test/validation/odp_pktio.c b/test/validation/odp_pktio.c
index e022c33..4eeac7c 100644
--- a/test/validation/odp_pktio.c
+++ b/test/validation/odp_pktio.c
@@ -236,12 +236,13 @@ static int default_pool_create(void)
        return 0;
 }
 
-static odp_pktio_t create_pktio(const char *iface)
+static odp_pktio_t create_pktio(const char *iface, odp_queue_type_t q_type)
 {
        odp_pool_t pool;
        odp_pktio_t pktio;
        char pool_name[ODP_POOL_NAME_LEN];
        odp_pool_param_t params;
+       odp_pktio_param_t pktio_param;
 
        memset(&params, 0, sizeof(params));
        if (test_jumbo) {
@@ -264,7 +265,14 @@ static odp_pktio_t create_pktio(const char *iface)
        pool = odp_pool_create(pool_name, ODP_SHM_NULL, &params);
        CU_ASSERT(pool != ODP_POOL_INVALID);
 
-       pktio = odp_pktio_open(iface, pool);
+       memset(&pktio_param, 0, sizeof(pktio_param));
+
+       if (q_type == ODP_QUEUE_TYPE_POLL)
+               pktio_param.in_mode = ODP_PKTIN_MODE_POLL;
+       else
+               pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       pktio = odp_pktio_open(iface, pool, &pktio_param);
        if (pktio == ODP_PKTIO_INVALID)
                pktio = odp_pktio_lookup(iface);
        CU_ASSERT(pktio != ODP_PKTIO_INVALID);
@@ -452,7 +460,7 @@ static void pktio_test_txrx(odp_queue_type_t q_type, int 
num_pkts)
                io = &pktios[i];
 
                io->name = iface_name[i];
-               io->id   = create_pktio(iface_name[i]);
+               io->id   = create_pktio(iface_name[i], q_type);
                if (io->id == ODP_PKTIO_INVALID) {
                        CU_FAIL("failed to open iface");
                        return;
@@ -508,7 +516,7 @@ static void test_odp_pktio_mtu(void)
 {
        int ret;
        int mtu;
-       odp_pktio_t pktio = create_pktio(iface_name[0]);
+       odp_pktio_t pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
 
        mtu = odp_pktio_mtu(pktio);
        CU_ASSERT(mtu > 0);
@@ -524,7 +532,7 @@ static void test_odp_pktio_mtu(void)
 static void test_odp_pktio_promisc(void)
 {
        int ret;
-       odp_pktio_t pktio = create_pktio(iface_name[0]);
+       odp_pktio_t pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
 
        ret = odp_pktio_promisc_mode_set(pktio, 1);
        CU_ASSERT(0 == ret);
@@ -551,7 +559,7 @@ static void test_odp_pktio_mac(void)
        unsigned char mac_addr[ODPH_ETHADDR_LEN];
        int mac_len;
        int ret;
-       odp_pktio_t pktio = create_pktio(iface_name[0]);
+       odp_pktio_t pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
 
        printf("testing mac for %s\n", iface_name[0]);
 
@@ -574,7 +582,7 @@ static void test_odp_pktio_mac(void)
 
 static void test_odp_pktio_inq_remdef(void)
 {
-       odp_pktio_t pktio = create_pktio(iface_name[0]);
+       odp_pktio_t pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
        odp_queue_t inq;
        odp_event_t ev;
        int i;
@@ -599,29 +607,38 @@ static void test_odp_pktio_inq_remdef(void)
 static void test_odp_pktio_open(void)
 {
        odp_pktio_t pktio;
+       odp_pktio_param_t pktio_param;
        int i;
 
        /* test the sequence open->close->open->close() */
        for (i = 0; i < 2; ++i) {
-               pktio = create_pktio(iface_name[0]);
+               pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
                CU_ASSERT(pktio != ODP_PKTIO_INVALID);
                CU_ASSERT(odp_pktio_close(pktio) == 0);
        }
 
-       pktio = odp_pktio_open("nothere", default_pkt_pool);
+       memset(&pktio_param, 0, sizeof(pktio_param));
+       pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       pktio = odp_pktio_open("nothere", default_pkt_pool, &pktio_param);
        CU_ASSERT(pktio == ODP_PKTIO_INVALID);
 }
 
 static void test_odp_pktio_lookup(void)
 {
        odp_pktio_t pktio, pktio_inval;
+       odp_pktio_param_t pktio_param;
 
-       pktio = odp_pktio_open(iface_name[0], default_pkt_pool);
+       memset(&pktio_param, 0, sizeof(pktio_param));
+       pktio_param.in_mode = ODP_PKTIN_MODE_SCHED;
+
+       pktio = odp_pktio_open(iface_name[0], default_pkt_pool, &pktio_param);
        CU_ASSERT(pktio != ODP_PKTIO_INVALID);
 
        CU_ASSERT(odp_pktio_lookup(iface_name[0]) == pktio);
 
-       pktio_inval = odp_pktio_open(iface_name[0], default_pkt_pool);
+       pktio_inval = odp_pktio_open(iface_name[0], default_pkt_pool,
+                                    &pktio_param);
        CU_ASSERT(odp_errno() != 0);
        CU_ASSERT(pktio_inval == ODP_PKTIO_INVALID);
 
@@ -634,7 +651,7 @@ static void test_odp_pktio_inq(void)
 {
        odp_pktio_t pktio;
 
-       pktio = create_pktio(iface_name[0]);
+       pktio = create_pktio(iface_name[0], ODP_QUEUE_TYPE_SCHED);
        CU_ASSERT(pktio != ODP_PKTIO_INVALID);
 
        CU_ASSERT(create_inq(pktio) == 0);
-- 
2.3.4

_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to