X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fjsonrpc.c;h=35428a67ecffe624c0a8fcbebde9555f34a41c18;hb=8f79bb4d3999d993424e9578342b4130d10a556c;hp=3e4a912624ad182e169e87a170879c8e8f9968dc;hpb=6fd6ed71cb9f2dba8307da371d5e86c34695783c;p=cascardo%2Fovs.git diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index 3e4a91262..35428a67e 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,8 +63,7 @@ static void jsonrpc_error(struct jsonrpc *, int error); int jsonrpc_stream_open(const char *name, struct stream **streamp, uint8_t dscp) { - return stream_open_with_default_port(name, OVSDB_OLD_PORT, - streamp, dscp); + return stream_open_with_default_port(name, OVSDB_PORT, streamp, dscp); } /* This is just the same as pstream_open() except that it uses the default @@ -72,8 +71,7 @@ jsonrpc_stream_open(const char *name, struct stream **streamp, uint8_t dscp) int jsonrpc_pstream_open(const char *name, struct pstream **pstreamp, uint8_t dscp) { - return pstream_open_with_default_port(name, OVSDB_OLD_PORT, - pstreamp, dscp); + return pstream_open_with_default_port(name, OVSDB_PORT, pstreamp, dscp); } /* Returns a new JSON-RPC stream that uses 'stream' for input and output. The @@ -240,8 +238,8 @@ jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { struct ofpbuf *buf; struct json *json; + struct ds ds = DS_EMPTY_INITIALIZER; size_t length; - char *s; if (rpc->status) { jsonrpc_msg_destroy(msg); @@ -251,13 +249,12 @@ jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) jsonrpc_log_msg(rpc, "send", msg); json = jsonrpc_msg_to_json(msg); - s = json_to_string(json, 0); - length = strlen(s); + json_to_ds(json, 0, &ds); + length = ds.length; json_destroy(json); buf = xmalloc(sizeof *buf); - ofpbuf_use(buf, s, length); - buf->size = length; + ofpbuf_use_ds(buf, &ds); list_push_back(&rpc->output, &buf->list_node); rpc->output_count++; rpc->backlog += length; @@ -346,7 +343,7 @@ jsonrpc_recv(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) const struct byteq *q = &rpc->input; if (q->head <= q->size) { stream_report_content(q->buffer, q->head, STREAM_JSONRPC, - THIS_MODULE, rpc->name); + &this_module, rpc->name); } return rpc->status; } @@ -950,6 +947,7 @@ jsonrpc_session_run(struct jsonrpc_session *s) reconnect_connect_failed(s->reconnect, time_msec(), error); stream_close(s->stream); s->stream = NULL; + s->last_error = error; } } @@ -1065,36 +1063,49 @@ jsonrpc_session_recv_wait(struct jsonrpc_session *s) } } +/* Returns true if 's' is currently connected or trying to connect. */ bool jsonrpc_session_is_alive(const struct jsonrpc_session *s) { return s->rpc || s->stream || reconnect_get_max_tries(s->reconnect); } +/* Returns true if 's' is currently connected. */ bool jsonrpc_session_is_connected(const struct jsonrpc_session *s) { return s->rpc != NULL; } +/* Returns a sequence number for 's'. The sequence number increments every + * time 's' connects or disconnects. Thus, a caller can use the change (or + * lack of change) in the sequence number to figure out whether the underlying + * connection is the same as before. */ unsigned int jsonrpc_session_get_seqno(const struct jsonrpc_session *s) { return s->seqno; } +/* Returns the current status of 's'. If 's' is NULL or is disconnected, this + * is 0, otherwise it is the status of the connection, as reported by + * jsonrpc_get_status(). */ int jsonrpc_session_get_status(const struct jsonrpc_session *s) { return s && s->rpc ? jsonrpc_get_status(s->rpc) : 0; } +/* Returns the last error reported on a connection by 's'. The return value is + * 0 only if no connection made by 's' has ever encountered an error. See + * jsonrpc_get_status() for return value interpretation. */ int jsonrpc_session_get_last_error(const struct jsonrpc_session *s) { return s->last_error; } +/* Populates 'stats' with statistics from 's'. */ void jsonrpc_session_get_reconnect_stats(const struct jsonrpc_session *s, struct reconnect_stats *stats) @@ -1102,6 +1113,7 @@ jsonrpc_session_get_reconnect_stats(const struct jsonrpc_session *s, reconnect_get_stats(s->reconnect, time_msec(), stats); } +/* Enables 's' to reconnect to the peer if the connection drops. */ void jsonrpc_session_enable_reconnect(struct jsonrpc_session *s) { @@ -1110,18 +1122,27 @@ jsonrpc_session_enable_reconnect(struct jsonrpc_session *s) RECONNECT_DEFAULT_MAX_BACKOFF); } +/* Forces 's' to drop its connection (if any) and reconnect. */ void jsonrpc_session_force_reconnect(struct jsonrpc_session *s) { reconnect_force_reconnect(s->reconnect, time_msec()); } +/* Sets 'max_backoff' as the maximum time, in milliseconds, to wait after a + * connection attempt fails before attempting to connect again. */ void jsonrpc_session_set_max_backoff(struct jsonrpc_session *s, int max_backoff) { reconnect_set_backoff(s->reconnect, 0, max_backoff); } +/* Sets the "probe interval" for 's' to 'probe_interval', in milliseconds. If + * this is zero, it disables the connection keepalive feature. Otherwise, if + * 's' is idle for 'probe_interval' milliseconds then 's' will send an echo + * request and, if no reply is received within an additional 'probe_interval' + * milliseconds, close the connection (then reconnect, if that feature is + * enabled). */ void jsonrpc_session_set_probe_interval(struct jsonrpc_session *s, int probe_interval) @@ -1129,9 +1150,11 @@ jsonrpc_session_set_probe_interval(struct jsonrpc_session *s, reconnect_set_probe_interval(s->reconnect, probe_interval); } +/* Sets the DSCP value used for 's''s connection to 'dscp'. If this is + * different from the DSCP value currently in use then the connection is closed + * and reconnected. */ void -jsonrpc_session_set_dscp(struct jsonrpc_session *s, - uint8_t dscp) +jsonrpc_session_set_dscp(struct jsonrpc_session *s, uint8_t dscp) { if (s->dscp != dscp) { pstream_close(s->pstream);