[ONOS-6142] Add AppData and AS extension addresses with unit test
- Correct RFC page number for LCAF addresses
Change-Id: I51dbf02f69c15aad81d5571198b39e030f991a96
diff --git a/drivers/lisp/BUCK b/drivers/lisp/BUCK
index e5f7d2a..02cc884 100644
--- a/drivers/lisp/BUCK
+++ b/drivers/lisp/BUCK
@@ -2,6 +2,7 @@
'//lib:CORE_DEPS',
'//protocols/lisp/api:onos-protocols-lisp-api',
'//apps/mappingmanagement/api:onos-apps-mappingmanagement-api',
+ '//core/store/serializers:onos-core-serializers'
]
TEST_DEPS = [
diff --git a/drivers/lisp/pom.xml b/drivers/lisp/pom.xml
index 579b5bc..329854b 100644
--- a/drivers/lisp/pom.xml
+++ b/drivers/lisp/pom.xml
@@ -52,6 +52,11 @@
<artifactId>onos-mapping-api</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-core-serializers</artifactId>
+ <version>${project.version}</version>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
index 7819a3b..8766aa5 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddress.java
@@ -15,27 +15,317 @@
*/
package org.onosproject.drivers.lisp.extensions;
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.APPLICATION_DATA_ADDRESS;
/**
* Implementation of LISP application data address.
+ * When a locator-set needs to be conveyed based on the type of application or
+ * the Per-Hop Behavior (PHB) of a packet, the Application Data Type can be used.
*/
-public class LispAppDataAddress extends AbstractExtension
+public final class LispAppDataAddress extends AbstractExtension
implements ExtensionMappingAddress {
+
+ private static final String PROTOCOL = "protocol";
+ private static final String IP_TOS = "ipTos";
+ private static final String LOCAL_PORT_LOW = "localPortLow";
+ private static final String LOCAL_PORT_HIGH = "localPortHigh";
+ private static final String REMOTE_PORT_LOW = "remotePortLow";
+ private static final String REMOTE_PORT_HIGH = "remotePortHigh";
+ private static final String ADDRESS = "address";
+
+ private byte protocol;
+ private int ipTos;
+ private short localPortLow;
+ private short localPortHigh;
+ private short remotePortLow;
+ private short remotePortHigh;
+ private MappingAddress address;
+
+ private final KryoNamespace appKryo = new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(MappingAddress.class)
+ .register(MappingAddress.Type.class)
+ .register(IPMappingAddress.class)
+ .register(ASMappingAddress.class)
+ .register(DNMappingAddress.class)
+ .register(EthMappingAddress.class)
+ .build();
+
+ /**
+ * Default constructor.
+ */
+ public LispAppDataAddress() {
+ }
+
+ /**
+ * Creates an instance with initialized parameters.
+ *
+ * @param protocol protocol number
+ * @param ipTos IP type of service
+ * @param localPortLow low-ranged local port number
+ * @param localPortHigh high-ranged local port number
+ * @param remotePortLow low-ranged remote port number
+ * @param remotePortHigh high-ranged remote port number
+ */
+ private LispAppDataAddress(byte protocol, int ipTos, short localPortLow,
+ short localPortHigh, short remotePortLow,
+ short remotePortHigh, MappingAddress address) {
+ this.protocol = protocol;
+ this.ipTos = ipTos;
+ this.localPortLow = localPortLow;
+ this.localPortHigh = localPortHigh;
+ this.remotePortLow = remotePortLow;
+ this.remotePortHigh = remotePortHigh;
+ this.address = address;
+ }
+
+ /**
+ * Obtains protocol type.
+ *
+ * @return protocol type
+ */
+ public byte getProtocol() {
+ return protocol;
+ }
+
+ /**
+ * Obtains IP type of service.
+ *
+ * @return IP type of service
+ */
+ public int getIpTos() {
+ return ipTos;
+ }
+
+ /**
+ * Obtains local port low.
+ *
+ * @return local port low
+ */
+ public short getLocalPortLow() {
+ return localPortLow;
+ }
+
+ /**
+ * Obtains local port high.
+ *
+ * @return local port high
+ */
+ public short getLocalPortHigh() {
+ return localPortHigh;
+ }
+
+ /**
+ * Obtains remote port low.
+ *
+ * @return remote port low
+ */
+ public short getRemotePortLow() {
+ return remotePortLow;
+ }
+
+ /**
+ * Obtains remote port high.
+ *
+ * @return remote port high
+ */
+ public short getRemotePortHigh() {
+ return remotePortHigh;
+ }
+
+ /**
+ * Obtains mapping address.
+ *
+ * @return mapping address
+ */
+ public MappingAddress getAddress() {
+ return address;
+ }
+
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return APPLICATION_DATA_ADDRESS.type();
}
@Override
public byte[] serialize() {
- return new byte[0];
+ Map<String, Object> parameterMap = Maps.newHashMap();
+ parameterMap.put(PROTOCOL, protocol);
+ parameterMap.put(IP_TOS, ipTos);
+ parameterMap.put(LOCAL_PORT_LOW, localPortLow);
+ parameterMap.put(LOCAL_PORT_HIGH, localPortHigh);
+ parameterMap.put(REMOTE_PORT_LOW, remotePortLow);
+ parameterMap.put(REMOTE_PORT_HIGH, remotePortHigh);
+ parameterMap.put(ADDRESS, address);
+
+ return appKryo.serialize(parameterMap);
}
@Override
public void deserialize(byte[] data) {
+ Map<String, Object> parameterMap = appKryo.deserialize(data);
+ this.protocol = (byte) parameterMap.get(PROTOCOL);
+ this.ipTos = (int) parameterMap.get(IP_TOS);
+ this.localPortLow = (short) parameterMap.get(LOCAL_PORT_LOW);
+ this.localPortHigh = (short) parameterMap.get(LOCAL_PORT_HIGH);
+ this.remotePortLow = (short) parameterMap.get(REMOTE_PORT_LOW);
+ this.remotePortHigh = (short) parameterMap.get(REMOTE_PORT_HIGH);
+ this.address = (MappingAddress) parameterMap.get(ADDRESS);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(protocol, ipTos, localPortLow, localPortHigh,
+ remotePortLow, remotePortHigh, address);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof LispAppDataAddress) {
+ LispAppDataAddress that = (LispAppDataAddress) obj;
+ return Objects.equals(protocol, that.protocol) &&
+ Objects.equals(ipTos, that.ipTos) &&
+ Objects.equals(localPortLow, that.localPortLow) &&
+ Objects.equals(localPortHigh, that.localPortHigh) &&
+ Objects.equals(remotePortLow, that.remotePortLow) &&
+ Objects.equals(remotePortHigh, that.remotePortHigh) &&
+ Objects.equals(address, that.address);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(type().toString())
+ .add("protocol", protocol)
+ .add("IP type of service", ipTos)
+ .add("low-ranged local port number", localPortLow)
+ .add("high-ranged local port number", localPortHigh)
+ .add("low-ranged remote port number", remotePortLow)
+ .add("high-ranged remote port number", remotePortHigh)
+ .add("address", address)
+ .toString();
+ }
+
+ /**
+ * A builder for building LispAppDataAddress.
+ */
+ public static final class Builder {
+ private byte protocol;
+ private int ipTos;
+ private short localPortLow;
+ private short localPortHigh;
+ private short remotePortLow;
+ private short remotePortHigh;
+ private MappingAddress address;
+
+ /**
+ * Sets protocol number.
+ *
+ * @param protocol protocol number
+ * @return Builder object
+ */
+ public Builder withProtocol(byte protocol) {
+ this.protocol = protocol;
+ return this;
+ }
+
+ /**
+ * Sets IP type of service.
+ *
+ * @param ipTos IP type of service
+ * @return Builder object
+ */
+ public Builder withIpTos(int ipTos) {
+ this.ipTos = ipTos;
+ return this;
+ }
+
+ /**
+ * Sets low-ranged local port number.
+ *
+ * @param localPortLow low-ranged local port number
+ * @return Builder object
+ */
+ public Builder withLocalPortLow(short localPortLow) {
+ this.localPortLow = localPortLow;
+ return this;
+ }
+
+ /**
+ * Sets high-ranged local port number.
+ *
+ * @param localPortHigh high-ranged local port number
+ * @return Builder object
+ */
+ public Builder withLocalPortHigh(short localPortHigh) {
+ this.localPortHigh = localPortHigh;
+ return this;
+ }
+
+ /**
+ * Sets low-ranged remote port number.
+ *
+ * @param remotePortLow low-ranged remote port number
+ * @return Builder object
+ */
+ public Builder withRemotePortLow(short remotePortLow) {
+ this.remotePortLow = remotePortLow;
+ return this;
+ }
+
+ /**
+ * Sets high-ranged remote port number.
+ *
+ * @param remotePortHigh high-ranged remote port number
+ * @return Builder object
+ */
+ public Builder withRemotePortHigh(short remotePortHigh) {
+ this.remotePortHigh = remotePortHigh;
+ return this;
+ }
+
+ /**
+ * Sets mapping address.
+ *
+ * @param address mapping address
+ * @return Builder object
+ */
+ public Builder withAddress(MappingAddress address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * Builds LispAppDataLcafAddress instance.
+ *
+ * @return LispAddDataLcafAddress instance
+ */
+ public LispAppDataAddress build() {
+
+ return new LispAppDataAddress(protocol, ipTos, localPortLow,
+ localPortHigh, remotePortLow, remotePortHigh, address);
+ }
}
}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
index 4b1dfe9..a0480aa 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispAsAddress.java
@@ -16,27 +16,170 @@
package org.onosproject.drivers.lisp.extensions;
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.AS_ADDRESS;
/**
* Implementation of LISP Autonomous System (AS) address.
+ * When an AS number is stored in the LISP Mapping Database System for either
+ * policy or documentation reasons, it can be encoded in a LISP Canonical Address.
*/
-public class LispAsAddress extends AbstractExtension
+public final class LispAsAddress extends AbstractExtension
implements ExtensionMappingAddress {
+
+ private static final String AS_NUMBER = "asNumber";
+ private static final String ADDRESS = "address";
+
+ private int asNumber;
+ private MappingAddress address;
+
+ private final KryoNamespace appKryo = new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(MappingAddress.class)
+ .register(MappingAddress.Type.class)
+ .register(IPMappingAddress.class)
+ .register(ASMappingAddress.class)
+ .register(DNMappingAddress.class)
+ .register(EthMappingAddress.class)
+ .build();
+
+ /**
+ * Default constructor.
+ */
+ public LispAsAddress() {
+ }
+
+ /**
+ * Creates an instance with initialized parameters.
+ *
+ * @param asNumber AS number
+ */
+ private LispAsAddress(int asNumber, MappingAddress address) {
+ this.asNumber = asNumber;
+ this.address = address;
+ }
+
+ /**
+ * Obtains AS number.
+ *
+ * @return AS number
+ */
+ public int getAsNumber() {
+ return asNumber;
+ }
+
+ /**
+ * Obtains mapping address.
+ *
+ * @return mapping address
+ */
+ public MappingAddress getAddress() {
+ return address;
+ }
+
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return AS_ADDRESS.type();
}
@Override
public byte[] serialize() {
- return new byte[0];
+ Map<String, Object> parameterMap = Maps.newHashMap();
+
+ parameterMap.put(AS_NUMBER, asNumber);
+ parameterMap.put(ADDRESS, address);
+ return appKryo.serialize(parameterMap);
}
@Override
public void deserialize(byte[] data) {
+ Map<String, Object> parameterMap = appKryo.deserialize(data);
+ this.asNumber = (int) parameterMap.get(AS_NUMBER);
+ this.address = (MappingAddress) parameterMap.get(ADDRESS);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(asNumber, address);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj instanceof LispAsAddress) {
+ final LispAsAddress other = (LispAsAddress) obj;
+ return Objects.equals(asNumber, other.asNumber) &&
+ Objects.equals(address, other.address);
+ }
+
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this)
+ .add("AS number", asNumber)
+ .add("address", address)
+ .toString();
+ }
+
+ /**
+ * A builder for building LispAsAddress.
+ */
+ public static final class Builder {
+ private int asNumber;
+ private MappingAddress address;
+
+ /**
+ * Sets AS number.
+ *
+ * @param asNumber AS number
+ * @return Builder object
+ */
+ public Builder withAsNumber(int asNumber) {
+ this.asNumber = asNumber;
+ return this;
+ }
+
+ /**
+ * Sets mapping address.
+ *
+ * @param address mapping address
+ * @return Builder object
+ */
+ public Builder withAddress(MappingAddress address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * Builds LispAsAddress instance.
+ *
+ * @return LispAsAddress instance
+ */
+ public LispAsAddress build() {
+
+ return new LispAsAddress(asNumber, address);
+ }
}
}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
index 48f4f4f..8e796be 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
@@ -20,14 +20,20 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.GEO_COORDINATE_ADDRESS;
+
/**
* Implementation of LISP Geo Coordinate (GC) address.
+ * If an ETR desires to send a Map-Reply describing the Geo Coordinates for each
+ * locator in its locator-set, it can use the Geo Coordinate Type to convey
+ * physical location information.
*/
public class LispGcAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return GEO_COORDINATE_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
index 3bc7e46..77beeee 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
@@ -20,14 +20,20 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.LIST_ADDRESS;
+
/**
* Implementation of LISP list address.
+ * When header translation between IPv4 and IPv6 is desirable a LISP Canonical
+ * Address can use the AFI List Type to carry a variable number of AFIs in one
+ * LCAF AFI.
*/
public class LispListAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return LIST_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
index fc3e03b..5bbda74 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispMulticastAddress.java
@@ -20,14 +20,19 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.MULTICAST_ADDRESS;
+
/**
* Implementation of LISP multicast address.
+ * The intent of this type of unicast replication is to deliver packets to
+ * multiple ETRs at receiver LISP multicast sites.
*/
public class LispMulticastAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return MULTICAST_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
index a21c83e..a71b684 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNatAddress.java
@@ -20,14 +20,19 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.NAT_ADDRESS;
+
/**
* Implementation of LISP Network Address Translation (NAT) address.
+ * When a LISP system is conveying global address and mapped port information
+ * when traversing through a NAT device, the NAT-Traversal Type is used.
*/
public class LispNatAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return NAT_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
index b516913..747c5f6 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispNonceAddress.java
@@ -20,14 +20,19 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.NONCE_ADDRESS;
+
/**
* Implementation of LISP nonce address.
+ * When a public PETR device wants to verify who is encapsulating to it, it can
+ * check for a specific nonce value in the LISP encapsulated packet.
*/
public class LispNonceAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return NONCE_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
index 1f10205..c3d13f6 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSecurityAddress.java
@@ -20,6 +20,9 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.SECURITY_ADDRESS;
+
/**
* Implementation LISP security address.
*/
@@ -27,7 +30,7 @@
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return SECURITY_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
index c48a80c..b251724 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSegmentAddress.java
@@ -20,14 +20,20 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.SECURITY_ADDRESS;
+
/**
* Implementation of LISP segment address.
+ * When multiple organizations inside of a LISP site are using private addresses
+ * [RFC1918] as EID-prefixes, their address spaces must remain segregated due
+ * to possible address duplication.
*/
public class LispSegmentAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return SECURITY_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
index 5dc892a..1c1dee7 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispSrcDstAddress.java
@@ -20,14 +20,20 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.SOURCE_DEST_ADDRESS;
+
/**
- * Implementation of LISP source and detination address.
+ * Implementation of LISP source and destination address.
+ * When both a source and destination address of a flow need consideration for
+ * different locator-sets, this 2-tuple key is used in EID fields in LISP
+ * control messages.
*/
public class LispSrcDstAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return SOURCE_DEST_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
index f5d892b..4415d30 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispTeAddress.java
@@ -20,14 +20,19 @@
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.net.flow.AbstractExtension;
+import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
+ .ExtensionMappingAddressTypes.TRAFFIC_ENGINEERING_ADDRESS;
+
/**
* Implementation of LISP traffic engineering address.
+ * For a given EID lookup into the mapping database, this LCAF can be returned
+ * to provide a list of locators in an explicit re-encapsulation path.
*/
public final class LispTeAddress extends AbstractExtension
implements ExtensionMappingAddress {
@Override
public ExtensionMappingAddressType type() {
- return null;
+ return TRAFFIC_ENGINEERING_ADDRESS.type();
}
@Override
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java
new file mode 100644
index 0000000..bbb3da5
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAppDataAddressTest.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispAppDataAddress extension class.
+ */
+public class LispAppDataAddressTest {
+
+ private static final IpPrefix IP_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+ private static final IpPrefix IP_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+ private static final byte PROTOCOL_VALUE_1 = 0x01;
+ private static final int IP_TOS_VALUE_1 = 10;
+ private static final short LOCAL_PORT_LOW_VALUE = 1;
+ private static final short LOCAL_PORT_HIGH_VALUE = 255;
+ private static final short REMOTE_PORT_LOW_VALUE = 2;
+ private static final short REMOTE_PORT_HIGH_VALUE = 254;
+
+ private static final byte PROTOCOL_VALUE_2 = 0x02;
+ private static final int IP_TOS_VALUE_2 = 20;
+
+ private LispAppDataAddress address1;
+ private LispAppDataAddress sameAsAddress1;
+ private LispAppDataAddress address2;
+
+ @Before
+ public void setUp() {
+
+ MappingAddress ma1 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ address1 = new LispAppDataAddress.Builder()
+ .withProtocol(PROTOCOL_VALUE_1)
+ .withIpTos(IP_TOS_VALUE_1)
+ .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+ .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+ .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+ .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+ .withAddress(ma1)
+ .build();
+
+ sameAsAddress1 = new LispAppDataAddress.Builder()
+ .withProtocol(PROTOCOL_VALUE_1)
+ .withIpTos(IP_TOS_VALUE_1)
+ .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+ .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+ .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+ .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+ .withAddress(ma1)
+ .build();
+
+ MappingAddress ma2 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_2);
+
+ address2 = new LispAppDataAddress.Builder()
+ .withProtocol(PROTOCOL_VALUE_2)
+ .withIpTos(IP_TOS_VALUE_2)
+ .withLocalPortLow(LOCAL_PORT_LOW_VALUE)
+ .withLocalPortHigh(LOCAL_PORT_HIGH_VALUE)
+ .withRemotePortLow(REMOTE_PORT_LOW_VALUE)
+ .withRemotePortHigh(REMOTE_PORT_HIGH_VALUE)
+ .withAddress(ma2)
+ .build();
+ }
+
+ @Test
+ public void testEquality() {
+ new EqualsTester()
+ .addEqualityGroup(address1, sameAsAddress1)
+ .addEqualityGroup(address2).testEquals();
+ }
+
+ @Test
+ public void testConstruction() {
+ LispAppDataAddress address = address1;
+
+ MappingAddress ma = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ assertThat(address.getProtocol(), is(PROTOCOL_VALUE_1));
+ assertThat(address.getIpTos(), is(IP_TOS_VALUE_1));
+ assertThat(address.getLocalPortLow(), is(LOCAL_PORT_LOW_VALUE));
+ assertThat(address.getLocalPortHigh(), is(LOCAL_PORT_HIGH_VALUE));
+ assertThat(address.getRemotePortLow(), is(REMOTE_PORT_LOW_VALUE));
+ assertThat(address.getRemotePortHigh(), is(REMOTE_PORT_HIGH_VALUE));
+ assertThat(address.getAddress(), is(ma));
+ }
+
+ @Test
+ public void testSerialization() {
+ LispAppDataAddress other = new LispAppDataAddress();
+ other.deserialize(address1.serialize());
+
+ new EqualsTester()
+ .addEqualityGroup(address1, other)
+ .testEquals();
+ }
+}
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java
new file mode 100644
index 0000000..0ba9070
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispAsAddressTest.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispAsAddress extension class.
+ */
+public class LispAsAddressTest {
+
+ private static final IpPrefix IP_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+ private static final IpPrefix IP_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+ private static final int AS_NUMBER_1 = 1;
+ private static final int AS_NUMBER_2 = 2;
+
+ private LispAsAddress address1;
+ private LispAsAddress sameAsAddress1;
+ private LispAsAddress address2;
+
+ @Before
+ public void setUp() {
+
+ MappingAddress ma1 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ address1 = new LispAsAddress.Builder()
+ .withAsNumber(AS_NUMBER_1)
+ .withAddress(ma1)
+ .build();
+
+ sameAsAddress1 = new LispAsAddress.Builder()
+ .withAsNumber(AS_NUMBER_1)
+ .withAddress(ma1)
+ .build();
+
+ MappingAddress ma2 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_2);
+
+ address2 = new LispAsAddress.Builder()
+ .withAsNumber(AS_NUMBER_2)
+ .withAddress(ma2)
+ .build();
+
+ }
+
+ @Test
+ public void testEquality() {
+ new EqualsTester()
+ .addEqualityGroup(address1, sameAsAddress1)
+ .addEqualityGroup(address2).testEquals();
+ }
+
+ @Test
+ public void testConstruction() {
+ LispAsAddress address = address1;
+
+ MappingAddress ma = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ assertThat(address.getAsNumber(), is(AS_NUMBER_1));
+ assertThat(address.getAddress(), is(ma));
+ }
+
+ @Test
+ public void testSerialization() {
+ LispAsAddress other = new LispAsAddress();
+ other.deserialize(address1.serialize());
+
+ new EqualsTester()
+ .addEqualityGroup(address1, other)
+ .testEquals();
+ }
+}