stream: Eliminate pstream_set_dscp().
authorBen Pfaff <blp@nicira.com>
Fri, 20 Feb 2015 16:44:48 +0000 (08:44 -0800)
committerBen Pfaff <blp@nicira.com>
Fri, 20 Feb 2015 19:32:06 +0000 (11:32 -0800)
This function is really of marginal utility.  This commit drops it and
makes the existing callers instead open a new pstream with the desired
dscp.

The ulterior motive here is that the set_dscp() function that actually sets
the DSCP on a socket really wants to know the address family (AF_INET vs.
AF_INET6).  We could plumb that down through the stream code, and that's
one reasonable option, but I thought that simply eliminating some calls
to set_dscp() where we don't already have the address family handy was
another reasonable way to go.

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Alex Wang <alexw@nicira.com>
lib/jsonrpc.c
lib/stream-fd.c
lib/stream-fd.h
lib/stream-provider.h
lib/stream-ssl.c
lib/stream-tcp.c
lib/stream-unix.c
lib/stream.c
lib/stream.h
ovsdb/jsonrpc-server.c

index f15adca..5323e07 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -1134,21 +1134,9 @@ jsonrpc_session_set_dscp(struct jsonrpc_session *s,
                          uint8_t dscp)
 {
     if (s->dscp != dscp) {
-        if (s->pstream) {
-            int error;
+        pstream_close(s->pstream);
+        s->pstream = NULL;
 
-            error = pstream_set_dscp(s->pstream, dscp);
-            if (error) {
-                VLOG_ERR("%s: failed set_dscp %s",
-                         reconnect_get_name(s->reconnect),
-                         ovs_strerror(error));
-            }
-            /*
-             * XXX race window between setting dscp to listening socket
-             * and accepting socket. accepted socket may have old dscp value.
-             * Ignore this race window for now.
-             */
-        }
         s->dscp = dscp;
         jsonrpc_session_force_reconnect(s);
     }
index 2cb4b4c..31bfc6e 100644 (file)
@@ -181,7 +181,6 @@ struct fd_pstream
     int fd;
     int (*accept_cb)(int fd, const struct sockaddr_storage *, size_t ss_len,
                      struct stream **);
-    int (*set_dscp_cb)(int fd, uint8_t dscp);
     char *unlink_path;
 };
 
@@ -212,14 +211,12 @@ int
 new_fd_pstream(const char *name, int fd,
                int (*accept_cb)(int fd, const struct sockaddr_storage *ss,
                                 size_t ss_len, struct stream **streamp),
-               int (*set_dscp_cb)(int fd, uint8_t dscp),
                char *unlink_path, struct pstream **pstreamp)
 {
     struct fd_pstream *ps = xmalloc(sizeof *ps);
     pstream_init(&ps->pstream, &fd_pstream_class, name);
     ps->fd = fd;
     ps->accept_cb = accept_cb;
-    ps->set_dscp_cb = set_dscp_cb;
     ps->unlink_path = unlink_path;
     *pstreamp = &ps->pstream;
     return 0;
@@ -273,16 +270,6 @@ pfd_wait(struct pstream *pstream)
     poll_fd_wait(ps->fd, POLLIN);
 }
 
-static int
-pfd_set_dscp(struct pstream *pstream, uint8_t dscp)
-{
-    struct fd_pstream *ps = fd_pstream_cast(pstream);
-    if (ps->set_dscp_cb) {
-        return ps->set_dscp_cb(ps->fd, dscp);
-    }
-    return 0;
-}
-
 static const struct pstream_class fd_pstream_class = {
     "pstream",
     false,
@@ -290,7 +277,6 @@ static const struct pstream_class fd_pstream_class = {
     pfd_close,
     pfd_accept,
     pfd_wait,
-    pfd_set_dscp,
 };
 \f
 /* Helper functions. */
index d2937c1..12452dd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2012, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2012, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,7 +33,6 @@ int new_fd_stream(const char *name, int fd, int connect_status,
 int new_fd_pstream(const char *name, int fd,
                    int (*accept_cb)(int fd, const struct sockaddr_storage *ss,
                                     size_t ss_len, struct stream **),
-                   int (*set_dscp_cb)(int fd, uint8_t dscp),
                    char *unlink_path,
                    struct pstream **pstreamp);
 
index 8347ac6..2226a80 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2012, 2013, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -183,9 +183,6 @@ struct pstream_class {
     /* Arranges for the poll loop to wake up when a connection is ready to be
      * accepted on 'pstream'. */
     void (*wait)(struct pstream *pstream);
-
-    /* Set DSCP value of the listening socket. */
-    int (*set_dscp)(struct pstream *pstream, uint8_t dscp);
 };
 
 /* Active and passive stream classes. */
index 47c5312..c2ace71 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -871,13 +871,6 @@ pssl_wait(struct pstream *pstream)
     poll_fd_wait(pssl->fd, POLLIN);
 }
 
-static int
-pssl_set_dscp(struct pstream *pstream, uint8_t dscp)
-{
-    struct pssl_pstream *pssl = pssl_pstream_cast(pstream);
-    return set_dscp(pssl->fd, dscp);
-}
-
 const struct pstream_class pssl_pstream_class = {
     "pssl",
     true,
@@ -885,7 +878,6 @@ const struct pstream_class pssl_pstream_class = {
     pssl_close,
     pssl_accept,
     pssl_wait,
-    pssl_set_dscp,
 };
 \f
 /*
index 3e19dbb..1f53e86 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -161,8 +161,7 @@ new_pstream(char *suffix, const char *name, struct pstream **pstreamp,
         conn_name = bound_name;
     }
 
-    error = new_fd_pstream(conn_name, fd, ptcp_accept, set_dscp, unlink_path,
-                           pstreamp);
+    error = new_fd_pstream(conn_name, fd, ptcp_accept, unlink_path, pstreamp);
     if (!error) {
         pstream_set_bound_port(*pstreamp, htons(port));
     }
@@ -196,7 +195,6 @@ const struct pstream_class ptcp_pstream_class = {
     NULL,
     NULL,
     NULL,
-    NULL,
 };
 
 #ifdef _WIN32
index daade3f..cadd180 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -102,7 +102,7 @@ punix_open(const char *name OVS_UNUSED, char *suffix,
         return error;
     }
 
-    return new_fd_pstream(name, fd, punix_accept, NULL, bind_path, pstreamp);
+    return new_fd_pstream(name, fd, punix_accept, bind_path, pstreamp);
 }
 
 static int
@@ -128,6 +128,5 @@ const struct pstream_class punix_pstream_class = {
     NULL,
     NULL,
     NULL,
-    NULL,
 };
 
index ca469fb..a7e07d0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -592,15 +592,6 @@ pstream_wait(struct pstream *pstream)
     (pstream->class->wait)(pstream);
 }
 
-int
-pstream_set_dscp(struct pstream *pstream, uint8_t dscp)
-{
-    if (pstream->class->set_dscp) {
-        return pstream->class->set_dscp(pstream, dscp);
-    }
-    return 0;
-}
-
 /* Returns the transport port on which 'pstream' is listening, or 0 if the
  * concept doesn't apply. */
 ovs_be16
index 3087f45..0db50da 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011, 2013 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2013, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -66,7 +66,6 @@ void pstream_close(struct pstream *);
 int pstream_accept(struct pstream *, struct stream **);
 int pstream_accept_block(struct pstream *, struct stream **);
 void pstream_wait(struct pstream *);
-int pstream_set_dscp(struct pstream *, uint8_t dscp);
 
 ovs_be16 pstream_get_bound_port(const struct pstream *);
 \f
index e406758..caef515 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -198,10 +198,16 @@ ovsdb_jsonrpc_server_set_remotes(struct ovsdb_jsonrpc_server *svr,
     struct shash_node *node, *next;
 
     SHASH_FOR_EACH_SAFE (node, next, &svr->remotes) {
-        if (!shash_find(new_remotes, node->name)) {
+        struct ovsdb_jsonrpc_remote *remote = node->data;
+        struct ovsdb_jsonrpc_options *options
+            = shash_find_data(new_remotes, node->name);
+
+        if (!options) {
             VLOG_INFO("%s: remote deconfigured", node->name);
             ovsdb_jsonrpc_server_del_remote(node);
-        }
+        } else if (options->dscp != remote->dscp) {
+            ovsdb_jsonrpc_server_del_remote(node);
+         }
     }
     SHASH_FOR_EACH (node, new_remotes) {
         const struct ovsdb_jsonrpc_options *options = node->data;
@@ -384,8 +390,6 @@ static int ovsdb_jsonrpc_session_run(struct ovsdb_jsonrpc_session *);
 static void ovsdb_jsonrpc_session_wait(struct ovsdb_jsonrpc_session *);
 static void ovsdb_jsonrpc_session_get_memory_usage(
     const struct ovsdb_jsonrpc_session *, struct simap *usage);
-static void ovsdb_jsonrpc_session_set_options(
-    struct ovsdb_jsonrpc_session *, const struct ovsdb_jsonrpc_options *);
 static void ovsdb_jsonrpc_session_got_request(struct ovsdb_jsonrpc_session *,
                                              struct jsonrpc_msg *);
 static void ovsdb_jsonrpc_session_got_notify(struct ovsdb_jsonrpc_session *,
@@ -556,7 +560,10 @@ ovsdb_jsonrpc_session_reconnect_all(struct ovsdb_jsonrpc_remote *remote)
 }
 
 /* Sets the options for all of the JSON-RPC sessions managed by 'remote' to
- * 'options'. */
+ * 'options'.
+ *
+ * (The dscp value can't be changed directly; the caller must instead close and
+ * re-open the session.) */
 static void
 ovsdb_jsonrpc_session_set_all_options(
     struct ovsdb_jsonrpc_remote *remote,
@@ -564,22 +571,6 @@ ovsdb_jsonrpc_session_set_all_options(
 {
     struct ovsdb_jsonrpc_session *s;
 
-    if (remote->listener) {
-        int error;
-
-        error = pstream_set_dscp(remote->listener, options->dscp);
-        if (error) {
-            VLOG_ERR("%s: set_dscp failed %s",
-                     pstream_get_name(remote->listener), ovs_strerror(error));
-        } else {
-            remote->dscp = options->dscp;
-        }
-        /*
-         * XXX race window between setting dscp to listening socket
-         * and accepting socket. Accepted socket may have old dscp value.
-         * Ignore this race window for now.
-         */
-    }
     LIST_FOR_EACH (s, node, &remote->sessions) {
         ovsdb_jsonrpc_session_set_options(s, options);
     }