X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fstream.c;h=55632fe3a76b95f3b6b341cae7e63001a97eda51;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=5bf42ce8798b489f9ca30ceb1257a2a0f8bb47f4;hpb=ca843648e3b4181a52a398b902e5e69221976476;p=sliver-openvswitch.git diff --git a/lib/stream.c b/lib/stream.c index 5bf42ce87..55632fe3a 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -26,14 +26,20 @@ #include "dynamic-string.h" #include "fatal-signal.h" #include "flow.h" +#include "jsonrpc.h" #include "ofp-print.h" #include "ofpbuf.h" #include "openflow/nicira-ext.h" #include "openflow/openflow.h" +#include "ovs-thread.h" #include "packets.h" #include "poll-loop.h" #include "random.h" +#include "socket-util.h" #include "util.h" +#include "vlog.h" + +VLOG_DEFINE_THIS_MODULE(stream); COVERAGE_DEFINE(pstream_open); COVERAGE_DEFINE(stream_open); @@ -47,7 +53,11 @@ enum stream_state { static const struct stream_class *stream_classes[] = { &tcp_stream_class, +#ifndef _WIN32 &unix_stream_class, +#else + &windows_stream_class, +#endif #ifdef HAVE_OPENSSL &ssl_stream_class, #endif @@ -55,12 +65,37 @@ static const struct stream_class *stream_classes[] = { static const struct pstream_class *pstream_classes[] = { &ptcp_pstream_class, +#ifndef _WIN32 &punix_pstream_class, +#else + &pwindows_pstream_class, +#endif #ifdef HAVE_OPENSSL &pssl_pstream_class, #endif }; +#ifdef _WIN32 +static void +do_winsock_start(void) +{ + WSADATA wsaData; + int error; + + error = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (error != 0) { + VLOG_FATAL("WSAStartup failed: %s", sock_strerror(sock_errno())); + } +} + +static void +winsock_start(void) +{ + static pthread_once_t once = PTHREAD_ONCE_INIT; + pthread_once(&once, do_winsock_start); +} +#endif + /* Check the validity of the stream class structures. */ static void check_stream_classes(void) @@ -199,6 +234,10 @@ stream_open(const char *name, struct stream **streamp, uint8_t dscp) COVERAGE_INC(stream_open); +#ifdef _WIN32 + winsock_start(); +#endif + /* Look up the class. */ error = stream_lookup_class(name, &class); if (!class) { @@ -277,38 +316,6 @@ stream_get_name(const struct stream *stream) return stream ? stream->name : "(null)"; } -/* Returns the IP address of the peer, or 0 if the peer is not connected over - * an IP-based protocol or if its IP address is not yet known. */ -ovs_be32 -stream_get_remote_ip(const struct stream *stream) -{ - return stream->remote_ip; -} - -/* Returns the transport port of the peer, or 0 if the connection does not - * contain a port or if the port is not yet known. */ -ovs_be16 -stream_get_remote_port(const struct stream *stream) -{ - return stream->remote_port; -} - -/* Returns the IP address used to connect to the peer, or 0 if the connection - * is not an IP-based protocol or if its IP address is not yet known. */ -ovs_be32 -stream_get_local_ip(const struct stream *stream) -{ - return stream->local_ip; -} - -/* Returns the transport port used to connect to the peer, or 0 if the - * connection does not contain a port or if the port is not yet known. */ -ovs_be16 -stream_get_local_port(const struct stream *stream) -{ - return stream->local_port; -} - static void scs_connecting(struct stream *stream) { @@ -345,7 +352,7 @@ stream_connect(struct stream *stream) return stream->error; default: - NOT_REACHED(); + OVS_NOT_REACHED(); } } while (stream->state != last_state); @@ -521,6 +528,10 @@ pstream_open(const char *name, struct pstream **pstreamp, uint8_t dscp) COVERAGE_INC(pstream_open); +#ifdef _WIN32 + winsock_start(); +#endif + /* Look up the class. */ error = pstream_lookup_class(name, &class); if (!class) { @@ -658,30 +669,6 @@ stream_init(struct stream *stream, const struct stream_class *class, ovs_assert(stream->state != SCS_CONNECTING || class->connect); } -void -stream_set_remote_ip(struct stream *stream, ovs_be32 ip) -{ - stream->remote_ip = ip; -} - -void -stream_set_remote_port(struct stream *stream, ovs_be16 port) -{ - stream->remote_port = port; -} - -void -stream_set_local_ip(struct stream *stream, ovs_be32 ip) -{ - stream->local_ip = ip; -} - -void -stream_set_local_port(struct stream *stream, ovs_be16 port) -{ - stream->local_port = port; -} - void pstream_init(struct pstream *pstream, const struct pstream_class *class, const char *name) @@ -727,6 +714,15 @@ stream_open_with_default_port(const char *name_, if ((!strncmp(name_, "tcp:", 4) || !strncmp(name_, "ssl:", 4)) && count_fields(name_) < 3) { + if (default_port == OFP_OLD_PORT) { + VLOG_WARN_ONCE("The default OpenFlow port number will change " + "from %d to %d in a future release", + OFP_OLD_PORT, OFP_PORT); + } else if (default_port == OVSDB_OLD_PORT) { + VLOG_WARN_ONCE("The default OVSDB port number will change " + "from %d to %d in a future release", + OVSDB_OLD_PORT, OVSDB_PORT); + } name = xasprintf("%s:%d", name_, default_port); } else { name = xstrdup(name_); @@ -763,18 +759,18 @@ pstream_open_with_default_port(const char *name_, /* * This function extracts IP address and port from the target string. * - * - On success, function returns true and fills *sin structure with port + * - On success, function returns true and fills *ss 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. + * - On error, function returns false and *ss contains garbage. */ bool stream_parse_target_with_default_port(const char *target, uint16_t default_port, - struct sockaddr_in *sin) + struct sockaddr_storage *ss) { return ((!strncmp(target, "tcp:", 4) || !strncmp(target, "ssl:", 4)) - && inet_parse_active(target + 4, default_port, sin)); + && inet_parse_active(target + 4, default_port, ss)); } /* Attempts to guess the content type of a stream whose first few bytes were