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(¶m, 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(¶ms, 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, ¶ms); 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
