[ovs-dev] [netdev dummy 1/2] netdev-dummy: Fix reconnecting.
Andy Zhou
azhou at nicira.com
Tue Feb 11 19:41:49 UTC 2014
The netdev-dummy unit test ran into the reconnect condition on Jarno's
machine. With his test environment, we found and fixed the bugs in
handling reconnect.
Co-authored-by: Jarno Rajahalme <jrajahalme at nicira.com>
Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
Signed-off-by: Andy Zhou <azhou at nicira.com>
---
lib/netdev-dummy.c | 58 ++++++++++++++++++++++++----------------------------
lib/reconnect.c | 2 +-
2 files changed, 28 insertions(+), 32 deletions(-)
diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index b8e7ab7..5d917a6 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -198,6 +198,7 @@ dummy_packet_stream_run(struct netdev_dummy *dev, struct dummy_packet_stream *s)
txbuf = ofpbuf_from_list(list_front(&s->txq));
retval = stream_send(s->stream, txbuf->data, txbuf->size);
+
if (retval > 0) {
ofpbuf_pull(txbuf, retval);
if (!txbuf->size) {
@@ -229,6 +230,7 @@ dummy_packet_stream_run(struct netdev_dummy *dev, struct dummy_packet_stream *s)
ofpbuf_prealloc_tailroom(&s->rxbuf, n);
retval = stream_recv(s->stream, ofpbuf_tail(&s->rxbuf), n);
+
if (retval > 0) {
s->rxbuf.size += retval;
if (retval == n && s->rxbuf.size > 2) {
@@ -370,24 +372,17 @@ dummy_packet_conn_set_config(struct dummy_packet_conn *conn,
reconnect_set_backoff(reconnect, 1000, INT_MAX);
reconnect_set_probe_interval(reconnect, 0);
conn->u.rconn.reconnect = reconnect;
+ conn->type = ACTIVE;
+ error = stream_open_block(
+ stream_open(stream, &active_stream, DSCP_DEFAULT), &active_stream);
- error = stream_open(stream, &active_stream, DSCP_DEFAULT);
conn->u.rconn.rstream = dummy_packet_stream_create(active_stream);
- switch (error) {
- case 0:
- reconnect_connected(conn->u.rconn.reconnect, time_msec());
- conn->type = ACTIVE;
- break;
-
- case EAGAIN:
- reconnect_connecting(conn->u.rconn.reconnect, time_msec());
- break;
-
- default:
- reconnect_connecting(conn->u.rconn.reconnect, time_msec());
+ if (error) {
+ reconnect_connect_failed(conn->u.rconn.reconnect, time_msec(), error);
stream_close(active_stream);
- break;
+ } else {
+ reconnect_connected(conn->u.rconn.reconnect, time_msec());
}
}
}
@@ -441,22 +436,19 @@ OVS_REQUIRES(dev->mutex)
switch (reconnect_run(rconn->reconnect, time_msec())) {
case RECONNECT_CONNECT:
{
- int err = stream_connect(rconn->rstream->stream);
-
- switch (err) {
- case 0: /* Connected. */
- reconnect_connected(rconn->reconnect, time_msec());
- dev->conn.type = ACTIVE;
- break;
+ int error;
+ struct stream *active_stream;
- case EAGAIN:
- reconnect_connecting(rconn->reconnect, time_msec());
- return;
+ error = stream_open_block(
+ stream_open(reconnect_get_name(rconn->reconnect),
+ &active_stream, DSCP_DEFAULT), &active_stream);
+ rconn->rstream->stream = active_stream;
- default:
- reconnect_connect_failed(rconn->reconnect, time_msec(), err);
- stream_close(rconn->rstream->stream);
- return;
+ if (error) {
+ reconnect_connect_failed(rconn->reconnect, time_msec(), error);
+ stream_close(active_stream);
+ } else {
+ reconnect_connected(rconn->reconnect, time_msec());
}
}
break;
@@ -511,7 +503,9 @@ dummy_packet_conn_wait(struct dummy_packet_conn *conn)
}
break;
case ACTIVE:
- dummy_packet_stream_wait(conn->u.rconn.rstream);
+ if (reconnect_is_connected(conn->u.rconn.reconnect)) {
+ dummy_packet_stream_wait(conn->u.rconn.rstream);
+ }
break;
case NONE:
@@ -537,8 +531,10 @@ dummy_packet_conn_send(struct dummy_packet_conn *conn,
break;
case ACTIVE:
- dummy_packet_stream_send(conn->u.rconn.rstream, buffer, size);
- dummy_packet_stream_wait(conn->u.rconn.rstream);
+ if (reconnect_is_connected(conn->u.rconn.reconnect)) {
+ dummy_packet_stream_send(conn->u.rconn.rstream, buffer, size);
+ dummy_packet_stream_wait(conn->u.rconn.rstream);
+ }
break;
case NONE:
diff --git a/lib/reconnect.c b/lib/reconnect.c
index 0a773bc..5296c5c 100644
--- a/lib/reconnect.c
+++ b/lib/reconnect.c
@@ -348,7 +348,7 @@ reconnect_disconnected(struct reconnect *fsm, long long int now, int error)
} else {
const char *type = fsm->passive ? "listen" : "connection";
if (error > 0) {
- VLOG_WARN("%s: %s attempt failed (%s)",
+ VLOG_INFO("%s: %s attempt failed (%s)",
fsm->name, type, ovs_strerror(error));
} else {
VLOG(fsm->info, "%s: %s attempt timed out", fsm->name, type);
--
1.7.9.5
More information about the dev
mailing list