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 <jrajaha...@nicira.com> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> Signed-off-by: Andy Zhou <az...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev