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
#endif
};
-static struct pstream_class *pstream_classes[] = {
+static const struct pstream_class *pstream_classes[] = {
&ptcp_pstream_class,
&punix_pstream_class,
#ifdef HAVE_OPENSSL
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
}
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) {
* 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;
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;
int
stream_verify_name(const char *name)
{
- struct stream_class *class;
+ const struct stream_class *class;
return stream_lookup_class(name, &class);
}
* stores a pointer to the new connection in '*streamp', otherwise a null
* pointer. */
int
-stream_open(const char *name, struct stream **streamp)
+stream_open(const char *name, struct stream **streamp, uint8_t dscp)
{
- struct stream_class *class;
+ const struct stream_class *class;
struct stream *stream;
char *suffix_copy;
int error;
/* Call class's "open" function. */
suffix_copy = xstrdup(strchr(name, ':') + 1);
- error = class->open(name, suffix_copy, &stream);
+ error = class->open(name, suffix_copy, &stream, dscp);
free(suffix_copy);
if (error) {
goto error;
* 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;
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;
int
pstream_verify_name(const char *name)
{
- struct pstream_class *class;
+ const struct pstream_class *class;
return pstream_lookup_class(name, &class);
}
* stores a pointer to the new connection in '*pstreamp', otherwise a null
* pointer. */
int
-pstream_open(const char *name, struct pstream **pstreamp)
+pstream_open(const char *name, struct pstream **pstreamp, uint8_t dscp)
{
- struct pstream_class *class;
+ const struct pstream_class *class;
struct pstream *pstream;
char *suffix_copy;
int error;
/* Call class's "open" function. */
suffix_copy = xstrdup(strchr(name, ':') + 1);
- error = class->listen(name, suffix_copy, &pstream);
+ error = class->listen(name, suffix_copy, &pstream, dscp);
free(suffix_copy);
if (error) {
goto error;
*
* 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);
}
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;
stream_open_with_default_ports(const char *name_,
uint16_t default_tcp_port,
uint16_t default_ssl_port,
- struct stream **streamp)
+ struct stream **streamp,
+ uint8_t dscp)
{
char *name;
int error;
} else {
name = xstrdup(name_);
}
- error = stream_open(name, streamp);
+ error = stream_open(name, streamp, dscp);
free(name);
return error;
pstream_open_with_default_ports(const char *name_,
uint16_t default_ptcp_port,
uint16_t default_pssl_port,
- struct pstream **pstreamp)
+ struct pstream **pstreamp,
+ uint8_t dscp)
{
char *name;
int error;
} else {
name = xstrdup(name_);
}
- error = pstream_open(name, pstreamp);
+ error = pstream_open(name, pstreamp, dscp);
free(name);
return error;
}
-\f
+
+/*
+ * 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
return STREAM_SSL;
case PAIR('{', '"'):
return STREAM_JSONRPC;
- case PAIR(OFP_VERSION, OFPT_HELLO):
+ case PAIR(OFP10_VERSION, OFPT_HELLO):
return STREAM_OPENFLOW;
}
}