netdev-linux: Introduce netdev_linux_ethtool_set_flag().
[openvswitch] / lib / learning-switch.c
index fc45b04349f035cd436e820d930efffeddb9bacc..b2608629afdfce8d0eb25cdc9c814d516c09264c 100644 (file)
@@ -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: