rconn: Decentralize and improve disconnection logging.
[cascardo/ovs.git] / lib / rconn.c
1 /*
2  * Copyright (c) 2008, 2009, 2010 Nicira Networks.
3  *
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:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <config.h>
18 #include "rconn.h"
19 #include <assert.h>
20 #include <errno.h>
21 #include <limits.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include "coverage.h"
25 #include "ofpbuf.h"
26 #include "openflow/openflow.h"
27 #include "poll-loop.h"
28 #include "sat-math.h"
29 #include "timeval.h"
30 #include "util.h"
31 #include "vconn.h"
32
33 #define THIS_MODULE VLM_rconn
34 #include "vlog.h"
35
36 #define STATES                                  \
37     STATE(VOID, 1 << 0)                         \
38     STATE(BACKOFF, 1 << 1)                      \
39     STATE(CONNECTING, 1 << 2)                   \
40     STATE(ACTIVE, 1 << 3)                       \
41     STATE(IDLE, 1 << 4)
42 enum state {
43 #define STATE(NAME, VALUE) S_##NAME = VALUE,
44     STATES
45 #undef STATE
46 };
47
48 static const char *
49 state_name(enum state state)
50 {
51     switch (state) {
52 #define STATE(NAME, VALUE) case S_##NAME: return #NAME;
53         STATES
54 #undef STATE
55     }
56     return "***ERROR***";
57 }
58
59 /* A reliable connection to an OpenFlow switch or controller.
60  *
61  * See the large comment in rconn.h for more information. */
62 struct rconn {
63     enum state state;
64     time_t state_entered;
65
66     struct vconn *vconn;
67     char *name;
68     bool reliable;
69
70     struct ovs_queue txq;
71
72     int backoff;
73     int max_backoff;
74     time_t backoff_deadline;
75     time_t last_received;
76     time_t last_connected;
77     unsigned int packets_sent;
78     unsigned int seqno;
79
80     /* In S_ACTIVE and S_IDLE, probably_admitted reports whether we believe
81      * that the peer has made a (positive) admission control decision on our
82      * connection.  If we have not yet been (probably) admitted, then the
83      * connection does not reset the timer used for deciding whether the switch
84      * should go into fail-open mode.
85      *
86      * last_admitted reports the last time we believe such a positive admission
87      * control decision was made. */
88     bool probably_admitted;
89     time_t last_admitted;
90
91     /* These values are simply for statistics reporting, not used directly by
92      * anything internal to the rconn (or ofproto for that matter). */
93     unsigned int packets_received;
94     unsigned int n_attempted_connections, n_successful_connections;
95     time_t creation_time;
96     unsigned long int total_time_connected;
97
98     /* If we can't connect to the peer, it could be for any number of reasons.
99      * Usually, one would assume it is because the peer is not running or
100      * because the network is partitioned.  But it could also be because the
101      * network topology has changed, in which case the upper layer will need to
102      * reassess it (in particular, obtain a new IP address via DHCP and find
103      * the new location of the controller).  We set this flag when we suspect
104      * that this could be the case. */
105     bool questionable_connectivity;
106     time_t last_questioned;
107
108     /* Throughout this file, "probe" is shorthand for "inactivity probe".
109      * When nothing has been received from the peer for a while, we send out
110      * an echo request as an inactivity probe packet.  We should receive back
111      * a response. */
112     int probe_interval;         /* Secs of inactivity before sending probe. */
113
114     /* When we create a vconn we obtain these values, to save them past the end
115      * of the vconn's lifetime.  Otherwise, in-band control will only allow
116      * traffic when a vconn is actually open, but it is nice to allow ARP to
117      * complete even between connection attempts, and it is also polite to
118      * allow traffic from other switches to go through to the controller
119      * whether or not we are connected.
120      *
121      * We don't cache the local port, because that changes from one connection
122      * attempt to the next. */
123     uint32_t local_ip, remote_ip;
124     uint16_t remote_port;
125
126     /* Messages sent or received are copied to the monitor connections. */
127 #define MAX_MONITORS 8
128     struct vconn *monitors[8];
129     size_t n_monitors;
130 };
131
132 static unsigned int elapsed_in_this_state(const struct rconn *);
133 static unsigned int timeout(const struct rconn *);
134 static bool timed_out(const struct rconn *);
135 static void state_transition(struct rconn *, enum state);
136 static void set_vconn_name(struct rconn *, const char *name);
137 static int try_send(struct rconn *);
138 static int reconnect(struct rconn *);
139 static void report_error(struct rconn *, int error);
140 static void disconnect(struct rconn *, int error);
141 static void flush_queue(struct rconn *);
142 static void question_connectivity(struct rconn *);
143 static void copy_to_monitor(struct rconn *, const struct ofpbuf *);
144 static bool is_connected_state(enum state);
145 static bool is_admitted_msg(const struct ofpbuf *);
146
147 /* Creates a new rconn, connects it (reliably) to 'name', and returns it. */
148 struct rconn *
149 rconn_new(const char *name, int inactivity_probe_interval, int max_backoff)
150 {
151     struct rconn *rc = rconn_create(inactivity_probe_interval, max_backoff);
152     rconn_connect(rc, name);
153     return rc;
154 }
155
156 /* Creates a new rconn, connects it (unreliably) to 'vconn', and returns it. */
157 struct rconn *
158 rconn_new_from_vconn(const char *name, struct vconn *vconn) 
159 {
160     struct rconn *rc = rconn_create(60, 0);
161     rconn_connect_unreliably(rc, name, vconn);
162     return rc;
163 }
164
165 /* Creates and returns a new rconn.
166  *
167  * 'probe_interval' is a number of seconds.  If the interval passes once
168  * without an OpenFlow message being received from the peer, the rconn sends
169  * out an "echo request" message.  If the interval passes again without a
170  * message being received, the rconn disconnects and re-connects to the peer.
171  * Setting 'probe_interval' to 0 disables this behavior.
172  *
173  * 'max_backoff' is the maximum number of seconds between attempts to connect
174  * to the peer.  The actual interval starts at 1 second and doubles on each
175  * failure until it reaches 'max_backoff'.  If 0 is specified, the default of
176  * 8 seconds is used. */
177 struct rconn *
178 rconn_create(int probe_interval, int max_backoff)
179 {
180     struct rconn *rc = xcalloc(1, sizeof *rc);
181
182     rc->state = S_VOID;
183     rc->state_entered = time_now();
184
185     rc->vconn = NULL;
186     rc->name = xstrdup("void");
187     rc->reliable = false;
188
189     queue_init(&rc->txq);
190
191     rc->backoff = 0;
192     rc->max_backoff = max_backoff ? max_backoff : 8;
193     rc->backoff_deadline = TIME_MIN;
194     rc->last_received = time_now();
195     rc->last_connected = time_now();
196     rc->seqno = 0;
197
198     rc->packets_sent = 0;
199
200     rc->probably_admitted = false;
201     rc->last_admitted = time_now();
202
203     rc->packets_received = 0;
204     rc->n_attempted_connections = 0;
205     rc->n_successful_connections = 0;
206     rc->creation_time = time_now();
207     rc->total_time_connected = 0;
208
209     rc->questionable_connectivity = false;
210     rc->last_questioned = time_now();
211
212     rconn_set_probe_interval(rc, probe_interval);
213
214     rc->n_monitors = 0;
215
216     return rc;
217 }
218
219 void
220 rconn_set_max_backoff(struct rconn *rc, int max_backoff)
221 {
222     rc->max_backoff = MAX(1, max_backoff);
223     if (rc->state == S_BACKOFF && rc->backoff > max_backoff) {
224         rc->backoff = max_backoff;
225         if (rc->backoff_deadline > time_now() + max_backoff) {
226             rc->backoff_deadline = time_now() + max_backoff;
227         }
228     }
229 }
230
231 int
232 rconn_get_max_backoff(const struct rconn *rc)
233 {
234     return rc->max_backoff;
235 }
236
237 void
238 rconn_set_probe_interval(struct rconn *rc, int probe_interval)
239 {
240     rc->probe_interval = probe_interval ? MAX(5, probe_interval) : 0;
241 }
242
243 int
244 rconn_get_probe_interval(const struct rconn *rc)
245 {
246     return rc->probe_interval;
247 }
248
249 int
250 rconn_connect(struct rconn *rc, const char *name)
251 {
252     rconn_disconnect(rc);
253     set_vconn_name(rc, name);
254     rc->reliable = true;
255     return reconnect(rc);
256 }
257
258 void
259 rconn_connect_unreliably(struct rconn *rc,
260                          const char *name, struct vconn *vconn)
261 {
262     assert(vconn != NULL);
263     rconn_disconnect(rc);
264     set_vconn_name(rc, name);
265     rc->reliable = false;
266     rc->vconn = vconn;
267     rc->last_connected = time_now();
268     state_transition(rc, S_ACTIVE);
269 }
270
271 /* If 'rc' is connected, forces it to drop the connection and reconnect. */
272 void
273 rconn_reconnect(struct rconn *rc)
274 {
275     if (rc->state & (S_ACTIVE | S_IDLE)) {
276         VLOG_INFO("%s: disconnecting", rc->name);
277         disconnect(rc, 0);
278     }
279 }
280
281 void
282 rconn_disconnect(struct rconn *rc)
283 {
284     if (rc->state != S_VOID) {
285         if (rc->vconn) {
286             vconn_close(rc->vconn);
287             rc->vconn = NULL;
288         }
289         set_vconn_name(rc, "void");
290         rc->reliable = false;
291
292         rc->backoff = 0;
293         rc->backoff_deadline = TIME_MIN;
294
295         state_transition(rc, S_VOID);
296     }
297 }
298
299 /* Disconnects 'rc' and frees the underlying storage. */
300 void
301 rconn_destroy(struct rconn *rc)
302 {
303     if (rc) {
304         size_t i;
305
306         free(rc->name);
307         vconn_close(rc->vconn);
308         flush_queue(rc);
309         queue_destroy(&rc->txq);
310         for (i = 0; i < rc->n_monitors; i++) {
311             vconn_close(rc->monitors[i]);
312         }
313         free(rc);
314     }
315 }
316
317 static unsigned int
318 timeout_VOID(const struct rconn *rc OVS_UNUSED)
319 {
320     return UINT_MAX;
321 }
322
323 static void
324 run_VOID(struct rconn *rc OVS_UNUSED)
325 {
326     /* Nothing to do. */
327 }
328
329 static int
330 reconnect(struct rconn *rc)
331 {
332     int retval;
333
334     VLOG_INFO("%s: connecting...", rc->name);
335     rc->n_attempted_connections++;
336     retval = vconn_open(rc->name, OFP_VERSION, &rc->vconn);
337     if (!retval) {
338         rc->remote_ip = vconn_get_remote_ip(rc->vconn);
339         rc->local_ip = vconn_get_local_ip(rc->vconn);
340         rc->remote_port = vconn_get_remote_port(rc->vconn);
341         rc->backoff_deadline = time_now() + rc->backoff;
342         state_transition(rc, S_CONNECTING);
343     } else {
344         VLOG_WARN("%s: connection failed (%s)", rc->name, strerror(retval));
345         rc->backoff_deadline = TIME_MAX; /* Prevent resetting backoff. */
346         disconnect(rc, 0);
347     }
348     return retval;
349 }
350
351 static unsigned int
352 timeout_BACKOFF(const struct rconn *rc)
353 {
354     return rc->backoff;
355 }
356
357 static void
358 run_BACKOFF(struct rconn *rc)
359 {
360     if (timed_out(rc)) {
361         reconnect(rc);
362     }
363 }
364
365 static unsigned int
366 timeout_CONNECTING(const struct rconn *rc)
367 {
368     return MAX(1, rc->backoff);
369 }
370
371 static void
372 run_CONNECTING(struct rconn *rc)
373 {
374     int retval = vconn_connect(rc->vconn);
375     if (!retval) {
376         VLOG_INFO("%s: connected", rc->name);
377         rc->n_successful_connections++;
378         state_transition(rc, S_ACTIVE);
379         rc->last_connected = rc->state_entered;
380     } else if (retval != EAGAIN) {
381         VLOG_INFO("%s: connection failed (%s)", rc->name, strerror(retval));
382         disconnect(rc, retval);
383     } else if (timed_out(rc)) {
384         VLOG_INFO("%s: connection timed out", rc->name);
385         rc->backoff_deadline = TIME_MAX; /* Prevent resetting backoff. */
386         disconnect(rc, 0);
387     }
388 }
389
390 static void
391 do_tx_work(struct rconn *rc)
392 {
393     if (!rc->txq.n) {
394         return;
395     }
396     while (rc->txq.n > 0) {
397         int error = try_send(rc);
398         if (error) {
399             break;
400         }
401     }
402     if (!rc->txq.n) {
403         poll_immediate_wake();
404     }
405 }
406
407 static unsigned int
408 timeout_ACTIVE(const struct rconn *rc)
409 {
410     if (rc->probe_interval) {
411         unsigned int base = MAX(rc->last_received, rc->state_entered);
412         unsigned int arg = base + rc->probe_interval - rc->state_entered;
413         return arg;
414     }
415     return UINT_MAX;
416 }
417
418 static void
419 run_ACTIVE(struct rconn *rc)
420 {
421     if (timed_out(rc)) {
422         unsigned int base = MAX(rc->last_received, rc->state_entered);
423         VLOG_DBG("%s: idle %u seconds, sending inactivity probe",
424                  rc->name, (unsigned int) (time_now() - base));
425
426         /* Ordering is important here: rconn_send() can transition to BACKOFF,
427          * and we don't want to transition back to IDLE if so, because then we
428          * can end up queuing a packet with vconn == NULL and then *boom*. */
429         state_transition(rc, S_IDLE);
430         rconn_send(rc, make_echo_request(), NULL);
431         return;
432     }
433
434     do_tx_work(rc);
435 }
436
437 static unsigned int
438 timeout_IDLE(const struct rconn *rc)
439 {
440     return rc->probe_interval;
441 }
442
443 static void
444 run_IDLE(struct rconn *rc)
445 {
446     if (timed_out(rc)) {
447         question_connectivity(rc);
448         VLOG_ERR("%s: no response to inactivity probe after %u "
449                  "seconds, disconnecting",
450                  rc->name, elapsed_in_this_state(rc));
451         disconnect(rc, 0);
452     } else {
453         do_tx_work(rc);
454     }
455 }
456
457 /* Performs whatever activities are necessary to maintain 'rc': if 'rc' is
458  * disconnected, attempts to (re)connect, backing off as necessary; if 'rc' is
459  * connected, attempts to send packets in the send queue, if any. */
460 void
461 rconn_run(struct rconn *rc)
462 {
463     int old_state;
464     do {
465         old_state = rc->state;
466         switch (rc->state) {
467 #define STATE(NAME, VALUE) case S_##NAME: run_##NAME(rc); break;
468             STATES
469 #undef STATE
470         default:
471             NOT_REACHED();
472         }
473     } while (rc->state != old_state);
474 }
475
476 /* Causes the next call to poll_block() to wake up when rconn_run() should be
477  * called on 'rc'. */
478 void
479 rconn_run_wait(struct rconn *rc)
480 {
481     unsigned int timeo = timeout(rc);
482     if (timeo != UINT_MAX) {
483         unsigned int expires = sat_add(rc->state_entered, timeo);
484         unsigned int remaining = sat_sub(expires, time_now());
485         poll_timer_wait(sat_mul(remaining, 1000));
486     }
487
488     if ((rc->state & (S_ACTIVE | S_IDLE)) && rc->txq.n) {
489         vconn_wait(rc->vconn, WAIT_SEND);
490     }
491 }
492
493 /* Attempts to receive a packet from 'rc'.  If successful, returns the packet;
494  * otherwise, returns a null pointer.  The caller is responsible for freeing
495  * the packet (with ofpbuf_delete()). */
496 struct ofpbuf *
497 rconn_recv(struct rconn *rc)
498 {
499     if (rc->state & (S_ACTIVE | S_IDLE)) {
500         struct ofpbuf *buffer;
501         int error = vconn_recv(rc->vconn, &buffer);
502         if (!error) {
503             copy_to_monitor(rc, buffer);
504             if (rc->probably_admitted || is_admitted_msg(buffer)
505                 || time_now() - rc->last_connected >= 30) {
506                 rc->probably_admitted = true;
507                 rc->last_admitted = time_now();
508             }
509             rc->last_received = time_now();
510             rc->packets_received++;
511             if (rc->state == S_IDLE) {
512                 state_transition(rc, S_ACTIVE);
513             }
514             return buffer;
515         } else if (error != EAGAIN) {
516             report_error(rc, error);
517             disconnect(rc, error);
518         }
519     }
520     return NULL;
521 }
522
523 /* Causes the next call to poll_block() to wake up when a packet may be ready
524  * to be received by vconn_recv() on 'rc'.  */
525 void
526 rconn_recv_wait(struct rconn *rc)
527 {
528     if (rc->vconn) {
529         vconn_wait(rc->vconn, WAIT_RECV);
530     }
531 }
532
533 /* Sends 'b' on 'rc'.  Returns 0 if successful (in which case 'b' is
534  * destroyed), or ENOTCONN if 'rc' is not currently connected (in which case
535  * the caller retains ownership of 'b').
536  *
537  * If 'counter' is non-null, then 'counter' will be incremented while the
538  * packet is in flight, then decremented when it has been sent (or discarded
539  * due to disconnection).  Because 'b' may be sent (or discarded) before this
540  * function returns, the caller may not be able to observe any change in
541  * 'counter'.
542  *
543  * There is no rconn_send_wait() function: an rconn has a send queue that it
544  * takes care of sending if you call rconn_run(), which will have the side
545  * effect of waking up poll_block(). */
546 int
547 rconn_send(struct rconn *rc, struct ofpbuf *b,
548            struct rconn_packet_counter *counter)
549 {
550     if (rconn_is_connected(rc)) {
551         COVERAGE_INC(rconn_queued);
552         copy_to_monitor(rc, b);
553         b->private_p = counter;
554         if (counter) {
555             rconn_packet_counter_inc(counter);
556         }
557         queue_push_tail(&rc->txq, b);
558
559         /* If the queue was empty before we added 'b', try to send some
560          * packets.  (But if the queue had packets in it, it's because the
561          * vconn is backlogged and there's no point in stuffing more into it
562          * now.  We'll get back to that in rconn_run().) */
563         if (rc->txq.n == 1) {
564             try_send(rc);
565         }
566         return 0;
567     } else {
568         return ENOTCONN;
569     }
570 }
571
572 /* Sends 'b' on 'rc'.  Increments 'counter' while the packet is in flight; it
573  * will be decremented when it has been sent (or discarded due to
574  * disconnection).  Returns 0 if successful, EAGAIN if 'counter->n' is already
575  * at least as large as 'queue_limit', or ENOTCONN if 'rc' is not currently
576  * connected.  Regardless of return value, 'b' is destroyed.
577  *
578  * Because 'b' may be sent (or discarded) before this function returns, the
579  * caller may not be able to observe any change in 'counter'.
580  *
581  * There is no rconn_send_wait() function: an rconn has a send queue that it
582  * takes care of sending if you call rconn_run(), which will have the side
583  * effect of waking up poll_block(). */
584 int
585 rconn_send_with_limit(struct rconn *rc, struct ofpbuf *b,
586                       struct rconn_packet_counter *counter, int queue_limit)
587 {
588     int retval;
589     retval = counter->n >= queue_limit ? EAGAIN : rconn_send(rc, b, counter);
590     if (retval) {
591         COVERAGE_INC(rconn_overflow);
592         ofpbuf_delete(b);
593     }
594     return retval;
595 }
596
597 /* Returns the total number of packets successfully sent on the underlying
598  * vconn.  A packet is not counted as sent while it is still queued in the
599  * rconn, only when it has been successfuly passed to the vconn.  */
600 unsigned int
601 rconn_packets_sent(const struct rconn *rc)
602 {
603     return rc->packets_sent;
604 }
605
606 /* Adds 'vconn' to 'rc' as a monitoring connection, to which all messages sent
607  * and received on 'rconn' will be copied.  'rc' takes ownership of 'vconn'. */
608 void
609 rconn_add_monitor(struct rconn *rc, struct vconn *vconn)
610 {
611     if (rc->n_monitors < ARRAY_SIZE(rc->monitors)) {
612         VLOG_INFO("new monitor connection from %s", vconn_get_name(vconn));
613         rc->monitors[rc->n_monitors++] = vconn;
614     } else {
615         VLOG_DBG("too many monitor connections, discarding %s",
616                  vconn_get_name(vconn));
617         vconn_close(vconn);
618     }
619 }
620
621 /* Returns 'rc''s name (the 'name' argument passed to rconn_new()). */
622 const char *
623 rconn_get_name(const struct rconn *rc)
624 {
625     return rc->name;
626 }
627
628 /* Returns true if 'rconn' is connected or in the process of reconnecting,
629  * false if 'rconn' is disconnected and will not reconnect on its own. */
630 bool
631 rconn_is_alive(const struct rconn *rconn)
632 {
633     return rconn->state != S_VOID;
634 }
635
636 /* Returns true if 'rconn' is connected, false otherwise. */
637 bool
638 rconn_is_connected(const struct rconn *rconn)
639 {
640     return is_connected_state(rconn->state);
641 }
642
643 /* Returns true if 'rconn' is connected and thought to have been accepted by
644  * the peer's admission-control policy. */
645 bool
646 rconn_is_admitted(const struct rconn *rconn)
647 {
648     return (rconn_is_connected(rconn)
649             && rconn->last_admitted >= rconn->last_connected);
650 }
651
652 /* Returns 0 if 'rconn' is currently connected and considered to have been
653  * accepted by the peer's admission-control policy, otherwise the number of
654  * seconds since 'rconn' was last in such a state. */
655 int
656 rconn_failure_duration(const struct rconn *rconn)
657 {
658     return rconn_is_admitted(rconn) ? 0 : time_now() - rconn->last_admitted;
659 }
660
661 /* Returns the IP address of the peer, or 0 if the peer's IP address is not
662  * known. */
663 uint32_t
664 rconn_get_remote_ip(const struct rconn *rconn) 
665 {
666     return rconn->remote_ip;
667 }
668
669 /* Returns the transport port of the peer, or 0 if the peer's port is not
670  * known. */
671 uint16_t
672 rconn_get_remote_port(const struct rconn *rconn) 
673 {
674     return rconn->remote_port;
675 }
676
677 /* Returns the IP address used to connect to the peer, or 0 if the
678  * connection is not an IP-based protocol or if its IP address is not 
679  * known. */
680 uint32_t
681 rconn_get_local_ip(const struct rconn *rconn) 
682 {
683     return rconn->local_ip;
684 }
685
686 /* Returns the transport port used to connect to the peer, or 0 if the
687  * connection does not contain a port or if the port is not known. */
688 uint16_t
689 rconn_get_local_port(const struct rconn *rconn) 
690 {
691     return rconn->vconn ? vconn_get_local_port(rconn->vconn) : 0;
692 }
693
694 /* If 'rconn' can't connect to the peer, it could be for any number of reasons.
695  * Usually, one would assume it is because the peer is not running or because
696  * the network is partitioned.  But it could also be because the network
697  * topology has changed, in which case the upper layer will need to reassess it
698  * (in particular, obtain a new IP address via DHCP and find the new location
699  * of the controller).  When this appears that this might be the case, this
700  * function returns true.  It also clears the questionability flag and prevents
701  * it from being set again for some time. */
702 bool
703 rconn_is_connectivity_questionable(struct rconn *rconn)
704 {
705     bool questionable = rconn->questionable_connectivity;
706     rconn->questionable_connectivity = false;
707     return questionable;
708 }
709
710 /* Returns the total number of packets successfully received by the underlying
711  * vconn.  */
712 unsigned int
713 rconn_packets_received(const struct rconn *rc)
714 {
715     return rc->packets_received;
716 }
717
718 /* Returns a string representing the internal state of 'rc'.  The caller must
719  * not modify or free the string. */
720 const char *
721 rconn_get_state(const struct rconn *rc)
722 {
723     return state_name(rc->state);
724 }
725
726 /* Returns the number of connection attempts made by 'rc', including any
727  * ongoing attempt that has not yet succeeded or failed. */
728 unsigned int
729 rconn_get_attempted_connections(const struct rconn *rc)
730 {
731     return rc->n_attempted_connections;
732 }
733
734 /* Returns the number of successful connection attempts made by 'rc'. */
735 unsigned int
736 rconn_get_successful_connections(const struct rconn *rc)
737 {
738     return rc->n_successful_connections;
739 }
740
741 /* Returns the time at which the last successful connection was made by
742  * 'rc'. */
743 time_t
744 rconn_get_last_connection(const struct rconn *rc)
745 {
746     return rc->last_connected;
747 }
748
749 /* Returns the time at which the last OpenFlow message was received by 'rc'.
750  * If no packets have been received on 'rc', returns the time at which 'rc'
751  * was created. */
752 time_t
753 rconn_get_last_received(const struct rconn *rc)
754 {
755     return rc->last_received;
756 }
757
758 /* Returns the time at which 'rc' was created. */
759 time_t
760 rconn_get_creation_time(const struct rconn *rc)
761 {
762     return rc->creation_time;
763 }
764
765 /* Returns the approximate number of seconds that 'rc' has been connected. */
766 unsigned long int
767 rconn_get_total_time_connected(const struct rconn *rc)
768 {
769     return (rc->total_time_connected
770             + (rconn_is_connected(rc) ? elapsed_in_this_state(rc) : 0));
771 }
772
773 /* Returns the current amount of backoff, in seconds.  This is the amount of
774  * time after which the rconn will transition from BACKOFF to CONNECTING. */
775 int
776 rconn_get_backoff(const struct rconn *rc)
777 {
778     return rc->backoff;
779 }
780
781 /* Returns the number of seconds spent in this state so far. */
782 unsigned int
783 rconn_get_state_elapsed(const struct rconn *rc)
784 {
785     return elapsed_in_this_state(rc);
786 }
787
788 /* Returns 'rc''s current connection sequence number, a number that changes
789  * every time that 'rconn' connects or disconnects. */
790 unsigned int
791 rconn_get_connection_seqno(const struct rconn *rc)
792 {
793     return rc->seqno;
794 }
795 \f
796 struct rconn_packet_counter *
797 rconn_packet_counter_create(void)
798 {
799     struct rconn_packet_counter *c = xmalloc(sizeof *c);
800     c->n = 0;
801     c->ref_cnt = 1;
802     return c;
803 }
804
805 void
806 rconn_packet_counter_destroy(struct rconn_packet_counter *c)
807 {
808     if (c) {
809         assert(c->ref_cnt > 0);
810         if (!--c->ref_cnt && !c->n) {
811             free(c);
812         }
813     }
814 }
815
816 void
817 rconn_packet_counter_inc(struct rconn_packet_counter *c)
818 {
819     c->n++;
820 }
821
822 void
823 rconn_packet_counter_dec(struct rconn_packet_counter *c)
824 {
825     assert(c->n > 0);
826     if (!--c->n && !c->ref_cnt) {
827         free(c);
828     }
829 }
830 \f
831 /* Set the name of the remote vconn to 'name' and clear out the cached IP
832  * address and port information, since changing the name also likely changes
833  * these values. */
834 static void
835 set_vconn_name(struct rconn *rc, const char *name)
836 {
837     free(rc->name);
838     rc->name = xstrdup(name);
839     rc->local_ip = 0;
840     rc->remote_ip = 0;
841     rc->remote_port = 0;
842 }
843
844 /* Tries to send a packet from 'rc''s send buffer.  Returns 0 if successful,
845  * otherwise a positive errno value. */
846 static int
847 try_send(struct rconn *rc)
848 {
849     int retval = 0;
850     struct ofpbuf *next = rc->txq.head->next;
851     struct rconn_packet_counter *counter = rc->txq.head->private_p;
852     retval = vconn_send(rc->vconn, rc->txq.head);
853     if (retval) {
854         if (retval != EAGAIN) {
855             report_error(rc, retval);
856             disconnect(rc, retval);
857         }
858         return retval;
859     }
860     COVERAGE_INC(rconn_sent);
861     rc->packets_sent++;
862     if (counter) {
863         rconn_packet_counter_dec(counter);
864     }
865     queue_advance_head(&rc->txq, next);
866     return 0;
867 }
868
869 /* Reports that 'error' caused 'rc' to disconnect.  'error' may be a positive
870  * errno value, or it may be EOF to indicate that the connection was closed
871  * normally. */
872 static void
873 report_error(struct rconn *rc, int error)
874 {
875     if (error == EOF) {
876         /* If 'rc' isn't reliable, then we don't really expect this connection
877          * to last forever anyway (probably it's a connection that we received
878          * via accept()), so use DBG level to avoid cluttering the logs. */
879         enum vlog_level level = rc->reliable ? VLL_INFO : VLL_DBG;
880         VLOG(level, "%s: connection closed by peer", rc->name);
881     } else {
882         VLOG_WARN("%s: connection dropped (%s)", rc->name, strerror(error));
883     }
884 }
885
886 /* Disconnects 'rc'. */
887 static void
888 disconnect(struct rconn *rc, int error OVS_UNUSED)
889 {
890     if (rc->reliable) {
891         time_t now = time_now();
892
893         if (rc->state & (S_CONNECTING | S_ACTIVE | S_IDLE)) {
894             vconn_close(rc->vconn);
895             rc->vconn = NULL;
896             flush_queue(rc);
897         }
898
899         if (now >= rc->backoff_deadline) {
900             rc->backoff = 1;
901         } else {
902             rc->backoff = MIN(rc->max_backoff, MAX(1, 2 * rc->backoff));
903             VLOG_INFO("%s: waiting %d seconds before reconnect\n",
904                       rc->name, rc->backoff);
905         }
906         rc->backoff_deadline = now + rc->backoff;
907         state_transition(rc, S_BACKOFF);
908         if (now - rc->last_connected > 60) {
909             question_connectivity(rc);
910         }
911     } else {
912         rconn_disconnect(rc);
913     }
914 }
915
916 /* Drops all the packets from 'rc''s send queue and decrements their queue
917  * counts. */
918 static void
919 flush_queue(struct rconn *rc)
920 {
921     if (!rc->txq.n) {
922         return;
923     }
924     while (rc->txq.n > 0) {
925         struct ofpbuf *b = queue_pop_head(&rc->txq);
926         struct rconn_packet_counter *counter = b->private_p;
927         if (counter) {
928             rconn_packet_counter_dec(counter);
929         }
930         COVERAGE_INC(rconn_discarded);
931         ofpbuf_delete(b);
932     }
933     poll_immediate_wake();
934 }
935
936 static unsigned int
937 elapsed_in_this_state(const struct rconn *rc)
938 {
939     return time_now() - rc->state_entered;
940 }
941
942 static unsigned int
943 timeout(const struct rconn *rc)
944 {
945     switch (rc->state) {
946 #define STATE(NAME, VALUE) case S_##NAME: return timeout_##NAME(rc);
947         STATES
948 #undef STATE
949     default:
950         NOT_REACHED();
951     }
952 }
953
954 static bool
955 timed_out(const struct rconn *rc)
956 {
957     return time_now() >= sat_add(rc->state_entered, timeout(rc));
958 }
959
960 static void
961 state_transition(struct rconn *rc, enum state state)
962 {
963     rc->seqno += (rc->state == S_ACTIVE) != (state == S_ACTIVE);
964     if (is_connected_state(state) && !is_connected_state(rc->state)) {
965         rc->probably_admitted = false;
966     }
967     if (rconn_is_connected(rc)) {
968         rc->total_time_connected += elapsed_in_this_state(rc);
969     }
970     VLOG_DBG("%s: entering %s", rc->name, state_name(state));
971     rc->state = state;
972     rc->state_entered = time_now();
973 }
974
975 static void
976 question_connectivity(struct rconn *rc) 
977 {
978     time_t now = time_now();
979     if (now - rc->last_questioned > 60) {
980         rc->questionable_connectivity = true;
981         rc->last_questioned = now;
982     }
983 }
984
985 static void
986 copy_to_monitor(struct rconn *rc, const struct ofpbuf *b)
987 {
988     struct ofpbuf *clone = NULL;
989     int retval;
990     size_t i;
991
992     for (i = 0; i < rc->n_monitors; ) {
993         struct vconn *vconn = rc->monitors[i];
994
995         if (!clone) {
996             clone = ofpbuf_clone(b);
997         }
998         retval = vconn_send(vconn, clone);
999         if (!retval) {
1000             clone = NULL;
1001         } else if (retval != EAGAIN) {
1002             VLOG_DBG("%s: closing monitor connection to %s: %s",
1003                      rconn_get_name(rc), vconn_get_name(vconn),
1004                      strerror(retval));
1005             rc->monitors[i] = rc->monitors[--rc->n_monitors];
1006             continue;
1007         }
1008         i++;
1009     }
1010     ofpbuf_delete(clone);
1011 }
1012
1013 static bool
1014 is_connected_state(enum state state) 
1015 {
1016     return (state & (S_ACTIVE | S_IDLE)) != 0;
1017 }
1018
1019 static bool
1020 is_admitted_msg(const struct ofpbuf *b)
1021 {
1022     struct ofp_header *oh = b->data;
1023     uint8_t type = oh->type;
1024     return !(type < 32
1025              && (1u << type) & ((1u << OFPT_HELLO) |
1026                                 (1u << OFPT_ERROR) |
1027                                 (1u << OFPT_ECHO_REQUEST) |
1028                                 (1u << OFPT_ECHO_REPLY) |
1029                                 (1u << OFPT_VENDOR) |
1030                                 (1u << OFPT_FEATURES_REQUEST) |
1031                                 (1u << OFPT_FEATURES_REPLY) |
1032                                 (1u << OFPT_GET_CONFIG_REQUEST) |
1033                                 (1u << OFPT_GET_CONFIG_REPLY) |
1034                                 (1u << OFPT_SET_CONFIG)));
1035 }