diff mbox

[CLOUD-DEV] ddf: examples: add ddf module skeleton and ddf application

Message ID 1498032644-26189-2-git-send-email-bogdan.pricope@linaro.org
State Superseded
Headers show

Commit Message

Bogdan Pricope June 21, 2017, 8:10 a.m. UTC
Signed-off-by: Bogdan Pricope <bogdan.pricope@linaro.org>

---
 example/Makefile.am                     |  4 +-
 example/ddf_app/Makefile.am             | 10 ++++
 example/ddf_app/odp_ddf_app.c           | 49 +++++++++++++++++++
 example/ddf_ifs/Makefile.am             | 26 ++++++++++
 example/ddf_ifs/ddf_ifs.c               | 28 +++++++++++
 example/ddf_ifs/ddf_ifs.h               | 18 +++++++
 example/ddf_ifs/ddf_ifs_api.h           | 25 ++++++++++
 example/ddf_ifs/ddf_ifs_dev_dpdk.c      | 25 ++++++++++
 example/ddf_ifs/ddf_ifs_dev_dpdk.h      | 24 +++++++++
 example/ddf_ifs/ddf_ifs_devio_direct.c  | 51 +++++++++++++++++++
 example/ddf_ifs/ddf_ifs_devio_direct.h  | 20 ++++++++
 example/ddf_ifs/ddf_ifs_driver.c        | 69 ++++++++++++++++++++++++++
 example/ddf_ifs/ddf_ifs_driver.h        | 20 ++++++++
 example/ddf_ifs/ddf_ifs_enumr_class.c   | 47 ++++++++++++++++++
 example/ddf_ifs/ddf_ifs_enumr_class.h   | 20 ++++++++
 example/ddf_ifs/ddf_ifs_enumr_dpdk.c    | 86 +++++++++++++++++++++++++++++++++
 example/ddf_ifs/ddf_ifs_enumr_dpdk.h    | 20 ++++++++
 example/ddf_ifs/ddf_ifs_enumr_generic.c | 57 ++++++++++++++++++++++
 example/ddf_ifs/ddf_ifs_enumr_generic.h | 20 ++++++++
 example/ddf_ifs/odp.conf                |  4 ++
 example/m4/configure.m4                 |  2 +
 21 files changed, 624 insertions(+), 1 deletion(-)
 create mode 100644 example/ddf_app/Makefile.am
 create mode 100644 example/ddf_app/odp_ddf_app.c
 create mode 100644 example/ddf_ifs/Makefile.am
 create mode 100644 example/ddf_ifs/ddf_ifs.c
 create mode 100644 example/ddf_ifs/ddf_ifs.h
 create mode 100644 example/ddf_ifs/ddf_ifs_api.h
 create mode 100644 example/ddf_ifs/ddf_ifs_dev_dpdk.c
 create mode 100644 example/ddf_ifs/ddf_ifs_dev_dpdk.h
 create mode 100644 example/ddf_ifs/ddf_ifs_devio_direct.c
 create mode 100644 example/ddf_ifs/ddf_ifs_devio_direct.h
 create mode 100644 example/ddf_ifs/ddf_ifs_driver.c
 create mode 100644 example/ddf_ifs/ddf_ifs_driver.h
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_class.c
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_class.h
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_dpdk.c
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_dpdk.h
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_generic.c
 create mode 100644 example/ddf_ifs/ddf_ifs_enumr_generic.h
 create mode 100644 example/ddf_ifs/odp.conf

-- 
1.9.1

Comments

Yi He June 22, 2017, 5:18 a.m. UTC | #1
Hi, Bogdan

This looks good to me as an evaluation example of the DDF, two comments:

1, Copyright (c) 2014, Linaro Limited needs to be updated.
2, make distcheck failures:

Making all in ddf_ifs
make[3]: Entering directory
'/home/yihe01/workspace/odp-linux/opendataplane-1.14.0.0/_build/sub/example/ddf_ifs'

 CC       ddf_ifs.lo
 CC       ddf_ifs_enumr_class.lo
 CC       ddf_ifs_enumr_dpdk.lo
../../../../example/ddf_ifs/ddf_ifs_enumr_dpdk.c:9:25: fatal error:
ddf_ifs_api.h: No such file or directory
compilation terminated.

thanks and best regards, Yi

On 21 June 2017 at 16:10, Bogdan Pricope <bogdan.pricope@linaro.org> wrote:

> Signed-off-by: Bogdan Pricope <bogdan.pricope@linaro.org>

> ---

>  example/Makefile.am                     |  4 +-

>  example/ddf_app/Makefile.am             | 10 ++++

>  example/ddf_app/odp_ddf_app.c           | 49 +++++++++++++++++++

>  example/ddf_ifs/Makefile.am             | 26 ++++++++++

>  example/ddf_ifs/ddf_ifs.c               | 28 +++++++++++

>  example/ddf_ifs/ddf_ifs.h               | 18 +++++++

>  example/ddf_ifs/ddf_ifs_api.h           | 25 ++++++++++

>  example/ddf_ifs/ddf_ifs_dev_dpdk.c      | 25 ++++++++++

>  example/ddf_ifs/ddf_ifs_dev_dpdk.h      | 24 +++++++++

>  example/ddf_ifs/ddf_ifs_devio_direct.c  | 51 +++++++++++++++++++

>  example/ddf_ifs/ddf_ifs_devio_direct.h  | 20 ++++++++

>  example/ddf_ifs/ddf_ifs_driver.c        | 69 ++++++++++++++++++++++++++

>  example/ddf_ifs/ddf_ifs_driver.h        | 20 ++++++++

>  example/ddf_ifs/ddf_ifs_enumr_class.c   | 47 ++++++++++++++++++

>  example/ddf_ifs/ddf_ifs_enumr_class.h   | 20 ++++++++

>  example/ddf_ifs/ddf_ifs_enumr_dpdk.c    | 86

> +++++++++++++++++++++++++++++++++

>  example/ddf_ifs/ddf_ifs_enumr_dpdk.h    | 20 ++++++++

>  example/ddf_ifs/ddf_ifs_enumr_generic.c | 57 ++++++++++++++++++++++

>  example/ddf_ifs/ddf_ifs_enumr_generic.h | 20 ++++++++

>  example/ddf_ifs/odp.conf                |  4 ++

>  example/m4/configure.m4                 |  2 +

>  21 files changed, 624 insertions(+), 1 deletion(-)

>  create mode 100644 example/ddf_app/Makefile.am

>  create mode 100644 example/ddf_app/odp_ddf_app.c

>  create mode 100644 example/ddf_ifs/Makefile.am

>  create mode 100644 example/ddf_ifs/ddf_ifs.c

>  create mode 100644 example/ddf_ifs/ddf_ifs.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_api.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_dev_dpdk.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_dev_dpdk.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_devio_direct.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_devio_direct.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_driver.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_driver.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_class.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_class.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_dpdk.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_dpdk.h

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_generic.c

>  create mode 100644 example/ddf_ifs/ddf_ifs_enumr_generic.h

>  create mode 100644 example/ddf_ifs/odp.conf

>

> diff --git a/example/Makefile.am b/example/Makefile.am

> index dfc07b6..b209585 100644

> --- a/example/Makefile.am

> +++ b/example/Makefile.am

> @@ -8,4 +8,6 @@ SUBDIRS = classifier \

>           switch \

>           time \

>           timer \

> -         traffic_mgmt

> +         traffic_mgmt \

> +         ddf_ifs \

> +         ddf_app

> diff --git a/example/ddf_app/Makefile.am b/example/ddf_app/Makefile.am

> new file mode 100644

> index 0000000..e654202

> --- /dev/null

> +++ b/example/ddf_app/Makefile.am

> @@ -0,0 +1,10 @@

> +include $(top_srcdir)/example/Makefile.inc

> +

> +bin_PROGRAMS = odp_ddf_app$(EXEEXT)

> +odp_ddf_app_LDFLAGS = $(AM_LDFLAGS) -shared

> +odp_ddf_app_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example

> +

> +noinst_HEADERS = \

> +                 $(top_srcdir)/example/example_debug.h

> +

> +dist_odp_ddf_app_SOURCES = odp_ddf_app.c

> diff --git a/example/ddf_app/odp_ddf_app.c b/example/ddf_app/odp_ddf_app.c

> new file mode 100644

> index 0000000..c2d7abf

> --- /dev/null

> +++ b/example/ddf_app/odp_ddf_app.c

> @@ -0,0 +1,49 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +/** enable strtok */

> +#ifndef _GNU_SOURCE

> +#define _GNU_SOURCE

> +#endif

> +

> +#include <stdio.h>

> +#include <stdlib.h>

> +

> +#include <example_debug.h>

> +#include <odp_api.h>

> +#include <odp_drv.h>

> +#include <odp/helper/odph_api.h>

> +

> +int main(int argc, char *argv[])

> +{

> +       odp_instance_t instance;

> +

> +       (void)argc;

> +       (void)argv;

> +

> +       EXAMPLE_DBG("Start DDF Application...\n");

> +

> +       /* Initialize ODP before calling anything else */

> +       if (odp_init_global(&instance, NULL, NULL)) {

> +               EXAMPLE_ERR("Error: ODP global init failed.\n");

> +               exit(EXIT_FAILURE);

> +       }

> +

> +       if (odp_init_local(instance, ODP_THREAD_CONTROL)) {

> +               EXAMPLE_ERR("Error: ODP local init failed.\n");

> +               exit(EXIT_FAILURE);

> +       }

> +

> +       /* Print ddf objects*/

> +       odpdrv_print_all();

> +

> +       /* Terminate ODP */

> +       odp_term_local();

> +       odp_term_global(instance);

> +

> +       EXAMPLE_DBG("Exit DDF Application.\n");

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/Makefile.am b/example/ddf_ifs/Makefile.am

> new file mode 100644

> index 0000000..b11cf3d

> --- /dev/null

> +++ b/example/ddf_ifs/Makefile.am

> @@ -0,0 +1,26 @@

> +LIB   = $(top_builddir)/lib

> +

> +AM_CPPFLAGS +=  -I$(srcdir) \

> +               -I$(top_srcdir)/include \

> +               -I$(top_srcdir)/platform/@with_platform@/include \

> +               -I$(top_srcdir)/platform/@with_platform@/arch/@ARCH_DIR@

> +

> +lib_LTLIBRARIES = $(LIB)/libddf_ifs.la

> +

> +noinst_HEADERS = \

> +                $(srcdir)/ddf_ifs.h \

> +                $(srcdir)/ddf_ifs_enumr_class.h \

> +                $(srcdir)/ddf_ifs_enumr_dpdk.h \

> +                $(srcdir)/ddf_ifs_enumr_generic.h \

> +                $(srcdir)/ddf_ifs_dev_dpdk.h \

> +                $(srcdir)/ddf_ifs_devio_direct.h \

> +                $(srcdir)/ddf_ifs_driver.h

> +

> +__LIB__libddf_ifs_la_SOURCES = \

> +               ddf_ifs.c \

> +               ddf_ifs_enumr_class.c \

> +               ddf_ifs_enumr_dpdk.c \

> +               ddf_ifs_enumr_generic.c \

> +               ddf_ifs_dev_dpdk.c \

> +               ddf_ifs_devio_direct.c \

> +               ddf_ifs_driver.c

> diff --git a/example/ddf_ifs/ddf_ifs.c b/example/ddf_ifs/ddf_ifs.c

> new file mode 100644

> index 0000000..cd4e48b

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs.c

> @@ -0,0 +1,28 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs.h"

> +#include "ddf_ifs_enumr_class.h"

> +#include "ddf_ifs_devio_direct.h"

> +#include "ddf_ifs_driver.h"

> +

> +static ODPDRV_CONSTRUCTOR void ddf_ifs_construct(void)

> +{

> +       printf("%s()\n", __func__);

> +

> +       register_enumerator_class();

> +

> +       register_devio_direct();

> +

> +       register_driver();

> +}

> +

> +static __attribute__((destructor)) void ddf_ifs_destruct(void)

> +{

> +       printf("%s()\n", __func__);

> +}

> diff --git a/example/ddf_ifs/ddf_ifs.h b/example/ddf_ifs/ddf_ifs.h

> new file mode 100644

> index 0000000..980b520

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs.h

> @@ -0,0 +1,18 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_H_

> +#define _ODP_DDF_IFS_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_api.h b/example/ddf_ifs/ddf_ifs_api.h

> new file mode 100644

> index 0000000..757658e

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_api.h

> @@ -0,0 +1,25 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_API_H_

> +#define _ODP_DDF_IFS_API_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +#define DDF_IFS_DEV_API_NAME "ifs_api"

> +#define DDF_IFS_DEV_API_VER 0

> +#define DDF_IFS_DEVIO_API_NAME "devio_api"

> +#define DDF_IFS_DEVIO_API_VER 0

> +

> +#define DDF_IFS_DRV_NAME "ddf_ifs_drv"

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_API_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_dev_dpdk.c

> b/example/ddf_ifs/ddf_ifs_dev_dpdk.c

> new file mode 100644

> index 0000000..d66a15c

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_dev_dpdk.c

> @@ -0,0 +1,25 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include <string.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_dev_dpdk.h"

> +

> +odpdrv_device_t dpdk_device_create(odpdrv_enumr_t enumr,

> +                                  const char *dev_addr,

> +                                  void *enum_data)

> +{

> +       odpdrv_device_param_t param;

> +

> +       printf("\t%s(%s)\n", __func__, dev_addr);

> +

> +       param.enumerator = enumr;

> +       strcpy(param.address, dev_addr);

> +       param.enum_dev = enum_data;

> +

> +       return odpdrv_device_create(&param);

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_dev_dpdk.h

> b/example/ddf_ifs/ddf_ifs_dev_dpdk.h

> new file mode 100644

> index 0000000..2a81f6a

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_dev_dpdk.h

> @@ -0,0 +1,24 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_DEV_DPDK_H_

> +#define _ODP_DDF_IFS_DEV_DPDK_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +#include "odp_drv.h"

> +

> +odpdrv_device_t dpdk_device_create(odpdrv_enumr_t enumr,

> +                                  const char *dev_addr,

> +                                  void *enum_data);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_DEV_DPDK_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_devio_direct.c

> b/example/ddf_ifs/ddf_ifs_devio_direct.c

> new file mode 100644

> index 0000000..ea508a0

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_devio_direct.c

> @@ -0,0 +1,51 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_api.h"

> +#include "ddf_ifs_devio_direct.h"

> +

> +static odpdrv_devio_t devio_direct;

> +

> +static int devio_direct_probe(odpdrv_device_t dev)

> +{

> +       (void)dev;

> +

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +static int devio_direct_remove(void)

> +{

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +int register_devio_direct(void)

> +{

> +       odpdrv_devio_param_t param = {

> +               .api_name = DDF_IFS_DEVIO_API_NAME,

> +               .api_version = DDF_IFS_DEVIO_API_VER,

> +               .enumr_api_name = DDF_IFS_DEV_API_NAME,

> +               .enumr_api_version = DDF_IFS_DEV_API_VER,

> +               .probe = devio_direct_probe,

> +               .remove = devio_direct_remove,

> +               .ops = NULL

> +               };

> +

> +       printf("\t%s()\n", __func__);

> +

> +       devio_direct = odpdrv_devio_register(&param);

> +       if (ODPDRV_DEVIO_INVALID == devio_direct) {

> +               printf("\tError: failed to %s()\n", __func__);

> +               return -1;

> +       }

> +

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_devio_direct.h

> b/example/ddf_ifs/ddf_ifs_devio_direct.h

> new file mode 100644

> index 0000000..28c549d

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_devio_direct.h

> @@ -0,0 +1,20 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_DEVIO_DIRECT_H_

> +#define _ODP_DDF_IFS_DEVIO_DIRECT_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +int register_devio_direct(void);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_DEVIO_DIRECT_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_driver.c b/example/ddf_ifs/ddf_ifs_

> driver.c

> new file mode 100644

> index 0000000..2dc5870

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_driver.c

> @@ -0,0 +1,69 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include <string.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_api.h"

> +#include "ddf_ifs_driver.h"

> +

> +static odpdrv_driver_t ddf_ifs_driver;

> +static int drv_data = 12;

> +

> +static int ddf_ifs_driver_probe(odpdrv_device_t dev, odpdrv_devio_t

> devio,

> +                               int devio_idx)

> +{

> +       printf("%s(dev, devio, devio_idx = %d)\n", __func__, devio_idx);

> +

> +       (void)devio;

> +

> +       odpdrv_device_set_data(dev, (void *)&drv_data);

> +

> +       return 0;

> +}

> +

> +static int ddf_ifs_driver_unbind(odpdrv_device_t dev,

> +                                void (*callback)(odpdrv_device_t dev),

> +                                uint32_t flags)

> +{

> +       printf("%s()\n", __func__);

> +

> +       if (!(flags & ODPDRV_DRV_UNBIND_IMMEDIATE))

> +               return -1; /* unsupported*/

> +

> +       callback(dev);

> +

> +       return 0;

> +}

> +

> +static int ddf_ifs_driver_remove(void)

> +{

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +int register_driver(void)

> +{

> +       odpdrv_driver_param_t param = {

> +               .name = DDF_IFS_DRV_NAME,

> +               .devios = {{DDF_IFS_DEVIO_API_NAME, DDF_IFS_DEVIO_API_VER},

> +                                  {"", 0}, {"", 0} },

> +               .probe = ddf_ifs_driver_probe,

> +               .unbind = ddf_ifs_driver_unbind,

> +               .remove = ddf_ifs_driver_remove,

> +               };

> +

> +       printf("\t%s()\n", __func__);

> +

> +       ddf_ifs_driver = odpdrv_driver_register(&param);

> +       if (ODPDRV_DRIVER_INVALID == ddf_ifs_driver) {

> +               printf("Error: Failed to %s()\n", __func__);

> +               return -1;

> +       }

> +

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_driver.h b/example/ddf_ifs/ddf_ifs_

> driver.h

> new file mode 100644

> index 0000000..4954c5a

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_driver.h

> @@ -0,0 +1,20 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_DRIVER_H_

> +#define _ODP_DDF_IFS_DRIVER_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +int register_driver(void);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_DRIVER_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_class.c

> b/example/ddf_ifs/ddf_ifs_enumr_class.c

> new file mode 100644

> index 0000000..a7b5d51

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_class.c

> @@ -0,0 +1,47 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_enumr_class.h"

> +#include "ddf_ifs_enumr_dpdk.h"

> +#include "ddf_ifs_enumr_generic.h"

> +

> +static odpdrv_enumr_class_t enumr_class;

> +

> +static int enumr_class_ifs_probe(void)

> +{

> +       printf("%s()\n", __func__);

> +

> +       if (register_enumerator_dpdk(enumr_class))

> +               return -1;

> +

> +       if (register_enumerator_generic(enumr_class))

> +               return -1;

> +

> +       return 0;

> +}

> +

> +static int enumr_class_ifs_remove(void)

> +{

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +int register_enumerator_class(void)

> +{

> +       odpdrv_enumr_class_param_t param = {

> +               .name = "enumr_class_ifs",

> +               .probe = enumr_class_ifs_probe,

> +               .remove = enumr_class_ifs_remove

> +               };

> +

> +       printf("\t%s()\n", __func__);

> +       enumr_class = odpdrv_enumr_class_register(&param);

> +

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_class.h

> b/example/ddf_ifs/ddf_ifs_enumr_class.h

> new file mode 100644

> index 0000000..42c02fc

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_class.h

> @@ -0,0 +1,20 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_ENUMR_CLASS_H_

> +#define _ODP_DDF_IFS_ENUMR_CLASS_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +int register_enumerator_class(void);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_ENUMR_CLASS_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c

> b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c

> new file mode 100644

> index 0000000..cc97e36

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c

> @@ -0,0 +1,86 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_api.h"

> +#include "ddf_ifs_enumr_dpdk.h"

> +#include "ddf_ifs_dev_dpdk.h"

> +

> +static odpdrv_enumr_t dpdk_enumr;

> +

> +#define TEST_DPDK_DEV_CNT 3

> +#define DDF_DPDK_DEV_MAX 10

> +

> +static odpdrv_device_t dpdk_dev[DDF_DPDK_DEV_MAX];

> +static int dpdk_dev_cnt;

> +static int dpdk_enumr_probe(void)

> +{

> +       int dpdk_dev_cnt_detected = TEST_DPDK_DEV_CNT; /* detected with

> +                                                         dpdk APIs*/

> +       char dev_addr[ODPDRV_NAME_ADDR_SZ];

> +       int i;

> +

> +       printf("%s() - %d devices found\n", __func__,

> dpdk_dev_cnt_detected);

> +

> +       if (dpdk_dev_cnt_detected > DDF_DPDK_DEV_MAX) {

> +               dpdk_dev_cnt_detected = DDF_DPDK_DEV_MAX;

> +               printf("\tWarning: dpdk device count scaled down to %d\n",

> +                      dpdk_dev_cnt_detected);

> +       }

> +       for (i = 0; i < dpdk_dev_cnt_detected; i++) {

> +               sprintf(dev_addr, "0000:01:00.%d", i);

> +               dpdk_dev[dpdk_dev_cnt] = dpdk_device_create(dpdk_enumr,

> +                                                           dev_addr,

> +                                                           NULL);

> +               if (dpdk_dev[dpdk_dev_cnt] == ODPDRV_DEVICE_INVALID)

> +                       printf("\tError: unable to create device: %s\n",

> +                              dev_addr);

> +               else

> +                       dpdk_dev_cnt++;

> +       }

> +

> +       return 0;

> +}

> +

> +static int dpdk_enumr_remove(void)

> +{

> +       printf("%s()\n", __func__);

> +       return 0;

> +}

> +

> +static int dpdk_enumr_register_notif(void (*event_handler) (uint64_t

> event),

> +                                    int64_t event_mask)

> +{

> +       (void)event_handler;

> +       (void)event_mask;

> +

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +int register_enumerator_dpdk(odpdrv_enumr_class_t enumr_class)

> +{

> +       struct odpdrv_enumr_param_t param = {

> +               .enumr_class = enumr_class,

> +               .api_name = DDF_IFS_DEV_API_NAME,

> +               .api_version = DDF_IFS_DEV_API_VER,

> +               .probe = dpdk_enumr_probe,

> +               .remove = dpdk_enumr_remove,

> +               .register_notifier = dpdk_enumr_register_notif

> +       };

> +

> +       printf("\t%s()\n", __func__);

> +

> +       dpdk_enumr = odpdrv_enumr_register(&param);

> +       if (ODPDRV_ENUMR_INVALID == dpdk_enumr) {

> +               printf("\tError: failed to register_enumerator_dpdk()\n");

> +               return -1;

> +       }

> +

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.h

> b/example/ddf_ifs/ddf_ifs_enumr_dpdk.h

> new file mode 100644

> index 0000000..516d9e3

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.h

> @@ -0,0 +1,20 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_ENUMR_DPDK_H_

> +#define _ODP_DDF_IFS_ENUMR_DPDK_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +int register_enumerator_dpdk(odpdrv_enumr_class_t enumr_class);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_ENUMR_DPDK_H_*/

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.c

> b/example/ddf_ifs/ddf_ifs_enumr_generic.c

> new file mode 100644

> index 0000000..34a59a8

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_generic.c

> @@ -0,0 +1,57 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#include <stdio.h>

> +#include "odp_drv.h"

> +#include "ddf_ifs_api.h"

> +#include "ddf_ifs_enumr_generic.h"

> +

> +static odpdrv_enumr_t gen_enumr;

> +

> +static int gen_enumr_probe(void)

> +{

> +       printf("%s() - no devices found\n", __func__);

> +       return 0;

> +}

> +

> +static int gen_enumr_remove(void)

> +{

> +       printf("%s()\n", __func__);

> +       return 0;

> +}

> +

> +static int gen_enumr_register_notif(void (*event_handler) (uint64_t

> event),

> +                                   int64_t event_mask)

> +{

> +       (void)event_handler;

> +       (void)event_mask;

> +

> +       printf("%s()\n", __func__);

> +

> +       return 0;

> +}

> +

> +int register_enumerator_generic(odpdrv_enumr_class_t enumr_class)

> +{

> +       struct odpdrv_enumr_param_t param = {

> +               .enumr_class = enumr_class,

> +               .api_name = DDF_IFS_DEV_API_NAME,

> +               .api_version = DDF_IFS_DEV_API_VER,

> +               .probe = gen_enumr_probe,

> +               .remove = gen_enumr_remove,

> +               .register_notifier = gen_enumr_register_notif

> +       };

> +

> +       printf("\t%s()\n", __func__);

> +

> +       gen_enumr = odpdrv_enumr_register(&param);

> +       if (ODPDRV_ENUMR_INVALID == gen_enumr) {

> +               printf("\tError:failed to %s()\n", __func__);

> +               return -1;

> +       }

> +

> +       return 0;

> +}

> diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.h

> b/example/ddf_ifs/ddf_ifs_enumr_generic.h

> new file mode 100644

> index 0000000..2f0b8b8

> --- /dev/null

> +++ b/example/ddf_ifs/ddf_ifs_enumr_generic.h

> @@ -0,0 +1,20 @@

> +/* Copyright (c) 2014, Linaro Limited

> + * All rights reserved.

> + *

> + * SPDX-License-Identifier:     BSD-3-Clause

> + */

> +

> +#ifndef _ODP_DDF_IFS_ENUMR_GENERIC_H_

> +#define _ODP_DDF_IFS_ENUMR_GENERIC_H_

> +

> +#ifdef __cplusplus

> +extern "C" {

> +#endif

> +

> +int register_enumerator_generic(odpdrv_enumr_class_t enumr_class);

> +

> +#ifdef __cplusplus

> +}

> +#endif

> +

> +#endif /*_ODP_DDF_IFS_ENUMR_GENERIC_H_*/

> diff --git a/example/ddf_ifs/odp.conf b/example/ddf_ifs/odp.conf

> new file mode 100644

> index 0000000..14968a7

> --- /dev/null

> +++ b/example/ddf_ifs/odp.conf

> @@ -0,0 +1,4 @@

> +module:

> +{

> +       modules = ("libddf_ifs.so.0");

> +};

> diff --git a/example/m4/configure.m4 b/example/m4/configure.m4

> index 620db04..9e7973b 100644

> --- a/example/m4/configure.m4

> +++ b/example/m4/configure.m4

> @@ -21,4 +21,6 @@ AC_CONFIG_FILES([example/classifier/Makefile

>                  example/time/Makefile

>                  example/timer/Makefile

>                  example/traffic_mgmt/Makefile

> +                example/ddf_ifs/Makefile

> +                example/ddf_app/Makefile

>                  example/Makefile])

> --

> 1.9.1

>

>
diff mbox

Patch

diff --git a/example/Makefile.am b/example/Makefile.am
index dfc07b6..b209585 100644
--- a/example/Makefile.am
+++ b/example/Makefile.am
@@ -8,4 +8,6 @@  SUBDIRS = classifier \
 	  switch \
 	  time \
 	  timer \
-	  traffic_mgmt
+	  traffic_mgmt \
+	  ddf_ifs \
+	  ddf_app
diff --git a/example/ddf_app/Makefile.am b/example/ddf_app/Makefile.am
new file mode 100644
index 0000000..e654202
--- /dev/null
+++ b/example/ddf_app/Makefile.am
@@ -0,0 +1,10 @@ 
+include $(top_srcdir)/example/Makefile.inc
+
+bin_PROGRAMS = odp_ddf_app$(EXEEXT)
+odp_ddf_app_LDFLAGS = $(AM_LDFLAGS) -shared
+odp_ddf_app_CFLAGS = $(AM_CFLAGS) -I${top_srcdir}/example
+
+noinst_HEADERS = \
+		  $(top_srcdir)/example/example_debug.h
+
+dist_odp_ddf_app_SOURCES = odp_ddf_app.c
diff --git a/example/ddf_app/odp_ddf_app.c b/example/ddf_app/odp_ddf_app.c
new file mode 100644
index 0000000..c2d7abf
--- /dev/null
+++ b/example/ddf_app/odp_ddf_app.c
@@ -0,0 +1,49 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+/** enable strtok */
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <example_debug.h>
+#include <odp_api.h>
+#include <odp_drv.h>
+#include <odp/helper/odph_api.h>
+
+int main(int argc, char *argv[])
+{
+	odp_instance_t instance;
+
+	(void)argc;
+	(void)argv;
+
+	EXAMPLE_DBG("Start DDF Application...\n");
+
+	/* Initialize ODP before calling anything else */
+	if (odp_init_global(&instance, NULL, NULL)) {
+		EXAMPLE_ERR("Error: ODP global init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
+		EXAMPLE_ERR("Error: ODP local init failed.\n");
+		exit(EXIT_FAILURE);
+	}
+
+	/* Print ddf objects*/
+	odpdrv_print_all();
+
+	/* Terminate ODP */
+	odp_term_local();
+	odp_term_global(instance);
+
+	EXAMPLE_DBG("Exit DDF Application.\n");
+	return 0;
+}
diff --git a/example/ddf_ifs/Makefile.am b/example/ddf_ifs/Makefile.am
new file mode 100644
index 0000000..b11cf3d
--- /dev/null
+++ b/example/ddf_ifs/Makefile.am
@@ -0,0 +1,26 @@ 
+LIB   = $(top_builddir)/lib
+
+AM_CPPFLAGS +=  -I$(srcdir) \
+		-I$(top_srcdir)/include \
+		-I$(top_srcdir)/platform/@with_platform@/include \
+		-I$(top_srcdir)/platform/@with_platform@/arch/@ARCH_DIR@
+
+lib_LTLIBRARIES = $(LIB)/libddf_ifs.la
+
+noinst_HEADERS = \
+		 $(srcdir)/ddf_ifs.h \
+		 $(srcdir)/ddf_ifs_enumr_class.h \
+		 $(srcdir)/ddf_ifs_enumr_dpdk.h \
+		 $(srcdir)/ddf_ifs_enumr_generic.h \
+		 $(srcdir)/ddf_ifs_dev_dpdk.h \
+		 $(srcdir)/ddf_ifs_devio_direct.h \
+		 $(srcdir)/ddf_ifs_driver.h
+
+__LIB__libddf_ifs_la_SOURCES = \
+		ddf_ifs.c \
+		ddf_ifs_enumr_class.c \
+		ddf_ifs_enumr_dpdk.c \
+		ddf_ifs_enumr_generic.c \
+		ddf_ifs_dev_dpdk.c \
+		ddf_ifs_devio_direct.c \
+		ddf_ifs_driver.c
diff --git a/example/ddf_ifs/ddf_ifs.c b/example/ddf_ifs/ddf_ifs.c
new file mode 100644
index 0000000..cd4e48b
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs.c
@@ -0,0 +1,28 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include "odp_drv.h"
+#include "ddf_ifs.h"
+#include "ddf_ifs_enumr_class.h"
+#include "ddf_ifs_devio_direct.h"
+#include "ddf_ifs_driver.h"
+
+static ODPDRV_CONSTRUCTOR void ddf_ifs_construct(void)
+{
+	printf("%s()\n", __func__);
+
+	register_enumerator_class();
+
+	register_devio_direct();
+
+	register_driver();
+}
+
+static __attribute__((destructor)) void ddf_ifs_destruct(void)
+{
+	printf("%s()\n", __func__);
+}
diff --git a/example/ddf_ifs/ddf_ifs.h b/example/ddf_ifs/ddf_ifs.h
new file mode 100644
index 0000000..980b520
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs.h
@@ -0,0 +1,18 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_H_
+#define _ODP_DDF_IFS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_api.h b/example/ddf_ifs/ddf_ifs_api.h
new file mode 100644
index 0000000..757658e
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_api.h
@@ -0,0 +1,25 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_API_H_
+#define _ODP_DDF_IFS_API_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DDF_IFS_DEV_API_NAME "ifs_api"
+#define DDF_IFS_DEV_API_VER 0
+#define DDF_IFS_DEVIO_API_NAME "devio_api"
+#define DDF_IFS_DEVIO_API_VER 0
+
+#define DDF_IFS_DRV_NAME "ddf_ifs_drv"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_API_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_dev_dpdk.c b/example/ddf_ifs/ddf_ifs_dev_dpdk.c
new file mode 100644
index 0000000..d66a15c
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_dev_dpdk.c
@@ -0,0 +1,25 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "odp_drv.h"
+#include "ddf_ifs_dev_dpdk.h"
+
+odpdrv_device_t dpdk_device_create(odpdrv_enumr_t enumr,
+				   const char *dev_addr,
+				   void *enum_data)
+{
+	odpdrv_device_param_t param;
+
+	printf("\t%s(%s)\n", __func__, dev_addr);
+
+	param.enumerator = enumr;
+	strcpy(param.address, dev_addr);
+	param.enum_dev = enum_data;
+
+	return odpdrv_device_create(&param);
+}
diff --git a/example/ddf_ifs/ddf_ifs_dev_dpdk.h b/example/ddf_ifs/ddf_ifs_dev_dpdk.h
new file mode 100644
index 0000000..2a81f6a
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_dev_dpdk.h
@@ -0,0 +1,24 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_DEV_DPDK_H_
+#define _ODP_DDF_IFS_DEV_DPDK_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "odp_drv.h"
+
+odpdrv_device_t dpdk_device_create(odpdrv_enumr_t enumr,
+				   const char *dev_addr,
+				   void *enum_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_DEV_DPDK_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_devio_direct.c b/example/ddf_ifs/ddf_ifs_devio_direct.c
new file mode 100644
index 0000000..ea508a0
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_devio_direct.c
@@ -0,0 +1,51 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include "odp_drv.h"
+#include "ddf_ifs_api.h"
+#include "ddf_ifs_devio_direct.h"
+
+static odpdrv_devio_t devio_direct;
+
+static int devio_direct_probe(odpdrv_device_t dev)
+{
+	(void)dev;
+
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+static int devio_direct_remove(void)
+{
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+int register_devio_direct(void)
+{
+	odpdrv_devio_param_t param = {
+		.api_name = DDF_IFS_DEVIO_API_NAME,
+		.api_version = DDF_IFS_DEVIO_API_VER,
+		.enumr_api_name = DDF_IFS_DEV_API_NAME,
+		.enumr_api_version = DDF_IFS_DEV_API_VER,
+		.probe = devio_direct_probe,
+		.remove = devio_direct_remove,
+		.ops = NULL
+		};
+
+	printf("\t%s()\n", __func__);
+
+	devio_direct = odpdrv_devio_register(&param);
+	if (ODPDRV_DEVIO_INVALID == devio_direct) {
+		printf("\tError: failed to %s()\n", __func__);
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/example/ddf_ifs/ddf_ifs_devio_direct.h b/example/ddf_ifs/ddf_ifs_devio_direct.h
new file mode 100644
index 0000000..28c549d
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_devio_direct.h
@@ -0,0 +1,20 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_DEVIO_DIRECT_H_
+#define _ODP_DDF_IFS_DEVIO_DIRECT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int register_devio_direct(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_DEVIO_DIRECT_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_driver.c b/example/ddf_ifs/ddf_ifs_driver.c
new file mode 100644
index 0000000..2dc5870
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_driver.c
@@ -0,0 +1,69 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "odp_drv.h"
+#include "ddf_ifs_api.h"
+#include "ddf_ifs_driver.h"
+
+static odpdrv_driver_t ddf_ifs_driver;
+static int drv_data = 12;
+
+static int ddf_ifs_driver_probe(odpdrv_device_t dev, odpdrv_devio_t devio,
+				int devio_idx)
+{
+	printf("%s(dev, devio, devio_idx = %d)\n", __func__, devio_idx);
+
+	(void)devio;
+
+	odpdrv_device_set_data(dev, (void *)&drv_data);
+
+	return 0;
+}
+
+static int ddf_ifs_driver_unbind(odpdrv_device_t dev,
+				 void (*callback)(odpdrv_device_t dev),
+				 uint32_t flags)
+{
+	printf("%s()\n", __func__);
+
+	if (!(flags & ODPDRV_DRV_UNBIND_IMMEDIATE))
+		return -1; /* unsupported*/
+
+	callback(dev);
+
+	return 0;
+}
+
+static int ddf_ifs_driver_remove(void)
+{
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+int register_driver(void)
+{
+	odpdrv_driver_param_t param = {
+		.name = DDF_IFS_DRV_NAME,
+		.devios = {{DDF_IFS_DEVIO_API_NAME, DDF_IFS_DEVIO_API_VER},
+				   {"", 0}, {"", 0} },
+		.probe = ddf_ifs_driver_probe,
+		.unbind = ddf_ifs_driver_unbind,
+		.remove = ddf_ifs_driver_remove,
+		};
+
+	printf("\t%s()\n", __func__);
+
+	ddf_ifs_driver = odpdrv_driver_register(&param);
+	if (ODPDRV_DRIVER_INVALID == ddf_ifs_driver) {
+		printf("Error: Failed to %s()\n", __func__);
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/example/ddf_ifs/ddf_ifs_driver.h b/example/ddf_ifs/ddf_ifs_driver.h
new file mode 100644
index 0000000..4954c5a
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_driver.h
@@ -0,0 +1,20 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_DRIVER_H_
+#define _ODP_DDF_IFS_DRIVER_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int register_driver(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_DRIVER_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_enumr_class.c b/example/ddf_ifs/ddf_ifs_enumr_class.c
new file mode 100644
index 0000000..a7b5d51
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_class.c
@@ -0,0 +1,47 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include "odp_drv.h"
+#include "ddf_ifs_enumr_class.h"
+#include "ddf_ifs_enumr_dpdk.h"
+#include "ddf_ifs_enumr_generic.h"
+
+static odpdrv_enumr_class_t enumr_class;
+
+static int enumr_class_ifs_probe(void)
+{
+	printf("%s()\n", __func__);
+
+	if (register_enumerator_dpdk(enumr_class))
+		return -1;
+
+	if (register_enumerator_generic(enumr_class))
+		return -1;
+
+	return 0;
+}
+
+static int enumr_class_ifs_remove(void)
+{
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+int register_enumerator_class(void)
+{
+	odpdrv_enumr_class_param_t param = {
+		.name = "enumr_class_ifs",
+		.probe = enumr_class_ifs_probe,
+		.remove = enumr_class_ifs_remove
+		};
+
+	printf("\t%s()\n", __func__);
+	enumr_class = odpdrv_enumr_class_register(&param);
+
+	return 0;
+}
diff --git a/example/ddf_ifs/ddf_ifs_enumr_class.h b/example/ddf_ifs/ddf_ifs_enumr_class.h
new file mode 100644
index 0000000..42c02fc
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_class.h
@@ -0,0 +1,20 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_ENUMR_CLASS_H_
+#define _ODP_DDF_IFS_ENUMR_CLASS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int register_enumerator_class(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_ENUMR_CLASS_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.c b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c
new file mode 100644
index 0000000..cc97e36
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.c
@@ -0,0 +1,86 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include "odp_drv.h"
+#include "ddf_ifs_api.h"
+#include "ddf_ifs_enumr_dpdk.h"
+#include "ddf_ifs_dev_dpdk.h"
+
+static odpdrv_enumr_t dpdk_enumr;
+
+#define TEST_DPDK_DEV_CNT 3
+#define DDF_DPDK_DEV_MAX 10
+
+static odpdrv_device_t dpdk_dev[DDF_DPDK_DEV_MAX];
+static int dpdk_dev_cnt;
+static int dpdk_enumr_probe(void)
+{
+	int dpdk_dev_cnt_detected = TEST_DPDK_DEV_CNT; /* detected with
+							  dpdk APIs*/
+	char dev_addr[ODPDRV_NAME_ADDR_SZ];
+	int i;
+
+	printf("%s() - %d devices found\n", __func__, dpdk_dev_cnt_detected);
+
+	if (dpdk_dev_cnt_detected > DDF_DPDK_DEV_MAX) {
+		dpdk_dev_cnt_detected = DDF_DPDK_DEV_MAX;
+		printf("\tWarning: dpdk device count scaled down to %d\n",
+		       dpdk_dev_cnt_detected);
+	}
+	for (i = 0; i < dpdk_dev_cnt_detected; i++) {
+		sprintf(dev_addr, "0000:01:00.%d", i);
+		dpdk_dev[dpdk_dev_cnt] = dpdk_device_create(dpdk_enumr,
+							    dev_addr,
+							    NULL);
+		if (dpdk_dev[dpdk_dev_cnt] == ODPDRV_DEVICE_INVALID)
+			printf("\tError: unable to create device: %s\n",
+			       dev_addr);
+		else
+			dpdk_dev_cnt++;
+	}
+
+	return 0;
+}
+
+static int dpdk_enumr_remove(void)
+{
+	printf("%s()\n", __func__);
+	return 0;
+}
+
+static int dpdk_enumr_register_notif(void (*event_handler) (uint64_t event),
+				     int64_t event_mask)
+{
+	(void)event_handler;
+	(void)event_mask;
+
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+int register_enumerator_dpdk(odpdrv_enumr_class_t enumr_class)
+{
+	struct odpdrv_enumr_param_t param = {
+		.enumr_class = enumr_class,
+		.api_name = DDF_IFS_DEV_API_NAME,
+		.api_version = DDF_IFS_DEV_API_VER,
+		.probe = dpdk_enumr_probe,
+		.remove = dpdk_enumr_remove,
+		.register_notifier = dpdk_enumr_register_notif
+	};
+
+	printf("\t%s()\n", __func__);
+
+	dpdk_enumr = odpdrv_enumr_register(&param);
+	if (ODPDRV_ENUMR_INVALID == dpdk_enumr) {
+		printf("\tError: failed to register_enumerator_dpdk()\n");
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/example/ddf_ifs/ddf_ifs_enumr_dpdk.h b/example/ddf_ifs/ddf_ifs_enumr_dpdk.h
new file mode 100644
index 0000000..516d9e3
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_dpdk.h
@@ -0,0 +1,20 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_ENUMR_DPDK_H_
+#define _ODP_DDF_IFS_ENUMR_DPDK_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int register_enumerator_dpdk(odpdrv_enumr_class_t enumr_class);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_ENUMR_DPDK_H_*/
diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.c b/example/ddf_ifs/ddf_ifs_enumr_generic.c
new file mode 100644
index 0000000..34a59a8
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_generic.c
@@ -0,0 +1,57 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <stdio.h>
+#include "odp_drv.h"
+#include "ddf_ifs_api.h"
+#include "ddf_ifs_enumr_generic.h"
+
+static odpdrv_enumr_t gen_enumr;
+
+static int gen_enumr_probe(void)
+{
+	printf("%s() - no devices found\n", __func__);
+	return 0;
+}
+
+static int gen_enumr_remove(void)
+{
+	printf("%s()\n", __func__);
+	return 0;
+}
+
+static int gen_enumr_register_notif(void (*event_handler) (uint64_t event),
+				    int64_t event_mask)
+{
+	(void)event_handler;
+	(void)event_mask;
+
+	printf("%s()\n", __func__);
+
+	return 0;
+}
+
+int register_enumerator_generic(odpdrv_enumr_class_t enumr_class)
+{
+	struct odpdrv_enumr_param_t param = {
+		.enumr_class = enumr_class,
+		.api_name = DDF_IFS_DEV_API_NAME,
+		.api_version = DDF_IFS_DEV_API_VER,
+		.probe = gen_enumr_probe,
+		.remove = gen_enumr_remove,
+		.register_notifier = gen_enumr_register_notif
+	};
+
+	printf("\t%s()\n", __func__);
+
+	gen_enumr = odpdrv_enumr_register(&param);
+	if (ODPDRV_ENUMR_INVALID == gen_enumr) {
+		printf("\tError:failed to %s()\n", __func__);
+		return -1;
+	}
+
+	return 0;
+}
diff --git a/example/ddf_ifs/ddf_ifs_enumr_generic.h b/example/ddf_ifs/ddf_ifs_enumr_generic.h
new file mode 100644
index 0000000..2f0b8b8
--- /dev/null
+++ b/example/ddf_ifs/ddf_ifs_enumr_generic.h
@@ -0,0 +1,20 @@ 
+/* Copyright (c) 2014, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_DDF_IFS_ENUMR_GENERIC_H_
+#define _ODP_DDF_IFS_ENUMR_GENERIC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int register_enumerator_generic(odpdrv_enumr_class_t enumr_class);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ODP_DDF_IFS_ENUMR_GENERIC_H_*/
diff --git a/example/ddf_ifs/odp.conf b/example/ddf_ifs/odp.conf
new file mode 100644
index 0000000..14968a7
--- /dev/null
+++ b/example/ddf_ifs/odp.conf
@@ -0,0 +1,4 @@ 
+module:
+{
+	modules = ("libddf_ifs.so.0");
+};
diff --git a/example/m4/configure.m4 b/example/m4/configure.m4
index 620db04..9e7973b 100644
--- a/example/m4/configure.m4
+++ b/example/m4/configure.m4
@@ -21,4 +21,6 @@  AC_CONFIG_FILES([example/classifier/Makefile
 		 example/time/Makefile
 		 example/timer/Makefile
 		 example/traffic_mgmt/Makefile
+		 example/ddf_ifs/Makefile
+		 example/ddf_app/Makefile
 		 example/Makefile])