diff --git a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetwork.java b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetwork.java index a73c72ef7f889bcd8ef2253f4bfdb6d2c81818cf..829be702a36039fcfafa1140c68c6c958dffed2c 100644 --- a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetwork.java +++ b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetwork.java @@ -16,9 +16,9 @@ package net.floodlightcontroller.virtualnetwork; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import net.floodlightcontroller.util.MACAddress; @@ -35,8 +35,7 @@ public class VirtualNetwork{ protected String name; // network name protected String guid; // network id protected String gateway; // network gateway - protected Collection<MACAddress> hosts; // array of hosts explicitly added to this network - + protected Map<String,MACAddress> portToMac; //port's logical namd and the host's mac address connected /** * Constructor requires network name and id * @param name: network name @@ -46,7 +45,7 @@ public class VirtualNetwork{ this.name = name; this.guid = guid; this.gateway = null; - this.hosts = new ArrayList<MACAddress>(); + this.portToMac = new ConcurrentHashMap<String,MACAddress>(); return; } @@ -72,8 +71,8 @@ public class VirtualNetwork{ * Adds a host to this network record * @param host: MAC address as MACAddress */ - public void addHost(MACAddress host){ - this.hosts.add(host); + public void addHost(String port,MACAddress host){ + this.portToMac.put(port,host); // ignore old mapping return; } @@ -83,22 +82,19 @@ public class VirtualNetwork{ * @return boolean: true: removed, false: host not found */ public boolean removeHost(MACAddress host){ - Iterator<MACAddress> iter = this.hosts.iterator(); - while(iter.hasNext()){ - MACAddress element = iter.next(); - if(element.equals(host) ){ - //assuming MAC address for host is unique - iter.remove(); - return true; - } - } - return false; + for (Entry<String,MACAddress> entry : this.portToMac.entrySet()){ + if(entry.getValue().equals(host)){ + this.portToMac.remove(entry.getKey()); + return true; + } + } + return false; } /** * Removes all hosts from this network record */ public void clearHosts(){ - this.hosts.clear(); + this.portToMac.clear(); } -} \ No newline at end of file +} diff --git a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilter.java b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilter.java index 562297bc8cf482ef52c5e4cb1cbb98ffc4e875db..1d64144dcf19a3d9a73fce36b3976f8b7d4cbaec 100644 --- a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilter.java +++ b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilter.java @@ -235,7 +235,7 @@ public class VirtualNetworkFilter macToGuid.put(mac, guid); portToMac.put(port, mac); if(vNetsByGuid.get(guid)!=null) - vNetsByGuid.get(guid).addHost(new MACAddress(mac.toBytes())); + vNetsByGuid.get(guid).addHost(port,new MACAddress(mac.toBytes())); } else { log.warn("Could not add MAC {} to network ID {} on port {}, the network does not exist", new Object[] {mac, guid, port}); @@ -250,9 +250,10 @@ public class VirtualNetworkFilter if (mac == null && port == null) return; if (port != null) { MACAddress host = portToMac.remove(port); - if(vNetsByGuid.get(macToGuid.get(host)) != null) + if(host !=null && vNetsByGuid.get(macToGuid.get(host)) != null) vNetsByGuid.get(macToGuid.get(host)).removeHost(host); - macToGuid.remove(host); + if(host !=null) + macToGuid.remove(host); } else if (mac != null) { if (!portToMac.isEmpty()) { for (Entry<String, MACAddress> entry : portToMac.entrySet()) { diff --git a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkSerializer.java b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkSerializer.java index 6f61b3859a8083838f7a052bb536913f5bc47a5b..190432ab7aeacefcaa89054ecebbb59e26845811 100644 --- a/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkSerializer.java +++ b/src/main/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkSerializer.java @@ -18,6 +18,7 @@ package net.floodlightcontroller.virtualnetwork; import java.io.IOException; import java.util.Iterator; +import java.util.Map.Entry; import net.floodlightcontroller.util.MACAddress; @@ -42,10 +43,15 @@ public class VirtualNetworkSerializer extends JsonSerializer<VirtualNetwork> { jGen.writeStringField("guid", vNet.guid); jGen.writeStringField("gateway", vNet.gateway); - jGen.writeArrayFieldStart("mac"); - Iterator<MACAddress> hit = vNet.hosts.iterator(); - while (hit.hasNext()) - jGen.writeString(hit.next().toString()); + jGen.writeArrayFieldStart("portMac"); + Iterator entries = vNet.portToMac.entrySet().iterator(); + while (entries.hasNext()){ + jGen.writeStartObject(); + Entry entry = (Entry)entries.next(); + jGen.writeStringField("port",entry.getKey().toString()); + jGen.writeStringField("mac",entry.getValue().toString()); + jGen.writeEndObject(); + } jGen.writeEndArray(); jGen.writeEndObject(); diff --git a/src/test/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilterTest.java b/src/test/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilterTest.java index a5ea2cda50d1a75228fffb52f2213f0958ddb688..d8dc143617beb40454ce9b67c7ea1940ea79a8f2 100644 --- a/src/test/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilterTest.java +++ b/src/test/java/net/floodlightcontroller/virtualnetwork/VirtualNetworkFilterTest.java @@ -240,7 +240,7 @@ public class VirtualNetworkFilterTest extends FloodlightTestCase { assertTrue(vns.vNetsByGuid.get(guid1).name.equals(net1)); assertTrue(vns.vNetsByGuid.get(guid1).guid.equals(guid1)); assertTrue(vns.vNetsByGuid.get(guid1).gateway.equals(gw1)); - assertTrue(vns.vNetsByGuid.get(guid1).hosts.size()==0); + assertTrue(vns.vNetsByGuid.get(guid1).portToMac.size()==0); // Test creating network without a gateway vns.createNetwork(guid2, net2, null); @@ -250,7 +250,7 @@ public class VirtualNetworkFilterTest extends FloodlightTestCase { assertTrue(vns.vNetsByGuid.get(guid2).name.equals(net2)); assertTrue(vns.vNetsByGuid.get(guid2).guid.equals(guid2)); assertTrue(vns.vNetsByGuid.get(guid2).gateway == null); - assertTrue(vns.vNetsByGuid.get(guid2).hosts.size()==0); + assertTrue(vns.vNetsByGuid.get(guid2).portToMac.size()==0); // Test creating a network that shares the gateway with net1 vns.createNetwork(guid3, net3, IPv4.toIPv4Address(gw1)); @@ -262,7 +262,7 @@ public class VirtualNetworkFilterTest extends FloodlightTestCase { assertTrue(vns.vNetsByGuid.get(guid3).name.equals(net3)); assertTrue(vns.vNetsByGuid.get(guid3).guid.equals(guid3)); assertTrue(vns.vNetsByGuid.get(guid3).gateway.equals(gw1)); - assertTrue(vns.vNetsByGuid.get(guid3).hosts.size()==0); + assertTrue(vns.vNetsByGuid.get(guid3).portToMac.size()==0); } @@ -310,14 +310,14 @@ public class VirtualNetworkFilterTest extends FloodlightTestCase { vns.addHost(mac1, guid1, hostPort1); assertTrue(vns.macToGuid.get(mac1).equals(guid1)); assertTrue(vns.portToMac.get(hostPort1).equals(mac1)); - assertTrue(vns.vNetsByGuid.get(guid1).hosts.contains(mac1)); + assertTrue(vns.vNetsByGuid.get(guid1).portToMac.containsValue(mac1)); vns.addHost(mac2, guid1, hostPort2); assertTrue(vns.macToGuid.get(mac2).equals(guid1)); assertTrue(vns.portToMac.get(hostPort2).equals(mac2)); - assertTrue(vns.vNetsByGuid.get(guid1).hosts.contains(mac2)); + assertTrue(vns.vNetsByGuid.get(guid1).portToMac.containsValue(mac2)); vns.addHost(mac3, guid3, hostPort3); vns.addHost(mac4, guid3, hostPort4); - assertTrue(vns.vNetsByGuid.get(guid3).hosts.contains(mac4)); + assertTrue(vns.vNetsByGuid.get(guid3).portToMac.containsValue(mac4)); } @Test @@ -328,19 +328,19 @@ public class VirtualNetworkFilterTest extends FloodlightTestCase { vns.deleteHost(mac1, null); assertFalse(vns.macToGuid.containsKey(mac1)); assertFalse(vns.portToMac.containsKey(hostPort1)); - assertFalse(vns.vNetsByGuid.get(host1Guid).hosts.contains(mac1)); + assertFalse(vns.vNetsByGuid.get(host1Guid).portToMac.containsValue(mac1)); String host2Guid = vns.macToGuid.get(vns.portToMac.get(hostPort2)); vns.deleteHost(null, hostPort2); assertFalse(vns.macToGuid.containsKey(mac2)); assertFalse(vns.portToMac.containsKey(hostPort2)); - assertFalse(vns.vNetsByGuid.get(host2Guid).hosts.contains(mac2)); + assertFalse(vns.vNetsByGuid.get(host2Guid).portToMac.containsValue(mac2)); String host3Guid = vns.macToGuid.get(mac3); vns.deleteHost(mac3, hostPort3); assertFalse(vns.macToGuid.containsKey(mac3)); assertFalse(vns.portToMac.containsKey(hostPort3)); - assertFalse(vns.vNetsByGuid.get(host3Guid).hosts.contains(mac3)); + assertFalse(vns.vNetsByGuid.get(host3Guid).portToMac.containsValue(mac3)); }