connmgr: Remove unused function ofconn_n_pending_opgroups().
[sliver-openvswitch.git] / ofproto / connmgr.c
1 /*
2  * Copyright (c) 2009, 2010, 2011 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
19 #include "connmgr.h"
20
21 #include <errno.h>
22 #include <stdlib.h>
23
24 #include "coverage.h"
25 #include "fail-open.h"
26 #include "in-band.h"
27 #include "odp-util.h"
28 #include "ofp-util.h"
29 #include "ofpbuf.h"
30 #include "ofproto-provider.h"
31 #include "pinsched.h"
32 #include "poll-loop.h"
33 #include "pktbuf.h"
34 #include "rconn.h"
35 #include "shash.h"
36 #include "timeval.h"
37 #include "vconn.h"
38 #include "vlog.h"
39
40 VLOG_DEFINE_THIS_MODULE(connmgr);
41 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
42
43 /* An OpenFlow connection. */
44 struct ofconn {
45     struct connmgr *connmgr;    /* Connection's manager. */
46     struct list node;           /* In struct connmgr's "all_conns" list. */
47     struct rconn *rconn;        /* OpenFlow connection. */
48     enum ofconn_type type;      /* Type. */
49     enum nx_flow_format flow_format; /* Currently selected flow format. */
50     bool flow_mod_table_id;     /* NXT_FLOW_MOD_TABLE_ID enabled? */
51
52     /* Asynchronous flow table operation support. */
53     struct list opgroups;       /* Contains pending "ofopgroups", if any. */
54     struct ofpbuf *blocked;     /* Postponed OpenFlow message, if any. */
55     bool retry;                 /* True if 'blocked' is ready to try again. */
56
57     /* OFPT_PACKET_IN related data. */
58     struct rconn_packet_counter *packet_in_counter; /* # queued on 'rconn'. */
59 #define N_SCHEDULERS 2
60     struct pinsched *schedulers[N_SCHEDULERS];
61     struct pktbuf *pktbuf;         /* OpenFlow packet buffers. */
62     int miss_send_len;             /* Bytes to send of buffered packets. */
63
64     /* Number of OpenFlow messages queued on 'rconn' as replies to OpenFlow
65      * requests, and the maximum number before we stop reading OpenFlow
66      * requests.  */
67 #define OFCONN_REPLY_MAX 100
68     struct rconn_packet_counter *reply_counter;
69
70     /* type == OFCONN_PRIMARY only. */
71     enum nx_role role;           /* Role. */
72     struct hmap_node hmap_node;  /* In struct connmgr's "controllers" map. */
73     enum ofproto_band band;      /* In-band or out-of-band? */
74 };
75
76 static struct ofconn *ofconn_create(struct connmgr *, struct rconn *,
77                                     enum ofconn_type);
78 static void ofconn_destroy(struct ofconn *);
79
80 static void ofconn_reconfigure(struct ofconn *,
81                                const struct ofproto_controller *);
82
83 static void ofconn_run(struct ofconn *,
84                        bool (*handle_openflow)(struct ofconn *,
85                                                struct ofpbuf *ofp_msg));
86 static void ofconn_wait(struct ofconn *, bool handling_openflow);
87
88 static const char *ofconn_get_target(const struct ofconn *);
89 static char *ofconn_make_name(const struct connmgr *, const char *target);
90
91 static void ofconn_set_rate_limit(struct ofconn *, int rate, int burst);
92
93 static bool ofconn_receives_async_msgs(const struct ofconn *);
94
95 static void ofconn_send(const struct ofconn *, struct ofpbuf *,
96                         struct rconn_packet_counter *);
97
98 static void do_send_packet_in(struct ofpbuf *, void *ofconn_);
99
100 /* A listener for incoming OpenFlow "service" connections. */
101 struct ofservice {
102     struct hmap_node node;      /* In struct connmgr's "services" hmap. */
103     struct pvconn *pvconn;      /* OpenFlow connection listener. */
104
105     /* These are not used by ofservice directly.  They are settings for
106      * accepted "struct ofconn"s from the pvconn. */
107     int probe_interval;         /* Max idle time before probing, in seconds. */
108     int rate_limit;             /* Max packet-in rate in packets per second. */
109     int burst_limit;            /* Limit on accumulating packet credits. */
110 };
111
112 static void ofservice_reconfigure(struct ofservice *,
113                                   const struct ofproto_controller *);
114 static int ofservice_create(struct connmgr *, const char *target);
115 static void ofservice_destroy(struct connmgr *, struct ofservice *);
116 static struct ofservice *ofservice_lookup(struct connmgr *,
117                                           const char *target);
118
119 /* Connection manager for an OpenFlow switch. */
120 struct connmgr {
121     struct ofproto *ofproto;
122     char *name;
123     char *local_port_name;
124
125     /* OpenFlow connections. */
126     struct hmap controllers;   /* Controller "struct ofconn"s. */
127     struct list all_conns;     /* Contains "struct ofconn"s. */
128
129     /* OpenFlow listeners. */
130     struct hmap services;       /* Contains "struct ofservice"s. */
131     struct pvconn **snoops;
132     size_t n_snoops;
133
134     /* Fail open. */
135     struct fail_open *fail_open;
136     enum ofproto_fail_mode fail_mode;
137
138     /* In-band control. */
139     struct in_band *in_band;
140     struct sockaddr_in *extra_in_band_remotes;
141     size_t n_extra_remotes;
142     int in_band_queue;
143 };
144
145 static void update_in_band_remotes(struct connmgr *);
146 static void add_snooper(struct connmgr *, struct vconn *);
147
148 /* Creates and returns a new connection manager owned by 'ofproto'.  'name' is
149  * a name for the ofproto suitable for using in log messages.
150  * 'local_port_name' is the name of the local port (OFPP_LOCAL) within
151  * 'ofproto'. */
152 struct connmgr *
153 connmgr_create(struct ofproto *ofproto,
154                const char *name, const char *local_port_name)
155 {
156     struct connmgr *mgr;
157
158     mgr = xmalloc(sizeof *mgr);
159     mgr->ofproto = ofproto;
160     mgr->name = xstrdup(name);
161     mgr->local_port_name = xstrdup(local_port_name);
162
163     hmap_init(&mgr->controllers);
164     list_init(&mgr->all_conns);
165
166     hmap_init(&mgr->services);
167     mgr->snoops = NULL;
168     mgr->n_snoops = 0;
169
170     mgr->fail_open = NULL;
171     mgr->fail_mode = OFPROTO_FAIL_SECURE;
172
173     mgr->in_band = NULL;
174     mgr->extra_in_band_remotes = NULL;
175     mgr->n_extra_remotes = 0;
176     mgr->in_band_queue = -1;
177
178     return mgr;
179 }
180
181 /* Frees 'mgr' and all of its resources. */
182 void
183 connmgr_destroy(struct connmgr *mgr)
184 {
185     struct ofservice *ofservice, *next_ofservice;
186     struct ofconn *ofconn, *next_ofconn;
187     size_t i;
188
189     if (!mgr) {
190         return;
191     }
192
193     LIST_FOR_EACH_SAFE (ofconn, next_ofconn, node, &mgr->all_conns) {
194         ofconn_destroy(ofconn);
195     }
196     hmap_destroy(&mgr->controllers);
197
198     HMAP_FOR_EACH_SAFE (ofservice, next_ofservice, node, &mgr->services) {
199         ofservice_destroy(mgr, ofservice);
200     }
201     hmap_destroy(&mgr->services);
202
203     for (i = 0; i < mgr->n_snoops; i++) {
204         pvconn_close(mgr->snoops[i]);
205     }
206     free(mgr->snoops);
207
208     fail_open_destroy(mgr->fail_open);
209     mgr->fail_open = NULL;
210
211     in_band_destroy(mgr->in_band);
212     mgr->in_band = NULL;
213     free(mgr->extra_in_band_remotes);
214     free(mgr->name);
215     free(mgr->local_port_name);
216
217     free(mgr);
218 }
219
220 /* Does all of the periodic maintenance required by 'mgr'.
221  *
222  * If 'handle_openflow' is nonnull, calls 'handle_openflow' for each message
223  * received on an OpenFlow connection, passing along the OpenFlow connection
224  * itself and the message that was sent.  If 'handle_openflow' returns true,
225  * the message is considered to be fully processed.  If 'handle_openflow'
226  * returns false, the message is considered not to have been processed at all;
227  * it will be stored and re-presented to 'handle_openflow' following the next
228  * call to connmgr_retry().  'handle_openflow' must not modify or free the
229  * message.
230  *
231  * If 'handle_openflow' is NULL, no OpenFlow messages will be processed and
232  * other activities that could affect the flow table (in-band processing,
233  * fail-open processing) are suppressed too. */
234 void
235 connmgr_run(struct connmgr *mgr,
236             bool (*handle_openflow)(struct ofconn *, struct ofpbuf *ofp_msg))
237 {
238     struct ofconn *ofconn, *next_ofconn;
239     struct ofservice *ofservice;
240     size_t i;
241
242     if (handle_openflow && mgr->in_band) {
243         if (!in_band_run(mgr->in_band)) {
244             in_band_destroy(mgr->in_band);
245             mgr->in_band = NULL;
246         }
247     }
248
249     LIST_FOR_EACH_SAFE (ofconn, next_ofconn, node, &mgr->all_conns) {
250         ofconn_run(ofconn, handle_openflow);
251     }
252
253     /* Fail-open maintenance.  Do this after processing the ofconns since
254      * fail-open checks the status of the controller rconn. */
255     if (handle_openflow && mgr->fail_open) {
256         fail_open_run(mgr->fail_open);
257     }
258
259     HMAP_FOR_EACH (ofservice, node, &mgr->services) {
260         struct vconn *vconn;
261         int retval;
262
263         retval = pvconn_accept(ofservice->pvconn, OFP_VERSION, &vconn);
264         if (!retval) {
265             struct rconn *rconn;
266             char *name;
267
268             rconn = rconn_create(ofservice->probe_interval, 0);
269             name = ofconn_make_name(mgr, vconn_get_name(vconn));
270             rconn_connect_unreliably(rconn, vconn, name);
271             free(name);
272
273             ofconn = ofconn_create(mgr, rconn, OFCONN_SERVICE);
274             ofconn_set_rate_limit(ofconn, ofservice->rate_limit,
275                                   ofservice->burst_limit);
276         } else if (retval != EAGAIN) {
277             VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
278         }
279     }
280
281     for (i = 0; i < mgr->n_snoops; i++) {
282         struct vconn *vconn;
283         int retval;
284
285         retval = pvconn_accept(mgr->snoops[i], OFP_VERSION, &vconn);
286         if (!retval) {
287             add_snooper(mgr, vconn);
288         } else if (retval != EAGAIN) {
289             VLOG_WARN_RL(&rl, "accept failed (%s)", strerror(retval));
290         }
291     }
292 }
293
294 /* Causes the poll loop to wake up when connmgr_run() needs to run.
295  *
296  * If 'handling_openflow' is true, arriving OpenFlow messages and other
297  * activities that affect the flow table will wake up the poll loop.  If
298  * 'handling_openflow' is false, they will not. */
299 void
300 connmgr_wait(struct connmgr *mgr, bool handling_openflow)
301 {
302     struct ofservice *ofservice;
303     struct ofconn *ofconn;
304     size_t i;
305
306     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
307         ofconn_wait(ofconn, handling_openflow);
308     }
309     if (handling_openflow && mgr->in_band) {
310         in_band_wait(mgr->in_band);
311     }
312     if (handling_openflow && mgr->fail_open) {
313         fail_open_wait(mgr->fail_open);
314     }
315     HMAP_FOR_EACH (ofservice, node, &mgr->services) {
316         pvconn_wait(ofservice->pvconn);
317     }
318     for (i = 0; i < mgr->n_snoops; i++) {
319         pvconn_wait(mgr->snoops[i]);
320     }
321 }
322
323 /* Returns the ofproto that owns 'ofconn''s connmgr. */
324 struct ofproto *
325 ofconn_get_ofproto(const struct ofconn *ofconn)
326 {
327     return ofconn->connmgr->ofproto;
328 }
329
330 /* If processing of OpenFlow messages was blocked on any 'mgr' ofconns by
331  * returning false to the 'handle_openflow' callback to connmgr_run(), this
332  * re-enables them. */
333 void
334 connmgr_retry(struct connmgr *mgr)
335 {
336     struct ofconn *ofconn;
337
338     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
339         ofconn->retry = true;
340     }
341 }
342 \f
343 /* OpenFlow configuration. */
344
345 static void add_controller(struct connmgr *, const char *target);
346 static struct ofconn *find_controller_by_target(struct connmgr *,
347                                                 const char *target);
348 static void update_fail_open(struct connmgr *);
349 static int set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
350                        const struct sset *);
351
352 /* Returns true if 'mgr' has any configured primary controllers.
353  *
354  * Service controllers do not count, but configured primary controllers do
355  * count whether or not they are currently connected. */
356 bool
357 connmgr_has_controllers(const struct connmgr *mgr)
358 {
359     return !hmap_is_empty(&mgr->controllers);
360 }
361
362 /* Initializes 'info' and populates it with information about each configured
363  * primary controller.  The keys in 'info' are the controllers' targets; the
364  * data values are corresponding "struct ofproto_controller_info".
365  *
366  * The caller owns 'info' and everything in it and should free it when it is no
367  * longer needed. */
368 void
369 connmgr_get_controller_info(struct connmgr *mgr, struct shash *info)
370 {
371     const struct ofconn *ofconn;
372
373     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
374         const struct rconn *rconn = ofconn->rconn;
375         const char *target = rconn_get_target(rconn);
376
377         if (!shash_find(info, target)) {
378             struct ofproto_controller_info *cinfo = xmalloc(sizeof *cinfo);
379             time_t now = time_now();
380             time_t last_connection = rconn_get_last_connection(rconn);
381             time_t last_disconnect = rconn_get_last_disconnect(rconn);
382             int last_error = rconn_get_last_error(rconn);
383
384             shash_add(info, target, cinfo);
385
386             cinfo->is_connected = rconn_is_connected(rconn);
387             cinfo->role = ofconn->role;
388
389             cinfo->pairs.n = 0;
390
391             if (last_error) {
392                 cinfo->pairs.keys[cinfo->pairs.n] = "last_error";
393                 cinfo->pairs.values[cinfo->pairs.n++]
394                     = xstrdup(ovs_retval_to_string(last_error));
395             }
396
397             cinfo->pairs.keys[cinfo->pairs.n] = "state";
398             cinfo->pairs.values[cinfo->pairs.n++]
399                 = xstrdup(rconn_get_state(rconn));
400
401             if (last_connection != TIME_MIN) {
402                 cinfo->pairs.keys[cinfo->pairs.n] = "sec_since_connect";
403                 cinfo->pairs.values[cinfo->pairs.n++]
404                     = xasprintf("%ld", (long int) (now - last_connection));
405             }
406
407             if (last_disconnect != TIME_MIN) {
408                 cinfo->pairs.keys[cinfo->pairs.n] = "sec_since_disconnect";
409                 cinfo->pairs.values[cinfo->pairs.n++]
410                     = xasprintf("%ld", (long int) (now - last_disconnect));
411             }
412         }
413     }
414 }
415
416 void
417 connmgr_free_controller_info(struct shash *info)
418 {
419     struct shash_node *node;
420
421     SHASH_FOR_EACH (node, info) {
422         struct ofproto_controller_info *cinfo = node->data;
423         while (cinfo->pairs.n) {
424             free((char *) cinfo->pairs.values[--cinfo->pairs.n]);
425         }
426         free(cinfo);
427     }
428     shash_destroy(info);
429 }
430
431 /* Changes 'mgr''s set of controllers to the 'n_controllers' controllers in
432  * 'controllers'. */
433 void
434 connmgr_set_controllers(struct connmgr *mgr,
435                         const struct ofproto_controller *controllers,
436                         size_t n_controllers)
437 {
438     bool had_controllers = connmgr_has_controllers(mgr);
439     struct shash new_controllers;
440     struct ofconn *ofconn, *next_ofconn;
441     struct ofservice *ofservice, *next_ofservice;
442     size_t i;
443
444     /* Create newly configured controllers and services.
445      * Create a name to ofproto_controller mapping in 'new_controllers'. */
446     shash_init(&new_controllers);
447     for (i = 0; i < n_controllers; i++) {
448         const struct ofproto_controller *c = &controllers[i];
449
450         if (!vconn_verify_name(c->target)) {
451             if (!find_controller_by_target(mgr, c->target)) {
452                 add_controller(mgr, c->target);
453             }
454         } else if (!pvconn_verify_name(c->target)) {
455             if (!ofservice_lookup(mgr, c->target)) {
456                 ofservice_create(mgr, c->target);
457             }
458         } else {
459             VLOG_WARN_RL(&rl, "%s: unsupported controller \"%s\"",
460                          mgr->name, c->target);
461             continue;
462         }
463
464         shash_add_once(&new_controllers, c->target, &controllers[i]);
465     }
466
467     /* Delete controllers that are no longer configured.
468      * Update configuration of all now-existing controllers. */
469     HMAP_FOR_EACH_SAFE (ofconn, next_ofconn, hmap_node, &mgr->controllers) {
470         struct ofproto_controller *c;
471
472         c = shash_find_data(&new_controllers, ofconn_get_target(ofconn));
473         if (!c) {
474             ofconn_destroy(ofconn);
475         } else {
476             ofconn_reconfigure(ofconn, c);
477         }
478     }
479
480     /* Delete services that are no longer configured.
481      * Update configuration of all now-existing services. */
482     HMAP_FOR_EACH_SAFE (ofservice, next_ofservice, node, &mgr->services) {
483         struct ofproto_controller *c;
484
485         c = shash_find_data(&new_controllers,
486                             pvconn_get_name(ofservice->pvconn));
487         if (!c) {
488             ofservice_destroy(mgr, ofservice);
489         } else {
490             ofservice_reconfigure(ofservice, c);
491         }
492     }
493
494     shash_destroy(&new_controllers);
495
496     update_in_band_remotes(mgr);
497     update_fail_open(mgr);
498     if (had_controllers != connmgr_has_controllers(mgr)) {
499         ofproto_flush_flows(mgr->ofproto);
500     }
501 }
502
503 /* Drops the connections between 'mgr' and all of its primary and secondary
504  * controllers, forcing them to reconnect. */
505 void
506 connmgr_reconnect(const struct connmgr *mgr)
507 {
508     struct ofconn *ofconn;
509
510     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
511         rconn_reconnect(ofconn->rconn);
512     }
513 }
514
515 /* Sets the "snoops" for 'mgr' to the pvconn targets listed in 'snoops'.
516  *
517  * A "snoop" is a pvconn to which every OpenFlow message to or from the most
518  * important controller on 'mgr' is mirrored. */
519 int
520 connmgr_set_snoops(struct connmgr *mgr, const struct sset *snoops)
521 {
522     return set_pvconns(&mgr->snoops, &mgr->n_snoops, snoops);
523 }
524
525 /* Adds each of the snoops currently configured on 'mgr' to 'snoops'. */
526 void
527 connmgr_get_snoops(const struct connmgr *mgr, struct sset *snoops)
528 {
529     size_t i;
530
531     for (i = 0; i < mgr->n_snoops; i++) {
532         sset_add(snoops, pvconn_get_name(mgr->snoops[i]));
533     }
534 }
535
536 /* Returns true if 'mgr' has at least one snoop, false if it has none. */
537 bool
538 connmgr_has_snoops(const struct connmgr *mgr)
539 {
540     return mgr->n_snoops > 0;
541 }
542
543 /* Creates a new controller for 'target' in 'mgr'.  update_controller() needs
544  * to be called later to finish the new ofconn's configuration. */
545 static void
546 add_controller(struct connmgr *mgr, const char *target)
547 {
548     char *name = ofconn_make_name(mgr, target);
549     struct ofconn *ofconn;
550
551     ofconn = ofconn_create(mgr, rconn_create(5, 8), OFCONN_PRIMARY);
552     ofconn->pktbuf = pktbuf_create();
553     ofconn->miss_send_len = OFP_DEFAULT_MISS_SEND_LEN;
554     rconn_connect(ofconn->rconn, target, name);
555     hmap_insert(&mgr->controllers, &ofconn->hmap_node, hash_string(target, 0));
556
557     free(name);
558 }
559
560 static struct ofconn *
561 find_controller_by_target(struct connmgr *mgr, const char *target)
562 {
563     struct ofconn *ofconn;
564
565     HMAP_FOR_EACH_WITH_HASH (ofconn, hmap_node,
566                              hash_string(target, 0), &mgr->controllers) {
567         if (!strcmp(ofconn_get_target(ofconn), target)) {
568             return ofconn;
569         }
570     }
571     return NULL;
572 }
573
574 static void
575 update_in_band_remotes(struct connmgr *mgr)
576 {
577     struct sockaddr_in *addrs;
578     size_t max_addrs, n_addrs;
579     struct ofconn *ofconn;
580     size_t i;
581
582     /* Allocate enough memory for as many remotes as we could possibly have. */
583     max_addrs = mgr->n_extra_remotes + hmap_count(&mgr->controllers);
584     addrs = xmalloc(max_addrs * sizeof *addrs);
585     n_addrs = 0;
586
587     /* Add all the remotes. */
588     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
589         struct sockaddr_in *sin = &addrs[n_addrs];
590
591         if (ofconn->band == OFPROTO_OUT_OF_BAND) {
592             continue;
593         }
594
595         sin->sin_addr.s_addr = rconn_get_remote_ip(ofconn->rconn);
596         if (sin->sin_addr.s_addr) {
597             sin->sin_port = rconn_get_remote_port(ofconn->rconn);
598             n_addrs++;
599         }
600     }
601     for (i = 0; i < mgr->n_extra_remotes; i++) {
602         addrs[n_addrs++] = mgr->extra_in_band_remotes[i];
603     }
604
605     /* Create or update or destroy in-band. */
606     if (n_addrs) {
607         if (!mgr->in_band) {
608             in_band_create(mgr->ofproto, mgr->local_port_name, &mgr->in_band);
609         }
610         in_band_set_queue(mgr->in_band, mgr->in_band_queue);
611     } else {
612         /* in_band_run() needs a chance to delete any existing in-band flows.
613          * We will destroy mgr->in_band after it's done with that. */
614     }
615     if (mgr->in_band) {
616         in_band_set_remotes(mgr->in_band, addrs, n_addrs);
617     }
618
619     /* Clean up. */
620     free(addrs);
621 }
622
623 static void
624 update_fail_open(struct connmgr *mgr)
625 {
626     if (connmgr_has_controllers(mgr)
627         && mgr->fail_mode == OFPROTO_FAIL_STANDALONE) {
628         if (!mgr->fail_open) {
629             mgr->fail_open = fail_open_create(mgr->ofproto, mgr);
630         }
631     } else {
632         fail_open_destroy(mgr->fail_open);
633         mgr->fail_open = NULL;
634     }
635 }
636
637 static int
638 set_pvconns(struct pvconn ***pvconnsp, size_t *n_pvconnsp,
639             const struct sset *sset)
640 {
641     struct pvconn **pvconns = *pvconnsp;
642     size_t n_pvconns = *n_pvconnsp;
643     const char *name;
644     int retval = 0;
645     size_t i;
646
647     for (i = 0; i < n_pvconns; i++) {
648         pvconn_close(pvconns[i]);
649     }
650     free(pvconns);
651
652     pvconns = xmalloc(sset_count(sset) * sizeof *pvconns);
653     n_pvconns = 0;
654     SSET_FOR_EACH (name, sset) {
655         struct pvconn *pvconn;
656         int error;
657
658         error = pvconn_open(name, &pvconn);
659         if (!error) {
660             pvconns[n_pvconns++] = pvconn;
661         } else {
662             VLOG_ERR("failed to listen on %s: %s", name, strerror(error));
663             if (!retval) {
664                 retval = error;
665             }
666         }
667     }
668
669     *pvconnsp = pvconns;
670     *n_pvconnsp = n_pvconns;
671
672     return retval;
673 }
674
675 /* Returns a "preference level" for snooping 'ofconn'.  A higher return value
676  * means that 'ofconn' is more interesting for monitoring than a lower return
677  * value. */
678 static int
679 snoop_preference(const struct ofconn *ofconn)
680 {
681     switch (ofconn->role) {
682     case NX_ROLE_MASTER:
683         return 3;
684     case NX_ROLE_OTHER:
685         return 2;
686     case NX_ROLE_SLAVE:
687         return 1;
688     default:
689         /* Shouldn't happen. */
690         return 0;
691     }
692 }
693
694 /* One of 'mgr''s "snoop" pvconns has accepted a new connection on 'vconn'.
695  * Connects this vconn to a controller. */
696 static void
697 add_snooper(struct connmgr *mgr, struct vconn *vconn)
698 {
699     struct ofconn *ofconn, *best;
700
701     /* Pick a controller for monitoring. */
702     best = NULL;
703     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
704         if (ofconn->type == OFCONN_PRIMARY
705             && (!best || snoop_preference(ofconn) > snoop_preference(best))) {
706             best = ofconn;
707         }
708     }
709
710     if (best) {
711         rconn_add_monitor(best->rconn, vconn);
712     } else {
713         VLOG_INFO_RL(&rl, "no controller connection to snoop");
714         vconn_close(vconn);
715     }
716 }
717 \f
718 /* Public ofconn functions. */
719
720 /* Returns the connection type, either OFCONN_PRIMARY or OFCONN_SERVICE. */
721 enum ofconn_type
722 ofconn_get_type(const struct ofconn *ofconn)
723 {
724     return ofconn->type;
725 }
726
727 /* Returns the role configured for 'ofconn'.
728  *
729  * The default role, if no other role has been set, is NX_ROLE_OTHER. */
730 enum nx_role
731 ofconn_get_role(const struct ofconn *ofconn)
732 {
733     return ofconn->role;
734 }
735
736 /* Changes 'ofconn''s role to 'role'.  If 'role' is NX_ROLE_MASTER then any
737  * existing master is demoted to a slave. */
738 void
739 ofconn_set_role(struct ofconn *ofconn, enum nx_role role)
740 {
741     if (role == NX_ROLE_MASTER) {
742         struct ofconn *other;
743
744         HMAP_FOR_EACH (other, hmap_node, &ofconn->connmgr->controllers) {
745             if (other->role == NX_ROLE_MASTER) {
746                 other->role = NX_ROLE_SLAVE;
747             }
748         }
749     }
750     ofconn->role = role;
751 }
752
753 /* Returns the currently configured flow format for 'ofconn', one of NXFF_*.
754  *
755  * The default, if no other format has been set, is NXFF_OPENFLOW10. */
756 enum nx_flow_format
757 ofconn_get_flow_format(struct ofconn *ofconn)
758 {
759     return ofconn->flow_format;
760 }
761
762 /* Sets the flow format for 'ofconn' to 'flow_format' (one of NXFF_*). */
763 void
764 ofconn_set_flow_format(struct ofconn *ofconn, enum nx_flow_format flow_format)
765 {
766     ofconn->flow_format = flow_format;
767 }
768
769 /* Returns true if the NXT_FLOW_MOD_TABLE_ID extension is enabled, false
770  * otherwise.
771  *
772  * By default the extension is not enabled. */
773 bool
774 ofconn_get_flow_mod_table_id(const struct ofconn *ofconn)
775 {
776     return ofconn->flow_mod_table_id;
777 }
778
779 /* Enables or disables (according to 'enable') the NXT_FLOW_MOD_TABLE_ID
780  * extension on 'ofconn'. */
781 void
782 ofconn_set_flow_mod_table_id(struct ofconn *ofconn, bool enable)
783 {
784     ofconn->flow_mod_table_id = enable;
785 }
786
787 /* Returns the default miss send length for 'ofconn'. */
788 int
789 ofconn_get_miss_send_len(const struct ofconn *ofconn)
790 {
791     return ofconn->miss_send_len;
792 }
793
794 /* Sets the default miss send length for 'ofconn' to 'miss_send_len'. */
795 void
796 ofconn_set_miss_send_len(struct ofconn *ofconn, int miss_send_len)
797 {
798     ofconn->miss_send_len = miss_send_len;
799 }
800
801 /* Sends 'msg' on 'ofconn', accounting it as a reply.  (If there is a
802  * sufficient number of OpenFlow replies in-flight on a single ofconn, then the
803  * connmgr will stop accepting new OpenFlow requests on that ofconn until the
804  * controller has accepted some of the replies.) */
805 void
806 ofconn_send_reply(const struct ofconn *ofconn, struct ofpbuf *msg)
807 {
808     ofconn_send(ofconn, msg, ofconn->reply_counter);
809 }
810
811 /* Sends each of the messages in list 'replies' on 'ofconn' in order,
812  * accounting them as replies. */
813 void
814 ofconn_send_replies(const struct ofconn *ofconn, struct list *replies)
815 {
816     struct ofpbuf *reply, *next;
817
818     LIST_FOR_EACH_SAFE (reply, next, list_node, replies) {
819         list_remove(&reply->list_node);
820         ofconn_send_reply(ofconn, reply);
821     }
822 }
823
824 /* Sends 'error', which should be an OpenFlow error created with
825  * e.g. ofp_mkerr(), on 'ofconn', as a reply to 'request'.  Only at most the
826  * first 64 bytes of 'request' are used. */
827 void
828 ofconn_send_error(const struct ofconn *ofconn,
829                   const struct ofp_header *request, int error)
830 {
831     struct ofpbuf *msg = ofputil_encode_error_msg(error, request);
832     if (msg) {
833         ofconn_send_reply(ofconn, msg);
834     }
835 }
836
837 /* Same as pktbuf_retrieve(), using the pktbuf owned by 'ofconn'. */
838 int
839 ofconn_pktbuf_retrieve(struct ofconn *ofconn, uint32_t id,
840                        struct ofpbuf **bufferp, uint16_t *in_port)
841 {
842     return pktbuf_retrieve(ofconn->pktbuf, id, bufferp, in_port);
843 }
844
845 /* Returns true if 'ofconn' has any pending opgroups. */
846 bool
847 ofconn_has_pending_opgroups(const struct ofconn *ofconn)
848 {
849     return !list_is_empty(&ofconn->opgroups);
850 }
851
852 /* Adds 'ofconn_node' to 'ofconn''s list of pending opgroups.
853  *
854  * If 'ofconn' is destroyed or its connection drops, then 'ofconn' will remove
855  * 'ofconn_node' from the list and re-initialize it with list_init().  The
856  * client may, therefore, use list_is_empty(ofconn_node) to determine whether
857  * 'ofconn_node' is still associated with an active ofconn.
858  *
859  * The client may also remove ofconn_node from the list itself, with
860  * list_remove(). */
861 void
862 ofconn_add_opgroup(struct ofconn *ofconn, struct list *ofconn_node)
863 {
864     list_push_back(&ofconn->opgroups, ofconn_node);
865 }
866 \f
867 /* Private ofconn functions. */
868
869 static const char *
870 ofconn_get_target(const struct ofconn *ofconn)
871 {
872     return rconn_get_target(ofconn->rconn);
873 }
874
875 static struct ofconn *
876 ofconn_create(struct connmgr *mgr, struct rconn *rconn, enum ofconn_type type)
877 {
878     struct ofconn *ofconn = xzalloc(sizeof *ofconn);
879     ofconn->connmgr = mgr;
880     list_push_back(&mgr->all_conns, &ofconn->node);
881     ofconn->rconn = rconn;
882     ofconn->type = type;
883     ofconn->flow_format = NXFF_OPENFLOW10;
884     ofconn->flow_mod_table_id = false;
885     list_init(&ofconn->opgroups);
886     ofconn->role = NX_ROLE_OTHER;
887     ofconn->packet_in_counter = rconn_packet_counter_create ();
888     ofconn->pktbuf = NULL;
889     ofconn->miss_send_len = 0;
890     ofconn->reply_counter = rconn_packet_counter_create ();
891     return ofconn;
892 }
893
894 /* Disassociates 'ofconn' from all of the ofopgroups that it initiated that
895  * have not yet completed.  (Those ofopgroups will still run to completion in
896  * the usual way, but any errors that they run into will not be reported on any
897  * OpenFlow channel.)
898  *
899  * Also discards any blocked operation on 'ofconn'. */
900 static void
901 ofconn_flush(struct ofconn *ofconn)
902 {
903     while (!list_is_empty(&ofconn->opgroups)) {
904         list_init(list_pop_front(&ofconn->opgroups));
905     }
906     ofpbuf_delete(ofconn->blocked);
907     ofconn->blocked = NULL;
908 }
909
910 static void
911 ofconn_destroy(struct ofconn *ofconn)
912 {
913     ofconn_flush(ofconn);
914
915     if (ofconn->type == OFCONN_PRIMARY) {
916         hmap_remove(&ofconn->connmgr->controllers, &ofconn->hmap_node);
917     }
918
919     list_remove(&ofconn->node);
920     rconn_destroy(ofconn->rconn);
921     rconn_packet_counter_destroy(ofconn->packet_in_counter);
922     rconn_packet_counter_destroy(ofconn->reply_counter);
923     pktbuf_destroy(ofconn->pktbuf);
924     free(ofconn);
925 }
926
927 /* Reconfigures 'ofconn' to match 'c'.  'ofconn' and 'c' must have the same
928  * target. */
929 static void
930 ofconn_reconfigure(struct ofconn *ofconn, const struct ofproto_controller *c)
931 {
932     int probe_interval;
933
934     ofconn->band = c->band;
935
936     rconn_set_max_backoff(ofconn->rconn, c->max_backoff);
937
938     probe_interval = c->probe_interval ? MAX(c->probe_interval, 5) : 0;
939     rconn_set_probe_interval(ofconn->rconn, probe_interval);
940
941     ofconn_set_rate_limit(ofconn, c->rate_limit, c->burst_limit);
942 }
943
944 /* Returns true if it makes sense for 'ofconn' to receive and process OpenFlow
945  * messages. */
946 static bool
947 ofconn_may_recv(const struct ofconn *ofconn)
948 {
949     int count = rconn_packet_counter_read (ofconn->reply_counter);
950     return (!ofconn->blocked || ofconn->retry) && count < OFCONN_REPLY_MAX;
951 }
952
953 static void
954 ofconn_run(struct ofconn *ofconn,
955            bool (*handle_openflow)(struct ofconn *, struct ofpbuf *ofp_msg))
956 {
957     struct connmgr *mgr = ofconn->connmgr;
958     size_t i;
959
960     for (i = 0; i < N_SCHEDULERS; i++) {
961         pinsched_run(ofconn->schedulers[i], do_send_packet_in, ofconn);
962     }
963
964     rconn_run(ofconn->rconn);
965
966     if (handle_openflow) {
967         /* Limit the number of iterations to avoid starving other tasks. */
968         for (i = 0; i < 50 && ofconn_may_recv(ofconn); i++) {
969             struct ofpbuf *of_msg;
970
971             of_msg = (ofconn->blocked
972                       ? ofconn->blocked
973                       : rconn_recv(ofconn->rconn));
974             if (!of_msg) {
975                 break;
976             }
977             if (mgr->fail_open) {
978                 fail_open_maybe_recover(mgr->fail_open);
979             }
980
981             if (handle_openflow(ofconn, of_msg)) {
982                 ofpbuf_delete(of_msg);
983                 ofconn->blocked = NULL;
984             } else {
985                 ofconn->blocked = of_msg;
986                 ofconn->retry = false;
987             }
988         }
989     }
990
991     if (!rconn_is_alive(ofconn->rconn)) {
992         ofconn_destroy(ofconn);
993     } else if (!rconn_is_connected(ofconn->rconn)) {
994         ofconn_flush(ofconn);
995     }
996 }
997
998 static void
999 ofconn_wait(struct ofconn *ofconn, bool handling_openflow)
1000 {
1001     int i;
1002
1003     for (i = 0; i < N_SCHEDULERS; i++) {
1004         pinsched_wait(ofconn->schedulers[i]);
1005     }
1006     rconn_run_wait(ofconn->rconn);
1007     if (handling_openflow && ofconn_may_recv(ofconn)) {
1008         rconn_recv_wait(ofconn->rconn);
1009     }
1010 }
1011
1012 /* Returns true if 'ofconn' should receive asynchronous messages. */
1013 static bool
1014 ofconn_receives_async_msgs(const struct ofconn *ofconn)
1015 {
1016     if (!rconn_is_connected(ofconn->rconn)) {
1017         return false;
1018     } else if (ofconn->type == OFCONN_PRIMARY) {
1019         /* Primary controllers always get asynchronous messages unless they
1020          * have configured themselves as "slaves".  */
1021         return ofconn->role != NX_ROLE_SLAVE;
1022     } else {
1023         /* Service connections don't get asynchronous messages unless they have
1024          * explicitly asked for them by setting a nonzero miss send length. */
1025         return ofconn->miss_send_len > 0;
1026     }
1027 }
1028
1029 /* Returns a human-readable name for an OpenFlow connection between 'mgr' and
1030  * 'target', suitable for use in log messages for identifying the connection.
1031  *
1032  * The name is dynamically allocated.  The caller should free it (with free())
1033  * when it is no longer needed. */
1034 static char *
1035 ofconn_make_name(const struct connmgr *mgr, const char *target)
1036 {
1037     return xasprintf("%s<->%s", mgr->name, target);
1038 }
1039
1040 static void
1041 ofconn_set_rate_limit(struct ofconn *ofconn, int rate, int burst)
1042 {
1043     int i;
1044
1045     for (i = 0; i < N_SCHEDULERS; i++) {
1046         struct pinsched **s = &ofconn->schedulers[i];
1047
1048         if (rate > 0) {
1049             if (!*s) {
1050                 *s = pinsched_create(rate, burst);
1051             } else {
1052                 pinsched_set_limits(*s, rate, burst);
1053             }
1054         } else {
1055             pinsched_destroy(*s);
1056             *s = NULL;
1057         }
1058     }
1059 }
1060
1061 static void
1062 ofconn_send(const struct ofconn *ofconn, struct ofpbuf *msg,
1063             struct rconn_packet_counter *counter)
1064 {
1065     update_openflow_length(msg);
1066     if (rconn_send(ofconn->rconn, msg, counter)) {
1067         ofpbuf_delete(msg);
1068     }
1069 }
1070 \f
1071 /* Sending asynchronous messages. */
1072
1073 static void schedule_packet_in(struct ofconn *, struct ofputil_packet_in,
1074                                const struct flow *, struct ofpbuf *rw_packet);
1075
1076 /* Sends an OFPT_PORT_STATUS message with 'opp' and 'reason' to appropriate
1077  * controllers managed by 'mgr'. */
1078 void
1079 connmgr_send_port_status(struct connmgr *mgr, const struct ofp_phy_port *opp,
1080                          uint8_t reason)
1081 {
1082     /* XXX Should limit the number of queued port status change messages. */
1083     struct ofconn *ofconn;
1084
1085     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1086         struct ofp_port_status *ops;
1087         struct ofpbuf *b;
1088
1089         /* Primary controllers, even slaves, should always get port status
1090            updates.  Otherwise obey ofconn_receives_async_msgs(). */
1091         if (ofconn->type != OFCONN_PRIMARY
1092             && !ofconn_receives_async_msgs(ofconn)) {
1093             continue;
1094         }
1095
1096         ops = make_openflow_xid(sizeof *ops, OFPT_PORT_STATUS, 0, &b);
1097         ops->reason = reason;
1098         ops->desc = *opp;
1099         ofconn_send(ofconn, b, NULL);
1100     }
1101 }
1102
1103 /* Sends an OFPT_FLOW_REMOVED or NXT_FLOW_REMOVED message based on 'fr' to
1104  * appropriate controllers managed by 'mgr'. */
1105 void
1106 connmgr_send_flow_removed(struct connmgr *mgr,
1107                           const struct ofputil_flow_removed *fr)
1108 {
1109     struct ofconn *ofconn;
1110
1111     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1112         struct ofpbuf *msg;
1113
1114         if (!ofconn_receives_async_msgs(ofconn)) {
1115             continue;
1116         }
1117
1118         /* Account flow expirations as replies to OpenFlow requests.  That
1119          * works because preventing OpenFlow requests from being processed also
1120          * prevents new flows from being added (and expiring).  (It also
1121          * prevents processing OpenFlow requests that would not add new flows,
1122          * so it is imperfect.) */
1123         msg = ofputil_encode_flow_removed(fr, ofconn->flow_format);
1124         ofconn_send_reply(ofconn, msg);
1125     }
1126 }
1127
1128 /* Given 'pin', sends an OFPT_PACKET_IN message to each OpenFlow controller as
1129  * necessary according to their individual configurations.
1130  *
1131  * 'rw_packet' may be NULL.  Otherwise, 'rw_packet' must contain the same data
1132  * as pin->packet.  (rw_packet == pin->packet is also valid.)  Ownership of
1133  * 'rw_packet' is transferred to this function. */
1134 void
1135 connmgr_send_packet_in(struct connmgr *mgr,
1136                        const struct ofputil_packet_in *pin,
1137                        const struct flow *flow, struct ofpbuf *rw_packet)
1138 {
1139     struct ofconn *ofconn, *prev;
1140
1141     prev = NULL;
1142     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1143         if (ofconn_receives_async_msgs(ofconn)) {
1144             if (prev) {
1145                 schedule_packet_in(prev, *pin, flow, NULL);
1146             }
1147             prev = ofconn;
1148         }
1149     }
1150     if (prev) {
1151         schedule_packet_in(prev, *pin, flow, rw_packet);
1152     } else {
1153         ofpbuf_delete(rw_packet);
1154     }
1155 }
1156
1157 /* pinsched callback for sending 'ofp_packet_in' on 'ofconn'. */
1158 static void
1159 do_send_packet_in(struct ofpbuf *ofp_packet_in, void *ofconn_)
1160 {
1161     struct ofconn *ofconn = ofconn_;
1162
1163     rconn_send_with_limit(ofconn->rconn, ofp_packet_in,
1164                           ofconn->packet_in_counter, 100);
1165 }
1166
1167 /* Takes 'pin', whose packet has the flow specified by 'flow', composes an
1168  * OpenFlow packet-in message from it, and passes it to 'ofconn''s packet
1169  * scheduler for sending.
1170  *
1171  * 'rw_packet' may be NULL.  Otherwise, 'rw_packet' must contain the same data
1172  * as pin->packet.  (rw_packet == pin->packet is also valid.)  Ownership of
1173  * 'rw_packet' is transferred to this function. */
1174 static void
1175 schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin,
1176                    const struct flow *flow, struct ofpbuf *rw_packet)
1177 {
1178     struct connmgr *mgr = ofconn->connmgr;
1179
1180     /* Get OpenFlow buffer_id. */
1181     if (pin.reason == OFPR_ACTION) {
1182         pin.buffer_id = UINT32_MAX;
1183     } else if (mgr->fail_open && fail_open_is_active(mgr->fail_open)) {
1184         pin.buffer_id = pktbuf_get_null();
1185     } else if (!ofconn->pktbuf) {
1186         pin.buffer_id = UINT32_MAX;
1187     } else {
1188         pin.buffer_id = pktbuf_save(ofconn->pktbuf, pin.packet, flow->in_port);
1189     }
1190
1191     /* Figure out how much of the packet to send. */
1192     if (pin.reason == OFPR_NO_MATCH) {
1193         pin.send_len = pin.packet->size;
1194     } else {
1195         /* Caller should have initialized 'send_len' to 'max_len' specified in
1196          * struct ofp_action_output. */
1197     }
1198     if (pin.buffer_id != UINT32_MAX) {
1199         pin.send_len = MIN(pin.send_len, ofconn->miss_send_len);
1200     }
1201
1202     /* Make OFPT_PACKET_IN and hand over to packet scheduler.  It might
1203      * immediately call into do_send_packet_in() or it might buffer it for a
1204      * while (until a later call to pinsched_run()). */
1205     pinsched_send(ofconn->schedulers[pin.reason == OFPR_NO_MATCH ? 0 : 1],
1206                   flow->in_port, ofputil_encode_packet_in(&pin, rw_packet),
1207                   do_send_packet_in, ofconn);
1208 }
1209 \f
1210 /* Fail-open settings. */
1211
1212 /* Returns the failure handling mode (OFPROTO_FAIL_SECURE or
1213  * OFPROTO_FAIL_STANDALONE) for 'mgr'. */
1214 enum ofproto_fail_mode
1215 connmgr_get_fail_mode(const struct connmgr *mgr)
1216 {
1217     return mgr->fail_mode;
1218 }
1219
1220 /* Sets the failure handling mode for 'mgr' to 'fail_mode' (either
1221  * OFPROTO_FAIL_SECURE or OFPROTO_FAIL_STANDALONE). */
1222 void
1223 connmgr_set_fail_mode(struct connmgr *mgr, enum ofproto_fail_mode fail_mode)
1224 {
1225     if (mgr->fail_mode != fail_mode) {
1226         mgr->fail_mode = fail_mode;
1227         update_fail_open(mgr);
1228         if (!connmgr_has_controllers(mgr)) {
1229             ofproto_flush_flows(mgr->ofproto);
1230         }
1231     }
1232 }
1233 \f
1234 /* Fail-open implementation. */
1235
1236 /* Returns the longest probe interval among the primary controllers configured
1237  * on 'mgr'.  Returns 0 if there are no primary controllers. */
1238 int
1239 connmgr_get_max_probe_interval(const struct connmgr *mgr)
1240 {
1241     const struct ofconn *ofconn;
1242     int max_probe_interval;
1243
1244     max_probe_interval = 0;
1245     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1246         int probe_interval = rconn_get_probe_interval(ofconn->rconn);
1247         max_probe_interval = MAX(max_probe_interval, probe_interval);
1248     }
1249     return max_probe_interval;
1250 }
1251
1252 /* Returns the number of seconds for which all of 'mgr's primary controllers
1253  * have been disconnected.  Returns 0 if 'mgr' has no primary controllers. */
1254 int
1255 connmgr_failure_duration(const struct connmgr *mgr)
1256 {
1257     const struct ofconn *ofconn;
1258     int min_failure_duration;
1259
1260     if (!connmgr_has_controllers(mgr)) {
1261         return 0;
1262     }
1263
1264     min_failure_duration = INT_MAX;
1265     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1266         int failure_duration = rconn_failure_duration(ofconn->rconn);
1267         min_failure_duration = MIN(min_failure_duration, failure_duration);
1268     }
1269     return min_failure_duration;
1270 }
1271
1272 /* Returns true if at least one primary controller is connected (regardless of
1273  * whether those controllers are believed to have authenticated and accepted
1274  * this switch), false if none of them are connected. */
1275 bool
1276 connmgr_is_any_controller_connected(const struct connmgr *mgr)
1277 {
1278     const struct ofconn *ofconn;
1279
1280     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1281         if (rconn_is_connected(ofconn->rconn)) {
1282             return true;
1283         }
1284     }
1285     return false;
1286 }
1287
1288 /* Returns true if at least one primary controller is believed to have
1289  * authenticated and accepted this switch, false otherwise. */
1290 bool
1291 connmgr_is_any_controller_admitted(const struct connmgr *mgr)
1292 {
1293     const struct ofconn *ofconn;
1294
1295     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1296         if (rconn_is_admitted(ofconn->rconn)) {
1297             return true;
1298         }
1299     }
1300     return false;
1301 }
1302
1303 /* Sends 'packet' to each controller connected to 'mgr'.  Takes ownership of
1304  * 'packet'. */
1305 void
1306 connmgr_broadcast(struct connmgr *mgr, struct ofpbuf *packet)
1307 {
1308     struct ofconn *ofconn, *prev;
1309
1310     prev = NULL;
1311     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1312         if (prev) {
1313             ofconn_send_reply(ofconn, ofpbuf_clone(packet));
1314         }
1315         if (rconn_is_connected(ofconn->rconn)) {
1316             prev = ofconn;
1317         }
1318     }
1319     if (prev) {
1320         ofconn_send_reply(prev, packet);
1321     } else {
1322         ofpbuf_delete(packet);
1323     }
1324 }
1325 \f
1326 /* In-band configuration. */
1327
1328 static bool any_extras_changed(const struct connmgr *,
1329                                const struct sockaddr_in *extras, size_t n);
1330
1331 /* Sets the 'n' TCP port addresses in 'extras' as ones to which 'mgr''s
1332  * in-band control should guarantee access, in the same way that in-band
1333  * control guarantees access to OpenFlow controllers. */
1334 void
1335 connmgr_set_extra_in_band_remotes(struct connmgr *mgr,
1336                                   const struct sockaddr_in *extras, size_t n)
1337 {
1338     if (!any_extras_changed(mgr, extras, n)) {
1339         return;
1340     }
1341
1342     free(mgr->extra_in_band_remotes);
1343     mgr->n_extra_remotes = n;
1344     mgr->extra_in_band_remotes = xmemdup(extras, n * sizeof *extras);
1345
1346     update_in_band_remotes(mgr);
1347 }
1348
1349 /* Sets the OpenFlow queue used by flows set up by in-band control on
1350  * 'mgr' to 'queue_id'.  If 'queue_id' is negative, then in-band control
1351  * flows will use the default queue. */
1352 void
1353 connmgr_set_in_band_queue(struct connmgr *mgr, int queue_id)
1354 {
1355     if (queue_id != mgr->in_band_queue) {
1356         mgr->in_band_queue = queue_id;
1357         update_in_band_remotes(mgr);
1358     }
1359 }
1360
1361 static bool
1362 any_extras_changed(const struct connmgr *mgr,
1363                    const struct sockaddr_in *extras, size_t n)
1364 {
1365     size_t i;
1366
1367     if (n != mgr->n_extra_remotes) {
1368         return true;
1369     }
1370
1371     for (i = 0; i < n; i++) {
1372         const struct sockaddr_in *old = &mgr->extra_in_band_remotes[i];
1373         const struct sockaddr_in *new = &extras[i];
1374
1375         if (old->sin_addr.s_addr != new->sin_addr.s_addr ||
1376             old->sin_port != new->sin_port) {
1377             return true;
1378         }
1379     }
1380
1381     return false;
1382 }
1383 \f
1384 /* In-band implementation. */
1385
1386 bool
1387 connmgr_msg_in_hook(struct connmgr *mgr, const struct flow *flow,
1388                     const struct ofpbuf *packet)
1389 {
1390     return mgr->in_band && in_band_msg_in_hook(mgr->in_band, flow, packet);
1391 }
1392
1393 bool
1394 connmgr_may_set_up_flow(struct connmgr *mgr, const struct flow *flow,
1395                         const struct nlattr *odp_actions,
1396                         size_t actions_len)
1397 {
1398     return !mgr->in_band || in_band_rule_check(flow, odp_actions, actions_len);
1399 }
1400 \f
1401 /* Fail-open and in-band implementation. */
1402
1403 /* Called by 'ofproto' after all flows have been flushed, to allow fail-open
1404  * and standalone mode to re-create their flows.
1405  *
1406  * In-band control has more sophisticated code that manages flows itself. */
1407 void
1408 connmgr_flushed(struct connmgr *mgr)
1409 {
1410     if (mgr->fail_open) {
1411         fail_open_flushed(mgr->fail_open);
1412     }
1413
1414     /* If there are no controllers and we're in standalone mode, set up a flow
1415      * that matches every packet and directs them to OFPP_NORMAL (which goes to
1416      * us).  Otherwise, the switch is in secure mode and we won't pass any
1417      * traffic until a controller has been defined and it tells us to do so. */
1418     if (!connmgr_has_controllers(mgr)
1419         && mgr->fail_mode == OFPROTO_FAIL_STANDALONE) {
1420         union ofp_action action;
1421         struct cls_rule rule;
1422
1423         memset(&action, 0, sizeof action);
1424         action.type = htons(OFPAT_OUTPUT);
1425         action.output.len = htons(sizeof action);
1426         action.output.port = htons(OFPP_NORMAL);
1427         cls_rule_init_catchall(&rule, 0);
1428         ofproto_add_flow(mgr->ofproto, &rule, &action, 1);
1429     }
1430 }
1431 \f
1432 /* Creates a new ofservice for 'target' in 'mgr'.  Returns 0 if successful,
1433  * otherwise a positive errno value.
1434  *
1435  * ofservice_reconfigure() must be called to fully configure the new
1436  * ofservice. */
1437 static int
1438 ofservice_create(struct connmgr *mgr, const char *target)
1439 {
1440     struct ofservice *ofservice;
1441     struct pvconn *pvconn;
1442     int error;
1443
1444     error = pvconn_open(target, &pvconn);
1445     if (error) {
1446         return error;
1447     }
1448
1449     ofservice = xzalloc(sizeof *ofservice);
1450     hmap_insert(&mgr->services, &ofservice->node, hash_string(target, 0));
1451     ofservice->pvconn = pvconn;
1452
1453     return 0;
1454 }
1455
1456 static void
1457 ofservice_destroy(struct connmgr *mgr, struct ofservice *ofservice)
1458 {
1459     hmap_remove(&mgr->services, &ofservice->node);
1460     pvconn_close(ofservice->pvconn);
1461     free(ofservice);
1462 }
1463
1464 static void
1465 ofservice_reconfigure(struct ofservice *ofservice,
1466                       const struct ofproto_controller *c)
1467 {
1468     ofservice->probe_interval = c->probe_interval;
1469     ofservice->rate_limit = c->rate_limit;
1470     ofservice->burst_limit = c->burst_limit;
1471 }
1472
1473 /* Finds and returns the ofservice within 'mgr' that has the given
1474  * 'target', or a null pointer if none exists. */
1475 static struct ofservice *
1476 ofservice_lookup(struct connmgr *mgr, const char *target)
1477 {
1478     struct ofservice *ofservice;
1479
1480     HMAP_FOR_EACH_WITH_HASH (ofservice, node, hash_string(target, 0),
1481                              &mgr->services) {
1482         if (!strcmp(pvconn_get_name(ofservice->pvconn), target)) {
1483             return ofservice;
1484         }
1485     }
1486     return NULL;
1487 }