blob: bde6596d8c7fa47830898bf9545f0e579fefc28d [file] [log] [blame]
/*
* Copyright 2015-present Open Networking Foundation
*
* 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepFecObjectIPv4Adjacency;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PCEP fec Object IPv4 Adjacency object.
*/
public class PcepFecObjectIPv4AdjacencyVer1 implements PcepFecObjectIPv4Adjacency {
/*
* ref : draft-zhao-pce-pcep-extension-for-pce-controller-01 , section : 7.5
*
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Local IPv4 address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Remote IPv4 address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
FEC Object-Type is 3 IPv4 Adjacency
*/
private static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv4AdjacencyVer1.class);
public static final byte FEC_OBJ_TYPE = 3;
public static final byte FEC_OBJ_CLASS = (byte) 226;
public static final byte FEC_OBJECT_VERSION = 1;
public static final short FEC_OBJ_MINIMUM_LENGTH = 12;
public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
public static final PcepObjectHeader DEFAULT_FEC_OBJECT_HEADER = new PcepObjectHeader(FEC_OBJ_CLASS, FEC_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, FEC_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader fecObjHeader;
private int localIPv4Address;
private int remoteIPv4Address;
/**
* Constructor to initialize parameters for PCEP fec object .
*
* @param fecObjHeader FEC Object header
* @param localIPv4Address Local IPv4 Address
* @param remoteIPv4Address Remote IPv4 Address
*/
public PcepFecObjectIPv4AdjacencyVer1(PcepObjectHeader fecObjHeader, int localIPv4Address, int remoteIPv4Address) {
this.fecObjHeader = fecObjHeader;
this.localIPv4Address = localIPv4Address;
this.remoteIPv4Address = remoteIPv4Address;
}
/**
* Sets Object header.
*
* @param obj Pcep fec Object Header
*/
public void setFecIpv4ObjHeader(PcepObjectHeader obj) {
this.fecObjHeader = obj;
}
@Override
public int getLocalIPv4Address() {
return this.localIPv4Address;
}
@Override
public void seLocalIPv4Address(int value) {
this.localIPv4Address = value;
}
@Override
public int getRemoteIPv4Address() {
return this.remoteIPv4Address;
}
@Override
public void seRemoteIPv4Address(int value) {
this.remoteIPv4Address = value;
}
/**
* Reads from channel buffer and Returns object of PcepFecObjectIPv4Adjacency.
*
* @param cb of channel buffer.
* @return object of PcepFecObjectIPv4Adjacency
* @throws PcepParseException when fails to read from channel buffer
*/
public static PcepFecObjectIPv4Adjacency read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader fecObjHeader;
int localIPv4Address;
int remoteIPv4Address;
fecObjHeader = PcepObjectHeader.read(cb);
//take only FEC IPv4 Adjacency Object buffer.
ChannelBuffer tempCb = cb.readBytes(fecObjHeader.getObjLen() - MINIMUM_COMMON_HEADER_LENGTH);
localIPv4Address = tempCb.readInt();
remoteIPv4Address = tempCb.readInt();
return new PcepFecObjectIPv4AdjacencyVer1(fecObjHeader, localIPv4Address, remoteIPv4Address);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
int objStartIndex = cb.writerIndex();
//Write common header
int objLenIndex = fecObjHeader.write(cb);
cb.writeInt(localIPv4Address);
cb.writeInt(remoteIPv4Address);
//Now write FEC IPv4 Adjacency Object Length
cb.setShort(objLenIndex, (short) (cb.writerIndex() - objStartIndex));
return cb.writerIndex();
}
/**
* Builder class for PCEP fec object IPv4 Adjacency.
*/
public static class Builder implements PcepFecObjectIPv4Adjacency.Builder {
private boolean bIsHeaderSet = false;
private boolean bIsLocalIPv4Addressset = false;
private boolean bIsRemoteIPv4Addressset = false;
private PcepObjectHeader fecObjHeader;
int localIPv4Address;
int remoteIPv4Address;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepFecObjectIPv4Adjacency build() throws PcepParseException {
PcepObjectHeader fecObjHeader = this.bIsHeaderSet ? this.fecObjHeader : DEFAULT_FEC_OBJECT_HEADER;
if (!this.bIsLocalIPv4Addressset) {
throw new PcepParseException(
"Local IPv4 Address not set while building PcepFecObjectIPv4Adjacency object.");
}
if (!this.bIsRemoteIPv4Addressset) {
throw new PcepParseException(
" Remote IPv4 Address not set while building PcepFecObjectIPv4Adjacency object.");
}
if (bIsPFlagSet) {
fecObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
fecObjHeader.setIFlag(bIFlag);
}
return new PcepFecObjectIPv4AdjacencyVer1(fecObjHeader, this.localIPv4Address, this.remoteIPv4Address);
}
@Override
public Builder setPFlag(boolean value) {
this.bPFlag = value;
this.bIsPFlagSet = true;
return this;
}
@Override
public Builder setIFlag(boolean value) {
this.bIFlag = value;
this.bIsIFlagSet = true;
return this;
}
@Override
public PcepObjectHeader getFecIpv4AdjacencyObjHeader() {
return this.fecObjHeader;
}
@Override
public Builder setFecIpv4AdjacencyObjHeader(PcepObjectHeader obj) {
this.fecObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public int getLocalIPv4Address() {
return this.localIPv4Address;
}
@Override
public Builder seLocalIPv4Address(int value) {
this.localIPv4Address = value;
this.bIsLocalIPv4Addressset = true;
return this;
}
@Override
public int getRemoteIPv4Address() {
return this.remoteIPv4Address;
}
@Override
public Builder seRemoteIPv4Address(int value) {
this.remoteIPv4Address = value;
this.bIsRemoteIPv4Addressset = true;
return this;
}
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public int getType() {
return FEC_OBJ_TYPE;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("fecObjHeader", fecObjHeader)
.add("localIPv4Address", localIPv4Address)
.add("remoteIPv4Address", remoteIPv4Address).toString();
}
}