dpif-provider: Add class init function.
authorDaniele Di Proietto <diproiettod@vmware.com>
Fri, 10 Apr 2015 18:09:49 +0000 (19:09 +0100)
committerEthan Jackson <ethan@nicira.com>
Tue, 14 Apr 2015 19:30:11 +0000 (12:30 -0700)
This init function is called when the dpif class is registered. It will
be used by following commits

Signed-off-by: Daniele Di Proietto <diproiettod@vmware.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
lib/dpif-netdev.c
lib/dpif-netlink.c
lib/dpif-provider.h
lib/dpif.c

index 5ac98e8..54e941a 100644 (file)
@@ -3353,6 +3353,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,
index 93fd8a4..ef9d318 100644 (file)
@@ -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,
index 7b4878e..28ea86f 100644 (file)
@@ -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
index ee71774..b8f30a5 100644 (file)
@@ -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;