X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Flearning-switch.c;h=ecc5509e60ad63be995f455c209935421c6342a1;hb=9697e4337f8b46dff1ec90678e08e0fbd10eb2ca;hp=fc45b04349f035cd436e820d930efffeddb9bacc;hpb=7286b1e13dbf358ea6071d04b311474208308ad6;p=sliver-openvswitch.git diff --git a/lib/learning-switch.c b/lib/learning-switch.c index fc45b0434..ecc5509e6 100644 --- a/lib/learning-switch.c +++ b/lib/learning-switch.c @@ -106,8 +106,9 @@ lswitch_create(struct rconn *rconn, const struct lswitch_config *cfg) if (cfg->wildcards == UINT32_MAX) { /* Try to wildcard as many fields as possible, but we cannot * wildcard all fields. We need in_port to detect moves. We need - * Ethernet source and dest and VLAN to do L2 learning. */ - ofpfw = (OFPFW_DL_TYPE | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL + * Ethernet source and dest and VLAN VID to do L2 learning. */ + ofpfw = (OFPFW_DL_TYPE | OFPFW_DL_VLAN_PCP + | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL | OFPFW_NW_TOS | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST); } else { @@ -138,10 +139,17 @@ lswitch_create(struct rconn *rconn, const struct lswitch_config *cfg) const struct ofpbuf *b; LIST_FOR_EACH (b, list_node, cfg->default_flows) { - queue_tx(sw, rconn, ofpbuf_clone(b)); + struct ofpbuf *copy = ofpbuf_clone(b); + int error = rconn_send(rconn, copy, NULL); + if (error) { + VLOG_INFO_RL(&rl, "%s: failed to queue default flows (%s)", + rconn_get_name(rconn), strerror(error)); + ofpbuf_delete(copy); + break; + } } } - + return sw; } @@ -217,7 +225,7 @@ lswitch_process_packet(struct lswitch *sw, struct rconn *rconn, /* Nothing to do. */ break; - case OFPUTIL_INVALID: + case OFPUTIL_MSG_INVALID: case OFPUTIL_OFPT_HELLO: case OFPUTIL_OFPT_ERROR: case OFPUTIL_OFPT_ECHO_REPLY: @@ -411,7 +419,7 @@ process_packet_in(struct lswitch *sw, struct rconn *rconn, pkt_ofs = offsetof(struct ofp_packet_in, data); pkt_len = ntohs(opi->header.length) - pkt_ofs; ofpbuf_use_const(&pkt, opi->data, pkt_len); - flow_extract(&pkt, 0, in_port, &flow); + flow_extract(&pkt, 0, 0, in_port, &flow); /* Choose output port. */ out_port = lswitch_choose_destination(sw, &flow);