From: Romain Lenglet <romain.leng...@berabera.info>

Modify the nox_core command line arguments to accept the socket bind
address for the ptcp: and pssl: connection methods. This is
particularly important for the ptcp: method, as it can help improving
security and performance in some cases. For instance, if a controller
connects only to datapaths on the same host, using ptcp: and binding
to 127.0.0.1 limits to connections from the localhost. Otherwise,
pssl: must be used, which is less efficient.
---
 src/include/openflow.hh |    8 ++++++--
 src/lib/openflow.cc     |   42 +++++++++++++++++++++++++++++-------------
 2 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/src/include/openflow.hh b/src/include/openflow.hh
index 02e6f9f..5248bbb 100644
--- a/src/include/openflow.hh
+++ b/src/include/openflow.hh
@@ -284,13 +284,15 @@ class Passive_tcp_openflow_connection_factory
     : public Openflow_connection_factory
 {
 public:
-    Passive_tcp_openflow_connection_factory(uint16_t port);
+    Passive_tcp_openflow_connection_factory(const char* bind_ip,
+                                            uint16_t port);
     Openflow_connection* connect(int& error);
     void connect_wait();
     std::string to_string();
     bool passive() { return true; }
 private:
     Tcp_socket socket;
+    ipaddr bind_ip;
     uint16_t port;
 };
 
@@ -314,7 +316,8 @@ class Passive_ssl_openflow_connection_factory
     : public Openflow_connection_factory
 {
 public:
-    Passive_ssl_openflow_connection_factory(uint16_t port, const char *key,
+    Passive_ssl_openflow_connection_factory(const char* bind_ip,
+                                            uint16_t port, const char *key,
                                             const char *cert,
                                             const char *CAfile);
     Openflow_connection* connect(int& error);
@@ -324,6 +327,7 @@ public:
 private:
     boost::shared_ptr<Ssl_config> config;
     Ssl_socket socket;
+    ipaddr bind_ip;
     uint16_t port;
 };
 
diff --git a/src/lib/openflow.cc b/src/lib/openflow.cc
index 95251bb..0ebc1d0 100644
--- a/src/lib/openflow.cc
+++ b/src/lib/openflow.cc
@@ -1133,11 +1133,20 @@ Openflow_connection_factory* 
Openflow_connection_factory::create(
                 ? atoi(tokens[2].c_str()) : OFP_TCP_PORT;
         return new Tcp_openflow_connection_factory(tokens[1], htons(port));
     } else if (tokens[0] == "ptcp") {
-        uint16_t port = atoi(tokens[1].c_str());
+        if (tokens.size() != 3) {
+            log.err("pssl connection name not in the form ptcp:[IP]:[PORT]");
+            exit(EXIT_FAILURE);
+        }
+        const char* bind_ip = "0.0.0.0";
+        if (tokens[1].size() > 0) {
+          bind_ip = tokens[1].c_str();
+        }
+        uint16_t port = atoi(tokens[2].c_str());
         if (!port) {
             port = OFP_TCP_PORT;
         }
-        return new Passive_tcp_openflow_connection_factory(htons(port));
+        return new Passive_tcp_openflow_connection_factory(bind_ip,
+                                                           htons(port));
     } else if (tokens[0] == "ssl") {
         if (tokens.size() != 6) {
             log.err("ssl connection name not in the form 
ssl:HOST:[PORT]:KEY:CERT:CAFILE");
@@ -1151,17 +1160,21 @@ Openflow_connection_factory* 
Openflow_connection_factory::create(
             tokens[1], htons(port), tokens[3].c_str(),
             tokens[4].c_str(), tokens[5].c_str());
     } else if (tokens[0] == "pssl") {
-        if (tokens.size() != 5) {
-            log.err("pssl connection name not in the form 
pssl:[PORT]:KEY:CERT:CAFILE");
+        if (tokens.size() != 6) {
+            log.err("pssl connection name not in the form 
pssl:[IP]:[PORT]:KEY:CERT:CAFILE");
             exit(EXIT_FAILURE);
         }
-        uint16_t port = atoi(tokens[1].c_str());
+        const char* bind_ip = "0.0.0.0";
+        if (tokens[1].size() > 0) {
+          bind_ip = tokens[1].c_str();
+        }
+        uint16_t port = atoi(tokens[2].c_str());
         if (!port) {
             port = OFP_SSL_PORT;
         }
         return new Passive_ssl_openflow_connection_factory(
-            htons(port), tokens[2].c_str(), tokens[3].c_str(),
-            tokens[4].c_str());
+            bind_ip, htons(port), tokens[3].c_str(), tokens[4].c_str(),
+            tokens[5].c_str());
     } else if (tokens[0] == "pcap") {
 #ifndef HAVE_PCAP        
             log.err("pcap support not built in.  Ensure you have pcap 
installed and rebuild");
@@ -1247,11 +1260,12 @@ Tcp_openflow_connection_factory::to_string()
 }
 
 Passive_tcp_openflow_connection_factory
-::Passive_tcp_openflow_connection_factory(uint16_t port_)
-    : port(port_)
+::Passive_tcp_openflow_connection_factory(const char* bind_ip_,
+                                          uint16_t port_)
+    : bind_ip(bind_ip_), port(port_)
 {
     socket.set_reuseaddr();
-    int error = socket.bind(htonl(INADDR_ANY), port);
+    int error = socket.bind(bind_ip, port);
     if (error) {
         throw errno_exception(error, "bind");
     }
@@ -1335,17 +1349,19 @@ Ssl_openflow_connection_factory::to_string()
 }
 
 Passive_ssl_openflow_connection_factory
-::Passive_ssl_openflow_connection_factory(uint16_t port_,
-                                          const char *key, const char *cert,
+::Passive_ssl_openflow_connection_factory(const char* bind_ip_,
+                                          uint16_t port_, const char *key,
+                                          const char *cert,
                                           const char *CAfile)
     : config(new Ssl_config(Ssl_config::SSLv3 | Ssl_config::TLSv1,
                             Ssl_config::AUTHENTICATE_SERVER,
                             Ssl_config::REQUIRE_CLIENT_CERT,
                             key, cert, CAfile)),
       socket(config),
+      bind_ip(bind_ip_),
       port(port_)
 {
-    int error = socket.bind(htonl(INADDR_ANY), port);
+    int error = socket.bind(bind_ip, port);
     if (error) {
         throw errno_exception(error, "bind");
     }
-- 
1.7.1


_______________________________________________
nox-dev mailing list
nox-dev@noxrepo.org
http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org

Reply via email to