On Mon, Mar 30, 2015 at 12:23 PM, Petri Savolainen <
petri.savolai...@nokia.com> 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 <petri.savolai...@nokia.com>
> ---
>  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(&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
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to