On Mon, Mar 30, 2015 at 12:23 PM, Petri Savolainen < [email protected]> wrote:
> 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); > + } > > Since you're standardizing terms in this patch series, why not APPL_MODE_PKT_RECV to pair with ODP_PKTIN_MODE_RECV, etc.? Having BURST ==> RECV and QUEUE ==> POLL seems non-intuitive. > /* 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 >
_______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
