[ovs-dev] [PATCH 3/3] dpctl: Ignore enumeration errors if there is at least one datapath.

Daniele Di Proietto diproiettod at vmware.com
Wed May 6 18:00:26 UTC 2015


When dpctl commands are used to inspect a userspace datapath, but OVS
has also built-in support for the kernel datapath, an error message is
reported if the kernel module is not loaded.  This commit suppresses the
message.

Suggested-by: Ethan Jackson <ethan at nicira.com>
Signed-off-by: Daniele Di Proietto <diproiettod at vmware.com>
---
 lib/dpctl.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/lib/dpctl.c b/lib/dpctl.c
index 711b18d..05c28d1 100644
--- a/lib/dpctl.c
+++ b/lib/dpctl.c
@@ -621,26 +621,28 @@ dps_for_each(struct dpctl_params *dpctl_p, dps_for_each_cb cb)
 {
     struct sset dpif_names = SSET_INITIALIZER(&dpif_names),
                 dpif_types = SSET_INITIALIZER(&dpif_types);
-    int error, lasterror = 0;
+    int error, openerror = 0, enumerror = 0;
     const char *type, *name;
+    bool at_least_one = false;
 
     dp_enumerate_types(&dpif_types);
 
     SSET_FOR_EACH (type, &dpif_types) {
         error = dp_enumerate_names(type, &dpif_names);
         if (error) {
-            lasterror = error;
+            enumerror = error;
         }
 
         SSET_FOR_EACH (name, &dpif_names) {
             struct dpif *dpif;
 
+            at_least_one = true;
             error = dpif_open(name, type, &dpif);
             if (!error) {
                 cb(dpif, dpctl_p);
                 dpif_close(dpif);
             } else {
-                lasterror = error;
+                openerror = error;
                 dpctl_error(dpctl_p, error, "opening datapath %s failed",
                             name);
             }
@@ -650,7 +652,17 @@ dps_for_each(struct dpctl_params *dpctl_p, dps_for_each_cb cb)
     sset_destroy(&dpif_names);
     sset_destroy(&dpif_types);
 
-    return lasterror;
+    /* If there has been an error while opening a datapath it should be
+     * reported.  Otherwise, we want to ignore the errors generated by
+     * dp_enumerate_names() if at least one datapath has been discovered,
+     * because they're not interesting for the user.  This happens, for
+     * example, if OVS is using a userspace datapath and the kernel module
+     * is not loaded. */
+    if (openerror) {
+        return openerror;
+    } else {
+        return at_least_one ? 0 : enumerror;
+    }
 }
 
 static int
-- 
2.1.4




More information about the dev mailing list