Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
20 changed files
with
143 additions
and
166 deletions
... | @@ -148,9 +148,9 @@ public class PeerConnectivityManager { | ... | @@ -148,9 +148,9 @@ public class PeerConnectivityManager { |
148 | .matchEthType(Ethernet.TYPE_IPV4) | 148 | .matchEthType(Ethernet.TYPE_IPV4) |
149 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 149 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
150 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), | 150 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
151 | - IpAddress.MAX_INET_MASK)) | 151 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
152 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 152 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
153 | - IpAddress.MAX_INET_MASK)) | 153 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
154 | .matchTcpDst((short) BgpConstants.BGP_PORT) | 154 | .matchTcpDst((short) BgpConstants.BGP_PORT) |
155 | .build(); | 155 | .build(); |
156 | 156 | ||
... | @@ -171,9 +171,9 @@ public class PeerConnectivityManager { | ... | @@ -171,9 +171,9 @@ public class PeerConnectivityManager { |
171 | .matchEthType(Ethernet.TYPE_IPV4) | 171 | .matchEthType(Ethernet.TYPE_IPV4) |
172 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 172 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
173 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), | 173 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
174 | - IpAddress.MAX_INET_MASK)) | 174 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
175 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 175 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
176 | - IpAddress.MAX_INET_MASK)) | 176 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
177 | .matchTcpSrc((short) BgpConstants.BGP_PORT) | 177 | .matchTcpSrc((short) BgpConstants.BGP_PORT) |
178 | .build(); | 178 | .build(); |
179 | 179 | ||
... | @@ -191,9 +191,9 @@ public class PeerConnectivityManager { | ... | @@ -191,9 +191,9 @@ public class PeerConnectivityManager { |
191 | .matchEthType(Ethernet.TYPE_IPV4) | 191 | .matchEthType(Ethernet.TYPE_IPV4) |
192 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 192 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
193 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 193 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
194 | - IpAddress.MAX_INET_MASK)) | 194 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
195 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), | 195 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), |
196 | - IpAddress.MAX_INET_MASK)) | 196 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
197 | .matchTcpDst((short) BgpConstants.BGP_PORT) | 197 | .matchTcpDst((short) BgpConstants.BGP_PORT) |
198 | .build(); | 198 | .build(); |
199 | 199 | ||
... | @@ -211,9 +211,9 @@ public class PeerConnectivityManager { | ... | @@ -211,9 +211,9 @@ public class PeerConnectivityManager { |
211 | .matchEthType(Ethernet.TYPE_IPV4) | 211 | .matchEthType(Ethernet.TYPE_IPV4) |
212 | .matchIPProtocol(IPv4.PROTOCOL_TCP) | 212 | .matchIPProtocol(IPv4.PROTOCOL_TCP) |
213 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 213 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
214 | - IpAddress.MAX_INET_MASK)) | 214 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
215 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), | 215 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), |
216 | - IpAddress.MAX_INET_MASK)) | 216 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
217 | .matchTcpSrc((short) BgpConstants.BGP_PORT) | 217 | .matchTcpSrc((short) BgpConstants.BGP_PORT) |
218 | .build(); | 218 | .build(); |
219 | 219 | ||
... | @@ -281,9 +281,9 @@ public class PeerConnectivityManager { | ... | @@ -281,9 +281,9 @@ public class PeerConnectivityManager { |
281 | .matchEthType(Ethernet.TYPE_IPV4) | 281 | .matchEthType(Ethernet.TYPE_IPV4) |
282 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 282 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) |
283 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), | 283 | .matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(), |
284 | - IpAddress.MAX_INET_MASK)) | 284 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
285 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 285 | .matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
286 | - IpAddress.MAX_INET_MASK)) | 286 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
287 | .build(); | 287 | .build(); |
288 | 288 | ||
289 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() | 289 | TrafficTreatment treatment = DefaultTrafficTreatment.builder() |
... | @@ -301,9 +301,9 @@ public class PeerConnectivityManager { | ... | @@ -301,9 +301,9 @@ public class PeerConnectivityManager { |
301 | .matchEthType(Ethernet.TYPE_IPV4) | 301 | .matchEthType(Ethernet.TYPE_IPV4) |
302 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) | 302 | .matchIPProtocol(IPv4.PROTOCOL_ICMP) |
303 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), | 303 | .matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(), |
304 | - IpAddress.MAX_INET_MASK)) | 304 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
305 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), | 305 | .matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(), |
306 | - IpAddress.MAX_INET_MASK)) | 306 | + IpPrefix.MAX_INET_MASK_LENGTH)) |
307 | .build(); | 307 | .build(); |
308 | 308 | ||
309 | PointToPointIntent reversedIntent = | 309 | PointToPointIntent reversedIntent = | ... | ... |
... | @@ -75,7 +75,7 @@ public class RouteEntry { | ... | @@ -75,7 +75,7 @@ public class RouteEntry { |
75 | StringBuilder result = new StringBuilder(ip4Prefix.prefixLength()); | 75 | StringBuilder result = new StringBuilder(ip4Prefix.prefixLength()); |
76 | long value = ip4Prefix.toInt(); | 76 | long value = ip4Prefix.toInt(); |
77 | for (int i = 0; i < ip4Prefix.prefixLength(); i++) { | 77 | for (int i = 0; i < ip4Prefix.prefixLength(); i++) { |
78 | - long mask = 1 << (IpAddress.MAX_INET_MASK - 1 - i); | 78 | + long mask = 1 << (IpPrefix.MAX_INET_MASK_LENGTH - 1 - i); |
79 | result.append(((value & mask) == 0) ? "0" : "1"); | 79 | result.append(((value & mask) == 0) ? "0" : "1"); |
80 | } | 80 | } |
81 | return result.toString(); | 81 | return result.toString(); | ... | ... |
... | @@ -190,12 +190,12 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { | ... | @@ -190,12 +190,12 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler { |
190 | 190 | ||
191 | IpAddress address = prefix.toIpAddress(); | 191 | IpAddress address = prefix.toIpAddress(); |
192 | long value = address.toInt() & 0xffffffffL; | 192 | long value = address.toInt() & 0xffffffffL; |
193 | - for (int i = 0; i < IpAddress.INET_LEN; i++) { | 193 | + for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) { |
194 | if (prefixBytelen-- == 0) { | 194 | if (prefixBytelen-- == 0) { |
195 | break; | 195 | break; |
196 | } | 196 | } |
197 | long nextByte = | 197 | long nextByte = |
198 | - (value >> ((IpAddress.INET_LEN - i - 1) * 8)) & 0xff; | 198 | + (value >> ((IpAddress.INET_BYTE_LENGTH - i - 1) * 8)) & 0xff; |
199 | message.writeByte((int) nextByte); | 199 | message.writeByte((int) nextByte); |
200 | } | 200 | } |
201 | } | 201 | } | ... | ... |
... | @@ -269,10 +269,6 @@ implements MastershipService, MastershipAdminService { | ... | @@ -269,10 +269,6 @@ implements MastershipService, MastershipAdminService { |
269 | 269 | ||
270 | @Override | 270 | @Override |
271 | public void notify(MastershipEvent event) { | 271 | public void notify(MastershipEvent event) { |
272 | - if (clusterService.getLocalNode().id().equals(event.roleInfo().master())) { | ||
273 | - log.info("ignoring locally-generated event {}", event); | ||
274 | - // return; | ||
275 | - } | ||
276 | log.info("dispatching mastership event {}", event); | 272 | log.info("dispatching mastership event {}", event); |
277 | eventDispatcher.post(event); | 273 | eventDispatcher.post(event); |
278 | } | 274 | } | ... | ... |
... | @@ -432,7 +432,6 @@ public class DeviceManager | ... | @@ -432,7 +432,6 @@ public class DeviceManager |
432 | if (!isReachable(device)) { | 432 | if (!isReachable(device)) { |
433 | log.warn("Device {} has disconnected after this event", did); | 433 | log.warn("Device {} has disconnected after this event", did); |
434 | mastershipService.relinquishMastership(did); | 434 | mastershipService.relinquishMastership(did); |
435 | - applyRole(did, MastershipRole.STANDBY); | ||
436 | return; | 435 | return; |
437 | } | 436 | } |
438 | //flag the device as online. Is there a better way to do this? | 437 | //flag the device as online. Is there a better way to do this? |
... | @@ -448,6 +447,7 @@ public class DeviceManager | ... | @@ -448,6 +447,7 @@ public class DeviceManager |
448 | if (!isReachable(getDevice(did))) { | 447 | if (!isReachable(getDevice(did))) { |
449 | log.warn("Device {} has disconnected after this event", did); | 448 | log.warn("Device {} has disconnected after this event", did); |
450 | mastershipService.relinquishMastership(did); | 449 | mastershipService.relinquishMastership(did); |
450 | + return; | ||
451 | } | 451 | } |
452 | applyRole(did, MastershipRole.STANDBY); | 452 | applyRole(did, MastershipRole.STANDBY); |
453 | } | 453 | } |
... | @@ -455,19 +455,21 @@ public class DeviceManager | ... | @@ -455,19 +455,21 @@ public class DeviceManager |
455 | 455 | ||
456 | // checks for duplicate event, returning true if one is found. | 456 | // checks for duplicate event, returning true if one is found. |
457 | private boolean checkDuplicate(RoleInfo roleInfo, int term) { | 457 | private boolean checkDuplicate(RoleInfo roleInfo, int term) { |
458 | - synchronized (eventCache) { | 458 | + // turning off duplicate check |
459 | - if (eventCache.get(term).contains(roleInfo)) { | ||
460 | - log.info("duplicate event detected; ignoring"); | ||
461 | - return true; | ||
462 | - } else { | ||
463 | - eventCache.put(term, roleInfo); | ||
464 | - // purge by-term oldest entries to keep the cache size under limit | ||
465 | - if (eventCache.size() > cacheSize) { | ||
466 | - eventCache.removeAll(term - cacheSize); | ||
467 | - } | ||
468 | return false; | 459 | return false; |
469 | - } | 460 | +// synchronized (eventCache) { |
470 | - } | 461 | +// if (eventCache.get(term).contains(roleInfo)) { |
462 | +// log.info("duplicate event detected; ignoring"); | ||
463 | +// return true; | ||
464 | +// } else { | ||
465 | +// eventCache.put(term, roleInfo); | ||
466 | +// // purge by-term oldest entries to keep the cache size under limit | ||
467 | +// if (eventCache.size() > cacheSize) { | ||
468 | +// eventCache.removeAll(term - cacheSize); | ||
469 | +// } | ||
470 | +// return false; | ||
471 | +// } | ||
472 | +// } | ||
471 | } | 473 | } |
472 | 474 | ||
473 | } | 475 | } | ... | ... |
... | @@ -46,7 +46,6 @@ import org.onlab.onos.net.provider.ProviderId; | ... | @@ -46,7 +46,6 @@ import org.onlab.onos.net.provider.ProviderId; |
46 | import org.onlab.packet.ARP; | 46 | import org.onlab.packet.ARP; |
47 | import org.onlab.packet.Ethernet; | 47 | import org.onlab.packet.Ethernet; |
48 | import org.onlab.packet.IpAddress; | 48 | import org.onlab.packet.IpAddress; |
49 | -import org.onlab.packet.IpPrefix; | ||
50 | import org.onlab.packet.MacAddress; | 49 | import org.onlab.packet.MacAddress; |
51 | import org.onlab.util.Timer; | 50 | import org.onlab.util.Timer; |
52 | 51 | ||
... | @@ -212,7 +211,7 @@ public class HostMonitor implements TimerTask { | ... | @@ -212,7 +211,7 @@ public class HostMonitor implements TimerTask { |
212 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET) | 211 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET) |
213 | .setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH) | 212 | .setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH) |
214 | .setProtocolType(ARP.PROTO_TYPE_IP) | 213 | .setProtocolType(ARP.PROTO_TYPE_IP) |
215 | - .setProtocolAddressLength((byte) IpPrefix.INET_LEN) | 214 | + .setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH) |
216 | .setOpCode(ARP.OP_REQUEST); | 215 | .setOpCode(ARP.OP_REQUEST); |
217 | 216 | ||
218 | arp.setSenderHardwareAddress(sourceMac.getAddress()) | 217 | arp.setSenderHardwareAddress(sourceMac.getAddress()) | ... | ... |
... | @@ -56,7 +56,6 @@ import org.onlab.onos.net.proxyarp.ProxyArpService; | ... | @@ -56,7 +56,6 @@ import org.onlab.onos.net.proxyarp.ProxyArpService; |
56 | import org.onlab.packet.ARP; | 56 | import org.onlab.packet.ARP; |
57 | import org.onlab.packet.Ethernet; | 57 | import org.onlab.packet.Ethernet; |
58 | import org.onlab.packet.IpAddress; | 58 | import org.onlab.packet.IpAddress; |
59 | -import org.onlab.packet.IpPrefix; | ||
60 | import org.onlab.packet.MacAddress; | 59 | import org.onlab.packet.MacAddress; |
61 | import org.onlab.packet.VlanId; | 60 | import org.onlab.packet.VlanId; |
62 | import org.slf4j.Logger; | 61 | import org.slf4j.Logger; |
... | @@ -368,7 +367,7 @@ public class ProxyArpManager implements ProxyArpService { | ... | @@ -368,7 +367,7 @@ public class ProxyArpManager implements ProxyArpService { |
368 | arp.setProtocolType(ARP.PROTO_TYPE_IP); | 367 | arp.setProtocolType(ARP.PROTO_TYPE_IP); |
369 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET); | 368 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET); |
370 | 369 | ||
371 | - arp.setProtocolAddressLength((byte) IpPrefix.INET_LEN); | 370 | + arp.setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH); |
372 | arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH); | 371 | arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH); |
373 | arp.setSenderHardwareAddress(srcMac.getAddress()); | 372 | arp.setSenderHardwareAddress(srcMac.getAddress()); |
374 | arp.setTargetHardwareAddress(request.getSourceMACAddress()); | 373 | arp.setTargetHardwareAddress(request.getSourceMACAddress()); | ... | ... |
... | @@ -534,7 +534,7 @@ public class ProxyArpManagerTest { | ... | @@ -534,7 +534,7 @@ public class ProxyArpManagerTest { |
534 | arp.setProtocolType(ARP.PROTO_TYPE_IP); | 534 | arp.setProtocolType(ARP.PROTO_TYPE_IP); |
535 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET); | 535 | arp.setHardwareType(ARP.HW_TYPE_ETHERNET); |
536 | 536 | ||
537 | - arp.setProtocolAddressLength((byte) IpPrefix.INET_LEN); | 537 | + arp.setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH); |
538 | arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH); | 538 | arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH); |
539 | arp.setSenderHardwareAddress(srcMac.getAddress()); | 539 | arp.setSenderHardwareAddress(srcMac.getAddress()); |
540 | 540 | ... | ... |
... | @@ -358,6 +358,7 @@ implements MastershipStore { | ... | @@ -358,6 +358,7 @@ implements MastershipStore { |
358 | 358 | ||
359 | @Override | 359 | @Override |
360 | public void entryAdded(EntryEvent<DeviceId, RoleValue> event) { | 360 | public void entryAdded(EntryEvent<DeviceId, RoleValue> event) { |
361 | + entryUpdated(event); | ||
361 | } | 362 | } |
362 | 363 | ||
363 | @Override | 364 | @Override |
... | @@ -366,7 +367,6 @@ implements MastershipStore { | ... | @@ -366,7 +367,6 @@ implements MastershipStore { |
366 | 367 | ||
367 | @Override | 368 | @Override |
368 | public void entryUpdated(EntryEvent<DeviceId, RoleValue> event) { | 369 | public void entryUpdated(EntryEvent<DeviceId, RoleValue> event) { |
369 | - // this subsumes entryAdded event | ||
370 | notifyDelegate(new MastershipEvent( | 370 | notifyDelegate(new MastershipEvent( |
371 | MASTER_CHANGED, event.getKey(), event.getValue().roleInfo())); | 371 | MASTER_CHANGED, event.getKey(), event.getValue().roleInfo())); |
372 | } | 372 | } | ... | ... |
... | @@ -17,6 +17,7 @@ package org.onlab.onos.store.topology.impl; | ... | @@ -17,6 +17,7 @@ package org.onlab.onos.store.topology.impl; |
17 | 17 | ||
18 | import static org.slf4j.LoggerFactory.getLogger; | 18 | import static org.slf4j.LoggerFactory.getLogger; |
19 | 19 | ||
20 | +import java.util.Collections; | ||
20 | import java.util.List; | 21 | import java.util.List; |
21 | import java.util.Set; | 22 | import java.util.Set; |
22 | 23 | ||
... | @@ -26,11 +27,13 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -26,11 +27,13 @@ import org.apache.felix.scr.annotations.Deactivate; |
26 | import org.apache.felix.scr.annotations.Service; | 27 | import org.apache.felix.scr.annotations.Service; |
27 | import org.onlab.onos.event.Event; | 28 | import org.onlab.onos.event.Event; |
28 | import org.onlab.onos.net.ConnectPoint; | 29 | import org.onlab.onos.net.ConnectPoint; |
30 | +import org.onlab.onos.net.Device; | ||
29 | import org.onlab.onos.net.DeviceId; | 31 | import org.onlab.onos.net.DeviceId; |
30 | import org.onlab.onos.net.Link; | 32 | import org.onlab.onos.net.Link; |
31 | import org.onlab.onos.net.Path; | 33 | import org.onlab.onos.net.Path; |
32 | import org.onlab.onos.net.provider.ProviderId; | 34 | import org.onlab.onos.net.provider.ProviderId; |
33 | import org.onlab.onos.net.topology.ClusterId; | 35 | import org.onlab.onos.net.topology.ClusterId; |
36 | +import org.onlab.onos.net.topology.DefaultGraphDescription; | ||
34 | import org.onlab.onos.net.topology.GraphDescription; | 37 | import org.onlab.onos.net.topology.GraphDescription; |
35 | import org.onlab.onos.net.topology.LinkWeight; | 38 | import org.onlab.onos.net.topology.LinkWeight; |
36 | import org.onlab.onos.net.topology.Topology; | 39 | import org.onlab.onos.net.topology.Topology; |
... | @@ -55,7 +58,11 @@ implements TopologyStore { | ... | @@ -55,7 +58,11 @@ implements TopologyStore { |
55 | 58 | ||
56 | private final Logger log = getLogger(getClass()); | 59 | private final Logger log = getLogger(getClass()); |
57 | 60 | ||
58 | - private volatile DefaultTopology current; | 61 | + private volatile DefaultTopology current = |
62 | + new DefaultTopology(ProviderId.NONE, | ||
63 | + new DefaultGraphDescription(0L, | ||
64 | + Collections.<Device>emptyList(), | ||
65 | + Collections.<Link>emptyList())); | ||
59 | 66 | ||
60 | @Activate | 67 | @Activate |
61 | public void activate() { | 68 | public void activate() { | ... | ... |
... | @@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
145 | break; | 145 | break; |
146 | case PORT_ADDED: | 146 | case PORT_ADDED: |
147 | case PORT_UPDATED: | 147 | case PORT_UPDATED: |
148 | - if (event.port().isEnabled()) { | 148 | + if (port.isEnabled()) { |
149 | ld = discoverers.get(device.id()); | 149 | ld = discoverers.get(device.id()); |
150 | if (ld == null) { | 150 | if (ld == null) { |
151 | return; | 151 | return; |
... | @@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider { |
155 | ld.addPort(port); | 155 | ld.addPort(port); |
156 | } | 156 | } |
157 | } else { | 157 | } else { |
158 | + log.debug("Port down {}", port); | ||
158 | ConnectPoint point = new ConnectPoint(device.id(), | 159 | ConnectPoint point = new ConnectPoint(device.id(), |
159 | port.number()); | 160 | port.number()); |
160 | providerService.linksVanished(point); | 161 | providerService.linksVanished(point); | ... | ... |
... | @@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask { |
68 | // send 1 probe every probeRate milliseconds | 68 | // send 1 probe every probeRate milliseconds |
69 | private final long probeRate; | 69 | private final long probeRate; |
70 | private final Set<Long> slowPorts; | 70 | private final Set<Long> slowPorts; |
71 | + // ports, known to have incoming links | ||
71 | private final Set<Long> fastPorts; | 72 | private final Set<Long> fastPorts; |
72 | // number of unacknowledged probes per port | 73 | // number of unacknowledged probes per port |
73 | private final Map<Long, AtomicInteger> portProbeCount; | 74 | private final Map<Long, AtomicInteger> portProbeCount; |
... | @@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask { |
125 | log.info("Using BDDP to discover network"); | 126 | log.info("Using BDDP to discover network"); |
126 | } | 127 | } |
127 | 128 | ||
129 | + this.isStopped = true; | ||
128 | start(); | 130 | start(); |
129 | this.log.debug("Started discovery manager for switch {}", | 131 | this.log.debug("Started discovery manager for switch {}", |
130 | device.id()); | 132 | device.id()); |
... | @@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask { |
140 | public void addPort(final Port port) { | 142 | public void addPort(final Port port) { |
141 | this.log.debug("Sending init probe to port {}@{}", | 143 | this.log.debug("Sending init probe to port {}@{}", |
142 | port.number().toLong(), device.id()); | 144 | port.number().toLong(), device.id()); |
145 | + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; | ||
146 | + if (isMaster) { | ||
143 | sendProbes(port.number().toLong()); | 147 | sendProbes(port.number().toLong()); |
148 | + } | ||
144 | synchronized (this) { | 149 | synchronized (this) { |
145 | this.slowPorts.add(port.number().toLong()); | 150 | this.slowPorts.add(port.number().toLong()); |
146 | } | 151 | } |
... | @@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask { |
233 | */ | 238 | */ |
234 | @Override | 239 | @Override |
235 | public void run(final Timeout t) { | 240 | public void run(final Timeout t) { |
241 | + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; | ||
242 | + if (!isMaster) { | ||
243 | + // reschedule timer | ||
244 | + timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS); | ||
245 | + return; | ||
246 | + } | ||
247 | + | ||
236 | this.log.trace("Sending probes from {}", device.id()); | 248 | this.log.trace("Sending probes from {}", device.id()); |
237 | synchronized (this) { | 249 | synchronized (this) { |
238 | final Iterator<Long> fastIterator = this.fastPorts.iterator(); | 250 | final Iterator<Long> fastIterator = this.fastPorts.iterator(); |
... | @@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask { |
245 | sendProbes(portNumber); | 257 | sendProbes(portNumber); |
246 | 258 | ||
247 | } else { | 259 | } else { |
260 | + // Link down, demote to slowPorts | ||
248 | // Update fast and slow ports | 261 | // Update fast and slow ports |
249 | fastIterator.remove(); | 262 | fastIterator.remove(); |
250 | this.slowPorts.add(portNumber); | 263 | this.slowPorts.add(portNumber); |
... | @@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask { |
274 | } | 287 | } |
275 | 288 | ||
276 | public void start() { | 289 | public void start() { |
290 | + if (isStopped) { | ||
277 | timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); | 291 | timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); |
278 | isStopped = false; | 292 | isStopped = false; |
293 | + } else { | ||
294 | + log.warn("LinkDiscovery started multiple times?"); | ||
295 | + } | ||
279 | } | 296 | } |
280 | 297 | ||
281 | /** | 298 | /** |
... | @@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask { | ... | @@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask { |
317 | } | 334 | } |
318 | 335 | ||
319 | private void sendProbes(Long portNumber) { | 336 | private void sendProbes(Long portNumber) { |
320 | - boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; | 337 | + // TODO: should have suppression port configuration, not by type |
321 | - if (isMaster && device.type() != Device.Type.ROADM) { | 338 | + if (device.type() != Device.Type.ROADM) { |
322 | log.debug("Sending probes out to {}@{}", portNumber, device.id()); | 339 | log.debug("Sending probes out to {}@{}", portNumber, device.id()); |
323 | OutboundPacket pkt = this.createOutBoundLLDP(portNumber); | 340 | OutboundPacket pkt = this.createOutBoundLLDP(portNumber); |
324 | pktService.emit(pkt); | 341 | pktService.emit(pkt); | ... | ... |
... | @@ -171,7 +171,8 @@ public class FlowEntryBuilder { | ... | @@ -171,7 +171,8 @@ public class FlowEntryBuilder { |
171 | builder.setIpDst(IpPrefix.valueOf(di.getInt(), | 171 | builder.setIpDst(IpPrefix.valueOf(di.getInt(), |
172 | di.asCidrMaskLength())); | 172 | di.asCidrMaskLength())); |
173 | } else { | 173 | } else { |
174 | - builder.setIpDst(IpPrefix.valueOf(di.getInt())); | 174 | + builder.setIpDst(IpPrefix.valueOf(di.getInt(), |
175 | + IpPrefix.MAX_INET_MASK_LENGTH)); | ||
175 | } | 176 | } |
176 | break; | 177 | break; |
177 | case SET_NW_SRC: | 178 | case SET_NW_SRC: |
... | @@ -181,7 +182,8 @@ public class FlowEntryBuilder { | ... | @@ -181,7 +182,8 @@ public class FlowEntryBuilder { |
181 | builder.setIpSrc(IpPrefix.valueOf(si.getInt(), | 182 | builder.setIpSrc(IpPrefix.valueOf(si.getInt(), |
182 | si.asCidrMaskLength())); | 183 | si.asCidrMaskLength())); |
183 | } else { | 184 | } else { |
184 | - builder.setIpSrc(IpPrefix.valueOf(si.getInt())); | 185 | + builder.setIpSrc(IpPrefix.valueOf(si.getInt(), |
186 | + IpPrefix.MAX_INET_MASK_LENGTH)); | ||
185 | } | 187 | } |
186 | break; | 188 | break; |
187 | case EXPERIMENTER: | 189 | case EXPERIMENTER: |
... | @@ -256,7 +258,7 @@ public class FlowEntryBuilder { | ... | @@ -256,7 +258,7 @@ public class FlowEntryBuilder { |
256 | } else { | 258 | } else { |
257 | dip = IpPrefix.valueOf( | 259 | dip = IpPrefix.valueOf( |
258 | match.get(MatchField.IPV4_DST).getInt(), | 260 | match.get(MatchField.IPV4_DST).getInt(), |
259 | - IpPrefix.MAX_INET_MASK); | 261 | + IpPrefix.MAX_INET_MASK_LENGTH); |
260 | } | 262 | } |
261 | 263 | ||
262 | builder.matchIPDst(dip); | 264 | builder.matchIPDst(dip); |
... | @@ -272,7 +274,7 @@ public class FlowEntryBuilder { | ... | @@ -272,7 +274,7 @@ public class FlowEntryBuilder { |
272 | } else { | 274 | } else { |
273 | sip = IpPrefix.valueOf( | 275 | sip = IpPrefix.valueOf( |
274 | match.get(MatchField.IPV4_SRC).getInt(), | 276 | match.get(MatchField.IPV4_SRC).getInt(), |
275 | - IpPrefix.MAX_INET_MASK); | 277 | + IpPrefix.MAX_INET_MASK_LENGTH); |
276 | } | 278 | } |
277 | 279 | ||
278 | builder.matchIPSrc(sip); | 280 | builder.matchIPSrc(sip); | ... | ... |
... | @@ -8,7 +8,7 @@ export ONOS_ROOT=${ONOS_ROOT:-~/onos-next} | ... | @@ -8,7 +8,7 @@ export ONOS_ROOT=${ONOS_ROOT:-~/onos-next} |
8 | # Setup some environmental context for developers | 8 | # Setup some environmental context for developers |
9 | if [ -z "${JAVA_HOME}" ]; then | 9 | if [ -z "${JAVA_HOME}" ]; then |
10 | if [ -x /usr/libexec/java_home ]; then | 10 | if [ -x /usr/libexec/java_home ]; then |
11 | - export JAVA_HOME=$(/usr/libexec/java_home -v 1.8) | 11 | + export JAVA_HOME=$(/usr/libexec/java_home -v 1.7) |
12 | elif [ -d /usr/lib/jvm/java-7-openjdk-amd64 ]; then | 12 | elif [ -d /usr/lib/jvm/java-7-openjdk-amd64 ]; then |
13 | export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64" | 13 | export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64" |
14 | fi | 14 | fi | ... | ... |
... | @@ -101,20 +101,6 @@ public final class Ip4Prefix { | ... | @@ -101,20 +101,6 @@ public final class Ip4Prefix { |
101 | return this.address.toString() + "/" + this.prefixLen; | 101 | return this.address.toString() + "/" + this.prefixLen; |
102 | } | 102 | } |
103 | 103 | ||
104 | - /** | ||
105 | - * Compares the value of two Ip4Prefix objects. | ||
106 | - * <p/> | ||
107 | - * Note the value of the IPv4 address is compared directly between the | ||
108 | - * objects, and must match exactly for the objects to be considered equal. | ||
109 | - * This may result in objects which represent the same IP prefix being | ||
110 | - * classified as unequal, because the unsignificant bits of the address | ||
111 | - * field don't match (the bits to the right of the prefix length). | ||
112 | - * <p/> | ||
113 | - * TODO Change this behavior so that objects that represent the same prefix | ||
114 | - * are classified as equal according to this equals method. | ||
115 | - * | ||
116 | - * @see Object#equals(Object) | ||
117 | - */ | ||
118 | @Override | 104 | @Override |
119 | public boolean equals(Object other) { | 105 | public boolean equals(Object other) { |
120 | if (other == this) { | 106 | if (other == this) { | ... | ... |
... | @@ -101,20 +101,6 @@ public final class Ip6Prefix { | ... | @@ -101,20 +101,6 @@ public final class Ip6Prefix { |
101 | return this.address.toString() + "/" + this.prefixLen; | 101 | return this.address.toString() + "/" + this.prefixLen; |
102 | } | 102 | } |
103 | 103 | ||
104 | - /** | ||
105 | - * Compares the value of two Ip6Prefix objects. | ||
106 | - * <p/> | ||
107 | - * Note the value of the IPv6 address is compared directly between the | ||
108 | - * objects, and must match exactly for the objects to be considered equal. | ||
109 | - * This may result in objects which represent the same IP prefix being | ||
110 | - * classified as unequal, because the unsignificant bits of the address | ||
111 | - * field don't match (the bits to the right of the prefix length). | ||
112 | - * <p/> | ||
113 | - * TODO Change this behavior so that objects that represent the same prefix | ||
114 | - * are classified as equal according to this equals method. | ||
115 | - * | ||
116 | - * @see Object#equals(Object) | ||
117 | - */ | ||
118 | @Override | 104 | @Override |
119 | public boolean equals(Object other) { | 105 | public boolean equals(Object other) { |
120 | if (other == this) { | 106 | if (other == this) { | ... | ... |
This diff is collapsed. Click to expand it.
... | @@ -26,48 +26,37 @@ public final class IpPrefix { | ... | @@ -26,48 +26,37 @@ public final class IpPrefix { |
26 | 26 | ||
27 | // TODO a comparator for netmasks? E.g. for sorting by prefix match order. | 27 | // TODO a comparator for netmasks? E.g. for sorting by prefix match order. |
28 | 28 | ||
29 | - //IP Versions | 29 | + // IP Versions: IPv4 and IPv6 |
30 | public enum Version { INET, INET6 }; | 30 | public enum Version { INET, INET6 }; |
31 | 31 | ||
32 | - //lengths of address, in bytes | 32 | + // Maximum network mask length |
33 | - public static final int INET_LEN = 4; | 33 | + public static final int MAX_INET_MASK_LENGTH = IpAddress.INET_BIT_LENGTH; |
34 | - public static final int INET6_LEN = 16; | 34 | + public static final int MAX_INET6_MASK_LENGTH = IpAddress.INET6_BIT_LENGTH; |
35 | 35 | ||
36 | - //maximum CIDR value | ||
37 | - public static final int MAX_INET_MASK = 32; | ||
38 | //no mask (no network), e.g. a simple address | 36 | //no mask (no network), e.g. a simple address |
39 | - public static final int DEFAULT_MASK = 0; | 37 | + private static final int DEFAULT_MASK = 0; |
40 | 38 | ||
41 | /** | 39 | /** |
42 | * Default value indicating an unspecified address. | 40 | * Default value indicating an unspecified address. |
43 | */ | 41 | */ |
44 | - static final byte[] ANY = new byte [] {0, 0, 0, 0}; | 42 | + private static final byte[] ANY = new byte[] {0, 0, 0, 0}; |
45 | 43 | ||
46 | - protected Version version; | 44 | + private final Version version; |
47 | - | 45 | + private final byte[] octets; |
48 | - protected byte[] octets; | 46 | + private final int netmask; |
49 | - protected int netmask; | ||
50 | - | ||
51 | - private IpPrefix(Version ver, byte[] octets, int netmask) { | ||
52 | - this.version = ver; | ||
53 | - this.octets = Arrays.copyOf(octets, INET_LEN); | ||
54 | - this.netmask = netmask; | ||
55 | - } | ||
56 | - | ||
57 | - private IpPrefix(Version ver, byte[] octets) { | ||
58 | - this.version = ver; | ||
59 | - this.octets = Arrays.copyOf(octets, INET_LEN); | ||
60 | - this.netmask = DEFAULT_MASK; | ||
61 | - } | ||
62 | 47 | ||
63 | /** | 48 | /** |
64 | - * Converts a byte array into an IP address. | 49 | + * Constructor for given IP address version, prefix address octets, |
50 | + * and network mask length. | ||
65 | * | 51 | * |
66 | - * @param address a byte array | 52 | + * @param ver the IP address version |
67 | - * @return an IP address | 53 | + * @param octets the IP prefix address octets |
54 | + * @param netmask the network mask length | ||
68 | */ | 55 | */ |
69 | - public static IpPrefix valueOf(byte [] address) { | 56 | + private IpPrefix(Version ver, byte[] octets, int netmask) { |
70 | - return new IpPrefix(Version.INET, address); | 57 | + this.version = ver; |
58 | + this.octets = Arrays.copyOf(octets, IpAddress.INET_BYTE_LENGTH); | ||
59 | + this.netmask = netmask; | ||
71 | } | 60 | } |
72 | 61 | ||
73 | /** | 62 | /** |
... | @@ -77,7 +66,7 @@ public final class IpPrefix { | ... | @@ -77,7 +66,7 @@ public final class IpPrefix { |
77 | * @param netmask the CIDR value subnet mask | 66 | * @param netmask the CIDR value subnet mask |
78 | * @return an IP address | 67 | * @return an IP address |
79 | */ | 68 | */ |
80 | - public static IpPrefix valueOf(byte [] address, int netmask) { | 69 | + public static IpPrefix valueOf(byte[] address, int netmask) { |
81 | return new IpPrefix(Version.INET, address, netmask); | 70 | return new IpPrefix(Version.INET, address, netmask); |
82 | } | 71 | } |
83 | 72 | ||
... | @@ -87,10 +76,11 @@ public final class IpPrefix { | ... | @@ -87,10 +76,11 @@ public final class IpPrefix { |
87 | * @param address the integer to convert | 76 | * @param address the integer to convert |
88 | * @return a byte array | 77 | * @return a byte array |
89 | */ | 78 | */ |
90 | - private static byte [] bytes(int address) { | 79 | + private static byte[] bytes(int address) { |
91 | - byte [] bytes = new byte [INET_LEN]; | 80 | + byte[] bytes = new byte [IpAddress.INET_BYTE_LENGTH]; |
92 | - for (int i = 0; i < INET_LEN; i++) { | 81 | + for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) { |
93 | - bytes[i] = (byte) ((address >> (INET_LEN - (i + 1)) * 8) & 0xff); | 82 | + bytes[i] = (byte) ((address >> (IpAddress.INET_BYTE_LENGTH |
83 | + - (i + 1)) * 8) & 0xff); | ||
94 | } | 84 | } |
95 | 85 | ||
96 | return bytes; | 86 | return bytes; |
... | @@ -100,16 +90,6 @@ public final class IpPrefix { | ... | @@ -100,16 +90,6 @@ public final class IpPrefix { |
100 | * Converts an integer into an IPv4 address. | 90 | * Converts an integer into an IPv4 address. |
101 | * | 91 | * |
102 | * @param address an integer representing an IP value | 92 | * @param address an integer representing an IP value |
103 | - * @return an IP address | ||
104 | - */ | ||
105 | - public static IpPrefix valueOf(int address) { | ||
106 | - return new IpPrefix(Version.INET, bytes(address)); | ||
107 | - } | ||
108 | - | ||
109 | - /** | ||
110 | - * Converts an integer into an IPv4 address. | ||
111 | - * | ||
112 | - * @param address an integer representing an IP value | ||
113 | * @param netmask the CIDR value subnet mask | 93 | * @param netmask the CIDR value subnet mask |
114 | * @return an IP address | 94 | * @return an IP address |
115 | */ | 95 | */ |
... | @@ -127,7 +107,7 @@ public final class IpPrefix { | ... | @@ -127,7 +107,7 @@ public final class IpPrefix { |
127 | */ | 107 | */ |
128 | public static IpPrefix valueOf(String address) { | 108 | public static IpPrefix valueOf(String address) { |
129 | 109 | ||
130 | - final String [] parts = address.split("\\/"); | 110 | + final String[] parts = address.split("\\/"); |
131 | if (parts.length > 2) { | 111 | if (parts.length > 2) { |
132 | throw new IllegalArgumentException("Malformed IP address string; " | 112 | throw new IllegalArgumentException("Malformed IP address string; " |
133 | + "Address must take form \"x.x.x.x\" or \"x.x.x.x/y\""); | 113 | + "Address must take form \"x.x.x.x\" or \"x.x.x.x/y\""); |
... | @@ -136,20 +116,20 @@ public final class IpPrefix { | ... | @@ -136,20 +116,20 @@ public final class IpPrefix { |
136 | int mask = DEFAULT_MASK; | 116 | int mask = DEFAULT_MASK; |
137 | if (parts.length == 2) { | 117 | if (parts.length == 2) { |
138 | mask = Integer.parseInt(parts[1]); | 118 | mask = Integer.parseInt(parts[1]); |
139 | - if (mask > MAX_INET_MASK) { | 119 | + if (mask > MAX_INET_MASK_LENGTH) { |
140 | throw new IllegalArgumentException( | 120 | throw new IllegalArgumentException( |
141 | "Value of subnet mask cannot exceed " | 121 | "Value of subnet mask cannot exceed " |
142 | - + MAX_INET_MASK); | 122 | + + MAX_INET_MASK_LENGTH); |
143 | } | 123 | } |
144 | } | 124 | } |
145 | 125 | ||
146 | - final String [] net = parts[0].split("\\."); | 126 | + final String[] net = parts[0].split("\\."); |
147 | - if (net.length != INET_LEN) { | 127 | + if (net.length != IpAddress.INET_BYTE_LENGTH) { |
148 | throw new IllegalArgumentException("Malformed IP address string; " | 128 | throw new IllegalArgumentException("Malformed IP address string; " |
149 | + "Address must have four decimal values separated by dots (.)"); | 129 | + "Address must have four decimal values separated by dots (.)"); |
150 | } | 130 | } |
151 | - final byte [] bytes = new byte[INET_LEN]; | 131 | + final byte[] bytes = new byte[IpAddress.INET_BYTE_LENGTH]; |
152 | - for (int i = 0; i < INET_LEN; i++) { | 132 | + for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) { |
153 | bytes[i] = (byte) Short.parseShort(net[i], 10); | 133 | bytes[i] = (byte) Short.parseShort(net[i], 10); |
154 | } | 134 | } |
155 | return new IpPrefix(Version.INET, bytes, mask); | 135 | return new IpPrefix(Version.INET, bytes, mask); |
... | @@ -170,7 +150,7 @@ public final class IpPrefix { | ... | @@ -170,7 +150,7 @@ public final class IpPrefix { |
170 | * @return a byte array | 150 | * @return a byte array |
171 | */ | 151 | */ |
172 | public byte[] toOctets() { | 152 | public byte[] toOctets() { |
173 | - return Arrays.copyOf(this.octets, INET_LEN); | 153 | + return Arrays.copyOf(this.octets, IpAddress.INET_BYTE_LENGTH); |
174 | } | 154 | } |
175 | 155 | ||
176 | /** | 156 | /** |
... | @@ -202,18 +182,17 @@ public final class IpPrefix { | ... | @@ -202,18 +182,17 @@ public final class IpPrefix { |
202 | * @return an integer bitmask | 182 | * @return an integer bitmask |
203 | */ | 183 | */ |
204 | private int mask() { | 184 | private int mask() { |
205 | - int shift = MAX_INET_MASK - this.netmask; | 185 | + int shift = MAX_INET_MASK_LENGTH - this.netmask; |
206 | return ((Integer.MAX_VALUE >>> (shift - 1)) << shift); | 186 | return ((Integer.MAX_VALUE >>> (shift - 1)) << shift); |
207 | } | 187 | } |
208 | 188 | ||
209 | /** | 189 | /** |
210 | - * Returns the subnet mask in IpAddress form. The netmask value for | 190 | + * Returns the subnet mask in IpAddress form. |
211 | - * the returned IpAddress is 0, as the address itself is a mask. | ||
212 | * | 191 | * |
213 | - * @return the subnet mask | 192 | + * @return the subnet mask as an IpAddress |
214 | */ | 193 | */ |
215 | - public IpPrefix netmask() { | 194 | + public IpAddress netmask() { |
216 | - return new IpPrefix(Version.INET, bytes(mask())); | 195 | + return IpAddress.valueOf(mask()); |
217 | } | 196 | } |
218 | 197 | ||
219 | /** | 198 | /** |
... | @@ -228,9 +207,9 @@ public final class IpPrefix { | ... | @@ -228,9 +207,9 @@ public final class IpPrefix { |
228 | return new IpPrefix(version, ANY, DEFAULT_MASK); | 207 | return new IpPrefix(version, ANY, DEFAULT_MASK); |
229 | } | 208 | } |
230 | 209 | ||
231 | - byte [] net = new byte [4]; | 210 | + byte[] net = new byte [4]; |
232 | - byte [] mask = bytes(mask()); | 211 | + byte[] mask = bytes(mask()); |
233 | - for (int i = 0; i < INET_LEN; i++) { | 212 | + for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) { |
234 | net[i] = (byte) (octets[i] & mask[i]); | 213 | net[i] = (byte) (octets[i] & mask[i]); |
235 | } | 214 | } |
236 | return new IpPrefix(version, net, netmask); | 215 | return new IpPrefix(version, net, netmask); |
... | @@ -249,9 +228,9 @@ public final class IpPrefix { | ... | @@ -249,9 +228,9 @@ public final class IpPrefix { |
249 | new IpPrefix(version, octets, netmask); | 228 | new IpPrefix(version, octets, netmask); |
250 | } | 229 | } |
251 | 230 | ||
252 | - byte [] host = new byte [INET_LEN]; | 231 | + byte[] host = new byte [IpAddress.INET_BYTE_LENGTH]; |
253 | - byte [] mask = bytes(mask()); | 232 | + byte[] mask = bytes(mask()); |
254 | - for (int i = 0; i < INET_LEN; i++) { | 233 | + for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) { |
255 | host[i] = (byte) (octets[i] & ~mask[i]); | 234 | host[i] = (byte) (octets[i] & ~mask[i]); |
256 | } | 235 | } |
257 | return new IpPrefix(version, host, netmask); | 236 | return new IpPrefix(version, host, netmask); |
... | @@ -283,7 +262,7 @@ public final class IpPrefix { | ... | @@ -283,7 +262,7 @@ public final class IpPrefix { |
283 | public boolean contains(IpPrefix other) { | 262 | public boolean contains(IpPrefix other) { |
284 | if (this.netmask <= other.netmask) { | 263 | if (this.netmask <= other.netmask) { |
285 | // Special case where they're both /32 addresses | 264 | // Special case where they're both /32 addresses |
286 | - if (this.netmask == MAX_INET_MASK) { | 265 | + if (this.netmask == MAX_INET_MASK_LENGTH) { |
287 | return Arrays.equals(octets, other.octets); | 266 | return Arrays.equals(octets, other.octets); |
288 | } | 267 | } |
289 | 268 | ||
... | @@ -302,7 +281,7 @@ public final class IpPrefix { | ... | @@ -302,7 +281,7 @@ public final class IpPrefix { |
302 | IpPrefix meMasked = network(); | 281 | IpPrefix meMasked = network(); |
303 | 282 | ||
304 | IpPrefix otherMasked = | 283 | IpPrefix otherMasked = |
305 | - IpPrefix.valueOf(address.octets, netmask).network(); | 284 | + IpPrefix.valueOf(address.toOctets(), netmask).network(); |
306 | 285 | ||
307 | return Arrays.equals(meMasked.octets, otherMasked.octets); | 286 | return Arrays.equals(meMasked.octets, otherMasked.octets); |
308 | } | 287 | } |
... | @@ -364,5 +343,4 @@ public final class IpPrefix { | ... | @@ -364,5 +343,4 @@ public final class IpPrefix { |
364 | } | 343 | } |
365 | return builder.toString(); | 344 | return builder.toString(); |
366 | } | 345 | } |
367 | - | ||
368 | } | 346 | } | ... | ... |
... | @@ -32,15 +32,15 @@ public class IpPrefixTest { | ... | @@ -32,15 +32,15 @@ public class IpPrefixTest { |
32 | private static final byte [] BYTES2 = new byte [] {0xa, 0x0, 0x0, 0xb}; | 32 | private static final byte [] BYTES2 = new byte [] {0xa, 0x0, 0x0, 0xb}; |
33 | private static final int INTVAL1 = 167772170; | 33 | private static final int INTVAL1 = 167772170; |
34 | private static final int INTVAL2 = 167772171; | 34 | private static final int INTVAL2 = 167772171; |
35 | - private static final String STRVAL = "10.0.0.12"; | 35 | + private static final String STRVAL = "10.0.0.12/16"; |
36 | - private static final int MASK = 16; | 36 | + private static final int MASK_LENGTH = 16; |
37 | 37 | ||
38 | @Test | 38 | @Test |
39 | public void testEquality() { | 39 | public void testEquality() { |
40 | - IpPrefix ip1 = IpPrefix.valueOf(BYTES1); | 40 | + IpPrefix ip1 = IpPrefix.valueOf(BYTES1, IpPrefix.MAX_INET_MASK_LENGTH); |
41 | - IpPrefix ip2 = IpPrefix.valueOf(INTVAL1); | 41 | + IpPrefix ip2 = IpPrefix.valueOf(INTVAL1, IpPrefix.MAX_INET_MASK_LENGTH); |
42 | - IpPrefix ip3 = IpPrefix.valueOf(BYTES2); | 42 | + IpPrefix ip3 = IpPrefix.valueOf(BYTES2, IpPrefix.MAX_INET_MASK_LENGTH); |
43 | - IpPrefix ip4 = IpPrefix.valueOf(INTVAL2); | 43 | + IpPrefix ip4 = IpPrefix.valueOf(INTVAL2, IpPrefix.MAX_INET_MASK_LENGTH); |
44 | IpPrefix ip5 = IpPrefix.valueOf(STRVAL); | 44 | IpPrefix ip5 = IpPrefix.valueOf(STRVAL); |
45 | 45 | ||
46 | new EqualsTester().addEqualityGroup(ip1, ip2) | 46 | new EqualsTester().addEqualityGroup(ip1, ip2) |
... | @@ -49,21 +49,21 @@ public class IpPrefixTest { | ... | @@ -49,21 +49,21 @@ public class IpPrefixTest { |
49 | .testEquals(); | 49 | .testEquals(); |
50 | 50 | ||
51 | // string conversions | 51 | // string conversions |
52 | - IpPrefix ip6 = IpPrefix.valueOf(BYTES1, MASK); | 52 | + IpPrefix ip6 = IpPrefix.valueOf(BYTES1, MASK_LENGTH); |
53 | IpPrefix ip7 = IpPrefix.valueOf("10.0.0.10/16"); | 53 | IpPrefix ip7 = IpPrefix.valueOf("10.0.0.10/16"); |
54 | - IpPrefix ip8 = IpPrefix.valueOf(new byte [] {0xa, 0x0, 0x0, 0xc}); | 54 | + IpPrefix ip8 = IpPrefix.valueOf(new byte [] {0xa, 0x0, 0x0, 0xc}, 16); |
55 | assertEquals("incorrect address conversion", ip6, ip7); | 55 | assertEquals("incorrect address conversion", ip6, ip7); |
56 | assertEquals("incorrect address conversion", ip5, ip8); | 56 | assertEquals("incorrect address conversion", ip5, ip8); |
57 | } | 57 | } |
58 | 58 | ||
59 | @Test | 59 | @Test |
60 | public void basics() { | 60 | public void basics() { |
61 | - IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK); | 61 | + IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK_LENGTH); |
62 | final byte [] bytes = new byte [] {0xa, 0x0, 0x0, 0xa}; | 62 | final byte [] bytes = new byte [] {0xa, 0x0, 0x0, 0xa}; |
63 | 63 | ||
64 | //check fields | 64 | //check fields |
65 | assertEquals("incorrect IP Version", Version.INET, ip1.version()); | 65 | assertEquals("incorrect IP Version", Version.INET, ip1.version()); |
66 | - assertEquals("incorrect netmask", 16, ip1.netmask); | 66 | + assertEquals("incorrect netmask", 16, ip1.prefixLength()); |
67 | assertTrue("faulty toOctets()", Arrays.equals(bytes, ip1.toOctets())); | 67 | assertTrue("faulty toOctets()", Arrays.equals(bytes, ip1.toOctets())); |
68 | assertEquals("faulty toInt()", INTVAL1, ip1.toInt()); | 68 | assertEquals("faulty toInt()", INTVAL1, ip1.toInt()); |
69 | assertEquals("faulty toString()", "10.0.0.10/16", ip1.toString()); | 69 | assertEquals("faulty toString()", "10.0.0.10/16", ip1.toString()); |
... | @@ -72,7 +72,7 @@ public class IpPrefixTest { | ... | @@ -72,7 +72,7 @@ public class IpPrefixTest { |
72 | @Test | 72 | @Test |
73 | public void netmasks() { | 73 | public void netmasks() { |
74 | // masked | 74 | // masked |
75 | - IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK); | 75 | + IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK_LENGTH); |
76 | 76 | ||
77 | IpPrefix host = IpPrefix.valueOf("0.0.0.10/16"); | 77 | IpPrefix host = IpPrefix.valueOf("0.0.0.10/16"); |
78 | IpPrefix network = IpPrefix.valueOf("10.0.0.0/16"); | 78 | IpPrefix network = IpPrefix.valueOf("10.0.0.0/16"); |
... | @@ -80,14 +80,6 @@ public class IpPrefixTest { | ... | @@ -80,14 +80,6 @@ public class IpPrefixTest { |
80 | assertEquals("incorrect network address", network, ip1.network()); | 80 | assertEquals("incorrect network address", network, ip1.network()); |
81 | assertEquals("incorrect netmask", "255.255.0.0", ip1.netmask().toString()); | 81 | assertEquals("incorrect netmask", "255.255.0.0", ip1.netmask().toString()); |
82 | 82 | ||
83 | - //unmasked | ||
84 | - IpPrefix ip2 = IpPrefix.valueOf(BYTES1); | ||
85 | - IpPrefix umhost = IpPrefix.valueOf("10.0.0.10/0"); | ||
86 | - IpPrefix umnet = IpPrefix.valueOf("0.0.0.0/0"); | ||
87 | - assertEquals("incorrect host address", umhost, ip2.host()); | ||
88 | - assertEquals("incorrect host address", umnet, ip2.network()); | ||
89 | - assertTrue("incorrect netmask", | ||
90 | - Arrays.equals(IpPrefix.ANY, ip2.netmask().toOctets())); | ||
91 | } | 83 | } |
92 | 84 | ||
93 | @Test | 85 | @Test | ... | ... |
... | @@ -20,6 +20,7 @@ import java.net.UnknownHostException; | ... | @@ -20,6 +20,7 @@ import java.net.UnknownHostException; |
20 | import java.util.concurrent.ConcurrentHashMap; | 20 | import java.util.concurrent.ConcurrentHashMap; |
21 | import java.util.concurrent.ConcurrentMap; | 21 | import java.util.concurrent.ConcurrentMap; |
22 | import java.util.concurrent.TimeUnit; | 22 | import java.util.concurrent.TimeUnit; |
23 | +import java.util.concurrent.TimeoutException; | ||
23 | import java.util.concurrent.atomic.AtomicLong; | 24 | import java.util.concurrent.atomic.AtomicLong; |
24 | 25 | ||
25 | import io.netty.bootstrap.Bootstrap; | 26 | import io.netty.bootstrap.Bootstrap; |
... | @@ -27,6 +28,7 @@ import io.netty.bootstrap.ServerBootstrap; | ... | @@ -27,6 +28,7 @@ import io.netty.bootstrap.ServerBootstrap; |
27 | import io.netty.buffer.PooledByteBufAllocator; | 28 | import io.netty.buffer.PooledByteBufAllocator; |
28 | import io.netty.channel.Channel; | 29 | import io.netty.channel.Channel; |
29 | import io.netty.channel.ChannelFuture; | 30 | import io.netty.channel.ChannelFuture; |
31 | +import io.netty.channel.ChannelFutureListener; | ||
30 | import io.netty.channel.ChannelHandler; | 32 | import io.netty.channel.ChannelHandler; |
31 | import io.netty.channel.ChannelHandlerContext; | 33 | import io.netty.channel.ChannelHandlerContext; |
32 | import io.netty.channel.ChannelInitializer; | 34 | import io.netty.channel.ChannelInitializer; |
... | @@ -49,6 +51,8 @@ import org.slf4j.LoggerFactory; | ... | @@ -49,6 +51,8 @@ import org.slf4j.LoggerFactory; |
49 | 51 | ||
50 | import com.google.common.cache.Cache; | 52 | import com.google.common.cache.Cache; |
51 | import com.google.common.cache.CacheBuilder; | 53 | import com.google.common.cache.CacheBuilder; |
54 | +import com.google.common.cache.RemovalListener; | ||
55 | +import com.google.common.cache.RemovalNotification; | ||
52 | import com.google.common.util.concurrent.ListenableFuture; | 56 | import com.google.common.util.concurrent.ListenableFuture; |
53 | import com.google.common.util.concurrent.SettableFuture; | 57 | import com.google.common.util.concurrent.SettableFuture; |
54 | 58 | ||
... | @@ -64,8 +68,13 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -64,8 +68,13 @@ public class NettyMessagingService implements MessagingService { |
64 | private final AtomicLong messageIdGenerator = new AtomicLong(0); | 68 | private final AtomicLong messageIdGenerator = new AtomicLong(0); |
65 | private final Cache<Long, SettableFuture<byte[]>> responseFutures = CacheBuilder.newBuilder() | 69 | private final Cache<Long, SettableFuture<byte[]>> responseFutures = CacheBuilder.newBuilder() |
66 | .maximumSize(100000) | 70 | .maximumSize(100000) |
67 | - // TODO: Once the entry expires, notify blocking threads (if any). | 71 | + .expireAfterWrite(10, TimeUnit.SECONDS) |
68 | - .expireAfterWrite(10, TimeUnit.MINUTES) | 72 | + .removalListener(new RemovalListener<Long, SettableFuture<byte[]>>() { |
73 | + @Override | ||
74 | + public void onRemoval(RemovalNotification<Long, SettableFuture<byte[]>> entry) { | ||
75 | + entry.getValue().setException(new TimeoutException("Timedout waiting for reply")); | ||
76 | + } | ||
77 | + }) | ||
69 | .build(); | 78 | .build(); |
70 | private final GenericKeyedObjectPool<Endpoint, Channel> channels | 79 | private final GenericKeyedObjectPool<Endpoint, Channel> channels |
71 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); | 80 | = new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory()); |
... | @@ -153,9 +162,12 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -153,9 +162,12 @@ public class NettyMessagingService implements MessagingService { |
153 | } finally { | 162 | } finally { |
154 | channels.returnObject(ep, channel); | 163 | channels.returnObject(ep, channel); |
155 | } | 164 | } |
165 | + } catch (IOException e) { | ||
166 | + throw e; | ||
156 | } catch (Exception e) { | 167 | } catch (Exception e) { |
157 | - throw new IOException("Failed to send message to " + ep.toString(), e); | 168 | + throw new IOException(e); |
158 | } | 169 | } |
170 | + | ||
159 | } | 171 | } |
160 | 172 | ||
161 | @Override | 173 | @Override |
... | @@ -172,7 +184,7 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -172,7 +184,7 @@ public class NettyMessagingService implements MessagingService { |
172 | .build(); | 184 | .build(); |
173 | try { | 185 | try { |
174 | sendAsync(ep, message); | 186 | sendAsync(ep, message); |
175 | - } catch (IOException e) { | 187 | + } catch (Exception e) { |
176 | responseFutures.invalidate(messageId); | 188 | responseFutures.invalidate(messageId); |
177 | throw e; | 189 | throw e; |
178 | } | 190 | } |
... | @@ -277,7 +289,7 @@ public class NettyMessagingService implements MessagingService { | ... | @@ -277,7 +289,7 @@ public class NettyMessagingService implements MessagingService { |
277 | 289 | ||
278 | @Override | 290 | @Override |
279 | public void run() { | 291 | public void run() { |
280 | - channel.writeAndFlush(message, channel.voidPromise()); | 292 | + channel.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); |
281 | } | 293 | } |
282 | } | 294 | } |
283 | 295 | ... | ... |
-
Please register or login to post a comment