In current implementation vswitchd adds Controller in-band rules only if there 
is a route in
kernel routing table that might route traffic to the Controller. But, when 
executing
force-reload-kmod command, network configuration (e.g. assigned IP addresses, 
routes) are flushed
away, hence Controller in-band rules are not added.

This commit fixes this limitation and allows vswitchd to add Controller in-band 
rules
even if there are no routes in the kernel routing table.

Issue: #8625

Signed-off-by: Ansis Atteka <aatt...@nicira.com>
---
 lib/stream.c      |   22 +++++++++++++++++++++-
 lib/stream.h      |    7 ++++++-
 ofproto/connmgr.c |    8 +++++---
 vswitchd/bridge.c |    8 ++++----
 4 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/lib/stream.c b/lib/stream.c
index 9ba4c51..4c3583c 100644
--- a/lib/stream.c
+++ b/lib/stream.c
@@ -724,7 +724,27 @@ pstream_open_with_default_ports(const char *name_,
 
     return error;
 }
-
+
+/*
+ * This function extracts IP address and port from the target string.
+ *
+ *     - On success, function returns true and fills *sin structure with port
+ *       and IP address. If port was absent in target string then it will use
+ *       corresponding default port value.
+ *     - On error, function returns false and *sin contains garbage.
+ */
+bool
+stream_parse_target_with_default_ports(const char *target,
+                                       uint16_t default_tcp_port,
+                                       uint16_t default_ssl_port,
+                                       struct sockaddr_in *sin)
+{
+    return (!strncmp(target, "tcp:", 4)
+             && inet_parse_active(target + 4, default_tcp_port, sin)) ||
+            (!strncmp(target, "ssl:", 4)
+             && inet_parse_active(target + 4, default_ssl_port, sin));
+}
+
 /* Attempts to guess the content type of a stream whose first few bytes were
  * the 'size' bytes of 'data'. */
 static enum stream_content_type
diff --git a/lib/stream.h b/lib/stream.h
index 51a7656..5c111f9 100644
--- a/lib/stream.h
+++ b/lib/stream.h
@@ -23,6 +23,7 @@
 #include <sys/types.h>
 #include "openvswitch/types.h"
 #include "vlog.h"
+#include "socket-util.h"
 
 struct pstream;
 struct stream;
@@ -75,7 +76,11 @@ int pstream_open_with_default_ports(const char *name,
                                     uint16_t default_ptcp_port,
                                     uint16_t default_pssl_port,
                                     struct pstream **);
-
+bool stream_parse_target_with_default_ports(const char *target,
+                                           uint16_t default_tcp_port,
+                                           uint16_t default_ssl_port,
+                                           struct sockaddr_in *sin);
+
 /* Error reporting. */
 
 enum stream_content_type {
diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c
index 6432ba6..1c55b67 100644
--- a/ofproto/connmgr.c
+++ b/ofproto/connmgr.c
@@ -587,14 +587,16 @@ update_in_band_remotes(struct connmgr *mgr)
     /* Add all the remotes. */
     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
         struct sockaddr_in *sin = &addrs[n_addrs];
+        const char *target = rconn_get_target(ofconn->rconn);
 
         if (ofconn->band == OFPROTO_OUT_OF_BAND) {
             continue;
         }
 
-        sin->sin_addr.s_addr = rconn_get_remote_ip(ofconn->rconn);
-        if (sin->sin_addr.s_addr) {
-            sin->sin_port = rconn_get_remote_port(ofconn->rconn);
+        if (stream_parse_target_with_default_ports(target,
+                                                   OFP_TCP_PORT,
+                                                   OFP_SSL_PORT,
+                                                   sin)) {
             n_addrs++;
         }
     }
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index f79b69c..99ba9ff 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -372,10 +372,10 @@ collect_in_band_managers(const struct ovsrec_open_vswitch 
*ovs_cfg,
         SSET_FOR_EACH (target, &targets) {
             struct sockaddr_in *sin = &managers[n_managers];
 
-            if ((!strncmp(target, "tcp:", 4)
-                 && inet_parse_active(target + 4, JSONRPC_TCP_PORT, sin)) ||
-                (!strncmp(target, "ssl:", 4)
-                 && inet_parse_active(target + 4, JSONRPC_SSL_PORT, sin))) {
+            if (stream_parse_target_with_default_ports(target,
+                                                       JSONRPC_TCP_PORT,
+                                                       JSONRPC_SSL_PORT,
+                                                       sin)) {
                 n_managers++;
             }
         }
-- 
1.7.4.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to