This init function is called when the dpif class is registered. It will be used by following commits
Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> --- lib/dpif-netdev.c | 1 + lib/dpif-netlink.c | 1 + lib/dpif-provider.h | 8 ++++++++ lib/dpif.c | 8 ++++++++ 4 files changed, 18 insertions(+) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 09e106f..a2ce321 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -3332,6 +3332,7 @@ dp_netdev_execute_actions(struct dp_netdev_pmd_thread *pmd, const struct dpif_class dpif_netdev_class = { "netdev", + NULL, /* init */ dpif_netdev_enumerate, dpif_netdev_port_open_type, dpif_netdev_open, diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 337ebd6..6090f30 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -2274,6 +2274,7 @@ dpif_netlink_get_datapath_version(void) const struct dpif_class dpif_netlink_class = { "system", + NULL, /* init */ dpif_netlink_enumerate, NULL, dpif_netlink_open, diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 7b4878eb..28ea86f 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -90,6 +90,14 @@ struct dpif_class { * the type assumed if no type is specified when opening a dpif. */ const char *type; + /* Called when the dpif provider is registered, typically at program + * startup. Returning an error from this function will prevent any + * datapath with this class from being created. + * + * This function may be set to null if a datapath class needs no + * initialization at registration time. */ + int (*init)(void); + /* Enumerates the names of all known created datapaths (of class * 'dpif_class'), if possible, into 'all_dps'. The caller has already * initialized 'all_dps' and other dpif classes might already have added diff --git a/lib/dpif.c b/lib/dpif.c index 6ecd1d9..70fffcb 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -135,6 +135,7 @@ static int dp_register_provider__(const struct dpif_class *new_class) { struct registered_dpif_class *registered_class; + int error; if (sset_contains(&dpif_blacklist, new_class->type)) { VLOG_DBG("attempted to register blacklisted provider: %s", @@ -148,6 +149,13 @@ dp_register_provider__(const struct dpif_class *new_class) return EEXIST; } + error = new_class->init ? new_class->init() : 0; + if (error) { + VLOG_WARN("failed to initialize %s datapath class: %s", + new_class->type, ovs_strerror(error)); + return error; + } + registered_class = xmalloc(sizeof *registered_class); registered_class->dpif_class = new_class; registered_class->refcount = 0; -- 2.1.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev