diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispLocatorRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispLocatorRecord.java index 37eeb719d7..0b5407e23b 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispLocatorRecord.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispLocatorRecord.java @@ -24,6 +24,7 @@ import org.onosproject.lisp.msg.exceptions.LispWriterException; import org.onosproject.lisp.msg.types.LispAfiAddress; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; import static org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter; /** @@ -209,6 +210,9 @@ public final class DefaultLispLocatorRecord implements LispLocatorRecord { @Override public LispLocatorRecord build() { + + checkNotNull(locatorAfi, "Must specify a locator address"); + return new DefaultLispLocatorRecord(priority, weight, multicastPriority, multicastWeight, localLocator, rlocProbed, routed, locatorAfi); } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java index 14399c2504..bfd64fcc8e 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapNotify.java @@ -152,7 +152,7 @@ public final class DefaultLispMapNotify implements LispMapNotify { private short authDataLength; private byte[] authenticationData; private byte recordCount; - private List mapRecords; + private List mapRecords = Lists.newArrayList(); @Override public LispType getType() { @@ -197,8 +197,6 @@ public final class DefaultLispMapNotify implements LispMapNotify { public NotifyBuilder withMapRecords(List mapRecords) { if (mapRecords != null) { this.mapRecords = ImmutableList.copyOf(mapRecords); - } else { - this.mapRecords = Lists.newArrayList(); } return this; } @@ -210,10 +208,6 @@ public final class DefaultLispMapNotify implements LispMapNotify { authenticationData = new byte[0]; } - if (mapRecords == null) { - mapRecords = Lists.newArrayList(); - } - return new DefaultLispMapNotify(nonce, keyId, authDataLength, authenticationData, recordCount, mapRecords); } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java index f53d04dea4..b4e51396b6 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRecord.java @@ -28,6 +28,7 @@ import org.onosproject.lisp.msg.types.LispAfiAddress; import java.util.List; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; import static org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter; import static org.onosproject.lisp.msg.protocols.DefaultLispLocatorRecord.LocatorRecordWriter; @@ -163,7 +164,7 @@ public final class DefaultLispMapRecord implements LispMapRecord { private boolean authoritative; private short mapVersionNumber; private LispAfiAddress eidPrefixAfi; - private List locatorRecords; + private List locatorRecords = Lists.newArrayList(); @Override public MapRecordBuilder withRecordTtl(int recordTtl) { @@ -211,8 +212,6 @@ public final class DefaultLispMapRecord implements LispMapRecord { public MapRecordBuilder withLocators(List records) { if (records != null) { this.locatorRecords = ImmutableList.copyOf(records); - } else { - this.locatorRecords = Lists.newArrayList(); } return this; } @@ -220,9 +219,7 @@ public final class DefaultLispMapRecord implements LispMapRecord { @Override public LispMapRecord build() { - if (locatorRecords == null) { - locatorRecords = Lists.newArrayList(); - } + checkNotNull(eidPrefixAfi, "Must specify an EID prefix"); return new DefaultLispMapRecord(recordTtl, locatorCount, maskLength, action, authoritative, mapVersionNumber, eidPrefixAfi, locatorRecords); diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java index b6ed216d58..e0d1490a32 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRegister.java @@ -175,9 +175,9 @@ public final class DefaultLispMapRegister implements LispMapRegister { private long nonce; private short keyId; private short authDataLength; - private byte[] authenticationData; + private byte[] authenticationData = new byte[0]; private byte recordCount; - private List mapRecords; + private List mapRecords = Lists.newArrayList(); private boolean proxyMapReply; private boolean wantMapNotify; @@ -226,8 +226,6 @@ public final class DefaultLispMapRegister implements LispMapRegister { public RegisterBuilder withAuthenticationData(byte[] authenticationData) { if (authenticationData != null) { this.authenticationData = authenticationData; - } else { - this.authenticationData = new byte[0]; } return this; } @@ -236,22 +234,12 @@ public final class DefaultLispMapRegister implements LispMapRegister { public RegisterBuilder withMapRecords(List mapRecords) { if (mapRecords != null) { this.mapRecords = ImmutableList.copyOf(mapRecords); - } else { - this.mapRecords = Lists.newArrayList(); } return this; } @Override public LispMapRegister build() { - if (authenticationData == null) { - authenticationData = new byte[0]; - } - - if (mapRecords == null) { - mapRecords = Lists.newArrayList(); - } - return new DefaultLispMapRegister(nonce, keyId, authDataLength, authenticationData, recordCount, mapRecords, proxyMapReply, wantMapNotify); } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java index f4227407cd..75c1689638 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapReply.java @@ -146,7 +146,7 @@ public final class DefaultLispMapReply implements LispMapReply { private boolean probe; private boolean etr; private boolean security; - private List mapRecords; + private List mapRecords = Lists.newArrayList(); @Override public LispType getType() { @@ -185,22 +185,14 @@ public final class DefaultLispMapReply implements LispMapReply { @Override public ReplyBuilder withMapRecords(List mapRecords) { - if (this.mapRecords != null) { this.mapRecords = ImmutableList.copyOf(mapRecords); - } else { - this.mapRecords = Lists.newArrayList(); } return this; } @Override public LispMapReply build() { - - if (mapRecords == null) { - mapRecords = Lists.newArrayList(); - } - return new DefaultLispMapReply(nonce, recordCount, probe, etr, security, mapRecords); } } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java index b62eed6eda..c44c909b95 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/DefaultLispMapRequest.java @@ -270,23 +270,16 @@ public final class DefaultLispMapRequest implements LispMapRequest { @Override public RequestBuilder withItrRlocs(List itrRlocs) { - if (itrRlocs != null) { this.itrRlocs = ImmutableList.copyOf(itrRlocs); - } else { - this.itrRlocs = Lists.newArrayList(); } - return this; } @Override public RequestBuilder withEidRecords(List records) { - if (records != null) { this.eidRecords = ImmutableList.copyOf(records); - } else { - this.eidRecords = Lists.newArrayList(); } return this; } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java index 35fe975f81..9ceef6cbe4 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/protocols/LispEidRecord.java @@ -21,6 +21,7 @@ import org.onosproject.lisp.msg.exceptions.LispReaderException; import org.onosproject.lisp.msg.exceptions.LispWriterException; import org.onosproject.lisp.msg.types.LispAfiAddress; +import static com.google.common.base.Preconditions.checkNotNull; import static org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter; /** @@ -39,6 +40,9 @@ public final class LispEidRecord { */ public LispEidRecord(byte maskLength, LispAfiAddress prefix) { this.maskLength = maskLength; + + checkNotNull(prefix, "Must specify an address prefix"); + this.prefix = prefix; } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/AddressFamilyIdentifierEnum.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/AddressFamilyIdentifierEnum.java index 526c8b45fc..e1a4d97b86 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/AddressFamilyIdentifierEnum.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/AddressFamilyIdentifierEnum.java @@ -26,7 +26,7 @@ package org.onosproject.lisp.msg.types; public enum AddressFamilyIdentifierEnum { NO_ADDRESS(0), // Reserved - IP(1), // IP (IP version 4) + IP4(1), // IP4 (IP version 4) IP6(2), // IP6 (IP version 6) DNS(16), // Domain Name System DISTINGUISHED_NAME(17), // Distinguished Name diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java index c7e72c5d71..aba3475ad9 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java @@ -90,7 +90,7 @@ public abstract class LispAfiAddress { short afiCode = (short) byteBuf.getUnsignedShort(index); // handle IPv4 and IPv6 address - if (afiCode == IP.getIanaCode() || + if (afiCode == IP4.getIanaCode() || afiCode == IP6.getIanaCode()) { return new LispIpAddress.IpAddressReader().readFrom(byteBuf); } @@ -131,7 +131,7 @@ public abstract class LispAfiAddress { byteBuf.writeShort(address.getAfi().getIanaCode()); switch (address.getAfi()) { - case IP: + case IP4: new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv4Address) address); break; case IP6: diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java index 56ff2f2f37..8e4c9727e5 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Objects; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; /** * Application data type LCAF address class. @@ -308,6 +309,9 @@ public final class LispAppDataLcafAddress extends LispLcafAddress { * @return LispAddDataLcafAddress instance */ public LispAppDataLcafAddress build() { + + checkNotNull(address, "Must specify an address"); + return new LispAppDataLcafAddress(reserved1, reserved2, flag, length, protocol, ipTos, localPortLow, localPortHigh, remotePortLow, remotePortHigh, address); diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv4Address.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv4Address.java index a0df8d84ff..62f1ea06b2 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv4Address.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv4Address.java @@ -35,7 +35,7 @@ public class LispIpv4Address extends LispIpAddress { * @param address IP address */ public LispIpv4Address(IpAddress address) { - super(address, AddressFamilyIdentifierEnum.IP); + super(address, AddressFamilyIdentifierEnum.IP4); checkArgument(address.isIp4()); } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java index 85a21d2c02..7a1763cc24 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispLcafAddress.java @@ -19,6 +19,8 @@ import io.netty.buffer.ByteBuf; import org.onosproject.lisp.msg.exceptions.LispParseError; import org.onosproject.lisp.msg.exceptions.LispReaderException; import org.onosproject.lisp.msg.exceptions.LispWriterException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.Objects; @@ -41,6 +43,8 @@ import static org.onosproject.lisp.msg.types.LispCanonicalAddressFormatEnum.*; */ public class LispLcafAddress extends LispAfiAddress { + private static final Logger log = LoggerFactory.getLogger(LispLcafAddress.class); + private final LispCanonicalAddressFormatEnum lcafType; private final byte reserved1; private final byte reserved2; @@ -369,6 +373,8 @@ public class LispLcafAddress extends LispAfiAddress { return new LispSourceDestLcafAddress.SourceDestLcafAddressReader().readFrom(byteBuf); } + log.warn("Unsupported LCAF type, please specify a correct LCAF type"); + return null; } } @@ -397,7 +403,9 @@ public class LispLcafAddress extends LispAfiAddress { new LispSourceDestLcafAddress.SourceDestLcafAddressWriter().writeTo(byteBuf, (LispSourceDestLcafAddress) address); break; - default: break; // TODO: need to log warning message + default: + log.warn("Unsupported LCAF type, please specify a correct LCAF type"); + break; } } } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java index 68834db158..c51a8aa378 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Objects; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkArgument; /** * List type LCAF address class. @@ -67,6 +68,10 @@ public final class LispListLcafAddress extends LispLcafAddress { */ public LispListLcafAddress(List addresses) { super(LispCanonicalAddressFormatEnum.LIST, LENGTH); + + checkArgument(checkAddressValidity(addresses), "Malformed addresses, please " + + "specify IPv4 address first, and then specify IPv6 address"); + this.addresses = addresses; } @@ -81,9 +86,41 @@ public final class LispListLcafAddress extends LispLcafAddress { public LispListLcafAddress(byte reserved1, byte reserved2, byte flag, List addresses) { super(LispCanonicalAddressFormatEnum.LIST, reserved1, flag, reserved2, LENGTH); + + checkArgument(checkAddressValidity(addresses), "Malformed addresses, please " + + "specify IPv4 address first, and then specify IPv6 address"); + this.addresses = addresses; } + /** + * Checks the validity of a collection of input addresses. + * + * @param addresses a collection of addresses + * @return validity result + */ + private boolean checkAddressValidity(List addresses) { + // we need to make sure that the address collection is comprised of + // one IPv4 address and one IPv6 address + + if (addresses == null || addresses.size() != 2) { + return false; + } + + LispAfiAddress ipv4 = addresses.get(0); + LispAfiAddress ipv6 = addresses.get(1); + + if (ipv4.getAfi() != AddressFamilyIdentifierEnum.IP4) { + return false; + } + + if (ipv6.getAfi() != AddressFamilyIdentifierEnum.IP6) { + return false; + } + + return true; + } + /** * Obtains a set of AFI addresses including IPv4 and IPv6. * diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java index c6a84cc193..0004965f35 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java @@ -23,6 +23,7 @@ import org.onosproject.lisp.msg.exceptions.LispWriterException; import java.util.Objects; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; /** * Instance ID type LCAF address class. @@ -181,6 +182,9 @@ public final class LispSegmentLcafAddress extends LispLcafAddress { * @return LispSegmentLcafAddress instance */ public LispSegmentLcafAddress build() { + + checkNotNull(address, "Must specify an address"); + return new LispSegmentLcafAddress(reserved1, idMaskLength, flag, length, instanceId, address); } diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java index 80dd53839b..954c2b42af 100644 --- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java +++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSourceDestLcafAddress.java @@ -23,6 +23,7 @@ import org.onosproject.lisp.msg.exceptions.LispWriterException; import java.util.Objects; import static com.google.common.base.MoreObjects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; /** * Source/Dest key type LCAF address class. @@ -248,6 +249,10 @@ public final class LispSourceDestLcafAddress extends LispLcafAddress { * @return LispSourceDestLcafAddress instance */ public LispSourceDestLcafAddress build() { + + checkNotNull(srcPrefix, "Must specify a source address prefix"); + checkNotNull(dstPrefix, "Must specify a destination address prefix"); + return new LispSourceDestLcafAddress(reserved1, reserved2, flag, length, reserved, srcMaskLength, dstMaskLength, srcPrefix, dstPrefix); }