From c2e3cbaf7bde655d7521a63dd57a13085125c3b4 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 20 Feb 2015 08:44:48 -0800 Subject: [PATCH] stream: Eliminate pstream_set_dscp(). 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 Acked-by: Alex Wang --- lib/jsonrpc.c | 18 +++--------------- lib/stream-fd.c | 14 -------------- lib/stream-fd.h | 3 +-- lib/stream-provider.h | 5 +---- lib/stream-ssl.c | 10 +--------- lib/stream-tcp.c | 6 ++---- lib/stream-unix.c | 5 ++--- lib/stream.c | 11 +---------- lib/stream.h | 3 +-- ovsdb/jsonrpc-server.c | 35 +++++++++++++---------------------- 10 files changed, 25 insertions(+), 85 deletions(-) diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index f15adcaa1..5323e07e3 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -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); } diff --git a/lib/stream-fd.c b/lib/stream-fd.c index 2cb4b4c92..31bfc6ed9 100644 --- a/lib/stream-fd.c +++ b/lib/stream-fd.c @@ -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, }; /* Helper functions. */ diff --git a/lib/stream-fd.h b/lib/stream-fd.h index d2937c133..12452dd61 100644 --- a/lib/stream-fd.h +++ b/lib/stream-fd.h @@ -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); diff --git a/lib/stream-provider.h b/lib/stream-provider.h index 8347ac6f5..2226a806c 100644 --- a/lib/stream-provider.h +++ b/lib/stream-provider.h @@ -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. */ diff --git a/lib/stream-ssl.c b/lib/stream-ssl.c index 47c53125b..c2ace711a 100644 --- a/lib/stream-ssl.c +++ b/lib/stream-ssl.c @@ -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, }; /* diff --git a/lib/stream-tcp.c b/lib/stream-tcp.c index 3e19dbbb7..1f53e86de 100644 --- a/lib/stream-tcp.c +++ b/lib/stream-tcp.c @@ -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 diff --git a/lib/stream-unix.c b/lib/stream-unix.c index daade3f3b..cadd18019 100644 --- a/lib/stream-unix.c +++ b/lib/stream-unix.c @@ -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, }; diff --git a/lib/stream.c b/lib/stream.c index ca469fb5f..a7e07d09c 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -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 diff --git a/lib/stream.h b/lib/stream.h index 3087f4527..0db50da29 100644 --- a/lib/stream.h +++ b/lib/stream.h @@ -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 *); diff --git a/ovsdb/jsonrpc-server.c b/ovsdb/jsonrpc-server.c index e40675828..caef51556 100644 --- a/ovsdb/jsonrpc-server.c +++ b/ovsdb/jsonrpc-server.c @@ -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); } -- 2.20.1