rconn: Drop 'name' arg to rconn_new_from_vconn(), rconn_connect_unreliably().
[openvswitch] / 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     int last_error;
80
81     /* In S_ACTIVE and S_IDLE, probably_admitted reports whether we believe
82      * that the peer has made a (positive) admission control decision on our
83      * connection.  If we have not yet been (probably) admitted, then the
84      * connection does not reset the timer used for deciding whether the switch
85      * should go into fail-open mode.
86      *
87      * last_admitted reports the last time we believe such a positive admission
88      * control decision was made. */
89     bool probably_admitted;
90     time_t last_admitted;
91
92     /* These values are simply for statistics reporting, not used directly by
93      * anything internal to the rconn (or ofproto for that matter). */
94     unsigned int packets_received;
95     unsigned int n_attempted_connections, n_successful_connections;
96     time_t creation_time;
97     unsigned long int total_time_connected;
98
99     /* If we can't connect to the peer, it could be for any number of reasons.
100      * Usually, one would assume it is because the peer is not running or
101      * because the network is partitioned.  But it could also be because the
102      * network topology has changed, in which case the upper layer will need to
103      * reassess it (in particular, obtain a new IP address via DHCP and find
104      * the new location of the controller).  We set this flag when we suspect
105      * that this could be the case. */
106     bool questionable_connectivity;
107     time_t last_questioned;
108
109     /* Throughout this file, "probe" is shorthand for "inactivity probe".
110      * When nothing has been received from the peer for a while, we send out
111      * an echo request as an inactivity probe packet.  We should receive back
112      * a response. */
113     int probe_interval;         /* Secs of inactivity before sending probe. */
114
115     /* When we create a vconn we obtain these values, to save them past the end
116      * of the vconn's lifetime.  Otherwise, in-band control will only allow
117      * traffic when a vconn is actually open, but it is nice to allow ARP to
118      * complete even between connection attempts, and it is also polite to
119      * allow traffic from other switches to go through to the controller
120      * whether or not we are connected.
121      *
122      * We don't cache the local port, because that changes from one connection
123      * attempt to the next. */
124     uint32_t local_ip, remote_ip;
125     uint16_t remote_port;
126
127     /* Messages sent or received are copied to the monitor connections. */
128 #define MAX_MONITORS 8
129     struct vconn *monitors[8];
130     size_t n_monitors;
131 };
132
133 static unsigned int elapsed_in_this_state(const struct rconn *);
134 static unsigned int timeout(const struct rconn *);
135 static bool timed_out(const struct rconn *);
136 static void state_transition(struct rconn *, enum state);
137 static void set_vconn_name(struct rconn *, const char *name);
138 static int try_send(struct rconn *);
139 static int reconnect(struct rconn *);
140 static void report_error(struct rconn *, int error);
141 static void disconnect(struct rconn *, int error);
142 static void flush_queue(struct rconn *);
143 static void question_connectivity(struct rconn *);
144 static void copy_to_monitor(struct rconn *, const struct ofpbuf *);
145 static bool is_connected_state(enum state);
146 static bool is_admitted_msg(const struct ofpbuf *);
147
148 /* Creates a new rconn, connects it (reliably) to 'name', and returns it. */
149 struct rconn *
150 rconn_new(const char *name, int inactivity_probe_interval, int max_backoff)
151 {
152     struct rconn *rc = rconn_create(inactivity_probe_interval, max_backoff);
153     rconn_connect(rc, name);
154     return rc;
155 }
156
157 /* Creates a new rconn, connects it (unreliably) to 'vconn', and returns it. */
158 struct rconn *
159 rconn_new_from_vconn(struct vconn *vconn) 
160 {
161     struct rconn *rc = rconn_create(60, 0);
162     rconn_connect_unreliably(rc, vconn);
163     return rc;
164 }
165
166 /* Creates and returns a new rconn.
167  *
168  * 'probe_interval' is a number of seconds.  If the interval passes once
169  * without an OpenFlow message being received from the peer, the rconn sends
170  * out an "echo request" message.  If the interval passes again without a
171  * message being received, the rconn disconnects and re-connects to the peer.
172  * Setting 'probe_interval' to 0 disables this behavior.
173  *
174  * 'max_backoff' is the maximum number of seconds between attempts to connect
175  * to the peer.  The actual interval starts at 1 second and doubles on each
176  * failure until it reaches 'max_backoff'.  If 0 is specified, the default of
177  * 8 seconds is used. */
178 struct rconn *
179 rconn_create(int probe_interval, int max_backoff)
180 {
181     struct rconn *rc = xzalloc(sizeof *rc);
182
183     rc->state = S_VOID;
184     rc->state_entered = time_now();
185
186     rc->vconn = NULL;
187     rc->name = xstrdup("void");
188     rc->reliable = false;
189
190     queue_init(&rc->txq);
191
192     rc->backoff = 0;
193     rc->max_backoff = max_backoff ? max_backoff : 8;
194     rc->backoff_deadline = TIME_MIN;
195     rc->last_received = time_now();
196     rc->last_connected = time_now();
197     rc->seqno = 0;
198
199     rc->packets_sent = 0;
200
201     rc->probably_admitted = false;
202     rc->last_admitted = time_now();
203
204     rc->packets_received = 0;
205     rc->n_attempted_connections = 0;
206     rc->n_successful_connections = 0;
207     rc->creation_time = time_now();
208     rc->total_time_connected = 0;
209
210     rc->questionable_connectivity = false;
211     rc->last_questioned = time_now();
212
213     rconn_set_probe_interval(rc, probe_interval);
214
215     rc->n_monitors = 0;
216
217     return rc;
218 }
219
220 void
221 rconn_set_max_backoff(struct rconn *rc, int max_backoff)
222 {
223     rc->max_backoff = MAX(1, max_backoff);
224     if (rc->state == S_BACKOFF && rc->backoff > max_backoff) {
225         rc->backoff = max_backoff;
226         if (rc->backoff_deadline > time_now() + max_backoff) {
227             rc->backoff_deadline = time_now() + max_backoff;
228         }
229     }
230 }
231
232 int
233 rconn_get_max_backoff(const struct rconn *rc)
234 {
235     return rc->max_backoff;
236 }
237
238 void
239 rconn_set_probe_interval(struct rconn *rc, int probe_interval)
240 {
241     rc->probe_interval = probe_interval ? MAX(5, probe_interval) : 0;
242 }
243
244 int
245 rconn_get_probe_interval(const struct rconn *rc)
246 {
247     return rc->probe_interval;
248 }
249
250 int
251 rconn_connect(struct rconn *rc, const char *name)
252 {
253     rconn_disconnect(rc);
254     set_vconn_name(rc, name);
255     rc->reliable = true;
256     return reconnect(rc);
257 }
258
259 void
260 rconn_connect_unreliably(struct rconn *rc, struct vconn *vconn)
261 {
262     assert(vconn != NULL);
263     rconn_disconnect(rc);
264     set_vconn_name(rc, vconn_get_name(vconn));
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, retval);
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, ETIMEDOUT);
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, ETIMEDOUT);
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     size_t i;
465
466     if (rc->vconn) {
467         vconn_run(rc->vconn);
468     }
469     for (i = 0; i < rc->n_monitors; i++) {
470         vconn_run(rc->monitors[i]);
471     }
472
473     do {
474         old_state = rc->state;
475         switch (rc->state) {
476 #define STATE(NAME, VALUE) case S_##NAME: run_##NAME(rc); break;
477             STATES
478 #undef STATE
479         default:
480             NOT_REACHED();
481         }
482     } while (rc->state != old_state);
483 }
484
485 /* Causes the next call to poll_block() to wake up when rconn_run() should be
486  * called on 'rc'. */
487 void
488 rconn_run_wait(struct rconn *rc)
489 {
490     unsigned int timeo;
491     size_t i;
492
493     if (rc->vconn) {
494         vconn_run_wait(rc->vconn);
495     }
496     for (i = 0; i < rc->n_monitors; i++) {
497         vconn_run_wait(rc->monitors[i]);
498     }
499
500     timeo = timeout(rc);
501     if (timeo != UINT_MAX) {
502         long long int expires = sat_add(rc->state_entered, timeo);
503         poll_timer_wait_until(expires * 1000);
504     }
505
506     if ((rc->state & (S_ACTIVE | S_IDLE)) && rc->txq.n) {
507         vconn_wait(rc->vconn, WAIT_SEND);
508     }
509 }
510
511 /* Attempts to receive a packet from 'rc'.  If successful, returns the packet;
512  * otherwise, returns a null pointer.  The caller is responsible for freeing
513  * the packet (with ofpbuf_delete()). */
514 struct ofpbuf *
515 rconn_recv(struct rconn *rc)
516 {
517     if (rc->state & (S_ACTIVE | S_IDLE)) {
518         struct ofpbuf *buffer;
519         int error = vconn_recv(rc->vconn, &buffer);
520         if (!error) {
521             copy_to_monitor(rc, buffer);
522             if (rc->probably_admitted || is_admitted_msg(buffer)
523                 || time_now() - rc->last_connected >= 30) {
524                 rc->probably_admitted = true;
525                 rc->last_admitted = time_now();
526             }
527             rc->last_received = time_now();
528             rc->packets_received++;
529             if (rc->state == S_IDLE) {
530                 state_transition(rc, S_ACTIVE);
531             }
532             return buffer;
533         } else if (error != EAGAIN) {
534             report_error(rc, error);
535             disconnect(rc, error);
536         }
537     }
538     return NULL;
539 }
540
541 /* Causes the next call to poll_block() to wake up when a packet may be ready
542  * to be received by vconn_recv() on 'rc'.  */
543 void
544 rconn_recv_wait(struct rconn *rc)
545 {
546     if (rc->vconn) {
547         vconn_wait(rc->vconn, WAIT_RECV);
548     }
549 }
550
551 /* Sends 'b' on 'rc'.  Returns 0 if successful (in which case 'b' is
552  * destroyed), or ENOTCONN if 'rc' is not currently connected (in which case
553  * the caller retains ownership of 'b').
554  *
555  * If 'counter' is non-null, then 'counter' will be incremented while the
556  * packet is in flight, then decremented when it has been sent (or discarded
557  * due to disconnection).  Because 'b' may be sent (or discarded) before this
558  * function returns, the caller may not be able to observe any change in
559  * 'counter'.
560  *
561  * There is no rconn_send_wait() function: an rconn has a send queue that it
562  * takes care of sending if you call rconn_run(), which will have the side
563  * effect of waking up poll_block(). */
564 int
565 rconn_send(struct rconn *rc, struct ofpbuf *b,
566            struct rconn_packet_counter *counter)
567 {
568     if (rconn_is_connected(rc)) {
569         COVERAGE_INC(rconn_queued);
570         copy_to_monitor(rc, b);
571         b->private_p = counter;
572         if (counter) {
573             rconn_packet_counter_inc(counter);
574         }
575         queue_push_tail(&rc->txq, b);
576
577         /* If the queue was empty before we added 'b', try to send some
578          * packets.  (But if the queue had packets in it, it's because the
579          * vconn is backlogged and there's no point in stuffing more into it
580          * now.  We'll get back to that in rconn_run().) */
581         if (rc->txq.n == 1) {
582             try_send(rc);
583         }
584         return 0;
585     } else {
586         return ENOTCONN;
587     }
588 }
589
590 /* Sends 'b' on 'rc'.  Increments 'counter' while the packet is in flight; it
591  * will be decremented when it has been sent (or discarded due to
592  * disconnection).  Returns 0 if successful, EAGAIN if 'counter->n' is already
593  * at least as large as 'queue_limit', or ENOTCONN if 'rc' is not currently
594  * connected.  Regardless of return value, 'b' is destroyed.
595  *
596  * Because 'b' may be sent (or discarded) before this function returns, the
597  * caller may not be able to observe any change in 'counter'.
598  *
599  * There is no rconn_send_wait() function: an rconn has a send queue that it
600  * takes care of sending if you call rconn_run(), which will have the side
601  * effect of waking up poll_block(). */
602 int
603 rconn_send_with_limit(struct rconn *rc, struct ofpbuf *b,
604                       struct rconn_packet_counter *counter, int queue_limit)
605 {
606     int retval;
607     retval = counter->n >= queue_limit ? EAGAIN : rconn_send(rc, b, counter);
608     if (retval) {
609         COVERAGE_INC(rconn_overflow);
610         ofpbuf_delete(b);
611     }
612     return retval;
613 }
614
615 /* Returns the total number of packets successfully sent on the underlying
616  * vconn.  A packet is not counted as sent while it is still queued in the
617  * rconn, only when it has been successfuly passed to the vconn.  */
618 unsigned int
619 rconn_packets_sent(const struct rconn *rc)
620 {
621     return rc->packets_sent;
622 }
623
624 /* Adds 'vconn' to 'rc' as a monitoring connection, to which all messages sent
625  * and received on 'rconn' will be copied.  'rc' takes ownership of 'vconn'. */
626 void
627 rconn_add_monitor(struct rconn *rc, struct vconn *vconn)
628 {
629     if (rc->n_monitors < ARRAY_SIZE(rc->monitors)) {
630         VLOG_INFO("new monitor connection from %s", vconn_get_name(vconn));
631         rc->monitors[rc->n_monitors++] = vconn;
632     } else {
633         VLOG_DBG("too many monitor connections, discarding %s",
634                  vconn_get_name(vconn));
635         vconn_close(vconn);
636     }
637 }
638
639 /* Returns 'rc''s name (the 'name' argument passed to rconn_new()). */
640 const char *
641 rconn_get_name(const struct rconn *rc)
642 {
643     return rc->name;
644 }
645
646 /* Returns true if 'rconn' is connected or in the process of reconnecting,
647  * false if 'rconn' is disconnected and will not reconnect on its own. */
648 bool
649 rconn_is_alive(const struct rconn *rconn)
650 {
651     return rconn->state != S_VOID;
652 }
653
654 /* Returns true if 'rconn' is connected, false otherwise. */
655 bool
656 rconn_is_connected(const struct rconn *rconn)
657 {
658     return is_connected_state(rconn->state);
659 }
660
661 /* Returns true if 'rconn' is connected and thought to have been accepted by
662  * the peer's admission-control policy. */
663 bool
664 rconn_is_admitted(const struct rconn *rconn)
665 {
666     return (rconn_is_connected(rconn)
667             && rconn->last_admitted >= rconn->last_connected);
668 }
669
670 /* Returns 0 if 'rconn' is currently connected and considered to have been
671  * accepted by the peer's admission-control policy, otherwise the number of
672  * seconds since 'rconn' was last in such a state. */
673 int
674 rconn_failure_duration(const struct rconn *rconn)
675 {
676     return rconn_is_admitted(rconn) ? 0 : time_now() - rconn->last_admitted;
677 }
678
679 /* Returns the IP address of the peer, or 0 if the peer's IP address is not
680  * known. */
681 uint32_t
682 rconn_get_remote_ip(const struct rconn *rconn) 
683 {
684     return rconn->remote_ip;
685 }
686
687 /* Returns the transport port of the peer, or 0 if the peer's port is not
688  * known. */
689 uint16_t
690 rconn_get_remote_port(const struct rconn *rconn) 
691 {
692     return rconn->remote_port;
693 }
694
695 /* Returns the IP address used to connect to the peer, or 0 if the
696  * connection is not an IP-based protocol or if its IP address is not 
697  * known. */
698 uint32_t
699 rconn_get_local_ip(const struct rconn *rconn) 
700 {
701     return rconn->local_ip;
702 }
703
704 /* Returns the transport port used to connect to the peer, or 0 if the
705  * connection does not contain a port or if the port is not known. */
706 uint16_t
707 rconn_get_local_port(const struct rconn *rconn) 
708 {
709     return rconn->vconn ? vconn_get_local_port(rconn->vconn) : 0;
710 }
711
712 /* If 'rconn' can't connect to the peer, it could be for any number of reasons.
713  * Usually, one would assume it is because the peer is not running or because
714  * the network is partitioned.  But it could also be because the network
715  * topology has changed, in which case the upper layer will need to reassess it
716  * (in particular, obtain a new IP address via DHCP and find the new location
717  * of the controller).  When this appears that this might be the case, this
718  * function returns true.  It also clears the questionability flag and prevents
719  * it from being set again for some time. */
720 bool
721 rconn_is_connectivity_questionable(struct rconn *rconn)
722 {
723     bool questionable = rconn->questionable_connectivity;
724     rconn->questionable_connectivity = false;
725     return questionable;
726 }
727
728 /* Returns the total number of packets successfully received by the underlying
729  * vconn.  */
730 unsigned int
731 rconn_packets_received(const struct rconn *rc)
732 {
733     return rc->packets_received;
734 }
735
736 /* Returns a string representing the internal state of 'rc'.  The caller must
737  * not modify or free the string. */
738 const char *
739 rconn_get_state(const struct rconn *rc)
740 {
741     return state_name(rc->state);
742 }
743
744 /* Returns the number of connection attempts made by 'rc', including any
745  * ongoing attempt that has not yet succeeded or failed. */
746 unsigned int
747 rconn_get_attempted_connections(const struct rconn *rc)
748 {
749     return rc->n_attempted_connections;
750 }
751
752 /* Returns the number of successful connection attempts made by 'rc'. */
753 unsigned int
754 rconn_get_successful_connections(const struct rconn *rc)
755 {
756     return rc->n_successful_connections;
757 }
758
759 /* Returns the time at which the last successful connection was made by
760  * 'rc'. */
761 time_t
762 rconn_get_last_connection(const struct rconn *rc)
763 {
764     return rc->last_connected;
765 }
766
767 /* Returns the time at which the last OpenFlow message was received by 'rc'.
768  * If no packets have been received on 'rc', returns the time at which 'rc'
769  * was created. */
770 time_t
771 rconn_get_last_received(const struct rconn *rc)
772 {
773     return rc->last_received;
774 }
775
776 /* Returns the time at which 'rc' was created. */
777 time_t
778 rconn_get_creation_time(const struct rconn *rc)
779 {
780     return rc->creation_time;
781 }
782
783 /* Returns the approximate number of seconds that 'rc' has been connected. */
784 unsigned long int
785 rconn_get_total_time_connected(const struct rconn *rc)
786 {
787     return (rc->total_time_connected
788             + (rconn_is_connected(rc) ? elapsed_in_this_state(rc) : 0));
789 }
790
791 /* Returns the current amount of backoff, in seconds.  This is the amount of
792  * time after which the rconn will transition from BACKOFF to CONNECTING. */
793 int
794 rconn_get_backoff(const struct rconn *rc)
795 {
796     return rc->backoff;
797 }
798
799 /* Returns the number of seconds spent in this state so far. */
800 unsigned int
801 rconn_get_state_elapsed(const struct rconn *rc)
802 {
803     return elapsed_in_this_state(rc);
804 }
805
806 /* Returns 'rc''s current connection sequence number, a number that changes
807  * every time that 'rconn' connects or disconnects. */
808 unsigned int
809 rconn_get_connection_seqno(const struct rconn *rc)
810 {
811     return rc->seqno;
812 }
813
814 /* Returns a value that explains why 'rc' last disconnected:
815  *
816  *   - 0 means that the last disconnection was caused by a call to
817  *     rconn_disconnect(), or that 'rc' is new and has not yet completed its
818  *     initial connection or connection attempt.
819  *
820  *   - EOF means that the connection was closed in the normal way by the peer.
821  *
822  *   - A positive integer is an errno value that represents the error.
823  */
824 int
825 rconn_get_last_error(const struct rconn *rc)
826 {
827     return rc->last_error;
828 }
829 \f
830 struct rconn_packet_counter *
831 rconn_packet_counter_create(void)
832 {
833     struct rconn_packet_counter *c = xmalloc(sizeof *c);
834     c->n = 0;
835     c->ref_cnt = 1;
836     return c;
837 }
838
839 void
840 rconn_packet_counter_destroy(struct rconn_packet_counter *c)
841 {
842     if (c) {
843         assert(c->ref_cnt > 0);
844         if (!--c->ref_cnt && !c->n) {
845             free(c);
846         }
847     }
848 }
849
850 void
851 rconn_packet_counter_inc(struct rconn_packet_counter *c)
852 {
853     c->n++;
854 }
855
856 void
857 rconn_packet_counter_dec(struct rconn_packet_counter *c)
858 {
859     assert(c->n > 0);
860     if (!--c->n && !c->ref_cnt) {
861         free(c);
862     }
863 }
864 \f
865 /* Set the name of the remote vconn to 'name' and clear out the cached IP
866  * address and port information, since changing the name also likely changes
867  * these values. */
868 static void
869 set_vconn_name(struct rconn *rc, const char *name)
870 {
871     free(rc->name);
872     rc->name = xstrdup(name);
873     rc->local_ip = 0;
874     rc->remote_ip = 0;
875     rc->remote_port = 0;
876 }
877
878 /* Tries to send a packet from 'rc''s send buffer.  Returns 0 if successful,
879  * otherwise a positive errno value. */
880 static int
881 try_send(struct rconn *rc)
882 {
883     int retval = 0;
884     struct ofpbuf *next = rc->txq.head->next;
885     struct rconn_packet_counter *counter = rc->txq.head->private_p;
886     retval = vconn_send(rc->vconn, rc->txq.head);
887     if (retval) {
888         if (retval != EAGAIN) {
889             report_error(rc, retval);
890             disconnect(rc, retval);
891         }
892         return retval;
893     }
894     COVERAGE_INC(rconn_sent);
895     rc->packets_sent++;
896     if (counter) {
897         rconn_packet_counter_dec(counter);
898     }
899     queue_advance_head(&rc->txq, next);
900     return 0;
901 }
902
903 /* Reports that 'error' caused 'rc' to disconnect.  'error' may be a positive
904  * errno value, or it may be EOF to indicate that the connection was closed
905  * normally. */
906 static void
907 report_error(struct rconn *rc, int error)
908 {
909     if (error == EOF) {
910         /* If 'rc' isn't reliable, then we don't really expect this connection
911          * to last forever anyway (probably it's a connection that we received
912          * via accept()), so use DBG level to avoid cluttering the logs. */
913         enum vlog_level level = rc->reliable ? VLL_INFO : VLL_DBG;
914         VLOG(level, "%s: connection closed by peer", rc->name);
915     } else {
916         VLOG_WARN("%s: connection dropped (%s)", rc->name, strerror(error));
917     }
918 }
919
920 /* Disconnects 'rc' and records 'error' as the error that caused 'rc''s last
921  * disconnection:
922  *
923  *   - 0 means that this disconnection is due to a request by 'rc''s client,
924  *     not due to any kind of network error.
925  *
926  *   - EOF means that the connection was closed in the normal way by the peer.
927  *
928  *   - A positive integer is an errno value that represents the error.
929  */
930 static void
931 disconnect(struct rconn *rc, int error)
932 {
933     rc->last_error = error;
934     if (rc->reliable) {
935         time_t now = time_now();
936
937         if (rc->state & (S_CONNECTING | S_ACTIVE | S_IDLE)) {
938             vconn_close(rc->vconn);
939             rc->vconn = NULL;
940             flush_queue(rc);
941         }
942
943         if (now >= rc->backoff_deadline) {
944             rc->backoff = 1;
945         } else {
946             rc->backoff = MIN(rc->max_backoff, MAX(1, 2 * rc->backoff));
947             VLOG_INFO("%s: waiting %d seconds before reconnect\n",
948                       rc->name, rc->backoff);
949         }
950         rc->backoff_deadline = now + rc->backoff;
951         state_transition(rc, S_BACKOFF);
952         if (now - rc->last_connected > 60) {
953             question_connectivity(rc);
954         }
955     } else {
956         rconn_disconnect(rc);
957     }
958 }
959
960 /* Drops all the packets from 'rc''s send queue and decrements their queue
961  * counts. */
962 static void
963 flush_queue(struct rconn *rc)
964 {
965     if (!rc->txq.n) {
966         return;
967     }
968     while (rc->txq.n > 0) {
969         struct ofpbuf *b = queue_pop_head(&rc->txq);
970         struct rconn_packet_counter *counter = b->private_p;
971         if (counter) {
972             rconn_packet_counter_dec(counter);
973         }
974         COVERAGE_INC(rconn_discarded);
975         ofpbuf_delete(b);
976     }
977     poll_immediate_wake();
978 }
979
980 static unsigned int
981 elapsed_in_this_state(const struct rconn *rc)
982 {
983     return time_now() - rc->state_entered;
984 }
985
986 static unsigned int
987 timeout(const struct rconn *rc)
988 {
989     switch (rc->state) {
990 #define STATE(NAME, VALUE) case S_##NAME: return timeout_##NAME(rc);
991         STATES
992 #undef STATE
993     default:
994         NOT_REACHED();
995     }
996 }
997
998 static bool
999 timed_out(const struct rconn *rc)
1000 {
1001     return time_now() >= sat_add(rc->state_entered, timeout(rc));
1002 }
1003
1004 static void
1005 state_transition(struct rconn *rc, enum state state)
1006 {
1007     rc->seqno += (rc->state == S_ACTIVE) != (state == S_ACTIVE);
1008     if (is_connected_state(state) && !is_connected_state(rc->state)) {
1009         rc->probably_admitted = false;
1010     }
1011     if (rconn_is_connected(rc)) {
1012         rc->total_time_connected += elapsed_in_this_state(rc);
1013     }
1014     VLOG_DBG("%s: entering %s", rc->name, state_name(state));
1015     rc->state = state;
1016     rc->state_entered = time_now();
1017 }
1018
1019 static void
1020 question_connectivity(struct rconn *rc) 
1021 {
1022     time_t now = time_now();
1023     if (now - rc->last_questioned > 60) {
1024         rc->questionable_connectivity = true;
1025         rc->last_questioned = now;
1026     }
1027 }
1028
1029 static void
1030 copy_to_monitor(struct rconn *rc, const struct ofpbuf *b)
1031 {
1032     struct ofpbuf *clone = NULL;
1033     int retval;
1034     size_t i;
1035
1036     for (i = 0; i < rc->n_monitors; ) {
1037         struct vconn *vconn = rc->monitors[i];
1038
1039         if (!clone) {
1040             clone = ofpbuf_clone(b);
1041         }
1042         retval = vconn_send(vconn, clone);
1043         if (!retval) {
1044             clone = NULL;
1045         } else if (retval != EAGAIN) {
1046             VLOG_DBG("%s: closing monitor connection to %s: %s",
1047                      rconn_get_name(rc), vconn_get_name(vconn),
1048                      strerror(retval));
1049             rc->monitors[i] = rc->monitors[--rc->n_monitors];
1050             continue;
1051         }
1052         i++;
1053     }
1054     ofpbuf_delete(clone);
1055 }
1056
1057 static bool
1058 is_connected_state(enum state state) 
1059 {
1060     return (state & (S_ACTIVE | S_IDLE)) != 0;
1061 }
1062
1063 static bool
1064 is_admitted_msg(const struct ofpbuf *b)
1065 {
1066     struct ofp_header *oh = b->data;
1067     uint8_t type = oh->type;
1068     return !(type < 32
1069              && (1u << type) & ((1u << OFPT_HELLO) |
1070                                 (1u << OFPT_ERROR) |
1071                                 (1u << OFPT_ECHO_REQUEST) |
1072                                 (1u << OFPT_ECHO_REPLY) |
1073                                 (1u << OFPT_VENDOR) |
1074                                 (1u << OFPT_FEATURES_REQUEST) |
1075                                 (1u << OFPT_FEATURES_REPLY) |
1076                                 (1u << OFPT_GET_CONFIG_REQUEST) |
1077                                 (1u << OFPT_GET_CONFIG_REPLY) |
1078                                 (1u << OFPT_SET_CONFIG)));
1079 }