Revert "Do not send in-band control traffic to the controller."
authorBen Pfaff <blp@nicira.com>
Thu, 4 Sep 2008 20:51:54 +0000 (13:51 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 4 Sep 2008 20:53:26 +0000 (13:53 -0700)
This reverts commit 123301f8b57df7e539478c607d52d21b55e023c0,
because it broke second-hop OpenFlow switches' attempts to connect
to the controller.

Probably re-spin it later, with more testing this time.

secchan/secchan.c

index c8b74bf3c836e67eadba869a6809fc18011e783b..d45c5ea38c829218dbbf4b34450c9b83b1df8c12 100644 (file)
@@ -571,16 +571,6 @@ is_controller_mac(const uint8_t dl_addr[ETH_ADDR_LEN],
     return mac && eth_addr_equals(mac, dl_addr);
 }
 
-static void
-in_band_learn_mac(struct in_band_data *in_band, const struct flow *flow)
-{
-    uint16_t in_port = ntohs(flow->in_port);
-    if (mac_learning_learn(in_band->ml, flow->dl_src, in_port)) {
-        VLOG_DBG_RL(&vrl, "learned that "ETH_ADDR_FMT" is on port %"PRIu16,
-                    ETH_ADDR_ARGS(flow->dl_src), in_port);
-    }
-}
-
 static bool
 in_band_packet_cb(struct relay *r, int half, void *in_band_)
 {
@@ -626,17 +616,30 @@ in_band_packet_cb(struct relay *r, int half, void *in_band_)
     } else if (eth_addr_equals(flow.dl_dst, in_band->mac)) {
         /* Sent to secure channel. */
         out_port = OFPP_LOCAL;
-        in_band_learn_mac(in_band, &flow);
+        if (mac_learning_learn(in_band->ml, flow.dl_src, in_port)) {
+            VLOG_DBG_RL(&vrl, "learned that "ETH_ADDR_FMT" is on port %"PRIu16,
+                        ETH_ADDR_ARGS(flow.dl_src), in_port);
+        }
     } else if (flow.dl_type == htons(ETH_TYPE_ARP)
                && eth_addr_is_broadcast(flow.dl_dst)
                && is_controller_mac(flow.dl_src, in_band)) {
         /* ARP sent by controller. */
         out_port = OFPP_FLOOD;
-    } else if (is_controller_mac(flow.dl_dst, in_band)
-               || is_controller_mac(flow.dl_src, in_band)) {
-        /* Traffic to or from controller.  Switch it by hand. */
-        in_band_learn_mac(in_band, &flow);
+    } else if (is_controller_mac(flow.dl_dst, in_band)) {
+        if (mac_learning_learn(in_band->ml, flow.dl_src, in_port)) {
+            VLOG_DBG_RL(&vrl, "learned that "ETH_ADDR_FMT" is on port %"PRIu16,
+                        ETH_ADDR_ARGS(flow.dl_src), in_port);
+        }
+
         out_port = mac_learning_lookup(in_band->ml, controller_mac);
+        if (in_port != out_port) {
+            return false;
+        }
+
+        /* This is controller traffic that arrived on the controller port.
+         * It will get dropped below. */
+    } else if (is_controller_mac(flow.dl_src, in_band)) {
+        out_port = mac_learning_lookup(in_band->ml, flow.dl_dst);
     } else {
         return false;
     }