[ovs-dev] [PATCH ovs V2 19/21] dpctl: read vswitch config on start

Paul Blakey paulb at mellanox.com
Sun Dec 25 11:39:47 UTC 2016


Use Open vSwitch IDL pattern to read OVS configuration on dpctl start,
needed as some functionality is dependent on that configuration.

Signed-off-by: Paul Blakey <paulb at mellanox.com>
Reviewed-by: Roi Dayan <roid at mellanox.com>
---
 lib/dpctl.c           | 44 ++++++++++++++++++++++++++++++++++++++++++++
 lib/dpctl.h           |  2 ++
 utilities/ovs-dpctl.c |  2 ++
 3 files changed, 48 insertions(+)

diff --git a/lib/dpctl.c b/lib/dpctl.c
index edccb7f..a892632 100644
--- a/lib/dpctl.c
+++ b/lib/dpctl.c
@@ -50,6 +50,10 @@
 #include "unixctl.h"
 #include "util.h"
 #include "openvswitch/ofp-parse.h"
+#include "ovsdb-idl.h"
+#include "vswitch-idl.h"
+#include "db-ctl-base.h"
+#include "tc.h"
 
 typedef int dpctl_command_handler(int argc, const char *argv[],
                                   struct dpctl_params *);
@@ -1645,6 +1649,46 @@ static const struct dpctl_command *get_all_dpctl_commands(void)
     return all_commands;
 }
 
+int
+dpctl_read_db()
+{
+    char *db = ctl_default_db();
+    struct ovsdb_idl *idl = ovsdb_idl_create(db, &ovsrec_idl_class, true,
+                                             true);
+    ovsdb_idl_track_add_all(idl);
+    unsigned int seqno = ovsdb_idl_get_seqno(idl);
+    const struct ovsrec_open_vswitch *cfg;
+
+    for (;;) {
+        /* synchronize OVSDB */
+        ovsdb_idl_run(idl);
+
+        if (!ovsdb_idl_is_alive(idl)) {
+            int retval = ovsdb_idl_get_last_error(idl);
+
+            ctl_fatal("%s: database connection failed (%s)",
+                      db, ovs_retval_to_string(retval));
+        }
+
+        if (seqno != ovsdb_idl_get_seqno(idl)) {
+            cfg = ovsrec_open_vswitch_first(idl);
+            if (cfg) {
+                netdev_set_flow_api_enabled(smap_get_bool(&cfg->other_config,
+                                                          "hw-offload",
+                                                          false));
+                tc_set_skip_hw(smap_get_bool(&cfg->other_config, "skip_hw",
+                                             false));
+                break;
+            }
+        } else {
+            ovsdb_idl_wait(idl);
+        }
+    }
+
+    ovsdb_idl_destroy(idl);
+    return 0;
+}
+
 /* Runs the command designated by argv[0] within the command table specified by
  * 'commands', which must be terminated by a command whose 'name' member is a
  * null pointer. */
diff --git a/lib/dpctl.h b/lib/dpctl.h
index 4ee083f..4828f3d 100644
--- a/lib/dpctl.h
+++ b/lib/dpctl.h
@@ -50,6 +50,8 @@ struct dpctl_params {
     void (*usage)(void *aux);
 };
 
+int dpctl_read_db(void);
+
 int dpctl_run_command(int argc, const char *argv[],
                       struct dpctl_params *dpctl_p);
 
diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c
index 843d305..135035d 100644
--- a/utilities/ovs-dpctl.c
+++ b/utilities/ovs-dpctl.c
@@ -66,6 +66,8 @@ main(int argc, char *argv[])
     dpctl_p.output = dpctl_print;
     dpctl_p.usage = usage;
 
+    dpctl_read_db();
+
     error = dpctl_run_command(argc - optind, (const char **) argv + optind,
                               &dpctl_p);
     return error ? EXIT_FAILURE : EXIT_SUCCESS;
-- 
1.8.3.1



More information about the dev mailing list