From c0c4982fd6660dc2f5f5e8e675457d7784a25c48 Mon Sep 17 00:00:00 2001 From: Andy Zhou Date: Fri, 7 Feb 2014 14:45:14 -0800 Subject: [PATCH] netdev-dummy: Fix reconnecting. 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 Signed-off-by: Jarno Rajahalme Signed-off-by: Andy Zhou Acked-by: Jarno Rajahalme --- lib/netdev-dummy.c | 43 +++++++++++++++++++++++++++++-------------- lib/reconnect.c | 2 +- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index b8e7ab77a..da5bb82d1 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,23 +372,24 @@ 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(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; + reconnect_connected(reconnect, time_msec()); break; case EAGAIN: - reconnect_connecting(conn->u.rconn.reconnect, time_msec()); + reconnect_connecting(reconnect, time_msec()); break; default: - reconnect_connecting(conn->u.rconn.reconnect, time_msec()); + reconnect_connect_failed(reconnect, time_msec(), error); stream_close(active_stream); + conn->u.rconn.rstream->stream = NULL; break; } } @@ -441,22 +444,29 @@ OVS_REQUIRES(dev->mutex) switch (reconnect_run(rconn->reconnect, time_msec())) { case RECONNECT_CONNECT: { - int err = stream_connect(rconn->rstream->stream); + int error; + + if (rconn->rstream->stream) { + error = stream_connect(rconn->rstream->stream); + } else { + error = stream_open(reconnect_get_name(rconn->reconnect), + &rconn->rstream->stream, DSCP_DEFAULT); + } - switch (err) { - case 0: /* Connected. */ + switch (error) { + case 0: reconnect_connected(rconn->reconnect, time_msec()); - dev->conn.type = ACTIVE; break; case EAGAIN: reconnect_connecting(rconn->reconnect, time_msec()); - return; + break; default: - reconnect_connect_failed(rconn->reconnect, time_msec(), err); + reconnect_connect_failed(rconn->reconnect, time_msec(), error); stream_close(rconn->rstream->stream); - return; + rconn->rstream->stream = NULL; + break; } } break; @@ -475,6 +485,7 @@ OVS_REQUIRES(dev->mutex) if (err) { reconnect_disconnected(rconn->reconnect, time_msec(), err); stream_close(rconn->rstream->stream); + rconn->rstream->stream = NULL; } } } @@ -511,7 +522,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 +550,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 0a773bcb2..5296c5cbe 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); -- 2.43.0