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