blob: b47d36ccc0e499b4bfcc177ac1ed45fabfea3d3c [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.drivers.lisp.extensions;
import com.google.common.collect.Maps;
import org.onosproject.mapping.addresses.ExtensionMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.net.flow.AbstractExtension;
import java.util.Map;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
.ExtensionMappingAddressTypes.MULTICAST_ADDRESS;
/**
* Implementation of LISP multicast address.
* The intent of this type of unicast replication is to deliver packets to
* multiple ETRs at receiver LISP multicast sites.
*/
public class LispMulticastAddress extends AbstractExtension
implements ExtensionMappingAddress {
private static final String INSTANCE_ID = "instanceId";
private static final String SRC_MASK_LENGTH = "srcMaskLength";
private static final String GRP_MASK_LENGTH = "grpMaskLength";
private static final String SRC_ADDRESS = "srcAddress";
private static final String GRP_ADDRESS = "grpAddress";
private int instanceId;
private byte srcMaskLength;
private byte grpMaskLength;
private MappingAddress srcAddress;
private MappingAddress grpAddress;
/**
* Default constructor.
*/
public LispMulticastAddress() {
}
/**
* Creates an instance with initialized parameters.
*
* @param instanceId instance identifier
* @param srcMaskLength source mask length
* @param grpMaskLength group mask length
* @param srcAddress source address
* @param grpAddress group address
*/
private LispMulticastAddress(int instanceId, byte srcMaskLength,
byte grpMaskLength, MappingAddress srcAddress,
MappingAddress grpAddress) {
this.instanceId = instanceId;
this.srcMaskLength = srcMaskLength;
this.grpMaskLength = grpMaskLength;
this.srcAddress = srcAddress;
this.grpAddress = grpAddress;
}
/**
* Obtains instance identifier.
*
* @return instance identifier
*/
public int getInstanceId() {
return instanceId;
}
/**
* Obtains source mask length.
*
* @return source mask length
*/
public byte getSrcMaskLength() {
return srcMaskLength;
}
/**
* Obtains group mask length.
*
* @return group mask length
*/
public byte getGrpMaskLength() {
return grpMaskLength;
}
/**
* Obtains source address.
*
* @return source address
*/
public MappingAddress getSrcAddress() {
return srcAddress;
}
/**
* Obtains group address.
*
* @return group address
*/
public MappingAddress getGrpAddress() {
return grpAddress;
}
@Override
public ExtensionMappingAddressType type() {
return MULTICAST_ADDRESS.type();
}
@Override
public byte[] serialize() {
Map<String, Object> parameterMap = Maps.newHashMap();
parameterMap.put(INSTANCE_ID, instanceId);
parameterMap.put(SRC_MASK_LENGTH, srcMaskLength);
parameterMap.put(GRP_MASK_LENGTH, grpMaskLength);
parameterMap.put(SRC_ADDRESS, srcAddress);
parameterMap.put(GRP_ADDRESS, grpAddress);
return APP_KRYO.serialize(parameterMap);
}
@Override
public void deserialize(byte[] data) {
Map<String, Object> parameterMap = APP_KRYO.deserialize(data);
this.instanceId = (int) parameterMap.get(INSTANCE_ID);
this.srcMaskLength = (byte) parameterMap.get(SRC_MASK_LENGTH);
this.grpMaskLength = (byte) parameterMap.get(GRP_MASK_LENGTH);
this.srcAddress = (MappingAddress) parameterMap.get(SRC_ADDRESS);
this.grpAddress = (MappingAddress) parameterMap.get(GRP_ADDRESS);
}
@Override
public int hashCode() {
return Objects.hash(instanceId, srcMaskLength, grpMaskLength,
srcAddress, grpAddress);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof LispMulticastAddress) {
final LispMulticastAddress other = (LispMulticastAddress) obj;
return Objects.equals(this.instanceId, other.instanceId) &&
Objects.equals(this.srcMaskLength, other.srcMaskLength) &&
Objects.equals(this.grpMaskLength, other.grpMaskLength) &&
Objects.equals(this.srcAddress, other.srcAddress) &&
Objects.equals(this.grpAddress, other.grpAddress);
}
return false;
}
@Override
public String toString() {
return toStringHelper(this)
.add("instance ID", instanceId)
.add("source mask length", srcMaskLength)
.add("group mask length", grpMaskLength)
.add("source address", srcAddress)
.add("group address", grpAddress)
.toString();
}
/**
* A builder for building LispMulticastAddress.
*/
public static final class Builder {
private int instanceId;
private byte srcMaskLength;
private byte grpMaskLength;
private MappingAddress srcAddress;
private MappingAddress grpAddress;
/**
* Sets instance identifier.
*
* @param instanceId instance identifier
* @return Builder object
*/
public Builder withInstanceId(int instanceId) {
this.instanceId = instanceId;
return this;
}
/**
* Sets source mask length.
*
* @param srcMaskLength source mask length
* @return Builder object
*/
public Builder withSrcMaskLength(byte srcMaskLength) {
this.srcMaskLength = srcMaskLength;
return this;
}
/**
* Sets group mask length.
*
* @param grpMaskLength group mask length
* @return Builder object
*/
public Builder withGrpMaskLength(byte grpMaskLength) {
this.grpMaskLength = grpMaskLength;
return this;
}
/**
* Sets source address.
*
* @param srcAddress source address
* @return Builder object
*/
public Builder withSrcAddress(MappingAddress srcAddress) {
this.srcAddress = srcAddress;
return this;
}
/**
* Sets group address.
*
* @param grpAddress group address
* @return Builder object
*/
public Builder withGrpAddress(MappingAddress grpAddress) {
this.grpAddress = grpAddress;
return this;
}
/**
* Builds LispMulticastAddress instance.
*
* @return LispMulticastAddress instance
*/
public LispMulticastAddress build() {
return new LispMulticastAddress(instanceId, srcMaskLength,
grpMaskLength, srcAddress, grpAddress);
}
}
}