X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fvconn.c;h=3210923140bb7e625034969e99f8af81c0b22669;hb=fcf78c4ff96920a988b954def9ab054bef672612;hp=2940c114d65e1390940de5462dd539a576e86fc9;hpb=193456d581423f894e57e8463ff5049c0d802f0a;p=openvswitch diff --git a/lib/vconn.c b/lib/vconn.c index 2940c114..32109231 100644 --- a/lib/vconn.c +++ b/lib/vconn.c @@ -128,23 +128,23 @@ vconn_usage(bool active, bool passive, bool bootstrap UNUSED) printf("\n"); if (active) { printf("Active OpenFlow connection methods:\n"); - printf(" tcp:HOST[:PORT] " - "PORT (default: %d) on remote TCP HOST\n", OFP_TCP_PORT); + printf(" tcp:IP[:PORT] " + "PORT (default: %d) at remote IP\n", OFP_TCP_PORT); #ifdef HAVE_OPENSSL - printf(" ssl:HOST[:PORT] " - "SSL PORT (default: %d) on remote HOST\n", OFP_SSL_PORT); + printf(" ssl:IP[:PORT] " + "SSL PORT (default: %d) at remote IP\n", OFP_SSL_PORT); #endif printf(" unix:FILE Unix domain socket named FILE\n"); } 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", @@ -1407,8 +1390,7 @@ normalize_match(struct ofp_match *m) void vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status, - uint32_t remote_ip, uint16_t remote_port, const char *name, - bool reconnectable) + const char *name, bool reconnectable) { vconn->class = class; vconn->state = (connect_status == EAGAIN ? VCS_CONNECTING @@ -1417,14 +1399,26 @@ vconn_init(struct vconn *vconn, struct vconn_class *class, int connect_status, vconn->error = connect_status; vconn->version = -1; vconn->min_version = -1; - vconn->remote_ip = remote_ip; - vconn->remote_port = remote_port; + vconn->remote_ip = 0; + vconn->remote_port = 0; vconn->local_ip = 0; vconn->local_port = 0; vconn->name = xstrdup(name); vconn->reconnectable = reconnectable; } +void +vconn_set_remote_ip(struct vconn *vconn, uint32_t ip) +{ + vconn->remote_ip = ip; +} + +void +vconn_set_remote_port(struct vconn *vconn, uint16_t port) +{ + vconn->remote_port = port; +} + void vconn_set_local_ip(struct vconn *vconn, uint32_t ip) {