-/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "jsonrpc-server.h"
-#include <assert.h>
#include <errno.h>
#include "bitmap.h"
struct ovsdb_jsonrpc_server *server;
struct pstream *listener; /* Listener, if passive. */
struct list sessions; /* List of "struct ovsdb_jsonrpc_session"s. */
+ uint8_t dscp;
};
static struct ovsdb_jsonrpc_remote *ovsdb_jsonrpc_server_add_remote(
remote->server = svr;
remote->listener = listener;
list_init(&remote->sessions);
+ remote->dscp = options->dscp;
shash_add(&svr->remotes, name, remote);
if (!listener) {
error = pstream_accept(remote->listener, &stream);
if (!error) {
struct jsonrpc_session *js;
- js = jsonrpc_session_open_unreliably(jsonrpc_open(stream));
+ js = jsonrpc_session_open_unreliably(jsonrpc_open(stream),
+ remote->dscp);
ovsdb_jsonrpc_session_create(remote, js);
} else if (error != EAGAIN) {
VLOG_WARN_RL(&rl, "%s: accept failed: %s",
ovsdb_jsonrpc_session_unlock_all(s);
jsonrpc_session_close(s->js);
list_remove(&s->node);
- ovsdb_session_destroy(&s->up);
s->remote->server->n_sessions--;
ovsdb_session_destroy(&s->up);
free(s);
{
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), 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);
}
static struct ovsdb_jsonrpc_monitor *
ovsdb_jsonrpc_monitor_cast(struct ovsdb_replica *replica)
{
- assert(replica->class == &ovsdb_jsonrpc_replica_class);
+ ovs_assert(replica->class == &ovsdb_jsonrpc_replica_class);
return CONTAINER_OF(replica, struct ovsdb_jsonrpc_monitor, replica);
}