Praseed Balakrishnan

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

......@@ -148,9 +148,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_TCP)
.matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchTcpDst((short) BgpConstants.BGP_PORT)
.build();
......@@ -171,9 +171,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_TCP)
.matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchTcpSrc((short) BgpConstants.BGP_PORT)
.build();
......@@ -191,9 +191,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_TCP)
.matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchTcpDst((short) BgpConstants.BGP_PORT)
.build();
......@@ -211,9 +211,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_TCP)
.matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchTcpSrc((short) BgpConstants.BGP_PORT)
.build();
......@@ -281,9 +281,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_ICMP)
.matchIPSrc(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.build();
TrafficTreatment treatment = DefaultTrafficTreatment.builder()
......@@ -301,9 +301,9 @@ public class PeerConnectivityManager {
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPProtocol(IPv4.PROTOCOL_ICMP)
.matchIPSrc(IpPrefix.valueOf(bgpdPeerAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.matchIPDst(IpPrefix.valueOf(bgpdAddress.toInt(),
IpAddress.MAX_INET_MASK))
IpPrefix.MAX_INET_MASK_LENGTH))
.build();
PointToPointIntent reversedIntent =
......
......@@ -75,7 +75,7 @@ public class RouteEntry {
StringBuilder result = new StringBuilder(ip4Prefix.prefixLength());
long value = ip4Prefix.toInt();
for (int i = 0; i < ip4Prefix.prefixLength(); i++) {
long mask = 1 << (IpAddress.MAX_INET_MASK - 1 - i);
long mask = 1 << (IpPrefix.MAX_INET_MASK_LENGTH - 1 - i);
result.append(((value & mask) == 0) ? "0" : "1");
}
return result.toString();
......
......@@ -190,12 +190,12 @@ class TestBgpPeerChannelHandler extends SimpleChannelHandler {
IpAddress address = prefix.toIpAddress();
long value = address.toInt() & 0xffffffffL;
for (int i = 0; i < IpAddress.INET_LEN; i++) {
for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) {
if (prefixBytelen-- == 0) {
break;
}
long nextByte =
(value >> ((IpAddress.INET_LEN - i - 1) * 8)) & 0xff;
(value >> ((IpAddress.INET_BYTE_LENGTH - i - 1) * 8)) & 0xff;
message.writeByte((int) nextByte);
}
}
......
......@@ -269,10 +269,6 @@ implements MastershipService, MastershipAdminService {
@Override
public void notify(MastershipEvent event) {
if (clusterService.getLocalNode().id().equals(event.roleInfo().master())) {
log.info("ignoring locally-generated event {}", event);
// return;
}
log.info("dispatching mastership event {}", event);
eventDispatcher.post(event);
}
......
......@@ -432,7 +432,6 @@ public class DeviceManager
if (!isReachable(device)) {
log.warn("Device {} has disconnected after this event", did);
mastershipService.relinquishMastership(did);
applyRole(did, MastershipRole.STANDBY);
return;
}
//flag the device as online. Is there a better way to do this?
......@@ -448,6 +447,7 @@ public class DeviceManager
if (!isReachable(getDevice(did))) {
log.warn("Device {} has disconnected after this event", did);
mastershipService.relinquishMastership(did);
return;
}
applyRole(did, MastershipRole.STANDBY);
}
......@@ -455,19 +455,21 @@ public class DeviceManager
// checks for duplicate event, returning true if one is found.
private boolean checkDuplicate(RoleInfo roleInfo, int term) {
synchronized (eventCache) {
if (eventCache.get(term).contains(roleInfo)) {
log.info("duplicate event detected; ignoring");
return true;
} else {
eventCache.put(term, roleInfo);
// purge by-term oldest entries to keep the cache size under limit
if (eventCache.size() > cacheSize) {
eventCache.removeAll(term - cacheSize);
}
// turning off duplicate check
return false;
}
}
// synchronized (eventCache) {
// if (eventCache.get(term).contains(roleInfo)) {
// log.info("duplicate event detected; ignoring");
// return true;
// } else {
// eventCache.put(term, roleInfo);
// // purge by-term oldest entries to keep the cache size under limit
// if (eventCache.size() > cacheSize) {
// eventCache.removeAll(term - cacheSize);
// }
// return false;
// }
// }
}
}
......
......@@ -46,7 +46,6 @@ import org.onlab.onos.net.provider.ProviderId;
import org.onlab.packet.ARP;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.util.Timer;
......@@ -212,7 +211,7 @@ public class HostMonitor implements TimerTask {
arp.setHardwareType(ARP.HW_TYPE_ETHERNET)
.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH)
.setProtocolType(ARP.PROTO_TYPE_IP)
.setProtocolAddressLength((byte) IpPrefix.INET_LEN)
.setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH)
.setOpCode(ARP.OP_REQUEST);
arp.setSenderHardwareAddress(sourceMac.getAddress())
......
......@@ -56,7 +56,6 @@ import org.onlab.onos.net.proxyarp.ProxyArpService;
import org.onlab.packet.ARP;
import org.onlab.packet.Ethernet;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.MacAddress;
import org.onlab.packet.VlanId;
import org.slf4j.Logger;
......@@ -368,7 +367,7 @@ public class ProxyArpManager implements ProxyArpService {
arp.setProtocolType(ARP.PROTO_TYPE_IP);
arp.setHardwareType(ARP.HW_TYPE_ETHERNET);
arp.setProtocolAddressLength((byte) IpPrefix.INET_LEN);
arp.setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH);
arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH);
arp.setSenderHardwareAddress(srcMac.getAddress());
arp.setTargetHardwareAddress(request.getSourceMACAddress());
......
......@@ -534,7 +534,7 @@ public class ProxyArpManagerTest {
arp.setProtocolType(ARP.PROTO_TYPE_IP);
arp.setHardwareType(ARP.HW_TYPE_ETHERNET);
arp.setProtocolAddressLength((byte) IpPrefix.INET_LEN);
arp.setProtocolAddressLength((byte) IpAddress.INET_BYTE_LENGTH);
arp.setHardwareAddressLength((byte) Ethernet.DATALAYER_ADDRESS_LENGTH);
arp.setSenderHardwareAddress(srcMac.getAddress());
......
......@@ -358,6 +358,7 @@ implements MastershipStore {
@Override
public void entryAdded(EntryEvent<DeviceId, RoleValue> event) {
entryUpdated(event);
}
@Override
......@@ -366,7 +367,6 @@ implements MastershipStore {
@Override
public void entryUpdated(EntryEvent<DeviceId, RoleValue> event) {
// this subsumes entryAdded event
notifyDelegate(new MastershipEvent(
MASTER_CHANGED, event.getKey(), event.getValue().roleInfo()));
}
......
......@@ -17,6 +17,7 @@ package org.onlab.onos.store.topology.impl;
import static org.slf4j.LoggerFactory.getLogger;
import java.util.Collections;
import java.util.List;
import java.util.Set;
......@@ -26,11 +27,13 @@ import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onlab.onos.event.Event;
import org.onlab.onos.net.ConnectPoint;
import org.onlab.onos.net.Device;
import org.onlab.onos.net.DeviceId;
import org.onlab.onos.net.Link;
import org.onlab.onos.net.Path;
import org.onlab.onos.net.provider.ProviderId;
import org.onlab.onos.net.topology.ClusterId;
import org.onlab.onos.net.topology.DefaultGraphDescription;
import org.onlab.onos.net.topology.GraphDescription;
import org.onlab.onos.net.topology.LinkWeight;
import org.onlab.onos.net.topology.Topology;
......@@ -55,7 +58,11 @@ implements TopologyStore {
private final Logger log = getLogger(getClass());
private volatile DefaultTopology current;
private volatile DefaultTopology current =
new DefaultTopology(ProviderId.NONE,
new DefaultGraphDescription(0L,
Collections.<Device>emptyList(),
Collections.<Link>emptyList()));
@Activate
public void activate() {
......
......@@ -145,7 +145,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
break;
case PORT_ADDED:
case PORT_UPDATED:
if (event.port().isEnabled()) {
if (port.isEnabled()) {
ld = discoverers.get(device.id());
if (ld == null) {
return;
......@@ -155,6 +155,7 @@ public class LLDPLinkProvider extends AbstractProvider implements LinkProvider {
ld.addPort(port);
}
} else {
log.debug("Port down {}", port);
ConnectPoint point = new ConnectPoint(device.id(),
port.number());
providerService.linksVanished(point);
......
......@@ -68,6 +68,7 @@ public class LinkDiscovery implements TimerTask {
// send 1 probe every probeRate milliseconds
private final long probeRate;
private final Set<Long> slowPorts;
// ports, known to have incoming links
private final Set<Long> fastPorts;
// number of unacknowledged probes per port
private final Map<Long, AtomicInteger> portProbeCount;
......@@ -125,6 +126,7 @@ public class LinkDiscovery implements TimerTask {
log.info("Using BDDP to discover network");
}
this.isStopped = true;
start();
this.log.debug("Started discovery manager for switch {}",
device.id());
......@@ -140,7 +142,10 @@ public class LinkDiscovery implements TimerTask {
public void addPort(final Port port) {
this.log.debug("Sending init probe to port {}@{}",
port.number().toLong(), device.id());
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
if (isMaster) {
sendProbes(port.number().toLong());
}
synchronized (this) {
this.slowPorts.add(port.number().toLong());
}
......@@ -233,6 +238,13 @@ public class LinkDiscovery implements TimerTask {
*/
@Override
public void run(final Timeout t) {
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
if (!isMaster) {
// reschedule timer
timeout = Timer.getTimer().newTimeout(this, this.probeRate, MILLISECONDS);
return;
}
this.log.trace("Sending probes from {}", device.id());
synchronized (this) {
final Iterator<Long> fastIterator = this.fastPorts.iterator();
......@@ -245,6 +257,7 @@ public class LinkDiscovery implements TimerTask {
sendProbes(portNumber);
} else {
// Link down, demote to slowPorts
// Update fast and slow ports
fastIterator.remove();
this.slowPorts.add(portNumber);
......@@ -274,8 +287,12 @@ public class LinkDiscovery implements TimerTask {
}
public void start() {
if (isStopped) {
timeout = Timer.getTimer().newTimeout(this, 0, MILLISECONDS);
isStopped = false;
} else {
log.warn("LinkDiscovery started multiple times?");
}
}
/**
......@@ -317,8 +334,8 @@ public class LinkDiscovery implements TimerTask {
}
private void sendProbes(Long portNumber) {
boolean isMaster = mastershipService.getLocalRole(device.id()) == MASTER;
if (isMaster && device.type() != Device.Type.ROADM) {
// TODO: should have suppression port configuration, not by type
if (device.type() != Device.Type.ROADM) {
log.debug("Sending probes out to {}@{}", portNumber, device.id());
OutboundPacket pkt = this.createOutBoundLLDP(portNumber);
pktService.emit(pkt);
......
......@@ -171,7 +171,8 @@ public class FlowEntryBuilder {
builder.setIpDst(IpPrefix.valueOf(di.getInt(),
di.asCidrMaskLength()));
} else {
builder.setIpDst(IpPrefix.valueOf(di.getInt()));
builder.setIpDst(IpPrefix.valueOf(di.getInt(),
IpPrefix.MAX_INET_MASK_LENGTH));
}
break;
case SET_NW_SRC:
......@@ -181,7 +182,8 @@ public class FlowEntryBuilder {
builder.setIpSrc(IpPrefix.valueOf(si.getInt(),
si.asCidrMaskLength()));
} else {
builder.setIpSrc(IpPrefix.valueOf(si.getInt()));
builder.setIpSrc(IpPrefix.valueOf(si.getInt(),
IpPrefix.MAX_INET_MASK_LENGTH));
}
break;
case EXPERIMENTER:
......@@ -256,7 +258,7 @@ public class FlowEntryBuilder {
} else {
dip = IpPrefix.valueOf(
match.get(MatchField.IPV4_DST).getInt(),
IpPrefix.MAX_INET_MASK);
IpPrefix.MAX_INET_MASK_LENGTH);
}
builder.matchIPDst(dip);
......@@ -272,7 +274,7 @@ public class FlowEntryBuilder {
} else {
sip = IpPrefix.valueOf(
match.get(MatchField.IPV4_SRC).getInt(),
IpPrefix.MAX_INET_MASK);
IpPrefix.MAX_INET_MASK_LENGTH);
}
builder.matchIPSrc(sip);
......
......@@ -8,7 +8,7 @@ export ONOS_ROOT=${ONOS_ROOT:-~/onos-next}
# Setup some environmental context for developers
if [ -z "${JAVA_HOME}" ]; then
if [ -x /usr/libexec/java_home ]; then
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
elif [ -d /usr/lib/jvm/java-7-openjdk-amd64 ]; then
export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64"
fi
......
......@@ -101,20 +101,6 @@ public final class Ip4Prefix {
return this.address.toString() + "/" + this.prefixLen;
}
/**
* Compares the value of two Ip4Prefix objects.
* <p/>
* Note the value of the IPv4 address is compared directly between the
* objects, and must match exactly for the objects to be considered equal.
* This may result in objects which represent the same IP prefix being
* classified as unequal, because the unsignificant bits of the address
* field don't match (the bits to the right of the prefix length).
* <p/>
* TODO Change this behavior so that objects that represent the same prefix
* are classified as equal according to this equals method.
*
* @see Object#equals(Object)
*/
@Override
public boolean equals(Object other) {
if (other == this) {
......
......@@ -101,20 +101,6 @@ public final class Ip6Prefix {
return this.address.toString() + "/" + this.prefixLen;
}
/**
* Compares the value of two Ip6Prefix objects.
* <p/>
* Note the value of the IPv6 address is compared directly between the
* objects, and must match exactly for the objects to be considered equal.
* This may result in objects which represent the same IP prefix being
* classified as unequal, because the unsignificant bits of the address
* field don't match (the bits to the right of the prefix length).
* <p/>
* TODO Change this behavior so that objects that represent the same prefix
* are classified as equal according to this equals method.
*
* @see Object#equals(Object)
*/
@Override
public boolean equals(Object other) {
if (other == this) {
......
......@@ -26,48 +26,37 @@ public final class IpPrefix {
// TODO a comparator for netmasks? E.g. for sorting by prefix match order.
//IP Versions
// IP Versions: IPv4 and IPv6
public enum Version { INET, INET6 };
//lengths of address, in bytes
public static final int INET_LEN = 4;
public static final int INET6_LEN = 16;
// Maximum network mask length
public static final int MAX_INET_MASK_LENGTH = IpAddress.INET_BIT_LENGTH;
public static final int MAX_INET6_MASK_LENGTH = IpAddress.INET6_BIT_LENGTH;
//maximum CIDR value
public static final int MAX_INET_MASK = 32;
//no mask (no network), e.g. a simple address
public static final int DEFAULT_MASK = 0;
private static final int DEFAULT_MASK = 0;
/**
* Default value indicating an unspecified address.
*/
static final byte[] ANY = new byte [] {0, 0, 0, 0};
private static final byte[] ANY = new byte[] {0, 0, 0, 0};
protected Version version;
protected byte[] octets;
protected int netmask;
private IpPrefix(Version ver, byte[] octets, int netmask) {
this.version = ver;
this.octets = Arrays.copyOf(octets, INET_LEN);
this.netmask = netmask;
}
private IpPrefix(Version ver, byte[] octets) {
this.version = ver;
this.octets = Arrays.copyOf(octets, INET_LEN);
this.netmask = DEFAULT_MASK;
}
private final Version version;
private final byte[] octets;
private final int netmask;
/**
* Converts a byte array into an IP address.
* Constructor for given IP address version, prefix address octets,
* and network mask length.
*
* @param address a byte array
* @return an IP address
* @param ver the IP address version
* @param octets the IP prefix address octets
* @param netmask the network mask length
*/
public static IpPrefix valueOf(byte [] address) {
return new IpPrefix(Version.INET, address);
private IpPrefix(Version ver, byte[] octets, int netmask) {
this.version = ver;
this.octets = Arrays.copyOf(octets, IpAddress.INET_BYTE_LENGTH);
this.netmask = netmask;
}
/**
......@@ -77,7 +66,7 @@ public final class IpPrefix {
* @param netmask the CIDR value subnet mask
* @return an IP address
*/
public static IpPrefix valueOf(byte [] address, int netmask) {
public static IpPrefix valueOf(byte[] address, int netmask) {
return new IpPrefix(Version.INET, address, netmask);
}
......@@ -87,10 +76,11 @@ public final class IpPrefix {
* @param address the integer to convert
* @return a byte array
*/
private static byte [] bytes(int address) {
byte [] bytes = new byte [INET_LEN];
for (int i = 0; i < INET_LEN; i++) {
bytes[i] = (byte) ((address >> (INET_LEN - (i + 1)) * 8) & 0xff);
private static byte[] bytes(int address) {
byte[] bytes = new byte [IpAddress.INET_BYTE_LENGTH];
for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) {
bytes[i] = (byte) ((address >> (IpAddress.INET_BYTE_LENGTH
- (i + 1)) * 8) & 0xff);
}
return bytes;
......@@ -100,16 +90,6 @@ public final class IpPrefix {
* Converts an integer into an IPv4 address.
*
* @param address an integer representing an IP value
* @return an IP address
*/
public static IpPrefix valueOf(int address) {
return new IpPrefix(Version.INET, bytes(address));
}
/**
* Converts an integer into an IPv4 address.
*
* @param address an integer representing an IP value
* @param netmask the CIDR value subnet mask
* @return an IP address
*/
......@@ -127,7 +107,7 @@ public final class IpPrefix {
*/
public static IpPrefix valueOf(String address) {
final String [] parts = address.split("\\/");
final String[] parts = address.split("\\/");
if (parts.length > 2) {
throw new IllegalArgumentException("Malformed IP address string; "
+ "Address must take form \"x.x.x.x\" or \"x.x.x.x/y\"");
......@@ -136,20 +116,20 @@ public final class IpPrefix {
int mask = DEFAULT_MASK;
if (parts.length == 2) {
mask = Integer.parseInt(parts[1]);
if (mask > MAX_INET_MASK) {
if (mask > MAX_INET_MASK_LENGTH) {
throw new IllegalArgumentException(
"Value of subnet mask cannot exceed "
+ MAX_INET_MASK);
+ MAX_INET_MASK_LENGTH);
}
}
final String [] net = parts[0].split("\\.");
if (net.length != INET_LEN) {
final String[] net = parts[0].split("\\.");
if (net.length != IpAddress.INET_BYTE_LENGTH) {
throw new IllegalArgumentException("Malformed IP address string; "
+ "Address must have four decimal values separated by dots (.)");
}
final byte [] bytes = new byte[INET_LEN];
for (int i = 0; i < INET_LEN; i++) {
final byte[] bytes = new byte[IpAddress.INET_BYTE_LENGTH];
for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) {
bytes[i] = (byte) Short.parseShort(net[i], 10);
}
return new IpPrefix(Version.INET, bytes, mask);
......@@ -170,7 +150,7 @@ public final class IpPrefix {
* @return a byte array
*/
public byte[] toOctets() {
return Arrays.copyOf(this.octets, INET_LEN);
return Arrays.copyOf(this.octets, IpAddress.INET_BYTE_LENGTH);
}
/**
......@@ -202,18 +182,17 @@ public final class IpPrefix {
* @return an integer bitmask
*/
private int mask() {
int shift = MAX_INET_MASK - this.netmask;
int shift = MAX_INET_MASK_LENGTH - this.netmask;
return ((Integer.MAX_VALUE >>> (shift - 1)) << shift);
}
/**
* Returns the subnet mask in IpAddress form. The netmask value for
* the returned IpAddress is 0, as the address itself is a mask.
* Returns the subnet mask in IpAddress form.
*
* @return the subnet mask
* @return the subnet mask as an IpAddress
*/
public IpPrefix netmask() {
return new IpPrefix(Version.INET, bytes(mask()));
public IpAddress netmask() {
return IpAddress.valueOf(mask());
}
/**
......@@ -228,9 +207,9 @@ public final class IpPrefix {
return new IpPrefix(version, ANY, DEFAULT_MASK);
}
byte [] net = new byte [4];
byte [] mask = bytes(mask());
for (int i = 0; i < INET_LEN; i++) {
byte[] net = new byte [4];
byte[] mask = bytes(mask());
for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) {
net[i] = (byte) (octets[i] & mask[i]);
}
return new IpPrefix(version, net, netmask);
......@@ -249,9 +228,9 @@ public final class IpPrefix {
new IpPrefix(version, octets, netmask);
}
byte [] host = new byte [INET_LEN];
byte [] mask = bytes(mask());
for (int i = 0; i < INET_LEN; i++) {
byte[] host = new byte [IpAddress.INET_BYTE_LENGTH];
byte[] mask = bytes(mask());
for (int i = 0; i < IpAddress.INET_BYTE_LENGTH; i++) {
host[i] = (byte) (octets[i] & ~mask[i]);
}
return new IpPrefix(version, host, netmask);
......@@ -283,7 +262,7 @@ public final class IpPrefix {
public boolean contains(IpPrefix other) {
if (this.netmask <= other.netmask) {
// Special case where they're both /32 addresses
if (this.netmask == MAX_INET_MASK) {
if (this.netmask == MAX_INET_MASK_LENGTH) {
return Arrays.equals(octets, other.octets);
}
......@@ -302,7 +281,7 @@ public final class IpPrefix {
IpPrefix meMasked = network();
IpPrefix otherMasked =
IpPrefix.valueOf(address.octets, netmask).network();
IpPrefix.valueOf(address.toOctets(), netmask).network();
return Arrays.equals(meMasked.octets, otherMasked.octets);
}
......@@ -364,5 +343,4 @@ public final class IpPrefix {
}
return builder.toString();
}
}
......
......@@ -32,15 +32,15 @@ public class IpPrefixTest {
private static final byte [] BYTES2 = new byte [] {0xa, 0x0, 0x0, 0xb};
private static final int INTVAL1 = 167772170;
private static final int INTVAL2 = 167772171;
private static final String STRVAL = "10.0.0.12";
private static final int MASK = 16;
private static final String STRVAL = "10.0.0.12/16";
private static final int MASK_LENGTH = 16;
@Test
public void testEquality() {
IpPrefix ip1 = IpPrefix.valueOf(BYTES1);
IpPrefix ip2 = IpPrefix.valueOf(INTVAL1);
IpPrefix ip3 = IpPrefix.valueOf(BYTES2);
IpPrefix ip4 = IpPrefix.valueOf(INTVAL2);
IpPrefix ip1 = IpPrefix.valueOf(BYTES1, IpPrefix.MAX_INET_MASK_LENGTH);
IpPrefix ip2 = IpPrefix.valueOf(INTVAL1, IpPrefix.MAX_INET_MASK_LENGTH);
IpPrefix ip3 = IpPrefix.valueOf(BYTES2, IpPrefix.MAX_INET_MASK_LENGTH);
IpPrefix ip4 = IpPrefix.valueOf(INTVAL2, IpPrefix.MAX_INET_MASK_LENGTH);
IpPrefix ip5 = IpPrefix.valueOf(STRVAL);
new EqualsTester().addEqualityGroup(ip1, ip2)
......@@ -49,21 +49,21 @@ public class IpPrefixTest {
.testEquals();
// string conversions
IpPrefix ip6 = IpPrefix.valueOf(BYTES1, MASK);
IpPrefix ip6 = IpPrefix.valueOf(BYTES1, MASK_LENGTH);
IpPrefix ip7 = IpPrefix.valueOf("10.0.0.10/16");
IpPrefix ip8 = IpPrefix.valueOf(new byte [] {0xa, 0x0, 0x0, 0xc});
IpPrefix ip8 = IpPrefix.valueOf(new byte [] {0xa, 0x0, 0x0, 0xc}, 16);
assertEquals("incorrect address conversion", ip6, ip7);
assertEquals("incorrect address conversion", ip5, ip8);
}
@Test
public void basics() {
IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK);
IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK_LENGTH);
final byte [] bytes = new byte [] {0xa, 0x0, 0x0, 0xa};
//check fields
assertEquals("incorrect IP Version", Version.INET, ip1.version());
assertEquals("incorrect netmask", 16, ip1.netmask);
assertEquals("incorrect netmask", 16, ip1.prefixLength());
assertTrue("faulty toOctets()", Arrays.equals(bytes, ip1.toOctets()));
assertEquals("faulty toInt()", INTVAL1, ip1.toInt());
assertEquals("faulty toString()", "10.0.0.10/16", ip1.toString());
......@@ -72,7 +72,7 @@ public class IpPrefixTest {
@Test
public void netmasks() {
// masked
IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK);
IpPrefix ip1 = IpPrefix.valueOf(BYTES1, MASK_LENGTH);
IpPrefix host = IpPrefix.valueOf("0.0.0.10/16");
IpPrefix network = IpPrefix.valueOf("10.0.0.0/16");
......@@ -80,14 +80,6 @@ public class IpPrefixTest {
assertEquals("incorrect network address", network, ip1.network());
assertEquals("incorrect netmask", "255.255.0.0", ip1.netmask().toString());
//unmasked
IpPrefix ip2 = IpPrefix.valueOf(BYTES1);
IpPrefix umhost = IpPrefix.valueOf("10.0.0.10/0");
IpPrefix umnet = IpPrefix.valueOf("0.0.0.0/0");
assertEquals("incorrect host address", umhost, ip2.host());
assertEquals("incorrect host address", umnet, ip2.network());
assertTrue("incorrect netmask",
Arrays.equals(IpPrefix.ANY, ip2.netmask().toOctets()));
}
@Test
......
......@@ -20,6 +20,7 @@ import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicLong;
import io.netty.bootstrap.Bootstrap;
......@@ -27,6 +28,7 @@ import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
......@@ -49,6 +51,8 @@ import org.slf4j.LoggerFactory;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalListener;
import com.google.common.cache.RemovalNotification;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
......@@ -64,8 +68,13 @@ public class NettyMessagingService implements MessagingService {
private final AtomicLong messageIdGenerator = new AtomicLong(0);
private final Cache<Long, SettableFuture<byte[]>> responseFutures = CacheBuilder.newBuilder()
.maximumSize(100000)
// TODO: Once the entry expires, notify blocking threads (if any).
.expireAfterWrite(10, TimeUnit.MINUTES)
.expireAfterWrite(10, TimeUnit.SECONDS)
.removalListener(new RemovalListener<Long, SettableFuture<byte[]>>() {
@Override
public void onRemoval(RemovalNotification<Long, SettableFuture<byte[]>> entry) {
entry.getValue().setException(new TimeoutException("Timedout waiting for reply"));
}
})
.build();
private final GenericKeyedObjectPool<Endpoint, Channel> channels
= new GenericKeyedObjectPool<Endpoint, Channel>(new OnosCommunicationChannelFactory());
......@@ -153,9 +162,12 @@ public class NettyMessagingService implements MessagingService {
} finally {
channels.returnObject(ep, channel);
}
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw new IOException("Failed to send message to " + ep.toString(), e);
throw new IOException(e);
}
}
@Override
......@@ -172,7 +184,7 @@ public class NettyMessagingService implements MessagingService {
.build();
try {
sendAsync(ep, message);
} catch (IOException e) {
} catch (Exception e) {
responseFutures.invalidate(messageId);
throw e;
}
......@@ -277,7 +289,7 @@ public class NettyMessagingService implements MessagingService {
@Override
public void run() {
channel.writeAndFlush(message, channel.voidPromise());
channel.writeAndFlush(message).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
}
}
......