2 * Copyright (c) 2009, 2010, 2011, 2012, 2014 Nicira, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at:
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "reconnect.h"
26 #include "command-line.h"
33 static struct reconnect *reconnect;
36 static void diff_stats(const struct reconnect_stats *old,
37 const struct reconnect_stats *new,
39 static const struct command *get_all_commands(void);
42 test_reconnect_main(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
44 extern struct vlog_module VLM_reconnect;
45 struct reconnect_stats prev;
46 unsigned int old_max_tries;
50 vlog_set_levels(&VLM_reconnect, VLF_ANY_FACILITY, VLL_OFF);
53 reconnect = reconnect_create(now);
54 reconnect_set_name(reconnect, "remote");
55 reconnect_get_stats(reconnect, now, &prev);
56 printf("### t=%d ###\n", now);
58 old_max_tries = reconnect_get_max_tries(reconnect);
59 while (fgets(line, sizeof line, stdin)) {
60 struct reconnect_stats cur;
69 svec_parse_words(&args, line);
70 svec_terminate(&args);
71 if (!svec_is_empty(&args)) {
72 run_command(args.n, args.names, get_all_commands());
76 if (old_time != now) {
77 printf("\n### t=%d ###\n", now);
80 reconnect_get_stats(reconnect, now, &cur);
81 diff_stats(&prev, &cur, now - old_time);
83 if (reconnect_get_max_tries(reconnect) != old_max_tries) {
84 old_max_tries = reconnect_get_max_tries(reconnect);
85 printf(" %u tries left\n", old_max_tries);
93 do_enable(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
95 reconnect_enable(reconnect, now);
99 do_disable(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
101 reconnect_disable(reconnect, now);
105 do_force_reconnect(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
107 reconnect_force_reconnect(reconnect, now);
111 error_from_string(const char *s)
115 } else if (!strcmp(s, "ECONNREFUSED")) {
117 } else if (!strcmp(s, "EOF")) {
120 ovs_fatal(0, "unknown error '%s'", s);
125 do_disconnected(int argc OVS_UNUSED, char *argv[])
127 reconnect_disconnected(reconnect, now, error_from_string(argv[1]));
131 do_connecting(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
133 reconnect_connecting(reconnect, now);
137 do_connect_failed(int argc OVS_UNUSED, char *argv[])
139 reconnect_connect_failed(reconnect, now, error_from_string(argv[1]));
143 do_connected(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
145 reconnect_connected(reconnect, now);
149 do_activity(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
151 reconnect_activity(reconnect, now);
155 do_run(int argc, char *argv[])
157 enum reconnect_action action;
160 now += atoi(argv[1]);
163 action = reconnect_run(reconnect, now);
171 case RECONNECT_CONNECT:
172 printf(" should connect\n");
175 case RECONNECT_DISCONNECT:
176 printf(" should disconnect\n");
179 case RECONNECT_PROBE:
180 printf(" should send probe\n");
186 do_advance(int argc OVS_UNUSED, char *argv[])
188 now += atoi(argv[1]);
192 do_timeout(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
194 int timeout = reconnect_timeout(reconnect, now);
196 printf(" advance %d ms\n", timeout);
199 printf(" no timeout\n");
204 do_set_max_tries(int argc OVS_UNUSED, char *argv[])
206 reconnect_set_max_tries(reconnect, atoi(argv[1]));
210 diff_stats(const struct reconnect_stats *old,
211 const struct reconnect_stats *new,
214 if (old->state != new->state
215 || old->state_elapsed != new->state_elapsed
216 || old->backoff != new->backoff) {
217 printf(" in %s for %u ms (%d ms backoff)\n",
218 new->state, new->state_elapsed, new->backoff);
220 if (old->creation_time != new->creation_time
221 || old->last_activity != new->last_activity
222 || old->last_connected != new->last_connected) {
223 printf(" created %lld, last activity %lld, last connected %lld\n",
224 new->creation_time, new->last_activity, new->last_connected);
226 if (old->n_successful_connections != new->n_successful_connections
227 || old->n_attempted_connections != new->n_attempted_connections
228 || old->seqno != new->seqno) {
229 printf(" %u successful connections out of %u attempts, seqno %u\n",
230 new->n_successful_connections, new->n_attempted_connections,
233 if (old->is_connected != new->is_connected) {
234 printf(" %sconnected\n", new->is_connected ? "" : "dis");
236 if (old->last_connected != new->last_connected
237 || (old->msec_since_connect != new->msec_since_connect - delta
238 && !(old->msec_since_connect == UINT_MAX
239 && new->msec_since_connect == UINT_MAX))
240 || (old->total_connected_duration != new->total_connected_duration - delta
241 && !(old->total_connected_duration == 0
242 && new->total_connected_duration == 0))) {
243 printf(" last connected %u ms ago, connected %u ms total\n",
244 new->msec_since_connect, new->total_connected_duration);
246 if (old->last_disconnected != new->last_disconnected
247 || (old->msec_since_disconnect != new->msec_since_disconnect - delta
248 && !(old->msec_since_disconnect == UINT_MAX
249 && new->msec_since_disconnect == UINT_MAX))) {
250 printf(" disconnected at %llu ms (%u ms ago)\n",
251 new->last_disconnected, new->msec_since_disconnect);
256 do_set_passive(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
258 reconnect_set_passive(reconnect, true, now);
262 do_listening(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
264 reconnect_listening(reconnect, now);
268 do_listen_error(int argc OVS_UNUSED, char *argv[])
270 reconnect_listen_error(reconnect, now, atoi(argv[1]));
273 static const struct command all_commands[] = {
274 { "enable", 0, 0, do_enable },
275 { "disable", 0, 0, do_disable },
276 { "force-reconnect", 0, 0, do_force_reconnect },
277 { "disconnected", 0, 1, do_disconnected },
278 { "connecting", 0, 0, do_connecting },
279 { "connect-failed", 0, 1, do_connect_failed },
280 { "connected", 0, 0, do_connected },
281 { "activity", 0, 0, do_activity },
282 { "run", 0, 1, do_run },
283 { "advance", 1, 1, do_advance },
284 { "timeout", 0, 0, do_timeout },
285 { "set-max-tries", 1, 1, do_set_max_tries },
286 { "passive", 0, 0, do_set_passive },
287 { "listening", 0, 0, do_listening },
288 { "listen-error", 1, 1, do_listen_error },
289 { NULL, 0, 0, NULL },
292 static const struct command *
293 get_all_commands(void)
298 OVSTEST_REGISTER("test-reconnect", test_reconnect_main);