Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
20 changed files
with
248 additions
and
397 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)) { | 459 | + return false; |
460 | - log.info("duplicate event detected; ignoring"); | 460 | +// synchronized (eventCache) { |
461 | - return true; | 461 | +// if (eventCache.get(term).contains(roleInfo)) { |
462 | - } else { | 462 | +// log.info("duplicate event detected; ignoring"); |
463 | - eventCache.put(term, roleInfo); | 463 | +// return true; |
464 | - // purge by-term oldest entries to keep the cache size under limit | 464 | +// } else { |
465 | - if (eventCache.size() > cacheSize) { | 465 | +// eventCache.put(term, roleInfo); |
466 | - eventCache.removeAll(term - cacheSize); | 466 | +// // purge by-term oldest entries to keep the cache size under limit |
467 | - } | 467 | +// if (eventCache.size() > cacheSize) { |
468 | - return false; | 468 | +// eventCache.removeAll(term - cacheSize); |
469 | - } | 469 | +// } |
470 | - } | 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()); |
143 | - sendProbes(port.number().toLong()); | 145 | + boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER; |
146 | + if (isMaster) { | ||
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() { |
277 | - timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); | 290 | + if (isStopped) { |
278 | - isStopped = false; | 291 | + timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS); |
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) { | ... | ... |
... | @@ -15,147 +15,112 @@ | ... | @@ -15,147 +15,112 @@ |
15 | */ | 15 | */ |
16 | package org.onlab.packet; | 16 | package org.onlab.packet; |
17 | 17 | ||
18 | +import java.nio.ByteBuffer; | ||
18 | import java.util.Arrays; | 19 | import java.util.Arrays; |
19 | - | 20 | +import java.util.Objects; |
20 | - | 21 | +import static com.google.common.base.Preconditions.checkNotNull; |
21 | 22 | ||
22 | /** | 23 | /** |
23 | * A class representing an IPv4 address. | 24 | * A class representing an IPv4 address. |
24 | - * <p/> | ||
25 | - * TODO this class is a clone of IpPrefix and still needs to be modified to | ||
26 | - * look more like an IpAddress. | ||
27 | */ | 25 | */ |
28 | public final class IpAddress implements Comparable<IpAddress> { | 26 | public final class IpAddress implements Comparable<IpAddress> { |
29 | - | 27 | + // IP Versions |
30 | - // TODO a comparator for netmasks? E.g. for sorting by prefix match order. | ||
31 | - | ||
32 | - //IP Versions | ||
33 | public enum Version { INET, INET6 }; | 28 | public enum Version { INET, INET6 }; |
34 | 29 | ||
35 | - //lengths of address, in bytes | 30 | + // lengths of address, in bytes |
36 | - public static final int INET_LEN = 4; | 31 | + public static final int INET_BYTE_LENGTH = 4; |
37 | - public static final int INET6_LEN = 16; | 32 | + public static final int INET_BIT_LENGTH = INET_BYTE_LENGTH * Byte.SIZE; |
33 | + public static final int INET6_BYTE_LENGTH = 16; | ||
34 | + public static final int INET6_BIT_LENGTH = INET6_BYTE_LENGTH * Byte.SIZE; | ||
38 | 35 | ||
39 | - //maximum CIDR value | 36 | + private final Version version; |
40 | - public static final int MAX_INET_MASK = 32; | 37 | + private final byte[] octets; |
41 | - //no mask (no network), e.g. a simple address | ||
42 | - public static final int DEFAULT_MASK = 0; | ||
43 | 38 | ||
44 | /** | 39 | /** |
45 | - * Default value indicating an unspecified address. | 40 | + * Constructor for given IP address version and address octets. |
41 | + * | ||
42 | + * @param value the IP address value stored in network byte order | ||
43 | + * (i.e., the most significant byte first) | ||
44 | + * @param value the IP address value | ||
46 | */ | 45 | */ |
47 | - static final byte[] ANY = new byte [] {0, 0, 0, 0}; | 46 | + private IpAddress(Version version, byte[] value) { |
47 | + checkNotNull(value); | ||
48 | 48 | ||
49 | - protected Version version; | 49 | + this.version = version; |
50 | - | 50 | + this.octets = Arrays.copyOf(value, INET_BYTE_LENGTH); |
51 | - protected byte[] octets; | ||
52 | - protected int netmask; | ||
53 | - | ||
54 | - private IpAddress(Version ver, byte[] octets, int netmask) { | ||
55 | - this.version = ver; | ||
56 | - this.octets = Arrays.copyOf(octets, INET_LEN); | ||
57 | - this.netmask = netmask; | ||
58 | - } | ||
59 | - | ||
60 | - private IpAddress(Version ver, byte[] octets) { | ||
61 | - this.version = ver; | ||
62 | - this.octets = Arrays.copyOf(octets, INET_LEN); | ||
63 | - this.netmask = DEFAULT_MASK; | ||
64 | } | 51 | } |
65 | 52 | ||
66 | /** | 53 | /** |
67 | - * Converts a byte array into an IP address. | 54 | + * Converts an integer into an IPv4 address. |
68 | * | 55 | * |
69 | - * @param address a byte array | 56 | + * @param value an integer representing an IPv4 value |
70 | * @return an IP address | 57 | * @return an IP address |
71 | */ | 58 | */ |
72 | - public static IpAddress valueOf(byte [] address) { | 59 | + public static IpAddress valueOf(int value) { |
73 | - return new IpAddress(Version.INET, address); | 60 | + byte[] bytes = |
61 | + ByteBuffer.allocate(INET_BYTE_LENGTH).putInt(value).array(); | ||
62 | + return new IpAddress(Version.INET, bytes); | ||
74 | } | 63 | } |
75 | 64 | ||
76 | /** | 65 | /** |
77 | * Converts a byte array into an IP address. | 66 | * Converts a byte array into an IP address. |
78 | * | 67 | * |
79 | - * @param address a byte array | 68 | + * @param value the IP address value stored in network byte order |
80 | - * @param netmask the CIDR value subnet mask | 69 | + * (i.e., the most significant byte first) |
81 | * @return an IP address | 70 | * @return an IP address |
82 | */ | 71 | */ |
83 | - public static IpAddress valueOf(byte [] address, int netmask) { | 72 | + public static IpAddress valueOf(byte[] value) { |
84 | - return new IpAddress(Version.INET, address, netmask); | 73 | + return new IpAddress(Version.INET, value); |
85 | - } | ||
86 | - | ||
87 | - /** | ||
88 | - * Helper to convert an integer into a byte array. | ||
89 | - * | ||
90 | - * @param address the integer to convert | ||
91 | - * @return a byte array | ||
92 | - */ | ||
93 | - private static byte [] bytes(int address) { | ||
94 | - byte [] bytes = new byte [INET_LEN]; | ||
95 | - for (int i = 0; i < INET_LEN; i++) { | ||
96 | - bytes[i] = (byte) ((address >> (INET_LEN - (i + 1)) * 8) & 0xff); | ||
97 | - } | ||
98 | - | ||
99 | - return bytes; | ||
100 | } | 74 | } |
101 | 75 | ||
102 | /** | 76 | /** |
103 | - * Converts an integer into an IPv4 address. | 77 | + * Converts a byte array and a given offset from the beginning of the |
78 | + * array into an IP address. | ||
79 | + * <p/> | ||
80 | + * The IP address is stored in network byte order (i.e., the most | ||
81 | + * significant byte first). | ||
104 | * | 82 | * |
105 | - * @param address an integer representing an IP value | 83 | + * @param value the value to use |
84 | + * @param offset the offset in bytes from the beginning of the byte array | ||
106 | * @return an IP address | 85 | * @return an IP address |
107 | */ | 86 | */ |
108 | - public static IpAddress valueOf(int address) { | 87 | + public static IpAddress valueOf(byte[] value, int offset) { |
109 | - return new IpAddress(Version.INET, bytes(address)); | 88 | + // Verify the arguments |
110 | - } | 89 | + if ((offset < 0) || (offset + INET_BYTE_LENGTH > value.length)) { |
90 | + String msg; | ||
91 | + if (value.length < INET_BYTE_LENGTH) { | ||
92 | + msg = "Invalid IPv4 address array: array length: " + | ||
93 | + value.length + ". Must be at least " + INET_BYTE_LENGTH; | ||
94 | + } else { | ||
95 | + msg = "Invalid IPv4 address array: array offset: " + | ||
96 | + offset + ". Must be in the interval [0, " + | ||
97 | + (value.length - INET_BYTE_LENGTH) + "]"; | ||
98 | + } | ||
99 | + throw new IllegalArgumentException(msg); | ||
100 | + } | ||
111 | 101 | ||
112 | - /** | 102 | + byte[] bc = Arrays.copyOfRange(value, offset, value.length); |
113 | - * Converts an integer into an IPv4 address. | 103 | + return IpAddress.valueOf(bc); |
114 | - * | ||
115 | - * @param address an integer representing an IP value | ||
116 | - * @param netmask the CIDR value subnet mask | ||
117 | - * @return an IP address | ||
118 | - */ | ||
119 | - public static IpAddress valueOf(int address, int netmask) { | ||
120 | - return new IpAddress(Version.INET, bytes(address), netmask); | ||
121 | } | 104 | } |
122 | 105 | ||
123 | /** | 106 | /** |
124 | - * Converts a dotted-decimal string (x.x.x.x) into an IPv4 address. The | 107 | + * Converts a dotted-decimal string (x.x.x.x) into an IPv4 address. |
125 | - * string can also be in CIDR (slash) notation. If the netmask is omitted, | ||
126 | - * it will be set to DEFAULT_MASK (0). | ||
127 | * | 108 | * |
128 | - * @param address a IP address in string form, e.g. "10.0.0.1", "10.0.0.1/24" | 109 | + * @param address a IP address in string form, e.g. "10.0.0.1". |
129 | * @return an IP address | 110 | * @return an IP address |
130 | */ | 111 | */ |
131 | public static IpAddress valueOf(String address) { | 112 | public static IpAddress valueOf(String address) { |
132 | - | 113 | + final String[] net = address.split("\\."); |
133 | - final String [] parts = address.split("\\/"); | 114 | + if (net.length != INET_BYTE_LENGTH) { |
134 | - if (parts.length > 2) { | 115 | + String msg = "Malformed IPv4 address string; " + |
135 | - throw new IllegalArgumentException("Malformed IP address string; " | 116 | + "Address must have four decimal values separated by dots (.)"; |
136 | - + "Address must take form \"x.x.x.x\" or \"x.x.x.x/y\""); | 117 | + throw new IllegalArgumentException(msg); |
137 | - } | 118 | + } |
138 | - | 119 | + final byte[] bytes = new byte[INET_BYTE_LENGTH]; |
139 | - int mask = DEFAULT_MASK; | 120 | + for (int i = 0; i < INET_BYTE_LENGTH; i++) { |
140 | - if (parts.length == 2) { | ||
141 | - mask = Integer.parseInt(parts[1]); | ||
142 | - if (mask > MAX_INET_MASK) { | ||
143 | - throw new IllegalArgumentException( | ||
144 | - "Value of subnet mask cannot exceed " | ||
145 | - + MAX_INET_MASK); | ||
146 | - } | ||
147 | - } | ||
148 | - | ||
149 | - final String [] net = parts[0].split("\\."); | ||
150 | - if (net.length != INET_LEN) { | ||
151 | - throw new IllegalArgumentException("Malformed IP address string; " | ||
152 | - + "Address must have four decimal values separated by dots (.)"); | ||
153 | - } | ||
154 | - final byte [] bytes = new byte[INET_LEN]; | ||
155 | - for (int i = 0; i < INET_LEN; i++) { | ||
156 | bytes[i] = (byte) Short.parseShort(net[i], 10); | 121 | bytes[i] = (byte) Short.parseShort(net[i], 10); |
157 | } | 122 | } |
158 | - return new IpAddress(Version.INET, bytes, mask); | 123 | + return new IpAddress(Version.INET, bytes); |
159 | } | 124 | } |
160 | 125 | ||
161 | /** | 126 | /** |
... | @@ -173,16 +138,7 @@ public final class IpAddress implements Comparable<IpAddress> { | ... | @@ -173,16 +138,7 @@ public final class IpAddress implements Comparable<IpAddress> { |
173 | * @return a byte array | 138 | * @return a byte array |
174 | */ | 139 | */ |
175 | public byte[] toOctets() { | 140 | public byte[] toOctets() { |
176 | - return Arrays.copyOf(this.octets, INET_LEN); | 141 | + return Arrays.copyOf(this.octets, INET_BYTE_LENGTH); |
177 | - } | ||
178 | - | ||
179 | - /** | ||
180 | - * Returns the IP address prefix length. | ||
181 | - * | ||
182 | - * @return prefix length | ||
183 | - */ | ||
184 | - public int prefixLength() { | ||
185 | - return netmask; | ||
186 | } | 142 | } |
187 | 143 | ||
188 | /** | 144 | /** |
... | @@ -191,110 +147,50 @@ public final class IpAddress implements Comparable<IpAddress> { | ... | @@ -191,110 +147,50 @@ public final class IpAddress implements Comparable<IpAddress> { |
191 | * @return the IP address's value as an integer | 147 | * @return the IP address's value as an integer |
192 | */ | 148 | */ |
193 | public int toInt() { | 149 | public int toInt() { |
194 | - int val = 0; | 150 | + ByteBuffer bb = ByteBuffer.wrap(octets); |
195 | - for (int i = 0; i < octets.length; i++) { | 151 | + return bb.getInt(); |
196 | - val <<= 8; | ||
197 | - val |= octets[i] & 0xff; | ||
198 | - } | ||
199 | - return val; | ||
200 | - } | ||
201 | - | ||
202 | - /** | ||
203 | - * Converts the IP address to a /32 IP prefix. | ||
204 | - * | ||
205 | - * @return the new IP prefix | ||
206 | - */ | ||
207 | - public IpPrefix toPrefix() { | ||
208 | - return IpPrefix.valueOf(octets, MAX_INET_MASK); | ||
209 | - } | ||
210 | - | ||
211 | - /** | ||
212 | - * Helper for computing the mask value from CIDR. | ||
213 | - * | ||
214 | - * @return an integer bitmask | ||
215 | - */ | ||
216 | - private int mask() { | ||
217 | - int shift = MAX_INET_MASK - this.netmask; | ||
218 | - return ((Integer.MAX_VALUE >>> (shift - 1)) << shift); | ||
219 | - } | ||
220 | - | ||
221 | - /** | ||
222 | - * Returns the subnet mask in IpAddress form. The netmask value for | ||
223 | - * the returned IpAddress is 0, as the address itself is a mask. | ||
224 | - * | ||
225 | - * @return the subnet mask | ||
226 | - */ | ||
227 | - public IpAddress netmask() { | ||
228 | - return new IpAddress(Version.INET, bytes(mask())); | ||
229 | } | 152 | } |
230 | 153 | ||
231 | /** | 154 | /** |
232 | - * Returns the network portion of this address as an IpAddress. | 155 | + * Creates an IP network mask prefix. |
233 | - * The netmask of the returned IpAddress is the current mask. If this | ||
234 | - * address doesn't have a mask, this returns an all-0 IpAddress. | ||
235 | * | 156 | * |
236 | - * @return the network address or null | 157 | + * @param prefixLen the length of the mask prefix. Must be in the interval |
158 | + * [0, 32] for IPv4 | ||
159 | + * @return a new IP address that contains a mask prefix of the | ||
160 | + * specified length | ||
237 | */ | 161 | */ |
238 | - public IpAddress network() { | 162 | + public static IpAddress makeMaskPrefix(int prefixLen) { |
239 | - if (netmask == DEFAULT_MASK) { | 163 | + // Verify the prefix length |
240 | - return new IpAddress(version, ANY, DEFAULT_MASK); | 164 | + if ((prefixLen < 0) || (prefixLen > INET_BIT_LENGTH)) { |
165 | + final String msg = "Invalid IPv4 prefix length: " + prefixLen + | ||
166 | + ". Must be in the interval [0, 32]."; | ||
167 | + throw new IllegalArgumentException(msg); | ||
241 | } | 168 | } |
242 | 169 | ||
243 | - byte [] net = new byte [4]; | 170 | + long v = (0xffffffffL << (INET_BIT_LENGTH - prefixLen)) & 0xffffffffL; |
244 | - byte [] mask = bytes(mask()); | 171 | + return IpAddress.valueOf((int) v); |
245 | - for (int i = 0; i < INET_LEN; i++) { | ||
246 | - net[i] = (byte) (octets[i] & mask[i]); | ||
247 | - } | ||
248 | - return new IpAddress(version, net, netmask); | ||
249 | } | 172 | } |
250 | 173 | ||
251 | /** | 174 | /** |
252 | - * Returns the host portion of the IPAddress, as an IPAddress. | 175 | + * Creates an IP address by masking it with a network mask of given |
253 | - * The netmask of the returned IpAddress is the current mask. If this | 176 | + * mask length. |
254 | - * address doesn't have a mask, this returns a copy of the current | ||
255 | - * address. | ||
256 | * | 177 | * |
257 | - * @return the host address | 178 | + * @param addr the address to mask |
179 | + * @param prefixLen the length of the mask prefix. Must be in the interval | ||
180 | + * [0, 32] for IPv4 | ||
181 | + * @return a new IP address that is masked with a mask prefix of the | ||
182 | + * specified length | ||
258 | */ | 183 | */ |
259 | - public IpAddress host() { | 184 | + public static IpAddress makeMaskedAddress(final IpAddress addr, |
260 | - if (netmask == DEFAULT_MASK) { | 185 | + int prefixLen) { |
261 | - new IpAddress(version, octets, netmask); | 186 | + IpAddress mask = IpAddress.makeMaskPrefix(prefixLen); |
262 | - } | 187 | + byte[] net = new byte[INET_BYTE_LENGTH]; |
263 | 188 | ||
264 | - byte [] host = new byte [INET_LEN]; | 189 | + // Mask each byte |
265 | - byte [] mask = bytes(mask()); | 190 | + for (int i = 0; i < INET_BYTE_LENGTH; i++) { |
266 | - for (int i = 0; i < INET_LEN; i++) { | 191 | + net[i] = (byte) (addr.octets[i] & mask.octets[i]); |
267 | - host[i] = (byte) (octets[i] & ~mask[i]); | ||
268 | } | 192 | } |
269 | - return new IpAddress(version, host, netmask); | 193 | + return IpAddress.valueOf(net); |
270 | - } | ||
271 | - | ||
272 | - public boolean isMasked() { | ||
273 | - return mask() != 0; | ||
274 | - } | ||
275 | - | ||
276 | - /** | ||
277 | - * Determines whether a given address is contained within this IpAddress' | ||
278 | - * network. | ||
279 | - * | ||
280 | - * @param other another IP address that could be contained in this network | ||
281 | - * @return true if the other IP address is contained in this address' | ||
282 | - * network, otherwise false | ||
283 | - */ | ||
284 | - public boolean contains(IpAddress other) { | ||
285 | - if (this.netmask <= other.netmask) { | ||
286 | - // Special case where they're both /32 addresses | ||
287 | - if (this.netmask == MAX_INET_MASK) { | ||
288 | - return Arrays.equals(octets, other.octets); | ||
289 | - } | ||
290 | - | ||
291 | - // Mask the other address with our network mask | ||
292 | - IpAddress otherMasked = | ||
293 | - IpAddress.valueOf(other.octets, netmask).network(); | ||
294 | - | ||
295 | - return network().equals(otherMasked); | ||
296 | - } | ||
297 | - return false; | ||
298 | } | 194 | } |
299 | 195 | ||
300 | @Override | 196 | @Override |
... | @@ -306,43 +202,26 @@ public final class IpAddress implements Comparable<IpAddress> { | ... | @@ -306,43 +202,26 @@ public final class IpAddress implements Comparable<IpAddress> { |
306 | 202 | ||
307 | @Override | 203 | @Override |
308 | public int hashCode() { | 204 | public int hashCode() { |
309 | - final int prime = 31; | 205 | + return Objects.hash(version, octets); |
310 | - int result = 1; | ||
311 | - result = prime * result + netmask; | ||
312 | - result = prime * result + Arrays.hashCode(octets); | ||
313 | - result = prime * result + ((version == null) ? 0 : version.hashCode()); | ||
314 | - return result; | ||
315 | } | 206 | } |
316 | 207 | ||
317 | @Override | 208 | @Override |
318 | public boolean equals(Object obj) { | 209 | public boolean equals(Object obj) { |
319 | - if (this == obj) { | 210 | + if (obj == this) { |
320 | return true; | 211 | return true; |
321 | } | 212 | } |
322 | - if (obj == null) { | 213 | + if ((obj == null) || (getClass() != obj.getClass())) { |
323 | - return false; | ||
324 | - } | ||
325 | - if (getClass() != obj.getClass()) { | ||
326 | return false; | 214 | return false; |
327 | } | 215 | } |
328 | IpAddress other = (IpAddress) obj; | 216 | IpAddress other = (IpAddress) obj; |
329 | - if (netmask != other.netmask) { | 217 | + return (version == other.version) && |
330 | - return false; | 218 | + Arrays.equals(octets, other.octets); |
331 | - } | ||
332 | - if (!Arrays.equals(octets, other.octets)) { | ||
333 | - return false; | ||
334 | - } | ||
335 | - if (version != other.version) { | ||
336 | - return false; | ||
337 | - } | ||
338 | - return true; | ||
339 | } | 219 | } |
340 | 220 | ||
341 | @Override | 221 | @Override |
342 | /* | 222 | /* |
343 | * (non-Javadoc) | 223 | * (non-Javadoc) |
344 | - * format is "x.x.x.x" for non-masked (netmask 0) addresses, | 224 | + * format is "x.x.x.x" for IPv4 addresses. |
345 | - * and "x.x.x.x/y" for masked addresses. | ||
346 | * | 225 | * |
347 | * @see java.lang.Object#toString() | 226 | * @see java.lang.Object#toString() |
348 | */ | 227 | */ |
... | @@ -354,11 +233,6 @@ public final class IpAddress implements Comparable<IpAddress> { | ... | @@ -354,11 +233,6 @@ public final class IpAddress implements Comparable<IpAddress> { |
354 | } | 233 | } |
355 | builder.append(String.format("%d", b & 0xff)); | 234 | builder.append(String.format("%d", b & 0xff)); |
356 | } | 235 | } |
357 | - if (netmask != DEFAULT_MASK) { | ||
358 | - builder.append("/"); | ||
359 | - builder.append(String.format("%d", netmask)); | ||
360 | - } | ||
361 | return builder.toString(); | 236 | return builder.toString(); |
362 | } | 237 | } |
363 | - | ||
364 | } | 238 | } | ... | ... |
... | @@ -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