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 {
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;
}
/* Nothing to do. */
break;
- case OFPUTIL_INVALID:
+ case OFPUTIL_MSG_INVALID:
case OFPUTIL_OFPT_HELLO:
case OFPUTIL_OFPT_ERROR:
case OFPUTIL_OFPT_ECHO_REPLY:
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);