From a551290bf57dd14abc7f0d98b60c4c39534519ce Mon Sep 17 00:00:00 2001
From: Srinivasan Ramasubramanian <srini@bigswitch.com>
Date: Sun, 1 Apr 2012 11:48:33 -0700
Subject: [PATCH] If the incoming node port is blocked, allow only unicast and
 BDDP packets to continue down the processing chain.

---
 .../internal/DeviceManagerImpl.java            | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
index f69e83ec5..2a121bf31 100755
--- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
+++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java
@@ -821,14 +821,18 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe
         // in this situation.
         short pinPort = pi.getInPort();
         long pinSw = sw.getId();
-        if (eth.getEtherType() != Ethernet.TYPE_BDDP && 
-                topology.isAllowed(pinSw, pinPort) == false) {
-            if (log.isDebugEnabled()) {
-                log.debug("deviceManager: Stopping packet as it is coming" +
-                        "in on a port blocked by higher layer on." + 
-                        "switch ={}, port={}", new Object[] {sw.getStringId(), pinPort});
+        if (topology.isAllowed(pinSw, pinPort) == false) {
+            if (eth.getEtherType() != Ethernet.TYPE_BDDP ||
+                    eth.isMulticast() == false) {
+                return Command.CONTINUE;
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("deviceManager: Stopping packet as it is coming" +
+                            "in on a port blocked by higher layer on." +
+                            "switch ={}, port={}", new Object[] {sw.getStringId(), pinPort});
+                }
+                return Command.STOP;
             }
-            return Command.STOP;
         }
 
         Command ret = Command.CONTINUE;
-- 
GitLab