Praseed Balakrishnan

Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next

...@@ -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) {
......
...@@ -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
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);
110 } 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 } 152 }
201 153
202 /** 154 /**
203 - * Converts the IP address to a /32 IP prefix. 155 + * Creates an IP network mask prefix.
204 * 156 *
205 - * @return the new IP prefix 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
206 */ 161 */
207 - public IpPrefix toPrefix() { 162 + public static IpAddress makeMaskPrefix(int prefixLen) {
208 - return IpPrefix.valueOf(octets, MAX_INET_MASK); 163 + // Verify the prefix length
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);
209 } 168 }
210 169
211 - /** 170 + long v = (0xffffffffL << (INET_BIT_LENGTH - prefixLen)) & 0xffffffffL;
212 - * Helper for computing the mask value from CIDR. 171 + return IpAddress.valueOf((int) v);
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 - }
230 -
231 - /**
232 - * Returns the network portion of this address as an IpAddress.
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 - *
236 - * @return the network address or null
237 - */
238 - public IpAddress network() {
239 - if (netmask == DEFAULT_MASK) {
240 - return new IpAddress(version, ANY, DEFAULT_MASK);
241 - }
242 -
243 - byte [] net = new byte [4];
244 - byte [] mask = bytes(mask());
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 - }
250 -
251 - /**
252 - * Returns the host portion of the IPAddress, as an IPAddress.
253 - * The netmask of the returned IpAddress is the current mask. If this
254 - * address doesn't have a mask, this returns a copy of the current
255 - * address.
256 - *
257 - * @return the host address
258 - */
259 - public IpAddress host() {
260 - if (netmask == DEFAULT_MASK) {
261 - new IpAddress(version, octets, netmask);
262 - }
263 -
264 - byte [] host = new byte [INET_LEN];
265 - byte [] mask = bytes(mask());
266 - for (int i = 0; i < INET_LEN; i++) {
267 - host[i] = (byte) (octets[i] & ~mask[i]);
268 - }
269 - return new IpAddress(version, host, netmask);
270 - }
271 -
272 - public boolean isMasked() {
273 - return mask() != 0;
274 } 172 }
275 173
276 /** 174 /**
277 - * Determines whether a given address is contained within this IpAddress' 175 + * Creates an IP address by masking it with a network mask of given
278 - * network. 176 + * mask length.
279 * 177 *
280 - * @param other another IP address that could be contained in this network 178 + * @param addr the address to mask
281 - * @return true if the other IP address is contained in this address' 179 + * @param prefixLen the length of the mask prefix. Must be in the interval
282 - * network, otherwise false 180 + * [0, 32] for IPv4
181 + * @return a new IP address that is masked with a mask prefix of the
182 + * specified length
283 */ 183 */
284 - public boolean contains(IpAddress other) { 184 + public static IpAddress makeMaskedAddress(final IpAddress addr,
285 - if (this.netmask <= other.netmask) { 185 + int prefixLen) {
286 - // Special case where they're both /32 addresses 186 + IpAddress mask = IpAddress.makeMaskPrefix(prefixLen);
287 - if (this.netmask == MAX_INET_MASK) { 187 + byte[] net = new byte[INET_BYTE_LENGTH];
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 188
295 - return network().equals(otherMasked); 189 + // Mask each byte
190 + for (int i = 0; i < INET_BYTE_LENGTH; i++) {
191 + net[i] = (byte) (addr.octets[i] & mask.octets[i]);
296 } 192 }
297 - return false; 193 + return IpAddress.valueOf(net);
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
......