ofproto: Consistently log OpenFlow error replies.
[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;
832
833     msg = ofputil_encode_error_msg(error, request);
834     if (msg) {
835         static struct vlog_rate_limit err_rl = VLOG_RATE_LIMIT_INIT(10, 10);
836
837         if (!VLOG_DROP_INFO(&err_rl)) {
838             const struct ofputil_msg_type *type;
839             const char *type_name;
840             size_t request_len;
841             char *error_s;
842
843             request_len = ntohs(request->length);
844             type_name = (!ofputil_decode_msg_type_partial(request,
845                                                           MIN(64, request_len),
846                                                           &type)
847                          ? ofputil_msg_type_name(type)
848                          : "invalid");
849
850             error_s = ofputil_error_to_string(error);
851             VLOG_INFO("%s: sending %s error reply to %s message",
852                       rconn_get_name(ofconn->rconn), error_s, type_name);
853             free(error_s);
854         }
855         ofconn_send_reply(ofconn, msg);
856     }
857 }
858
859 /* Same as pktbuf_retrieve(), using the pktbuf owned by 'ofconn'. */
860 int
861 ofconn_pktbuf_retrieve(struct ofconn *ofconn, uint32_t id,
862                        struct ofpbuf **bufferp, uint16_t *in_port)
863 {
864     return pktbuf_retrieve(ofconn->pktbuf, id, bufferp, in_port);
865 }
866
867 /* Returns true if 'ofconn' has any pending opgroups. */
868 bool
869 ofconn_has_pending_opgroups(const struct ofconn *ofconn)
870 {
871     return !list_is_empty(&ofconn->opgroups);
872 }
873
874 /* Adds 'ofconn_node' to 'ofconn''s list of pending opgroups.
875  *
876  * If 'ofconn' is destroyed or its connection drops, then 'ofconn' will remove
877  * 'ofconn_node' from the list and re-initialize it with list_init().  The
878  * client may, therefore, use list_is_empty(ofconn_node) to determine whether
879  * 'ofconn_node' is still associated with an active ofconn.
880  *
881  * The client may also remove ofconn_node from the list itself, with
882  * list_remove(). */
883 void
884 ofconn_add_opgroup(struct ofconn *ofconn, struct list *ofconn_node)
885 {
886     list_push_back(&ofconn->opgroups, ofconn_node);
887 }
888 \f
889 /* Private ofconn functions. */
890
891 static const char *
892 ofconn_get_target(const struct ofconn *ofconn)
893 {
894     return rconn_get_target(ofconn->rconn);
895 }
896
897 static struct ofconn *
898 ofconn_create(struct connmgr *mgr, struct rconn *rconn, enum ofconn_type type)
899 {
900     struct ofconn *ofconn = xzalloc(sizeof *ofconn);
901     ofconn->connmgr = mgr;
902     list_push_back(&mgr->all_conns, &ofconn->node);
903     ofconn->rconn = rconn;
904     ofconn->type = type;
905     ofconn->flow_format = NXFF_OPENFLOW10;
906     ofconn->flow_mod_table_id = false;
907     list_init(&ofconn->opgroups);
908     ofconn->role = NX_ROLE_OTHER;
909     ofconn->packet_in_counter = rconn_packet_counter_create ();
910     ofconn->pktbuf = NULL;
911     ofconn->miss_send_len = 0;
912     ofconn->reply_counter = rconn_packet_counter_create ();
913     return ofconn;
914 }
915
916 /* Disassociates 'ofconn' from all of the ofopgroups that it initiated that
917  * have not yet completed.  (Those ofopgroups will still run to completion in
918  * the usual way, but any errors that they run into will not be reported on any
919  * OpenFlow channel.)
920  *
921  * Also discards any blocked operation on 'ofconn'. */
922 static void
923 ofconn_flush(struct ofconn *ofconn)
924 {
925     while (!list_is_empty(&ofconn->opgroups)) {
926         list_init(list_pop_front(&ofconn->opgroups));
927     }
928     ofpbuf_delete(ofconn->blocked);
929     ofconn->blocked = NULL;
930 }
931
932 static void
933 ofconn_destroy(struct ofconn *ofconn)
934 {
935     ofconn_flush(ofconn);
936
937     if (ofconn->type == OFCONN_PRIMARY) {
938         hmap_remove(&ofconn->connmgr->controllers, &ofconn->hmap_node);
939     }
940
941     list_remove(&ofconn->node);
942     rconn_destroy(ofconn->rconn);
943     rconn_packet_counter_destroy(ofconn->packet_in_counter);
944     rconn_packet_counter_destroy(ofconn->reply_counter);
945     pktbuf_destroy(ofconn->pktbuf);
946     free(ofconn);
947 }
948
949 /* Reconfigures 'ofconn' to match 'c'.  'ofconn' and 'c' must have the same
950  * target. */
951 static void
952 ofconn_reconfigure(struct ofconn *ofconn, const struct ofproto_controller *c)
953 {
954     int probe_interval;
955
956     ofconn->band = c->band;
957
958     rconn_set_max_backoff(ofconn->rconn, c->max_backoff);
959
960     probe_interval = c->probe_interval ? MAX(c->probe_interval, 5) : 0;
961     rconn_set_probe_interval(ofconn->rconn, probe_interval);
962
963     ofconn_set_rate_limit(ofconn, c->rate_limit, c->burst_limit);
964 }
965
966 /* Returns true if it makes sense for 'ofconn' to receive and process OpenFlow
967  * messages. */
968 static bool
969 ofconn_may_recv(const struct ofconn *ofconn)
970 {
971     int count = rconn_packet_counter_read (ofconn->reply_counter);
972     return (!ofconn->blocked || ofconn->retry) && count < OFCONN_REPLY_MAX;
973 }
974
975 static void
976 ofconn_run(struct ofconn *ofconn,
977            bool (*handle_openflow)(struct ofconn *, struct ofpbuf *ofp_msg))
978 {
979     struct connmgr *mgr = ofconn->connmgr;
980     size_t i;
981
982     for (i = 0; i < N_SCHEDULERS; i++) {
983         pinsched_run(ofconn->schedulers[i], do_send_packet_in, ofconn);
984     }
985
986     rconn_run(ofconn->rconn);
987
988     if (handle_openflow) {
989         /* Limit the number of iterations to avoid starving other tasks. */
990         for (i = 0; i < 50 && ofconn_may_recv(ofconn); i++) {
991             struct ofpbuf *of_msg;
992
993             of_msg = (ofconn->blocked
994                       ? ofconn->blocked
995                       : rconn_recv(ofconn->rconn));
996             if (!of_msg) {
997                 break;
998             }
999             if (mgr->fail_open) {
1000                 fail_open_maybe_recover(mgr->fail_open);
1001             }
1002
1003             if (handle_openflow(ofconn, of_msg)) {
1004                 ofpbuf_delete(of_msg);
1005                 ofconn->blocked = NULL;
1006             } else {
1007                 ofconn->blocked = of_msg;
1008                 ofconn->retry = false;
1009             }
1010         }
1011     }
1012
1013     if (!rconn_is_alive(ofconn->rconn)) {
1014         ofconn_destroy(ofconn);
1015     } else if (!rconn_is_connected(ofconn->rconn)) {
1016         ofconn_flush(ofconn);
1017     }
1018 }
1019
1020 static void
1021 ofconn_wait(struct ofconn *ofconn, bool handling_openflow)
1022 {
1023     int i;
1024
1025     for (i = 0; i < N_SCHEDULERS; i++) {
1026         pinsched_wait(ofconn->schedulers[i]);
1027     }
1028     rconn_run_wait(ofconn->rconn);
1029     if (handling_openflow && ofconn_may_recv(ofconn)) {
1030         rconn_recv_wait(ofconn->rconn);
1031     }
1032 }
1033
1034 /* Returns true if 'ofconn' should receive asynchronous messages. */
1035 static bool
1036 ofconn_receives_async_msgs(const struct ofconn *ofconn)
1037 {
1038     if (!rconn_is_connected(ofconn->rconn)) {
1039         return false;
1040     } else if (ofconn->type == OFCONN_PRIMARY) {
1041         /* Primary controllers always get asynchronous messages unless they
1042          * have configured themselves as "slaves".  */
1043         return ofconn->role != NX_ROLE_SLAVE;
1044     } else {
1045         /* Service connections don't get asynchronous messages unless they have
1046          * explicitly asked for them by setting a nonzero miss send length. */
1047         return ofconn->miss_send_len > 0;
1048     }
1049 }
1050
1051 /* Returns a human-readable name for an OpenFlow connection between 'mgr' and
1052  * 'target', suitable for use in log messages for identifying the connection.
1053  *
1054  * The name is dynamically allocated.  The caller should free it (with free())
1055  * when it is no longer needed. */
1056 static char *
1057 ofconn_make_name(const struct connmgr *mgr, const char *target)
1058 {
1059     return xasprintf("%s<->%s", mgr->name, target);
1060 }
1061
1062 static void
1063 ofconn_set_rate_limit(struct ofconn *ofconn, int rate, int burst)
1064 {
1065     int i;
1066
1067     for (i = 0; i < N_SCHEDULERS; i++) {
1068         struct pinsched **s = &ofconn->schedulers[i];
1069
1070         if (rate > 0) {
1071             if (!*s) {
1072                 *s = pinsched_create(rate, burst);
1073             } else {
1074                 pinsched_set_limits(*s, rate, burst);
1075             }
1076         } else {
1077             pinsched_destroy(*s);
1078             *s = NULL;
1079         }
1080     }
1081 }
1082
1083 static void
1084 ofconn_send(const struct ofconn *ofconn, struct ofpbuf *msg,
1085             struct rconn_packet_counter *counter)
1086 {
1087     update_openflow_length(msg);
1088     if (rconn_send(ofconn->rconn, msg, counter)) {
1089         ofpbuf_delete(msg);
1090     }
1091 }
1092 \f
1093 /* Sending asynchronous messages. */
1094
1095 static void schedule_packet_in(struct ofconn *, struct ofputil_packet_in,
1096                                const struct flow *, struct ofpbuf *rw_packet);
1097
1098 /* Sends an OFPT_PORT_STATUS message with 'opp' and 'reason' to appropriate
1099  * controllers managed by 'mgr'. */
1100 void
1101 connmgr_send_port_status(struct connmgr *mgr, const struct ofp_phy_port *opp,
1102                          uint8_t reason)
1103 {
1104     /* XXX Should limit the number of queued port status change messages. */
1105     struct ofconn *ofconn;
1106
1107     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1108         struct ofp_port_status *ops;
1109         struct ofpbuf *b;
1110
1111         /* Primary controllers, even slaves, should always get port status
1112            updates.  Otherwise obey ofconn_receives_async_msgs(). */
1113         if (ofconn->type != OFCONN_PRIMARY
1114             && !ofconn_receives_async_msgs(ofconn)) {
1115             continue;
1116         }
1117
1118         ops = make_openflow_xid(sizeof *ops, OFPT_PORT_STATUS, 0, &b);
1119         ops->reason = reason;
1120         ops->desc = *opp;
1121         ofconn_send(ofconn, b, NULL);
1122     }
1123 }
1124
1125 /* Sends an OFPT_FLOW_REMOVED or NXT_FLOW_REMOVED message based on 'fr' to
1126  * appropriate controllers managed by 'mgr'. */
1127 void
1128 connmgr_send_flow_removed(struct connmgr *mgr,
1129                           const struct ofputil_flow_removed *fr)
1130 {
1131     struct ofconn *ofconn;
1132
1133     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1134         struct ofpbuf *msg;
1135
1136         if (!ofconn_receives_async_msgs(ofconn)) {
1137             continue;
1138         }
1139
1140         /* Account flow expirations as replies to OpenFlow requests.  That
1141          * works because preventing OpenFlow requests from being processed also
1142          * prevents new flows from being added (and expiring).  (It also
1143          * prevents processing OpenFlow requests that would not add new flows,
1144          * so it is imperfect.) */
1145         msg = ofputil_encode_flow_removed(fr, ofconn->flow_format);
1146         ofconn_send_reply(ofconn, msg);
1147     }
1148 }
1149
1150 /* Given 'pin', sends an OFPT_PACKET_IN message to each OpenFlow controller as
1151  * necessary according to their individual configurations.
1152  *
1153  * 'rw_packet' may be NULL.  Otherwise, 'rw_packet' must contain the same data
1154  * as pin->packet.  (rw_packet == pin->packet is also valid.)  Ownership of
1155  * 'rw_packet' is transferred to this function. */
1156 void
1157 connmgr_send_packet_in(struct connmgr *mgr,
1158                        const struct ofputil_packet_in *pin,
1159                        const struct flow *flow, struct ofpbuf *rw_packet)
1160 {
1161     struct ofconn *ofconn, *prev;
1162
1163     prev = NULL;
1164     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1165         if (ofconn_receives_async_msgs(ofconn)) {
1166             if (prev) {
1167                 schedule_packet_in(prev, *pin, flow, NULL);
1168             }
1169             prev = ofconn;
1170         }
1171     }
1172     if (prev) {
1173         schedule_packet_in(prev, *pin, flow, rw_packet);
1174     } else {
1175         ofpbuf_delete(rw_packet);
1176     }
1177 }
1178
1179 /* pinsched callback for sending 'ofp_packet_in' on 'ofconn'. */
1180 static void
1181 do_send_packet_in(struct ofpbuf *ofp_packet_in, void *ofconn_)
1182 {
1183     struct ofconn *ofconn = ofconn_;
1184
1185     rconn_send_with_limit(ofconn->rconn, ofp_packet_in,
1186                           ofconn->packet_in_counter, 100);
1187 }
1188
1189 /* Takes 'pin', whose packet has the flow specified by 'flow', composes an
1190  * OpenFlow packet-in message from it, and passes it to 'ofconn''s packet
1191  * scheduler for sending.
1192  *
1193  * 'rw_packet' may be NULL.  Otherwise, 'rw_packet' must contain the same data
1194  * as pin->packet.  (rw_packet == pin->packet is also valid.)  Ownership of
1195  * 'rw_packet' is transferred to this function. */
1196 static void
1197 schedule_packet_in(struct ofconn *ofconn, struct ofputil_packet_in pin,
1198                    const struct flow *flow, struct ofpbuf *rw_packet)
1199 {
1200     struct connmgr *mgr = ofconn->connmgr;
1201
1202     /* Get OpenFlow buffer_id. */
1203     if (pin.reason == OFPR_ACTION) {
1204         pin.buffer_id = UINT32_MAX;
1205     } else if (mgr->fail_open && fail_open_is_active(mgr->fail_open)) {
1206         pin.buffer_id = pktbuf_get_null();
1207     } else if (!ofconn->pktbuf) {
1208         pin.buffer_id = UINT32_MAX;
1209     } else {
1210         pin.buffer_id = pktbuf_save(ofconn->pktbuf, pin.packet, flow->in_port);
1211     }
1212
1213     /* Figure out how much of the packet to send. */
1214     if (pin.reason == OFPR_NO_MATCH) {
1215         pin.send_len = pin.packet->size;
1216     } else {
1217         /* Caller should have initialized 'send_len' to 'max_len' specified in
1218          * struct ofp_action_output. */
1219     }
1220     if (pin.buffer_id != UINT32_MAX) {
1221         pin.send_len = MIN(pin.send_len, ofconn->miss_send_len);
1222     }
1223
1224     /* Make OFPT_PACKET_IN and hand over to packet scheduler.  It might
1225      * immediately call into do_send_packet_in() or it might buffer it for a
1226      * while (until a later call to pinsched_run()). */
1227     pinsched_send(ofconn->schedulers[pin.reason == OFPR_NO_MATCH ? 0 : 1],
1228                   flow->in_port, ofputil_encode_packet_in(&pin, rw_packet),
1229                   do_send_packet_in, ofconn);
1230 }
1231 \f
1232 /* Fail-open settings. */
1233
1234 /* Returns the failure handling mode (OFPROTO_FAIL_SECURE or
1235  * OFPROTO_FAIL_STANDALONE) for 'mgr'. */
1236 enum ofproto_fail_mode
1237 connmgr_get_fail_mode(const struct connmgr *mgr)
1238 {
1239     return mgr->fail_mode;
1240 }
1241
1242 /* Sets the failure handling mode for 'mgr' to 'fail_mode' (either
1243  * OFPROTO_FAIL_SECURE or OFPROTO_FAIL_STANDALONE). */
1244 void
1245 connmgr_set_fail_mode(struct connmgr *mgr, enum ofproto_fail_mode fail_mode)
1246 {
1247     if (mgr->fail_mode != fail_mode) {
1248         mgr->fail_mode = fail_mode;
1249         update_fail_open(mgr);
1250         if (!connmgr_has_controllers(mgr)) {
1251             ofproto_flush_flows(mgr->ofproto);
1252         }
1253     }
1254 }
1255 \f
1256 /* Fail-open implementation. */
1257
1258 /* Returns the longest probe interval among the primary controllers configured
1259  * on 'mgr'.  Returns 0 if there are no primary controllers. */
1260 int
1261 connmgr_get_max_probe_interval(const struct connmgr *mgr)
1262 {
1263     const struct ofconn *ofconn;
1264     int max_probe_interval;
1265
1266     max_probe_interval = 0;
1267     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1268         int probe_interval = rconn_get_probe_interval(ofconn->rconn);
1269         max_probe_interval = MAX(max_probe_interval, probe_interval);
1270     }
1271     return max_probe_interval;
1272 }
1273
1274 /* Returns the number of seconds for which all of 'mgr's primary controllers
1275  * have been disconnected.  Returns 0 if 'mgr' has no primary controllers. */
1276 int
1277 connmgr_failure_duration(const struct connmgr *mgr)
1278 {
1279     const struct ofconn *ofconn;
1280     int min_failure_duration;
1281
1282     if (!connmgr_has_controllers(mgr)) {
1283         return 0;
1284     }
1285
1286     min_failure_duration = INT_MAX;
1287     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1288         int failure_duration = rconn_failure_duration(ofconn->rconn);
1289         min_failure_duration = MIN(min_failure_duration, failure_duration);
1290     }
1291     return min_failure_duration;
1292 }
1293
1294 /* Returns true if at least one primary controller is connected (regardless of
1295  * whether those controllers are believed to have authenticated and accepted
1296  * this switch), false if none of them are connected. */
1297 bool
1298 connmgr_is_any_controller_connected(const struct connmgr *mgr)
1299 {
1300     const struct ofconn *ofconn;
1301
1302     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1303         if (rconn_is_connected(ofconn->rconn)) {
1304             return true;
1305         }
1306     }
1307     return false;
1308 }
1309
1310 /* Returns true if at least one primary controller is believed to have
1311  * authenticated and accepted this switch, false otherwise. */
1312 bool
1313 connmgr_is_any_controller_admitted(const struct connmgr *mgr)
1314 {
1315     const struct ofconn *ofconn;
1316
1317     HMAP_FOR_EACH (ofconn, hmap_node, &mgr->controllers) {
1318         if (rconn_is_admitted(ofconn->rconn)) {
1319             return true;
1320         }
1321     }
1322     return false;
1323 }
1324
1325 /* Sends 'packet' to each controller connected to 'mgr'.  Takes ownership of
1326  * 'packet'. */
1327 void
1328 connmgr_broadcast(struct connmgr *mgr, struct ofpbuf *packet)
1329 {
1330     struct ofconn *ofconn, *prev;
1331
1332     prev = NULL;
1333     LIST_FOR_EACH (ofconn, node, &mgr->all_conns) {
1334         if (prev) {
1335             ofconn_send_reply(ofconn, ofpbuf_clone(packet));
1336         }
1337         if (rconn_is_connected(ofconn->rconn)) {
1338             prev = ofconn;
1339         }
1340     }
1341     if (prev) {
1342         ofconn_send_reply(prev, packet);
1343     } else {
1344         ofpbuf_delete(packet);
1345     }
1346 }
1347 \f
1348 /* In-band configuration. */
1349
1350 static bool any_extras_changed(const struct connmgr *,
1351                                const struct sockaddr_in *extras, size_t n);
1352
1353 /* Sets the 'n' TCP port addresses in 'extras' as ones to which 'mgr''s
1354  * in-band control should guarantee access, in the same way that in-band
1355  * control guarantees access to OpenFlow controllers. */
1356 void
1357 connmgr_set_extra_in_band_remotes(struct connmgr *mgr,
1358                                   const struct sockaddr_in *extras, size_t n)
1359 {
1360     if (!any_extras_changed(mgr, extras, n)) {
1361         return;
1362     }
1363
1364     free(mgr->extra_in_band_remotes);
1365     mgr->n_extra_remotes = n;
1366     mgr->extra_in_band_remotes = xmemdup(extras, n * sizeof *extras);
1367
1368     update_in_band_remotes(mgr);
1369 }
1370
1371 /* Sets the OpenFlow queue used by flows set up by in-band control on
1372  * 'mgr' to 'queue_id'.  If 'queue_id' is negative, then in-band control
1373  * flows will use the default queue. */
1374 void
1375 connmgr_set_in_band_queue(struct connmgr *mgr, int queue_id)
1376 {
1377     if (queue_id != mgr->in_band_queue) {
1378         mgr->in_band_queue = queue_id;
1379         update_in_band_remotes(mgr);
1380     }
1381 }
1382
1383 static bool
1384 any_extras_changed(const struct connmgr *mgr,
1385                    const struct sockaddr_in *extras, size_t n)
1386 {
1387     size_t i;
1388
1389     if (n != mgr->n_extra_remotes) {
1390         return true;
1391     }
1392
1393     for (i = 0; i < n; i++) {
1394         const struct sockaddr_in *old = &mgr->extra_in_band_remotes[i];
1395         const struct sockaddr_in *new = &extras[i];
1396
1397         if (old->sin_addr.s_addr != new->sin_addr.s_addr ||
1398             old->sin_port != new->sin_port) {
1399             return true;
1400         }
1401     }
1402
1403     return false;
1404 }
1405 \f
1406 /* In-band implementation. */
1407
1408 bool
1409 connmgr_msg_in_hook(struct connmgr *mgr, const struct flow *flow,
1410                     const struct ofpbuf *packet)
1411 {
1412     return mgr->in_band && in_band_msg_in_hook(mgr->in_band, flow, packet);
1413 }
1414
1415 bool
1416 connmgr_may_set_up_flow(struct connmgr *mgr, const struct flow *flow,
1417                         const struct nlattr *odp_actions,
1418                         size_t actions_len)
1419 {
1420     return !mgr->in_band || in_band_rule_check(flow, odp_actions, actions_len);
1421 }
1422 \f
1423 /* Fail-open and in-band implementation. */
1424
1425 /* Called by 'ofproto' after all flows have been flushed, to allow fail-open
1426  * and standalone mode to re-create their flows.
1427  *
1428  * In-band control has more sophisticated code that manages flows itself. */
1429 void
1430 connmgr_flushed(struct connmgr *mgr)
1431 {
1432     if (mgr->fail_open) {
1433         fail_open_flushed(mgr->fail_open);
1434     }
1435
1436     /* If there are no controllers and we're in standalone mode, set up a flow
1437      * that matches every packet and directs them to OFPP_NORMAL (which goes to
1438      * us).  Otherwise, the switch is in secure mode and we won't pass any
1439      * traffic until a controller has been defined and it tells us to do so. */
1440     if (!connmgr_has_controllers(mgr)
1441         && mgr->fail_mode == OFPROTO_FAIL_STANDALONE) {
1442         union ofp_action action;
1443         struct cls_rule rule;
1444
1445         memset(&action, 0, sizeof action);
1446         action.type = htons(OFPAT_OUTPUT);
1447         action.output.len = htons(sizeof action);
1448         action.output.port = htons(OFPP_NORMAL);
1449         cls_rule_init_catchall(&rule, 0);
1450         ofproto_add_flow(mgr->ofproto, &rule, &action, 1);
1451     }
1452 }
1453 \f
1454 /* Creates a new ofservice for 'target' in 'mgr'.  Returns 0 if successful,
1455  * otherwise a positive errno value.
1456  *
1457  * ofservice_reconfigure() must be called to fully configure the new
1458  * ofservice. */
1459 static int
1460 ofservice_create(struct connmgr *mgr, const char *target)
1461 {
1462     struct ofservice *ofservice;
1463     struct pvconn *pvconn;
1464     int error;
1465
1466     error = pvconn_open(target, &pvconn);
1467     if (error) {
1468         return error;
1469     }
1470
1471     ofservice = xzalloc(sizeof *ofservice);
1472     hmap_insert(&mgr->services, &ofservice->node, hash_string(target, 0));
1473     ofservice->pvconn = pvconn;
1474
1475     return 0;
1476 }
1477
1478 static void
1479 ofservice_destroy(struct connmgr *mgr, struct ofservice *ofservice)
1480 {
1481     hmap_remove(&mgr->services, &ofservice->node);
1482     pvconn_close(ofservice->pvconn);
1483     free(ofservice);
1484 }
1485
1486 static void
1487 ofservice_reconfigure(struct ofservice *ofservice,
1488                       const struct ofproto_controller *c)
1489 {
1490     ofservice->probe_interval = c->probe_interval;
1491     ofservice->rate_limit = c->rate_limit;
1492     ofservice->burst_limit = c->burst_limit;
1493 }
1494
1495 /* Finds and returns the ofservice within 'mgr' that has the given
1496  * 'target', or a null pointer if none exists. */
1497 static struct ofservice *
1498 ofservice_lookup(struct connmgr *mgr, const char *target)
1499 {
1500     struct ofservice *ofservice;
1501
1502     HMAP_FOR_EACH_WITH_HASH (ofservice, node, hash_string(target, 0),
1503                              &mgr->services) {
1504         if (!strcmp(pvconn_get_name(ofservice->pvconn), target)) {
1505             return ofservice;
1506         }
1507     }
1508     return NULL;
1509 }