mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-15 17:31:31 +02:00
[ONOS-5427] Add LISP Info-Request and Info-Reply message type
Change-Id: Ia54919945609a57e45b34af3bbe7b04e4a7efbec
This commit is contained in:
parent
7f6d0e9ebe
commit
2775935682
@ -0,0 +1,230 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import org.onlab.util.ByteOperator;
|
||||||
|
import org.onlab.util.ImmutableByteSequence;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispParseError;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispReaderException;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispWriterException;
|
||||||
|
import org.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
import org.onosproject.lisp.msg.types.LispAfiAddress.AfiAddressWriter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class that contains a set of helper methods for LISP info request and reply.
|
||||||
|
*/
|
||||||
|
public class DefaultLispInfo implements LispInfo {
|
||||||
|
|
||||||
|
protected final boolean infoReply;
|
||||||
|
protected final long nonce;
|
||||||
|
protected final short keyId;
|
||||||
|
protected final short authDataLength;
|
||||||
|
protected final byte[] authenticationData;
|
||||||
|
protected final int ttl;
|
||||||
|
protected final byte maskLength;
|
||||||
|
protected final LispAfiAddress eidPrefix;
|
||||||
|
|
||||||
|
private static final int INFO_REPLY_INDEX = 3;
|
||||||
|
private static final int RESERVED_SKIP_LENGTH_1 = 3;
|
||||||
|
private static final int RESERVED_SKIP_LENGTH_2 = 1;
|
||||||
|
|
||||||
|
private static final int INFO_REQUEST_SHIFT_BIT = 4;
|
||||||
|
|
||||||
|
private static final int ENABLE_BIT = 1;
|
||||||
|
private static final int DISABLE_BIT = 0;
|
||||||
|
|
||||||
|
private static final int UNUSED_ZERO = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A private constructor that protects object instantiation from external.
|
||||||
|
*
|
||||||
|
* @param infoReply info reply flag
|
||||||
|
* @param nonce nonce
|
||||||
|
* @param keyId key identifier
|
||||||
|
* @param authDataLength authentication data length
|
||||||
|
* @param authenticationData authentication data
|
||||||
|
* @param ttl Time-To-Live value
|
||||||
|
* @param maskLength EID prefix mask length
|
||||||
|
* @param eidPrefix EID prefix
|
||||||
|
*/
|
||||||
|
protected DefaultLispInfo(boolean infoReply, long nonce, short keyId, short authDataLength,
|
||||||
|
byte[] authenticationData, int ttl, byte maskLength,
|
||||||
|
LispAfiAddress eidPrefix) {
|
||||||
|
this.infoReply = infoReply;
|
||||||
|
this.nonce = nonce;
|
||||||
|
this.keyId = keyId;
|
||||||
|
this.authDataLength = authDataLength;
|
||||||
|
this.authenticationData = authenticationData;
|
||||||
|
this.ttl = ttl;
|
||||||
|
this.maskLength = maskLength;
|
||||||
|
this.eidPrefix = eidPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispType getType() {
|
||||||
|
return LispType.LISP_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(ByteBuf byteBuf) {
|
||||||
|
// TODO: serialize LispMapRegister message
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Builder createBuilder() {
|
||||||
|
return new DefaultLispInfoRequest.DefaultInfoRequestBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasInfoReply() {
|
||||||
|
return infoReply;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getNonce() {
|
||||||
|
return nonce;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getKeyId() {
|
||||||
|
return keyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public short getAuthDataLength() {
|
||||||
|
return authDataLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte[] getAuthenticationData() {
|
||||||
|
if (authenticationData != null && authenticationData.length != 0) {
|
||||||
|
return ImmutableByteSequence.copyFrom(authenticationData).asArray();
|
||||||
|
} else {
|
||||||
|
return new byte[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTtl() {
|
||||||
|
return ttl;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public byte getMaskLength() {
|
||||||
|
return maskLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispAfiAddress getPrefix() {
|
||||||
|
return eidPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LispInfo deserialize(ByteBuf byteBuf) throws LispParseError, LispReaderException {
|
||||||
|
|
||||||
|
if (byteBuf.readerIndex() != 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// infoReply -> 1 bit
|
||||||
|
boolean infoReplyFlag = ByteOperator.getBit(byteBuf.readByte(), INFO_REPLY_INDEX);
|
||||||
|
|
||||||
|
// let's skip the reserved field
|
||||||
|
byteBuf.skipBytes(RESERVED_SKIP_LENGTH_1);
|
||||||
|
|
||||||
|
// nonce -> 64 bits
|
||||||
|
long nonce = byteBuf.readLong();
|
||||||
|
|
||||||
|
// keyId -> 16 bits
|
||||||
|
short keyId = byteBuf.readShort();
|
||||||
|
|
||||||
|
// authenticationDataLength -> 16 bits
|
||||||
|
short authLength = byteBuf.readShort();
|
||||||
|
|
||||||
|
// authenticationData -> depends on the authenticationDataLength
|
||||||
|
byte[] authData = new byte[authLength];
|
||||||
|
byteBuf.readBytes(authData);
|
||||||
|
|
||||||
|
// ttl -> 32 bits
|
||||||
|
int ttl = byteBuf.readInt();
|
||||||
|
|
||||||
|
// let's skip the reserved field
|
||||||
|
byteBuf.skipBytes(RESERVED_SKIP_LENGTH_2);
|
||||||
|
|
||||||
|
// mask length -> 8 bits
|
||||||
|
short maskLength = byteBuf.readUnsignedByte();
|
||||||
|
|
||||||
|
LispAfiAddress prefix = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
|
||||||
|
|
||||||
|
return new DefaultLispInfo(infoReplyFlag, nonce, keyId, authLength,
|
||||||
|
authData, ttl, (byte) maskLength, prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void serialize(ByteBuf byteBuf, LispInfo message) throws LispWriterException {
|
||||||
|
|
||||||
|
// specify LISP message type
|
||||||
|
byte msgType = (byte) (LispType.LISP_INFO.getTypeCode() << INFO_REQUEST_SHIFT_BIT);
|
||||||
|
|
||||||
|
// info reply flag
|
||||||
|
byte infoReply = DISABLE_BIT;
|
||||||
|
if (message.hasInfoReply()) {
|
||||||
|
infoReply = (byte) (ENABLE_BIT << INFO_REPLY_INDEX);
|
||||||
|
}
|
||||||
|
|
||||||
|
byteBuf.writeByte(msgType + infoReply);
|
||||||
|
|
||||||
|
// fill zero into reserved filed
|
||||||
|
byteBuf.writeByte((short) UNUSED_ZERO);
|
||||||
|
byteBuf.writeByte((short) UNUSED_ZERO);
|
||||||
|
byteBuf.writeByte((short) UNUSED_ZERO);
|
||||||
|
|
||||||
|
// nonce
|
||||||
|
byteBuf.writeLong(message.getNonce());
|
||||||
|
|
||||||
|
// keyId
|
||||||
|
byteBuf.writeShort(message.getKeyId());
|
||||||
|
|
||||||
|
// authentication data length in octet
|
||||||
|
byteBuf.writeShort(message.getAuthDataLength());
|
||||||
|
|
||||||
|
// authentication data
|
||||||
|
byte[] data = message.getAuthenticationData();
|
||||||
|
byte[] clone;
|
||||||
|
if (data != null) {
|
||||||
|
clone = data.clone();
|
||||||
|
Arrays.fill(clone, (byte) UNUSED_ZERO);
|
||||||
|
}
|
||||||
|
|
||||||
|
byteBuf.writeBytes(data);
|
||||||
|
|
||||||
|
// TODO: need to implement MAC authentication mechanism
|
||||||
|
|
||||||
|
/// TTL
|
||||||
|
byteBuf.writeInt(message.getTtl());
|
||||||
|
|
||||||
|
// fill zero into reserved filed
|
||||||
|
byteBuf.writeByte((short) UNUSED_ZERO);
|
||||||
|
|
||||||
|
// mask length
|
||||||
|
byteBuf.writeByte(message.getMaskLength());
|
||||||
|
|
||||||
|
// EID prefix AFI with EID prefix
|
||||||
|
AfiAddressWriter afiAddressWriter = new AfiAddressWriter();
|
||||||
|
afiAddressWriter.writeTo(byteBuf, message.getPrefix());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,219 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
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.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
import org.onosproject.lisp.msg.types.LispNatLcafAddress;
|
||||||
|
import org.onosproject.lisp.msg.types.LispNatLcafAddress.NatLcafAddressWriter;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static com.google.common.base.MoreObjects.toStringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default LISP info reply message class.
|
||||||
|
*/
|
||||||
|
public final class DefaultLispInfoReply extends DefaultLispInfo implements LispInfoReply {
|
||||||
|
|
||||||
|
private final LispNatLcafAddress natLcafAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A private constructor that protects object instantiation from external.
|
||||||
|
*
|
||||||
|
* @param infoReply info reply flag
|
||||||
|
* @param nonce nonce
|
||||||
|
* @param keyId key identifier
|
||||||
|
* @param authDataLength authentication data length
|
||||||
|
* @param authenticationData authentication data
|
||||||
|
* @param ttl Time-To-Live value
|
||||||
|
* @param maskLength EID prefix mask length
|
||||||
|
* @param eidPrefix EID prefix
|
||||||
|
* @param natLcafAddress NAT LCAF address
|
||||||
|
*/
|
||||||
|
protected DefaultLispInfoReply(boolean infoReply, long nonce, short keyId, short authDataLength,
|
||||||
|
byte[] authenticationData, int ttl, byte maskLength,
|
||||||
|
LispAfiAddress eidPrefix, LispNatLcafAddress natLcafAddress) {
|
||||||
|
super(infoReply, nonce, keyId, authDataLength, authenticationData, ttl, maskLength, eidPrefix);
|
||||||
|
this.natLcafAddress = natLcafAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispNatLcafAddress getNatLcafAddress() {
|
||||||
|
return natLcafAddress;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toStringHelper(this)
|
||||||
|
.add("type", getType())
|
||||||
|
.add("nonce", nonce)
|
||||||
|
.add("keyId", keyId)
|
||||||
|
.add("authentication data length", authDataLength)
|
||||||
|
.add("authentication data", authenticationData)
|
||||||
|
.add("TTL", ttl)
|
||||||
|
.add("EID mask length", maskLength)
|
||||||
|
.add("EID prefix", eidPrefix)
|
||||||
|
.add("NAT LCAF address", natLcafAddress).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultLispInfoReply that = (DefaultLispInfoReply) o;
|
||||||
|
return Objects.equal(nonce, that.nonce) &&
|
||||||
|
Objects.equal(keyId, that.keyId) &&
|
||||||
|
Objects.equal(authDataLength, that.authDataLength) &&
|
||||||
|
Arrays.equals(authenticationData, that.authenticationData) &&
|
||||||
|
Objects.equal(ttl, that.ttl) &&
|
||||||
|
Objects.equal(maskLength, that.maskLength) &&
|
||||||
|
Objects.equal(eidPrefix, that.eidPrefix) &&
|
||||||
|
Objects.equal(natLcafAddress, that.natLcafAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(nonce, keyId, authDataLength, ttl, maskLength,
|
||||||
|
eidPrefix, natLcafAddress) + Arrays.hashCode(authenticationData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class DefaultInfoReplyBuilder implements InfoReplyBuilder {
|
||||||
|
|
||||||
|
private boolean infoReply;
|
||||||
|
private long nonce;
|
||||||
|
private short keyId;
|
||||||
|
private short authDataLength;
|
||||||
|
private byte[] authenticationData = new byte[0];
|
||||||
|
private int ttl;
|
||||||
|
private byte maskLength;
|
||||||
|
private LispAfiAddress eidPrefix;
|
||||||
|
private LispNatLcafAddress natLcafAddress;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispType getType() {
|
||||||
|
return LispType.LISP_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withInfoReply(boolean infoReply) {
|
||||||
|
this.infoReply = infoReply;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withNonce(long nonce) {
|
||||||
|
this.nonce = nonce;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withAuthDataLength(short authDataLength) {
|
||||||
|
this.authDataLength = authDataLength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withKeyId(short keyId) {
|
||||||
|
this.keyId = keyId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withAuthenticationData(byte[] authenticationData) {
|
||||||
|
if (authenticationData != null) {
|
||||||
|
this.authenticationData = authenticationData;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withTtl(int ttl) {
|
||||||
|
this.ttl = ttl;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withMaskLength(byte maskLength) {
|
||||||
|
this.maskLength = maskLength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withEidPrefix(LispAfiAddress eidPrefix) {
|
||||||
|
this.eidPrefix = eidPrefix;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoReplyBuilder withNatLcafAddress(LispNatLcafAddress natLcafAddress) {
|
||||||
|
this.natLcafAddress = natLcafAddress;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispInfoReply build() {
|
||||||
|
return new DefaultLispInfoReply(infoReply, nonce, keyId, authDataLength,
|
||||||
|
authenticationData, ttl, maskLength, eidPrefix, natLcafAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A LISP message reader for InfoReply message.
|
||||||
|
*/
|
||||||
|
public static final class InfoReplyReader implements LispMessageReader<LispInfoReply> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispInfoReply readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
|
||||||
|
LispInfo lispInfo = DefaultLispInfo.deserialize(byteBuf);
|
||||||
|
LispNatLcafAddress natLcafAddress = new LispNatLcafAddress.NatLcafAddressReader().readFrom(byteBuf);
|
||||||
|
|
||||||
|
return new DefaultInfoReplyBuilder()
|
||||||
|
.withInfoReply(lispInfo.hasInfoReply())
|
||||||
|
.withNonce(lispInfo.getNonce())
|
||||||
|
.withKeyId(lispInfo.getKeyId())
|
||||||
|
.withAuthDataLength(lispInfo.getAuthDataLength())
|
||||||
|
.withAuthenticationData(lispInfo.getAuthenticationData())
|
||||||
|
.withTtl(lispInfo.getTtl())
|
||||||
|
.withMaskLength(lispInfo.getMaskLength())
|
||||||
|
.withEidPrefix(lispInfo.getPrefix())
|
||||||
|
.withNatLcafAddress(natLcafAddress).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class InfoReplyWriter implements LispMessageWriter<LispInfoReply> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(ByteBuf byteBuf, LispInfoReply message) throws LispWriterException {
|
||||||
|
DefaultLispInfo.serialize(byteBuf, message);
|
||||||
|
|
||||||
|
// NAT LCAF address
|
||||||
|
NatLcafAddressWriter writer = new NatLcafAddressWriter();
|
||||||
|
writer.writeTo(byteBuf, message.getNatLcafAddress());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import com.google.common.base.Objects;
|
||||||
|
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.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import static com.google.common.base.MoreObjects.toStringHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default LISP info request message class.
|
||||||
|
*/
|
||||||
|
public class DefaultLispInfoRequest extends DefaultLispInfo implements LispInfoRequest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A private constructor that protects object instantiation from external.
|
||||||
|
*
|
||||||
|
* @param infoReply info reply flag
|
||||||
|
* @param nonce nonce
|
||||||
|
* @param keyId key identifier
|
||||||
|
* @param authDataLength authentication data length
|
||||||
|
* @param authenticationData authentication data
|
||||||
|
* @param ttl Time-To-Live value
|
||||||
|
* @param maskLength EID prefix mask length
|
||||||
|
* @param eidPrefix EID prefix
|
||||||
|
*/
|
||||||
|
protected DefaultLispInfoRequest(boolean infoReply, long nonce, short keyId, short authDataLength,
|
||||||
|
byte[] authenticationData, int ttl, byte maskLength,
|
||||||
|
LispAfiAddress eidPrefix) {
|
||||||
|
super(infoReply, nonce, keyId, authDataLength, authenticationData, ttl, maskLength, eidPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return toStringHelper(this)
|
||||||
|
.add("type", getType())
|
||||||
|
.add("nonce", nonce)
|
||||||
|
.add("keyId", keyId)
|
||||||
|
.add("authentication data length", authDataLength)
|
||||||
|
.add("authentication data", authenticationData)
|
||||||
|
.add("TTL", ttl)
|
||||||
|
.add("EID mask length", maskLength)
|
||||||
|
.add("EID prefix", eidPrefix).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefaultLispInfoRequest that = (DefaultLispInfoRequest) o;
|
||||||
|
return Objects.equal(nonce, that.nonce) &&
|
||||||
|
Objects.equal(keyId, that.keyId) &&
|
||||||
|
Objects.equal(authDataLength, that.authDataLength) &&
|
||||||
|
Arrays.equals(authenticationData, that.authenticationData) &&
|
||||||
|
Objects.equal(ttl, that.ttl) &&
|
||||||
|
Objects.equal(maskLength, that.maskLength) &&
|
||||||
|
Objects.equal(eidPrefix, that.eidPrefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hashCode(nonce, keyId, authDataLength, ttl, maskLength,
|
||||||
|
eidPrefix) + Arrays.hashCode(authenticationData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class DefaultInfoRequestBuilder implements InfoRequestBuilder {
|
||||||
|
|
||||||
|
private boolean infoReply;
|
||||||
|
private long nonce;
|
||||||
|
private short keyId;
|
||||||
|
private short authDataLength;
|
||||||
|
private byte[] authenticationData = new byte[0];
|
||||||
|
private int ttl;
|
||||||
|
private byte maskLength;
|
||||||
|
private LispAfiAddress eidPrefix;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispType getType() {
|
||||||
|
return LispType.LISP_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withInfoReply(boolean infoReply) {
|
||||||
|
this.infoReply = infoReply;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withNonce(long nonce) {
|
||||||
|
this.nonce = nonce;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withAuthDataLength(short authDataLength) {
|
||||||
|
this.authDataLength = authDataLength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withKeyId(short keyId) {
|
||||||
|
this.keyId = keyId;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withAuthenticationData(byte[] authenticationData) {
|
||||||
|
if (authenticationData != null) {
|
||||||
|
this.authenticationData = authenticationData;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withTtl(int ttl) {
|
||||||
|
this.ttl = ttl;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withMaskLength(byte maskLength) {
|
||||||
|
this.maskLength = maskLength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InfoRequestBuilder withEidPrefix(LispAfiAddress eidPrefix) {
|
||||||
|
this.eidPrefix = eidPrefix;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispInfoRequest build() {
|
||||||
|
return new DefaultLispInfoRequest(infoReply, nonce, keyId,
|
||||||
|
authDataLength, authenticationData, ttl, maskLength, eidPrefix);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A LISP message reader for InfoRequest message.
|
||||||
|
*/
|
||||||
|
public static class InfoRequestReader implements LispMessageReader<LispInfoRequest> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LispInfoRequest readFrom(ByteBuf byteBuf) throws LispParseError, LispReaderException {
|
||||||
|
|
||||||
|
LispInfo lispInfo = DefaultLispInfo.deserialize(byteBuf);
|
||||||
|
|
||||||
|
return new DefaultInfoRequestBuilder()
|
||||||
|
.withInfoReply(lispInfo.hasInfoReply())
|
||||||
|
.withNonce(lispInfo.getNonce())
|
||||||
|
.withKeyId(lispInfo.getKeyId())
|
||||||
|
.withAuthDataLength(lispInfo.getAuthDataLength())
|
||||||
|
.withAuthenticationData(lispInfo.getAuthenticationData())
|
||||||
|
.withTtl(lispInfo.getTtl())
|
||||||
|
.withMaskLength(lispInfo.getMaskLength())
|
||||||
|
.withEidPrefix(lispInfo.getPrefix()).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A LISP message writer for InfoRequest message.
|
||||||
|
*/
|
||||||
|
public static final class InfoRequestWriter implements LispMessageWriter<LispInfoRequest> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(ByteBuf byteBuf, LispInfoRequest message) throws LispWriterException {
|
||||||
|
DefaultLispInfo.serialize(byteBuf, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -51,6 +51,7 @@ public final class DefaultLispMapRegister implements LispMapRegister {
|
|||||||
*
|
*
|
||||||
* @param nonce nonce
|
* @param nonce nonce
|
||||||
* @param keyId key identifier
|
* @param keyId key identifier
|
||||||
|
* @param authDataLength authentication data length
|
||||||
* @param authenticationData authentication data
|
* @param authenticationData authentication data
|
||||||
* @param mapRecords a collection of map records
|
* @param mapRecords a collection of map records
|
||||||
* @param proxyMapReply proxy map reply flag
|
* @param proxyMapReply proxy map reply flag
|
||||||
|
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispMessage.Builder;
|
||||||
|
import org.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LISP info message interface.
|
||||||
|
*/
|
||||||
|
public interface InfoBuilder<T> extends Builder {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets info reply flag value.
|
||||||
|
*
|
||||||
|
* @param infoReply info reply
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withInfoReply(boolean infoReply);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets nonce value.
|
||||||
|
*
|
||||||
|
* @param nonce nonce value
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withNonce(long nonce);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets authentication data length.
|
||||||
|
*
|
||||||
|
* @param authDataLength authentication data length
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withAuthDataLength(short authDataLength);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets key identifier.
|
||||||
|
*
|
||||||
|
* @param keyId key identifier
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withKeyId(short keyId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets authentication data.
|
||||||
|
*
|
||||||
|
* @param authenticationData authentication data
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withAuthenticationData(byte[] authenticationData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets Time-To-Live value.
|
||||||
|
*
|
||||||
|
* @param ttl Time-To-Live value
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withTtl(int ttl);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets EID prefix mask length.
|
||||||
|
*
|
||||||
|
* @param maskLength EID prefix mask length
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withMaskLength(byte maskLength);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets EID prefix.
|
||||||
|
*
|
||||||
|
* @param eidPrefix EID prefix
|
||||||
|
* @return T object
|
||||||
|
*/
|
||||||
|
T withEidPrefix(LispAfiAddress eidPrefix);
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import org.onosproject.lisp.msg.types.LispAfiAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LISP info super interface.
|
||||||
|
*/
|
||||||
|
public interface LispInfo extends LispMessage {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains has info reply flag value.
|
||||||
|
*
|
||||||
|
* @return has info reply flag value
|
||||||
|
*/
|
||||||
|
boolean hasInfoReply();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains nonce value.
|
||||||
|
*
|
||||||
|
* @return nonce value
|
||||||
|
*/
|
||||||
|
long getNonce();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains key identifier.
|
||||||
|
*
|
||||||
|
* @return key identifier
|
||||||
|
*/
|
||||||
|
short getKeyId();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains authentication data length.
|
||||||
|
*
|
||||||
|
* @return authentication data length
|
||||||
|
*/
|
||||||
|
short getAuthDataLength();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains authentication data.
|
||||||
|
*
|
||||||
|
* @return authentication data
|
||||||
|
*/
|
||||||
|
byte[] getAuthenticationData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains TTL value.
|
||||||
|
*
|
||||||
|
* @return record TTL value
|
||||||
|
*/
|
||||||
|
int getTtl();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains mask length of the EID Record.
|
||||||
|
*
|
||||||
|
* @return mask length of the EID Record
|
||||||
|
*/
|
||||||
|
byte getMaskLength();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains EID prefix.
|
||||||
|
*
|
||||||
|
* @return EID prefix
|
||||||
|
*/
|
||||||
|
LispAfiAddress getPrefix();
|
||||||
|
}
|
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import org.onosproject.lisp.msg.types.LispNatLcafAddress;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LISP info reply message interface.
|
||||||
|
* <p>
|
||||||
|
* LISP info reply message format is defined in draft-ermagan-lisp-nat-traversal-01.
|
||||||
|
* https://tools.ietf.org/html/draft-ermagan-lisp-nat-traversal-01#page-8
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {@literal
|
||||||
|
* 0 1 2 3
|
||||||
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* |Type=7 |R| Reserved |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Nonce . . . |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | . . . Nonce |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Key ID | Authentication Data Length |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* ~ Authentication Data ~
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | TTL |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Reserved | EID mask-len | EID-prefix-AFI |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | EID-prefix |
|
||||||
|
* +->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | | AFI = 16387 | Rsvd1 | Flags |
|
||||||
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | | Type = 7 | Rsvd2 | 4 + n |
|
||||||
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* N | MS UDP Port Number | ETR UDP Port Number |
|
||||||
|
* A +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* T | AFI = x | Global ETR RLOC Address ... |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* L | AFI = x | MS RLOC Address ... |
|
||||||
|
* C +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* A | AFI = x | Private ETR RLOC Address ... |
|
||||||
|
* F +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | | AFI = x | RTR RLOC Address 1 ... |
|
||||||
|
* | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | | AFI = x | RTR RLOC Address n ... |
|
||||||
|
* +->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
|
public interface LispInfoReply extends LispInfo {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Obtains NAT LCAF address.
|
||||||
|
*
|
||||||
|
* @return NAT LCAF address
|
||||||
|
*/
|
||||||
|
LispNatLcafAddress getNatLcafAddress();
|
||||||
|
|
||||||
|
interface InfoReplyBuilder extends InfoBuilder<InfoReplyBuilder> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets NAT LCAF address.
|
||||||
|
*
|
||||||
|
* @param natLcafAddress NAT LCAF address
|
||||||
|
* @return InfoReplyBuilder object
|
||||||
|
*/
|
||||||
|
InfoReplyBuilder withNatLcafAddress(LispNatLcafAddress natLcafAddress);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds LISP info reply message.
|
||||||
|
*
|
||||||
|
* @return LISP info reply message
|
||||||
|
*/
|
||||||
|
LispInfoReply build();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LISP info request message interface.
|
||||||
|
* <p>
|
||||||
|
* LISP info request message format is defined in draft-ermagan-lisp-nat-traversal-01.
|
||||||
|
* https://tools.ietf.org/html/draft-ermagan-lisp-nat-traversal-01#page-7
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* {@literal
|
||||||
|
* 0 1 2 3
|
||||||
|
* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* |Type=7 |R| Reserved |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Nonce . . . |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | . . . Nonce |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Key ID | Authentication Data Length |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* ~ Authentication Data ~
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | TTL |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | Reserved | EID mask-len | EID-prefix-AFI |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | EID-prefix |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* | AFI = 0 | <Nothing Follows AFI=0> |
|
||||||
|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||||
|
* }</pre>
|
||||||
|
*/
|
||||||
|
public interface LispInfoRequest extends LispInfo {
|
||||||
|
|
||||||
|
interface InfoRequestBuilder extends InfoBuilder<InfoRequestBuilder> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds LISP info request message.
|
||||||
|
*
|
||||||
|
* @return LISP info request message
|
||||||
|
*/
|
||||||
|
LispInfoRequest build();
|
||||||
|
}
|
||||||
|
}
|
@ -27,6 +27,7 @@ public enum LispType {
|
|||||||
LISP_MAP_REPLY(2), // LISP Map-Reply Message
|
LISP_MAP_REPLY(2), // LISP Map-Reply Message
|
||||||
LISP_MAP_REGISTER(3), // LISP Map-Register Message
|
LISP_MAP_REGISTER(3), // LISP Map-Register Message
|
||||||
LISP_MAP_NOTIFY(4), // LISP Map-Notify Message
|
LISP_MAP_NOTIFY(4), // LISP Map-Notify Message
|
||||||
|
LISP_INFO(7), // LISP Info-Request or Info-Reply Message
|
||||||
UNKNOWN(-1); // Other Enums for internal use
|
UNKNOWN(-1); // Other Enums for internal use
|
||||||
|
|
||||||
private final short type;
|
private final short type;
|
||||||
|
@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import com.google.common.testing.EqualsTester;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.onlab.packet.IpAddress;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispParseError;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispReaderException;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispWriterException;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoReply.DefaultInfoReplyBuilder;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoReply.InfoReplyReader;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoReply.InfoReplyWriter;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispInfoReply.InfoReplyBuilder;
|
||||||
|
import org.onosproject.lisp.msg.types.LispIpv4Address;
|
||||||
|
import org.onosproject.lisp.msg.types.LispNatLcafAddress;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for DefaultLispInfoReply class.
|
||||||
|
*/
|
||||||
|
public final class DefaultLispInfoReplyTest {
|
||||||
|
|
||||||
|
private LispInfoReply reply1;
|
||||||
|
private LispInfoReply sameAsReply1;
|
||||||
|
private LispInfoReply reply2;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
InfoReplyBuilder builder1 = new DefaultInfoReplyBuilder();
|
||||||
|
|
||||||
|
short msUdpPortNumber1 = 80;
|
||||||
|
short etrUdpPortNumber1 = 100;
|
||||||
|
LispIpv4Address globalEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
|
||||||
|
LispIpv4Address msRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
|
||||||
|
LispIpv4Address privateEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.3"));
|
||||||
|
|
||||||
|
LispIpv4Address address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.4"));
|
||||||
|
|
||||||
|
LispNatLcafAddress natLcafAddress1 = new LispNatLcafAddress.NatAddressBuilder()
|
||||||
|
.withLength((short) 0)
|
||||||
|
.withMsUdpPortNumber(msUdpPortNumber1)
|
||||||
|
.withEtrUdpPortNumber(etrUdpPortNumber1)
|
||||||
|
.withGlobalEtrRlocAddress(globalEtrRlocAddress1)
|
||||||
|
.withMsRlocAddress(msRlocAddress1)
|
||||||
|
.withPrivateEtrRlocAddress(privateEtrRlocAddress1)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
reply1 = builder1
|
||||||
|
.withNonce(1L)
|
||||||
|
.withKeyId((short) 1)
|
||||||
|
.withInfoReply(false)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address1)
|
||||||
|
.withNatLcafAddress(natLcafAddress1).build();
|
||||||
|
|
||||||
|
InfoReplyBuilder builder2 = new DefaultInfoReplyBuilder();
|
||||||
|
|
||||||
|
sameAsReply1 = builder2
|
||||||
|
.withNonce(1L)
|
||||||
|
.withKeyId((short) 1)
|
||||||
|
.withInfoReply(false)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address1)
|
||||||
|
.withNatLcafAddress(natLcafAddress1).build();
|
||||||
|
|
||||||
|
InfoReplyBuilder builder3 = new DefaultInfoReplyBuilder();
|
||||||
|
|
||||||
|
short msUdpPortNumber2 = 81;
|
||||||
|
short etrUdpPortNumber2 = 101;
|
||||||
|
LispIpv4Address globalEtrRlocAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1"));
|
||||||
|
LispIpv4Address msRlocAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.2"));
|
||||||
|
LispIpv4Address privateEtrRlocAddress2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.3"));
|
||||||
|
|
||||||
|
LispIpv4Address address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.4"));
|
||||||
|
|
||||||
|
LispNatLcafAddress natLcafAddress2 = new LispNatLcafAddress.NatAddressBuilder()
|
||||||
|
.withLength((short) 0)
|
||||||
|
.withMsUdpPortNumber(msUdpPortNumber2)
|
||||||
|
.withEtrUdpPortNumber(etrUdpPortNumber2)
|
||||||
|
.withGlobalEtrRlocAddress(globalEtrRlocAddress2)
|
||||||
|
.withMsRlocAddress(msRlocAddress2)
|
||||||
|
.withPrivateEtrRlocAddress(privateEtrRlocAddress2)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
reply2 = builder3
|
||||||
|
.withNonce(2L)
|
||||||
|
.withKeyId((short) 2)
|
||||||
|
.withInfoReply(true)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address2)
|
||||||
|
.withNatLcafAddress(natLcafAddress2).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEquality() {
|
||||||
|
new EqualsTester()
|
||||||
|
.addEqualityGroup(reply1, sameAsReply1)
|
||||||
|
.addEqualityGroup(reply2).testEquals();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConstruction() {
|
||||||
|
DefaultLispInfoReply reply = (DefaultLispInfoReply) reply1;
|
||||||
|
|
||||||
|
LispIpv4Address address = new LispIpv4Address(IpAddress.valueOf("192.168.1.4"));
|
||||||
|
|
||||||
|
short msUdpPortNumber1 = 80;
|
||||||
|
short etrUdpPortNumber1 = 100;
|
||||||
|
LispIpv4Address globalEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
|
||||||
|
LispIpv4Address msRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.2"));
|
||||||
|
LispIpv4Address privateEtrRlocAddress1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.3"));
|
||||||
|
|
||||||
|
LispNatLcafAddress natLcafAddress = new LispNatLcafAddress.NatAddressBuilder()
|
||||||
|
.withLength((short) 0)
|
||||||
|
.withMsUdpPortNumber(msUdpPortNumber1)
|
||||||
|
.withEtrUdpPortNumber(etrUdpPortNumber1)
|
||||||
|
.withGlobalEtrRlocAddress(globalEtrRlocAddress1)
|
||||||
|
.withMsRlocAddress(msRlocAddress1)
|
||||||
|
.withPrivateEtrRlocAddress(privateEtrRlocAddress1)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
assertThat(reply.hasInfoReply(), is(false));
|
||||||
|
assertThat(reply.getNonce(), is(1L));
|
||||||
|
assertThat(reply.getKeyId(), is((short) 1));
|
||||||
|
assertThat(reply.getMaskLength(), is((byte) 1));
|
||||||
|
assertThat(reply.getPrefix(), is(address));
|
||||||
|
assertThat(reply.getNatLcafAddress(), is(natLcafAddress));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization() throws LispReaderException, LispWriterException, LispParseError {
|
||||||
|
ByteBuf byteBuf = Unpooled.buffer();
|
||||||
|
|
||||||
|
InfoReplyWriter writer = new InfoReplyWriter();
|
||||||
|
writer.writeTo(byteBuf, reply1);
|
||||||
|
|
||||||
|
InfoReplyReader reader = new InfoReplyReader();
|
||||||
|
LispInfoReply deserialized = reader.readFrom(byteBuf);
|
||||||
|
|
||||||
|
new EqualsTester()
|
||||||
|
.addEqualityGroup(reply1, deserialized).testEquals();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* 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.protocols;
|
||||||
|
|
||||||
|
import com.google.common.testing.EqualsTester;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.onlab.packet.IpAddress;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispParseError;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispReaderException;
|
||||||
|
import org.onosproject.lisp.msg.exceptions.LispWriterException;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoRequest.DefaultInfoRequestBuilder;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoRequest.InfoRequestReader;
|
||||||
|
import org.onosproject.lisp.msg.protocols.DefaultLispInfoRequest.InfoRequestWriter;
|
||||||
|
import org.onosproject.lisp.msg.protocols.LispInfoRequest.InfoRequestBuilder;
|
||||||
|
import org.onosproject.lisp.msg.types.LispIpv4Address;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit tests for DefaultLispInfoRequest class.
|
||||||
|
*/
|
||||||
|
public final class DefaultLispInfoRequestTest {
|
||||||
|
|
||||||
|
private LispInfoRequest request1;
|
||||||
|
private LispInfoRequest sameAsRequest1;
|
||||||
|
private LispInfoRequest request2;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
InfoRequestBuilder builder1 = new DefaultInfoRequestBuilder();
|
||||||
|
|
||||||
|
LispIpv4Address address1 = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
|
||||||
|
|
||||||
|
request1 = builder1
|
||||||
|
.withNonce(1L)
|
||||||
|
.withKeyId((short) 1)
|
||||||
|
.withInfoReply(false)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address1).build();
|
||||||
|
|
||||||
|
InfoRequestBuilder builder2 = new DefaultInfoRequestBuilder();
|
||||||
|
|
||||||
|
sameAsRequest1 = builder2
|
||||||
|
.withNonce(1L)
|
||||||
|
.withKeyId((short) 1)
|
||||||
|
.withInfoReply(false)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address1).build();
|
||||||
|
|
||||||
|
InfoRequestBuilder builder3 = new DefaultInfoRequestBuilder();
|
||||||
|
|
||||||
|
LispIpv4Address address2 = new LispIpv4Address(IpAddress.valueOf("192.168.2.1"));
|
||||||
|
|
||||||
|
request2 = builder3
|
||||||
|
.withNonce(2L)
|
||||||
|
.withKeyId((short) 2)
|
||||||
|
.withInfoReply(true)
|
||||||
|
.withMaskLength((byte) 1)
|
||||||
|
.withEidPrefix(address2).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEquality() {
|
||||||
|
new EqualsTester()
|
||||||
|
.addEqualityGroup(request1, sameAsRequest1)
|
||||||
|
.addEqualityGroup(request2).testEquals();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testConstruction() {
|
||||||
|
DefaultLispInfoRequest request = (DefaultLispInfoRequest) request1;
|
||||||
|
|
||||||
|
LispIpv4Address address = new LispIpv4Address(IpAddress.valueOf("192.168.1.1"));
|
||||||
|
|
||||||
|
assertThat(request.hasInfoReply(), is(false));
|
||||||
|
assertThat(request.getNonce(), is(1L));
|
||||||
|
assertThat(request.getKeyId(), is((short) 1));
|
||||||
|
assertThat(request.getMaskLength(), is((byte) 1));
|
||||||
|
assertThat(request.getPrefix(), is(address));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSerialization() throws LispReaderException, LispWriterException, LispParseError {
|
||||||
|
ByteBuf byteBuf = Unpooled.buffer();
|
||||||
|
|
||||||
|
InfoRequestWriter writer = new InfoRequestWriter();
|
||||||
|
writer.writeTo(byteBuf, request1);
|
||||||
|
|
||||||
|
InfoRequestReader reader = new InfoRequestReader();
|
||||||
|
LispInfoRequest deserialized = reader.readFrom(byteBuf);
|
||||||
|
|
||||||
|
new EqualsTester()
|
||||||
|
.addEqualityGroup(request1, deserialized).testEquals();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user