X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fstream.c;h=4c3583c4fa8663b85a894e79dc06d35588dbebc5;hb=ca261b65354f522ba43c823221763ca6f4604e2d;hp=ac0cdb8f376656e70c08329f0db5b9a3557e58cd;hpb=294e9fc859f87578be6e944a599b5c4af841e7d3;p=openvswitch diff --git a/lib/stream.c b/lib/stream.c index ac0cdb8f..4c3583c4 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,10 @@ #include "util.h" #include "vlog.h" -VLOG_DEFINE_THIS_MODULE(stream) +VLOG_DEFINE_THIS_MODULE(stream); + +COVERAGE_DEFINE(pstream_open); +COVERAGE_DEFINE(stream_open); /* State of an active stream.*/ enum stream_state { @@ -46,7 +49,7 @@ enum stream_state { SCS_DISCONNECTED /* Connection failed or connection closed. */ }; -static struct stream_class *stream_classes[] = { +static const struct stream_class *stream_classes[] = { &tcp_stream_class, &unix_stream_class, #ifdef HAVE_OPENSSL @@ -54,7 +57,7 @@ static struct stream_class *stream_classes[] = { #endif }; -static struct pstream_class *pstream_classes[] = { +static const struct pstream_class *pstream_classes[] = { &ptcp_pstream_class, &punix_pstream_class, #ifdef HAVE_OPENSSL @@ -70,7 +73,7 @@ check_stream_classes(void) size_t i; for (i = 0; i < ARRAY_SIZE(stream_classes); i++) { - struct stream_class *class = stream_classes[i]; + const struct stream_class *class = stream_classes[i]; assert(class->name != NULL); assert(class->open != NULL); if (class->close || class->recv || class->send || class->run @@ -85,7 +88,7 @@ check_stream_classes(void) } for (i = 0; i < ARRAY_SIZE(pstream_classes); i++) { - struct pstream_class *class = pstream_classes[i]; + const struct pstream_class *class = pstream_classes[i]; assert(class->name != NULL); assert(class->listen != NULL); if (class->close || class->accept || class->wait) { @@ -151,7 +154,7 @@ stream_usage(const char *name, bool active, bool passive, * a null pointer into '*classp' if 'name' is in the wrong form or if no such * class exists. */ static int -stream_lookup_class(const char *name, struct stream_class **classp) +stream_lookup_class(const char *name, const struct stream_class **classp) { size_t prefix_len; size_t i; @@ -164,7 +167,7 @@ stream_lookup_class(const char *name, struct stream_class **classp) return EAFNOSUPPORT; } for (i = 0; i < ARRAY_SIZE(stream_classes); i++) { - struct stream_class *class = stream_classes[i]; + const struct stream_class *class = stream_classes[i]; if (strlen(class->name) == prefix_len && !memcmp(class->name, name, prefix_len)) { *classp = class; @@ -179,7 +182,7 @@ stream_lookup_class(const char *name, struct stream_class **classp) int stream_verify_name(const char *name) { - struct stream_class *class; + const struct stream_class *class; return stream_lookup_class(name, &class); } @@ -193,7 +196,7 @@ stream_verify_name(const char *name) int stream_open(const char *name, struct stream **streamp) { - struct stream_class *class; + const struct stream_class *class; struct stream *stream; char *suffix_copy; int error; @@ -280,7 +283,7 @@ stream_get_name(const struct stream *stream) /* 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. */ -uint32_t +ovs_be32 stream_get_remote_ip(const struct stream *stream) { return stream->remote_ip; @@ -288,7 +291,7 @@ stream_get_remote_ip(const struct stream *stream) /* 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. */ -uint16_t +ovs_be16 stream_get_remote_port(const struct stream *stream) { return stream->remote_port; @@ -296,7 +299,7 @@ stream_get_remote_port(const struct stream *stream) /* 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. */ -uint32_t +ovs_be32 stream_get_local_ip(const struct stream *stream) { return stream->local_ip; @@ -304,7 +307,7 @@ stream_get_local_ip(const struct stream *stream) /* 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. */ -uint16_t +ovs_be16 stream_get_local_port(const struct stream *stream) { return stream->local_port; @@ -454,7 +457,7 @@ stream_send_wait(struct stream *stream) * a null pointer into '*classp' if 'name' is in the wrong form or if no such * class exists. */ static int -pstream_lookup_class(const char *name, struct pstream_class **classp) +pstream_lookup_class(const char *name, const struct pstream_class **classp) { size_t prefix_len; size_t i; @@ -467,7 +470,7 @@ pstream_lookup_class(const char *name, struct pstream_class **classp) return EAFNOSUPPORT; } for (i = 0; i < ARRAY_SIZE(pstream_classes); i++) { - struct pstream_class *class = pstream_classes[i]; + const struct pstream_class *class = pstream_classes[i]; if (strlen(class->name) == prefix_len && !memcmp(class->name, name, prefix_len)) { *classp = class; @@ -482,7 +485,7 @@ pstream_lookup_class(const char *name, struct pstream_class **classp) int pstream_verify_name(const char *name) { - struct pstream_class *class; + const struct pstream_class *class; return pstream_lookup_class(name, &class); } @@ -496,7 +499,7 @@ pstream_verify_name(const char *name) int pstream_open(const char *name, struct pstream **pstreamp) { - struct pstream_class *class; + const struct pstream_class *class; struct pstream *pstream; char *suffix_copy; int error; @@ -610,9 +613,10 @@ pstream_wait(struct pstream *pstream) * * The caller retains ownership of 'name'. */ void -stream_init(struct stream *stream, struct stream_class *class, +stream_init(struct stream *stream, const struct stream_class *class, int connect_status, const char *name) { + memset(stream, 0, sizeof *stream); stream->class = class; stream->state = (connect_status == EAGAIN ? SCS_CONNECTING : !connect_status ? SCS_CONNECTED @@ -623,31 +627,31 @@ stream_init(struct stream *stream, struct stream_class *class, } void -stream_set_remote_ip(struct stream *stream, uint32_t ip) +stream_set_remote_ip(struct stream *stream, ovs_be32 ip) { stream->remote_ip = ip; } void -stream_set_remote_port(struct stream *stream, uint16_t port) +stream_set_remote_port(struct stream *stream, ovs_be16 port) { stream->remote_port = port; } void -stream_set_local_ip(struct stream *stream, uint32_t ip) +stream_set_local_ip(struct stream *stream, ovs_be32 ip) { stream->local_ip = ip; } void -stream_set_local_port(struct stream *stream, uint16_t port) +stream_set_local_port(struct stream *stream, ovs_be16 port) { stream->local_port = port; } void -pstream_init(struct pstream *pstream, struct pstream_class *class, +pstream_init(struct pstream *pstream, const struct pstream_class *class, const char *name) { pstream->class = class; @@ -720,11 +724,31 @@ 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 -stream_guess_content(const uint8_t *data, size_t size) +stream_guess_content(const uint8_t *data, ssize_t size) { if (size >= 2) { #define PAIR(A, B) (((A) << 8) | (B)) @@ -767,7 +791,7 @@ stream_content_type_to_string(enum stream_content_type type) * module 'module', naming 'stream_name' as the source, explaining what * content was expected and what was actually received. */ void -stream_report_content(const void *data, size_t size, +stream_report_content(const void *data, ssize_t size, enum stream_content_type expected_type, struct vlog_module *module, const char *stream_name) { @@ -779,7 +803,7 @@ stream_report_content(const void *data, size_t size, vlog_rate_limit(module, VLL_WARN, &rl, "%s: received %s data on %s channel", stream_name, - stream_content_type_to_string(expected_type), - stream_content_type_to_string(actual_type)); + stream_content_type_to_string(actual_type), + stream_content_type_to_string(expected_type)); } }