Implementation of PcInitate and PcUpdate messages

Change-Id: I746a5860a8b4a8022d747a02075ed3237741c53a
This commit is contained in:
bharat saraswal 2015-08-11 13:39:31 +05:30 committed by Gerrit Code Review
parent ffc5bbc55b
commit f7364db058
53 changed files with 16164 additions and 31 deletions

1
.gitignore vendored
View File

@ -15,3 +15,4 @@ dependency-reduced-pom.xml
core/store/trivial/data/
core/store/apps
/bin/

View File

@ -19,6 +19,7 @@ package org.onosproject.pcepio.protocol;
import java.util.LinkedList;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
@ -62,7 +63,7 @@ public interface PcepCloseMsg extends PcepObject, PcepMessage {
void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv);
@Override
void writeTo(ChannelBuffer channelBuffer);
void writeTo(ChannelBuffer channelBuffer) throws PcepParseException;
/**
* Builder interface with get and set functions to build Close message.

View File

@ -18,6 +18,7 @@ package org.onosproject.pcepio.protocol;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.ver1.PcepFactoryVer1;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -35,15 +36,15 @@ public final class PcepFactories {
/*
* Returns the instance of PCEP Version.
*
* @param version
* @param version PCEP version
* @return PCEP version
*/
public static PcepFactory getFactory(PcepVersion version) {
switch (version) {
case PCEP_1:
// TODO : to get the pcep version 1 factory
return PcepFactoryVer1.INSTANCE;
default:
throw new IllegalArgumentException("[PcepFactory:]Unknown version: " + version);
throw new IllegalArgumentException("Unknown version: " + version);
}
}
@ -53,7 +54,6 @@ public final class PcepFactories {
public PcepMessage readFrom(ChannelBuffer bb) throws PcepParseException {
if (!bb.readable()) {
log.debug("Empty message received");
throw new PcepParseException("Empty message received");
}
@ -75,13 +75,12 @@ public final class PcepFactories {
switch (packetVersion) {
case 1:
// TODO : get the factory for version 1
factory = org.onosproject.pcepio.protocol.ver1.PcepFactoryVer1.INSTANCE;
break;
default:
throw new IllegalArgumentException("Unknown Packet version: " + packetVersion);
}
// TODO : Read the PCEP message from the factory
return null;
return factory.getReader().readFrom(bb);
}
}

View File

@ -0,0 +1,323 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
import org.onosproject.pcepio.protocol.PcepAttribute;
import org.onosproject.pcepio.protocol.PcepEndPointsObject;
import org.onosproject.pcepio.protocol.PcepEroObject;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/**
* Provides PcInitiatedLspRequest for PCEP Initiate message.
* Reference : PCE initiated tunnel setup draft-ietf-pce-pce-initiated-lsp-03.
*/
public class PcInitiatedLspRequestVer1 implements PcInitiatedLspRequest {
/*
* <PCE-initiated-lsp-request> ::= (<PCE-initiated-lsp-instantiation>|<PCE-initiated-lsp-deletion>)
<PCE-initiated-lsp-instantiation> ::= <SRP>
<LSP>
<END-POINTS>
<ERO>
[<attribute-list>]
<PCE-initiated-lsp-deletion> ::= <SRP>
<LSP>
*/
protected static final Logger log = LoggerFactory.getLogger(PcInitiatedLspRequestVer1.class);
//PCEP SRP Object
private PcepSrpObject srpObject;
//PCEP LSP Object
private PcepLspObject lspObject;
//PCEP End Point Object
private PcepEndPointsObject endPointsObject;
//PCEP ERO Object
private PcepEroObject eroObject;
//PCEP Attribute list
private PcepAttribute pcepAttribute;
/**
* Default constructor.
*/
public PcInitiatedLspRequestVer1() {
srpObject = null;
lspObject = null;
endPointsObject = null;
eroObject = null;
pcepAttribute = null;
}
/**
* Constructor to initialize all parameters of PC initiated lsp request.
*
* @param srpObject PCEP srp Object
* @param lspObject PCEP lsp object
* @param endPointsObject PCPE endpoints object
* @param eroObject PCEP ero object
* @param pcepAttribute PCEP attribute
*/
public PcInitiatedLspRequestVer1(PcepSrpObject srpObject, PcepLspObject lspObject,
PcepEndPointsObject endPointsObject, PcepEroObject eroObject, PcepAttribute pcepAttribute) {
this.srpObject = srpObject;
this.lspObject = lspObject;
this.endPointsObject = endPointsObject;
this.eroObject = eroObject;
this.pcepAttribute = pcepAttribute;
}
@Override
public PcepSrpObject getSrpObject() {
return srpObject;
}
@Override
public PcepLspObject getLspObject() {
return lspObject;
}
@Override
public PcepEndPointsObject getEndPointsObject() {
return endPointsObject;
}
@Override
public PcepEroObject getEroObject() {
return eroObject;
}
@Override
public PcepAttribute getPcepAttribute() {
return pcepAttribute;
}
@Override
public void setSrpObject(PcepSrpObject srpobj) {
this.srpObject = srpobj;
}
@Override
public void setLspObject(PcepLspObject lspObject) {
this.lspObject = lspObject;
}
@Override
public void setEndPointsObject(PcepEndPointsObject endPointsObject) {
this.endPointsObject = endPointsObject;
}
@Override
public void setEroObject(PcepEroObject eroObject) {
this.eroObject = eroObject;
}
@Override
public void setPcepAttribute(PcepAttribute pcepAttribute) {
this.pcepAttribute = pcepAttribute;
}
/**
* Builder class for PC initiated lsp reuqest.
*/
public static class Builder implements PcInitiatedLspRequest.Builder {
private boolean bIsSRPObjectSet = false;
private boolean bIsLSPObjectSet = false;
private boolean bIsEndPointsObjectSet = false;
private boolean bIsEROObjectSet = false;
private boolean bIsPcepAttributeSet = false;
private boolean bIsbRFlagSet = false;
//PCEP SRP Object
private PcepSrpObject srpObject;
//PCEP LSP Object
private PcepLspObject lspObject;
//PCEP End Point Object
private PcepEndPointsObject endPointsObject;
//PCEP ERO Object
private PcepEroObject eroObject;
//PCEP Attribute list
private PcepAttribute pcepAttribute;
@Override
public PcInitiatedLspRequest build() throws PcepParseException {
//PCEP SRP Object
PcepSrpObject srpObject = null;
//PCEP LSP Object
PcepLspObject lspObject = null;
//PCEP End Point Object
PcepEndPointsObject endPointsObject = null;
//PCEP ERO Object
PcepEroObject eroObject = null;
//PCEP Attribute list
PcepAttribute pcepAttribute = null;
boolean bRFlag = false;
if (!this.bIsSRPObjectSet) {
throw new PcepParseException("Srp object NOT Set while building PcInitiatedLspRequest");
} else {
srpObject = this.srpObject;
bRFlag = srpObject.getRFlag();
}
if (bRFlag) {
this.bIsbRFlagSet = true;
} else {
this.bIsbRFlagSet = false;
}
if (!this.bIsLSPObjectSet) {
throw new PcepParseException("LSP Object NOT Set while building PcInitiatedLspRequest");
} else {
lspObject = this.lspObject;
}
if (!this.bIsbRFlagSet) {
if (!this.bIsEndPointsObjectSet) {
throw new PcepParseException("EndPoints Object NOT Set while building PcInitiatedLspRequest");
} else {
endPointsObject = this.endPointsObject;
}
if (!this.bIsEROObjectSet) {
throw new PcepParseException("ERO Object NOT Set while building PcInitiatedLspRequest");
} else {
eroObject = this.eroObject;
}
if (bIsPcepAttributeSet) {
pcepAttribute = this.pcepAttribute;
}
}
return new PcInitiatedLspRequestVer1(srpObject, lspObject, endPointsObject, eroObject, pcepAttribute);
}
@Override
public PcepSrpObject getSrpObject() {
return this.srpObject;
}
@Override
public PcepLspObject getLspObject() {
return this.lspObject;
}
@Override
public PcepEndPointsObject getEndPointsObject() {
return this.endPointsObject;
}
@Override
public PcepEroObject getEroObject() {
return this.eroObject;
}
@Override
public PcepAttribute getPcepAttribute() {
return this.pcepAttribute;
}
@Override
public Builder setSrpObject(PcepSrpObject srpobj) {
this.srpObject = srpobj;
this.bIsSRPObjectSet = true;
return this;
}
@Override
public Builder setLspObject(PcepLspObject lspObject) {
this.lspObject = lspObject;
this.bIsLSPObjectSet = true;
return this;
}
@Override
public Builder setEndPointsObject(PcepEndPointsObject endPointsObject) {
this.endPointsObject = endPointsObject;
this.bIsEndPointsObjectSet = true;
return this;
}
@Override
public Builder setEroObject(PcepEroObject eroObject) {
this.eroObject = eroObject;
this.bIsEROObjectSet = true;
return this;
}
@Override
public Builder setPcepAttribute(PcepAttribute pcepAttribute) {
this.pcepAttribute = pcepAttribute;
this.bIsPcepAttributeSet = true;
return this;
}
}
@Override
public void print() {
log.debug(" PC-INITIATED LSP INITIATION REQUEST");
srpObject.print();
lspObject.print();
//if PC initiate then print end point and ero object [pcepattribute].
if (endPointsObject instanceof PcepEndPointsObject) {
endPointsObject.print();
}
if (eroObject instanceof PcepEroObject) {
eroObject.print();
}
if (pcepAttribute instanceof PcepAttribute) {
pcepAttribute.print();
}
}
@Override
public String toString() {
ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
toStrHelper
.add("SRP Object", srpObject)
.add("LSP object", lspObject);
if (endPointsObject instanceof PcepEndPointsObject) {
toStrHelper
.add("End Point Object", endPointsObject);
}
if (eroObject instanceof PcepEroObject) {
toStrHelper
.add("ERO Object", eroObject);
}
if (pcepAttribute instanceof PcepAttribute) {
toStrHelper
.add("Pcep Attribute", pcepAttribute);
}
return toStrHelper.toString();
}
}

View File

@ -0,0 +1,469 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
/*
* Provides PCEP Attribute List.
*/
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepAttribute;
import org.onosproject.pcepio.protocol.PcepBandwidthObject;
import org.onosproject.pcepio.protocol.PcepIroObject;
import org.onosproject.pcepio.protocol.PcepLspaObject;
import org.onosproject.pcepio.protocol.PcepMetricObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/* Reference : RFC5440
* where:
* <attribute-list> ::=[<LSPA>]
* [<BANDWIDTH>]
* [<metric-list>]
* [<IRO>]
*
* <metric-list> ::=<METRIC>[<metric-list>]
*/
public class PcepAttributeVer1 implements PcepAttribute {
protected static final Logger log = LoggerFactory.getLogger(PcepAttributeVer1.class);
public static final int OBJECT_HEADER_LENGTH = 4;
//PCEP LSPA Object
private PcepLspaObject lspaObject;
private boolean isLspaObjectSet;
//PCEP Bandwidth Object
private PcepBandwidthObject bandwidthObject;
private boolean isBandwidthObjectSet;
//PCEP Metric list
private LinkedList<PcepMetricObject> llMetricList;
private boolean isMetricListSet;
//PCEP IRO object
private PcepIroObject iroObject;
private boolean isIroObjectSet;
/**
* Default constructor to initialize member variables.
*/
public PcepAttributeVer1() {
lspaObject = null;
bandwidthObject = null;
llMetricList = null;
iroObject = null;
this.isLspaObjectSet = false;
this.isBandwidthObjectSet = false;
this.isMetricListSet = false;
this.isIroObjectSet = false;
}
/**
* Constructor to initialize all parameters for PCEP attribute.
*
* @param lspaObject PCEP lspa Object.
* @param bandwidthObject PCEP bandwidth object.
* @param llMetricList list of PCEP metric objects.
* @param iroObject PCEP iro object.
*/
public PcepAttributeVer1(PcepLspaObject lspaObject, PcepBandwidthObject bandwidthObject,
LinkedList<PcepMetricObject> llMetricList, PcepIroObject iroObject) {
this.lspaObject = lspaObject;
this.bandwidthObject = bandwidthObject;
this.llMetricList = llMetricList;
this.iroObject = iroObject;
if (lspaObject == null) {
this.isLspaObjectSet = false;
} else {
this.isLspaObjectSet = true;
}
if (bandwidthObject == null) {
this.isBandwidthObjectSet = false;
} else {
this.isBandwidthObjectSet = true;
}
if (llMetricList == null) {
this.isMetricListSet = false;
} else {
this.isMetricListSet = true;
}
if (iroObject == null) {
this.isIroObjectSet = false;
} else {
this.isIroObjectSet = true;
}
}
/**
* constructor to initialize bandwidthObject.
*
* @param bandwidthObject bandwidth object
*/
public PcepAttributeVer1(PcepBandwidthObject bandwidthObject) {
this.isLspaObjectSet = false;
this.bandwidthObject = bandwidthObject;
this.isBandwidthObjectSet = true;
this.isMetricListSet = false;
this.isIroObjectSet = false;
}
/**
* Parse list for MeticObject.
*
* @param cb of type channel buffer
* @return true if parsing metric list is success
* @throws PcepParseException when a non metric object is received
*/
public boolean parseMetricList(ChannelBuffer cb) throws PcepParseException {
if (null == llMetricList) {
llMetricList = new LinkedList<PcepMetricObject>();
}
PcepMetricObject metriclist;
//caller should verify for metric object
byte yObjClass = PcepMetricObjectVer1.METRIC_OBJ_CLASS;
byte yObjType = PcepMetricObjectVer1.METRIC_OBJ_TYPE;
while ((yObjClass == PcepMetricObjectVer1.METRIC_OBJ_CLASS)
&& (yObjType == PcepMetricObjectVer1.METRIC_OBJ_TYPE)) {
metriclist = PcepMetricObjectVer1.read(cb);
llMetricList.add(metriclist);
yObjClass = 0;
yObjType = 0;
if (cb.readableBytes() > OBJECT_HEADER_LENGTH) {
cb.markReaderIndex();
PcepObjectHeader tempObjHeader = PcepObjectHeader.read(cb);
cb.resetReaderIndex();
yObjClass = tempObjHeader.getObjClass();
yObjType = tempObjHeader.getObjType();
}
}
return true;
}
/**
* Reads lspa , bandwidth , Metriclist and Iro objects and sets the objects.
*
* @param cb of type channel buffer
* @return instance of Pcep Attribute
* @throws PcepParseException while parsing Pcep Attributes from channel buffer
*/
public static PcepAttribute read(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < OBJECT_HEADER_LENGTH) {
return null;
}
//check whether any pcep attribute is present
cb.markReaderIndex();
PcepObjectHeader tempObjHeader = PcepObjectHeader.read(cb);
cb.resetReaderIndex();
byte yObjClass = tempObjHeader.getObjClass();
if (PcepLspaObjectVer1.LSPA_OBJ_CLASS != yObjClass && PcepBandwidthObjectVer1.BANDWIDTH_OBJ_CLASS != yObjClass
&& PcepMetricObjectVer1.METRIC_OBJ_CLASS != yObjClass && PcepIroObjectVer1.IRO_OBJ_CLASS != yObjClass) {
//No PCEP attribute is present
return null;
}
PcepAttributeVer1 pcepAttribute = new PcepAttributeVer1();
//If LSPA present then store it.LSPA is optional
if (yObjClass == PcepLspaObjectVer1.LSPA_OBJ_CLASS) {
pcepAttribute.setLspaObject(PcepLspaObjectVer1.read(cb));
yObjClass = checkNextObject(cb);
}
//If BANDWIDTH present then store it.BANDWIDTH is optional
if (yObjClass == PcepBandwidthObjectVer1.BANDWIDTH_OBJ_CLASS) {
pcepAttribute.setBandwidthObject(PcepBandwidthObjectVer1.read(cb));
yObjClass = checkNextObject(cb);
}
//If Metric list present then store it.MetricList is optional
if (yObjClass == PcepMetricObjectVer1.METRIC_OBJ_CLASS) {
pcepAttribute.parseMetricList(cb);
yObjClass = checkNextObject(cb);
}
//If IRO present then store it.IRO is optional
if (yObjClass == PcepIroObjectVer1.IRO_OBJ_CLASS) {
pcepAttribute.setIroObject(PcepIroObjectVer1.read(cb));
}
PcepLspaObject lspaObject = pcepAttribute.getLspaObject();
PcepBandwidthObject bandwidthObject = pcepAttribute.getBandwidthObject();
LinkedList<PcepMetricObject> metriclist = pcepAttribute.llMetricList;
PcepIroObject iroObject = pcepAttribute.getIroObject();
return new PcepAttributeVer1(lspaObject, bandwidthObject, metriclist, iroObject);
}
/**
* Checks whether there is a more object or not.
*
* @param cb of type channel buffer
* @return instance of object header
*/
private static byte checkNextObject(ChannelBuffer cb) {
if (cb.readableBytes() < OBJECT_HEADER_LENGTH) {
return 0;
}
cb.markReaderIndex();
PcepObjectHeader tempObjHeader = PcepObjectHeader.read(cb);
cb.resetReaderIndex();
return tempObjHeader.getObjClass();
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
int iLenStartIndex = cb.writerIndex();
//PCEP LSPA object is optional
if (this.isLspaObjectSet) {
this.lspaObject.write(cb);
}
//PCEP BANDWIDTH object is optional
if (this.isBandwidthObjectSet) {
this.bandwidthObject.write(cb);
}
//PCEP Metric list is optional
if (this.isMetricListSet) {
ListIterator<PcepMetricObject> listIterator = this.llMetricList.listIterator();
while (listIterator.hasNext()) {
listIterator.next().write(cb);
}
}
//PCEP IRO object is optional
if (this.isIroObjectSet) {
this.iroObject.write(cb);
}
return cb.writerIndex() - iLenStartIndex;
}
@Override
public PcepLspaObject getLspaObject() {
return lspaObject;
}
@Override
public PcepBandwidthObject getBandwidthObject() {
return bandwidthObject;
}
@Override
public LinkedList<PcepMetricObject> getMetricObjectList() {
return llMetricList;
}
@Override
public PcepIroObject getIroObject() {
return iroObject;
}
@Override
public void setBandwidthObject(PcepBandwidthObject bandwidthObject) {
this.isBandwidthObjectSet = true;
this.bandwidthObject = bandwidthObject;
}
@Override
public void setMetricObjectList(LinkedList<PcepMetricObject> llMetricList) {
this.isMetricListSet = true;
this.llMetricList = llMetricList;
}
@Override
public void setLspaObject(PcepLspaObject lspaObject) {
this.isLspaObjectSet = true;
this.lspaObject = lspaObject;
}
@Override
public void setIroObject(PcepIroObject iroObject) {
this.isIroObjectSet = true;
this.iroObject = iroObject;
}
/**
* Builder class for PCEP attributes.
*/
public static class Builder implements PcepAttribute.Builder {
//PCEP LSPA Object
private PcepLspaObject lspaObject;
private boolean isLspaObjectSet;
//PCEP BANDWIDTH Object
private PcepBandwidthObject bandwidthObject;
private boolean isBandwidthObjectSet;
//PCEP Metric list
private LinkedList<PcepMetricObject> llMetricList;
private boolean isMetricListSet;
//PCEP IRO object
private PcepIroObject iroObject;
private boolean isIroObjectSet;
@Override
public PcepAttribute build() {
//PCEP LSPA Object
PcepLspaObject lspaObject = null;
//PCEP BANDWIDTH Object
PcepBandwidthObject bandwidthObject = null;
//PCEP Metric list
LinkedList<PcepMetricObject> llMetricList = null;
//PCEP IRO object
PcepIroObject iroObject = null;
if (this.isLspaObjectSet) {
lspaObject = this.lspaObject;
}
if (this.isBandwidthObjectSet) {
bandwidthObject = this.bandwidthObject;
}
if (this.isMetricListSet) {
llMetricList = this.llMetricList;
}
if (this.isIroObjectSet) {
iroObject = this.iroObject;
}
return new PcepAttributeVer1(lspaObject, bandwidthObject, llMetricList, iroObject);
}
@Override
public PcepLspaObject getLspaObject() {
return this.lspaObject;
}
@Override
public PcepBandwidthObject getBandwidthObject() {
return this.bandwidthObject;
}
@Override
public LinkedList<PcepMetricObject> getMetricObjectList() {
return this.llMetricList;
}
@Override
public PcepIroObject getIroObject() {
return this.iroObject;
}
@Override
public Builder setBandwidthObject(PcepBandwidthObject bandwidthObject) {
this.isBandwidthObjectSet = true;
this.bandwidthObject = bandwidthObject;
return this;
}
@Override
public Builder setMetricObjectList(LinkedList<PcepMetricObject> llMetricList) {
this.isMetricListSet = true;
this.llMetricList = llMetricList;
return this;
}
@Override
public Builder setLspaObject(PcepLspaObject lspaObject) {
this.isLspaObjectSet = true;
this.lspaObject = lspaObject;
return this;
}
@Override
public Builder setIroObject(PcepIroObject iroObject) {
this.isIroObjectSet = true;
this.iroObject = iroObject;
return this;
}
}
@Override
public void print() {
log.debug("ATTRIBUTE LIST");
if (lspaObject instanceof PcepLspaObject) {
lspaObject.print();
}
if (bandwidthObject instanceof PcepBandwidthObject) {
bandwidthObject.print();
}
if (llMetricList != null) {
log.debug("METRIC LIST");
ListIterator<PcepMetricObject> listIterator = llMetricList.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
if (iroObject instanceof PcepIroObject) {
iroObject.print();
}
}
@Override
public String toString() {
ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
if (lspaObject instanceof PcepLspaObject) {
toStrHelper
.add("PCEP lspa Object", lspaObject);
}
if (bandwidthObject instanceof PcepBandwidthObject) {
toStrHelper
.add("bandwidth Object", bandwidthObject);
}
if (llMetricList instanceof PcepMetricObject) {
toStrHelper
.add("Pcep Metric object List", llMetricList);
}
if (iroObject instanceof PcepIroObject) {
toStrHelper
.add("iro Object", iroObject);
}
return toStrHelper.toString();
}
}

View File

@ -0,0 +1,242 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepBandwidthObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PcepBandwidthObject.
*/
public class PcepBandwidthObjectVer1 implements PcepBandwidthObject {
/*
* RFC : 5440 , section : 7.7.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Bandwidth |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The BANDWIDTH Object format
*/
protected static final Logger log = LoggerFactory.getLogger(PcepBandwidthObjectVer1.class);
/*
* Requested bandwidth: BANDWIDTH Object-Type is 1.
Bandwidth of an existing TE LSP for which a re-optimization is
requested. BANDWIDTH Object-Type is 2.
*/
//Right now handling type 1
public static final byte BANDWIDTH_OBJ_TYPE = 1;
public static final byte BANDWIDTH_OBJ_CLASS = 5;
public static final byte BANDWIDTH_OBJECT_VERSION = 1;
public static final short BANDWIDTH_OBJ_MINIMUM_LENGTH = 8;
static final PcepObjectHeader DEFAULT_BANDWIDTH_OBJECT_HEADER = new PcepObjectHeader(BANDWIDTH_OBJ_CLASS,
BANDWIDTH_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
BANDWIDTH_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader bandwidthObjHeader;
private int iBandwidth;
/**
* Constructor to bandwidth object header and bandwidth.
*
* @param bandwidthObjHeader bandwidth object header
* @param iBandwidth bandwidth value
*/
public PcepBandwidthObjectVer1(PcepObjectHeader bandwidthObjHeader, int iBandwidth) {
this.bandwidthObjHeader = bandwidthObjHeader;
this.iBandwidth = iBandwidth;
}
/**
* Constructor to initialize bandwidth.
*
* @param iBandwidth bandwidth value
*/
public PcepBandwidthObjectVer1(int iBandwidth) {
this.bandwidthObjHeader = DEFAULT_BANDWIDTH_OBJECT_HEADER;
this.iBandwidth = iBandwidth;
}
/**
* Returns Object Header.
*
* @return bandwidthObjHeader
*/
public PcepObjectHeader getBandwidthObjHeader() {
return this.bandwidthObjHeader;
}
/**
* Sets Object Header.
*
* @param obj bandwidth object header
*/
public void setBandwidthObjHeader(PcepObjectHeader obj) {
this.bandwidthObjHeader = obj;
}
@Override
public int getBandwidth() {
return this.iBandwidth;
}
@Override
public void setBandwidth(int iBandwidth) {
this.iBandwidth = iBandwidth;
}
/**
* Reads from channel buffer and returns object of PcepBandwidthObject.
*
* @param cb channel buffer to parse
* @return object of PcepBandwidthObject
* @throws PcepParseException while parsing channel buffer
*/
public static PcepBandwidthObject read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader bandwidthObjHeader;
int iBandwidth;
bandwidthObjHeader = PcepObjectHeader.read(cb);
iBandwidth = cb.readInt();
return new PcepBandwidthObjectVer1(bandwidthObjHeader, iBandwidth);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = bandwidthObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Failed to write bandwidth object header. Index " + objLenIndex);
}
cb.writeInt(iBandwidth);
short hLength = (short) (cb.writerIndex() - objStartIndex);
cb.setShort(objLenIndex, hLength);
//will be helpful during print().
bandwidthObjHeader.setObjLen(hLength);
return cb.writerIndex() - objStartIndex;
}
/**
* builder class for PCEP bandwidth object.
*/
public static class Builder implements PcepBandwidthObject.Builder {
private PcepObjectHeader bandwidthObjHeader;
private boolean bIsHeaderSet = false;
private int iBandwidth;
private boolean bIsBandwidthSet = false;
private boolean bPFlag;
private boolean bIsPFlagSet = false;
private boolean bIFlag;
private boolean bIsIFlagSet = false;
@Override
public PcepBandwidthObject build() throws PcepParseException {
PcepObjectHeader bandwidthObjHeader = this.bIsHeaderSet ? this.bandwidthObjHeader
: DEFAULT_BANDWIDTH_OBJECT_HEADER;
if (bIsPFlagSet) {
bandwidthObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
bandwidthObjHeader.setIFlag(bIFlag);
}
if (!this.bIsBandwidthSet) {
throw new PcepParseException("bandwidth not Set while building Bandwidth Object.");
}
return new PcepBandwidthObjectVer1(bandwidthObjHeader, iBandwidth);
}
@Override
public int getBandwidth() {
return this.iBandwidth;
}
@Override
public PcepObjectHeader getBandwidthObjHeader() {
return this.bandwidthObjHeader;
}
@Override
public Builder setBandwidthObjHeader(PcepObjectHeader obj) {
this.bandwidthObjHeader = obj;
return this;
}
@Override
public Builder setBandwidth(int iBandwidth) {
this.iBandwidth = iBandwidth;
this.bIsBandwidthSet = true;
return this;
}
@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 void print() {
log.debug("BANDWIDTH OBJECT");
bandwidthObjHeader.print();
log.debug("Bandwidth: " + iBandwidth);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("bandwidth Object Header", bandwidthObjHeader)
.add("Bandwidth", iBandwidth)
.toString();
}
}

View File

@ -0,0 +1,356 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepCloseMsg;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepMessageWriter;
import org.onosproject.pcepio.protocol.PcepType;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
* RFC : 5440 , section : 6.8
* <Close Message> ::= <Common Header> <CLOSE>
*
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver | Flags | Message-Type | Message-Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Flags | Reason |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Optional TLVs //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
class PcepCloseMsgVer1 implements PcepCloseMsg {
protected static final Logger log = LoggerFactory.getLogger(PcepCloseMsgVer1.class);
// Pcep version: 1
public static final byte PACKET_VERSION = 1;
public static final int PACKET_MINIMUM_LENGTH = 12;
public static final PcepType MSG_TYPE = PcepType.CLOSE;
public static final byte CLOSE_OBJ_TYPE = 1;
public static final byte CLOSE_OBJ_CLASS = 15;
public static final byte CLOSE_OBJECT_VERSION = 1;
public static final byte DEFAULT_REASON = 1; // Default reason to close
public static final short CLOSE_OBJ_MINIMUM_LENGTH = 8;
public static final int SHIFT_FLAG = 5;
static final PcepObjectHeader DEFAULT_CLOSE_HEADER = new PcepObjectHeader(CLOSE_OBJ_CLASS, CLOSE_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, CLOSE_OBJ_MINIMUM_LENGTH);
private final PcepObjectHeader closeObjHeader;
private byte yReason;
private LinkedList<PcepValueType> llOptionalTlv;
public static final PcepCloseMsgVer1.Reader READER = new Reader();
static class Reader implements PcepMessageReader<PcepCloseMsg> {
PcepObjectHeader closeObjHeader;
byte yReason;
// Optional TLV
private LinkedList<PcepValueType> llOptionalTlv;
@Override
public PcepCloseMsg readFrom(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Packet size is less than the minimum length.");
}
// fixed value property version == 1
byte version = cb.readByte();
version = (byte) (version >> SHIFT_FLAG);
if (version != PACKET_VERSION) {
throw new PcepParseException("Wrong version. Expected=PcepVersion.PCEP_1(1), got=" + version);
}
// fixed value property type == 7
byte type = cb.readByte();
if (type != MSG_TYPE.getType()) {
throw new PcepParseException("Wrong type. Expected=PcepType.CLOSE(7), got=" + type);
}
short length = cb.readShort();
if (length < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Wrong length. Expected to be >= " + PACKET_MINIMUM_LENGTH + ", was: "
+ length);
}
closeObjHeader = PcepObjectHeader.read(cb);
// Reserved
cb.readShort();
// Flags
cb.readByte();
// Reason
yReason = cb.readByte();
// parse optional TLV
llOptionalTlv = parseOptionalTlv(cb);
return new PcepCloseMsgVer1(closeObjHeader, yReason, llOptionalTlv);
}
}
/**
* Parse the list of Optional Tlvs.
*
* @param cb channel buffer
* @return list of Optional Tlvs
* @throws PcepParseException when fails to parse optional tlvs
*/
public static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
/*
rfc 5440:
Optional TLVs may be included within the CLOSE object body. The
specification of such TLVs is outside the scope of this document.
*/
return llOptionalTlv;
}
/**
* constructor to initialize PCEP close Message with all the parameters.
*
* @param closeObjHeader object header for close message
* @param yReason reason for closing the channel
* @param llOptionalTlv list of optional tlvs
*/
PcepCloseMsgVer1(PcepObjectHeader closeObjHeader, byte yReason, LinkedList<PcepValueType> llOptionalTlv) {
this.closeObjHeader = closeObjHeader;
this.yReason = yReason;
this.llOptionalTlv = llOptionalTlv;
}
/**
* Builder class for PCEP close message.
*/
static class Builder implements PcepCloseMsg.Builder {
// PCEP Close message fields
private boolean bIsHeaderSet = false;
private PcepObjectHeader closeObjHeader;
private boolean bIsReasonSet = false;
private byte yReason;
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return PcepType.CLOSE;
}
@Override
public PcepCloseMsg build() {
PcepObjectHeader closeObjHeader = this.bIsHeaderSet ? this.closeObjHeader : DEFAULT_CLOSE_HEADER;
byte yReason = this.bIsReasonSet ? this.yReason : DEFAULT_REASON;
if (bIsPFlagSet) {
closeObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
closeObjHeader.setIFlag(bIFlag);
}
return new PcepCloseMsgVer1(closeObjHeader, yReason, this.llOptionalTlv);
}
@Override
public PcepObjectHeader getCloseObjHeader() {
return this.closeObjHeader;
}
@Override
public Builder setCloseObjHeader(PcepObjectHeader obj) {
this.closeObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public byte getReason() {
return this.yReason;
}
@Override
public Builder setReason(byte value) {
this.yReason = value;
this.bIsReasonSet = true;
return this;
}
@Override
public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
return this;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@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 void writeTo(ChannelBuffer cb) throws PcepParseException {
WRITER.write(cb, this);
}
static final Writer WRITER = new Writer();
static class Writer implements PcepMessageWriter<PcepCloseMsgVer1> {
@Override
public void write(ChannelBuffer cb, PcepCloseMsgVer1 message) throws PcepParseException {
int startIndex = cb.writerIndex();
// first 3 bits set to version
cb.writeByte((byte) (PACKET_VERSION << SHIFT_FLAG));
// message type
cb.writeByte(MSG_TYPE.getType());
// length is length of variable message, will be updated at the end
// Store the position of message
// length in buffer
int msgLenIndex = cb.writerIndex();
cb.writeShort((short) 0);
int objStartIndex = cb.writerIndex();
int objLenIndex = message.closeObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Failed to write Close object header.");
}
// first 3 bits set to version
cb.writeShort(0); // Reserved
cb.writeByte(0); // Flags
cb.writeByte(message.yReason);
// Pack optional TLV
packOptionalTlv(cb, message);
int length = cb.writerIndex() - objStartIndex;
cb.setShort(objLenIndex, (short) length);
// will be helpful during print().
message.closeObjHeader.setObjLen((short) length);
// As per RFC the length of object should be
// multiples of 4
int pad = length % 4;
if (pad != 0) {
pad = 4 - pad;
for (int i = 0; i < pad; i++) {
cb.writeByte((byte) 0);
}
length = length + pad;
}
// update message length field
length = cb.writerIndex() - startIndex;
cb.setShort(msgLenIndex, (short) length);
}
public void packOptionalTlv(ChannelBuffer cb, PcepCloseMsgVer1 message) {
LinkedList<PcepValueType> llOptionalTlv = message.llOptionalTlv;
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
listIterator.next().write(cb);
}
}
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return MSG_TYPE;
}
@Override
public byte getReason() {
return this.yReason;
}
@Override
public void setReason(byte value) {
this.yReason = value;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@Override
public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
}
@Override
public void print() {
log.debug("CLOSE MESSAGE");
closeObjHeader.print();
int x = yReason & 0xFF;
log.debug("Reason: " + x);
log.debug("OPTINAL TLV:");
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("close Object Header", closeObjHeader)
.add("Reason", yReason)
.add("Optional Tlv list", llOptionalTlv)
.toString();
}
}

View File

@ -0,0 +1,268 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepEndPointsObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
public class PcepEndPointsObjectVer1 implements PcepEndPointsObject {
/*
* RFC : 5440 , section : 7.6
* An End point is defined as follows:
END-POINTS Object-Class is 4.
END-POINTS Object-Type is 1 for IPv4 and 2 for IPv6.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source IPv4 address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination IPv4 address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(PcepEndPointsObjectVer1.class);
static final byte END_POINTS_OBJ_TYPE = 1;
static final byte END_POINTS_OBJ_CLASS = 4;
static final byte END_POINTS_OBJECT_VERSION = 1;
static final short END_POINTS_OBJ_MINIMUM_LENGTH = 12;
public static byte endPointObjType;
static final PcepObjectHeader DEFAULT_END_POINTS_OBJECT_HEADER = new PcepObjectHeader(END_POINTS_OBJ_CLASS,
END_POINTS_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
END_POINTS_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader endPointsObjHeader;
public int sourceIpAddress;
public int destIpAddress;
/**
* Constructor to initialize all variables.
*
* @param endPointsObjHeader end points object header
* @param sourceIpAddress source IP address
* @param destIpAddress destination IP address
*/
public PcepEndPointsObjectVer1(PcepObjectHeader endPointsObjHeader, int sourceIpAddress, int destIpAddress) {
this.endPointsObjHeader = endPointsObjHeader;
this.sourceIpAddress = sourceIpAddress;
this.destIpAddress = destIpAddress;
}
/**
* Sets End Points Object Header.
*
* @param obj of PcepObjectHeader
*/
public void setEndPointsObjHeader(PcepObjectHeader obj) {
this.endPointsObjHeader = obj;
}
@Override
public void setSourceIpAddress(int sourceIpAddress) {
this.sourceIpAddress = sourceIpAddress;
}
@Override
public void setDestIpAddress(int destIpAddress) {
this.destIpAddress = destIpAddress;
}
@Override
public int getSourceIpAddress() {
return this.sourceIpAddress;
}
@Override
public int getDestIpAddress() {
return this.destIpAddress;
}
/**
* Reads from channel buffer and returns object of PcepEndPointsObject.
*
* @param cb of channel buffer
* @return object of PcepEndPointsObject
* @throws PcepParseException while parsing channel buffer
*/
public static PcepEndPointsObject read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader endPointsObjHeader;
int sourceIpAddress;
int destIpAddress;
endPointsObjHeader = PcepObjectHeader.read(cb);
if (END_POINTS_OBJ_TYPE == endPointsObjHeader.getObjType()
&& END_POINTS_OBJ_CLASS == endPointsObjHeader.getObjClass()) {
sourceIpAddress = cb.readInt();
destIpAddress = cb.readInt();
} else {
throw new PcepParseException("Expected PcepEndPointsObject.");
}
return new PcepEndPointsObjectVer1(endPointsObjHeader, sourceIpAddress, destIpAddress);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
int objStartIndex = cb.writerIndex();
//write common header
int objLenIndex = endPointsObjHeader.write(cb);
//write source IPv4 IP
cb.writeInt(sourceIpAddress);
//write destination IPv4 IP
cb.writeInt(destIpAddress);
int length = cb.writerIndex() - objStartIndex;
//now write EndPoints Object Length
cb.setShort(objLenIndex, (short) length);
//will be helpful during print().
endPointsObjHeader.setObjLen((short) length);
return cb.writerIndex();
}
/**
* Builder class for PCEP end points objects.
*/
public static class Builder implements PcepEndPointsObject.Builder {
private boolean bIsHeaderSet = false;
private boolean bIsSourceIpAddressset = false;
private boolean bIsDestIpAddressset = false;
private PcepObjectHeader endpointsObjHeader;
private int sourceIpAddress;
private int destIpAddress;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepEndPointsObject build() throws PcepParseException {
PcepObjectHeader endpointsObjHeader = this.bIsHeaderSet ? this.endpointsObjHeader
: DEFAULT_END_POINTS_OBJECT_HEADER;
if (bIsPFlagSet) {
endpointsObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
endpointsObjHeader.setIFlag(bIFlag);
}
if (!this.bIsSourceIpAddressset) {
throw new PcepParseException("SourceIpAddress not set while building EndPoints object");
}
if (!this.bIsDestIpAddressset) {
throw new PcepParseException("DestIpAddress not set while building EndPoints object");
}
return new PcepEndPointsObjectVer1(endpointsObjHeader, this.sourceIpAddress, this.destIpAddress);
}
@Override
public PcepObjectHeader getEndPointsObjHeader() {
return this.endpointsObjHeader;
}
@Override
public Builder setEndPointsObjHeader(PcepObjectHeader obj) {
this.endpointsObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public int getSourceIpAddress() {
return this.sourceIpAddress;
}
@Override
public Builder setSourceIpAddress(int sourceIpAddress) {
this.sourceIpAddress = sourceIpAddress;
this.bIsSourceIpAddressset = true;
return this;
}
@Override
public int getDestIpAddress() {
return this.destIpAddress;
}
@Override
public Builder setDestIpAddress(int destIpAddress) {
this.destIpAddress = destIpAddress;
this.bIsDestIpAddressset = true;
return this;
}
@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 void print() {
log.debug("ENDPOINT OBJECT");
long lTemp;
lTemp = sourceIpAddress & 0xFFFFFFFF;
String str = "Source IP Address: " + lTemp;
log.debug(str);
lTemp = destIpAddress & 0xFFFFFFFF;
str = "destination IP Address: " + lTemp;
log.debug(str);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("sourceIpAddress", sourceIpAddress)
.add("destIpAddress", destIpAddress)
.toString();
}
}

View File

@ -0,0 +1,418 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepEroObject;
import org.onosproject.pcepio.types.AutonomousSystemTlv;
import org.onosproject.pcepio.types.IPv4SubObject;
import org.onosproject.pcepio.types.IPv6SubObject;
import org.onosproject.pcepio.types.PathKeySubObject;
import org.onosproject.pcepio.types.PcepErrorDetailInfo;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.onosproject.pcepio.types.SrEroSubObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
* rfc3209
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// (Subobjects) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
If a Path message contains multiple EXPLICIT_ROUTE objects, only the
first object is meaningful. Subsequent EXPLICIT_ROUTE objects MAY be
ignored and SHOULD NOT be propagated.
In current implementation, only strict hops are supported. So,
empty ERO with no sub-objects is considered illegal.
Subobjects:
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-------------//----------------+
|L| Type | Length | (Subobject contents) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-------------//----------------+
L
The L bit is an attribute of the subobject. The L bit is set
if the subobject represents a loose hop in the explicit route.
If the bit is not set, the subobject represents a strict hop in
the explicit route.
Type
The Type indicates the type of contents of the subobject.
Subobject 1: IPv4 address
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | IPv4 address (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 address (continued) | Prefix Length | Resvd |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Subobject 2: IPv6 Prefix
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | IPv6 address (16 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) | Prefix Length | Resvd |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Subobject 3: Autonomous System Number
The contents of an Autonomous System (AS) number subobject are a 2-
octet AS number. The abstract node represented by this subobject is
the set of nodes belonging to the autonomous system.
The length of the AS number subobject is 4 octets.
Subobject 4: PATH_KEY_32_BIT_SUB_OBJ_TYPE:
Pathkey subobject(RFC 5520):
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | Path-Key |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PCE ID (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Subobject 5: SR_ERO_SUB_OBJ_TYPE:
SR-ERO subobject: (draft-ietf-pce-segment-routing-00)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | ST | Flags |F|S|C|M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// NAI (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
public class PcepEroObjectVer1 implements PcepEroObject {
protected static final Logger log = LoggerFactory.getLogger(PcepEroObjectVer1.class);
public static final byte ERO_OBJ_TYPE = 1;
public static final byte ERO_OBJ_CLASS = 7;
public static final byte ERO_OBJECT_VERSION = 1;
public static final short ERO_OBJ_MINIMUM_LENGTH = 12;
public static final byte IPV4_TYPE = 1;
public static final byte PATH_KEY_32_BIT_SUB_OBJ_TYPE = 64;
public static final int LABEL_SUB_OBJ_TYPE = 3;
public static final int SR_ERO_SUB_OBJ_TYPE = 96;
public static final int OBJECT_HEADER_LENGTH = 4;
public static final int YTYPE_SHIFT_VALUE = 0x7F;
static final PcepObjectHeader DEFAULT_ERO_OBJECT_HEADER = new PcepObjectHeader(ERO_OBJ_CLASS, ERO_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, ERO_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader eroObjHeader;
private LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
/**
* reset variables.
*/
public PcepEroObjectVer1() {
this.eroObjHeader = null;
this.llSubObjects = null;
}
/**
* Constructor to initialize parameters of ERO object.
*
* @param eroObjHeader ERO object header
* @param llSubObjects list of sub objects.
*/
public PcepEroObjectVer1(PcepObjectHeader eroObjHeader, LinkedList<PcepValueType> llSubObjects) {
this.eroObjHeader = eroObjHeader;
this.llSubObjects = llSubObjects;
}
/**
* Returns ERO object header.
*
* @return eroObjHeader ERO object header
*/
public PcepObjectHeader getEroObjHeader() {
return this.eroObjHeader;
}
/**
* Sets Object Header.
*
* @param obj ERO object header
*/
public void setEroObjHeader(PcepObjectHeader obj) {
this.eroObjHeader = obj;
}
@Override
public LinkedList<PcepValueType> getSubObjects() {
return this.llSubObjects;
}
@Override
public void setSubObjects(LinkedList<PcepValueType> llSubObjects) {
this.llSubObjects = llSubObjects;
}
/**
* Reads from channel buffer and returns object of PcepEroObject.
*
* @param cb channel buffer.
* @return object of PcepEroObject
* @throws PcepParseException when ERO object is not present in channel buffer
*/
public static PcepEroObject read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader eroObjHeader;
LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
eroObjHeader = PcepObjectHeader.read(cb);
if (eroObjHeader.getObjClass() != PcepEroObjectVer1.ERO_OBJ_CLASS) {
log.debug("ErrorType:" + PcepErrorDetailInfo.ERROR_TYPE_6 + " ErrorValue:"
+ PcepErrorDetailInfo.ERROR_VALUE_9);
throw new PcepParseException(PcepErrorDetailInfo.ERROR_TYPE_6, PcepErrorDetailInfo.ERROR_VALUE_9);
}
if (eroObjHeader.getObjLen() > OBJECT_HEADER_LENGTH) {
ChannelBuffer tempCb = cb.readBytes(eroObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
llSubObjects = parseSubObjects(tempCb);
}
return new PcepEroObjectVer1(eroObjHeader, llSubObjects);
}
/**
* Parse list of Sub Objects.
*
* @param cb channel buffer
* @return list of Sub Objects
* @throws PcepParseException when fails to parse sub object list
*/
protected static LinkedList<PcepValueType> parseSubObjects(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
while (0 < cb.readableBytes()) {
//check the Type of the TLV
byte yType = cb.readByte();
yType = (byte) (yType & (YTYPE_SHIFT_VALUE));
byte hLength = cb.readByte();
PcepValueType subObj;
switch (yType) {
case IPv4SubObject.TYPE:
subObj = IPv4SubObject.read(cb);
break;
case IPv6SubObject.TYPE:
byte[] ipv6Value = new byte[IPv6SubObject.VALUE_LENGTH];
cb.readBytes(ipv6Value, 0, IPv6SubObject.VALUE_LENGTH);
subObj = new IPv6SubObject(ipv6Value);
break;
case AutonomousSystemTlv.TYPE:
subObj = AutonomousSystemTlv.read(cb);
break;
case PathKeySubObject.TYPE:
subObj = PathKeySubObject.read(cb);
break;
case SrEroSubObject.TYPE:
subObj = SrEroSubObject.read(cb);
break;
default:
throw new PcepParseException("Unexpected sub object. Type: " + (int) yType);
}
// Check for the padding
int pad = hLength % 4;
if (0 < pad) {
pad = 4 - pad;
if (pad <= cb.readableBytes()) {
cb.skipBytes(pad);
}
}
llSubObjects.add(subObj);
}
if (0 < cb.readableBytes()) {
throw new PcepParseException("Subobject parsing error. Extra bytes received.");
}
return llSubObjects;
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = eroObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Failed to write ERO object header. Index " + objLenIndex);
}
ListIterator<PcepValueType> listIterator = llSubObjects.listIterator();
while (listIterator.hasNext()) {
listIterator.next().write(cb);
}
//Update object length now
int length = cb.writerIndex() - objStartIndex;
cb.setShort(objLenIndex, (short) length);
//will be helpful during print().
eroObjHeader.setObjLen((short) length);
//As per RFC the length of object should be multiples of 4
int pad = length % 4;
if (pad != 0) {
pad = 4 - pad;
for (int i = 0; i < pad; i++) {
cb.writeByte((byte) 0);
}
length = length + pad;
}
objLenIndex = cb.writerIndex();
return objLenIndex;
}
/**
* Builder class for PCEP ERO object.
*/
public static class Builder implements PcepEroObject.Builder {
private boolean bIsHeaderSet = false;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
private PcepObjectHeader eroObjHeader;
LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
@Override
public PcepEroObject build() {
PcepObjectHeader eroObjHeader = this.bIsHeaderSet ? this.eroObjHeader : DEFAULT_ERO_OBJECT_HEADER;
if (bIsPFlagSet) {
eroObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
eroObjHeader.setIFlag(bIFlag);
}
return new PcepEroObjectVer1(eroObjHeader, this.llSubObjects);
}
@Override
public PcepObjectHeader getEroObjHeader() {
return this.eroObjHeader;
}
@Override
public Builder setEroObjHeader(PcepObjectHeader obj) {
this.eroObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public LinkedList<PcepValueType> getSubObjects() {
return this.llSubObjects;
}
@Override
public Builder setSubObjects(LinkedList<PcepValueType> llSubObjects) {
this.llSubObjects = llSubObjects;
return this;
}
@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 void print() {
log.debug("ERO OBJECT");
eroObjHeader.print();
log.debug("SUBOBJECTS:");
ListIterator<PcepValueType> listIterator = llSubObjects.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("ero obj Header", eroObjHeader)
.add("Sub-Objects", llSubObjects)
.toString();
}
}

View File

@ -0,0 +1,213 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
import org.onosproject.pcepio.protocol.PcepAttribute;
import org.onosproject.pcepio.protocol.PcepBandwidthObject;
import org.onosproject.pcepio.protocol.PcepCloseMsg;
import org.onosproject.pcepio.protocol.PcepEndPointsObject;
import org.onosproject.pcepio.protocol.PcepEroObject;
import org.onosproject.pcepio.protocol.PcepFactory;
import org.onosproject.pcepio.protocol.PcepInitiateMsg;
import org.onosproject.pcepio.protocol.PcepKeepaliveMsg;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.protocol.PcepLspaObject;
import org.onosproject.pcepio.protocol.PcepMessage;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepMetricObject;
import org.onosproject.pcepio.protocol.PcepMsgPath;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.onosproject.pcepio.protocol.PcepUpdateMsg;
import org.onosproject.pcepio.protocol.PcepUpdateRequest;
import org.onosproject.pcepio.protocol.PcepVersion;
public class PcepFactoryVer1 implements PcepFactory {
public static final PcepFactoryVer1 INSTANCE = new PcepFactoryVer1();
@Override
public org.onosproject.pcepio.protocol.PcepOpenMsg.Builder buildOpenMsg() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepOpenObject.Builder buildOpenObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public PcepKeepaliveMsg.Builder buildKeepaliveMsg() {
return new PcepKeepaliveMsgVer1.Builder();
}
@Override
public PcepCloseMsg.Builder buildCloseMsg() {
return new PcepCloseMsgVer1.Builder();
}
@Override
public PcepUpdateMsg.Builder buildUpdateMsg() {
return new PcepUpdateMsgVer1.Builder();
}
@Override
public org.onosproject.pcepio.protocol.PcepReportMsg.Builder buildReportMsg() {
// TODO Auto-generated method stub
return null;
}
@Override
public PcepInitiateMsg.Builder buildPcepInitiateMsg() {
return new PcepInitiateMsgVer1.Builder();
}
@Override
public PcepLspObject.Builder buildLspObject() {
return new PcepLspObjectVer1.Builder();
}
@Override
public PcepMessageReader<PcepMessage> getReader() {
return PcepMessageVer1.READER;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepSrpObject.Builder buildSrpObject() {
return new PcepSrpObjectVer1.Builder();
}
@Override
public PcepEndPointsObject.Builder buildEndPointsObject() {
return new PcepEndPointsObjectVer1.Builder();
}
@Override
public PcepEroObject.Builder buildEroObject() {
return new PcepEroObjectVer1.Builder();
}
@Override
public org.onosproject.pcepio.protocol.PcepRroObject.Builder buildRroObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public PcepLspaObject.Builder buildLspaObject() {
return new PcepLspaObjectVer1.Builder();
}
@Override
public org.onosproject.pcepio.protocol.PcepIroObject.Builder buildIroObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public PcepMetricObject.Builder buildMetricObject() {
return new PcepMetricObjectVer1.Builder();
}
@Override
public PcepBandwidthObject.Builder buildBandwidthObject() {
return new PcepBandwidthObjectVer1.Builder();
}
@Override
public PcepMsgPath.Builder buildPcepMsgPath() {
return new PcepMsgPathVer1.Builder();
}
@Override
public org.onosproject.pcepio.protocol.PcepStateReport.Builder buildPcepStateReport() {
// TODO Auto-generated method stub
return null;
}
@Override
public PcepUpdateRequest.Builder buildPcepUpdateRequest() {
return new PcepUpdateRequestVer1.Builder();
}
@Override
public PcInitiatedLspRequest.Builder buildPcInitiatedLspRequest() {
return new PcInitiatedLspRequestVer1.Builder();
}
@Override
public PcepAttribute.Builder buildPcepAttribute() {
return new PcepAttributeVer1.Builder();
}
@Override
public org.onosproject.pcepio.protocol.PcepLabelUpdateMsg.Builder buildPcepLabelUpdateMsg() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepLabelUpdate.Builder buildPcepLabelUpdateObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepLabelObject.Builder buildLabelObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepErrorMsg.Builder buildPcepErrorMsg() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepErrorObject.Builder buildPcepErrorObject() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepFecObjectIPv4Adjacency.Builder buildFecIpv4Adjacency() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepErrorInfo.Builder buildPcepErrorInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public org.onosproject.pcepio.protocol.PcepError.Builder buildPcepError() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,334 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
import org.onosproject.pcepio.protocol.PcepAttribute;
import org.onosproject.pcepio.protocol.PcepEndPointsObject;
import org.onosproject.pcepio.protocol.PcepEroObject;
import org.onosproject.pcepio.protocol.PcepInitiateMsg;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepMessageWriter;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.onosproject.pcepio.protocol.PcepType;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
class PcepInitiateMsgVer1 implements PcepInitiateMsg {
protected static final Logger log = LoggerFactory.getLogger(PcepInitiateMsgVer1.class);
// Ref : PCE initiated tunnel setup draft-ietf-pce-pce-initiated-lsp-03, section 5.1
/* <PCInitiate Message> ::= <Common Header>
* <PCE-initiated-lsp-list>
* Where:
* <PCE-initiated-lsp-list> ::= <PCE-initiated-lsp-request>[<PCE-initiated-lsp-list>]
* <PCE-initiated-lsp-request> ::= (<PCE-initiated-lsp-instantiation>|<PCE-initiated-lsp-deletion>)
* <PCE-initiated-lsp-instantiation> ::= <SRP>
* <LSP>
* <END-POINTS>
* <ERO>
* [<attribute-list>]
* <PCE-initiated-lsp-deletion> ::= <SRP>
* <LSP>
*/
static final byte PACKET_VERSION = 1;
/* considering LspDelete Request PcInitiate msg will contain
* common header
* srp object
* lsp object
* so min length for this can be
* PACKET_MINIMUM_LENGTH = CommonHeaderLen(4)+SrpObjectMinLen(12)+LspObjectMinLen(8)
*/
public static final short PACKET_MINIMUM_LENGTH = 24;
public static final short MINIMUM_COMMON_HEADER_LENGTH = 4;
public static final PcepType MSG_TYPE = PcepType.INITIATE;
private LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList;
public static final PcepInitiateMsgVer1.Reader READER = new Reader();
static class Reader implements PcepMessageReader<PcepInitiateMsg> {
LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList;
@Override
public PcepInitiateMsg readFrom(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
return null;
}
llPcInitiatedLspRequestList = new LinkedList<PcInitiatedLspRequest>();
byte version = cb.readByte();
version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
if (version != PACKET_VERSION) {
throw new PcepParseException("Wrong version. Expected=PcepVersion.PCEP_1(1), received=" + version);
}
byte type = cb.readByte();
if (type != MSG_TYPE.getType()) {
throw new PcepParseException("Wrong type. Expected=PcepType.INITIATE(12), recived=" + type);
}
short length = cb.readShort();
if (length < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Wrong length. Initiate message length expected to be >= "
+ PACKET_MINIMUM_LENGTH + ", but received=" + length);
}
log.debug("reading PcInitiate message of length " + length);
// parse Start initiate/deletion list
if (!parsePcInitiatedLspRequestList(cb)) {
throw new PcepParseException("Parsing PCE-initiated-lsp-Request-list failed");
}
return new PcepInitiateMsgVer1(llPcInitiatedLspRequestList);
}
/**
* To parse PcInitiatedLspRequestList from PcInitiate Message.
*
* @param cb of type channel buffer
* @return true if parsing PcInitiatedLspRequestList is success, false otherwise
* @throws PcepParseException while parsing from channel buffer
*/
public boolean parsePcInitiatedLspRequestList(ChannelBuffer cb) throws PcepParseException {
boolean isDelLspRequest = false;
if (null == cb) {
throw new PcepParseException("Channel buffer is empty");
}
while (0 < cb.readableBytes()) {
PcInitiatedLspRequest pceInitLspReq = new PcInitiatedLspRequestVer1();
//store SRP object
PcepSrpObject srpObj;
srpObj = PcepSrpObjectVer1.read(cb);
pceInitLspReq.setSrpObject(srpObj);
isDelLspRequest = srpObj.getRFlag();
//store LSP object
PcepLspObject lspObj;
lspObj = PcepLspObjectVer1.read(cb);
pceInitLspReq.setLspObject(lspObj);
/* if R bit will be set then pcInitiate msg will contain only LSp and SRP objects
* so if R bit is not set then we should read for Ero and EndPoint objects also.
*/
if (!isDelLspRequest) {
//store EndPoint object
PcepEndPointsObject endPointObj;
endPointObj = PcepEndPointsObjectVer1.read(cb);
pceInitLspReq.setEndPointsObject(endPointObj);
//store ERO object
PcepEroObject eroObj;
eroObj = PcepEroObjectVer1.read(cb);
pceInitLspReq.setEroObject(eroObj);
if (cb.readableBytes() > MINIMUM_COMMON_HEADER_LENGTH) {
pceInitLspReq.setPcepAttribute(PcepAttributeVer1.read(cb));
}
}
llPcInitiatedLspRequestList.add(pceInitLspReq);
}
return true;
}
}
/**
* Constructor to initialize PcInitiatedLspRequest.
*
* @param llPcInitiatedLspRequestList list of PcInitiatedLspRequest
*/
PcepInitiateMsgVer1(LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList) {
if (llPcInitiatedLspRequestList == null) {
throw new NullPointerException("PcInitiatedLspRequestList cannot be null.");
}
this.llPcInitiatedLspRequestList = llPcInitiatedLspRequestList;
}
/**
* Builder class for PCEP initiate message.
*/
static class Builder implements PcepInitiateMsg.Builder {
// Pcep initiate message fields
LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList;
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return PcepType.INITIATE;
}
@Override
public PcepInitiateMsg build() {
return new PcepInitiateMsgVer1(this.llPcInitiatedLspRequestList);
}
@Override
public LinkedList<PcInitiatedLspRequest> getPcInitiatedLspRequestList() {
return this.llPcInitiatedLspRequestList;
}
@Override
public Builder setPcInitiatedLspRequestList(LinkedList<PcInitiatedLspRequest> ll) {
this.llPcInitiatedLspRequestList = ll;
return this;
}
}
@Override
public void writeTo(ChannelBuffer cb) throws PcepParseException {
WRITER.write(cb, this);
}
static final Writer WRITER = new Writer();
static class Writer implements PcepMessageWriter<PcepInitiateMsgVer1> {
@Override
public void write(ChannelBuffer cb, PcepInitiateMsgVer1 message) throws PcepParseException {
boolean isDelLspRequest = false;
int startIndex = cb.writerIndex();
// first 3 bits set to version
cb.writeByte((byte) (PACKET_VERSION << PcepMessageVer1.SHIFT_FLAG));
// message type 0xC
cb.writeByte(MSG_TYPE.getType());
// length is length of variable message, will be updated at the end
// Store the position of message
// length in buffer
int msgLenIndex = cb.writerIndex();
cb.writeShort(0);
ListIterator<PcInitiatedLspRequest> listIterator = message.llPcInitiatedLspRequestList.listIterator();
while (listIterator.hasNext()) {
PcInitiatedLspRequest listReq = listIterator.next();
//Srp Object is mandatory
PcepSrpObject srpObj = listReq.getSrpObject();
if (srpObj instanceof PcepSrpObject) {
isDelLspRequest = srpObj.getRFlag();
srpObj.write(cb);
} else {
throw new PcepParseException("SRP Object is mandatory for PcInitiate message.");
}
//LSP Object is mandatory
PcepLspObject lspObj = listReq.getLspObject();
if (lspObj instanceof PcepLspObject) {
lspObj.write(cb);
} else {
throw new PcepParseException("LSP Object is mandatory for PcInitiate message.");
}
/* if R bit will be set then pcInitiate msg will contain only LSp and SRP objects
* so if R bit is not set then we should read for Ero and EndPoint objects also.
*/
if (!isDelLspRequest) {
//EndPoints object is mandatory
PcepEndPointsObject endPointObj = listReq.getEndPointsObject();
if (endPointObj instanceof PcepEndPointsObject) {
endPointObj.write(cb);
} else {
throw new PcepParseException("End points Object is mandatory for PcInitiate message.");
}
//Ero object is mandatory
PcepEroObject eroObj = listReq.getEroObject();
if (eroObj instanceof PcepEroObject) {
eroObj.write(cb);
} else {
throw new PcepParseException("ERO Object is mandatory for PcInitiate message.");
}
//PcepAttribute is optional
PcepAttribute pcepAttribute = listReq.getPcepAttribute();
if (pcepAttribute instanceof PcepAttribute) {
pcepAttribute.write(cb);
}
}
}
// PCInitiate message length field
int length = cb.writerIndex() - startIndex;
cb.setShort(msgLenIndex, (short) length);
}
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return MSG_TYPE;
}
@Override
public LinkedList<PcInitiatedLspRequest> getPcInitiatedLspRequestList() {
return this.llPcInitiatedLspRequestList;
}
@Override
public void setPcInitiatedLspRequestList(LinkedList<PcInitiatedLspRequest> ll) {
this.llPcInitiatedLspRequestList = ll;
}
@Override
public void print() {
log.debug("PCEP INITIATE MESSAGE");
ListIterator<PcInitiatedLspRequest> listIterator = llPcInitiatedLspRequestList.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("PC initiaited lsp request list", llPcInitiatedLspRequestList)
.toString();
}
}

View File

@ -0,0 +1,306 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepIroObject;
import org.onosproject.pcepio.types.IPv4SubObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// (Sub-objects) //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The IRO Object format
Each IPV4 suboject
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | IPv4 address (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 address (continued) | Prefix Length | Resvd |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
public class PcepIroObjectVer1 implements PcepIroObject {
protected static final Logger log = LoggerFactory.getLogger(PcepIroObjectVer1.class);
public static final byte IRO_OBJ_TYPE = 1;
public static final byte IRO_OBJ_CLASS = 10;
public static final byte IRO_OBJECT_VERSION = 1;
public static final short IRO_OBJ_MINIMUM_LENGTH = 12;
public static final int OBJECT_HEADER_LENGTH = 4;
public static final int YTYPE_SHIFT_VALUE = 0x7F;
public static final PcepObjectHeader DEFAULT_IRO_OBJECT_HEADER = new PcepObjectHeader(IRO_OBJ_CLASS, IRO_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, IRO_OBJ_MINIMUM_LENGTH);
private short iroObjType = 0;
private byte yLength;
private byte yPrefixLength;
private byte yResvd;
private PcepObjectHeader iroObjHeader;
private LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
/**
* Default constructor.
*/
public PcepIroObjectVer1() {
this.iroObjHeader = null;
this.iroObjType = 0;
this.yLength = 0;
}
/**
* Constructor to initialize member variables.
*
* @param iroObjHeader IRO object header
* @param llSubObjects list of sub-objects
*/
public PcepIroObjectVer1(PcepObjectHeader iroObjHeader, LinkedList<PcepValueType> llSubObjects) {
this.iroObjHeader = iroObjHeader;
this.llSubObjects = llSubObjects;
}
/**
* Returns object header.
*
* @return iroObjHeader IRO object header
*/
public PcepObjectHeader getIroObjHeader() {
return this.iroObjHeader;
}
/**
* Sets IRO Object Header.
*
* @param obj IRO object header
*/
public void setIroObjHeader(PcepObjectHeader obj) {
this.iroObjHeader = obj;
}
@Override
public LinkedList<PcepValueType> getSubObjects() {
return this.llSubObjects;
}
@Override
public void setSubObjects(LinkedList<PcepValueType> llSubObjects) {
this.llSubObjects = llSubObjects;
}
/**
* Reads from channel buffer and return object of PcepIroObject.
*
* @param cb of type channel buffer
* @return object of PcepIroObject
* @throws PcepParseException while parsing from channel buffer
*/
public static PcepIroObject read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader iroObjHeader;
LinkedList<PcepValueType> llSubObjects;
iroObjHeader = PcepObjectHeader.read(cb);
//take only IroObject buffer.
ChannelBuffer tempCb = cb.readBytes(iroObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
llSubObjects = parseSubObjects(tempCb);
return new PcepIroObjectVer1(iroObjHeader, llSubObjects);
}
/**
* Returns linked list of sub objects.
*
* @param cb of type channel buffer
* @return linked list of sub objects
* @throws PcepParseException while parsing subobjects from channel buffer
*/
protected static LinkedList<PcepValueType> parseSubObjects(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
while (0 < cb.readableBytes()) {
//check the Type of the Subobjects.
byte yType = cb.readByte();
yType = (byte) (yType & (YTYPE_SHIFT_VALUE));
byte hLength = cb.readByte();
PcepValueType subObj;
switch (yType) {
case IPv4SubObject.TYPE:
subObj = IPv4SubObject.read(cb);
break;
default:
throw new PcepParseException("Invalid sub object. Type: " + (int) yType);
}
// Check for the padding
int pad = hLength % 4;
if (0 < pad) {
pad = 4 - pad;
if (pad <= cb.readableBytes()) {
cb.skipBytes(pad);
}
}
llSubObjects.add(subObj);
}
return llSubObjects;
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = iroObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException(" ObjectLength is " + objLenIndex);
}
ListIterator<PcepValueType> listIterator = llSubObjects.listIterator();
while (listIterator.hasNext()) {
listIterator.next().write(cb);
}
//Update object length now
int length = cb.writerIndex() - objStartIndex;
//will be helpful during print().
iroObjHeader.setObjLen((short) length);
// As per RFC the length of object should be
// multiples of 4
int pad = length % 4;
if (pad != 0) {
pad = 4 - pad;
for (int i = 0; i < pad; i++) {
cb.writeByte((byte) 0);
}
length = length + pad;
}
cb.setShort(objLenIndex, (short) length);
objLenIndex = cb.writerIndex();
return objLenIndex;
}
public static class Builder implements PcepIroObject.Builder {
private boolean bIsHeaderSet = false;
private PcepObjectHeader iroObjHeader;
LinkedList<PcepValueType> llSubObjects = new LinkedList<PcepValueType>();
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepIroObject build() {
PcepObjectHeader iroObjHeader = this.bIsHeaderSet ? this.iroObjHeader : DEFAULT_IRO_OBJECT_HEADER;
if (bIsPFlagSet) {
iroObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
iroObjHeader.setIFlag(bIFlag);
}
return new PcepIroObjectVer1(iroObjHeader, this.llSubObjects);
}
@Override
public PcepObjectHeader getIroObjHeader() {
return this.iroObjHeader;
}
@Override
public Builder setIroObjHeader(PcepObjectHeader obj) {
this.iroObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public LinkedList<PcepValueType> getSubObjects() {
return this.llSubObjects;
}
@Override
public Builder setSubObjects(LinkedList<PcepValueType> llSubObjects) {
this.llSubObjects = llSubObjects;
return this;
}
@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 void print() {
log.debug("IRO OBJECT");
iroObjHeader.print();
log.debug("SUBOBJECTS:");
ListIterator<PcepValueType> listIterator = llSubObjects.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("IRO object header", iroObjHeader)
.add("List of sub object", llSubObjects)
.toString();
}
}

View File

@ -0,0 +1,140 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepKeepaliveMsg;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepMessageWriter;
import org.onosproject.pcepio.protocol.PcepType;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class PcepKeepaliveMsgVer1 implements PcepKeepaliveMsg {
/*
<Keepalive Message>::= <Common Header>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver | Flags | Message-Type | Message-Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(PcepKeepaliveMsgVer1.class);
// Pcep version: 1
public static final byte PACKET_VERSION = 1;
public static final int PACKET_MINIMUM_LENGTH = 4;
public static final PcepType MSG_TYPE = PcepType.KEEP_ALIVE;
public static final PcepKeepaliveMsgVer1.Reader READER = new Reader();
static class Reader implements PcepMessageReader<PcepKeepaliveMsg> {
@Override
public PcepKeepaliveMsg readFrom(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Packet size is less than the minimum required length.");
}
// fixed value property version == 1
byte version = cb.readByte();
version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
if (version != PACKET_VERSION) {
throw new PcepParseException("Wrong version: Expected=PcepVersion.KEEP_ALIVE_1(2), got=" + version);
}
// fixed value property type == 2
byte type = cb.readByte();
if (type != MSG_TYPE.getType()) {
throw new PcepParseException("Wrong type: Expected=PcepType.KEEP_ALIVE_1(2), got=" + type);
}
short length = cb.readShort();
if (length < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Wrong length: Expected to be >= " + PACKET_MINIMUM_LENGTH + ", was: "
+ length);
}
return new PcepKeepaliveMsgVer1();
}
}
/**
* Default constructor.
*/
PcepKeepaliveMsgVer1() {
}
static class Builder implements PcepKeepaliveMsg.Builder {
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return PcepType.KEEP_ALIVE;
}
@Override
public PcepKeepaliveMsg build() {
return new PcepKeepaliveMsgVer1();
}
}
@Override
public void writeTo(ChannelBuffer cb) {
WRITER.write(cb, this);
}
static final Writer WRITER = new Writer();
static class Writer implements PcepMessageWriter<PcepKeepaliveMsgVer1> {
@Override
public void write(ChannelBuffer cb, PcepKeepaliveMsgVer1 message) {
int startIndex = cb.writerIndex();
// first 3 bits set to version
cb.writeByte((byte) (PACKET_VERSION << PcepMessageVer1.SHIFT_FLAG));
// message type
cb.writeByte(MSG_TYPE.getType());
// length is length of variable message, will be updated at the end
// Store the position of message
// length in buffer
int msgLenIndex = cb.writerIndex();
cb.writeShort((short) 0);
// update message length field
int length = cb.writerIndex() - startIndex;
cb.setShort(msgLenIndex, (short) length);
}
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return MSG_TYPE;
}
@Override
public void print() {
log.debug("KEEPALIVE MESSAGE");
}
}

View File

@ -0,0 +1,593 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.types.PcepErrorDetailInfo;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.onosproject.pcepio.types.StatefulIPv4LspIdentidiersTlv;
import org.onosproject.pcepio.types.StatefulLspErrorCodeTlv;
import org.onosproject.pcepio.types.StatefulRsvpErrorSpecTlv;
import org.onosproject.pcepio.types.SymbolicPathNameTlv;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
message format.
Reference : draft-ietf-pce-stateful-pce-11, section 7.3.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PLSP-ID | Flag | O|A|R|S|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// TLVs //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
The LSP Object format
*/
public class PcepLspObjectVer1 implements PcepLspObject {
protected static final Logger log = LoggerFactory.getLogger(PcepLspObjectVer1.class);
public static final byte LSP_OBJ_TYPE = 1;
public static final byte LSP_OBJ_CLASS = 32;
public static final byte LSP_OBJECT_VERSION = 1;
// LSP_OBJ_MINIMUM_LENGTH = CommonHeaderLen(4)+ LspObjectHeaderLen(4)+TlvAssumedMinLength(8)
public static final short LSP_OBJ_MINIMUM_LENGTH = 16;
public static final int DEFAULT_PLSPID = 0;
public static final byte DEFAULT_OFLAG = 1;
public static final boolean DEFAULT_AFLAG = false;
public static final boolean DEFAULT_RFLAG = false;
public static final boolean DEFAULT_SFLAG = false;
public static final boolean DEFAULT_DFLAG = false;
public static final int OBJECT_HEADER_LENGTH = 4;
public static final int PLSPID_SHIFT_VALUE = 12;
public static final int OFLAG_SHIFT_VALUE = 4;
public static final int AFLAG_SHIFT_VALUE = 3;
public static final int RFLAG_SHIFT_VALUE = 2;
public static final int SFLAG_SHIFT_VALUE = 1;
public static final int PLSPID_TEMP_SHIFT_VALUE = 0xFFFFF000;
public static final int OFLAG_TEMP_SHIFT_VALUE = 0x70;
public static final int AFLAG_TEMP_SHIFT_VALUE = 0x08;
public static final int RFLAG_TEMP_SHIFT_VALUE = 0x04;
public static final int SFLAG_TEMP_SHIFT_VALUE = 0x02;
public static final int DFLAG_TEMP_SHIFT_VALUE = 0x01;
public static final int BIT_SET = 1;
public static final int BIT_RESET = 0;
public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
static final PcepObjectHeader DEFAULT_LSP_OBJECT_HEADER = new PcepObjectHeader(LSP_OBJ_CLASS, LSP_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, LSP_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader lspObjHeader;
private int iPlspId;
// 3-bits
private byte yOFlag;
private boolean bAFlag;
private boolean bRFlag;
private boolean bSFlag;
private boolean bDFlag;
// Optional TLV
private LinkedList<PcepValueType> llOptionalTlv;
/**
* Constructor to initialize all the member variables.
*
* @param lspObjHeader lsp object header
* @param iPlspId plsp id
* @param yOFlag O flag
* @param bAFlag A flag
* @param bRFlag R flag
* @param bSFlag S flag
* @param bDFlag D flag
* @param llOptionalTlv list of optional tlv
*/
public PcepLspObjectVer1(PcepObjectHeader lspObjHeader, int iPlspId, byte yOFlag, boolean bAFlag, boolean bRFlag,
boolean bSFlag, boolean bDFlag, LinkedList<PcepValueType> llOptionalTlv) {
this.lspObjHeader = lspObjHeader;
this.iPlspId = iPlspId;
this.yOFlag = yOFlag;
this.bAFlag = bAFlag;
this.bRFlag = bRFlag;
this.bSFlag = bSFlag;
this.bDFlag = bDFlag;
this.llOptionalTlv = llOptionalTlv;
}
/**
* Sets lsp Object Header.
*
* @param obj lsp object header
*/
public void setLspObjHeader(PcepObjectHeader obj) {
this.lspObjHeader = obj;
}
@Override
public void setPlspId(int iPlspId) {
this.iPlspId = iPlspId;
}
@Override
public void setOFlag(byte yOFlag) {
this.yOFlag = yOFlag;
}
@Override
public void setAFlag(boolean bAFlag) {
this.bAFlag = bAFlag;
}
@Override
public void setRFlag(boolean bRFlag) {
this.bRFlag = bRFlag;
}
@Override
public void setSFlag(boolean bSFlag) {
this.bSFlag = bSFlag;
}
@Override
public void setDFlag(boolean bDFlag) {
this.bDFlag = bDFlag;
}
/**
* Returns lsp object header.
*
* @return lspObjHeader
*/
public PcepObjectHeader getLspObjHeader() {
return this.lspObjHeader;
}
@Override
public int getPlspId() {
return this.iPlspId;
}
@Override
public byte getOFlag() {
return this.yOFlag;
}
@Override
public boolean getAFlag() {
return this.bAFlag;
}
@Override
public boolean getRFlag() {
return this.bRFlag;
}
@Override
public boolean getSFlag() {
return this.bSFlag;
}
@Override
public boolean getDFlag() {
return this.bDFlag;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@Override
public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
}
/**
* Parse channel buffer and returns object of PcepLspObject.
*
* @param cb of type channel buffer
* @return object of PcepLspObject
* @throws PcepParseException when lsp object is not present in channel buffer
*/
public static PcepLspObject read(ChannelBuffer cb) throws PcepParseException {
PcepObjectHeader lspObjHeader;
int iPlspId;
// 3-bits
byte yOFlag;
boolean bAFlag;
boolean bRFlag;
boolean bSFlag;
boolean bDFlag;
// Optional TLV
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
lspObjHeader = PcepObjectHeader.read(cb);
if (lspObjHeader.getObjClass() != PcepLspObjectVer1.LSP_OBJ_CLASS) {
throw new PcepParseException(PcepErrorDetailInfo.ERROR_TYPE_6, PcepErrorDetailInfo.ERROR_VALUE_8);
}
//take only LspObject buffer.
ChannelBuffer tempCb = cb.readBytes(lspObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
Integer iTemp = tempCb.readInt();
iPlspId = (iTemp & PLSPID_TEMP_SHIFT_VALUE) >> PLSPID_SHIFT_VALUE;
Integer iX = (iTemp & OFLAG_TEMP_SHIFT_VALUE) >> OFLAG_SHIFT_VALUE;
yOFlag = iX.byteValue();
iX = (iTemp & AFLAG_TEMP_SHIFT_VALUE) >> AFLAG_SHIFT_VALUE;
bAFlag = (iX > 0) ? true : false;
iX = (iTemp & RFLAG_TEMP_SHIFT_VALUE) >> RFLAG_SHIFT_VALUE;
bRFlag = (iX > 0) ? true : false;
iX = (iTemp & SFLAG_TEMP_SHIFT_VALUE) >> SFLAG_SHIFT_VALUE;
bSFlag = (iX > 0) ? true : false;
iX = iTemp & DFLAG_TEMP_SHIFT_VALUE;
bDFlag = (iX > 0) ? true : false;
// parse optional TLV
llOptionalTlv = parseOptionalTlv(tempCb);
return new PcepLspObjectVer1(lspObjHeader, iPlspId, yOFlag, bAFlag, bRFlag, bSFlag, bDFlag, llOptionalTlv);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = lspObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Failed to write lsp object header. Index " + objLenIndex);
}
int iTemp = iPlspId << PLSPID_SHIFT_VALUE;
iTemp = iTemp | (yOFlag << OFLAG_SHIFT_VALUE);
byte bFlag;
iTemp = bAFlag ? (iTemp | AFLAG_TEMP_SHIFT_VALUE) : iTemp;
bFlag = (bRFlag) ? (byte) BIT_SET : BIT_RESET;
iTemp = iTemp | (bFlag << RFLAG_SHIFT_VALUE);
bFlag = (bSFlag) ? (byte) BIT_SET : BIT_RESET;
iTemp = iTemp | (bFlag << SFLAG_SHIFT_VALUE);
bFlag = (bDFlag) ? (byte) BIT_SET : BIT_RESET;
iTemp = iTemp | bFlag;
cb.writeInt(iTemp);
// Add optional TLV
packOptionalTlv(cb);
//Update object length now
int length = cb.writerIndex() - objStartIndex;
//will be helpful during print().
lspObjHeader.setObjLen((short) length);
// As per RFC the length of object should be
// multiples of 4
cb.setShort(objLenIndex, (short) length);
return length;
}
/**
* Returns Linked list of optional tlvs.
*
* @param cb of channel buffer.
* @return list of optional tlvs
* @throws PcepParseException when unsupported tlv is received
*/
protected static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llOutOptionalTlv;
llOutOptionalTlv = new LinkedList<PcepValueType>();
while (MINIMUM_COMMON_HEADER_LENGTH <= cb.readableBytes()) {
PcepValueType tlv;
short hType = cb.readShort();
short hLength = cb.readShort();
int iValue = 0;
switch (hType) {
case StatefulIPv4LspIdentidiersTlv.TYPE:
tlv = StatefulIPv4LspIdentidiersTlv.read(cb);
break;
case StatefulLspErrorCodeTlv.TYPE:
iValue = cb.readInt();
tlv = new StatefulLspErrorCodeTlv(iValue);
break;
case StatefulRsvpErrorSpecTlv.TYPE:
tlv = StatefulRsvpErrorSpecTlv.read(cb);
break;
case SymbolicPathNameTlv.TYPE:
tlv = SymbolicPathNameTlv.read(cb, hLength);
break;
default:
throw new PcepParseException("Received unsupported TLV type :" + hType);
}
// Check for the padding
int pad = hLength % 4;
if (0 < pad) {
pad = 4 - pad;
if (pad <= cb.readableBytes()) {
cb.skipBytes(pad);
}
}
llOutOptionalTlv.add(tlv);
}
if (0 < cb.readableBytes()) {
throw new PcepParseException("Optional Tlv parsing error. Extra bytes received.");
}
return llOutOptionalTlv;
}
/**
* returns writer index.
*
* @param cb of type channel buffer
* @return length of bytes written to channel buffer
*/
protected int packOptionalTlv(ChannelBuffer cb) {
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
int startIndex = cb.writerIndex();
while (listIterator.hasNext()) {
PcepValueType tlv = listIterator.next();
if (null == tlv) {
log.debug("tlv is null from OptionalTlv list");
continue;
}
tlv.write(cb);
// need to take care of padding
int pad = tlv.getLength() % 4;
if (0 != pad) {
pad = 4 - pad;
for (int i = 0; i < pad; ++i) {
cb.writeByte((byte) 0);
}
}
}
return cb.writerIndex() - startIndex;
}
/**
* Builder class for PCEP lsp Object.
*/
public static class Builder implements PcepLspObject.Builder {
private boolean bIsHeaderSet = false;
private boolean bIsPlspIdSet = false;
private boolean bIsOFlagSet = false;
private boolean bIsRFlagSet = false;
private boolean bIsAFlagSet = false;
private boolean bIsDFlagSet = false;
private boolean bIsSFlagSet = false;
private PcepObjectHeader lspObjHeader;
private byte yOFlag;
private boolean bAFlag;
private boolean bDFlag;
private boolean bSFlag;
private boolean bRFlag;
LinkedList<PcepValueType> llOptionalTlv = null;
private int plspId;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepLspObject build() {
PcepObjectHeader lspObjHeader = this.bIsHeaderSet ? this.lspObjHeader : DEFAULT_LSP_OBJECT_HEADER;
int plspId = this.bIsPlspIdSet ? this.plspId : DEFAULT_PLSPID;
byte yOFlag = this.bIsOFlagSet ? this.yOFlag : DEFAULT_OFLAG;
boolean bAFlag = this.bIsAFlagSet ? this.bAFlag : DEFAULT_AFLAG;
boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : DEFAULT_RFLAG;
boolean bSFlag = this.bIsSFlagSet ? this.bSFlag : DEFAULT_SFLAG;
boolean bDFlag = this.bIsDFlagSet ? this.bDFlag : DEFAULT_DFLAG;
if (bIsPFlagSet) {
lspObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
lspObjHeader.setIFlag(bIFlag);
}
return new PcepLspObjectVer1(lspObjHeader, plspId, yOFlag, bAFlag, bRFlag, bSFlag, bDFlag, llOptionalTlv);
}
@Override
public PcepObjectHeader getLspObjHeader() {
return this.lspObjHeader;
}
@Override
public Builder setLspObjHeader(PcepObjectHeader obj) {
this.lspObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public int getPlspId() {
return this.plspId;
}
@Override
public Builder setPlspId(int value) {
this.plspId = value;
this.bIsPlspIdSet = true;
return this;
}
@Override
public byte getOFlag() {
return this.yOFlag;
}
@Override
public Builder setOFlag(byte value) {
this.yOFlag = value;
this.bIsOFlagSet = true;
return this;
}
@Override
public boolean getAFlag() {
return this.bAFlag;
}
@Override
public Builder setAFlag(boolean value) {
this.bAFlag = value;
this.bIsAFlagSet = true;
return this;
}
@Override
public boolean getRFlag() {
return this.bRFlag;
}
@Override
public Builder setRFlag(boolean value) {
this.bRFlag = value;
this.bIsRFlagSet = true;
return this;
}
@Override
public boolean getSFlag() {
return this.bSFlag;
}
@Override
public Builder setSFlag(boolean value) {
this.bSFlag = value;
this.bIsSFlagSet = true;
return this;
}
@Override
public boolean getDFlag() {
return this.bDFlag;
}
@Override
public Builder setDFlag(boolean value) {
this.bDFlag = value;
this.bIsDFlagSet = true;
return this;
}
@Override
public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
return this;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@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 void print() {
log.debug("LSP OBJECT");
long lTemp = iPlspId & 0xFFFFFFFF;
log.debug("PLSP Id: " + lTemp);
lTemp = yOFlag & 0xFFFF;
log.debug("O Flag: " + lTemp);
lTemp = (bAFlag) ? 1 : 0;
log.debug("A Flag: " + lTemp);
lTemp = (bRFlag) ? 1 : 0;
log.debug("R Flag: " + lTemp);
lTemp = (bSFlag) ? 1 : 0;
log.debug("S Flag: " + lTemp);
lTemp = (bDFlag) ? 1 : 0;
log.debug("D Flag: " + lTemp);
log.debug("OPTIONAL TLV:");
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Plsp ID value", iPlspId)
.add("o flag", yOFlag)
.add("A flag", bAFlag)
.add("R flag", bRFlag)
.add("S flag", bSFlag)
.add("D flag", bDFlag)
.add("List of optional tlv", llOptionalTlv)
.toString();
}
}

View File

@ -0,0 +1,552 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepLspaObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
public class PcepLspaObjectVer1 implements PcepLspaObject {
/* LSPA Object Body Format
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Exclude-any |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Include-any |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Include-all |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Setup Prio | Holding Prio | Flags |L| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Optional TLVs |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(PcepLspaObjectVer1.class);
public static final byte LSPA_OBJ_TYPE = 1;
public static final byte LSPA_OBJ_CLASS = 9;
public static final byte LSPA_OBJECT_VERSION = 1;
public static final short LSPA_OBJ_MINIMUM_LENGTH = 20;
public static final int OBJECT_HEADER_LENGTH = 4;
static final PcepObjectHeader DEFAULT_LSPA_OBJECT_HEADER = new PcepObjectHeader(LSPA_OBJ_CLASS, LSPA_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, LSPA_OBJ_MINIMUM_LENGTH);
public static final int SETUP_PRIORITY_SHIFT_VALUE = 24;
public static final int HOLD_PRIORITY_SHIFT_VALUE = 16;
public static final int BFLAG_SHIFT_VALUE = 8;
public static final int LFLAG_SET = 1;
public static final int LFLAG_RESET = 0;
private PcepObjectHeader lspaObjHeader;
private int iExcludeAny;
private int iIncludeAny;
private int iIncludeAll;
private byte cSetupPriority;
private byte cHoldPriority;
private byte flags;
private byte reserved;
private boolean bLFlag;
private LinkedList<PcepValueType> llOptionalTlv; //Optional TLV
/**
* Constructor to initialize member variables.
*
* @param lspaObjHeader lspa object header
* @param bLFlag b l flag
* @param iExcludeAny excludeAny value
* @param iIncludeAny includeAny value
* @param iIncludeAll includeAll value
* @param cSetupPriority setup priority value
* @param cHoldPriority hold priority value
* @param llOptionalTlv list of optional tlv
*/
public PcepLspaObjectVer1(PcepObjectHeader lspaObjHeader, boolean bLFlag, int iExcludeAny, int iIncludeAny,
int iIncludeAll, byte cSetupPriority, byte cHoldPriority, LinkedList<PcepValueType> llOptionalTlv) {
this.lspaObjHeader = lspaObjHeader;
this.bLFlag = bLFlag;
this.iExcludeAny = iExcludeAny;
this.iIncludeAny = iIncludeAny;
this.iIncludeAll = iIncludeAll;
this.cSetupPriority = cSetupPriority;
this.cHoldPriority = cHoldPriority;
this.llOptionalTlv = llOptionalTlv;
}
/**
* Sets Object Header.
*
* @param obj lspa object header
*/
public void setLspaObjHeader(PcepObjectHeader obj) {
this.lspaObjHeader = obj;
}
@Override
public void setExcludeAny(int iExcludeAny) {
this.iExcludeAny = iExcludeAny;
}
@Override
public void setIncludeAny(int iIncludeAny) {
this.iIncludeAny = iIncludeAny;
}
@Override
public void setSetupPriority(byte cSetupPriority) {
this.cSetupPriority = cSetupPriority;
}
@Override
public void setHoldPriority(byte cHoldPriority) {
this.cHoldPriority = cHoldPriority;
}
@Override
public void setLFlag(boolean bLFlag) {
this.bLFlag = bLFlag;
}
/**
* Returns lspa Object Header.
*
* @return lspa Object Header
*/
public PcepObjectHeader getLspaObjHeader() {
return this.lspaObjHeader;
}
@Override
public int getExcludeAny() {
return this.iExcludeAny;
}
@Override
public int getIncludeAny() {
return this.iIncludeAny;
}
@Override
public int getIncludeAll() {
return this.iIncludeAll;
}
@Override
public byte getSetupPriority() {
return this.cSetupPriority;
}
@Override
public byte getHoldPriority() {
return this.cHoldPriority;
}
@Override
public boolean getLFlag() {
return this.bLFlag;
}
@Override
public void setIncludeAll(int value) {
this.iIncludeAll = value;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@Override
public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
}
/**
* Reads channel buffer and returns object of PcepLspaObject.
*
* @param cb of type channel buffer.
* @return object of PcepLspaObject
* @throws PcepParseException while parsing lspa object from channel buffer
*/
public static PcepLspaObject read(ChannelBuffer cb) throws PcepParseException {
log.debug("LspaObject::read");
PcepObjectHeader lspaObjHeader;
int iExcludeAny;
int iIncludeAny;
int iIncludeAll;
byte cSetupPriority;
byte cHoldPriority;
boolean bLFlag;
byte flags;
// Optional TLV
LinkedList<PcepValueType> llOptionalTlv;
lspaObjHeader = PcepObjectHeader.read(cb);
//take only Lspa Object buffer.
ChannelBuffer tempCb = cb.readBytes(lspaObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
iExcludeAny = tempCb.readInt();
iIncludeAny = tempCb.readInt();
iIncludeAll = tempCb.readInt();
cSetupPriority = tempCb.readByte();
cHoldPriority = tempCb.readByte();
flags = tempCb.readByte();
tempCb.readByte();
bLFlag = (flags & (byte) LFLAG_SET) == LFLAG_SET ? true : false;
llOptionalTlv = parseOptionalTlv(tempCb);
return new PcepLspaObjectVer1(lspaObjHeader, bLFlag, iExcludeAny, iIncludeAny, iIncludeAll, cSetupPriority,
cHoldPriority, llOptionalTlv);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = lspaObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Failed to write lspa object header. Index " + objLenIndex);
}
cb.writeInt(iExcludeAny);
cb.writeInt(iIncludeAny);
cb.writeInt(iIncludeAll);
int iTemp = cSetupPriority << SETUP_PRIORITY_SHIFT_VALUE;
iTemp = iTemp | (cHoldPriority << HOLD_PRIORITY_SHIFT_VALUE);
byte bFlag;
bFlag = (bLFlag) ? (byte) LFLAG_SET : LFLAG_RESET;
iTemp = iTemp | (bFlag << BFLAG_SHIFT_VALUE);
cb.writeInt(iTemp);
// Add optional TLV
if (!packOptionalTlv(cb)) {
throw new PcepParseException("Faild to write lspa objects tlv to channel buffer");
}
short length = (short) (cb.writerIndex() - objStartIndex);
lspaObjHeader.setObjLen(length); //will be helpful during print().
//As per RFC the length of object should be multiples of 4
short pad = (short) (length % 4);
if (pad != 0) {
pad = (short) (4 - pad);
for (int i = 0; i < pad; i++) {
cb.writeByte((byte) 0);
}
length = (short) (length + pad);
}
cb.setShort(objLenIndex, length);
return cb.writerIndex();
}
/**
* Parse list of optional tlvs.
*
* @param cb channel buffer
* @return list of optional tlvs.
* @throws PcepParseException when fails to parse optional tlv list.
*/
public static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llOutOptionalTlv = new LinkedList<PcepValueType>();
return llOutOptionalTlv;
}
/**
* Writes optional tlvs to channel buffer.
*
* @param cb channel buffer
* @return true
*/
protected boolean packOptionalTlv(ChannelBuffer cb) {
int hTlvType;
int hTlvLength;
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
PcepValueType tlv = listIterator.next();
if (null == tlv) {
log.debug("Warning: tlv is null from OptionalTlv list");
continue;
}
hTlvType = tlv.getType();
hTlvLength = tlv.getLength();
if (0 == hTlvLength) {
log.debug("Warning: invalid length in tlv of OptionalTlv list");
continue;
}
cb.writeShort(hTlvType);
cb.writeShort(hTlvLength);
switch (hTlvType) {
//TODO: optional TLV for LSPA to be added
default:
log.debug("Warning: PcepLspaObject: unknown tlv");
}
// As per RFC the length of object should
// be multiples of 4
int pad = hTlvLength % 4;
if (0 < pad) {
pad = 4 - pad;
if (pad <= cb.readableBytes()) {
cb.skipBytes(pad);
}
}
}
return true;
}
/**
* builder class for PCEP lspa object.
*/
public static class Builder implements PcepLspaObject.Builder {
private boolean bIsHeaderSet = false;
private PcepObjectHeader lspaObjHeader;
private boolean bLFlag;
private int iExcludeAny;
private boolean bIsExcludeAnySet = false;
private int iIncludeAny;
private boolean bIsIncludeAnySet = false;
private int iIncludeAll;
private boolean bIsIncludeAllSet = false;
private byte cSetupPriority;
private boolean bIsSetupPrioritySet = false;
private byte cHoldPriority;
private boolean bIsHoldPrioritySet = false;
private LinkedList<PcepValueType> llOptionalTlv;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepLspaObject build() throws PcepParseException {
PcepObjectHeader lspaObjHeader = this.bIsHeaderSet ? this.lspaObjHeader : DEFAULT_LSPA_OBJECT_HEADER;
if (!this.bIsExcludeAnySet) {
throw new PcepParseException("ExcludeAny NOT Set while building PcepLspaObject.");
}
if (!this.bIsIncludeAnySet) {
throw new PcepParseException("IncludeAny NOT Set while building PcepLspaObject.");
}
if (!this.bIsIncludeAllSet) {
throw new PcepParseException("IncludeAll NOT Set while building PcepLspaObject.");
}
if (!this.bIsSetupPrioritySet) {
throw new PcepParseException("Setup Priority NOT Set while building PcepLspaObject.");
}
if (!this.bIsHoldPrioritySet) {
throw new PcepParseException("Hold Priority NOT Set while building PcepLspaObject.");
}
if (bIsPFlagSet) {
lspaObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
lspaObjHeader.setIFlag(bIFlag);
}
return new PcepLspaObjectVer1(lspaObjHeader, bLFlag, iExcludeAny, iIncludeAny, iIncludeAll, cSetupPriority,
cHoldPriority, llOptionalTlv);
}
@Override
public PcepObjectHeader getLspaObjHeader() {
return this.lspaObjHeader;
}
@Override
public Builder setLspaObjHeader(PcepObjectHeader obj) {
this.lspaObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public boolean getLFlag() {
return this.bLFlag;
}
@Override
public Builder setLFlag(boolean value) {
this.bLFlag = value;
return this;
}
@Override
public int getExcludeAny() {
return this.iExcludeAny;
}
@Override
public Builder setExcludeAny(int value) {
this.iExcludeAny = value;
this.bIsExcludeAnySet = true;
return this;
}
@Override
public int getIncludeAny() {
return this.iIncludeAny;
}
@Override
public Builder setIncludeAny(int value) {
this.iIncludeAny = value;
this.bIsIncludeAnySet = true;
return this;
}
@Override
public int getIncludeAll() {
return this.iIncludeAll;
}
@Override
public Builder setIncludeAll(int value) {
this.iIncludeAll = value;
this.bIsIncludeAllSet = true;
return this;
}
@Override
public byte getSetupPriority() {
return this.cSetupPriority;
}
@Override
public Builder setSetupPriority(byte value) {
this.cSetupPriority = value;
this.bIsSetupPrioritySet = true;
return this;
}
@Override
public byte getHoldPriority() {
return this.cHoldPriority;
}
@Override
public Builder setHoldPriority(byte value) {
this.cHoldPriority = value;
this.bIsHoldPrioritySet = true;
return this;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@Override
public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
return this;
}
@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 void print() {
log.debug("LSPA OBJECT");
long lTemp = flags & 0xFF;
lTemp = (bLFlag) ? 1 : 0;
log.debug("l Flag: " + lTemp);
lTemp = cSetupPriority & 0xFF;
log.debug("SetupPriority: " + lTemp);
lTemp = cHoldPriority & 0xFF;
log.debug("HoldPriority: " + lTemp);
lTemp = iIncludeAll & 0xFFFFFFFF;
log.debug("IncludeAll: " + lTemp);
lTemp = iIncludeAny & 0xFFFFFFFF;
log.debug("IncludeAny: " + lTemp);
lTemp = iExcludeAny & 0xFFFFFFFF;
log.debug("iExcludeAny: " + lTemp);
log.debug("OPTIONAL TLV:");
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("L flag", bLFlag)
.add("Setup priority", cSetupPriority)
.add("hold priority", cHoldPriority)
.add("Include all", iIncludeAll)
.add("Include any", iIncludeAny)
.add("Exclude any", iExcludeAny)
.add("List of optional tlv", llOptionalTlv)
.toString();
}
}

View File

@ -0,0 +1,122 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepFactories;
import org.onosproject.pcepio.protocol.PcepMessage;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.types.PcepErrorDetailInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class PcepMessageVer1 {
protected static final Logger log = LoggerFactory.getLogger(PcepFactories.class);
// version: 1.0
static final byte WIRE_VERSION = 1;
static final int MINIMUM_LENGTH = 4;
static final int PACKET_VERSION = 1;
static final byte OPEN_MSG_TYPE = 0x1;
static final byte KEEPALIVE_MSG_TYPE = 0x2;
static final byte REPORT_MSG_TYPE = 0xa;
static final byte TE_REPORT_MSG_TYPE = 0xe;
static final byte UPDATE_MSG_TYPE = 0xb;
static final byte INITIATE_MSG_TYPE = 0xc;
static final byte CLOSE_MSG_TYPE = 0x7;
static final byte ERROR_MSG_TYPE = 0x6;
static final byte LABEL_UPDATE_MSG_TYPE = 0xD;
public static final int SHIFT_FLAG = 5;
static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
public static final PcepMessageVer1.Reader READER = new Reader();
static class Reader implements PcepMessageReader<PcepMessage> {
@Override
public PcepMessage readFrom(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < MINIMUM_LENGTH) {
throw new PcepParseException("Packet should have minimum length: " + MINIMUM_LENGTH);
}
try {
int start = cb.readerIndex();
// fixed value property version == 1
byte version = cb.readByte();
version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
if (version != (byte) PACKET_VERSION) {
throw new PcepParseException("Wrong version. Expected=PcepVersion.Message_1(1), got=" + version);
}
byte type = cb.readByte();
short length = cb.readShort();
cb.readerIndex(start);
switch (type) {
case OPEN_MSG_TYPE:
log.debug("OPEN MESSAGE is received");
// message type value 1 means it is open message
// return
// TODO: Read open message from channel buffer.
case KEEPALIVE_MSG_TYPE:
log.debug("KEEPALIVE MESSAGE is received");
// message type value 2 means it is Keepalive message
return PcepKeepaliveMsgVer1.READER.readFrom(cb.readBytes(length));
case ERROR_MSG_TYPE:
log.debug("ERROR MESSAGE is received");
// message type value 6 means it is error message
// return
// TODO: Read Error message from channel buffer.
case REPORT_MSG_TYPE:
log.debug("REPORT MESSAGE is received");
// message type value 10 means it is Report message
// return
// TODO: Read Report message from channel buffer.
case UPDATE_MSG_TYPE:
log.debug("UPDATE MESSAGE is received");
//message type value 11 means it is Update message
return PcepUpdateMsgVer1.READER.readFrom(cb.readBytes(length));
case INITIATE_MSG_TYPE:
log.debug("INITIATE MESSAGE is received");
//message type value 12 means it is PcInitiate message
return PcepInitiateMsgVer1.READER.readFrom(cb.readBytes(length));
case CLOSE_MSG_TYPE:
log.debug("CLOSE MESSAGE is received");
// message type value 7 means it is Close message
return PcepCloseMsgVer1.READER.readFrom(cb.readBytes(length));
case TE_REPORT_MSG_TYPE:
log.debug("TE REPORT MESSAGE is received");
// message type value 14 means it is TE REPORT message
// return
// TODO: Read TE Report message from channel buffer.
case LABEL_UPDATE_MSG_TYPE:
log.debug("LABEL UPDATE MESSAGE is received");
// message type value 13 means it is LABEL UPDATE message
// return
// TODO: Read Label update message from channel buffer.
default:
throw new PcepParseException("ERROR: UNKNOWN MESSAGE is received. Msg Type: " + type);
}
} catch (IndexOutOfBoundsException e) {
throw new PcepParseException(PcepErrorDetailInfo.ERROR_TYPE_1, PcepErrorDetailInfo.ERROR_VALUE_1);
}
}
}
}

View File

@ -0,0 +1,387 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepMetricObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
METRIC Object Body Format.
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Flags |C|B| T |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| metric-value |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
public class PcepMetricObjectVer1 implements PcepMetricObject {
protected static final Logger log = LoggerFactory.getLogger(PcepMetricObjectVer1.class);
public static final byte METRIC_OBJ_TYPE = 1;
public static final byte METRIC_OBJ_CLASS = 6;
public static final byte METRIC_OBJECT_VERSION = 1;
public static final short METRIC_OBJ_MINIMUM_LENGTH = 12;
public static final int OBJECT_HEADER_LENGTH = 4;
public static final int IFLAG_SHIFT_VALUE = 9;
public static final int BTYPE_SHIFT_VALUE = 8;
public static final int CFLAG_SET = 1;
public static final int CFLAG_RESET = 0;
public static final int BFLAG_SET = 1;
public static final int BFLAG_RESET = 0;
public static final byte CFLAG_CHECK = 0x02;
static final PcepObjectHeader DEFAULT_METRIC_OBJECT_HEADER = new PcepObjectHeader(METRIC_OBJ_CLASS,
METRIC_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
METRIC_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader metricObjHeader;
private int iMetricVal;
private byte yFlag; // 6-flags
private boolean bCFlag;
private boolean bBFlag;
private byte bType;
/**
* Default constructor.
*/
public PcepMetricObjectVer1() {
this.metricObjHeader = null;
this.iMetricVal = 0;
this.yFlag = 0;
this.bCFlag = false;
this.bBFlag = false;
this.bType = 0;
}
/**
* Constructor to initialize all member variables.
*
* @param metricObjHeader metric object header
* @param iMetricVal metric value
* @param yFlag Y flag
* @param bCFlag C flag
* @param bBFlag B flag
* @param bType Type value
*/
public PcepMetricObjectVer1(PcepObjectHeader metricObjHeader, int iMetricVal, byte yFlag, boolean bCFlag,
boolean bBFlag, byte bType) {
this.metricObjHeader = metricObjHeader;
this.iMetricVal = iMetricVal;
this.yFlag = yFlag;
this.bCFlag = bCFlag;
this.bBFlag = bBFlag;
this.bType = bType;
}
@Override
public void setMetricVal(int value) {
this.iMetricVal = value;
}
@Override
public int getMetricVal() {
return this.iMetricVal;
}
@Override
public byte getYFlag() {
return this.yFlag;
}
@Override
public void setYFlag(byte value) {
this.yFlag = value;
}
@Override
public boolean getCFlag() {
return this.bCFlag;
}
@Override
public void setCFlag(boolean value) {
this.bCFlag = value;
}
@Override
public boolean getBFlag() {
return this.bBFlag;
}
@Override
public void setBFlag(boolean value) {
this.bBFlag = value;
}
@Override
public byte getBType() {
return this.bType;
}
@Override
public void setBType(byte value) {
this.bType = value;
}
/**
* Sets metric Object Header.
*
* @param obj metric object header
*/
public void setMetricObjHeader(PcepObjectHeader obj) {
this.metricObjHeader = obj;
}
/**
* Returns metric Object Header.
*
* @return metricObjHeader
*/
public PcepObjectHeader getMetricObjHeader() {
return this.metricObjHeader;
}
/**
* Reads from channel buffer and returns object of PcepMetricObject.
*
* @param cb of channel buffer.
* @return object of PcepMetricObject
* @throws PcepParseException when metric object is not present in channel buffer
*/
public static PcepMetricObject read(ChannelBuffer cb) throws PcepParseException {
log.debug("MetricObject::read");
PcepObjectHeader metricObjHeader;
int iMetricVal;
byte yFlag; // 6-flags
boolean bCFlag;
boolean bBFlag;
byte bType;
metricObjHeader = PcepObjectHeader.read(cb);
if (metricObjHeader.getObjClass() != METRIC_OBJ_CLASS) {
throw new PcepParseException("This object is not a Metric Object. Object Class: "
+ metricObjHeader.getObjClass());
}
//take only metric buffer.
ChannelBuffer tempCb = cb.readBytes(metricObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
tempCb.readShort();
yFlag = tempCb.readByte();
bType = tempCb.readByte();
bCFlag = (yFlag & CFLAG_CHECK) == CFLAG_CHECK ? true : false;
bBFlag = (yFlag & BFLAG_SET) == BFLAG_SET ? true : false;
iMetricVal = tempCb.readInt();
return new PcepMetricObjectVer1(metricObjHeader, iMetricVal, yFlag, bCFlag, bBFlag, bType);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
//write Object header
int objStartIndex = cb.writerIndex();
int objLenIndex = metricObjHeader.write(cb);
if (objLenIndex <= 0) {
throw new PcepParseException("Error: ObjectLength is " + objLenIndex);
}
int iFlag = (bCFlag) ? CFLAG_SET : CFLAG_RESET;
int iTemp = iFlag << IFLAG_SHIFT_VALUE;
iFlag = (bBFlag) ? BFLAG_SET : BFLAG_RESET;
iTemp = iTemp | (iFlag << BTYPE_SHIFT_VALUE);
iTemp = iTemp | bType;
cb.writeInt(iTemp);
cb.writeInt(iMetricVal);
short hLength = (short) (cb.writerIndex() - objStartIndex);
cb.setShort(objLenIndex, hLength);
//will be helpful during print().
metricObjHeader.setObjLen(hLength);
return hLength;
}
/**
* Builder class for PCEP metric object.
*/
public static class Builder implements PcepMetricObject.Builder {
private boolean bIsHeaderSet = false;
private PcepObjectHeader metricObjHeader;
private int iMetricVal;
private boolean bIsMetricValSet = false;
private byte yFlag; // 6-flags
private boolean bCFlag;
private boolean bBFlag;
private byte bType;
private boolean bIsbTypeSet = false;
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepMetricObject build() throws PcepParseException {
PcepObjectHeader metricObjHeader = this.bIsHeaderSet ? this.metricObjHeader : DEFAULT_METRIC_OBJECT_HEADER;
if (!this.bIsMetricValSet) {
throw new PcepParseException(" Metric Value NOT Set while building PcepMetricObject.");
}
if (!this.bIsbTypeSet) {
throw new PcepParseException(" Type NOT Set while building PcepMetricObject.");
}
if (bIsPFlagSet) {
metricObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
metricObjHeader.setIFlag(bIFlag);
}
return new PcepMetricObjectVer1(metricObjHeader, iMetricVal, yFlag, bCFlag, bBFlag, bType);
}
@Override
public PcepObjectHeader getMetricObjHeader() {
return this.metricObjHeader;
}
@Override
public Builder setMetricObjHeader(PcepObjectHeader obj) {
this.metricObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public int getMetricVal() {
return this.iMetricVal;
}
@Override
public Builder setMetricVal(int value) {
this.iMetricVal = value;
this.bIsMetricValSet = true;
return this;
}
@Override
public byte getYFlag() {
return this.yFlag;
}
@Override
public Builder setYFlag(byte value) {
this.yFlag = value;
return this;
}
@Override
public boolean getCFlag() {
return this.bCFlag;
}
@Override
public Builder setCFlag(boolean value) {
this.bCFlag = value;
return this;
}
@Override
public boolean getBFlag() {
return this.bBFlag;
}
@Override
public Builder setBFlag(boolean value) {
this.bBFlag = value;
return this;
}
@Override
public byte getBType() {
return this.bType;
}
@Override
public Builder setBType(byte value) {
this.bType = value;
this.bIsbTypeSet = true;
return this;
}
@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 void print() {
log.debug("METRIC OBJECT");
long lTemp = iMetricVal & 0xFFFFFFFF;
log.debug("iMetricVal: " + lTemp);
lTemp = (bBFlag) ? 1 : 0;
log.debug("B Flag: " + lTemp);
lTemp = (bCFlag) ? 1 : 0;
log.debug("C Flag: " + lTemp);
lTemp = bType & 0xFF;
log.debug("Type: " + lTemp);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Metric value", iMetricVal)
.add("B flag", bBFlag)
.add("C flag", bCFlag)
.add("B-type", bType)
.toString();
}
}

View File

@ -0,0 +1,180 @@
package org.onosproject.pcepio.protocol.ver1;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepAttribute;
import org.onosproject.pcepio.protocol.PcepEroObject;
import org.onosproject.pcepio.protocol.PcepMsgPath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PCEP Message PAth for update message.
* Reference :PCE extensions for stateful draft-ietf-pce-stateful-pce-10.
*/
public class PcepMsgPathVer1 implements PcepMsgPath {
/*
* <path> ::= <ERO><attribute-list>
*/
protected static final Logger log = LoggerFactory.getLogger(PcepMsgPathVer1.class);
//PcepEroObject
private PcepEroObject eroObj;
private boolean isEroObjectSet;
// PcepAttribute
private PcepAttribute attrList;
private boolean isAttributeListSet;
/**
* constructor to initialize objects.
*/
public PcepMsgPathVer1() {
eroObj = null;
attrList = null;
isEroObjectSet = false;
isAttributeListSet = false;
}
@Override
public PcepEroObject getEroObject() {
return eroObj;
}
@Override
public PcepAttribute getPcepAttribute() {
return attrList;
}
@Override
public void setEroObject(PcepEroObject eroObj) {
this.eroObj = eroObj;
}
@Override
public void setPcepAttribute(PcepAttribute attrList) {
this.attrList = attrList;
}
/**
* constructor to initialize member variables.
*
* @param eroObj pcep ero object
* @param attrList pcep attribute
*/
public PcepMsgPathVer1(PcepEroObject eroObj, PcepAttribute attrList) {
this.eroObj = eroObj;
isEroObjectSet = true;
this.attrList = attrList;
if (attrList == null) {
isAttributeListSet = false;
} else {
isAttributeListSet = true;
}
}
@Override
public PcepMsgPath read(ChannelBuffer cb) throws PcepParseException {
PcepEroObject eroObj;
PcepAttribute attrList;
eroObj = PcepEroObjectVer1.read(cb);
attrList = PcepAttributeVer1.read(cb);
return new PcepMsgPathVer1(eroObj, attrList);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
int iLenStartIndex = cb.writerIndex();
//write Object header
if (this.isEroObjectSet) {
this.eroObj.write(cb);
}
if (this.isAttributeListSet) {
attrList.write(cb);
}
return cb.writerIndex() - iLenStartIndex;
}
/**
* builder class for PCEP Message path.
*/
public static class Builder implements PcepMsgPath.Builder {
private boolean bIsEROObjectSet = false;
private boolean bIsPcepAttributeSet = false;
//PCEP ERO Object
private PcepEroObject eroObject;
//PCEP Attribute list
private PcepAttribute pcepAttribute;
@Override
public PcepMsgPath build() throws PcepParseException {
//PCEP ERO Object
PcepEroObject eroObject = null;
//PCEP Attribute list
PcepAttribute pcepAttribute = null;
if (!this.bIsEROObjectSet) {
throw new PcepParseException("ERO Object NOT Set while building PcepMsgPath.");
} else {
eroObject = this.eroObject;
}
if (!this.bIsPcepAttributeSet) {
throw new PcepParseException("Pcep Attributes NOT Set while building PcepMsgPath.");
} else {
pcepAttribute = this.pcepAttribute;
}
return new PcepMsgPathVer1(eroObject, pcepAttribute);
}
@Override
public PcepEroObject getEroObject() {
return this.eroObject;
}
@Override
public PcepAttribute getPcepAttribute() {
return this.pcepAttribute;
}
@Override
public Builder setEroObject(PcepEroObject eroObject) {
this.eroObject = eroObject;
this.bIsEROObjectSet = true;
return this;
}
@Override
public Builder setPcepAttribute(PcepAttribute pcepAttribute) {
this.pcepAttribute = pcepAttribute;
this.bIsPcepAttributeSet = true;
return this;
}
}
@Override
public void print() {
log.debug("PcepMsgPath");
eroObj.print();
attrList.print();
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("ERO object", eroObj)
.add("Attribute list", attrList)
.toString();
}
}

View File

@ -0,0 +1,403 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.onosproject.pcepio.types.PcepObjectHeader;
import org.onosproject.pcepio.types.PcepValueType;
import org.onosproject.pcepio.types.SymbolicPathNameTlv;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
public class PcepSrpObjectVer1 implements PcepSrpObject {
/*
* ref : draft-ietf-pce-stateful-pce-10, section : 7.2
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags |R|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SRP-ID-number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Optional TLVs //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(PcepSrpObjectVer1.class);
public static final byte SRP_OBJ_TYPE = 1;
public static final byte SRP_OBJ_CLASS = 33;
public static final byte SRP_OBJECT_VERSION = 1;
public static final short SRP_OBJ_MINIMUM_LENGTH = 12;
public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
public static final boolean DEFAULT_RFLAG = false;
static final PcepObjectHeader DEFAULT_SRP_OBJECT_HEADER = new PcepObjectHeader(SRP_OBJ_CLASS, SRP_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, SRP_OBJ_MINIMUM_LENGTH);
private PcepObjectHeader srpObjHeader;
private static int flags;
private boolean bRFlag;
private int srpId;
//Optional TLV
private LinkedList<PcepValueType> llOptionalTlv;
public static final byte BBIT_SET = 1;
public static final byte BBIT_RESET = 0;
/**
* Constructor to initialize member variables.
*
* @param srpObjHeader srp object header
* @param bRFlag R flag
* @param srpID srp Id
* @param llOptionalTlv list of optional tlv
*/
public PcepSrpObjectVer1(PcepObjectHeader srpObjHeader, boolean bRFlag, int srpID,
LinkedList<PcepValueType> llOptionalTlv) {
this.srpObjHeader = srpObjHeader;
this.bRFlag = bRFlag;
this.srpId = srpID;
this.llOptionalTlv = llOptionalTlv;
}
/**
* sets the SRP object header.
*
* @param obj srp object header
*/
public void setSrpObjHeader(PcepObjectHeader obj) {
this.srpObjHeader = obj;
}
@Override
public void setSrpID(int srpID) {
this.srpId = srpID;
}
@Override
public void setRFlag(boolean bRFlag) {
this.bRFlag = bRFlag;
}
/**
* Returns SRP object header.
*
* @return srpObjHeader
*/
public PcepObjectHeader getSrpObjHeader() {
return this.srpObjHeader;
}
@Override
public int getSrpID() {
return this.srpId;
}
@Override
public boolean getRFlag() {
return this.bRFlag;
}
@Override
public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
/**
* Reads from channel buffer and returns instance of PCEP SRP object.
*
* @param cb of channel buffer.
* @return PCEP SRP object
* @throws PcepParseException when srp object is not received in channel buffer
*/
public static PcepSrpObject read(ChannelBuffer cb) throws PcepParseException {
log.debug("SrpObject::read");
PcepObjectHeader srpObjHeader;
boolean bRFlag;
int srpID;
int flags;
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
srpObjHeader = PcepObjectHeader.read(cb);
if (SRP_OBJ_CLASS != srpObjHeader.getObjClass()) {
throw new PcepParseException("SRP object expected. But received " + srpObjHeader.getObjClass());
}
//take only SrpObject buffer.
ChannelBuffer tempCb = cb.readBytes(srpObjHeader.getObjLen() - MINIMUM_COMMON_HEADER_LENGTH);
flags = tempCb.readInt();
bRFlag = (0 < flags) ? true : false;
srpID = tempCb.readInt();
llOptionalTlv = parseOptionalTlv(tempCb);
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, srpID, llOptionalTlv);
}
@Override
public int write(ChannelBuffer cb) throws PcepParseException {
int objStartIndex = cb.writerIndex();
//write common header
int objLenIndex = srpObjHeader.write(cb);
//write Flags
byte bFlag;
bFlag = (bRFlag) ? BBIT_SET : BBIT_RESET;
cb.writeInt(bFlag);
//write SrpId
cb.writeInt(srpId);
// Add optional TLV
if (!packOptionalTlv(cb)) {
throw new PcepParseException("Failed to write srp tlv to channel buffer.");
}
//now write SRP Object Length
cb.setShort(objLenIndex, (short) (cb.writerIndex() - objStartIndex));
return cb.writerIndex();
}
/**
* Parse Optional TLvs from the channel buffer.
*
* @param cb of type channel buffer
* @return list of optional tlvs
* @throws PcepParseException when unsupported tlv is received in srp object
*/
public static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llOutOptionalTlv = new LinkedList<PcepValueType>();
while (MINIMUM_COMMON_HEADER_LENGTH <= cb.readableBytes()) {
PcepValueType tlv;
short hType = cb.readShort();
short hLength = cb.readShort();
switch (hType) {
case SymbolicPathNameTlv.TYPE:
tlv = SymbolicPathNameTlv.read(cb, hLength);
cb.skipBytes(hLength);
break;
default:
throw new PcepParseException("Unsupported TLV received in SRP Object.");
}
// Check for the padding
int pad = hLength % 4;
if (0 < pad) {
pad = 4 - pad;
if (pad <= cb.readableBytes()) {
cb.skipBytes(pad);
}
}
llOutOptionalTlv.add(tlv);
}
return llOutOptionalTlv;
}
/**
* Writes optional tlvs to channel buffer.
*
* @param cb of type channel buffer
* @return true if writing optional tlv to channel buffer is success.
*/
protected boolean packOptionalTlv(ChannelBuffer cb) {
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
PcepValueType tlv = listIterator.next();
if (null == tlv) {
log.debug("tlv is null from OptionalTlv list");
continue;
}
tlv.write(cb);
// need to take care of padding
int pad = tlv.getLength() % 4;
if (0 != pad) {
pad = 4 - pad;
for (int i = 0; i < pad; ++i) {
cb.writeByte((byte) 0);
}
}
}
return true;
}
/**
* builder class for PCEP srp Object.
*/
public static class Builder implements PcepSrpObject.Builder {
private boolean bIsHeaderSet = false;
private boolean bIsSrpIdset = false;
private boolean bIsRFlagSet = false;
private PcepObjectHeader srpObjHeader;
private int srpId;
private boolean bRFlag;
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
private boolean bIsPFlagSet = false;
private boolean bPFlag;
private boolean bIsIFlagSet = false;
private boolean bIFlag;
@Override
public PcepSrpObject build() throws PcepParseException {
PcepObjectHeader srpObjHeader = this.bIsHeaderSet ? this.srpObjHeader : DEFAULT_SRP_OBJECT_HEADER;
boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : DEFAULT_RFLAG;
if (!this.bIsSrpIdset) {
throw new PcepParseException("SrpID not set while building SRP Object.");
}
if (bIsPFlagSet) {
srpObjHeader.setPFlag(bPFlag);
}
if (bIsIFlagSet) {
srpObjHeader.setIFlag(bIFlag);
}
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, this.srpId, this.llOptionalTlv);
}
@Override
public PcepObjectHeader getSrpObjHeader() {
return this.srpObjHeader;
}
@Override
public Builder setSrpObjHeader(PcepObjectHeader obj) {
this.srpObjHeader = obj;
this.bIsHeaderSet = true;
return this;
}
@Override
public int getSrpID() {
return this.srpId;
}
@Override
public Builder setSrpID(int srpID) {
this.srpId = srpID;
this.bIsSrpIdset = true;
return this;
}
@Override
public boolean getRFlag() {
return this.bRFlag;
}
@Override
public Builder setRFlag(boolean bRFlag) {
this.bRFlag = bRFlag;
this.bIsRFlagSet = true;
return this;
}
@Override
public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
return this;
}
@Override
public LinkedList<PcepValueType> getOptionalTlv() {
return this.llOptionalTlv;
}
@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 void print() {
log.debug("SRP OBJECT");
long lTemp = (bRFlag) ? 1 : 0;
log.debug("r Flag: " + lTemp);
log.debug("SrpID: " + srpId);
log.debug("OPTIONAL TLV");
ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("R flag", bRFlag)
.add("SRP ID", srpId)
.add("Optional tlv list", llOptionalTlv)
.toString();
}
}

View File

@ -0,0 +1,308 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepMessageWriter;
import org.onosproject.pcepio.protocol.PcepMsgPath;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.onosproject.pcepio.protocol.PcepType;
import org.onosproject.pcepio.protocol.PcepUpdateMsg;
import org.onosproject.pcepio.protocol.PcepUpdateRequest;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* PCEP Update Message: A Path Computation LSP Update Request message
* (also referred to as PCUpd message) is a PCEP message sent by a PCE
* to a PCC to update attributes of an LSP.
*/
class PcepUpdateMsgVer1 implements PcepUpdateMsg {
// Pcep version: 1
/* The format of the PCUpd message is as follows:
* <PCUpd Message> ::= <Common Header>
* <update-request-list>
* Where:
* <update-request-list> ::= <update-request>[<update-request-list>]
* <update-request> ::= <SRP>
* <LSP>
* <path>
* Where:
* <path> ::= <ERO><attribute-list>
* Where:
* <attribute-list> is defined in [RFC5440] and extended by PCEP extensions.
* where:
* <attribute-list> ::=[<LSPA>]
* [<BANDWIDTH>]
* [<metric-list>]
* [<IRO>]
* <metric-list> ::=<METRIC>[<metric-list>]
*
* 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
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Ver | Flags | Message-Type | Message-Length |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | |
* // UPDATE REQUEST LIST //
* | |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
* Reference:Internet-Draft-PCEP Extensions-for-Stateful-PCE-10
*/
protected static final Logger log = LoggerFactory.getLogger(PcepUpdateMsgVer1.class);
public static final byte PACKET_VERSION = 1;
// UpdateMsgMinLength = SrpObjMinLentgh(12)+LspObjMinLength(8)+EroObjMinLength(12)+ CommonHeaderLength(4)
public static final short PACKET_MINIMUM_LENGTH = 36;
public static final PcepType MSG_TYPE = PcepType.UPDATE;
//Update Request List
private LinkedList<PcepUpdateRequest> llUpdateRequestList;
public static final PcepUpdateMsgVer1.Reader READER = new Reader();
//Reader reads UpdateMessage from the channel.
static class Reader implements PcepMessageReader<PcepUpdateMsg> {
LinkedList<PcepUpdateRequest> llUpdateRequestList;
@Override
public PcepUpdateMsg readFrom(ChannelBuffer cb) throws PcepParseException {
if (cb.readableBytes() < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Readable bytes is less than update message minimum length");
}
llUpdateRequestList = new LinkedList<PcepUpdateRequest>();
// fixed value property version == 1
byte version = cb.readByte();
version = (byte) (version >> PcepMessageVer1.SHIFT_FLAG);
if (version != PACKET_VERSION) {
throw new PcepParseException("Wrong version. Expected=PcepVersion.PCEP_1(1), got=" + version);
}
// fixed value property type == 11
byte type = cb.readByte();
if (type != MSG_TYPE.getType()) {
throw new PcepParseException("Wrong type. Expected=PcepType.UPDATE(11), got=" + type);
}
short length = cb.readShort();
if (length < PACKET_MINIMUM_LENGTH) {
throw new PcepParseException("Wrong length. Expected to be >= " + PACKET_MINIMUM_LENGTH + ", was: "
+ length);
}
log.debug("reading update message of length " + length);
// parse Update Request list
if (!parseUpdateRequestList(cb)) {
throw new PcepParseException("parsing Update Request List Failed.");
}
return new PcepUpdateMsgVer1(llUpdateRequestList);
}
/**
* Parse update request list.
*
* @param cb of type channel buffer
* @return true after parsing Update Request List
* @throws PcepParseException while parsing update request list from channel buffer
*/
public boolean parseUpdateRequestList(ChannelBuffer cb) throws PcepParseException {
/* <update-request-list>
* Where:
* <update-request-list> ::= <update-request>[<update-request-list>]
* <update-request> ::= <SRP>
* <LSP>
* <path>
* Where:
* <path> ::= <ERO><attribute-list>
* Where:
* <attribute-list> is defined in [RFC5440] and extended by PCEP extensions.
*/
while (0 < cb.readableBytes()) {
PcepUpdateRequest pceUpdateReq = new PcepUpdateRequestVer1();
//Read SRP Object and Store it.
PcepSrpObject srpObj;
srpObj = PcepSrpObjectVer1.read(cb);
pceUpdateReq.setSrpObject(srpObj);
//Read LSP object and Store it.
PcepLspObject lspObj;
lspObj = PcepLspObjectVer1.read(cb);
pceUpdateReq.setLspObject(lspObj);
// Read Msg Path and store it.
PcepMsgPath msgPath = new PcepMsgPathVer1().read(cb);
pceUpdateReq.setMsgPath(msgPath);
llUpdateRequestList.add(pceUpdateReq);
}
return true;
}
}
/**
* Constructor to initialize llUpdateRequestList.
*
* @param llUpdateRequestList list of PcepUpdateRequest.
*/
PcepUpdateMsgVer1(LinkedList<PcepUpdateRequest> llUpdateRequestList) {
this.llUpdateRequestList = llUpdateRequestList;
}
/**
* builder class for PCPE update message.
*/
static class Builder implements PcepUpdateMsg.Builder {
// PCEP report message fields
LinkedList<PcepUpdateRequest> llUpdateRequestList;
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return PcepType.UPDATE;
}
@Override
public PcepUpdateMsg build() {
return new PcepUpdateMsgVer1(this.llUpdateRequestList);
}
@Override
public LinkedList<PcepUpdateRequest> getUpdateRequestList() {
return this.llUpdateRequestList;
}
@Override
public Builder setUpdateRequestList(LinkedList<PcepUpdateRequest> llUpdateRequestList) {
this.llUpdateRequestList = llUpdateRequestList;
return this;
}
}
@Override
public void writeTo(ChannelBuffer cb) throws PcepParseException {
WRITER.write(cb, this);
}
static final Writer WRITER = new Writer();
//Writer writes UpdateMessage to the channel buffer.
static class Writer implements PcepMessageWriter<PcepUpdateMsgVer1> {
@Override
public void write(ChannelBuffer cb, PcepUpdateMsgVer1 message) throws PcepParseException {
int startIndex = cb.writerIndex();
// first 3 bits set to version
cb.writeByte((byte) (PACKET_VERSION << PcepMessageVer1.SHIFT_FLAG));
// message type
cb.writeByte(MSG_TYPE.getType());
/* length is length of variable message, will be updated at the end
* Store the position of message
* length in buffer
*/
int msgLenIndex = cb.writerIndex();
cb.writeShort((short) 0);
ListIterator<PcepUpdateRequest> listIterator = message.llUpdateRequestList.listIterator();
while (listIterator.hasNext()) {
PcepUpdateRequest updateReq = listIterator.next();
//SRP object is mandatory
PcepSrpObject srpObj = updateReq.getSrpObject();
srpObj.write(cb);
//LSP object is mandatory
PcepLspObject lspObj = updateReq.getLspObject();
lspObj.write(cb);
//PATH object is mandatory
PcepMsgPath msgPath = updateReq.getMsgPath();
msgPath.write(cb);
}
// update message length field
int length = cb.writerIndex() - startIndex;
cb.setShort(msgLenIndex, (short) length);
}
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public PcepType getType() {
return MSG_TYPE;
}
@Override
public LinkedList<PcepUpdateRequest> getUpdateRequestList() {
return this.llUpdateRequestList;
}
@Override
public void setUpdateRequestList(LinkedList<PcepUpdateRequest> llUpdateRequestList) {
this.llUpdateRequestList = llUpdateRequestList;
}
@Override
public void print() {
log.debug("PCEP UPDATE MESSAGE");
ListIterator<PcepUpdateRequest> listIterator = llUpdateRequestList.listIterator();
while (listIterator.hasNext()) {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Update Request list", llUpdateRequestList)
.toString();
}
}

View File

@ -0,0 +1,207 @@
/*
* Copyright 2015 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.pcepio.protocol.ver1;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepLspObject;
import org.onosproject.pcepio.protocol.PcepMsgPath;
import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.onosproject.pcepio.protocol.PcepUpdateRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
* PCEP Update Request List.
*/
public class PcepUpdateRequestVer1 implements PcepUpdateRequest {
/* <update-request-list>
* Where:
* <update-request-list> ::= <update-request>[<update-request-list>]
* <update-request> ::= <SRP>
* <LSP>
* <path>
* Where:
* <path> ::= <ERO><attribute-list>
* Where:
* <attribute-list> is defined in [RFC5440] and extended by PCEP extensions.
*/
protected static final Logger log = LoggerFactory.getLogger(PcepUpdateRequestVer1.class);
//PCEP SRP Object
private PcepSrpObject srpObject;
//PCEP LSP Object
private PcepLspObject lspObject;
//PCEP Message path
private PcepMsgPath msgPath;
/**
* Default constructor.
*/
public PcepUpdateRequestVer1() {
srpObject = null;
lspObject = null;
msgPath = null;
}
/**
* Constructor to initialize all member variables.
*
* @param srpObject srp object
* @param lspObject lsp object
* @param msgPath message path object
*/
public PcepUpdateRequestVer1(PcepSrpObject srpObject, PcepLspObject lspObject, PcepMsgPath msgPath) {
this.srpObject = srpObject;
this.lspObject = lspObject;
this.msgPath = msgPath;
}
@Override
public PcepSrpObject getSrpObject() {
return srpObject;
}
@Override
public PcepLspObject getLspObject() {
return lspObject;
}
@Override
public PcepMsgPath getMsgPath() {
return msgPath;
}
@Override
public void setSrpObject(PcepSrpObject srpObject) {
this.srpObject = srpObject;
}
@Override
public void setLspObject(PcepLspObject lspObject) {
this.lspObject = lspObject;
}
@Override
public void setMsgPath(PcepMsgPath msgPath) {
this.msgPath = msgPath;
}
/**
* Builder class for PCEP update request.
*/
public static class Builder implements PcepUpdateRequest.Builder {
private boolean bIsSRPObjectSet = false;
private boolean bIsLSPObjectSet = false;
private boolean bIsPcepMsgPathSet = false;
//PCEP SRP Object
private PcepSrpObject srpObject;
//PCEP LSP Object
private PcepLspObject lspObject;
//PCEP Attribute list
private PcepMsgPath msgPath;
@Override
public PcepUpdateRequest build() throws PcepParseException {
//PCEP SRP Object
PcepSrpObject srpObject = null;
//PCEP LSP Object
PcepLspObject lspObject = null;
//PCEP Attribute list
PcepMsgPath msgPath = null;
if (!this.bIsSRPObjectSet) {
throw new PcepParseException(" SRP Object NOT Set while building PcepUpdateRequest.");
} else {
srpObject = this.srpObject;
}
if (!this.bIsLSPObjectSet) {
throw new PcepParseException(" LSP Object NOT Set while building PcepUpdateRequest.");
} else {
lspObject = this.lspObject;
}
if (!this.bIsPcepMsgPathSet) {
throw new PcepParseException(" Msg Path NOT Set while building PcepUpdateRequest.");
} else {
msgPath = this.msgPath;
}
return new PcepUpdateRequestVer1(srpObject, lspObject, msgPath);
}
@Override
public PcepSrpObject getSrpObject() {
return this.srpObject;
}
@Override
public PcepLspObject getLspObject() {
return this.lspObject;
}
@Override
public PcepMsgPath getMsgPath() {
return this.msgPath;
}
@Override
public Builder setSrpObject(PcepSrpObject srpobj) {
this.srpObject = srpobj;
this.bIsSRPObjectSet = true;
return this;
}
@Override
public Builder setLspObject(PcepLspObject lspObject) {
this.lspObject = lspObject;
this.bIsLSPObjectSet = true;
return this;
}
@Override
public Builder setMsgPath(PcepMsgPath msgPath) {
this.msgPath = msgPath;
this.bIsPcepMsgPathSet = true;
return this;
}
}
@Override
public void print() {
log.debug("UPDATE REQUEST");
srpObject.print();
lspObject.print();
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("SRP Object", srpObject)
.add("LSP object", lspObject)
.add("message path object", msgPath)
.toString();
}
}

View File

@ -0,0 +1,144 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides Autonomous System Tlv which contains opaque value (32 Bit AS Number).
*/
public class AutonomousSystemTlv implements PcepValueType {
/* Reference :RFC3209
* 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=[TBD10] | Length=4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| opaque value (32 Bit AS Number) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(AutonomousSystemTlv.class);
public static final short TYPE = 100; //TODD:change this TBD10
public static final short LENGTH = 4;
private final int rawValue;
/**
* constructor to initialize Autonomous system tlv value.
*
* @param rawValue value of Autonomous system tlv
*/
public AutonomousSystemTlv(int rawValue) {
this.rawValue = rawValue;
}
/**
* To create instance of AutonomousSystemTlv.
*
* @param raw opaque value ofc 32 Bit AS Number
* @return object of AutonomousSystemTlv
*/
public static AutonomousSystemTlv of(final int raw) {
return new AutonomousSystemTlv(raw);
}
/**
* Returns opaque value of 32 Bit AS Number.
*
* @return int value of rawValue
*/
public int getInt() {
return rawValue;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(rawValue);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof AutonomousSystemTlv) {
AutonomousSystemTlv other = (AutonomousSystemTlv) obj;
return Objects.equals(rawValue, other.rawValue);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
c.writeInt(rawValue);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns object of AutonomousSystemTlv.
*
* @param c type of channel buffer
* @return object of AutonomousSystemTlv
*/
public static AutonomousSystemTlv read(ChannelBuffer c) {
return AutonomousSystemTlv.of(c.readInt());
}
@Override
public void print() {
log.debug("AutonomousSystemTlv");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("Value: " + rawValue);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("TYPE", TYPE)
.add("Length", LENGTH)
.add("value", rawValue)
.toString();
}
}

View File

@ -10,14 +10,17 @@ import org.onosproject.pcepio.protocol.PcepOpenObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/*
* Provide the error object list with open object.
*/
public class ErrorObjListWithOpen {
//errorObjList is mandatory
LinkedList<PcepErrorObject> llerrorObjList;
private LinkedList<PcepErrorObject> llerrorObjList;
// openObject is optional
PcepOpenObject openObject;
private PcepOpenObject openObject;
// flag to check if open object is set or not
public boolean isOpenObjectSet;
protected static final Logger log = LoggerFactory.getLogger(ErrorObjListWithOpen.class);
@ -49,6 +52,11 @@ public class ErrorObjListWithOpen {
isOpenObjectSet = false;
}
/**
* Returns error type.
*
* @return error type
*/
public LinkedList<Integer> getErrorType() {
LinkedList<Integer> errorType = new LinkedList<Integer>();
if (llerrorObjList != null) {
@ -56,7 +64,7 @@ public class ErrorObjListWithOpen {
int error;
PcepErrorObject errorObj;
while (errObjListIterator.hasNext()) {
errorObj = errObjListIterator.next();
errorObj = errObjListIterator.next();
error = errorObj.getErrorType();
errorType.add(error);
}
@ -64,6 +72,11 @@ public class ErrorObjListWithOpen {
return errorType;
}
/**
* Returns error value.
*
* @return error value
*/
public LinkedList<Integer> getErrorValue() {
LinkedList<Integer> errorValue = new LinkedList<Integer>();
if (llerrorObjList != null) {
@ -71,7 +84,7 @@ public class ErrorObjListWithOpen {
int error;
PcepErrorObject errorObj;
while (errObjListIterator.hasNext()) {
errorObj = errObjListIterator.next();
errorObj = errObjListIterator.next();
error = errorObj.getErrorValue();
errorValue.add(error);
@ -79,7 +92,8 @@ public class ErrorObjListWithOpen {
}
return errorValue;
}
/*
/**
* Checks whether error object list is empty or not.
*
* @return whether error object list is empty or not
@ -90,7 +104,7 @@ public class ErrorObjListWithOpen {
return (!this.llerrorObjList.isEmpty()) ? true : false;
}
/*
/**
* Write Error Object List and Open Object to channel buffer.
*
* @param bb of type channel buffer
@ -121,7 +135,7 @@ public class ErrorObjListWithOpen {
return bb.writerIndex() - iLenStartIndex;
}
/*
/**
* Prints the attributes of ErrorObject List with open Object.
*/
public void print() {
@ -137,4 +151,19 @@ public class ErrorObjListWithOpen {
openObject.print();
}
}
@Override
public String toString() {
ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
if (openObject == null) {
toStrHelper
.add("error Obj List", llerrorObjList);
} else {
toStrHelper
.add("error Obj List", llerrorObjList)
.add("open Object", openObject);
}
return toStrHelper.toString();
}
}

View File

@ -0,0 +1,189 @@
/*
* Copyright 2015 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.
*/
/**
* @author b00295750
*
*/
package org.onosproject.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides IPv4 Sub Object.
*/
public class IPv4SubObject implements PcepValueType {
/*Reference : RFC 4874:3.1.1
* 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | IPv4 address (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 address (continued) | Prefix Length | Resvd |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(IPv4SubObject.class);
public static final byte TYPE = 0x01;
public static final byte LENGTH = 8;
public static final byte VALUE_LENGTH = 6;
public static final byte OBJ_LENGTH = 8;
public static final byte LBIT = 0;
public static final int SHIFT_LBIT_POSITION = 7;
private int ipAddress;
private byte prefixLen;
private byte resvd;
/**
* Constructor to initialize ipv4 address.
*
* @param ipAddr ipv4 address
*/
public IPv4SubObject(int ipAddr) {
this.ipAddress = ipAddr;
}
/**
* constructor to initialize ipAddress, prefixLen and resvd.
*
* @param ipAddress ipv4 address
* @param prefixLen prefix length
* @param resvd reserved flags value
*/
public IPv4SubObject(int ipAddress, byte prefixLen, byte resvd) {
this.ipAddress = ipAddress;
this.prefixLen = prefixLen;
this.resvd = resvd;
}
/**
* Returns a new instance of IPv4SubObject.
*
* @param ipAddress ipv4 address
* @param prefixLen prefix length
* @param resvd reserved flags value
* @return object of IPv4SubObject
*/
public static IPv4SubObject of(int ipAddress, byte prefixLen, byte resvd) {
return new IPv4SubObject(ipAddress, prefixLen, resvd);
}
/**
* Returns prefixLen of IPv4 IP address.
*
* @return byte value of rawValue
*/
public byte getPrefixLen() {
return prefixLen;
}
/**
* Returns value of IPv4 IP address.
*
* @return int value of ipv4 address
*/
public int getIpAddress() {
return ipAddress;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(ipAddress, prefixLen, resvd);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof IPv4SubObject) {
IPv4SubObject other = (IPv4SubObject) obj;
return Objects.equals(this.ipAddress, other.ipAddress) && Objects.equals(this.prefixLen, other.prefixLen)
&& Objects.equals(this.resvd, other.resvd);
}
return false;
}
/**
* Reads the channel buffer and returns object of IPv4SubObject.
*
* @param c type of channel buffer
* @return object of IPv4SubObject
*/
public static PcepValueType read(ChannelBuffer c) {
int ipAddess = c.readInt();
byte prefixLen = c.readByte();
byte resvd = c.readByte();
return new IPv4SubObject(ipAddess, prefixLen, resvd);
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
byte bValue = LBIT;
bValue = (byte) (bValue << SHIFT_LBIT_POSITION);
bValue = (byte) (bValue | TYPE);
c.writeByte(bValue);
c.writeByte(OBJ_LENGTH);
c.writeInt(ipAddress);
c.writeByte(prefixLen);
c.writeByte(resvd);
return c.writerIndex() - iLenStartIndex;
}
@Override
public void print() {
log.debug("IPv4SubObject");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("IPv4 address: " + String.format("%08X", ipAddress));
log.debug("Prefix Length: " + prefixLen);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Type", TYPE)
.add("Length", LENGTH)
.add("IPv4 Address", ipAddress)
.add("Prefix Length", prefixLen)
.toString();
}
}

View File

@ -0,0 +1,228 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides IPv6 Sub Object.
*/
public class IPv6SubObject implements PcepValueType {
/* reference :RFC 4874.
Subobject : IPv6 address
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 | Length | IPv6 address (16 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv6 address (continued) | Prefix Length | Flags |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Type
0x02 IPv6 address
Length
The Length contains the total length of the subobject in bytes,
including the Type and Length fields. The Length is always 20.
IPv6 address
A 128-bit unicast host address.
Prefix length
128
Flags
0x01 Local protection available
Indicates that the link downstream of this node is
protected via a local repair mechanism. This flag can
only be set if the Local protection flag was set in the
SESSION_ATTRIBUTE object of the corresponding Path
message.
0x02 Local protection in use
Indicates that a local repair mechanism is in use to
maintain this tunnel (usually in the face of an outage
of the link it was previously routed over).
*/
protected static final Logger log = LoggerFactory.getLogger(IPv6SubObject.class);
public static final short TYPE = 0x02;
public static final short LENGTH = 20;
public static final byte VALUE_LENGTH = 18;
private static final byte[] NONE_VAL = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public static final IPv6SubObject NONE = new IPv6SubObject(NONE_VAL);
private static final byte[] NO_MASK_VAL = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF,
(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
public static final IPv6SubObject NO_MASK = new IPv6SubObject(NO_MASK_VAL);
public static final IPv6SubObject FULL_MASK = NONE;
private final byte[] rawValue;
/**
* constructor to initialize rawValue with ipv6 address.
*
* @param rawValue ipv6 address
*/
public IPv6SubObject(byte[] rawValue) {
this.rawValue = rawValue;
}
/**
* To create instance of IPv6SubObject.
*
* @param raw byte array of ipv6 address
* @return object of IPv6SubObject
*/
public static IPv6SubObject of(final byte[] raw) {
//check NONE_VAL
boolean bFoundNONE = true;
//value starts from 3rd byte.
for (int i = 2; i < 20; ++i) {
if (NONE_VAL[i] != raw[i]) {
bFoundNONE = false;
}
}
if (bFoundNONE) {
return NONE;
}
//check NO_MASK_VAL
boolean bFoundNoMask = true;
//value starts from 3rd byte.
for (int i = 2; i < 20; ++i) {
if (0xFF != raw[i]) {
bFoundNoMask = false;
}
}
if (bFoundNoMask) {
return NO_MASK;
}
return new IPv6SubObject(raw);
}
/**
* Returns value of IPv6 Sub Object.
*
* @return byte array of ipv6 address
*/
public byte[] getValue() {
return rawValue;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(rawValue);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof IPv6SubObject) {
IPv6SubObject other = (IPv6SubObject) obj;
return Objects.equals(rawValue, other.rawValue);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
c.writeBytes(rawValue);
return c.writerIndex() - iStartIndex;
}
/**
* Reads the channel buffer and returns object of IPv6SubObject.
*
* @param c type of channel buffer
* @return object of IPv6SubObject
*/
public static IPv6SubObject read20Bytes(ChannelBuffer c) {
byte[] yTemp = new byte[20];
c.readBytes(yTemp, 0, 20);
return IPv6SubObject.of(yTemp);
}
@Override
public void print() {
log.debug("IPv6SubObject");
log.debug("Type: ", TYPE);
log.debug("Length: ", LENGTH);
if (null != rawValue) {
StringBuffer result = new StringBuffer();
for (byte b : rawValue) {
result.append(String.format("%02X ", b));
}
log.debug(result.toString());
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Type", TYPE)
.add("Length", LENGTH)
.add("IPv6 Address", rawValue)
.toString();
}
}

View File

@ -0,0 +1,167 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Path Key SubObject: When a PCC needs to expand a path-key in order to expand a CPS, it
* issues a Path Computation Request (PCReq) to the PCE identified in
* the PKS in the RSVP-TE ERO that it is processing. The PCC supplies
* the PKS to be expanded in a PATH-KEY SubObject in the PCReq message.
*/
public class PathKeySubObject implements PcepValueType {
/*
Pathkey subobject(RFC 5520):
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | Path-Key |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PCE ID (4 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(PathKeySubObject.class);
public static final byte TYPE = 0x40;
public static final byte LENGTH = 8;
private final short pathKey;
private final int pceID;
/**
* Constructor for Path Key sub Object which initializes pathKey and pceId.
*
* @param pathKey path key provided by PCC
* @param pceID ID for the PCE
*/
public PathKeySubObject(short pathKey, int pceID) {
this.pathKey = pathKey;
this.pceID = pceID;
}
/**
* Creates Path Key sub Object which initializes pathKey and pceId.
*
* @param pathKey path key provided by PCC
* @param pceID PCE id
* @return new object of type path key sub object
*/
public static PathKeySubObject of(short pathKey, int pceID) {
return new PathKeySubObject(pathKey, pceID);
}
/**
* Returns Path Key.
*
* @return pathKey
*/
public short getPathKey() {
return pathKey;
}
/**
* Returns pceID.
*
* @return pceID
*/
public int getPceId() {
return pceID;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(pathKey, pceID);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PathKeySubObject) {
PathKeySubObject other = (PathKeySubObject) obj;
return Objects.equals(this.pathKey, other.pathKey) && Objects.equals(this.pceID, other.pceID);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
c.writeShort(pathKey);
c.writeInt(pceID);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns new path key sub objects.
*
* @param c of type channel buffer
* @return object of type path key sub object
*/
public static PcepValueType read(ChannelBuffer c) {
Short pathKey = c.readShort();
int pceID = c.readInt();
return new PathKeySubObject(pathKey, pceID);
}
@Override
public void print() {
log.debug("PathKeySubObject");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("Path Key: " + pathKey);
log.debug("PCEID: " + pceID);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Type", TYPE).add("Length", LENGTH)
.add("Path Key", pathKey)
.add("PCE ID", pceID)
.toString();
}
}

View File

@ -0,0 +1,83 @@
/*
* Copyright 2015 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.pcepio.types;
/*
* Provide the PCEP Error Info Details.
*/
public final class PcepErrorDetailInfo {
private PcepErrorDetailInfo() {
}
// Error Types
/**
Error- Meaning Reference:RFC 5440
Type
1 PCEP session establishment failure
Error-value=1: reception of an invalid Open message or a non Open message.
Error-value=2: no Open message received before the expiration of the OpenWait timer
Error-value=3: unacceptable and non-negotiable session characteristics
Error-value=4: unacceptable but negotiable session characteristics
Error-value=5: reception of a second Open message with still unacceptable session characteristics
Error-value=6: reception of a PCErr message proposing unacceptable session characteristics
Error-value=7: No Keepalive or PCErr message received before the expiration of the KeepWait timer
Error-value=8: PCEP version not supported
2 Capability not supported
3 Unknown Object
Error-value=1: Unrecognized object class
Error-value=2: Unrecognized object Type
4 Not supported object
Error-value=1: Not supported object class
Error-value=2: Not supported object Type
5 Policy violation
Error-value=1: C bit of the METRIC object set (request rejected)
Error-value=2: O bit of the RP object cleared (request rejected)
6 Mandatory Object missing
Error-value=1: RP object missing
Error-value=2: RRO missing for a re-optimization request (R bit of the RP object set)
Error-value=3: END-POINTS object missing
7 Synchronized path computation request missing
8 Unknown request reference
9 Attempt to establish a second PCEP session
10 Reception of an invalid object
Error-value=1: reception of an object with P flag not set although the P flag must be
set according to this specification.
*/
public static final byte ERROR_TYPE_1 = 1;
public static final byte ERROR_TYPE_2 = 2;
public static final byte ERROR_TYPE_3 = 3;
public static final byte ERROR_TYPE_4 = 4;
public static final byte ERROR_TYPE_5 = 5;
public static final byte ERROR_TYPE_6 = 6;
public static final byte ERROR_TYPE_7 = 7;
public static final byte ERROR_TYPE_8 = 8;
public static final byte ERROR_TYPE_9 = 9;
public static final byte ERROR_TYPE_10 = 10;
// Error Values
public static final byte ERROR_VALUE_1 = 1;
public static final byte ERROR_VALUE_2 = 2;
public static final byte ERROR_VALUE_3 = 3;
public static final byte ERROR_VALUE_4 = 4;
public static final byte ERROR_VALUE_5 = 5;
public static final byte ERROR_VALUE_6 = 6;
public static final byte ERROR_VALUE_7 = 7;
public static final byte ERROR_VALUE_8 = 8;
public static final byte ERROR_VALUE_9 = 9;
public static final byte ERROR_VALUE_10 = 10;
}

View File

@ -9,7 +9,9 @@ import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/*
import com.google.common.base.MoreObjects;
/**
* Provides Pcep Label.
* REference :draft-zhao-pce-pcep-extension-for-pce-controller-01.
*/
@ -18,13 +20,13 @@ public class PcepLabelDownload {
protected static final Logger log = LoggerFactory.getLogger(PcepLabelDownload.class);
//PCEP SPR Object
PcepSrpObject srpObject;
private PcepSrpObject srpObject;
//PCEP LSP Object
PcepLspObject lspObject;
private PcepLspObject lspObject;
//LinkList of Labels
LinkedList<PcepLabelObject> llLabelList;
private LinkedList<PcepLabelObject> llLabelList;
/*
/**
* Returns SRP Object.
*
* @return PCEP SRP Object
@ -33,7 +35,7 @@ public class PcepLabelDownload {
return srpObject;
}
/*
/**
* Sets the Pcep Srp Object.
*
* @param srpobj PCEP SRP Object
@ -42,7 +44,7 @@ public class PcepLabelDownload {
this.srpObject = srpobj;
}
/*
/**
* Returns LSP Object.
*
* @return PCEP LSP Object
@ -51,7 +53,7 @@ public class PcepLabelDownload {
return lspObject;
}
/*
/**
* Sets the Pcep LSP Object.
*
* @param lspObject PCEP LSP Object
@ -60,7 +62,7 @@ public class PcepLabelDownload {
this.lspObject = lspObject;
}
/*
/**
* Returns a list of labels.
*
* @return llLabelList list of pcep label objects
@ -69,7 +71,7 @@ public class PcepLabelDownload {
return llLabelList;
}
/*
/**
* set the llLabelList list of type PcepLableObject.
*
* @param llLabelList list of pcep label objects
@ -78,7 +80,7 @@ public class PcepLabelDownload {
this.llLabelList = llLabelList;
}
/*
/**
* Prints the attribute of PcepLableObject.
*/
public void print() {
@ -92,4 +94,13 @@ public class PcepLabelDownload {
listIterator.next().print();
}
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("SRP object", srpObject)
.add("LSP object", lspObject)
.add("label object list", llLabelList)
.toString();
}
}

View File

@ -22,6 +22,8 @@ import org.onosproject.pcepio.protocol.PcepSrpObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provide PCEP Label Map.
* Reference :draft-zhao-pce-pcep-extension-for-pce-controller-01.
@ -30,11 +32,11 @@ public class PcepLabelMap {
protected static final Logger log = LoggerFactory.getLogger(PcepLabelMap.class);
//PCEP SRP Object
PcepSrpObject srpObject;
private PcepSrpObject srpObject;
//PCEP Label Object
PcepLabelObject labelObject;
private PcepLabelObject labelObject;
//PCEP FEC Object
PcepFecObject fecObject;
private PcepFecObject fecObject;
/**
* Sets Fec Object.
@ -99,4 +101,13 @@ public class PcepLabelMap {
labelObject.print();
fecObject.print();
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("SRP object", srpObject)
.add("Label object", labelObject)
.add("Fec object", fecObject)
.toString();
}
}

View File

@ -0,0 +1,93 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import com.google.common.base.MoreObjects;
public class PcepNaiIpv4Adjacency implements PcepNai {
public static final byte ST_TYPE = 0x03;
private final int localIpv4Addr;
private final int remoteIpv4Addr;
/**
* Constructor to initialize variables.
*
* @param localIpv4 local ipv4 address
* @param remoteIpv4 remote ipv4 address
*/
public PcepNaiIpv4Adjacency(int localIpv4, int remoteIpv4) {
this.localIpv4Addr = localIpv4;
this.remoteIpv4Addr = remoteIpv4;
}
@Override
public byte getType() {
return ST_TYPE;
}
@Override
public int write(ChannelBuffer bb) {
int iLenStartIndex = bb.writerIndex();
bb.writeInt(localIpv4Addr);
bb.writeInt(remoteIpv4Addr);
return bb.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns object of PcepNAIIpv4AdjacencyVer1.
*
* @param cb of channel buffer
* @return object of PcepNAIIpv4Adjacency
*/
public static PcepNaiIpv4Adjacency read(ChannelBuffer cb) {
int localIpv4 = cb.readInt();
int remoteIpv4 = cb.readInt();
return new PcepNaiIpv4Adjacency(localIpv4, remoteIpv4);
}
@Override
public int hashCode() {
return Objects.hash(localIpv4Addr, remoteIpv4Addr);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PcepNaiIpv4Adjacency) {
PcepNaiIpv4Adjacency other = (PcepNaiIpv4Adjacency) obj;
return Objects.equals(this.localIpv4Addr, other.localIpv4Addr)
&& Objects.equals(this.remoteIpv4Addr, other.remoteIpv4Addr);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("local IPv4 Address", localIpv4Addr)
.add("remote IPv4 Address", remoteIpv4Addr)
.toString();
}
}

View File

@ -0,0 +1,96 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import com.google.common.base.MoreObjects;
public class PcepNaiIpv4NodeId implements PcepNai {
public static final byte ST_TYPE = 0x01;
private final int ipv4NodeId;
/**
* Constructor to initialize ipv4NodeId.
*
* @param value ipv4 node id
*/
public PcepNaiIpv4NodeId(int value) {
this.ipv4NodeId = value;
}
/**
* Returns an object of PcepNaiIpv4NodeId.
*
* @param value ipv4 node id
* @return object of PcepNaiIpv4NodeId
*/
public static PcepNaiIpv4NodeId of(int value) {
return new PcepNaiIpv4NodeId(value);
}
@Override
public byte getType() {
return ST_TYPE;
}
@Override
public int write(ChannelBuffer bb) {
int iLenStartIndex = bb.writerIndex();
bb.writeInt(ipv4NodeId);
return bb.writerIndex() - iLenStartIndex;
}
/**
* Reads from the channel buffer and returns object of PcepNAIIpv4NodeIdVer1.
*
* @param bb of channel buffer.
* @return object of PcepNAIIpv4NodeIdVer1
*/
public static PcepNaiIpv4NodeId read(ChannelBuffer bb) {
return new PcepNaiIpv4NodeId(bb.readInt());
}
@Override
public int hashCode() {
return Objects.hash(ipv4NodeId);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PcepNaiIpv4NodeId) {
PcepNaiIpv4NodeId other = (PcepNaiIpv4NodeId) obj;
return Objects.equals(this.ipv4NodeId, other.ipv4NodeId);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("IPv4 Node Id", ipv4NodeId)
.toString();
}
}

View File

@ -0,0 +1,110 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import com.google.common.base.MoreObjects;
public class PcepNaiIpv6Adjacency implements PcepNai {
public static final byte ST_TYPE = 0x04;
public static final byte IPV6_LEN = 0x10;
private final byte[] localIpv6Addr;
private final byte[] remoteIpv6Addr;
/**
* Constructor to initialize local ipv6 and remote ipv6.
*
* @param localIpv6 local ipv6 address
* @param remoteIpv6 remote ipv6 address
*/
public PcepNaiIpv6Adjacency(byte[] localIpv6, byte[] remoteIpv6) {
this.localIpv6Addr = localIpv6;
this.remoteIpv6Addr = remoteIpv6;
}
@Override
public byte getType() {
return ST_TYPE;
}
@Override
public int write(ChannelBuffer bb) {
int iLenStartIndex = bb.writerIndex();
bb.writeBytes(localIpv6Addr);
bb.writeBytes(remoteIpv6Addr);
return bb.writerIndex() - iLenStartIndex;
}
/**
* Reads from channel buffer and returns object of PcepNAIIpv6AdjacencyVer1.
*
* @param bb of type channel buffer
* @return object of PcepNAIIpv6AdjacencyVer1
*/
public static PcepNaiIpv6Adjacency read(ChannelBuffer bb) {
byte[] localIpv6 = new byte[IPV6_LEN];
bb.readBytes(localIpv6, 0, IPV6_LEN);
byte[] remoteIpv6 = new byte[IPV6_LEN];
bb.readBytes(remoteIpv6, 0, IPV6_LEN);
return new PcepNaiIpv6Adjacency(localIpv6, remoteIpv6);
}
@Override
public int hashCode() {
return Objects.hash(localIpv6Addr, remoteIpv6Addr);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PcepNaiIpv6Adjacency) {
PcepNaiIpv6Adjacency other = (PcepNaiIpv6Adjacency) obj;
return Objects.equals(this.localIpv6Addr, other.localIpv6Addr)
&& Objects.equals(this.remoteIpv6Addr, other.remoteIpv6Addr);
}
return false;
}
/**
* Creates object of PcepNaiIpv6Adjacency with local ipv6 address and remote ipv6 address.
*
* @param localIpv6Addr local ipv6 address
* @param remoteIpv6Addr remote ipv6 address
* @return object of PcepNaiIpv6Adjacency
*/
public static PcepNaiIpv6Adjacency of(final byte[] localIpv6Addr, final byte[] remoteIpv6Addr) {
return new PcepNaiIpv6Adjacency(localIpv6Addr, remoteIpv6Addr);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("local IPV6 address", localIpv6Addr)
.add("remote IPV6 address", remoteIpv6Addr)
.toString();
}
}

View File

@ -0,0 +1,89 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import com.google.common.base.MoreObjects;
public class PcepNaiIpv6NodeId implements PcepNai {
public static final byte ST_TYPE = 0x02;
public static final byte IPV6_LEN = 0x10;
private final byte[] ipv6NodeId;
/**
* Constructor to initialize ipv6NodeId.
*
* @param value ipv6 node id
*/
public PcepNaiIpv6NodeId(byte[] value) {
this.ipv6NodeId = value;
}
@Override
public byte getType() {
return ST_TYPE;
}
@Override
public int write(ChannelBuffer cb) {
int iLenStartIndex = cb.writerIndex();
cb.writeBytes(ipv6NodeId);
return cb.writerIndex() - iLenStartIndex;
}
/**
* Reads from the channel buffer and returns object of PcepNAIIpv6NodeId.
*
* @param cb of type channel buffer.
* @return object of PcepNAIIpv6NodeId
*/
public static PcepNaiIpv6NodeId read(ChannelBuffer cb) {
byte[] ipv6NodeId = new byte[IPV6_LEN];
cb.readBytes(ipv6NodeId, 0, IPV6_LEN);
return new PcepNaiIpv6NodeId(ipv6NodeId);
}
@Override
public int hashCode() {
return Objects.hash(ipv6NodeId);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PcepNaiIpv6NodeId) {
PcepNaiIpv6NodeId other = (PcepNaiIpv6NodeId) obj;
return Objects.equals(this.ipv6NodeId, other.ipv6NodeId);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("IPV6 node ID", ipv6NodeId)
.toString();
}
}

View File

@ -0,0 +1,113 @@
package org.onosproject.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import com.google.common.base.MoreObjects;
public class PcepNaiUnnumberedAdjacencyIpv4 implements PcepNai {
/**
* draft-ietf-pce-segment-routing-03 section 5.3.2.
*/
public static final byte ST_TYPE = 0x05;
private final int localNodeId;
private final int localInterfaceId;
private final int remoteNodeId;
private final int remoteInterfaceId;
/**
* Constructor to initialize all the member variables.
*
* @param localNodeId local node id
* @param localInterfaceId local interface id
* @param remoteNodeId remote node id
* @param remoteInterfaceId remote interface id
*/
public PcepNaiUnnumberedAdjacencyIpv4(int localNodeId, int localInterfaceId, int remoteNodeId,
int remoteInterfaceId) {
this.localNodeId = localNodeId;
this.localInterfaceId = localInterfaceId;
this.remoteNodeId = remoteNodeId;
this.remoteInterfaceId = remoteInterfaceId;
}
/**
* Returns PCEP Nai Unnumbered Adjacency Ipv4 object.
*
* @param localNodeId local node id
* @param localInterfaceId local interface if
* @param remoteNodeId remote node id
* @param remoteInterfaceId remote interface id
* @return PCEP Nai Unnumbered Adjacency Ipv4 object
*/
public static PcepNaiUnnumberedAdjacencyIpv4 of(int localNodeId, int localInterfaceId, int remoteNodeId,
int remoteInterfaceId) {
return new PcepNaiUnnumberedAdjacencyIpv4(localNodeId, localInterfaceId, remoteNodeId, remoteInterfaceId);
}
@Override
public byte getType() {
return ST_TYPE;
}
@Override
public int write(ChannelBuffer bb) {
int iLenStartIndex = bb.writerIndex();
bb.writeInt(localNodeId);
bb.writeInt(localInterfaceId);
bb.writeInt(remoteNodeId);
bb.writeInt(remoteInterfaceId);
return bb.writerIndex() - iLenStartIndex;
}
/**
* Reads from channel buffer and return object of PcepNAIUnnumberedAdjacencyIpv4.
*
* @param bb of type channel buffer
* @return object of PcepNAIUnnumberedAdjacencyIpv4
*/
public static PcepNaiUnnumberedAdjacencyIpv4 read(ChannelBuffer bb) {
int localNodeId;
int localInterfaceId;
int remoteNodeId;
int remoteInterfaceId;
localNodeId = bb.readInt();
localInterfaceId = bb.readInt();
remoteNodeId = bb.readInt();
remoteInterfaceId = bb.readInt();
return new PcepNaiUnnumberedAdjacencyIpv4(localNodeId, localInterfaceId, remoteNodeId, remoteInterfaceId);
}
@Override
public int hashCode() {
return Objects.hash(localNodeId, localInterfaceId, remoteNodeId, remoteInterfaceId);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PcepNaiUnnumberedAdjacencyIpv4) {
PcepNaiUnnumberedAdjacencyIpv4 other = (PcepNaiUnnumberedAdjacencyIpv4) obj;
return Objects.equals(this.localNodeId, other.localNodeId)
&& Objects.equals(this.localInterfaceId, other.localInterfaceId)
&& Objects.equals(this.remoteNodeId, other.remoteNodeId)
&& Objects.equals(this.remoteInterfaceId, other.remoteInterfaceId);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("local Node Id", localNodeId)
.add("local Interface Id", localInterfaceId)
.add("remote Node Id", remoteNodeId)
.add("remote Interface Id:", remoteInterfaceId)
.toString();
}
}

View File

@ -20,6 +20,8 @@ import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PCEP Object Header which is common for all the objects.
* Reference : RFC 5440.
@ -66,7 +68,6 @@ public class PcepObjectHeader {
* @param bIFlag I flag
* @param objLen PCEP object length
*/
public PcepObjectHeader(byte objClass, byte objType, boolean bPFlag, boolean bIFlag, short objLen) {
this.objClass = objClass;
this.objType = objType;
@ -221,4 +222,15 @@ public class PcepObjectHeader {
log.debug("P flag: " + bPFlag);
log.debug("I flag: " + bIFlag);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Object class:", objClass)
.add("Object type:", objType)
.add("Object length:", objLen)
.add("P flag:", bPFlag)
.add("I flag:", bIFlag)
.toString();
}
}

View File

@ -0,0 +1,47 @@
/*
* Copyright 2015 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.pcepio.types;
import org.jboss.netty.buffer.ChannelBuffer;
public interface PcepRsvpErrorSpec extends PcepValueType {
/**
* To write the object information to channelBuffer.
*
* @param cb of type channel buffer
*/
@Override
int write(ChannelBuffer cb);
/**
* Returns class number.
*
* @return class number
*/
byte getClassNum();
/**
* Returns class type.
*
* @return class type
*/
byte getClassType();
@Override
String toString();
}

View File

@ -0,0 +1,162 @@
/*
* Copyright 2015 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.pcepio.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import com.google.common.base.MoreObjects;
public class PcepRsvpIpv4ErrorSpec implements PcepRsvpErrorSpec {
/*
RSVP error spec object header.
0 1 2 3
+-------------+-------------+-------------+-------------+
| Length (bytes) | Class-Num | C-Type |
+-------------+-------------+-------------+-------------+
| |
// (Object contents) //
| |
+-------------+-------------+-------------+-------------+
Ref : ERROR_SPEC @ RFC2205
IPv4 ERROR_SPEC object: Class = 6, C-Type = 1
+-------------+-------------+-------------+-------------+
| IPv4 Error Node Address (4 bytes) |
+-------------+-------------+-------------+-------------+
| Flags | Error Code | Error Value |
+-------------+-------------+-------------+-------------+
*/
PcepRsvpSpecObjHeader objHeader;
public static final byte CLASS_NUM = 0x06;
public static final byte CLASS_TYPE = 0x01;
public static final byte CLASS_LENGTH = 0x0c;
private int ipv4Addr;
private byte flags;
private byte errCode;
private short errValue;
/**
* Constructor to initialize obj header, ipv4 addr, flags, err code and err value.
*
* @param objHeader rsvp ipv4 error spec object header
* @param ipv4Addr ipv4 address
* @param flags flags value
* @param errCode error code value
* @param errValue error value
*/
public PcepRsvpIpv4ErrorSpec(PcepRsvpSpecObjHeader objHeader, int ipv4Addr, byte flags, byte errCode,
short errValue) {
this.objHeader = objHeader;
this.ipv4Addr = ipv4Addr;
this.flags = flags;
this.errCode = errCode;
this.errValue = errValue;
}
/**
* Constructor to initialize ipv4 address, flags, err code and err value.
*
* @param ipv4Addr ipv4 address
* @param flags flags value
* @param errCode error code
* @param errValue error value
*/
public PcepRsvpIpv4ErrorSpec(int ipv4Addr, byte flags, byte errCode, short errValue) {
this.objHeader = new PcepRsvpSpecObjHeader(CLASS_LENGTH, CLASS_NUM, CLASS_TYPE);
this.ipv4Addr = ipv4Addr;
this.flags = flags;
this.errCode = errCode;
this.errValue = errValue;
}
@Override
public int write(ChannelBuffer cb) {
int objLenIndex = objHeader.write(cb);
cb.writeInt(ipv4Addr);
cb.writeByte(flags);
cb.writeByte(errCode);
cb.writeShort(errValue);
short objLen = (short) (cb.writerIndex() - objLenIndex);
cb.setShort(objLenIndex, objLen);
return objLen;
}
/**
* Reads PCPE RSVP error spec from channel buffer and returns PCEP rsvp IPv4 error spec object.
*
* @param cb channel buffer
* @return PCEP rsvp IPv4 error spec object
*/
public static PcepRsvpErrorSpec read(ChannelBuffer cb) {
PcepRsvpSpecObjHeader objHeader;
int ipv4Addr;
byte flags;
byte errCode;
short errValue;
objHeader = PcepRsvpSpecObjHeader.read(cb);
ipv4Addr = cb.readInt();
flags = cb.readByte();
errCode = cb.readByte();
errValue = cb.readShort();
return new PcepRsvpIpv4ErrorSpec(objHeader, ipv4Addr, flags, errCode, errValue);
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return StatefulRsvpErrorSpecTlv.TYPE;
}
@Override
public short getLength() {
return CLASS_LENGTH;
}
@Override
public byte getClassNum() {
return CLASS_NUM;
}
@Override
public byte getClassType() {
return CLASS_TYPE;
}
@Override
public void print() {
// TODO Auto-generated method stub
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("IPv4 Address:", ipv4Addr)
.add("flags:", flags)
.add("error Code:", errCode)
.add("error Value:", errValue)
.toString();
}
}

View File

@ -0,0 +1,152 @@
package org.onosproject.pcepio.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import com.google.common.base.MoreObjects;
public class PcepRsvpIpv6ErrorSpec implements PcepRsvpErrorSpec {
/*
0 1 2 3
+-------------+-------------+-------------+-------------+
| Length (bytes) | Class-Num | C-Type |
+-------------+-------------+-------------+-------------+
| |
// (Object contents) //
| |
+-------------+-------------+-------------+-------------+
Ref : ERROR_SPEC @ RFC2205
IPv6 ERROR_SPEC object: Class = 6, C-Type = 2
+-------------+-------------+-------------+-------------+
| |
+ +
| |
+ IPv6 Error Node Address (16 bytes) +
| |
+ +
| |
+-------------+-------------+-------------+-------------+
| Flags | Error Code | Error Value |
+-------------+-------------+-------------+-------------+ */
PcepRsvpSpecObjHeader objHeader;
public static final byte CLASS_NUM = 0x06;
public static final byte CLASS_TYPE = 0x02;
public static final byte CLASS_LENGTH = 0x18;
public static final byte IPV6_LEN = 0x10;
private byte[] ipv6Addr;
private byte flags;
private byte errCode;
private short errValue;
/**
* Constructor to initialize obj header, ipv6 addr, flags, err code and err value.
*
* @param objHeader rsvp ipv6 error spec object header
* @param ipv6Addr ipv6 address
* @param flags flags value
* @param errCode error code
* @param errValue error value
*/
public PcepRsvpIpv6ErrorSpec(PcepRsvpSpecObjHeader objHeader, byte[] ipv6Addr, byte flags, byte errCode,
short errValue) {
this.objHeader = objHeader;
this.ipv6Addr = ipv6Addr;
this.flags = flags;
this.errCode = errCode;
this.errValue = errValue;
}
/**
* Constructor to initialize ipv6 addr, flags, err code and err value.
*
* @param ipv6Addr ipv6 address
* @param flags flags value
* @param errCode error code
* @param errValue error value
*/
public PcepRsvpIpv6ErrorSpec(byte[] ipv6Addr, byte flags, byte errCode, short errValue) {
this.objHeader = new PcepRsvpSpecObjHeader(CLASS_LENGTH, CLASS_NUM, CLASS_TYPE);
this.ipv6Addr = ipv6Addr;
this.flags = flags;
this.errCode = errCode;
this.errValue = errValue;
}
@Override
public int write(ChannelBuffer cb) {
int objLenIndex = objHeader.write(cb);
cb.writeBytes(ipv6Addr);
cb.writeByte(flags);
cb.writeByte(errCode);
cb.writeShort(errValue);
short objLen = (short) (cb.writerIndex() - objLenIndex);
cb.setShort(objLenIndex, objLen);
return objLen;
}
/**
* Returns PCEP rsvp IPv6 error spce object.
*
* @param cb channel buffer
* @return PCEP rsvp IPv6 error spce object
*/
public static PcepRsvpErrorSpec read(ChannelBuffer cb) {
PcepRsvpSpecObjHeader objHeader;
byte[] ipv6Addr = new byte[IPV6_LEN];
byte flags;
byte errCode;
short errValue;
objHeader = PcepRsvpSpecObjHeader.read(cb);
cb.readBytes(ipv6Addr, 0, IPV6_LEN);
flags = cb.readByte();
errCode = cb.readByte();
errValue = cb.readShort();
return new PcepRsvpIpv6ErrorSpec(objHeader, ipv6Addr, flags, errCode, errValue);
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return StatefulRsvpErrorSpecTlv.TYPE;
}
@Override
public short getLength() {
return CLASS_LENGTH;
}
@Override
public byte getClassNum() {
return CLASS_NUM;
}
@Override
public byte getClassType() {
return CLASS_TYPE;
}
@Override
public void print() {
// TODO Auto-generated method stub
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("IPv6 Address:", ipv6Addr)
.add("flags:", flags)
.add("error Code:", errCode)
.add("error Value:", errValue)
.toString();
}
}

View File

@ -20,6 +20,8 @@ import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PcepRsvpObjectHeader.
*/
@ -36,7 +38,7 @@ public class PcepRsvpObjectHeader {
+-------------+-------------+-------------+-------------+
ERROR_SPEC object Header
*/
*/
protected static final Logger log = LoggerFactory.getLogger(PcepRsvpObjectHeader.class);
@ -158,4 +160,13 @@ public class PcepRsvpObjectHeader {
log.debug("Object C-Type: " + objClassType);
log.debug("Object Length: " + objLen);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Object Class-Num: " , objClassNum)
.add("Object C-Type: " , objClassType)
.add("Object Length: " , objLen)
.toString();
}
}

View File

@ -0,0 +1,165 @@
/*
* Copyright 2015 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.pcepio.types;
import org.jboss.netty.buffer.ChannelBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides PcepRsvpObjectHeader.
*/
public class PcepRsvpSpecObjHeader {
/*
0 1 2 3
+-------------+-------------+-------------+-------------+
| Length (bytes) | Class-Num | C-Type |
+-------------+-------------+-------------+-------------+
| |
// (Object contents) //
| |
+-------------+-------------+-------------+-------------+
ERROR_SPEC object Header
*/
protected static final Logger log = LoggerFactory.getLogger(PcepRsvpSpecObjHeader.class);
private short objLen;
private byte objClassNum;
private byte objClassType;
/**
* Constructor to initialize length, class num and type.
*
* @param objLen object length
* @param objClassNum pcep rsvp error spec object class num
* @param objClassType pcep rsvp error spec object class type
*/
public PcepRsvpSpecObjHeader(short objLen, byte objClassNum, byte objClassType) {
this.objLen = objLen;
this.objClassNum = objClassNum;
this.objClassType = objClassType;
}
/**
* Sets the Class num.
*
* @param value pcep rsvp error spec object class num
*/
public void setObjClassNum(byte value) {
this.objClassNum = value;
}
/**
* Sets the Class type.
*
* @param value pcep rsvp error spec object class type
*/
public void setObjClassType(byte value) {
this.objClassType = value;
}
/**
* Sets the Class Length.
*
* @param value pcep rsvp error spec object length
*/
public void setObjLen(short value) {
this.objLen = value;
}
/**
* Returns Object Length.
*
* @return objLen pcep rsvp error spec object length
*/
public short getObjLen() {
return this.objLen;
}
/**
* Returns Object num.
*
* @return objClassNum pcep rsvp error spec object class num
*/
public byte getObjClassNum() {
return this.objClassNum;
}
/**
* Returns Object type.
*
* @return objClassType pcep rsvp error spec object class type
*/
public byte getObjClassType() {
return this.objClassType;
}
/**
* Writes the byte stream of PcepRsvpObjectHeader to channel buffer.
*
* @param bb of type channel buffer
* @return object length index
*/
public int write(ChannelBuffer bb) {
int objLenIndex = bb.writerIndex();
bb.writeShort(objLen);
bb.writeByte(objClassNum);
bb.writeByte(objClassType);
return bb.writerIndex() - objLenIndex;
}
/**
* Reads the PcepRsvpObjectHeader.
*
* @param bb of type channel buffer
* @return PcepRsvpObjectHeader
*/
public static PcepRsvpSpecObjHeader read(ChannelBuffer bb) {
byte objClassNum;
byte objClassType;
short objLen;
objLen = bb.readShort();
objClassNum = bb.readByte();
objClassType = bb.readByte();
return new PcepRsvpSpecObjHeader(objLen, objClassNum, objClassType);
}
/**
* Prints the attribute of PcepRsvpObjectHeader.
*/
public void print() {
log.debug("PcepObjectHeader");
log.debug("Object Class-Num: " + objClassNum);
log.debug("Object C-Type: " + objClassType);
log.debug("Object Length: " + objLen);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Object Class-Num: " , objClassNum)
.add("Object C-Type: " , objClassType)
.add("Object Length: " , objLen)
.toString();
}
}

View File

@ -0,0 +1,222 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.LinkedList;
import java.util.ListIterator;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepVersion;
import com.google.common.base.MoreObjects;
public class PcepRsvpUserErrorSpec implements PcepRsvpErrorSpec {
/*
RSVP error spec object header.
0 1 2 3
+-------------+-------------+-------------+-------------+
| Length (bytes) | Class-Num | C-Type |
+-------------+-------------+-------------+-------------+
| |
// (Object contents) //
| |
+-------------+-------------+-------------+-------------+
Ref : USER_ERROR_SPEC @ RFC5284.
USER_ERROR_SPEC object: Class = 194, C-Type = 1
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
+---------------+---------------+---------------+---------------+
| Enterprise Number |
+---------------+---------------+---------------+---------------+
| Sub Org | Err Desc Len | User Error Value |
+---------------+---------------+---------------+---------------+
| |
~ Error Description ~
| |
+---------------+---------------+---------------+---------------+
| |
~ User-Defined Subobjects ~
| |
+---------------+---------------+---------------+---------------+
*/
public static final byte CLASS_NUM = (byte) 0xc2;
public static final byte CLASS_TYPE = 0x01;
private PcepRsvpSpecObjHeader objHeader;
private int enterpriseNum;
private byte subOrg;
private byte errDescLen;
private short userErrorValue;
private byte[] errDesc;
private LinkedList<PcepValueType> llRsvpUserSpecSubObj;
/**
* Default constructor.
*
* @param objHeader pcep rsvp spec object header
* @param enterpriseNum enterprise number
* @param subOrg organization identifier value
* @param errDescLen error description length
* @param userErrorValue user error value
* @param errDesc error description
* @param llRsvpUserSpecSubObj list of subobjects
*/
public PcepRsvpUserErrorSpec(PcepRsvpSpecObjHeader objHeader, int enterpriseNum, byte subOrg, byte errDescLen,
short userErrorValue, byte[] errDesc, LinkedList<PcepValueType> llRsvpUserSpecSubObj) {
this.objHeader = objHeader;
this.enterpriseNum = enterpriseNum;
this.subOrg = subOrg;
this.errDescLen = errDescLen;
this.userErrorValue = userErrorValue;
this.errDesc = errDesc;
this.llRsvpUserSpecSubObj = llRsvpUserSpecSubObj;
}
@Override
public int write(ChannelBuffer cb) {
int objLenIndex = objHeader.write(cb);
cb.writeInt(enterpriseNum);
cb.writeByte(subOrg);
cb.writeByte(errDescLen);
cb.writeShort(userErrorValue);
cb.writeBytes(errDesc);
if (null != llRsvpUserSpecSubObj) {
ListIterator<PcepValueType> listIterator = llRsvpUserSpecSubObj.listIterator();
while (listIterator.hasNext()) {
PcepValueType tlv = listIterator.next();
if (null == tlv) {
continue;
}
tlv.write(cb);
// need to take care of padding
int pad = tlv.getLength() % 4;
if (0 != pad) {
pad = 4 - pad;
for (int i = 0; i < pad; ++i) {
cb.writeByte((byte) 0);
}
}
}
}
short objLen = (short) (cb.writerIndex() - objLenIndex);
cb.setShort(objLenIndex, objLen);
return objLen;
}
/**
* Reads the channel buffer and returns object of PcepRsvpErrorSpec.
*
* @param cb of type channel buffer
* @return object of PcepRsvpErrorSpec
* @throws PcepParseException when expected object is not received
*/
public static PcepRsvpErrorSpec read(ChannelBuffer cb) throws PcepParseException {
PcepRsvpSpecObjHeader objHeader;
int enterpriseNum;
byte subOrg;
byte errDescLen;
short userErrorValue;
byte[] errDesc;
LinkedList<PcepValueType> llRsvpUserSpecSubObj = null;
objHeader = PcepRsvpSpecObjHeader.read(cb);
if (CLASS_NUM != objHeader.getObjClassNum() || CLASS_TYPE != objHeader.getObjClassType()) {
throw new PcepParseException("Expected PcepRsvpUserErrorSpec object.");
}
enterpriseNum = cb.readInt();
subOrg = cb.readByte();
errDescLen = cb.readByte();
userErrorValue = cb.readShort();
errDesc = new byte[errDescLen];
cb.readBytes(errDesc, 0, errDescLen);
llRsvpUserSpecSubObj = parseErrSpecSubObj(cb);
return new PcepRsvpUserErrorSpec(objHeader, enterpriseNum, subOrg, errDescLen, userErrorValue, errDesc,
llRsvpUserSpecSubObj);
}
private static LinkedList<PcepValueType> parseErrSpecSubObj(ChannelBuffer cb) throws PcepParseException {
LinkedList<PcepValueType> llRsvpUserSpecSubObj = new LinkedList<PcepValueType>();
while (0 < cb.readableBytes()) {
PcepValueType tlv = null;
short hType = cb.readShort();
int iValue = 0;
//short hLength = cb.readShort();
switch (hType) {
case AutonomousSystemTlv.TYPE:
iValue = cb.readInt();
tlv = new AutonomousSystemTlv(iValue);
break;
default:
throw new PcepParseException("Unsupported Sub TLV type :" + hType);
}
llRsvpUserSpecSubObj.add(tlv);
}
return llRsvpUserSpecSubObj;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return StatefulRsvpErrorSpecTlv.TYPE;
}
@Override
public short getLength() {
return objHeader.getObjLen();
}
@Override
public byte getClassNum() {
return CLASS_NUM;
}
@Override
public byte getClassType() {
return CLASS_TYPE;
}
@Override
public void print() {
// TODO Auto-generated method stub
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("enterprise Number:", enterpriseNum)
.add("sub Organization:", subOrg)
.add("err Desc Length:", errDescLen)
.add("user Error Value:", userErrorValue)
.add("err Desc:", errDesc)
.add("Rsvp User Spec Sub Object:", llRsvpUserSpecSubObj)
.toString();
}
}

View File

@ -0,0 +1,336 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepNai;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/*
* Provides SrEroSubObject.
*/
public class SrEroSubObject implements PcepValueType {
/*
SR-ERO subobject: (draft-ietf-pce-segment-routing-00)
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|L| Type | Length | ST | Flags |F|S|C|M|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// NAI (variable) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NAI
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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NAI for IPv4 Adjacency
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 IPv6 address (16 bytes) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// Remote IPv6 address (16 bytes) //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NAI for IPv6 adjacency
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 Node-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Local Interface ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Remote Node-ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Remote Interface ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
NAI for Unnumbered adjacency with IPv4 Node IDs
*/
protected static final Logger log = LoggerFactory.getLogger(SrEroSubObject.class);
public static final short TYPE = 0x60; //TODO : type to be defined
public static final short LENGTH = 12;
public static final short VALUE_LENGTH = 10;
public static final int SET = 1;
public static final byte MFLAG_SET = 0x01;
public static final byte CFLAG_SET = 0x02;
public static final byte SFLAG_SET = 0x04;
public static final byte FFLAG_SET = 0x08;
public static final byte SHIFT_ST = 12;
private final boolean bFFlag;
private final boolean bSFlag;
private final boolean bCFlag;
private final boolean bMFlag;
private final byte st;
private final int sID;
private final PcepNai nai;
/**
* Constructor to initialize member variables.
*
* @param st SID type
* @param bFFlag F flag
* @param bSFlag S flag
* @param bCFlag C flag
* @param bMFlag M flag
* @param sID segment identifier value
* @param nai NAI associated with SID
*/
public SrEroSubObject(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
PcepNai nai) {
this.st = st;
this.bFFlag = bFFlag;
this.bSFlag = bSFlag;
this.bCFlag = bCFlag;
this.bMFlag = bMFlag;
this.sID = sID;
this.nai = nai;
}
/**
* Creates object of SrEroSubObject.
*
* @param st SID type
* @param bFFlag F flag
* @param bSFlag S flag
* @param bCFlag C flag
* @param bMFlag M flag
* @param sID segment identifier value
* @param nai NAI associated with SID
* @return object of SrEroSubObject
*/
public static SrEroSubObject of(byte st, boolean bFFlag, boolean bSFlag, boolean bCFlag, boolean bMFlag, int sID,
PcepNai nai) {
return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
}
/**
* Returns SID type.
* @return st sid type
*/
public byte getSt() {
return st;
}
/**
* Returns bFFlag.
* @return bFFlag
*/
public boolean getFFlag() {
return bFFlag;
}
/**
* Returns bSFlag.
* @return bSFlag
*/
public boolean getSFlag() {
return bSFlag;
}
/**
* Returns bCFlag.
* @return bCFlag
*/
public boolean getCFlag() {
return bCFlag;
}
/**
* Returns bMFlag.
* @return bMFlag
*/
public boolean getMFlag() {
return bMFlag;
}
/**
* Returns sID.
* @return sID
*/
public int getSID() {
return sID;
}
/**
* Returns nai.
* @return nai
*/
public PcepNai getNai() {
return nai;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SrEroSubObject) {
SrEroSubObject other = (SrEroSubObject) obj;
return Objects.equals(this.st, other.st) && Objects.equals(this.bFFlag, other.bFFlag)
&& Objects.equals(this.bSFlag, other.bSFlag) && Objects.equals(this.bCFlag, other.bCFlag)
&& Objects.equals(this.bMFlag, other.bMFlag) && Objects.equals(this.sID, other.sID)
&& Objects.equals(this.nai, other.nai);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
short temp = 0;
if (bMFlag) {
temp = (short) (temp | MFLAG_SET);
}
if (bCFlag) {
temp = (short) (temp | CFLAG_SET);
}
if (bSFlag) {
temp = (short) (temp | SFLAG_SET);
}
if (bFFlag) {
temp = (short) (temp | FFLAG_SET);
}
short tempST = (short) (st << SHIFT_ST);
temp = (short) (temp | tempST);
c.writeShort(temp);
c.writeInt(sID);
nai.write(c);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns object of SrEroSubObject.
* @param c of type channel buffer
* @return object of SrEroSubObject
*/
public static PcepValueType read(ChannelBuffer c) {
short temp = c.readShort();
boolean bMFlag;
boolean bCFlag;
boolean bSFlag;
boolean bFFlag;
byte st;
PcepNai nai = null;
bMFlag = (temp & MFLAG_SET) == MFLAG_SET ? true : false;
bCFlag = (temp & CFLAG_SET) == CFLAG_SET ? true : false;
bSFlag = (temp & SFLAG_SET) == SFLAG_SET ? true : false;
bFFlag = (temp & FFLAG_SET) == FFLAG_SET ? true : false;
st = (byte) (temp >> SHIFT_ST);
int sID = c.readInt();
switch (st) {
case 0x01:
nai = PcepNaiIpv4NodeId.read(c);
break;
case 0x02:
nai = PcepNaiIpv6NodeId.read(c);
break;
case 0x03:
nai = PcepNaiIpv4Adjacency.read(c);
break;
case 0x04:
nai = PcepNaiIpv6Adjacency.read(c);
break;
case 0x05:
nai = PcepNaiUnnumberedAdjacencyIpv4.read(c);
break;
default:
nai = null;
break;
}
return new SrEroSubObject(st, bFFlag, bSFlag, bCFlag, bMFlag, sID, nai);
}
@Override
public void print() {
log.debug("SrEroSubObject");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("st:" + st + " bFFlag:" + bFFlag + " bSFlag:" + bSFlag + " bCFlag:" + bCFlag + " bMFlag:" + bMFlag
+ " sID:" + sID + " nAI:" + nai);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Type", TYPE)
.add("Length", LENGTH)
.add("st", st)
.add("bFflag", bFFlag)
.add("bSFlag", bSFlag)
.add("bCFlag", bCFlag)
.add("bMFlag", bMFlag)
.add("sID", sID)
.add("nAI", nai)
.toString();
}
}

View File

@ -0,0 +1,225 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides StatefulIPv4LspIdentidiersTlv.
*/
public class StatefulIPv4LspIdentidiersTlv implements PcepValueType {
/* IPV4-LSP-IDENTIFIERS TLV format
*
* Reference :PCEP Extensions for Stateful PCE draft-ietf-pce-stateful-pce-10
*
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=18 | Length=16 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Tunnel Sender Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LSP ID | Tunnel ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Extended Tunnel ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IPv4 Tunnel Endpoint Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(StatefulIPv4LspIdentidiersTlv.class);
public static final short TYPE = 18;
public static final short LENGTH = 16;
public static final int VALUE_LENGTH = 16;
private final int ipv4IngressAddress;
private final short lspId;
private final short tunnelId;
private final int extendedTunnelId;
private final int ipv4EgressAddress;
/**
* Constructor to initialize member variables.
*
* @param ipv4IngressAddress ingress ipv4 address
* @param lspId lsp id
* @param tunnelId tunnel id
* @param extendedTunnelId extended tunnel id
* @param ipv4EgressAddress egress ipv4 address
*/
public StatefulIPv4LspIdentidiersTlv(int ipv4IngressAddress, short lspId, short tunnelId, int extendedTunnelId,
int ipv4EgressAddress) {
this.ipv4IngressAddress = ipv4IngressAddress;
this.lspId = lspId;
this.tunnelId = tunnelId;
this.extendedTunnelId = extendedTunnelId;
this.ipv4EgressAddress = ipv4EgressAddress;
}
/**
* Creates object of StatefulIPv4LspIdentidiersTlv.
*
* @param ipv4IngressAddress ingress ipv4 address
* @param lspId lsp id
* @param tunnelId tunnel id
* @param extendedTunnelId extended tunnel id
* @param ipv4EgressAddress egress ipv4 address
* @return object of StatefulIPv4LspIdentidiersTlv
*/
public static StatefulIPv4LspIdentidiersTlv of(int ipv4IngressAddress, short lspId, short tunnelId,
int extendedTunnelId, int ipv4EgressAddress) {
return new StatefulIPv4LspIdentidiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId,
ipv4EgressAddress);
}
/**
* Returns tunnel id.
*
* @return tunnelId
*/
public short getTunnelId() {
return this.tunnelId;
}
/**
* Returns extendedTunnelId.
*
* @return extendedTunnelId
*/
public int getextendedTunnelId() {
return this.extendedTunnelId;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
/**
* Returns ipv4IngressAddress.
*
* @return ipv4IngressAddress
*/
public int getIpv4IngressAddress() {
return ipv4IngressAddress;
}
/**
* Returns ipv4EgressAddress.
*
* @return ipv4EgressAddress
*/
public int getIpv4EgressAddress() {
return ipv4EgressAddress;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public int hashCode() {
return Objects.hash(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId, ipv4EgressAddress);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof StatefulIPv4LspIdentidiersTlv) {
StatefulIPv4LspIdentidiersTlv other = (StatefulIPv4LspIdentidiersTlv) obj;
return Objects.equals(this.ipv4IngressAddress, other.ipv4IngressAddress)
&& Objects.equals(this.lspId, other.lspId) && Objects.equals(this.tunnelId, other.tunnelId)
&& Objects.equals(this.extendedTunnelId, other.extendedTunnelId)
&& Objects.equals(this.ipv4EgressAddress, other.ipv4EgressAddress);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
c.writeInt(ipv4IngressAddress);
c.writeShort(lspId);
c.writeShort(tunnelId);
c.writeInt(extendedTunnelId);
c.writeInt(ipv4EgressAddress);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns object of StatefulIPv4LspIdentidiersTlv.
*
* @param c of type channel buffer
* @return object of StatefulIPv4LspIdentidiersTlv
*/
public static PcepValueType read(ChannelBuffer c) {
int ipv4IngressAddress = c.readInt();
short lspId = c.readShort();
short tunnelId = c.readShort();
int extendedTunnelId = c.readInt();
int ipv4EgressAddress = c.readInt();
return new StatefulIPv4LspIdentidiersTlv(ipv4IngressAddress, lspId, tunnelId, extendedTunnelId,
ipv4EgressAddress);
}
@Override
public void print() {
log.debug("StatefulIPv4LspIdentidiersTlv");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("Ipv4IngressAddress: " + ipv4IngressAddress);
log.debug("LspId: " + lspId);
log.debug("TunnelId: " + tunnelId);
log.debug("ExtendedTunnelId: " + extendedTunnelId);
log.debug("Ipv4EgressAddress: " + ipv4EgressAddress);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("Type:", TYPE)
.add("Length:", LENGTH)
.add("Ipv4IngressAddress:", ipv4IngressAddress)
.add("LspId:", lspId)
.add("TunnelId:", tunnelId)
.add("ExtendedTunnelId:", extendedTunnelId)
.add("Ipv4EgressAddress:", ipv4EgressAddress)
.toString();
}
}

View File

@ -0,0 +1,148 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides StatefulLspErrorCodeTlv.
*/
public class StatefulLspErrorCodeTlv implements PcepValueType {
/* LSP-ERROR-CODE TLV format
*
* Reference :PCEP Extensions for Stateful PCE draft-ietf-pce-stateful-pce-10
*
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=20 | Length=4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| LSP Error Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(StatefulLspErrorCodeTlv.class);
public static final short TYPE = 20;
public static final short LENGTH = 4;
private final int rawValue;
/**
* Constructor to initialize raw Value.
*
* @param rawValue lsp error code value
*/
public StatefulLspErrorCodeTlv(int rawValue) {
this.rawValue = rawValue;
}
/**
* Creates object of StatefulLspErrorCodeTlv.
*
* @param raw lsp error code value
* @return object of StatefulLspErrorCodeTlv
*/
public static StatefulLspErrorCodeTlv of(int raw) {
return new StatefulLspErrorCodeTlv(raw);
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
/**
* Returns lsp error code value.
*
* @return lsp error code value
*/
public int getInt() {
return rawValue;
}
@Override
public short getLength() {
return LENGTH;
}
@Override
public short getType() {
return TYPE;
}
@Override
public int hashCode() {
return Objects.hash(rawValue);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof StatefulLspErrorCodeTlv) {
StatefulLspErrorCodeTlv other = (StatefulLspErrorCodeTlv) obj;
return Objects.equals(this.rawValue, other.rawValue);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(LENGTH);
c.writeInt(rawValue);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads the channel buffer and returns object of StatefulLspErrorCodeTlv.
*
* @param c of type channel buffer
* @return object of StatefulLspErrorCodeTlv
*/
public static StatefulLspErrorCodeTlv read(ChannelBuffer c) {
return StatefulLspErrorCodeTlv.of(c.readInt());
}
@Override
public void print() {
log.debug("StatefulLspErrorCodeTlv");
log.debug("Type: " + TYPE);
log.debug("Length: " + LENGTH);
log.debug("Value: " + rawValue);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass()).add("Type", TYPE).add("Length", LENGTH).add("Value", rawValue)
.toString();
}
}

View File

@ -0,0 +1,235 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/**
* Provides StatefulRsvpErrorSpecTlv.
*/
public class StatefulRsvpErrorSpecTlv implements PcepValueType {
protected static final Logger log = LoggerFactory.getLogger(StatefulRsvpErrorSpecTlv.class);
/* RSVP-ERROR-SPEC TLV format
* Reference :PCEP Extensions for Stateful PCE draft-ietf-pce-stateful-pce-10
*
*
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=21 | Length (variable) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ RSVP ERROR_SPEC or USER_ERROR_SPEC Object +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 1 2 3
+-------------+-------------+-------------+-------------+
| Length (bytes) | Class-Num | C-Type |
+-------------+-------------+-------------+-------------+
| |
// (Object contents) //
| |
+-------------+-------------+-------------+-------------+
Ref : ERROR_SPEC @ RFC2205
IPv4 ERROR_SPEC object: Class = 6, C-Type = 1
+-------------+-------------+-------------+-------------+
| IPv4 Error Node Address (4 bytes) |
+-------------+-------------+-------------+-------------+
| Flags | Error Code | Error Value |
+-------------+-------------+-------------+-------------+
IPv6 ERROR_SPEC object: Class = 6, C-Type = 2
+-------------+-------------+-------------+-------------+
| |
+ +
| |
+ IPv6 Error Node Address (16 bytes) +
| |
+ +
| |
+-------------+-------------+-------------+-------------+
| Flags | Error Code | Error Value |
+-------------+-------------+-------------+-------------+
Ref : USER_ERROR_SPEC @ RFC5284
USER_ERROR_SPEC object: Class = 194, C-Type = 1
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
+---------------+---------------+---------------+---------------+
| Enterprise Number |
+---------------+---------------+---------------+---------------+
| Sub Org | Err Desc Len | User Error Value |
+---------------+---------------+---------------+---------------+
| |
~ Error Description ~
| |
+---------------+---------------+---------------+---------------+
| |
~ User-Defined Subobjects ~
| |
+---------------+---------------+---------------+---------------+
*/
public static final short TYPE = 21;
public static final int OBJECT_HEADER_LENGTH = 4;
private final short hLength;
private final PcepRsvpErrorSpec rsvpErrSpecObj;
private final boolean isErrSpceObjSet;
/**
* Constructor to initialize errSpecObj.
*
* @param rsvpErrSpecObj Rsvp error spec object
* @param hLength length of rsvp error spec object
*/
public StatefulRsvpErrorSpecTlv(PcepRsvpErrorSpec rsvpErrSpecObj, short hLength) {
this.rsvpErrSpecObj = rsvpErrSpecObj;
this.isErrSpceObjSet = true;
this.hLength = hLength;
}
/**
* Returns PcepRsvpErrorSpecObject.
*
* @return rsvpErrSpecObj
*/
public PcepRsvpErrorSpec getPcepRsvpErrorSpec() {
return this.rsvpErrSpecObj;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return hLength;
}
/**
* Reads channel buffer and returns object of StatefulRsvpErrorSpecTlv.
*
* @param cb of type channel buffer
* @return object of StatefulRsvpErrorSpecTlv
*/
public static PcepValueType read(ChannelBuffer cb) throws PcepParseException {
PcepRsvpErrorSpec rsvpErrSpecObj = null;
PcepRsvpSpecObjHeader rsvpErrSpecObjHeader;
cb.markReaderIndex();
rsvpErrSpecObjHeader = PcepRsvpSpecObjHeader.read(cb);
cb.resetReaderIndex();
if (PcepRsvpIpv4ErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum()
&& PcepRsvpIpv4ErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) {
rsvpErrSpecObj = PcepRsvpIpv4ErrorSpec.read(cb);
} else if (PcepRsvpIpv6ErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum()
&& PcepRsvpIpv6ErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) {
rsvpErrSpecObj = PcepRsvpIpv6ErrorSpec.read(cb);
} else if (PcepRsvpUserErrorSpec.CLASS_NUM == rsvpErrSpecObjHeader.getObjClassNum()
&& PcepRsvpUserErrorSpec.CLASS_TYPE == rsvpErrSpecObjHeader.getObjClassType()) {
rsvpErrSpecObj = PcepRsvpUserErrorSpec.read(cb);
}
return rsvpErrSpecObj;
}
@Override
public int hashCode() {
return Objects.hash(rsvpErrSpecObj.hashCode());
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof StatefulRsvpErrorSpecTlv) {
StatefulRsvpErrorSpecTlv other = (StatefulRsvpErrorSpecTlv) obj;
return Objects.equals(this.rsvpErrSpecObj, other.rsvpErrSpecObj);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iStartIndex = c.writerIndex();
c.writeShort(TYPE);
int tlvLenIndex = c.writerIndex();
c.writeShort(hLength);
if (isErrSpceObjSet) {
rsvpErrSpecObj.write(c);
}
short tlvLen = (short) (c.writerIndex() - iStartIndex + 4);
c.setShort(tlvLenIndex, tlvLen);
return tlvLen;
}
@Override
public void print() {
log.debug("StatefulRsvpErrorSpecTlv");
log.debug("Type: " + TYPE);
log.debug("Length: " + hLength);
if (isErrSpceObjSet) {
rsvpErrSpecObj.print();
}
}
@Override
public String toString() {
ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass());
if (!isErrSpceObjSet) {
toStrHelper
.add("Type", TYPE)
.add("Length", hLength);
} else {
toStrHelper
.add("Type", TYPE)
.add("Length", hLength)
.add("RSVP Error Spec Object", rsvpErrSpecObj);
}
return toStrHelper.toString();
}
}

View File

@ -0,0 +1,165 @@
/*
* Copyright 2015 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.pcepio.types;
import java.util.Objects;
import org.jboss.netty.buffer.ChannelBuffer;
import org.onosproject.pcepio.protocol.PcepVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.MoreObjects;
/**
* Provides SymbolicPathNameTlv.
*/
public class SymbolicPathNameTlv implements PcepValueType {
/*
* SYMBOLIC-PATH-NAME TLV format
* Reference :PCEP Extensions for Stateful PCE draft-ietf-pce-stateful-pce-10
*
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=17 | Length (variable) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
// Symbolic Path Name //
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
protected static final Logger log = LoggerFactory.getLogger(SymbolicPathNameTlv.class);
public static final short TYPE = 17;
private short hLength;
private final byte[] rawValue;
/**
* Constructor to initialize raw Value.
*
* @param rawValue Symbolic path name
*/
public SymbolicPathNameTlv(byte[] rawValue) {
this.rawValue = rawValue;
this.hLength = (short) rawValue.length;
}
/**
* Constructor to initialize raw Value.
*
* @param rawValue Symbolic path name
* @param hLength length of Symbolic path name
*/
public SymbolicPathNameTlv(byte[] rawValue, short hLength) {
this.rawValue = rawValue;
if (0 == hLength) {
this.hLength = (short) rawValue.length;
} else {
this.hLength = hLength;
}
}
/**
* Creates an object of SymbolicPathNameTlv.
*
* @param raw Symbolic path name
* @param hLength length of Symbolic path name
* @return object of SymbolicPathNameTlv
*/
public static SymbolicPathNameTlv of(final byte[] raw, short hLength) {
return new SymbolicPathNameTlv(raw, hLength);
}
/**
* Returns Symbolic path name.
*
* @return Symbolic path name byte array
*/
public byte[] getValue() {
return rawValue;
}
@Override
public PcepVersion getVersion() {
return PcepVersion.PCEP_1;
}
@Override
public short getType() {
return TYPE;
}
@Override
public short getLength() {
return hLength;
}
@Override
public int hashCode() {
return Objects.hash(rawValue);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SymbolicPathNameTlv) {
SymbolicPathNameTlv other = (SymbolicPathNameTlv) obj;
return Objects.equals(this.rawValue, other.rawValue);
}
return false;
}
@Override
public int write(ChannelBuffer c) {
int iLenStartIndex = c.writerIndex();
c.writeShort(TYPE);
c.writeShort(hLength);
c.writeBytes(rawValue);
return c.writerIndex() - iLenStartIndex;
}
/**
* Reads channel buffer and returns object of SymbolicPathNameTlv.
*
* @param c of type channel buffer
* @param hLength length of bytes to read
* @return object of SymbolicPathNameTlv
*/
public static SymbolicPathNameTlv read(ChannelBuffer c, short hLength) {
byte[] symbolicPathName = new byte[hLength];
c.readBytes(symbolicPathName, 0, hLength);
return new SymbolicPathNameTlv(symbolicPathName, hLength);
}
@Override
public void print() {
log.debug("SymbolicPathNameTlv");
log.debug("Type: " + TYPE);
log.debug("Length: " + hLength);
log.debug("Symbolic Path Name : " + rawValue);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass()).add("Symbolic Path Name ", rawValue).toString();
}
}

View File

@ -0,0 +1,84 @@
/*
* Copyright 2014-2015 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.pcepio;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepFactories;
import org.onosproject.pcepio.protocol.PcepMessage;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.onosproject.pcepio.protocol.PcepCloseMsg;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PcepCloseMsgTest {
protected static final Logger log = LoggerFactory.getLogger(PcepCloseMsgTest.class);
@Before
public void startUp() {
}
@After
public void tearDown() {
}
@Test
public void closeMessageTest1() throws PcepParseException {
byte[] closeMsg = new byte[] {0x20, 0x07, 0x00, 0x0C, /* common header */
0x0f, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02 };
byte[] testCloseMsg = {0};
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
buffer.writeBytes(closeMsg);
PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
PcepMessage message = null;
try {
message = reader.readFrom(buffer);
} catch (PcepParseException e) {
e.printStackTrace();
}
if (message instanceof PcepCloseMsg) {
ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
message.writeTo(buf);
testCloseMsg = buf.array();
int iReadLen = buf.writerIndex() - 0;
testCloseMsg = new byte[iReadLen];
buf.readBytes(testCloseMsg, 0, iReadLen);
if (Arrays.equals(closeMsg, testCloseMsg)) {
Assert.assertArrayEquals(closeMsg, testCloseMsg);
log.debug("CloseMsg are equal :" + closeMsg);
} else {
Assert.fail("test case failed");
log.debug("not equal");
}
} else {
Assert.fail("test case failed");
log.debug("not equal");
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,86 @@
/*
* Copyright 2014-2015 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.pcepio;
import java.util.Arrays;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcepFactories;
import org.onosproject.pcepio.protocol.PcepKeepaliveMsg;
import org.onosproject.pcepio.protocol.PcepMessage;
import org.onosproject.pcepio.protocol.PcepMessageReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PcepKeepaliveMsgTest {
protected static final Logger log = LoggerFactory.getLogger(PcepKeepaliveMsgTest.class);
@Before
public void startUp() {
}
@After
public void tearDown() {
}
@Test
public void keepaliveMessageTest1() throws PcepParseException {
byte[] keepaliveMsg = new byte[] {0x20, 0x02, 0x00, 0x04 };
byte[] testKeepaliveMsg = {0};
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
buffer.writeBytes(keepaliveMsg);
PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
PcepMessage message = null;
try {
message = reader.readFrom(buffer);
} catch (PcepParseException e) {
e.printStackTrace();
}
if (message instanceof PcepKeepaliveMsg) {
ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
message.writeTo(buf);
testKeepaliveMsg = buf.array();
int iReadLen = buf.writerIndex() - 0;
testKeepaliveMsg = new byte[iReadLen];
buf.readBytes(testKeepaliveMsg, 0, iReadLen);
if (Arrays.equals(keepaliveMsg, testKeepaliveMsg)) {
Assert.assertArrayEquals(keepaliveMsg, testKeepaliveMsg);
log.debug("keepaliveMsg are equal :" + keepaliveMsg);
} else {
Assert.fail("test case failed");
log.debug("not equal");
}
} else {
Assert.fail("test case failed");
log.debug("not equal");
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,45 @@
/*
* Copyright 2015 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.pcepio;
import org.junit.Test;
import org.onosproject.pcepio.types.SymbolicPathNameTlv;
import com.google.common.testing.EqualsTester;
/**
* Test case for Symbolic path tlv.
*/
public class SymbolicPathNameTlvTest {
byte[] value1 = {0x41 };
Short length1 = new Short((short) 2);
final SymbolicPathNameTlv tlv1 = SymbolicPathNameTlv.of(value1, length1);
byte[] value2 = {0x41 };
Short length2 = new Short((short) 2);
final SymbolicPathNameTlv tlv2 = SymbolicPathNameTlv.of(value1, length2);
byte[] value3 = {0x41, 0x43 };
Short length3 = new Short((short) 3);
final SymbolicPathNameTlv tlv3 = SymbolicPathNameTlv.of(value3, length3);
@Test
public void basics() {
new EqualsTester().addEqualityGroup(tlv1, tlv2).addEqualityGroup(tlv3).testEquals();
}
}