Jian Li
Committed by Gerrit Code Review

[ONOS-4718] Initial implementation of LISP address deserializer

Change-Id: I522e16e7fd197380cf4c99038561fe9aa8f93730
Showing 16 changed files with 744 additions and 80 deletions
/*
* Copyright 2016-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.lisp.msg.exceptions;
/**
* LISP address or message reader exception.
*/
public class LispReaderException extends Exception {
/**
* Constructor for LispReaderException.
*/
public LispReaderException() {
super();
}
/**
* Constructor for LispReaderException with message and cause parameters.
*
* @param message exception message
* @param cause throwable cause
*/
public LispReaderException(final String message, final Throwable cause) {
super(message, cause);
}
/**
* Constructor for LispReaderException with message parameter.
*
* @param message exception message
*/
public LispReaderException(final String message) {
super(message);
}
/**
* Constructor for LispReaderException with cause parameter.
*
* @param cause throwable cause
*/
public LispReaderException(final Throwable cause) {
super(cause);
}
}
/*
* Copyright 2016-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.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
/**
* An interface for de-serializing LISP address.
*/
public interface LispAddressReader<T> {
/**
* Reads from byte buffer and de-serialize the LISP address.
*
* @param byteBuf byte buffer
* @return LISP address type instance
* @throws LispParseError LISP address parse error
*/
T readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException;
}
......@@ -15,6 +15,11 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import java.nio.ByteBuffer;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -44,41 +49,35 @@ import static com.google.common.base.MoreObjects.toStringHelper;
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* }</pre>
*/
public class LispAppDataLcafAddress extends LispLcafAddress {
public final class LispAppDataLcafAddress extends LispLcafAddress {
private final byte protocol;
private final int ipTos;
private final short localPort;
private final short remotePort;
private final short localPortLow;
private final short localPortHigh;
private final short remotePortLow;
private final short remotePortHigh;
private LispAfiAddress address;
/**
* Initializes application data type LCAF address.
*/
public LispAppDataLcafAddress() {
super(LispCanonicalAddressFormatEnum.APPLICATION_DATA);
this.protocol = 0;
this.ipTos = 0;
this.localPort = 0;
this.remotePort = 0;
}
/**
* Initializes application data type LCAF address.
*
* @param protocol protocol number
* @param ipTos ip type of service
* @param localPort local port number
* @param remotePort remote port number
* @param address address
* @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
* @param address address
*/
public LispAppDataLcafAddress(byte protocol, int ipTos, short localPort, short remotePort,
LispAfiAddress address) {
private LispAppDataLcafAddress(byte protocol, int ipTos, short localPortLow,
short localPortHigh, short remotePortLow,
short remotePortHigh, LispAfiAddress address) {
super(LispCanonicalAddressFormatEnum.APPLICATION_DATA);
this.protocol = protocol;
this.ipTos = ipTos;
this.localPort = localPort;
this.remotePort = remotePort;
this.localPortLow = localPortLow;
this.localPortHigh = localPortHigh;
this.remotePortLow = remotePortLow;
this.remotePortHigh = remotePortHigh;
this.address = address;
}
......@@ -101,21 +100,39 @@ public class LispAppDataLcafAddress extends LispLcafAddress {
}
/**
* Obtains local port number.
* Obtains low-ranged local port number.
*
* @return low-ranged local port number
*/
public short getLocalPortLow() {
return localPortLow;
}
/**
* Obtains high-ranged local port number.
*
* @return local port number
* @return high-ranged local port number
*/
public short getLocalPort() {
return localPort;
public short getLocalPortHigh() {
return localPortHigh;
}
/**
* Obtains remote port number.
* Obtains low-ranged remote port number.
*
* @return remote port number
* @return low-ranged remote port number
*/
public short getRemotePort() {
return remotePort;
public short getRemotePortLow() {
return remotePortLow;
}
/**
* Obtains high-ranged remote port number.
*
* @return high-ranged remote port number
*/
public short getRemotePortHigh() {
return remotePortHigh;
}
/**
......@@ -129,7 +146,8 @@ public class LispAppDataLcafAddress extends LispLcafAddress {
@Override
public int hashCode() {
return Objects.hash(address, protocol, ipTos, localPort, remotePort);
return Objects.hash(address, protocol, ipTos, localPortLow,
localPortHigh, remotePortLow, remotePortHigh);
}
@Override
......@@ -143,8 +161,10 @@ public class LispAppDataLcafAddress extends LispLcafAddress {
return Objects.equals(this.address, other.address) &&
Objects.equals(this.protocol, other.protocol) &&
Objects.equals(this.ipTos, other.ipTos) &&
Objects.equals(this.localPort, other.localPort) &&
Objects.equals(this.remotePort, other.remotePort);
Objects.equals(this.localPortLow, other.localPortLow) &&
Objects.equals(this.localPortHigh, other.localPortHigh) &&
Objects.equals(this.remotePortLow, other.remotePortLow) &&
Objects.equals(this.remotePortHigh, other.remotePortHigh);
}
return false;
}
......@@ -155,8 +175,154 @@ public class LispAppDataLcafAddress extends LispLcafAddress {
.add("address", address)
.add("protocol", protocol)
.add("ip type of service", ipTos)
.add("local port number", localPort)
.add("remote port number", remotePort)
.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)
.toString();
}
public static final class AppDataAddressBuilder {
private byte protocol;
private int ipTos;
private short localPortLow;
private short localPortHigh;
private short remotePortLow;
private short remotePortHigh;
private LispAfiAddress address;
/**
* Sets protocol number.
*
* @param protocol protocol number
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withProtocol(byte protocol) {
this.protocol = protocol;
return this;
}
/**
* Sets IP type of service.
*
* @param ipTos IP type of service
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withIpTos(int ipTos) {
this.ipTos = ipTos;
return this;
}
/**
* Sets low-ranged local port number.
*
* @param localPortLow low-ranged local port number
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withLocalPortLow(short localPortLow) {
this.localPortLow = localPortLow;
return this;
}
/**
* Sets high-ranged local port number.
*
* @param localPortHigh high-ranged local port number
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withLocalPortHigh(short localPortHigh) {
this.localPortHigh = localPortHigh;
return this;
}
/**
* Sets low-ranged remote port number.
*
* @param remotePortLow low-ranged remote port number
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withRemotePortLow(short remotePortLow) {
this.remotePortLow = remotePortLow;
return this;
}
/**
* Sets high-ranged remote port number.
*
* @param remotePortHigh high-ranged remote port number
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withRemotePortHigh(short remotePortHigh) {
this.remotePortHigh = remotePortHigh;
return this;
}
/**
* Sets AFI address.
*
* @param address AFI address
* @return AppDataAddressBuilder object
*/
AppDataAddressBuilder withAddress(LispAfiAddress address) {
this.address = address;
return this;
}
/**
* Builds LispAppDataLcafAddress instance.
*
* @return LispAddDataLcafAddress instance
*/
LispAppDataLcafAddress build() {
return new LispAppDataLcafAddress(protocol, ipTos, localPortLow,
localPortHigh, remotePortLow, remotePortHigh, address);
}
}
/**
* Application data LCAF address reader class.
*/
public static class AppDataLcafAddressReader
implements LispAddressReader<LispAppDataLcafAddress> {
@Override
public LispAppDataLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
byte[] ipTosByte = new byte[3];
byteBuf.readBytes(ipTosByte);
byte protocol = (byte) byteBuf.readUnsignedByte();
int ipTos = getPartialInt(ipTosByte);
short localPortLow = (short) byteBuf.readUnsignedShort();
short localPortHigh = (short) byteBuf.readUnsignedShort();
short remotePortLow = (short) byteBuf.readUnsignedShort();
short remotePortHigh = (short) byteBuf.readUnsignedShort();
LispAfiAddress address = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
return new AppDataAddressBuilder()
.withProtocol(protocol)
.withIpTos(ipTos)
.withLocalPortLow(localPortLow)
.withLocalPortHigh(localPortHigh)
.withRemotePortLow(remotePortLow)
.withRemotePortHigh(remotePortHigh)
.withAddress(address)
.build();
}
/**
* A utility function that obtains the partial int value from byte arrays.
*
* @param bytes an array of bytes
* @return converted integer
*/
public static int getPartialInt(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.position(4 - bytes.length);
buffer.put(bytes);
buffer.position(0);
return buffer.getInt();
}
}
}
......
......@@ -15,6 +15,10 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import java.util.Objects;
/**
......@@ -73,4 +77,15 @@ public class LispAsAddress extends LispAfiAddress {
public String toString() {
return String.valueOf(asNum);
}
/**
* Autonomous system address reader class.
*/
public static class AsAddressReader implements LispAddressReader<LispAsAddress> {
@Override
public LispAsAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
throw new LispReaderException("Unimplemented method");
}
}
}
......
......@@ -15,6 +15,9 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -69,4 +72,24 @@ public class LispDistinguishedNameAddress extends LispAfiAddress {
.add("distinguished name", distinguishedName)
.toString();
}
/**
* Distinguished name address reader class.
*/
public static class DistinguishedNameAddressReader
implements LispAddressReader<LispDistinguishedNameAddress> {
@Override
public LispDistinguishedNameAddress readFrom(ByteBuf byteBuf) throws LispParseError {
StringBuilder sb = new StringBuilder();
byte character = byteBuf.readByte();
while (character != 0) {
sb.append((char) character);
character = byteBuf.readByte();
}
return new LispDistinguishedNameAddress(sb.toString());
}
}
}
......
......@@ -15,7 +15,10 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onlab.packet.IpAddress;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
/**
* IP address that is used by LISP Locator.
......@@ -58,4 +61,25 @@ public abstract class LispIpAddress extends LispAfiAddress {
public String toString() {
return address.toString();
}
/**
* IP Address reader class.
*/
public static class IpAddressReader implements LispAddressReader<LispIpAddress> {
@Override
public LispIpAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
// AFI code -> 16 bits
short afiCode = (short) byteBuf.readUnsignedShort();
if (afiCode == 1) {
return new LispIpv4Address.Ipv4AddressReader().readFrom(byteBuf);
} else if (afiCode == 2) {
return new LispIpv6Address.Ipv6AddressReader().readFrom(byteBuf);
}
return null;
}
}
}
......
......@@ -15,7 +15,9 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onlab.packet.IpAddress;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import java.util.Objects;
......@@ -54,4 +56,22 @@ public class LispIpv4Address extends LispIpAddress {
public int hashCode() {
return Objects.hash(address, getAfi());
}
/**
* IPv4 address reader class.
*/
public static class Ipv4AddressReader implements LispAddressReader<LispIpv4Address> {
private static final int SIZE_OF_IPV4_ADDRESS = 4;
@Override
public LispIpv4Address readFrom(ByteBuf byteBuf) throws LispParseError {
byte[] ipByte = new byte[SIZE_OF_IPV4_ADDRESS];
byteBuf.readBytes(ipByte);
IpAddress ipAddress = IpAddress.valueOf(IpAddress.Version.INET, ipByte);
return new LispIpv4Address(ipAddress);
}
}
}
......
......@@ -15,7 +15,9 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onlab.packet.IpAddress;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import java.util.Objects;
......@@ -54,4 +56,22 @@ public class LispIpv6Address extends LispIpAddress {
public int hashCode() {
return Objects.hash(address, getAfi());
}
/**
* IPv6 address reader class.
*/
public static class Ipv6AddressReader implements LispAddressReader<LispIpv6Address> {
private static final int SIZE_OF_IPV6_ADDRESS = 16;
@Override
public LispIpv6Address readFrom(ByteBuf byteBuf) throws LispParseError {
byte[] ipByte = new byte[SIZE_OF_IPV6_ADDRESS];
byteBuf.readBytes(ipByte);
IpAddress ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, ipByte);
return new LispIpv6Address(ipAddress);
}
}
}
......
......@@ -16,6 +16,9 @@
package org.onosproject.lisp.msg.types;
import com.google.common.collect.ImmutableList;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import java.util.List;
import java.util.Objects;
......@@ -51,7 +54,7 @@ import static com.google.common.base.MoreObjects.toStringHelper;
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* }</pre>
*/
public class LispListLcafAddress extends LispLcafAddress {
public final class LispListLcafAddress extends LispLcafAddress {
private static final byte LENGTH = 24;
List<LispAfiAddress> addresses;
......@@ -99,4 +102,20 @@ public class LispListLcafAddress extends LispLcafAddress {
.add("addresses", addresses)
.toString();
}
/**
* List LCAF address reader class.
*/
public static class ListLcafAddressReader implements LispAddressReader<LispListLcafAddress> {
@Override
public LispListLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
LispAfiAddress ipv4 = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
LispAfiAddress ipv6 = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
return new LispListLcafAddress(ImmutableList.of(ipv4, ipv6));
}
}
}
......
......@@ -15,7 +15,9 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onlab.packet.MacAddress;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import java.util.Objects;
......@@ -68,4 +70,22 @@ public class LispMacAddress extends LispAfiAddress {
public String toString() {
return address.toString();
}
/**
* MAC address reader class.
*/
public static class MacAddressReader implements LispAddressReader<LispMacAddress> {
private static final int SIZE_OF_MAC_ADDRESS = 6;
@Override
public LispMacAddress readFrom(ByteBuf byteBuf) throws LispParseError {
byte[] macByte = new byte[SIZE_OF_MAC_ADDRESS];
byteBuf.readBytes(macByte);
MacAddress macAddress = MacAddress.valueOf(macByte);
return new LispMacAddress(macAddress);
}
}
}
......
......@@ -15,6 +15,9 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
/**
* No address.
*/
......@@ -26,4 +29,15 @@ public class LispNoAddress extends LispAfiAddress {
public LispNoAddress() {
super(AddressFamilyIdentifierEnum.NO_ADDRESS);
}
/**
* LISP no address reader class.
*/
public static class NoAddressReader implements LispAddressReader<LispNoAddress> {
@Override
public LispNoAddress readFrom(ByteBuf byteBuf) throws LispParseError {
return new LispNoAddress();
}
}
}
......
......@@ -15,6 +15,10 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -40,7 +44,7 @@ import static com.google.common.base.MoreObjects.toStringHelper;
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* }</pre>
*/
public class LispSegmentLcafAddress extends LispLcafAddress {
public final class LispSegmentLcafAddress extends LispLcafAddress {
private final LispAfiAddress address;
private final int instanceId;
......@@ -52,7 +56,7 @@ public class LispSegmentLcafAddress extends LispLcafAddress {
* @param instanceId instance id
* @param address address
*/
public LispSegmentLcafAddress(byte idMaskLength, int instanceId, LispAfiAddress address) {
private LispSegmentLcafAddress(byte idMaskLength, int instanceId, LispAfiAddress address) {
super(LispCanonicalAddressFormatEnum.SEGMENT, idMaskLength);
this.address = address;
this.instanceId = instanceId;
......@@ -113,4 +117,75 @@ public class LispSegmentLcafAddress extends LispLcafAddress {
.add("idMaskLength", reserved2)
.toString();
}
public static final class SegmentAddressBuilder {
private byte idMaskLength;
private LispAfiAddress address;
private int instanceId;
/**
* Sets identifier mask length.
*
* @param idMaskLength identifier mask length
* @return SegmentAddressBuilder object
*/
public SegmentAddressBuilder withIdMaskLength(byte idMaskLength) {
this.idMaskLength = idMaskLength;
return this;
}
/**
* Sets instance identifer.
*
* @param instanceId instance identifier
* @return SegmentAddressBuilder object
*/
public SegmentAddressBuilder withInstanceId(int instanceId) {
this.instanceId = instanceId;
return this;
}
/**
* Sets AFI address.
*
* @param address AFI address
* @return SegmentAddressBuilder object
*/
public SegmentAddressBuilder withAddress(LispAfiAddress address) {
this.address = address;
return this;
}
/**
* Builds LispSegmentLcafAddress instance.
*
* @return LispSegmentLcafAddress instance
*/
public LispSegmentLcafAddress build() {
return new LispSegmentLcafAddress(idMaskLength, instanceId, address);
}
}
/**
* Segment LCAF address reader class.
*/
public static class SegmentLcafAddressReader
implements LispAddressReader<LispSegmentLcafAddress> {
@Override
public LispSegmentLcafAddress readFrom(ByteBuf byteBuf)
throws LispParseError, LispReaderException {
// TODO: need to de-serialize IdMaskLength
byte idMaskLength = 0x01;
int instanceId = (int) byteBuf.readUnsignedInt();
LispAfiAddress address = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
return new SegmentAddressBuilder()
.withIdMaskLength(idMaskLength)
.withInstanceId(instanceId)
.withAddress(address)
.build();
}
}
}
......
......@@ -15,6 +15,10 @@
*/
package org.onosproject.lisp.msg.types;
import io.netty.buffer.ByteBuf;
import org.onosproject.lisp.msg.exceptions.LispParseError;
import org.onosproject.lisp.msg.exceptions.LispReaderException;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
......@@ -42,37 +46,27 @@ import static com.google.common.base.MoreObjects.toStringHelper;
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* }</pre>
*/
public class LispSourceDestLcafAddress extends LispLcafAddress {
public final class LispSourceDestLcafAddress extends LispLcafAddress {
private LispAfiAddress srcPrefix;
private LispAfiAddress dstPrefix;
private final LispAfiAddress srcPrefix;
private final LispAfiAddress dstPrefix;
private final byte srcMaskLength;
private final byte dstMaskLength;
private final short reserved;
/**
* Initializes source/dest key type LCAF address.
*/
public LispSourceDestLcafAddress() {
super(LispCanonicalAddressFormatEnum.SOURCE_DEST);
srcMaskLength = 0;
dstMaskLength = 0;
reserved = 0;
}
/**
* Initializes source/dest key type LCAF address.
*
* @param reserved reserved
* @param reserved reserved
* @param srcMaskLength source mask length
* @param dstMaskLength destination mask length
* @param srcPrefix source address prefix
* @param dstPrefix destination address prefix
* @param srcPrefix source address prefix
* @param dstPrefix destination address prefix
*/
public LispSourceDestLcafAddress(short reserved, byte srcMaskLength,
byte dstMaskLength,
LispAfiAddress srcPrefix,
LispAfiAddress dstPrefix) {
private LispSourceDestLcafAddress(short reserved, byte srcMaskLength,
byte dstMaskLength,
LispAfiAddress srcPrefix,
LispAfiAddress dstPrefix) {
super(LispCanonicalAddressFormatEnum.SOURCE_DEST);
this.reserved = reserved;
this.srcMaskLength = srcMaskLength;
......@@ -140,10 +134,10 @@ public class LispSourceDestLcafAddress extends LispLcafAddress {
if (obj instanceof LispSourceDestLcafAddress) {
final LispSourceDestLcafAddress other = (LispSourceDestLcafAddress) obj;
return Objects.equals(this.srcPrefix, other.srcPrefix) &&
Objects.equals(this.dstPrefix, other.dstPrefix) &&
Objects.equals(this.srcMaskLength, other.srcMaskLength) &&
Objects.equals(this.dstMaskLength, other.dstMaskLength) &&
Objects.equals(this.reserved, other.reserved);
Objects.equals(this.dstPrefix, other.dstPrefix) &&
Objects.equals(this.srcMaskLength, other.srcMaskLength) &&
Objects.equals(this.dstMaskLength, other.dstMaskLength) &&
Objects.equals(this.reserved, other.reserved);
}
return false;
}
......@@ -158,4 +152,103 @@ public class LispSourceDestLcafAddress extends LispLcafAddress {
.add("reserved", reserved)
.toString();
}
public static final class SourceDestAddressBuilder {
private LispAfiAddress srcPrefix;
private LispAfiAddress dstPrefix;
private byte srcMaskLength;
private byte dstMaskLength;
private short reserved;
/**
* Sets source address prefix.
*
* @param srcPrefix source prefix
* @return SourceDestAddressBuilder object
*/
public SourceDestAddressBuilder withSrcPrefix(LispAfiAddress srcPrefix) {
this.srcPrefix = srcPrefix;
return this;
}
/**
* Sets destination address prefix.
*
* @param dstPrefix
* @return SourceDestAddressBuilder object
*/
public SourceDestAddressBuilder withDstPrefix(LispAfiAddress dstPrefix) {
this.dstPrefix = dstPrefix;
return this;
}
/**
* Sets source mask length.
*
* @param srcMaskLength source mask length
* @return SourceDestAddressBuilder object
*/
public SourceDestAddressBuilder withSrcMaskLength(byte srcMaskLength) {
this.srcMaskLength = srcMaskLength;
return this;
}
/**
* Sets destination mask length.
*
* @param dstMaskLength destination mask length
* @return SourceDestAddressBuilder object
*/
public SourceDestAddressBuilder withDstMaskLength(byte dstMaskLength) {
this.dstMaskLength = dstMaskLength;
return this;
}
/**
* Sets reserved value.
*
* @param reserved reserved field value
* @return SourceDestAddressBuilder object
*/
public SourceDestAddressBuilder withReserved(short reserved) {
this.reserved = reserved;
return this;
}
/**
* Builds LispSourceDestLcafAddress instance.
*
* @return LispSourceDestLcafAddress instance
*/
public LispSourceDestLcafAddress build() {
return new LispSourceDestLcafAddress(reserved, srcMaskLength,
dstMaskLength, srcPrefix, dstPrefix);
}
}
/**
* SourceDest LCAF address reader class.
*/
public static class SourceDestLcafAddressReader
implements LispAddressReader<LispSourceDestLcafAddress> {
@Override
public LispSourceDestLcafAddress readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
short reserved = byteBuf.readShort();
byte srcMaskLength = (byte) byteBuf.readUnsignedByte();
byte dstMaskLength = (byte) byteBuf.readUnsignedByte();
LispAfiAddress srcPrefix = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
LispAfiAddress dstPrefix = new LispIpAddress.IpAddressReader().readFrom(byteBuf);
return new SourceDestAddressBuilder()
.withReserved(reserved)
.withSrcMaskLength(srcMaskLength)
.withDstMaskLength(dstMaskLength)
.withSrcPrefix(srcPrefix)
.withDstPrefix(dstPrefix)
.build();
}
}
}
......
......@@ -35,13 +35,48 @@ public class LispAppDataLcafAddressTest {
@Before
public void setup() {
LispAppDataLcafAddress.AppDataAddressBuilder builder1 =
new LispAppDataLcafAddress.AppDataAddressBuilder();
LispAfiAddress ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
address1 = new LispAppDataLcafAddress((byte) 0x01, 1, (short) 10, (short) 20, ipv4Address1);
sameAsAddress1 = new LispAppDataLcafAddress((byte) 0x01, 1, (short) 10, (short) 20, ipv4Address1);
address1 = builder1
.withProtocol((byte) 0x01)
.withIpTos((short) 10)
.withLocalPortLow((short) 1)
.withLocalPortHigh((short) 255)
.withRemotePortLow((short) 2)
.withRemotePortHigh((short) 254)
.withAddress(ipv4Address1)
.build();
LispAppDataLcafAddress.AppDataAddressBuilder builder2 =
new LispAppDataLcafAddress.AppDataAddressBuilder();
sameAsAddress1 = builder2
.withProtocol((byte) 0x01)
.withIpTos((short) 10)
.withLocalPortLow((short) 1)
.withLocalPortHigh((short) 255)
.withRemotePortLow((short) 2)
.withRemotePortHigh((short) 254)
.withAddress(ipv4Address1)
.build();
LispAppDataLcafAddress.AppDataAddressBuilder builder3 =
new LispAppDataLcafAddress.AppDataAddressBuilder();
LispAfiAddress ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1"));
address2 = new LispAppDataLcafAddress((byte) 0x02, 2, (short) 20, (short) 40, ipv4Address2);
address2 = builder3
.withProtocol((byte) 0x02)
.withIpTos((short) 20)
.withLocalPortLow((short) 1)
.withLocalPortHigh((short) 255)
.withRemotePortLow((short) 2)
.withRemotePortHigh((short) 254)
.withAddress(ipv4Address2)
.build();
}
@Test
......@@ -58,9 +93,11 @@ public class LispAppDataLcafAddressTest {
LispAfiAddress ipv4Address = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
assertThat(appDataLcafAddress.getProtocol(), is((byte) 0x01));
assertThat(appDataLcafAddress.getIpTos(), is(1));
assertThat(appDataLcafAddress.getLocalPort(), is((short) 10));
assertThat(appDataLcafAddress.getRemotePort(), is((short) 20));
assertThat(appDataLcafAddress.getIpTos(), is(10));
assertThat(appDataLcafAddress.getLocalPortLow(), is((short) 1));
assertThat(appDataLcafAddress.getLocalPortHigh(), is((short) 255));
assertThat(appDataLcafAddress.getRemotePortLow(), is((short) 2));
assertThat(appDataLcafAddress.getRemotePortHigh(), is((short) 254));
assertThat(appDataLcafAddress.getAddress(), is(ipv4Address));
}
}
......
......@@ -35,13 +35,35 @@ public class LispSegmentLcafAddressTest {
@Before
public void setup() {
LispSegmentLcafAddress.SegmentAddressBuilder builder1 =
new LispSegmentLcafAddress.SegmentAddressBuilder();
LispIpv4Address ipv4Address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
address1 = new LispSegmentLcafAddress((byte) 0x01, 1, ipv4Address1);
sameAsAddress1 = new LispSegmentLcafAddress((byte) 0x01, 1, ipv4Address1);
address1 = builder1
.withIdMaskLength((byte) 0x01)
.withInstanceId(1)
.withAddress(ipv4Address1)
.build();
LispSegmentLcafAddress.SegmentAddressBuilder builder2 =
new LispSegmentLcafAddress.SegmentAddressBuilder();
sameAsAddress1 = builder2
.withIdMaskLength((byte) 0x01)
.withInstanceId(1)
.withAddress(ipv4Address1)
.build();
LispSegmentLcafAddress.SegmentAddressBuilder builder3 =
new LispSegmentLcafAddress.SegmentAddressBuilder();
LispIpv4Address ipv4Address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1"));
address2 = new LispSegmentLcafAddress((byte) 0x02, 2, ipv4Address2);
address2 = builder3
.withIdMaskLength((byte) 0x02)
.withInstanceId(2)
.withAddress(ipv4Address2)
.build();
}
@Test
......
......@@ -35,20 +35,44 @@ public class LispSourceDestLcafAddressTest {
@Before
public void setup() {
LispSourceDestLcafAddress.SourceDestAddressBuilder builder1 =
new LispSourceDestLcafAddress.SourceDestAddressBuilder();
LispIpv4Address srcAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
LispIpv4Address dstAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
address1 = new LispSourceDestLcafAddress((short) 1, (byte) 0x01,
(byte) 0x01, srcAddress1, dstAddress1);
address1 = builder1
.withReserved((short) 1)
.withSrcMaskLength((byte) 0x01)
.withDstMaskLength((byte) 0x01)
.withSrcPrefix(srcAddress1)
.withDstPrefix(dstAddress1)
.build();
LispSourceDestLcafAddress.SourceDestAddressBuilder builder2 =
new LispSourceDestLcafAddress.SourceDestAddressBuilder();
sameAsAddress1 = builder2
.withReserved((short) 1)
.withSrcMaskLength((byte) 0x01)
.withDstMaskLength((byte) 0x01)
.withSrcPrefix(srcAddress1)
.withDstPrefix(dstAddress1)
.build();
sameAsAddress1 = new LispSourceDestLcafAddress((short) 1, (byte) 0x01,
(byte) 0x01, srcAddress1, dstAddress1);
LispSourceDestLcafAddress.SourceDestAddressBuilder builder3 =
new LispSourceDestLcafAddress.SourceDestAddressBuilder();
LispIpv4Address srcAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1"));
LispIpv4Address dstAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.2"));
address2 = new LispSourceDestLcafAddress((short) 2, (byte) 0x02,
(byte) 0x02, srcAddress2, dstAddress2);
address2 = builder3
.withReserved((short) 2)
.withSrcMaskLength((byte) 0x02)
.withDstMaskLength((byte) 0x02)
.withSrcPrefix(srcAddress2)
.withDstPrefix(dstAddress2)
.build();
}
@Test
......