X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn.c;h=b11650fbc8b10f5a853bb49631f81d0d47b63ad3;hb=67a78abeeae1a726d46ae475c5834513c7fe291e;hp=a3ce214eb8a46e7c8ad9235b3d2ec7d59f87063d;hpb=8ddb3f376d06374525cea4aa647462d8f520ed78;p=openvswitch diff --git a/lib/vconn.c b/lib/vconn.c index a3ce214e..b11650fb 100644 --- a/lib/vconn.c +++ b/lib/vconn.c @@ -139,12 +139,12 @@ vconn_usage(bool active, bool passive, bool bootstrap UNUSED) if (passive) { printf("Passive OpenFlow connection methods:\n"); - printf(" ptcp:[PORT] " - "listen to TCP PORT (default: %d)\n", + printf(" ptcp:[PORT][:IP] " + "listen to TCP PORT (default: %d) on IP\n", OFP_TCP_PORT); #ifdef HAVE_OPENSSL - printf(" pssl:[PORT] " - "listen for SSL on PORT (default: %d)\n", + printf(" pssl:[PORT][:IP] " + "listen for SSL on PORT (default: %d) on IP\n", OFP_SSL_PORT); #endif printf(" punix:FILE " @@ -364,7 +364,7 @@ vcs_recv_hello(struct vconn *vconn) if (retval != EAGAIN) { vconn->state = VCS_DISCONNECTED; - vconn->error = retval; + vconn->error = retval == EOF ? ECONNRESET : retval; } } @@ -458,10 +458,7 @@ vconn_recv(struct vconn *vconn, struct ofpbuf **msgp) static int do_recv(struct vconn *vconn, struct ofpbuf **msgp) { - int retval; - -again: - retval = (vconn->class->recv)(vconn, msgp); + int retval = (vconn->class->recv)(vconn, msgp); if (!retval) { struct ofp_header *oh; @@ -481,20 +478,6 @@ again: && oh->type != OFPT_VENDOR) { if (vconn->version < 0) { - if (oh->type == OFPT_PACKET_IN - || oh->type == OFPT_FLOW_EXPIRED - || oh->type == OFPT_PORT_STATUS) { - /* The kernel datapath is stateless and doesn't really - * support version negotiation, so it can end up sending - * these asynchronous message before version negotiation - * is complete. Just ignore them. - * - * (After we move OFPT_PORT_STATUS messages from the kernel - * into secchan, we won't get those here, since secchan - * does proper version negotiation.) */ - ofpbuf_delete(*msgp); - goto again; - } VLOG_ERR_RL(&bad_ofmsg_rl, "%s: received OpenFlow message type %"PRIu8" " "before version negotiation complete", @@ -1299,7 +1282,8 @@ check_action(const union ofp_action *a, unsigned int len, int max_ports) break; default: - VLOG_WARN_RL(&bad_ofmsg_rl, "unknown action type %"PRIu16, a->type); + VLOG_WARN_RL(&bad_ofmsg_rl, "unknown action type %"PRIu16, + ntohs(a->type)); return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_BAD_TYPE); } @@ -1427,9 +1411,26 @@ normalize_match(struct ofp_match *m) m->wildcards = htonl(wc); } +/* Initializes 'vconn' as a new vconn named 'name', implemented via 'class'. + * The initial connection status, supplied as 'connect_status', is interpreted + * as follows: + * + * - 0: 'vconn' is connected. Its 'send' and 'recv' functions may be + * called in the normal fashion. + * + * - EAGAIN: 'vconn' is trying to complete a connection. Its 'connect' + * function should be called to complete the connection. + * + * - Other positive errno values indicate that the connection failed with + * the specified error. + * + * After calling this function, vconn_close() must be used to destroy 'vconn', + * otherwise resources will be leaked. + * + * The caller retains ownership of 'name'. */ void vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status, - const char *name, bool reconnectable) + const char *name) { vconn->class = class; vconn->state = (connect_status == EAGAIN ? VCS_CONNECTING @@ -1443,7 +1444,6 @@ vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status, vconn->local_ip = 0; vconn->local_port = 0; vconn->name = xstrdup(name); - vconn->reconnectable = reconnectable; } void