Speeding up stuff.
HostDescription now passes up just a single IpAddress.
Showing
13 changed files
with
278 additions
and
221 deletions
| ... | @@ -22,8 +22,10 @@ public class SummaryCommand extends AbstractShellCommand { | ... | @@ -22,8 +22,10 @@ public class SummaryCommand extends AbstractShellCommand { |
| 22 | protected void execute() { | 22 | protected void execute() { |
| 23 | TopologyService topologyService = get(TopologyService.class); | 23 | TopologyService topologyService = get(TopologyService.class); |
| 24 | Topology topology = topologyService.currentTopology(); | 24 | Topology topology = topologyService.currentTopology(); |
| 25 | - print("version=%s, nodes=%d, devices=%d, links=%d, hosts=%d, clusters=%s, paths=%d, flows=%d, intents=%d", | 25 | + print("node=%s, version=%s", |
| 26 | - get(CoreService.class).version().toString(), | 26 | + get(ClusterService.class).getLocalNode().ip(), |
| 27 | + get(CoreService.class).version().toString()); | ||
| 28 | + print("nodes=%d, devices=%d, links=%d, hosts=%d, clusters=%s, paths=%d, flows=%d, intents=%d", | ||
| 27 | get(ClusterService.class).getNodes().size(), | 29 | get(ClusterService.class).getNodes().size(), |
| 28 | get(DeviceService.class).getDeviceCount(), | 30 | get(DeviceService.class).getDeviceCount(), |
| 29 | get(LinkService.class).getLinkCount(), | 31 | get(LinkService.class).getLinkCount(), | ... | ... |
| 1 | package org.onlab.onos.net.host; | 1 | package org.onlab.onos.net.host; |
| 2 | 2 | ||
| 3 | -import com.google.common.collect.ImmutableSet; | ||
| 4 | import org.onlab.onos.net.AbstractDescription; | 3 | import org.onlab.onos.net.AbstractDescription; |
| 5 | import org.onlab.onos.net.HostLocation; | 4 | import org.onlab.onos.net.HostLocation; |
| 6 | import org.onlab.onos.net.SparseAnnotations; | 5 | import org.onlab.onos.net.SparseAnnotations; |
| ... | @@ -8,9 +7,6 @@ import org.onlab.packet.IpPrefix; | ... | @@ -8,9 +7,6 @@ import org.onlab.packet.IpPrefix; |
| 8 | import org.onlab.packet.MacAddress; | 7 | import org.onlab.packet.MacAddress; |
| 9 | import org.onlab.packet.VlanId; | 8 | import org.onlab.packet.VlanId; |
| 10 | 9 | ||
| 11 | -import java.util.HashSet; | ||
| 12 | -import java.util.Set; | ||
| 13 | - | ||
| 14 | import static com.google.common.base.MoreObjects.toStringHelper; | 10 | import static com.google.common.base.MoreObjects.toStringHelper; |
| 15 | 11 | ||
| 16 | /** | 12 | /** |
| ... | @@ -22,7 +18,7 @@ public class DefaultHostDescription extends AbstractDescription | ... | @@ -22,7 +18,7 @@ public class DefaultHostDescription extends AbstractDescription |
| 22 | private final MacAddress mac; | 18 | private final MacAddress mac; |
| 23 | private final VlanId vlan; | 19 | private final VlanId vlan; |
| 24 | private final HostLocation location; | 20 | private final HostLocation location; |
| 25 | - private final Set<IpPrefix> ips; | 21 | + private final IpPrefix ip; |
| 26 | 22 | ||
| 27 | /** | 23 | /** |
| 28 | * Creates a host description using the supplied information. | 24 | * Creates a host description using the supplied information. |
| ... | @@ -35,7 +31,7 @@ public class DefaultHostDescription extends AbstractDescription | ... | @@ -35,7 +31,7 @@ public class DefaultHostDescription extends AbstractDescription |
| 35 | public DefaultHostDescription(MacAddress mac, VlanId vlan, | 31 | public DefaultHostDescription(MacAddress mac, VlanId vlan, |
| 36 | HostLocation location, | 32 | HostLocation location, |
| 37 | SparseAnnotations... annotations) { | 33 | SparseAnnotations... annotations) { |
| 38 | - this(mac, vlan, location, new HashSet<IpPrefix>(), annotations); | 34 | + this(mac, vlan, location, null, annotations); |
| 39 | } | 35 | } |
| 40 | 36 | ||
| 41 | /** | 37 | /** |
| ... | @@ -44,17 +40,17 @@ public class DefaultHostDescription extends AbstractDescription | ... | @@ -44,17 +40,17 @@ public class DefaultHostDescription extends AbstractDescription |
| 44 | * @param mac host MAC address | 40 | * @param mac host MAC address |
| 45 | * @param vlan host VLAN identifier | 41 | * @param vlan host VLAN identifier |
| 46 | * @param location host location | 42 | * @param location host location |
| 47 | - * @param ips of host IP addresses | 43 | + * @param ip host IP address |
| 48 | * @param annotations optional key/value annotations map | 44 | * @param annotations optional key/value annotations map |
| 49 | */ | 45 | */ |
| 50 | public DefaultHostDescription(MacAddress mac, VlanId vlan, | 46 | public DefaultHostDescription(MacAddress mac, VlanId vlan, |
| 51 | - HostLocation location, Set<IpPrefix> ips, | 47 | + HostLocation location, IpPrefix ip, |
| 52 | SparseAnnotations... annotations) { | 48 | SparseAnnotations... annotations) { |
| 53 | super(annotations); | 49 | super(annotations); |
| 54 | this.mac = mac; | 50 | this.mac = mac; |
| 55 | this.vlan = vlan; | 51 | this.vlan = vlan; |
| 56 | this.location = location; | 52 | this.location = location; |
| 57 | - this.ips = new HashSet<>(ips); | 53 | + this.ip = ip; |
| 58 | } | 54 | } |
| 59 | 55 | ||
| 60 | @Override | 56 | @Override |
| ... | @@ -73,8 +69,8 @@ public class DefaultHostDescription extends AbstractDescription | ... | @@ -73,8 +69,8 @@ public class DefaultHostDescription extends AbstractDescription |
| 73 | } | 69 | } |
| 74 | 70 | ||
| 75 | @Override | 71 | @Override |
| 76 | - public Set<IpPrefix> ipAddresses() { | 72 | + public IpPrefix ipAddress() { |
| 77 | - return ImmutableSet.copyOf(ips); | 73 | + return ip; |
| 78 | } | 74 | } |
| 79 | 75 | ||
| 80 | @Override | 76 | @Override |
| ... | @@ -83,7 +79,7 @@ public class DefaultHostDescription extends AbstractDescription | ... | @@ -83,7 +79,7 @@ public class DefaultHostDescription extends AbstractDescription |
| 83 | .add("mac", mac) | 79 | .add("mac", mac) |
| 84 | .add("vlan", vlan) | 80 | .add("vlan", vlan) |
| 85 | .add("location", location) | 81 | .add("location", location) |
| 86 | - .add("ipAddresses", ips) | 82 | + .add("ipAddress", ip) |
| 87 | .toString(); | 83 | .toString(); |
| 88 | } | 84 | } |
| 89 | 85 | ... | ... |
| 1 | package org.onlab.onos.net.host; | 1 | package org.onlab.onos.net.host; |
| 2 | 2 | ||
| 3 | -import java.util.Set; | ||
| 4 | - | ||
| 5 | import org.onlab.onos.net.Description; | 3 | import org.onlab.onos.net.Description; |
| 6 | import org.onlab.onos.net.HostLocation; | 4 | import org.onlab.onos.net.HostLocation; |
| 7 | import org.onlab.packet.IpPrefix; | 5 | import org.onlab.packet.IpPrefix; |
| ... | @@ -35,10 +33,10 @@ public interface HostDescription extends Description { | ... | @@ -35,10 +33,10 @@ public interface HostDescription extends Description { |
| 35 | HostLocation location(); | 33 | HostLocation location(); |
| 36 | 34 | ||
| 37 | /** | 35 | /** |
| 38 | - * Returns zero or more IP address(es) associated with this host's MAC. | 36 | + * Returns the IP address associated with this host's MAC. |
| 39 | * | 37 | * |
| 40 | - * @return a set of IP addresses. | 38 | + * @return host IP address |
| 41 | */ | 39 | */ |
| 42 | - Set<IpPrefix> ipAddresses(); | 40 | + IpPrefix ipAddress(); |
| 43 | 41 | ||
| 44 | } | 42 | } | ... | ... |
| ... | @@ -45,15 +45,18 @@ public class AbstractEventAccumulatorTest { | ... | @@ -45,15 +45,18 @@ public class AbstractEventAccumulatorTest { |
| 45 | public void timeTrigger() { | 45 | public void timeTrigger() { |
| 46 | TestAccumulator accumulator = new TestAccumulator(); | 46 | TestAccumulator accumulator = new TestAccumulator(); |
| 47 | accumulator.add(new TestEvent(FOO, "a")); | 47 | accumulator.add(new TestEvent(FOO, "a")); |
| 48 | - delay(40); | 48 | + delay(30); |
| 49 | assertTrue("should not have fired yet", accumulator.batch.isEmpty()); | 49 | assertTrue("should not have fired yet", accumulator.batch.isEmpty()); |
| 50 | accumulator.add(new TestEvent(FOO, "b")); | 50 | accumulator.add(new TestEvent(FOO, "b")); |
| 51 | - delay(40); | 51 | + delay(30); |
| 52 | assertTrue("should not have fired yet", accumulator.batch.isEmpty()); | 52 | assertTrue("should not have fired yet", accumulator.batch.isEmpty()); |
| 53 | accumulator.add(new TestEvent(FOO, "c")); | 53 | accumulator.add(new TestEvent(FOO, "c")); |
| 54 | - delay(40); | 54 | + delay(30); |
| 55 | + assertTrue("should not have fired yet", accumulator.batch.isEmpty()); | ||
| 56 | + accumulator.add(new TestEvent(FOO, "d")); | ||
| 57 | + delay(30); | ||
| 55 | assertFalse("should have fired", accumulator.batch.isEmpty()); | 58 | assertFalse("should have fired", accumulator.batch.isEmpty()); |
| 56 | - assertEquals("incorrect batch", "abc", accumulator.batch); | 59 | + assertEquals("incorrect batch", "abcd", accumulator.batch); |
| 57 | } | 60 | } |
| 58 | 61 | ||
| 59 | @Test | 62 | @Test | ... | ... |
| 1 | package org.onlab.onos.net.host; | 1 | package org.onlab.onos.net.host; |
| 2 | 2 | ||
| 3 | -import static org.junit.Assert.assertEquals; | ||
| 4 | -import static org.junit.Assert.assertTrue; | ||
| 5 | - | ||
| 6 | -import java.util.Set; | ||
| 7 | - | ||
| 8 | import org.junit.Test; | 3 | import org.junit.Test; |
| 9 | import org.onlab.onos.net.DeviceId; | 4 | import org.onlab.onos.net.DeviceId; |
| 10 | import org.onlab.onos.net.HostLocation; | 5 | import org.onlab.onos.net.HostLocation; |
| ... | @@ -13,7 +8,8 @@ import org.onlab.packet.IpPrefix; | ... | @@ -13,7 +8,8 @@ import org.onlab.packet.IpPrefix; |
| 13 | import org.onlab.packet.MacAddress; | 8 | import org.onlab.packet.MacAddress; |
| 14 | import org.onlab.packet.VlanId; | 9 | import org.onlab.packet.VlanId; |
| 15 | 10 | ||
| 16 | -import com.google.common.collect.Sets; | 11 | +import static org.junit.Assert.assertEquals; |
| 12 | +import static org.junit.Assert.assertTrue; | ||
| 17 | 13 | ||
| 18 | /** | 14 | /** |
| 19 | * Test for the default host description. | 15 | * Test for the default host description. |
| ... | @@ -22,24 +18,22 @@ public class DefualtHostDecriptionTest { | ... | @@ -22,24 +18,22 @@ public class DefualtHostDecriptionTest { |
| 22 | 18 | ||
| 23 | private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01"); | 19 | private static final MacAddress MAC = MacAddress.valueOf("00:00:11:00:00:01"); |
| 24 | private static final VlanId VLAN = VlanId.vlanId((short) 10); | 20 | private static final VlanId VLAN = VlanId.vlanId((short) 10); |
| 21 | + private static final IpPrefix IP = IpPrefix.valueOf("10.0.0.1"); | ||
| 22 | + | ||
| 25 | private static final HostLocation LOC = new HostLocation( | 23 | private static final HostLocation LOC = new HostLocation( |
| 26 | - DeviceId.deviceId("of:foo"), | 24 | + DeviceId.deviceId("of:foo"), |
| 27 | - PortNumber.portNumber(100), | 25 | + PortNumber.portNumber(100), |
| 28 | - 123L | 26 | + 123L |
| 29 | - ); | 27 | + ); |
| 30 | - private static final Set<IpPrefix> IPS = Sets.newHashSet( | ||
| 31 | - IpPrefix.valueOf("10.0.0.1"), | ||
| 32 | - IpPrefix.valueOf("10.0.0.2") | ||
| 33 | - ); | ||
| 34 | 28 | ||
| 35 | @Test | 29 | @Test |
| 36 | public void basics() { | 30 | public void basics() { |
| 37 | HostDescription host = | 31 | HostDescription host = |
| 38 | - new DefaultHostDescription(MAC, VLAN, LOC, IPS); | 32 | + new DefaultHostDescription(MAC, VLAN, LOC, IP); |
| 39 | assertEquals("incorrect mac", MAC, host.hwAddress()); | 33 | assertEquals("incorrect mac", MAC, host.hwAddress()); |
| 40 | assertEquals("incorrect vlan", VLAN, host.vlan()); | 34 | assertEquals("incorrect vlan", VLAN, host.vlan()); |
| 41 | assertEquals("incorrect location", LOC, host.location()); | 35 | assertEquals("incorrect location", LOC, host.location()); |
| 42 | - assertTrue("incorrect ip's", IPS.equals(host.ipAddresses())); | 36 | + assertEquals("incorrect ip's", IP, host.ipAddress()); |
| 43 | assertTrue("incorrect toString", host.toString().contains("vlan=10")); | 37 | assertTrue("incorrect toString", host.toString().contains("vlan=10")); |
| 44 | } | 38 | } |
| 45 | 39 | ... | ... |
| ... | @@ -168,7 +168,6 @@ public class HostManager | ... | @@ -168,7 +168,6 @@ public class HostManager |
| 168 | checkNotNull(hostId, HOST_ID_NULL); | 168 | checkNotNull(hostId, HOST_ID_NULL); |
| 169 | HostEvent event = store.removeHost(hostId); | 169 | HostEvent event = store.removeHost(hostId); |
| 170 | if (event != null) { | 170 | if (event != null) { |
| 171 | - log.info("Host {} administratively removed", hostId); | ||
| 172 | post(event); | 171 | post(event); |
| 173 | } | 172 | } |
| 174 | } | 173 | } |
| ... | @@ -214,7 +213,6 @@ public class HostManager | ... | @@ -214,7 +213,6 @@ public class HostManager |
| 214 | HostEvent event = store.createOrUpdateHost(provider().id(), hostId, | 213 | HostEvent event = store.createOrUpdateHost(provider().id(), hostId, |
| 215 | hostDescription); | 214 | hostDescription); |
| 216 | if (event != null) { | 215 | if (event != null) { |
| 217 | - log.debug("Host {} detected", hostId); | ||
| 218 | post(event); | 216 | post(event); |
| 219 | } | 217 | } |
| 220 | } | 218 | } |
| ... | @@ -225,7 +223,6 @@ public class HostManager | ... | @@ -225,7 +223,6 @@ public class HostManager |
| 225 | checkValidity(); | 223 | checkValidity(); |
| 226 | HostEvent event = store.removeHost(hostId); | 224 | HostEvent event = store.removeHost(hostId); |
| 227 | if (event != null) { | 225 | if (event != null) { |
| 228 | - log.debug("Host {} vanished", hostId); | ||
| 229 | post(event); | 226 | post(event); |
| 230 | } | 227 | } |
| 231 | } | 228 | } | ... | ... |
| ... | @@ -58,8 +58,6 @@ public class HostManagerTest { | ... | @@ -58,8 +58,6 @@ public class HostManagerTest { |
| 58 | 58 | ||
| 59 | private static final IpPrefix IP1 = IpPrefix.valueOf("10.0.0.1"); | 59 | private static final IpPrefix IP1 = IpPrefix.valueOf("10.0.0.1"); |
| 60 | private static final IpPrefix IP2 = IpPrefix.valueOf("10.0.0.2"); | 60 | private static final IpPrefix IP2 = IpPrefix.valueOf("10.0.0.2"); |
| 61 | - private static final Set<IpPrefix> IPSET1 = Sets.newHashSet(IP1); | ||
| 62 | - private static final Set<IpPrefix> IPSET2 = Sets.newHashSet(IP2); | ||
| 63 | 61 | ||
| 64 | private static final DeviceId DID1 = DeviceId.deviceId("of:001"); | 62 | private static final DeviceId DID1 = DeviceId.deviceId("of:001"); |
| 65 | private static final DeviceId DID2 = DeviceId.deviceId("of:002"); | 63 | private static final DeviceId DID2 = DeviceId.deviceId("of:002"); |
| ... | @@ -94,14 +92,14 @@ public class HostManagerTest { | ... | @@ -94,14 +92,14 @@ public class HostManagerTest { |
| 94 | provider = new TestHostProvider(); | 92 | provider = new TestHostProvider(); |
| 95 | providerService = registry.register(provider); | 93 | providerService = registry.register(provider); |
| 96 | assertTrue("provider should be registered", | 94 | assertTrue("provider should be registered", |
| 97 | - registry.getProviders().contains(provider.id())); | 95 | + registry.getProviders().contains(provider.id())); |
| 98 | } | 96 | } |
| 99 | 97 | ||
| 100 | @After | 98 | @After |
| 101 | public void tearDown() { | 99 | public void tearDown() { |
| 102 | registry.unregister(provider); | 100 | registry.unregister(provider); |
| 103 | assertFalse("provider should not be registered", | 101 | assertFalse("provider should not be registered", |
| 104 | - registry.getProviders().contains(provider.id())); | 102 | + registry.getProviders().contains(provider.id())); |
| 105 | 103 | ||
| 106 | mgr.removeListener(listener); | 104 | mgr.removeListener(listener); |
| 107 | mgr.deactivate(); | 105 | mgr.deactivate(); |
| ... | @@ -109,8 +107,8 @@ public class HostManagerTest { | ... | @@ -109,8 +107,8 @@ public class HostManagerTest { |
| 109 | } | 107 | } |
| 110 | 108 | ||
| 111 | private void detect(HostId hid, MacAddress mac, VlanId vlan, | 109 | private void detect(HostId hid, MacAddress mac, VlanId vlan, |
| 112 | - HostLocation loc, Set<IpPrefix> ips) { | 110 | + HostLocation loc, IpPrefix ip) { |
| 113 | - HostDescription descr = new DefaultHostDescription(mac, vlan, loc, ips); | 111 | + HostDescription descr = new DefaultHostDescription(mac, vlan, loc, ip); |
| 114 | providerService.hostDetected(hid, descr); | 112 | providerService.hostDetected(hid, descr); |
| 115 | assertNotNull("host should be found", mgr.getHost(hid)); | 113 | assertNotNull("host should be found", mgr.getHost(hid)); |
| 116 | } | 114 | } |
| ... | @@ -130,26 +128,26 @@ public class HostManagerTest { | ... | @@ -130,26 +128,26 @@ public class HostManagerTest { |
| 130 | assertNull("host shouldn't be found", mgr.getHost(HID1)); | 128 | assertNull("host shouldn't be found", mgr.getHost(HID1)); |
| 131 | 129 | ||
| 132 | // host addition | 130 | // host addition |
| 133 | - detect(HID1, MAC1, VLAN1, LOC1, IPSET1); | 131 | + detect(HID1, MAC1, VLAN1, LOC1, IP1); |
| 134 | assertEquals("exactly one should be found", 1, mgr.getHostCount()); | 132 | assertEquals("exactly one should be found", 1, mgr.getHostCount()); |
| 135 | - detect(HID2, MAC2, VLAN2, LOC2, IPSET1); | 133 | + detect(HID2, MAC2, VLAN2, LOC2, IP1); |
| 136 | assertEquals("two hosts should be found", 2, mgr.getHostCount()); | 134 | assertEquals("two hosts should be found", 2, mgr.getHostCount()); |
| 137 | validateEvents(HOST_ADDED, HOST_ADDED); | 135 | validateEvents(HOST_ADDED, HOST_ADDED); |
| 138 | 136 | ||
| 139 | // host motion | 137 | // host motion |
| 140 | - detect(HID1, MAC1, VLAN1, LOC2, IPSET1); | 138 | + detect(HID1, MAC1, VLAN1, LOC2, IP1); |
| 141 | validateEvents(HOST_MOVED); | 139 | validateEvents(HOST_MOVED); |
| 142 | assertEquals("only two hosts should be found", 2, mgr.getHostCount()); | 140 | assertEquals("only two hosts should be found", 2, mgr.getHostCount()); |
| 143 | 141 | ||
| 144 | // host update | 142 | // host update |
| 145 | - detect(HID1, MAC1, VLAN1, LOC2, IPSET2); | 143 | + detect(HID1, MAC1, VLAN1, LOC2, IP2); |
| 146 | validateEvents(HOST_UPDATED); | 144 | validateEvents(HOST_UPDATED); |
| 147 | assertEquals("only two hosts should be found", 2, mgr.getHostCount()); | 145 | assertEquals("only two hosts should be found", 2, mgr.getHostCount()); |
| 148 | } | 146 | } |
| 149 | 147 | ||
| 150 | @Test | 148 | @Test |
| 151 | public void hostVanished() { | 149 | public void hostVanished() { |
| 152 | - detect(HID1, MAC1, VLAN1, LOC1, IPSET1); | 150 | + detect(HID1, MAC1, VLAN1, LOC1, IP1); |
| 153 | providerService.hostVanished(HID1); | 151 | providerService.hostVanished(HID1); |
| 154 | validateEvents(HOST_ADDED, HOST_REMOVED); | 152 | validateEvents(HOST_ADDED, HOST_REMOVED); |
| 155 | 153 | ||
| ... | @@ -157,7 +155,7 @@ public class HostManagerTest { | ... | @@ -157,7 +155,7 @@ public class HostManagerTest { |
| 157 | } | 155 | } |
| 158 | 156 | ||
| 159 | private void validateHosts( | 157 | private void validateHosts( |
| 160 | - String msg, Iterable<Host> hosts, HostId ... ids) { | 158 | + String msg, Iterable<Host> hosts, HostId... ids) { |
| 161 | Set<HostId> hids = Sets.newHashSet(ids); | 159 | Set<HostId> hids = Sets.newHashSet(ids); |
| 162 | for (Host h : hosts) { | 160 | for (Host h : hosts) { |
| 163 | assertTrue(msg, hids.remove(h.id())); | 161 | assertTrue(msg, hids.remove(h.id())); |
| ... | @@ -167,8 +165,8 @@ public class HostManagerTest { | ... | @@ -167,8 +165,8 @@ public class HostManagerTest { |
| 167 | 165 | ||
| 168 | @Test | 166 | @Test |
| 169 | public void getHosts() { | 167 | public void getHosts() { |
| 170 | - detect(HID1, MAC1, VLAN1, LOC1, IPSET1); | 168 | + detect(HID1, MAC1, VLAN1, LOC1, IP1); |
| 171 | - detect(HID2, MAC2, VLAN1, LOC2, IPSET2); | 169 | + detect(HID2, MAC2, VLAN1, LOC2, IP2); |
| 172 | 170 | ||
| 173 | validateHosts("host not properly stored", mgr.getHosts(), HID1, HID2); | 171 | validateHosts("host not properly stored", mgr.getHosts(), HID1, HID2); |
| 174 | validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID1, HID2); | 172 | validateHosts("can't get hosts by VLAN", mgr.getHostsByVlan(VLAN1), HID1, HID2); |
| ... | @@ -210,7 +208,7 @@ public class HostManagerTest { | ... | @@ -210,7 +208,7 @@ public class HostManagerTest { |
| 210 | @Test | 208 | @Test |
| 211 | public void bindAddressesToPort() { | 209 | public void bindAddressesToPort() { |
| 212 | PortAddresses add1 = new PortAddresses(CP1, | 210 | PortAddresses add1 = new PortAddresses(CP1, |
| 213 | - Sets.newHashSet(PREFIX1, PREFIX2), MAC1); | 211 | + Sets.newHashSet(PREFIX1, PREFIX2), MAC1); |
| 214 | 212 | ||
| 215 | mgr.bindAddressesToPort(add1); | 213 | mgr.bindAddressesToPort(add1); |
| 216 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); | 214 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -241,7 +239,7 @@ public class HostManagerTest { | ... | @@ -241,7 +239,7 @@ public class HostManagerTest { |
| 241 | @Test | 239 | @Test |
| 242 | public void unbindAddressesFromPort() { | 240 | public void unbindAddressesFromPort() { |
| 243 | PortAddresses add1 = new PortAddresses(CP1, | 241 | PortAddresses add1 = new PortAddresses(CP1, |
| 244 | - Sets.newHashSet(PREFIX1, PREFIX2), MAC1); | 242 | + Sets.newHashSet(PREFIX1, PREFIX2), MAC1); |
| 245 | 243 | ||
| 246 | mgr.bindAddressesToPort(add1); | 244 | mgr.bindAddressesToPort(add1); |
| 247 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); | 245 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -250,7 +248,7 @@ public class HostManagerTest { | ... | @@ -250,7 +248,7 @@ public class HostManagerTest { |
| 250 | assertNotNull(storedAddresses.mac()); | 248 | assertNotNull(storedAddresses.mac()); |
| 251 | 249 | ||
| 252 | PortAddresses rem1 = new PortAddresses(CP1, | 250 | PortAddresses rem1 = new PortAddresses(CP1, |
| 253 | - Sets.newHashSet(PREFIX1), null); | 251 | + Sets.newHashSet(PREFIX1), null); |
| 254 | 252 | ||
| 255 | mgr.unbindAddressesFromPort(rem1); | 253 | mgr.unbindAddressesFromPort(rem1); |
| 256 | storedAddresses = mgr.getAddressBindingsForPort(CP1); | 254 | storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -267,7 +265,7 @@ public class HostManagerTest { | ... | @@ -267,7 +265,7 @@ public class HostManagerTest { |
| 267 | assertNull(storedAddresses.mac()); | 265 | assertNull(storedAddresses.mac()); |
| 268 | 266 | ||
| 269 | PortAddresses rem3 = new PortAddresses(CP1, | 267 | PortAddresses rem3 = new PortAddresses(CP1, |
| 270 | - Sets.newHashSet(PREFIX2), MAC1); | 268 | + Sets.newHashSet(PREFIX2), MAC1); |
| 271 | 269 | ||
| 272 | mgr.unbindAddressesFromPort(rem3); | 270 | mgr.unbindAddressesFromPort(rem3); |
| 273 | storedAddresses = mgr.getAddressBindingsForPort(CP1); | 271 | storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -279,7 +277,7 @@ public class HostManagerTest { | ... | @@ -279,7 +277,7 @@ public class HostManagerTest { |
| 279 | @Test | 277 | @Test |
| 280 | public void clearAddresses() { | 278 | public void clearAddresses() { |
| 281 | PortAddresses add1 = new PortAddresses(CP1, | 279 | PortAddresses add1 = new PortAddresses(CP1, |
| 282 | - Sets.newHashSet(PREFIX1, PREFIX2), MAC1); | 280 | + Sets.newHashSet(PREFIX1, PREFIX2), MAC1); |
| 283 | 281 | ||
| 284 | mgr.bindAddressesToPort(add1); | 282 | mgr.bindAddressesToPort(add1); |
| 285 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); | 283 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -297,7 +295,7 @@ public class HostManagerTest { | ... | @@ -297,7 +295,7 @@ public class HostManagerTest { |
| 297 | @Test | 295 | @Test |
| 298 | public void getAddressBindingsForPort() { | 296 | public void getAddressBindingsForPort() { |
| 299 | PortAddresses add1 = new PortAddresses(CP1, | 297 | PortAddresses add1 = new PortAddresses(CP1, |
| 300 | - Sets.newHashSet(PREFIX1, PREFIX2), MAC1); | 298 | + Sets.newHashSet(PREFIX1, PREFIX2), MAC1); |
| 301 | 299 | ||
| 302 | mgr.bindAddressesToPort(add1); | 300 | mgr.bindAddressesToPort(add1); |
| 303 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); | 301 | PortAddresses storedAddresses = mgr.getAddressBindingsForPort(CP1); |
| ... | @@ -314,7 +312,7 @@ public class HostManagerTest { | ... | @@ -314,7 +312,7 @@ public class HostManagerTest { |
| 314 | assertTrue(storedAddresses.isEmpty()); | 312 | assertTrue(storedAddresses.isEmpty()); |
| 315 | 313 | ||
| 316 | PortAddresses add1 = new PortAddresses(CP1, | 314 | PortAddresses add1 = new PortAddresses(CP1, |
| 317 | - Sets.newHashSet(PREFIX1, PREFIX2), MAC1); | 315 | + Sets.newHashSet(PREFIX1, PREFIX2), MAC1); |
| 318 | 316 | ||
| 319 | mgr.bindAddressesToPort(add1); | 317 | mgr.bindAddressesToPort(add1); |
| 320 | 318 | ||
| ... | @@ -323,7 +321,7 @@ public class HostManagerTest { | ... | @@ -323,7 +321,7 @@ public class HostManagerTest { |
| 323 | assertTrue(storedAddresses.size() == 1); | 321 | assertTrue(storedAddresses.size() == 1); |
| 324 | 322 | ||
| 325 | PortAddresses add2 = new PortAddresses(CP2, | 323 | PortAddresses add2 = new PortAddresses(CP2, |
| 326 | - Sets.newHashSet(PREFIX3), MAC2); | 324 | + Sets.newHashSet(PREFIX3), MAC2); |
| 327 | 325 | ||
| 328 | mgr.bindAddressesToPort(add2); | 326 | mgr.bindAddressesToPort(add2); |
| 329 | 327 | ... | ... |
| 1 | package org.onlab.onos.store.host.impl; | 1 | package org.onlab.onos.store.host.impl; |
| 2 | 2 | ||
| 3 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED; | 3 | +import com.google.common.collect.HashMultimap; |
| 4 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED; | 4 | +import com.google.common.collect.ImmutableSet; |
| 5 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED; | 5 | +import com.google.common.collect.Multimap; |
| 6 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED; | 6 | +import com.google.common.collect.Sets; |
| 7 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 8 | - | ||
| 9 | -import java.util.Collections; | ||
| 10 | -import java.util.HashSet; | ||
| 11 | -import java.util.Map; | ||
| 12 | -import java.util.Set; | ||
| 13 | -import java.util.concurrent.ConcurrentHashMap; | ||
| 14 | - | ||
| 15 | import org.apache.felix.scr.annotations.Activate; | 7 | import org.apache.felix.scr.annotations.Activate; |
| 16 | import org.apache.felix.scr.annotations.Component; | 8 | import org.apache.felix.scr.annotations.Component; |
| 17 | import org.apache.felix.scr.annotations.Deactivate; | 9 | import org.apache.felix.scr.annotations.Deactivate; |
| 18 | import org.apache.felix.scr.annotations.Service; | 10 | import org.apache.felix.scr.annotations.Service; |
| 11 | +import org.onlab.onos.net.Annotations; | ||
| 19 | import org.onlab.onos.net.ConnectPoint; | 12 | import org.onlab.onos.net.ConnectPoint; |
| 20 | import org.onlab.onos.net.DefaultHost; | 13 | import org.onlab.onos.net.DefaultHost; |
| 21 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
| 22 | import org.onlab.onos.net.Host; | 15 | import org.onlab.onos.net.Host; |
| 23 | import org.onlab.onos.net.HostId; | 16 | import org.onlab.onos.net.HostId; |
| 17 | +import org.onlab.onos.net.HostLocation; | ||
| 24 | import org.onlab.onos.net.host.HostDescription; | 18 | import org.onlab.onos.net.host.HostDescription; |
| 25 | import org.onlab.onos.net.host.HostEvent; | 19 | import org.onlab.onos.net.host.HostEvent; |
| 26 | import org.onlab.onos.net.host.HostStore; | 20 | import org.onlab.onos.net.host.HostStore; |
| ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; | ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; |
| 33 | import org.onlab.packet.VlanId; | 27 | import org.onlab.packet.VlanId; |
| 34 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
| 35 | 29 | ||
| 36 | -import com.google.common.collect.HashMultimap; | 30 | +import java.util.HashSet; |
| 37 | -import com.google.common.collect.ImmutableSet; | 31 | +import java.util.Map; |
| 38 | -import com.google.common.collect.Multimap; | 32 | +import java.util.Set; |
| 39 | -import com.google.common.collect.Sets; | 33 | +import java.util.concurrent.ConcurrentHashMap; |
| 34 | + | ||
| 35 | +import static org.onlab.onos.net.host.HostEvent.Type.*; | ||
| 36 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 40 | 37 | ||
| 41 | /** | 38 | /** |
| 42 | * Manages inventory of end-station hosts using trivial in-memory | 39 | * Manages inventory of end-station hosts using trivial in-memory |
| ... | @@ -46,13 +43,13 @@ import com.google.common.collect.Sets; | ... | @@ -46,13 +43,13 @@ import com.google.common.collect.Sets; |
| 46 | @Component(immediate = true) | 43 | @Component(immediate = true) |
| 47 | @Service | 44 | @Service |
| 48 | public class DistributedHostStore | 45 | public class DistributedHostStore |
| 49 | -extends AbstractStore<HostEvent, HostStoreDelegate> | 46 | + extends AbstractStore<HostEvent, HostStoreDelegate> |
| 50 | -implements HostStore { | 47 | + implements HostStore { |
| 51 | 48 | ||
| 52 | private final Logger log = getLogger(getClass()); | 49 | private final Logger log = getLogger(getClass()); |
| 53 | 50 | ||
| 54 | // Host inventory | 51 | // Host inventory |
| 55 | - private final Map<HostId, Host> hosts = new ConcurrentHashMap<>(); | 52 | + private final Map<HostId, StoredHost> hosts = new ConcurrentHashMap<>(2000000, 0.75f, 16); |
| 56 | 53 | ||
| 57 | // Hosts tracked by their location | 54 | // Hosts tracked by their location |
| 58 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); | 55 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); |
| ... | @@ -72,8 +69,8 @@ implements HostStore { | ... | @@ -72,8 +69,8 @@ implements HostStore { |
| 72 | 69 | ||
| 73 | @Override | 70 | @Override |
| 74 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, | 71 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, |
| 75 | - HostDescription hostDescription) { | 72 | + HostDescription hostDescription) { |
| 76 | - Host host = hosts.get(hostId); | 73 | + StoredHost host = hosts.get(hostId); |
| 77 | if (host == null) { | 74 | if (host == null) { |
| 78 | return createHost(providerId, hostId, hostDescription); | 75 | return createHost(providerId, hostId, hostDescription); |
| 79 | } | 76 | } |
| ... | @@ -82,12 +79,12 @@ implements HostStore { | ... | @@ -82,12 +79,12 @@ implements HostStore { |
| 82 | 79 | ||
| 83 | // creates a new host and sends HOST_ADDED | 80 | // creates a new host and sends HOST_ADDED |
| 84 | private HostEvent createHost(ProviderId providerId, HostId hostId, | 81 | private HostEvent createHost(ProviderId providerId, HostId hostId, |
| 85 | - HostDescription descr) { | 82 | + HostDescription descr) { |
| 86 | - DefaultHost newhost = new DefaultHost(providerId, hostId, | 83 | + StoredHost newhost = new StoredHost(providerId, hostId, |
| 87 | - descr.hwAddress(), | 84 | + descr.hwAddress(), |
| 88 | - descr.vlan(), | 85 | + descr.vlan(), |
| 89 | - descr.location(), | 86 | + descr.location(), |
| 90 | - descr.ipAddresses()); | 87 | + ImmutableSet.of(descr.ipAddress())); |
| 91 | synchronized (this) { | 88 | synchronized (this) { |
| 92 | hosts.put(hostId, newhost); | 89 | hosts.put(hostId, newhost); |
| 93 | locations.put(descr.location(), newhost); | 90 | locations.put(descr.location(), newhost); |
| ... | @@ -96,28 +93,24 @@ implements HostStore { | ... | @@ -96,28 +93,24 @@ implements HostStore { |
| 96 | } | 93 | } |
| 97 | 94 | ||
| 98 | // checks for type of update to host, sends appropriate event | 95 | // checks for type of update to host, sends appropriate event |
| 99 | - private HostEvent updateHost(ProviderId providerId, Host host, | 96 | + private HostEvent updateHost(ProviderId providerId, StoredHost host, |
| 100 | - HostDescription descr) { | 97 | + HostDescription descr) { |
| 101 | - DefaultHost updated; | ||
| 102 | HostEvent event; | 98 | HostEvent event; |
| 103 | if (!host.location().equals(descr.location())) { | 99 | if (!host.location().equals(descr.location())) { |
| 104 | - updated = new DefaultHost(providerId, host.id(), | 100 | + host.setLocation(descr.location()); |
| 105 | - host.mac(), | 101 | + return new HostEvent(HOST_MOVED, host); |
| 106 | - host.vlan(), | 102 | + } |
| 107 | - descr.location(), | 103 | + |
| 108 | - host.ipAddresses()); | 104 | + if (host.ipAddresses().contains(descr.ipAddress())) { |
| 109 | - event = new HostEvent(HOST_MOVED, updated); | ||
| 110 | - | ||
| 111 | - } else if (!(host.ipAddresses().equals(descr.ipAddresses()))) { | ||
| 112 | - updated = new DefaultHost(providerId, host.id(), | ||
| 113 | - host.mac(), | ||
| 114 | - host.vlan(), | ||
| 115 | - descr.location(), | ||
| 116 | - descr.ipAddresses()); | ||
| 117 | - event = new HostEvent(HOST_UPDATED, updated); | ||
| 118 | - } else { | ||
| 119 | return null; | 105 | return null; |
| 120 | } | 106 | } |
| 107 | + | ||
| 108 | + Set<IpPrefix> addresses = new HashSet<>(host.ipAddresses()); | ||
| 109 | + addresses.add(descr.ipAddress()); | ||
| 110 | + StoredHost updated = new StoredHost(providerId, host.id(), | ||
| 111 | + host.mac(), host.vlan(), | ||
| 112 | + descr.location(), addresses); | ||
| 113 | + event = new HostEvent(HOST_UPDATED, updated); | ||
| 121 | synchronized (this) { | 114 | synchronized (this) { |
| 122 | hosts.put(host.id(), updated); | 115 | hosts.put(host.id(), updated); |
| 123 | locations.remove(host.location(), host); | 116 | locations.remove(host.location(), host); |
| ... | @@ -145,7 +138,7 @@ implements HostStore { | ... | @@ -145,7 +138,7 @@ implements HostStore { |
| 145 | 138 | ||
| 146 | @Override | 139 | @Override |
| 147 | public Iterable<Host> getHosts() { | 140 | public Iterable<Host> getHosts() { |
| 148 | - return Collections.unmodifiableSet(new HashSet<>(hosts.values())); | 141 | + return ImmutableSet.<Host>copyOf(hosts.values()); |
| 149 | } | 142 | } |
| 150 | 143 | ||
| 151 | @Override | 144 | @Override |
| ... | @@ -275,4 +268,35 @@ implements HostStore { | ... | @@ -275,4 +268,35 @@ implements HostStore { |
| 275 | return addresses; | 268 | return addresses; |
| 276 | } | 269 | } |
| 277 | 270 | ||
| 271 | + // Auxiliary extension to allow location to mutate. | ||
| 272 | + private class StoredHost extends DefaultHost { | ||
| 273 | + private HostLocation location; | ||
| 274 | + | ||
| 275 | + /** | ||
| 276 | + * Creates an end-station host using the supplied information. | ||
| 277 | + * | ||
| 278 | + * @param providerId provider identity | ||
| 279 | + * @param id host identifier | ||
| 280 | + * @param mac host MAC address | ||
| 281 | + * @param vlan host VLAN identifier | ||
| 282 | + * @param location host location | ||
| 283 | + * @param ips host IP addresses | ||
| 284 | + * @param annotations optional key/value annotations | ||
| 285 | + */ | ||
| 286 | + public StoredHost(ProviderId providerId, HostId id, | ||
| 287 | + MacAddress mac, VlanId vlan, HostLocation location, | ||
| 288 | + Set<IpPrefix> ips, Annotations... annotations) { | ||
| 289 | + super(providerId, id, mac, vlan, location, ips, annotations); | ||
| 290 | + this.location = location; | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + void setLocation(HostLocation location) { | ||
| 294 | + this.location = location; | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | + @Override | ||
| 298 | + public HostLocation location() { | ||
| 299 | + return location; | ||
| 300 | + } | ||
| 301 | + } | ||
| 278 | } | 302 | } | ... | ... |
| 1 | package org.onlab.onos.store.host.impl; | 1 | package org.onlab.onos.store.host.impl; |
| 2 | 2 | ||
| 3 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED; | 3 | +import com.google.common.collect.HashMultimap; |
| 4 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED; | 4 | +import com.google.common.collect.ImmutableSet; |
| 5 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED; | 5 | +import com.google.common.collect.Multimap; |
| 6 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED; | 6 | +import com.google.common.collect.Sets; |
| 7 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 8 | - | ||
| 9 | -import java.util.Collections; | ||
| 10 | -import java.util.HashSet; | ||
| 11 | -import java.util.Map; | ||
| 12 | -import java.util.Set; | ||
| 13 | -import java.util.concurrent.ConcurrentHashMap; | ||
| 14 | - | ||
| 15 | import org.apache.felix.scr.annotations.Activate; | 7 | import org.apache.felix.scr.annotations.Activate; |
| 16 | import org.apache.felix.scr.annotations.Component; | 8 | import org.apache.felix.scr.annotations.Component; |
| 17 | import org.apache.felix.scr.annotations.Deactivate; | 9 | import org.apache.felix.scr.annotations.Deactivate; |
| 18 | import org.apache.felix.scr.annotations.Service; | 10 | import org.apache.felix.scr.annotations.Service; |
| 11 | +import org.onlab.onos.net.Annotations; | ||
| 19 | import org.onlab.onos.net.ConnectPoint; | 12 | import org.onlab.onos.net.ConnectPoint; |
| 20 | import org.onlab.onos.net.DefaultHost; | 13 | import org.onlab.onos.net.DefaultHost; |
| 21 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
| 22 | import org.onlab.onos.net.Host; | 15 | import org.onlab.onos.net.Host; |
| 23 | import org.onlab.onos.net.HostId; | 16 | import org.onlab.onos.net.HostId; |
| 17 | +import org.onlab.onos.net.HostLocation; | ||
| 24 | import org.onlab.onos.net.host.HostDescription; | 18 | import org.onlab.onos.net.host.HostDescription; |
| 25 | import org.onlab.onos.net.host.HostEvent; | 19 | import org.onlab.onos.net.host.HostEvent; |
| 26 | import org.onlab.onos.net.host.HostStore; | 20 | import org.onlab.onos.net.host.HostStore; |
| ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; | ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; |
| 33 | import org.onlab.packet.VlanId; | 27 | import org.onlab.packet.VlanId; |
| 34 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
| 35 | 29 | ||
| 36 | -import com.google.common.collect.HashMultimap; | 30 | +import java.util.HashSet; |
| 37 | -import com.google.common.collect.ImmutableSet; | 31 | +import java.util.Map; |
| 38 | -import com.google.common.collect.Multimap; | 32 | +import java.util.Set; |
| 39 | -import com.google.common.collect.Sets; | 33 | +import java.util.concurrent.ConcurrentHashMap; |
| 34 | + | ||
| 35 | +import static org.onlab.onos.net.host.HostEvent.Type.*; | ||
| 36 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 40 | 37 | ||
| 41 | /** | 38 | /** |
| 42 | * TEMPORARY: Manages inventory of end-station hosts using distributed | 39 | * TEMPORARY: Manages inventory of end-station hosts using distributed |
| ... | @@ -46,13 +43,13 @@ import com.google.common.collect.Sets; | ... | @@ -46,13 +43,13 @@ import com.google.common.collect.Sets; |
| 46 | @Component(immediate = true) | 43 | @Component(immediate = true) |
| 47 | @Service | 44 | @Service |
| 48 | public class DistributedHostStore | 45 | public class DistributedHostStore |
| 49 | -extends AbstractStore<HostEvent, HostStoreDelegate> | 46 | + extends AbstractStore<HostEvent, HostStoreDelegate> |
| 50 | -implements HostStore { | 47 | + implements HostStore { |
| 51 | 48 | ||
| 52 | private final Logger log = getLogger(getClass()); | 49 | private final Logger log = getLogger(getClass()); |
| 53 | 50 | ||
| 54 | // Host inventory | 51 | // Host inventory |
| 55 | - private final Map<HostId, Host> hosts = new ConcurrentHashMap<>(); | 52 | + private final Map<HostId, StoredHost> hosts = new ConcurrentHashMap<>(2000000, 0.75f, 16); |
| 56 | 53 | ||
| 57 | // Hosts tracked by their location | 54 | // Hosts tracked by their location |
| 58 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); | 55 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); |
| ... | @@ -72,8 +69,8 @@ implements HostStore { | ... | @@ -72,8 +69,8 @@ implements HostStore { |
| 72 | 69 | ||
| 73 | @Override | 70 | @Override |
| 74 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, | 71 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, |
| 75 | - HostDescription hostDescription) { | 72 | + HostDescription hostDescription) { |
| 76 | - Host host = hosts.get(hostId); | 73 | + StoredHost host = hosts.get(hostId); |
| 77 | if (host == null) { | 74 | if (host == null) { |
| 78 | return createHost(providerId, hostId, hostDescription); | 75 | return createHost(providerId, hostId, hostDescription); |
| 79 | } | 76 | } |
| ... | @@ -82,12 +79,12 @@ implements HostStore { | ... | @@ -82,12 +79,12 @@ implements HostStore { |
| 82 | 79 | ||
| 83 | // creates a new host and sends HOST_ADDED | 80 | // creates a new host and sends HOST_ADDED |
| 84 | private HostEvent createHost(ProviderId providerId, HostId hostId, | 81 | private HostEvent createHost(ProviderId providerId, HostId hostId, |
| 85 | - HostDescription descr) { | 82 | + HostDescription descr) { |
| 86 | - DefaultHost newhost = new DefaultHost(providerId, hostId, | 83 | + StoredHost newhost = new StoredHost(providerId, hostId, |
| 87 | - descr.hwAddress(), | 84 | + descr.hwAddress(), |
| 88 | - descr.vlan(), | 85 | + descr.vlan(), |
| 89 | - descr.location(), | 86 | + descr.location(), |
| 90 | - descr.ipAddresses()); | 87 | + ImmutableSet.of(descr.ipAddress())); |
| 91 | synchronized (this) { | 88 | synchronized (this) { |
| 92 | hosts.put(hostId, newhost); | 89 | hosts.put(hostId, newhost); |
| 93 | locations.put(descr.location(), newhost); | 90 | locations.put(descr.location(), newhost); |
| ... | @@ -96,28 +93,24 @@ implements HostStore { | ... | @@ -96,28 +93,24 @@ implements HostStore { |
| 96 | } | 93 | } |
| 97 | 94 | ||
| 98 | // checks for type of update to host, sends appropriate event | 95 | // checks for type of update to host, sends appropriate event |
| 99 | - private HostEvent updateHost(ProviderId providerId, Host host, | 96 | + private HostEvent updateHost(ProviderId providerId, StoredHost host, |
| 100 | - HostDescription descr) { | 97 | + HostDescription descr) { |
| 101 | - DefaultHost updated; | ||
| 102 | HostEvent event; | 98 | HostEvent event; |
| 103 | if (!host.location().equals(descr.location())) { | 99 | if (!host.location().equals(descr.location())) { |
| 104 | - updated = new DefaultHost(providerId, host.id(), | 100 | + host.setLocation(descr.location()); |
| 105 | - host.mac(), | 101 | + return new HostEvent(HOST_MOVED, host); |
| 106 | - host.vlan(), | 102 | + } |
| 107 | - descr.location(), | 103 | + |
| 108 | - host.ipAddresses()); | 104 | + if (host.ipAddresses().contains(descr.ipAddress())) { |
| 109 | - event = new HostEvent(HOST_MOVED, updated); | ||
| 110 | - | ||
| 111 | - } else if (!(host.ipAddresses().equals(descr.ipAddresses()))) { | ||
| 112 | - updated = new DefaultHost(providerId, host.id(), | ||
| 113 | - host.mac(), | ||
| 114 | - host.vlan(), | ||
| 115 | - descr.location(), | ||
| 116 | - descr.ipAddresses()); | ||
| 117 | - event = new HostEvent(HOST_UPDATED, updated); | ||
| 118 | - } else { | ||
| 119 | return null; | 105 | return null; |
| 120 | } | 106 | } |
| 107 | + | ||
| 108 | + Set<IpPrefix> addresses = new HashSet<>(host.ipAddresses()); | ||
| 109 | + addresses.add(descr.ipAddress()); | ||
| 110 | + StoredHost updated = new StoredHost(providerId, host.id(), | ||
| 111 | + host.mac(), host.vlan(), | ||
| 112 | + descr.location(), addresses); | ||
| 113 | + event = new HostEvent(HOST_UPDATED, updated); | ||
| 121 | synchronized (this) { | 114 | synchronized (this) { |
| 122 | hosts.put(host.id(), updated); | 115 | hosts.put(host.id(), updated); |
| 123 | locations.remove(host.location(), host); | 116 | locations.remove(host.location(), host); |
| ... | @@ -145,7 +138,7 @@ implements HostStore { | ... | @@ -145,7 +138,7 @@ implements HostStore { |
| 145 | 138 | ||
| 146 | @Override | 139 | @Override |
| 147 | public Iterable<Host> getHosts() { | 140 | public Iterable<Host> getHosts() { |
| 148 | - return Collections.unmodifiableSet(new HashSet<>(hosts.values())); | 141 | + return ImmutableSet.<Host>copyOf(hosts.values()); |
| 149 | } | 142 | } |
| 150 | 143 | ||
| 151 | @Override | 144 | @Override |
| ... | @@ -275,4 +268,35 @@ implements HostStore { | ... | @@ -275,4 +268,35 @@ implements HostStore { |
| 275 | return addresses; | 268 | return addresses; |
| 276 | } | 269 | } |
| 277 | 270 | ||
| 271 | + // Auxiliary extension to allow location to mutate. | ||
| 272 | + private class StoredHost extends DefaultHost { | ||
| 273 | + private HostLocation location; | ||
| 274 | + | ||
| 275 | + /** | ||
| 276 | + * Creates an end-station host using the supplied information. | ||
| 277 | + * | ||
| 278 | + * @param providerId provider identity | ||
| 279 | + * @param id host identifier | ||
| 280 | + * @param mac host MAC address | ||
| 281 | + * @param vlan host VLAN identifier | ||
| 282 | + * @param location host location | ||
| 283 | + * @param ips host IP addresses | ||
| 284 | + * @param annotations optional key/value annotations | ||
| 285 | + */ | ||
| 286 | + public StoredHost(ProviderId providerId, HostId id, | ||
| 287 | + MacAddress mac, VlanId vlan, HostLocation location, | ||
| 288 | + Set<IpPrefix> ips, Annotations... annotations) { | ||
| 289 | + super(providerId, id, mac, vlan, location, ips, annotations); | ||
| 290 | + this.location = location; | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + void setLocation(HostLocation location) { | ||
| 294 | + this.location = location; | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | + @Override | ||
| 298 | + public HostLocation location() { | ||
| 299 | + return location; | ||
| 300 | + } | ||
| 301 | + } | ||
| 278 | } | 302 | } | ... | ... |
| 1 | package org.onlab.onos.store.trivial.impl; | 1 | package org.onlab.onos.store.trivial.impl; |
| 2 | 2 | ||
| 3 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_ADDED; | 3 | +import com.google.common.collect.HashMultimap; |
| 4 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_MOVED; | 4 | +import com.google.common.collect.ImmutableSet; |
| 5 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_REMOVED; | 5 | +import com.google.common.collect.Multimap; |
| 6 | -import static org.onlab.onos.net.host.HostEvent.Type.HOST_UPDATED; | 6 | +import com.google.common.collect.Sets; |
| 7 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 8 | - | ||
| 9 | -import java.util.Collections; | ||
| 10 | -import java.util.HashSet; | ||
| 11 | -import java.util.Map; | ||
| 12 | -import java.util.Set; | ||
| 13 | -import java.util.concurrent.ConcurrentHashMap; | ||
| 14 | - | ||
| 15 | import org.apache.felix.scr.annotations.Activate; | 7 | import org.apache.felix.scr.annotations.Activate; |
| 16 | import org.apache.felix.scr.annotations.Component; | 8 | import org.apache.felix.scr.annotations.Component; |
| 17 | import org.apache.felix.scr.annotations.Deactivate; | 9 | import org.apache.felix.scr.annotations.Deactivate; |
| 18 | import org.apache.felix.scr.annotations.Service; | 10 | import org.apache.felix.scr.annotations.Service; |
| 11 | +import org.onlab.onos.net.Annotations; | ||
| 19 | import org.onlab.onos.net.ConnectPoint; | 12 | import org.onlab.onos.net.ConnectPoint; |
| 20 | import org.onlab.onos.net.DefaultHost; | 13 | import org.onlab.onos.net.DefaultHost; |
| 21 | import org.onlab.onos.net.DeviceId; | 14 | import org.onlab.onos.net.DeviceId; |
| 22 | import org.onlab.onos.net.Host; | 15 | import org.onlab.onos.net.Host; |
| 23 | import org.onlab.onos.net.HostId; | 16 | import org.onlab.onos.net.HostId; |
| 17 | +import org.onlab.onos.net.HostLocation; | ||
| 24 | import org.onlab.onos.net.host.HostDescription; | 18 | import org.onlab.onos.net.host.HostDescription; |
| 25 | import org.onlab.onos.net.host.HostEvent; | 19 | import org.onlab.onos.net.host.HostEvent; |
| 26 | import org.onlab.onos.net.host.HostStore; | 20 | import org.onlab.onos.net.host.HostStore; |
| ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; | ... | @@ -33,10 +27,13 @@ import org.onlab.packet.MacAddress; |
| 33 | import org.onlab.packet.VlanId; | 27 | import org.onlab.packet.VlanId; |
| 34 | import org.slf4j.Logger; | 28 | import org.slf4j.Logger; |
| 35 | 29 | ||
| 36 | -import com.google.common.collect.HashMultimap; | 30 | +import java.util.HashSet; |
| 37 | -import com.google.common.collect.ImmutableSet; | 31 | +import java.util.Map; |
| 38 | -import com.google.common.collect.Multimap; | 32 | +import java.util.Set; |
| 39 | -import com.google.common.collect.Sets; | 33 | +import java.util.concurrent.ConcurrentHashMap; |
| 34 | + | ||
| 35 | +import static org.onlab.onos.net.host.HostEvent.Type.*; | ||
| 36 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 40 | 37 | ||
| 41 | /** | 38 | /** |
| 42 | * Manages inventory of end-station hosts using trivial in-memory | 39 | * Manages inventory of end-station hosts using trivial in-memory |
| ... | @@ -51,7 +48,7 @@ public class SimpleHostStore | ... | @@ -51,7 +48,7 @@ public class SimpleHostStore |
| 51 | private final Logger log = getLogger(getClass()); | 48 | private final Logger log = getLogger(getClass()); |
| 52 | 49 | ||
| 53 | // Host inventory | 50 | // Host inventory |
| 54 | - private final Map<HostId, Host> hosts = new ConcurrentHashMap<>(); | 51 | + private final Map<HostId, StoredHost> hosts = new ConcurrentHashMap<>(2000000, 0.75f, 16); |
| 55 | 52 | ||
| 56 | // Hosts tracked by their location | 53 | // Hosts tracked by their location |
| 57 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); | 54 | private final Multimap<ConnectPoint, Host> locations = HashMultimap.create(); |
| ... | @@ -72,7 +69,7 @@ public class SimpleHostStore | ... | @@ -72,7 +69,7 @@ public class SimpleHostStore |
| 72 | @Override | 69 | @Override |
| 73 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, | 70 | public HostEvent createOrUpdateHost(ProviderId providerId, HostId hostId, |
| 74 | HostDescription hostDescription) { | 71 | HostDescription hostDescription) { |
| 75 | - Host host = hosts.get(hostId); | 72 | + StoredHost host = hosts.get(hostId); |
| 76 | if (host == null) { | 73 | if (host == null) { |
| 77 | return createHost(providerId, hostId, hostDescription); | 74 | return createHost(providerId, hostId, hostDescription); |
| 78 | } | 75 | } |
| ... | @@ -82,11 +79,11 @@ public class SimpleHostStore | ... | @@ -82,11 +79,11 @@ public class SimpleHostStore |
| 82 | // creates a new host and sends HOST_ADDED | 79 | // creates a new host and sends HOST_ADDED |
| 83 | private HostEvent createHost(ProviderId providerId, HostId hostId, | 80 | private HostEvent createHost(ProviderId providerId, HostId hostId, |
| 84 | HostDescription descr) { | 81 | HostDescription descr) { |
| 85 | - DefaultHost newhost = new DefaultHost(providerId, hostId, | 82 | + StoredHost newhost = new StoredHost(providerId, hostId, |
| 86 | - descr.hwAddress(), | 83 | + descr.hwAddress(), |
| 87 | - descr.vlan(), | 84 | + descr.vlan(), |
| 88 | - descr.location(), | 85 | + descr.location(), |
| 89 | - descr.ipAddresses()); | 86 | + ImmutableSet.of(descr.ipAddress())); |
| 90 | synchronized (this) { | 87 | synchronized (this) { |
| 91 | hosts.put(hostId, newhost); | 88 | hosts.put(hostId, newhost); |
| 92 | locations.put(descr.location(), newhost); | 89 | locations.put(descr.location(), newhost); |
| ... | @@ -95,28 +92,24 @@ public class SimpleHostStore | ... | @@ -95,28 +92,24 @@ public class SimpleHostStore |
| 95 | } | 92 | } |
| 96 | 93 | ||
| 97 | // checks for type of update to host, sends appropriate event | 94 | // checks for type of update to host, sends appropriate event |
| 98 | - private HostEvent updateHost(ProviderId providerId, Host host, | 95 | + private HostEvent updateHost(ProviderId providerId, StoredHost host, |
| 99 | HostDescription descr) { | 96 | HostDescription descr) { |
| 100 | - DefaultHost updated; | ||
| 101 | HostEvent event; | 97 | HostEvent event; |
| 102 | if (!host.location().equals(descr.location())) { | 98 | if (!host.location().equals(descr.location())) { |
| 103 | - updated = new DefaultHost(providerId, host.id(), | 99 | + host.setLocation(descr.location()); |
| 104 | - host.mac(), | 100 | + return new HostEvent(HOST_MOVED, host); |
| 105 | - host.vlan(), | 101 | + } |
| 106 | - descr.location(), | 102 | + |
| 107 | - host.ipAddresses()); | 103 | + if (host.ipAddresses().contains(descr.ipAddress())) { |
| 108 | - event = new HostEvent(HOST_MOVED, updated); | ||
| 109 | - | ||
| 110 | - } else if (!(host.ipAddresses().equals(descr.ipAddresses()))) { | ||
| 111 | - updated = new DefaultHost(providerId, host.id(), | ||
| 112 | - host.mac(), | ||
| 113 | - host.vlan(), | ||
| 114 | - descr.location(), | ||
| 115 | - descr.ipAddresses()); | ||
| 116 | - event = new HostEvent(HOST_UPDATED, updated); | ||
| 117 | - } else { | ||
| 118 | return null; | 104 | return null; |
| 119 | } | 105 | } |
| 106 | + | ||
| 107 | + Set<IpPrefix> addresses = new HashSet<>(host.ipAddresses()); | ||
| 108 | + addresses.add(descr.ipAddress()); | ||
| 109 | + StoredHost updated = new StoredHost(providerId, host.id(), | ||
| 110 | + host.mac(), host.vlan(), | ||
| 111 | + descr.location(), addresses); | ||
| 112 | + event = new HostEvent(HOST_UPDATED, updated); | ||
| 120 | synchronized (this) { | 113 | synchronized (this) { |
| 121 | hosts.put(host.id(), updated); | 114 | hosts.put(host.id(), updated); |
| 122 | locations.remove(host.location(), host); | 115 | locations.remove(host.location(), host); |
| ... | @@ -144,7 +137,7 @@ public class SimpleHostStore | ... | @@ -144,7 +137,7 @@ public class SimpleHostStore |
| 144 | 137 | ||
| 145 | @Override | 138 | @Override |
| 146 | public Iterable<Host> getHosts() { | 139 | public Iterable<Host> getHosts() { |
| 147 | - return Collections.unmodifiableSet(new HashSet<>(hosts.values())); | 140 | + return ImmutableSet.<Host>copyOf(hosts.values()); |
| 148 | } | 141 | } |
| 149 | 142 | ||
| 150 | @Override | 143 | @Override |
| ... | @@ -274,4 +267,35 @@ public class SimpleHostStore | ... | @@ -274,4 +267,35 @@ public class SimpleHostStore |
| 274 | return addresses; | 267 | return addresses; |
| 275 | } | 268 | } |
| 276 | 269 | ||
| 270 | + // Auxiliary extension to allow location to mutate. | ||
| 271 | + private class StoredHost extends DefaultHost { | ||
| 272 | + private HostLocation location; | ||
| 273 | + | ||
| 274 | + /** | ||
| 275 | + * Creates an end-station host using the supplied information. | ||
| 276 | + * | ||
| 277 | + * @param providerId provider identity | ||
| 278 | + * @param id host identifier | ||
| 279 | + * @param mac host MAC address | ||
| 280 | + * @param vlan host VLAN identifier | ||
| 281 | + * @param location host location | ||
| 282 | + * @param ips host IP addresses | ||
| 283 | + * @param annotations optional key/value annotations | ||
| 284 | + */ | ||
| 285 | + public StoredHost(ProviderId providerId, HostId id, | ||
| 286 | + MacAddress mac, VlanId vlan, HostLocation location, | ||
| 287 | + Set<IpPrefix> ips, Annotations... annotations) { | ||
| 288 | + super(providerId, id, mac, vlan, location, ips, annotations); | ||
| 289 | + this.location = location; | ||
| 290 | + } | ||
| 291 | + | ||
| 292 | + void setLocation(HostLocation location) { | ||
| 293 | + this.location = location; | ||
| 294 | + } | ||
| 295 | + | ||
| 296 | + @Override | ||
| 297 | + public HostLocation location() { | ||
| 298 | + return location; | ||
| 299 | + } | ||
| 300 | + } | ||
| 277 | } | 301 | } | ... | ... |
| ... | @@ -493,7 +493,7 @@ | ... | @@ -493,7 +493,7 @@ |
| 493 | <group> | 493 | <group> |
| 494 | <title>Core Subsystems</title> | 494 | <title>Core Subsystems</title> |
| 495 | <packages> | 495 | <packages> |
| 496 | - org.onlab.onos.cluster.impl:org.onlab.onos.net.device.impl:org.onlab.onos.net.link.impl:org.onlab.onos.net.host.impl:org.onlab.onos.net.topology.impl:org.onlab.onos.net.packet.impl:org.onlab.onos.net.flow.impl:org.onlab.onos.store.trivial.*:org.onlab.onos.net.*.impl:org.onlab.onos.event.impl:org.onlab.onos.store.*:org.onlab.onos.net.intent.impl | 496 | + org.onlab.onos.impl:org.onlab.onos.cluster.impl:org.onlab.onos.net.device.impl:org.onlab.onos.net.link.impl:org.onlab.onos.net.host.impl:org.onlab.onos.net.topology.impl:org.onlab.onos.net.packet.impl:org.onlab.onos.net.flow.impl:org.onlab.onos.store.trivial.*:org.onlab.onos.net.*.impl:org.onlab.onos.event.impl:org.onlab.onos.store.*:org.onlab.onos.net.intent.impl:org.onlab.onos.net.proxyarp.impl |
| 497 | </packages> | 497 | </packages> |
| 498 | </group> | 498 | </group> |
| 499 | <group> | 499 | <group> |
| ... | @@ -518,7 +518,7 @@ | ... | @@ -518,7 +518,7 @@ |
| 518 | <group> | 518 | <group> |
| 519 | <title>Sample Applications</title> | 519 | <title>Sample Applications</title> |
| 520 | <packages> | 520 | <packages> |
| 521 | - org.onlab.onos.tvue:org.onlab.onos.fwd:org.onlab.onos.foo | 521 | + org.onlab.onos.tvue:org.onlab.onos.fwd:org.onlab.onos.ifwd:org.onlab.onos.mobility:org.onlab.onos.proxyarp:org.onlab.onos.foo |
| 522 | </packages> | 522 | </packages> |
| 523 | </group> | 523 | </group> |
| 524 | </groups> | 524 | </groups> | ... | ... |
providers/openflow/host/src/main/java/org/onlab/onos/provider/of/host/impl/OpenFlowHostProvider.java
| 1 | package org.onlab.onos.provider.of.host.impl; | 1 | package org.onlab.onos.provider.of.host.impl; |
| 2 | 2 | ||
| 3 | -import static com.google.common.collect.Sets.newHashSet; | ||
| 4 | -import static org.onlab.onos.net.DeviceId.deviceId; | ||
| 5 | -import static org.onlab.onos.net.PortNumber.portNumber; | ||
| 6 | -import static org.slf4j.LoggerFactory.getLogger; | ||
| 7 | - | ||
| 8 | -import java.util.Set; | ||
| 9 | - | ||
| 10 | import org.apache.felix.scr.annotations.Activate; | 3 | import org.apache.felix.scr.annotations.Activate; |
| 11 | import org.apache.felix.scr.annotations.Component; | 4 | import org.apache.felix.scr.annotations.Component; |
| 12 | import org.apache.felix.scr.annotations.Deactivate; | 5 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -36,6 +29,10 @@ import org.onlab.packet.IpPrefix; | ... | @@ -36,6 +29,10 @@ import org.onlab.packet.IpPrefix; |
| 36 | import org.onlab.packet.VlanId; | 29 | import org.onlab.packet.VlanId; |
| 37 | import org.slf4j.Logger; | 30 | import org.slf4j.Logger; |
| 38 | 31 | ||
| 32 | +import static org.onlab.onos.net.DeviceId.deviceId; | ||
| 33 | +import static org.onlab.onos.net.PortNumber.portNumber; | ||
| 34 | +import static org.slf4j.LoggerFactory.getLogger; | ||
| 35 | + | ||
| 39 | /** | 36 | /** |
| 40 | * Provider which uses an OpenFlow controller to detect network | 37 | * Provider which uses an OpenFlow controller to detect network |
| 41 | * end-station hosts. | 38 | * end-station hosts. |
| ... | @@ -58,6 +55,8 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid | ... | @@ -58,6 +55,8 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid |
| 58 | 55 | ||
| 59 | private final InternalHostProvider listener = new InternalHostProvider(); | 56 | private final InternalHostProvider listener = new InternalHostProvider(); |
| 60 | 57 | ||
| 58 | + private boolean ipLearn = true; | ||
| 59 | + | ||
| 61 | /** | 60 | /** |
| 62 | * Creates an OpenFlow host provider. | 61 | * Creates an OpenFlow host provider. |
| 63 | */ | 62 | */ |
| ... | @@ -69,7 +68,6 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid | ... | @@ -69,7 +68,6 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid |
| 69 | public void activate() { | 68 | public void activate() { |
| 70 | providerService = providerRegistry.register(this); | 69 | providerService = providerRegistry.register(this); |
| 71 | controller.addPacketListener(10, listener); | 70 | controller.addPacketListener(10, listener); |
| 72 | - | ||
| 73 | log.info("Started"); | 71 | log.info("Started"); |
| 74 | } | 72 | } |
| 75 | 73 | ||
| ... | @@ -78,7 +76,6 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid | ... | @@ -78,7 +76,6 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid |
| 78 | providerRegistry.unregister(this); | 76 | providerRegistry.unregister(this); |
| 79 | controller.removePacketListener(listener); | 77 | controller.removePacketListener(listener); |
| 80 | providerService = null; | 78 | providerService = null; |
| 81 | - | ||
| 82 | log.info("Stopped"); | 79 | log.info("Stopped"); |
| 83 | } | 80 | } |
| 84 | 81 | ||
| ... | @@ -95,33 +92,33 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid | ... | @@ -95,33 +92,33 @@ public class OpenFlowHostProvider extends AbstractProvider implements HostProvid |
| 95 | 92 | ||
| 96 | VlanId vlan = VlanId.vlanId(eth.getVlanID()); | 93 | VlanId vlan = VlanId.vlanId(eth.getVlanID()); |
| 97 | ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())), | 94 | ConnectPoint heardOn = new ConnectPoint(deviceId(Dpid.uri(pktCtx.dpid())), |
| 98 | - portNumber(pktCtx.inPort())); | 95 | + portNumber(pktCtx.inPort())); |
| 99 | 96 | ||
| 100 | - // If this is not an edge port, bail out. | 97 | + // If this is not an edge port, bail out. |
| 101 | Topology topology = topologyService.currentTopology(); | 98 | Topology topology = topologyService.currentTopology(); |
| 102 | if (topologyService.isInfrastructure(topology, heardOn)) { | 99 | if (topologyService.isInfrastructure(topology, heardOn)) { |
| 103 | return; | 100 | return; |
| 104 | } | 101 | } |
| 105 | 102 | ||
| 106 | HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())), | 103 | HostLocation hloc = new HostLocation(deviceId(Dpid.uri(pktCtx.dpid())), |
| 107 | - portNumber(pktCtx.inPort()), | 104 | + portNumber(pktCtx.inPort()), |
| 108 | - System.currentTimeMillis()); | 105 | + System.currentTimeMillis()); |
| 106 | + | ||
| 109 | HostId hid = HostId.hostId(eth.getSourceMAC(), vlan); | 107 | HostId hid = HostId.hostId(eth.getSourceMAC(), vlan); |
| 108 | + | ||
| 110 | // Potentially a new or moved host | 109 | // Potentially a new or moved host |
| 111 | if (eth.getEtherType() == Ethernet.TYPE_ARP) { | 110 | if (eth.getEtherType() == Ethernet.TYPE_ARP) { |
| 112 | - | ||
| 113 | - | ||
| 114 | ARP arp = (ARP) eth.getPayload(); | 111 | ARP arp = (ARP) eth.getPayload(); |
| 115 | - Set<IpPrefix> ips = newHashSet(IpPrefix.valueOf(arp.getSenderProtocolAddress())); | 112 | + IpPrefix ip = IpPrefix.valueOf(arp.getSenderProtocolAddress()); |
| 116 | HostDescription hdescr = | 113 | HostDescription hdescr = |
| 117 | - new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ips); | 114 | + new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip); |
| 118 | providerService.hostDetected(hid, hdescr); | 115 | providerService.hostDetected(hid, hdescr); |
| 119 | 116 | ||
| 120 | - } else if (eth.getEtherType() == Ethernet.TYPE_IPV4) { | 117 | + } else if (ipLearn && eth.getEtherType() == Ethernet.TYPE_IPV4) { |
| 121 | - IPv4 ip = (IPv4) eth.getPayload(); | 118 | + IPv4 pip = (IPv4) eth.getPayload(); |
| 122 | - Set<IpPrefix> ips = newHashSet(IpPrefix.valueOf(ip.getSourceAddress())); | 119 | + IpPrefix ip = IpPrefix.valueOf(pip.getSourceAddress()); |
| 123 | HostDescription hdescr = | 120 | HostDescription hdescr = |
| 124 | - new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ips); | 121 | + new DefaultHostDescription(eth.getSourceMAC(), vlan, hloc, ip); |
| 125 | providerService.hostDetected(hid, hdescr); | 122 | providerService.hostDetected(hid, hdescr); |
| 126 | 123 | ||
| 127 | } | 124 | } | ... | ... |
-
Please register or login to post a comment