Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / lib / vconn.c
1 /*
2  * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <config.h>
18 #include "vconn-provider.h"
19 #include <errno.h>
20 #include <inttypes.h>
21 #include <netinet/in.h>
22 #include <poll.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include "coverage.h"
26 #include "dynamic-string.h"
27 #include "fatal-signal.h"
28 #include "flow.h"
29 #include "ofp-errors.h"
30 #include "ofp-msgs.h"
31 #include "ofp-print.h"
32 #include "ofp-util.h"
33 #include "ofpbuf.h"
34 #include "openflow/nicira-ext.h"
35 #include "openflow/openflow.h"
36 #include "packets.h"
37 #include "poll-loop.h"
38 #include "random.h"
39 #include "util.h"
40 #include "vlog.h"
41 #include "socket-util.h"
42
43 VLOG_DEFINE_THIS_MODULE(vconn);
44
45 COVERAGE_DEFINE(vconn_open);
46 COVERAGE_DEFINE(vconn_received);
47 COVERAGE_DEFINE(vconn_sent);
48
49 /* State of an active vconn.*/
50 enum vconn_state {
51     /* This is the ordinary progression of states. */
52     VCS_CONNECTING,             /* Underlying vconn is not connected. */
53     VCS_SEND_HELLO,             /* Waiting to send OFPT_HELLO message. */
54     VCS_RECV_HELLO,             /* Waiting to receive OFPT_HELLO message. */
55     VCS_CONNECTED,              /* Connection established. */
56
57     /* These states are entered only when something goes wrong. */
58     VCS_SEND_ERROR,             /* Sending OFPT_ERROR message. */
59     VCS_DISCONNECTED            /* Connection failed or connection closed. */
60 };
61
62 static const struct vconn_class *vconn_classes[] = {
63     &tcp_vconn_class,
64     &unix_vconn_class,
65 #ifdef HAVE_OPENSSL
66     &ssl_vconn_class,
67 #endif
68 };
69
70 static const struct pvconn_class *pvconn_classes[] = {
71     &ptcp_pvconn_class,
72     &punix_pvconn_class,
73 #ifdef HAVE_OPENSSL
74     &pssl_pvconn_class,
75 #endif
76 };
77
78 /* Rate limit for individual OpenFlow messages going over the vconn, output at
79  * DBG level.  This is very high because, if these are enabled, it is because
80  * we really need to see them. */
81 static struct vlog_rate_limit ofmsg_rl = VLOG_RATE_LIMIT_INIT(600, 600);
82
83 /* Rate limit for OpenFlow message parse errors.  These always indicate a bug
84  * in the peer and so there's not much point in showing a lot of them. */
85 static struct vlog_rate_limit bad_ofmsg_rl = VLOG_RATE_LIMIT_INIT(1, 5);
86
87 static int do_recv(struct vconn *, struct ofpbuf **);
88 static int do_send(struct vconn *, struct ofpbuf *);
89
90 /* Check the validity of the vconn class structures. */
91 static void
92 check_vconn_classes(void)
93 {
94 #ifndef NDEBUG
95     size_t i;
96
97     for (i = 0; i < ARRAY_SIZE(vconn_classes); i++) {
98         const struct vconn_class *class = vconn_classes[i];
99         ovs_assert(class->name != NULL);
100         ovs_assert(class->open != NULL);
101         if (class->close || class->recv || class->send
102             || class->run || class->run_wait || class->wait) {
103             ovs_assert(class->close != NULL);
104             ovs_assert(class->recv != NULL);
105             ovs_assert(class->send != NULL);
106             ovs_assert(class->wait != NULL);
107         } else {
108             /* This class delegates to another one. */
109         }
110     }
111
112     for (i = 0; i < ARRAY_SIZE(pvconn_classes); i++) {
113         const struct pvconn_class *class = pvconn_classes[i];
114         ovs_assert(class->name != NULL);
115         ovs_assert(class->listen != NULL);
116         if (class->close || class->accept || class->wait) {
117             ovs_assert(class->close != NULL);
118             ovs_assert(class->accept != NULL);
119             ovs_assert(class->wait != NULL);
120         } else {
121             /* This class delegates to another one. */
122         }
123     }
124 #endif
125 }
126
127 /* Prints information on active (if 'active') and passive (if 'passive')
128  * connection methods supported by the vconn.  If 'bootstrap' is true, also
129  * advertises options to bootstrap the CA certificate. */
130 void
131 vconn_usage(bool active, bool passive, bool bootstrap OVS_UNUSED)
132 {
133     /* Really this should be implemented via callbacks into the vconn
134      * providers, but that seems too heavy-weight to bother with at the
135      * moment. */
136
137     printf("\n");
138     if (active) {
139         printf("Active OpenFlow connection methods:\n");
140         printf("  tcp:IP[:PORT]           "
141                "PORT (default: %d) at remote IP\n", OFP_OLD_PORT);
142 #ifdef HAVE_OPENSSL
143         printf("  ssl:IP[:PORT]           "
144                "SSL PORT (default: %d) at remote IP\n", OFP_OLD_PORT);
145 #endif
146         printf("  unix:FILE               Unix domain socket named FILE\n");
147     }
148
149     if (passive) {
150         printf("Passive OpenFlow connection methods:\n");
151         printf("  ptcp:[PORT][:IP]        "
152                "listen to TCP PORT (default: %d) on IP\n",
153                OFP_OLD_PORT);
154 #ifdef HAVE_OPENSSL
155         printf("  pssl:[PORT][:IP]        "
156                "listen for SSL on PORT (default: %d) on IP\n",
157                OFP_OLD_PORT);
158 #endif
159         printf("  punix:FILE              "
160                "listen on Unix domain socket FILE\n");
161     }
162
163 #ifdef HAVE_OPENSSL
164     printf("PKI configuration (required to use SSL):\n"
165            "  -p, --private-key=FILE  file with private key\n"
166            "  -c, --certificate=FILE  file with certificate for private key\n"
167            "  -C, --ca-cert=FILE      file with peer CA certificate\n");
168     if (bootstrap) {
169         printf("  --bootstrap-ca-cert=FILE  file with peer CA certificate "
170                "to read or create\n");
171     }
172 #endif
173 }
174
175 /* Given 'name', a connection name in the form "TYPE:ARGS", stores the class
176  * named "TYPE" into '*classp' and returns 0.  Returns EAFNOSUPPORT and stores
177  * a null pointer into '*classp' if 'name' is in the wrong form or if no such
178  * class exists. */
179 static int
180 vconn_lookup_class(const char *name, const struct vconn_class **classp)
181 {
182     size_t prefix_len;
183
184     prefix_len = strcspn(name, ":");
185     if (name[prefix_len] != '\0') {
186         size_t i;
187
188         for (i = 0; i < ARRAY_SIZE(vconn_classes); i++) {
189             const struct vconn_class *class = vconn_classes[i];
190             if (strlen(class->name) == prefix_len
191                 && !memcmp(class->name, name, prefix_len)) {
192                 *classp = class;
193                 return 0;
194             }
195         }
196     }
197
198     *classp = NULL;
199     return EAFNOSUPPORT;
200 }
201
202 /* Returns 0 if 'name' is a connection name in the form "TYPE:ARGS" and TYPE is
203  * a supported connection type, otherwise EAFNOSUPPORT.  */
204 int
205 vconn_verify_name(const char *name)
206 {
207     const struct vconn_class *class;
208     return vconn_lookup_class(name, &class);
209 }
210
211 /* Attempts to connect to an OpenFlow device.  'name' is a connection name in
212  * the form "TYPE:ARGS", where TYPE is an active vconn class's name and ARGS
213  * are vconn class-specific.
214  *
215  * The vconn will automatically negotiate an OpenFlow protocol version
216  * acceptable to both peers on the connection.  The version negotiated will be
217  * one of those in the 'allowed_versions' bitmap: version 'x' is allowed if
218  * allowed_versions & (1 << x) is nonzero.  If 'allowed_versions' is zero, then
219  * OFPUTIL_DEFAULT_VERSIONS are allowed.
220  *
221  * Returns 0 if successful, otherwise a positive errno value.  If successful,
222  * stores a pointer to the new connection in '*vconnp', otherwise a null
223  * pointer.  */
224 int
225 vconn_open(const char *name, uint32_t allowed_versions, uint8_t dscp,
226            struct vconn **vconnp)
227 {
228     const struct vconn_class *class;
229     struct vconn *vconn;
230     char *suffix_copy;
231     int error;
232
233     COVERAGE_INC(vconn_open);
234     check_vconn_classes();
235
236     if (!allowed_versions) {
237         allowed_versions = OFPUTIL_DEFAULT_VERSIONS;
238     }
239
240     /* Look up the class. */
241     error = vconn_lookup_class(name, &class);
242     if (!class) {
243         goto error;
244     }
245
246     /* Call class's "open" function. */
247     suffix_copy = xstrdup(strchr(name, ':') + 1);
248     error = class->open(name, allowed_versions, suffix_copy, &vconn, dscp);
249     free(suffix_copy);
250     if (error) {
251         goto error;
252     }
253
254     /* Success. */
255     ovs_assert(vconn->state != VCS_CONNECTING || vconn->class->connect);
256     *vconnp = vconn;
257     return 0;
258
259 error:
260     *vconnp = NULL;
261     return error;
262 }
263
264 /* Allows 'vconn' to perform maintenance activities, such as flushing output
265  * buffers. */
266 void
267 vconn_run(struct vconn *vconn)
268 {
269     if (vconn->state == VCS_CONNECTING ||
270         vconn->state == VCS_SEND_HELLO ||
271         vconn->state == VCS_RECV_HELLO) {
272         vconn_connect(vconn);
273     }
274
275     if (vconn->class->run) {
276         (vconn->class->run)(vconn);
277     }
278 }
279
280 /* Arranges for the poll loop to wake up when 'vconn' needs to perform
281  * maintenance activities. */
282 void
283 vconn_run_wait(struct vconn *vconn)
284 {
285     if (vconn->state == VCS_CONNECTING ||
286         vconn->state == VCS_SEND_HELLO ||
287         vconn->state == VCS_RECV_HELLO) {
288         vconn_connect_wait(vconn);
289     }
290
291     if (vconn->class->run_wait) {
292         (vconn->class->run_wait)(vconn);
293     }
294 }
295
296 /* Returns 0 if 'vconn' is healthy (connecting or connected), a positive errno
297  * value if the connection died abnormally (connection failed or aborted), or
298  * EOF if the connection was closed in a normal way. */
299 int
300 vconn_get_status(const struct vconn *vconn)
301 {
302     return vconn->error == EAGAIN ? 0 : vconn->error;
303 }
304
305 int
306 vconn_open_block(const char *name, uint32_t allowed_versions, uint8_t dscp,
307                  struct vconn **vconnp)
308 {
309     struct vconn *vconn;
310     int error;
311
312     fatal_signal_run();
313
314     error = vconn_open(name, allowed_versions, dscp, &vconn);
315     if (!error) {
316         error = vconn_connect_block(vconn);
317     }
318
319     if (error) {
320         vconn_close(vconn);
321         *vconnp = NULL;
322     } else {
323         *vconnp = vconn;
324     }
325     return error;
326 }
327
328 /* Closes 'vconn'. */
329 void
330 vconn_close(struct vconn *vconn)
331 {
332     if (vconn != NULL) {
333         char *name = vconn->name;
334         (vconn->class->close)(vconn);
335         free(name);
336     }
337 }
338
339 /* Returns the name of 'vconn', that is, the string passed to vconn_open(). */
340 const char *
341 vconn_get_name(const struct vconn *vconn)
342 {
343     return vconn->name;
344 }
345
346 /* Returns the allowed_versions of 'vconn', that is,
347  * the allowed_versions passed to vconn_open(). */
348 uint32_t
349 vconn_get_allowed_versions(const struct vconn *vconn)
350 {
351     return vconn->allowed_versions;
352 }
353
354 /* Sets the allowed_versions of 'vconn', overriding
355  * the allowed_versions passed to vconn_open(). */
356 void
357 vconn_set_allowed_versions(struct vconn *vconn, uint32_t allowed_versions)
358 {
359     vconn->allowed_versions = allowed_versions;
360 }
361
362 /* Returns the OpenFlow version negotiated with the peer, or -1 if version
363  * negotiation is not yet complete.
364  *
365  * A vconn that has successfully connected (that is, vconn_connect() or
366  * vconn_send() or vconn_recv() has returned 0) always negotiated a version. */
367 int
368 vconn_get_version(const struct vconn *vconn)
369 {
370     return vconn->version ? vconn->version : -1;
371 }
372
373 /* By default, a vconn accepts only OpenFlow messages whose version matches the
374  * one negotiated for the connection.  A message received with a different
375  * version is an error that causes the vconn to drop the connection.
376  *
377  * This functions allows 'vconn' to accept messages with any OpenFlow version.
378  * This is useful in the special case where 'vconn' is used as an rconn
379  * "monitor" connection (see rconn_add_monitor()), that is, where 'vconn' is
380  * used as a target for mirroring OpenFlow messages for debugging and
381  * troubleshooting.
382  *
383  * This function should be called after a successful vconn_open() or
384  * pvconn_accept() but before the connection completes, that is, before
385  * vconn_connect() returns success.  Otherwise, messages that arrive on 'vconn'
386  * beforehand with an unexpected version will the vconn to drop the
387  * connection. */
388 void
389 vconn_set_recv_any_version(struct vconn *vconn)
390 {
391     vconn->recv_any_version = true;
392 }
393
394 static void
395 vcs_connecting(struct vconn *vconn)
396 {
397     int retval = (vconn->class->connect)(vconn);
398     ovs_assert(retval != EINPROGRESS);
399     if (!retval) {
400         vconn->state = VCS_SEND_HELLO;
401     } else if (retval != EAGAIN) {
402         vconn->state = VCS_DISCONNECTED;
403         vconn->error = retval;
404     }
405 }
406
407 static void
408 vcs_send_hello(struct vconn *vconn)
409 {
410     struct ofpbuf *b;
411     int retval;
412
413     b = ofputil_encode_hello(vconn->allowed_versions);
414     retval = do_send(vconn, b);
415     if (!retval) {
416         vconn->state = VCS_RECV_HELLO;
417     } else {
418         ofpbuf_delete(b);
419         if (retval != EAGAIN) {
420             vconn->state = VCS_DISCONNECTED;
421             vconn->error = retval;
422         }
423     }
424 }
425
426 static char *
427 version_bitmap_to_string(uint32_t bitmap)
428 {
429     struct ds s;
430
431     ds_init(&s);
432     if (!bitmap) {
433         ds_put_cstr(&s, "no versions");
434     } else if (is_pow2(bitmap)) {
435         ds_put_cstr(&s, "version ");
436         ofputil_format_version(&s, leftmost_1bit_idx(bitmap));
437     } else if (is_pow2((bitmap >> 1) + 1)) {
438         ds_put_cstr(&s, "version ");
439         ofputil_format_version(&s, leftmost_1bit_idx(bitmap));
440         ds_put_cstr(&s, " and earlier");
441     } else {
442         ds_put_cstr(&s, "versions ");
443         ofputil_format_version_bitmap(&s, bitmap);
444     }
445     return ds_steal_cstr(&s);
446 }
447
448 static void
449 vcs_recv_hello(struct vconn *vconn)
450 {
451     struct ofpbuf *b;
452     int retval;
453
454     retval = do_recv(vconn, &b);
455     if (!retval) {
456         enum ofptype type;
457         enum ofperr error;
458
459         error = ofptype_decode(&type, ofpbuf_data(b));
460         if (!error && type == OFPTYPE_HELLO) {
461             char *peer_s, *local_s;
462             uint32_t common_versions;
463
464             if (!ofputil_decode_hello(ofpbuf_data(b), &vconn->peer_versions)) {
465                 struct ds msg = DS_EMPTY_INITIALIZER;
466                 ds_put_format(&msg, "%s: unknown data in hello:\n",
467                               vconn->name);
468                 ds_put_hex_dump(&msg, ofpbuf_data(b), ofpbuf_size(b), 0, true);
469                 VLOG_WARN_RL(&bad_ofmsg_rl, "%s", ds_cstr(&msg));
470                 ds_destroy(&msg);
471             }
472
473             local_s = version_bitmap_to_string(vconn->allowed_versions);
474             peer_s = version_bitmap_to_string(vconn->peer_versions);
475
476             common_versions = vconn->peer_versions & vconn->allowed_versions;
477             if (!common_versions) {
478                 vconn->version = leftmost_1bit_idx(vconn->peer_versions);
479                 VLOG_WARN_RL(&bad_ofmsg_rl,
480                              "%s: version negotiation failed (we support "
481                              "%s, peer supports %s)",
482                              vconn->name, local_s, peer_s);
483                 vconn->state = VCS_SEND_ERROR;
484             } else {
485                 vconn->version = leftmost_1bit_idx(common_versions);
486                 VLOG_DBG("%s: negotiated OpenFlow version 0x%02x "
487                          "(we support %s, peer supports %s)", vconn->name,
488                          vconn->version, local_s, peer_s);
489                 vconn->state = VCS_CONNECTED;
490             }
491
492             free(local_s);
493             free(peer_s);
494
495             ofpbuf_delete(b);
496             return;
497         } else {
498             char *s = ofp_to_string(ofpbuf_data(b), ofpbuf_size(b), 1);
499             VLOG_WARN_RL(&bad_ofmsg_rl,
500                          "%s: received message while expecting hello: %s",
501                          vconn->name, s);
502             free(s);
503             retval = EPROTO;
504             ofpbuf_delete(b);
505         }
506     }
507
508     if (retval != EAGAIN) {
509         vconn->state = VCS_DISCONNECTED;
510         vconn->error = retval == EOF ? ECONNRESET : retval;
511     }
512 }
513
514 static void
515 vcs_send_error(struct vconn *vconn)
516 {
517     struct ofpbuf *b;
518     char s[128];
519     int retval;
520     char *local_s, *peer_s;
521
522     local_s = version_bitmap_to_string(vconn->allowed_versions);
523     peer_s = version_bitmap_to_string(vconn->peer_versions);
524     snprintf(s, sizeof s, "We support %s, you support %s, no common versions.",
525              local_s, peer_s);
526     free(peer_s);
527     free(local_s);
528
529     b = ofperr_encode_hello(OFPERR_OFPHFC_INCOMPATIBLE, vconn->version, s);
530     retval = do_send(vconn, b);
531     if (retval) {
532         ofpbuf_delete(b);
533     }
534     if (retval != EAGAIN) {
535         vconn->state = VCS_DISCONNECTED;
536         vconn->error = retval ? retval : EPROTO;
537     }
538 }
539
540 /* Tries to complete the connection on 'vconn'. If 'vconn''s connection is
541  * complete, returns 0 if the connection was successful or a positive errno
542  * value if it failed.  If the connection is still in progress, returns
543  * EAGAIN. */
544 int
545 vconn_connect(struct vconn *vconn)
546 {
547     enum vconn_state last_state;
548
549     do {
550         last_state = vconn->state;
551         switch (vconn->state) {
552         case VCS_CONNECTING:
553             vcs_connecting(vconn);
554             break;
555
556         case VCS_SEND_HELLO:
557             vcs_send_hello(vconn);
558             break;
559
560         case VCS_RECV_HELLO:
561             vcs_recv_hello(vconn);
562             break;
563
564         case VCS_CONNECTED:
565             return 0;
566
567         case VCS_SEND_ERROR:
568             vcs_send_error(vconn);
569             break;
570
571         case VCS_DISCONNECTED:
572             return vconn->error;
573
574         default:
575             OVS_NOT_REACHED();
576         }
577     } while (vconn->state != last_state);
578
579     return EAGAIN;
580 }
581
582 /* Tries to receive an OpenFlow message from 'vconn'.  If successful, stores
583  * the received message into '*msgp' and returns 0.  The caller is responsible
584  * for destroying the message with ofpbuf_delete().  On failure, returns a
585  * positive errno value and stores a null pointer into '*msgp'.  On normal
586  * connection close, returns EOF.
587  *
588  * vconn_recv will not block waiting for a packet to arrive.  If no packets
589  * have been received, it returns EAGAIN immediately. */
590 int
591 vconn_recv(struct vconn *vconn, struct ofpbuf **msgp)
592 {
593     struct ofpbuf *msg;
594     int retval;
595
596     retval = vconn_connect(vconn);
597     if (!retval) {
598         retval = do_recv(vconn, &msg);
599     }
600     if (!retval && !vconn->recv_any_version) {
601         const struct ofp_header *oh = ofpbuf_data(msg);
602         if (oh->version != vconn->version) {
603             enum ofptype type;
604
605             if (ofptype_decode(&type, ofpbuf_data(msg))
606                 || (type != OFPTYPE_HELLO &&
607                     type != OFPTYPE_ERROR &&
608                     type != OFPTYPE_ECHO_REQUEST &&
609                     type != OFPTYPE_ECHO_REPLY)) {
610                 struct ofpbuf *reply;
611
612                 VLOG_ERR_RL(&bad_ofmsg_rl, "%s: received OpenFlow version "
613                             "0x%02"PRIx8" != expected %02x",
614                             vconn->name, oh->version, vconn->version);
615
616                 /* Send a "bad version" reply, if we can. */
617                 reply = ofperr_encode_reply(OFPERR_OFPBRC_BAD_VERSION, oh);
618                 retval = vconn_send(vconn, reply);
619                 if (retval) {
620                     VLOG_INFO_RL(&bad_ofmsg_rl,
621                                  "%s: failed to queue error reply (%s)",
622                                  vconn->name, ovs_strerror(retval));
623                     ofpbuf_delete(reply);
624                 }
625
626                 /* Suppress the received message, as if it had not arrived. */
627                 retval = EAGAIN;
628                 ofpbuf_delete(msg);
629             }
630         }
631     }
632
633     *msgp = retval ? NULL : msg;
634     return retval;
635 }
636
637 static int
638 do_recv(struct vconn *vconn, struct ofpbuf **msgp)
639 {
640     int retval = (vconn->class->recv)(vconn, msgp);
641     if (!retval) {
642         COVERAGE_INC(vconn_received);
643         if (VLOG_IS_DBG_ENABLED()) {
644             char *s = ofp_to_string(ofpbuf_data(*msgp), ofpbuf_size(*msgp), 1);
645             VLOG_DBG_RL(&ofmsg_rl, "%s: received: %s", vconn->name, s);
646             free(s);
647         }
648     }
649     return retval;
650 }
651
652 /* Tries to queue 'msg' for transmission on 'vconn'.  If successful, returns 0,
653  * in which case ownership of 'msg' is transferred to the vconn.  Success does
654  * not guarantee that 'msg' has been or ever will be delivered to the peer,
655  * only that it has been queued for transmission.
656  *
657  * Returns a positive errno value on failure, in which case the caller
658  * retains ownership of 'msg'.
659  *
660  * vconn_send will not block.  If 'msg' cannot be immediately accepted for
661  * transmission, it returns EAGAIN immediately. */
662 int
663 vconn_send(struct vconn *vconn, struct ofpbuf *msg)
664 {
665     int retval = vconn_connect(vconn);
666     if (!retval) {
667         retval = do_send(vconn, msg);
668     }
669     return retval;
670 }
671
672 static int
673 do_send(struct vconn *vconn, struct ofpbuf *msg)
674 {
675     int retval;
676
677     ovs_assert(ofpbuf_size(msg) >= sizeof(struct ofp_header));
678
679     ofpmsg_update_length(msg);
680     if (!VLOG_IS_DBG_ENABLED()) {
681         COVERAGE_INC(vconn_sent);
682         retval = (vconn->class->send)(vconn, msg);
683     } else {
684         char *s = ofp_to_string(ofpbuf_data(msg), ofpbuf_size(msg), 1);
685         retval = (vconn->class->send)(vconn, msg);
686         if (retval != EAGAIN) {
687             VLOG_DBG_RL(&ofmsg_rl, "%s: sent (%s): %s",
688                         vconn->name, ovs_strerror(retval), s);
689         }
690         free(s);
691     }
692     return retval;
693 }
694
695 /* Same as vconn_connect(), except that it waits until the connection on
696  * 'vconn' completes or fails.  Thus, it will never return EAGAIN. */
697 int
698 vconn_connect_block(struct vconn *vconn)
699 {
700     int error;
701
702     while ((error = vconn_connect(vconn)) == EAGAIN) {
703         vconn_run(vconn);
704         vconn_run_wait(vconn);
705         vconn_connect_wait(vconn);
706         poll_block();
707     }
708     ovs_assert(error != EINPROGRESS);
709
710     return error;
711 }
712
713 /* Same as vconn_send, except that it waits until 'msg' can be transmitted. */
714 int
715 vconn_send_block(struct vconn *vconn, struct ofpbuf *msg)
716 {
717     int retval;
718
719     fatal_signal_run();
720
721     while ((retval = vconn_send(vconn, msg)) == EAGAIN) {
722         vconn_run(vconn);
723         vconn_run_wait(vconn);
724         vconn_send_wait(vconn);
725         poll_block();
726     }
727     return retval;
728 }
729
730 /* Same as vconn_recv, except that it waits until a message is received. */
731 int
732 vconn_recv_block(struct vconn *vconn, struct ofpbuf **msgp)
733 {
734     int retval;
735
736     fatal_signal_run();
737
738     while ((retval = vconn_recv(vconn, msgp)) == EAGAIN) {
739         vconn_run(vconn);
740         vconn_run_wait(vconn);
741         vconn_recv_wait(vconn);
742         poll_block();
743     }
744     return retval;
745 }
746
747 /* Waits until a message with a transaction ID matching 'xid' is received on
748  * 'vconn'.  Returns 0 if successful, in which case the reply is stored in
749  * '*replyp' for the caller to examine and free.  Otherwise returns a positive
750  * errno value, or EOF, and sets '*replyp' to null.
751  *
752  * 'request' is always destroyed, regardless of the return value. */
753 int
754 vconn_recv_xid(struct vconn *vconn, ovs_be32 xid, struct ofpbuf **replyp)
755 {
756     for (;;) {
757         ovs_be32 recv_xid;
758         struct ofpbuf *reply;
759         int error;
760
761         error = vconn_recv_block(vconn, &reply);
762         if (error) {
763             *replyp = NULL;
764             return error;
765         }
766         recv_xid = ((struct ofp_header *) ofpbuf_data(reply))->xid;
767         if (xid == recv_xid) {
768             *replyp = reply;
769             return 0;
770         }
771
772         VLOG_DBG_RL(&bad_ofmsg_rl, "%s: received reply with xid %08"PRIx32
773                     " != expected %08"PRIx32,
774                     vconn->name, ntohl(recv_xid), ntohl(xid));
775         ofpbuf_delete(reply);
776     }
777 }
778
779 /* Sends 'request' to 'vconn' and blocks until it receives a reply with a
780  * matching transaction ID.  Returns 0 if successful, in which case the reply
781  * is stored in '*replyp' for the caller to examine and free.  Otherwise
782  * returns a positive errno value, or EOF, and sets '*replyp' to null.
783  *
784  * 'request' should be an OpenFlow request that requires a reply.  Otherwise,
785  * if there is no reply, this function can end up blocking forever (or until
786  * the peer drops the connection).
787  *
788  * 'request' is always destroyed, regardless of the return value. */
789 int
790 vconn_transact(struct vconn *vconn, struct ofpbuf *request,
791                struct ofpbuf **replyp)
792 {
793     ovs_be32 send_xid = ((struct ofp_header *) ofpbuf_data(request))->xid;
794     int error;
795
796     *replyp = NULL;
797     error = vconn_send_block(vconn, request);
798     if (error) {
799         ofpbuf_delete(request);
800     }
801     return error ? error : vconn_recv_xid(vconn, send_xid, replyp);
802 }
803
804 /* Sends 'request' followed by a barrier request to 'vconn', then blocks until
805  * it receives a reply to the barrier.  If successful, stores the reply to
806  * 'request' in '*replyp', if one was received, and otherwise NULL, then
807  * returns 0.  Otherwise returns a positive errno value, or EOF, and sets
808  * '*replyp' to null.
809  *
810  * This function is useful for sending an OpenFlow request that doesn't
811  * ordinarily include a reply but might report an error in special
812  * circumstances.
813  *
814  * 'request' is always destroyed, regardless of the return value. */
815 int
816 vconn_transact_noreply(struct vconn *vconn, struct ofpbuf *request,
817                        struct ofpbuf **replyp)
818 {
819     ovs_be32 request_xid;
820     ovs_be32 barrier_xid;
821     struct ofpbuf *barrier;
822     int error;
823
824     *replyp = NULL;
825
826     /* Send request. */
827     request_xid = ((struct ofp_header *) ofpbuf_data(request))->xid;
828     error = vconn_send_block(vconn, request);
829     if (error) {
830         ofpbuf_delete(request);
831         return error;
832     }
833
834     /* Send barrier. */
835     barrier = ofputil_encode_barrier_request(vconn_get_version(vconn));
836     barrier_xid = ((struct ofp_header *) ofpbuf_data(barrier))->xid;
837     error = vconn_send_block(vconn, barrier);
838     if (error) {
839         ofpbuf_delete(barrier);
840         return error;
841     }
842
843     for (;;) {
844         struct ofpbuf *msg;
845         ovs_be32 msg_xid;
846         int error;
847
848         error = vconn_recv_block(vconn, &msg);
849         if (error) {
850             ofpbuf_delete(*replyp);
851             *replyp = NULL;
852             return error;
853         }
854
855         msg_xid = ((struct ofp_header *) ofpbuf_data(msg))->xid;
856         if (msg_xid == request_xid) {
857             if (*replyp) {
858                 VLOG_WARN_RL(&bad_ofmsg_rl, "%s: duplicate replies with "
859                              "xid %08"PRIx32, vconn->name, ntohl(msg_xid));
860                 ofpbuf_delete(*replyp);
861             }
862             *replyp = msg;
863         } else {
864             ofpbuf_delete(msg);
865             if (msg_xid == barrier_xid) {
866                 return 0;
867             } else {
868                 VLOG_DBG_RL(&bad_ofmsg_rl, "%s: reply with xid %08"PRIx32
869                             " != expected %08"PRIx32" or %08"PRIx32,
870                             vconn->name, ntohl(msg_xid),
871                             ntohl(request_xid), ntohl(barrier_xid));
872             }
873         }
874     }
875 }
876
877 /* vconn_transact_noreply() for a list of "struct ofpbuf"s, sent one by one.
878  * All of the requests on 'requests' are always destroyed, regardless of the
879  * return value. */
880 int
881 vconn_transact_multiple_noreply(struct vconn *vconn, struct list *requests,
882                                 struct ofpbuf **replyp)
883 {
884     struct ofpbuf *request, *next;
885
886     LIST_FOR_EACH_SAFE (request, next, list_node, requests) {
887         int error;
888
889         list_remove(&request->list_node);
890
891         error = vconn_transact_noreply(vconn, request, replyp);
892         if (error || *replyp) {
893             ofpbuf_list_delete(requests);
894             return error;
895         }
896     }
897
898     *replyp = NULL;
899     return 0;
900 }
901
902 void
903 vconn_wait(struct vconn *vconn, enum vconn_wait_type wait)
904 {
905     ovs_assert(wait == WAIT_CONNECT || wait == WAIT_RECV || wait == WAIT_SEND);
906
907     switch (vconn->state) {
908     case VCS_CONNECTING:
909         wait = WAIT_CONNECT;
910         break;
911
912     case VCS_SEND_HELLO:
913     case VCS_SEND_ERROR:
914         wait = WAIT_SEND;
915         break;
916
917     case VCS_RECV_HELLO:
918         wait = WAIT_RECV;
919         break;
920
921     case VCS_CONNECTED:
922         break;
923
924     case VCS_DISCONNECTED:
925         poll_immediate_wake();
926         return;
927     }
928     (vconn->class->wait)(vconn, wait);
929 }
930
931 void
932 vconn_connect_wait(struct vconn *vconn)
933 {
934     vconn_wait(vconn, WAIT_CONNECT);
935 }
936
937 void
938 vconn_recv_wait(struct vconn *vconn)
939 {
940     vconn_wait(vconn, WAIT_RECV);
941 }
942
943 void
944 vconn_send_wait(struct vconn *vconn)
945 {
946     vconn_wait(vconn, WAIT_SEND);
947 }
948
949 /* Given 'name', a connection name in the form "TYPE:ARGS", stores the class
950  * named "TYPE" into '*classp' and returns 0.  Returns EAFNOSUPPORT and stores
951  * a null pointer into '*classp' if 'name' is in the wrong form or if no such
952  * class exists. */
953 static int
954 pvconn_lookup_class(const char *name, const struct pvconn_class **classp)
955 {
956     size_t prefix_len;
957
958     prefix_len = strcspn(name, ":");
959     if (name[prefix_len] != '\0') {
960         size_t i;
961
962         for (i = 0; i < ARRAY_SIZE(pvconn_classes); i++) {
963             const struct pvconn_class *class = pvconn_classes[i];
964             if (strlen(class->name) == prefix_len
965                 && !memcmp(class->name, name, prefix_len)) {
966                 *classp = class;
967                 return 0;
968             }
969         }
970     }
971
972     *classp = NULL;
973     return EAFNOSUPPORT;
974 }
975
976 /* Returns 0 if 'name' is a connection name in the form "TYPE:ARGS" and TYPE is
977  * a supported connection type, otherwise EAFNOSUPPORT.  */
978 int
979 pvconn_verify_name(const char *name)
980 {
981     const struct pvconn_class *class;
982     return pvconn_lookup_class(name, &class);
983 }
984
985 /* Attempts to start listening for OpenFlow connections.  'name' is a
986  * connection name in the form "TYPE:ARGS", where TYPE is an passive vconn
987  * class's name and ARGS are vconn class-specific.
988  *
989  * vconns accepted by the pvconn will automatically negotiate an OpenFlow
990  * protocol version acceptable to both peers on the connection.  The version
991  * negotiated will be one of those in the 'allowed_versions' bitmap: version
992  * 'x' is allowed if allowed_versions & (1 << x) is nonzero.  If
993  * 'allowed_versions' is zero, then OFPUTIL_DEFAULT_VERSIONS are allowed.
994  *
995  * Returns 0 if successful, otherwise a positive errno value.  If successful,
996  * stores a pointer to the new connection in '*pvconnp', otherwise a null
997  * pointer.  */
998 int
999 pvconn_open(const char *name, uint32_t allowed_versions, uint8_t dscp,
1000             struct pvconn **pvconnp)
1001 {
1002     const struct pvconn_class *class;
1003     struct pvconn *pvconn;
1004     char *suffix_copy;
1005     int error;
1006
1007     check_vconn_classes();
1008
1009     if (!allowed_versions) {
1010         allowed_versions = OFPUTIL_DEFAULT_VERSIONS;
1011     }
1012
1013     /* Look up the class. */
1014     error = pvconn_lookup_class(name, &class);
1015     if (!class) {
1016         goto error;
1017     }
1018
1019     /* Call class's "open" function. */
1020     suffix_copy = xstrdup(strchr(name, ':') + 1);
1021     error = class->listen(name, allowed_versions, suffix_copy, &pvconn, dscp);
1022     free(suffix_copy);
1023     if (error) {
1024         goto error;
1025     }
1026
1027     /* Success. */
1028     *pvconnp = pvconn;
1029     return 0;
1030
1031 error:
1032     *pvconnp = NULL;
1033     return error;
1034 }
1035
1036 /* Returns the name that was used to open 'pvconn'.  The caller must not
1037  * modify or free the name. */
1038 const char *
1039 pvconn_get_name(const struct pvconn *pvconn)
1040 {
1041     return pvconn->name;
1042 }
1043
1044 /* Closes 'pvconn'. */
1045 void
1046 pvconn_close(struct pvconn *pvconn)
1047 {
1048     if (pvconn != NULL) {
1049         char *name = pvconn->name;
1050         (pvconn->class->close)(pvconn);
1051         free(name);
1052     }
1053 }
1054
1055 /* Tries to accept a new connection on 'pvconn'.  If successful, stores the new
1056  * connection in '*new_vconn' and returns 0.  Otherwise, returns a positive
1057  * errno value.
1058  *
1059  * The new vconn will automatically negotiate an OpenFlow protocol version
1060  * acceptable to both peers on the connection.  The version negotiated will be
1061  * no lower than 'min_version' and no higher than 'max_version'.
1062  *
1063  * pvconn_accept() will not block waiting for a connection.  If no connection
1064  * is ready to be accepted, it returns EAGAIN immediately. */
1065 int
1066 pvconn_accept(struct pvconn *pvconn, struct vconn **new_vconn)
1067 {
1068     int retval = (pvconn->class->accept)(pvconn, new_vconn);
1069     if (retval) {
1070         *new_vconn = NULL;
1071     } else {
1072         ovs_assert((*new_vconn)->state != VCS_CONNECTING
1073                    || (*new_vconn)->class->connect);
1074     }
1075     return retval;
1076 }
1077
1078 void
1079 pvconn_wait(struct pvconn *pvconn)
1080 {
1081     (pvconn->class->wait)(pvconn);
1082 }
1083
1084 /* Initializes 'vconn' as a new vconn named 'name', implemented via 'class'.
1085  * The initial connection status, supplied as 'connect_status', is interpreted
1086  * as follows:
1087  *
1088  *      - 0: 'vconn' is connected.  Its 'send' and 'recv' functions may be
1089  *        called in the normal fashion.
1090  *
1091  *      - EAGAIN: 'vconn' is trying to complete a connection.  Its 'connect'
1092  *        function should be called to complete the connection.
1093  *
1094  *      - Other positive errno values indicate that the connection failed with
1095  *        the specified error.
1096  *
1097  * After calling this function, vconn_close() must be used to destroy 'vconn',
1098  * otherwise resources will be leaked.
1099  *
1100  * The caller retains ownership of 'name'. */
1101 void
1102 vconn_init(struct vconn *vconn, const struct vconn_class *class,
1103            int connect_status, const char *name, uint32_t allowed_versions)
1104 {
1105     memset(vconn, 0, sizeof *vconn);
1106     vconn->class = class;
1107     vconn->state = (connect_status == EAGAIN ? VCS_CONNECTING
1108                     : !connect_status ? VCS_SEND_HELLO
1109                     : VCS_DISCONNECTED);
1110     vconn->error = connect_status;
1111     vconn->allowed_versions = allowed_versions;
1112     vconn->name = xstrdup(name);
1113     ovs_assert(vconn->state != VCS_CONNECTING || class->connect);
1114 }
1115
1116 void
1117 pvconn_init(struct pvconn *pvconn, const struct pvconn_class *class,
1118             const char *name, uint32_t allowed_versions)
1119 {
1120     pvconn->class = class;
1121     pvconn->name = xstrdup(name);
1122     pvconn->allowed_versions = allowed_versions;
1123 }