My patch has now been pushed to destiny.  If it doesn't cause problems,
we can push it to zaku later.

-- Murphy

On Wed, 2010-11-10 at 18:27 +0900, Romain Lenglet wrote:
> Hi,
> 
> This patch if for the zaku branch.
> This is a remake of my old patch for the openflow-1.0 branch here:
> http://noxrepo.org/pipermail/nox-dev_noxrepo.org/2010-August/001577.html
> 
> This remade patch retains backward-compatibility with the current syntax 
> for the ptcp: and pssl: interfaces.
> 
> I have no excuse for taking so long to re-submit that patch... ;(
> 
> BR,
> --
> Romain Lenglet
> 
> On 11/10/10 18:21, romain.leng...@berabera.info wrote:
> > 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: interfaces.  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.
> >
> > More precisely, support the following extra interface syntaxes:
> > ptcp:[IP]:[PORT] in addition to ptcp:[PORT], and
> > pssl:[IP]:[PORT]:KEY:CERT:CONTROLLER_CA_CERT in addition to
> > pssl:[PORT]:KEY:CERT:CONTROLLER_CA_CERT.
> > ---
> >   src/include/openflow.hh |    8 +++++-
> >   src/lib/openflow.cc     |   58 
> > ++++++++++++++++++++++++++++++++++++----------
> >   src/nox_main.cc         |   11 ++++++--
> >   3 files changed, 59 insertions(+), 18 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 e23cb20..f7ee232 100644
> > --- a/src/lib/openflow.cc
> > +++ b/src/lib/openflow.cc
> > @@ -1134,11 +1134,24 @@ 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());
> > +        const char* bind_ip = "0.0.0.0";
> > +        uint16_t port = 0;
> > +        if (tokens.size() == 2) {
> > +            port = atoi(tokens[1].c_str());
> > +        } else if (tokens.size() == 3) {
> > +            if (tokens[1].size()>  0) {
> > +                bind_ip = tokens[1].c_str();
> > +            }
> > +            port = atoi(tokens[2].c_str());
> > +        } else {
> > +            log.err("ptcp connection name not in the form ptcp:[PORT] or 
> > ptcp:[IP]:[PORT]");
> > +            exit(EXIT_FAILURE);
> > +        }
> >           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");
> > @@ -1152,17 +1165,33 @@ 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");
> > +        const char* bind_ip = "0.0.0.0";
> > +        uint16_t port = 0;
> > +        const char* ssl_key = "";
> > +        const char* ssl_cert = "";
> > +        const char* ssl_cafile = "";
> > +        if (tokens.size() == 5) {
> > +            port = atoi(tokens[1].c_str());
> > +            ssl_key = tokens[2].c_str();
> > +            ssl_cert = tokens[3].c_str();
> > +            ssl_cafile = tokens[4].c_str();
> > +        } else if (tokens.size() == 6) {
> > +            if (tokens[1].size()>  0) {
> > +                bind_ip = tokens[1].c_str();
> > +            }
> > +            port = atoi(tokens[2].c_str());
> > +            ssl_key = tokens[3].c_str();
> > +            ssl_cert = tokens[4].c_str();
> > +            ssl_cafile = tokens[5].c_str();
> > +        } else {
> > +            log.err("pssl connection name not in the form 
> > pssl:[PORT]:KEY:CERT:CAFILE or pssl:[IP]:[PORT]:KEY:CERT:CAFILE");
> >               exit(EXIT_FAILURE);
> >           }
> > -        uint16_t port = atoi(tokens[1].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), ssl_key, ssl_cert, ssl_cafile);
> >       } else if (tokens[0] == "pcap") {
> >   #ifndef HAVE_PCAP
> >               log.err("pcap support not built in.  Ensure you have pcap 
> > installed and rebuild");
> > @@ -1248,11 +1277,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");
> >       }
> > @@ -1336,17 +1366,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");
> >       }
> > diff --git a/src/nox_main.cc b/src/nox_main.cc
> > index 1901672..ebf4dc8 100644
> > --- a/src/nox_main.cc
> > +++ b/src/nox_main.cc
> > @@ -158,15 +158,20 @@ void usage(const char* program_name)
> >   #ifdef HAVE_NETLINK
> >              "  -i nl:DP_ID             via netlink to local datapath 
> > DP_IDX\n"
> >   #endif
> > -           "  -i ptcp:[PORT]          listen to TCP PORT (default: %d)\n"
> > +           "  -i ptcp:[PORT]          listen to TCP PORT (default: %d) on 
> > all IP addresses\n"
> > +           "  -i ptcp:[IP]:[PORT]     listen to TCP PORT (default: %d) on 
> > the given IP\n"
> > +           "                          (default: all IP addresses)\n"
> >              "  -i pssl:[PORT]:KEY:CERT:CONTROLLER_CA_CERT\n"
> > -           "                          listen to SSL PORT (default: %d)\n"
> > +           "                          listen to SSL PORT (default: %d) on 
> > all IP addresses\n"
> > +           "  -i pssl:[IP]:[PORT]:KEY:CERT:CONTROLLER_CA_CERT\n"
> > +           "                          listen to SSL PORT (default: %d) on 
> > the given IP\n"
> > +           "                          (default: all IP addresses)\n"
> >              "  -i pcap:FILE[:OUTFILE]  via pcap from FILE (for testing) 
> > write to OUTFILE\n"
> >              "  -i pcapt:FILE[:OUTFILE] same as \"pcap\", but delay packets 
> > based on pcap timestamps\n"
> >              "  -i pgen:                continuously generate packet-in 
> > events\n"
> >              "\nNetwork control options (must also specify an interface):\n"
> >              "  -u, --unreliable        do not reconnect to interfaces on 
> > error\n",
> > -      program_name, program_name, OFP_TCP_PORT, OFP_SSL_PORT);
> > +      program_name, program_name, OFP_TCP_PORT, OFP_TCP_PORT, 
> > OFP_SSL_PORT, OFP_SSL_PORT);
> >       leak_checker_usage();
> >       printf("\nOther options:\n"
> >              "  -c, --conf=FILE         set configuration file\n"
> 
> _______________________________________________
> nox-dev mailing list
> nox-dev@noxrepo.org
> http://noxrepo.org/mailman/listinfo/nox-dev_noxrepo.org



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

Reply via email to