/* * Copyright 2015-present Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.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.PcepBandwidthObject; import org.onosproject.pcepio.protocol.PcepEroObject; import org.onosproject.pcepio.protocol.PcepLspObject; import org.onosproject.pcepio.protocol.PcepRroObject; import org.onosproject.pcepio.protocol.PcepSrpObject; import org.onosproject.pcepio.protocol.PcepStateReport; 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; /** * Provide the State Report for the Pcep Report Message. * Reference :PCE extensions for stateful draft-ietf-pce-stateful-pce-10. */ public class PcepStateReportVer1 implements PcepStateReport { /* * <state-report> ::= [<SRP>] <LSP> <path> Where: <path> ::= <ERO><attribute-list>[<RRO>] */ protected static final Logger log = LoggerFactory.getLogger(PcepStateReport.class); public static final int OBJECT_HEADER_LENGTH = 4; /** * Provides PCEP Message path for report message. */ public class PcepMsgPath implements PcepStateReport.PcepMsgPath { /* * <path> ::= <ERO><attribute-list>[<RRO>] */ //PcepEroObject private PcepEroObject eroObj; private boolean isEroObjectSet; //PcepAttribute List private PcepAttribute attrList; private boolean isAttributeListSet; //PcepRroObject private PcepRroObject rroObj; private boolean isRroObjectSet; private PcepBandwidthObject bandwidth; private boolean isBandwidthObjectSet; /** * Constructor to reset the parameters. */ public PcepMsgPath() { eroObj = null; attrList = null; rroObj = null; this.isEroObjectSet = false; this.isAttributeListSet = false; this.isRroObjectSet = false; this.isBandwidthObjectSet = false; } /** * Constructor to initialize the parameters from PCEP Message path. * * @param eroObj PCEP ERO Object * @param attrList PCEP Attribute * @param rroObj PCEP Rro Object * @param bandwidth PCEP bandwidth object */ public PcepMsgPath(PcepEroObject eroObj, PcepAttribute attrList, PcepRroObject rroObj, PcepBandwidthObject bandwidth) { this.eroObj = eroObj; this.attrList = attrList; this.rroObj = rroObj; this.bandwidth = bandwidth; if (rroObj == null) { this.isRroObjectSet = false; } else { this.isRroObjectSet = true; } if (eroObj == null) { this.isEroObjectSet = false; } else { this.isEroObjectSet = true; } if (attrList == null) { this.isAttributeListSet = false; } else { this.isAttributeListSet = true; } if (bandwidth == null) { this.isBandwidthObjectSet = false; } else { this.isBandwidthObjectSet = true; } } /** * Returns PcepEroObject. * * @return eroObj PCEP ERO Object */ @Override public PcepEroObject getEroObject() { return this.eroObj; } /** * Returns PCEP Attribute. * * @return attrList Attribute list */ @Override public PcepAttribute getPcepAttribute() { return this.attrList; } /** * Returns PcepRroObject. * * @return rroObj PCEP RRO Object */ @Override public PcepRroObject getRroObject() { return this.rroObj; } @Override public PcepBandwidthObject getBandwidthObject() { return this.bandwidth; } @Override public void setEroObject(PcepEroObject eroObj) { this.eroObj = eroObj; } @Override public void setPcepAttribute(PcepAttribute attrList) { this.attrList = attrList; } @Override public void setRroObject(PcepRroObject rroObj) { this.rroObj = rroObj; } @Override public void setBandwidthObject(PcepBandwidthObject bandwidth) { this.bandwidth = bandwidth; } /** * Reads all the Objects for PCEP Message Path. * * @param bb of type channel buffer * @return PCEP Message path * @throws PcepParseException when fails to read pcep message path */ @Override public PcepMsgPath read(ChannelBuffer bb) throws PcepParseException { PcepEroObject eroObj; PcepAttribute attrList; PcepRroObject rroObj = null; PcepBandwidthObject bandwidth = null; eroObj = PcepEroObjectVer1.read(bb); attrList = PcepAttributeVer1.read(bb); boolean bBreakWhile = false; while (0 < bb.readableBytes()) { if (bb.readableBytes() < OBJECT_HEADER_LENGTH) { break; } bb.markReaderIndex(); PcepObjectHeader tempObjHeader = PcepObjectHeader.read(bb); bb.resetReaderIndex(); byte yObjClass = tempObjHeader.getObjClass(); switch (yObjClass) { case PcepRroObjectVer1.RRO_OBJ_CLASS: rroObj = PcepRroObjectVer1.read(bb); break; case PcepInterLayerObjectVer1.INTER_LAYER_OBJ_CLASS: bb.skipBytes(tempObjHeader.getObjLen()); break; case PcepBandwidthObjectVer1.BANDWIDTH_OBJ_CLASS: bandwidth = PcepBandwidthObjectVer1.read(bb); break; default: //Otherthan above objects handle those objects in caller. bBreakWhile = true; break; } if (bBreakWhile) { break; } } return new PcepMsgPath(eroObj, attrList, rroObj, bandwidth); } /** * Writes all the objects for PCEP message path. * * @param bb of type channel buffer. * @return object length index * @throws PcepParseException when fails to write to channel buffer */ @Override public int write(ChannelBuffer bb) throws PcepParseException { int iLenStartIndex = bb.writerIndex(); //write Object header if (this.isEroObjectSet) { this.eroObj.write(bb); } else { throw new PcepParseException("Ero object is not set in path"); } if (this.isAttributeListSet) { this.attrList.write(bb); } // RRO is optional check and read if (this.isRroObjectSet) { this.rroObj.write(bb); // bandwidth should come along with RRO. if (this.isBandwidthObjectSet) { this.bandwidth.write(bb); } } return bb.writerIndex() - iLenStartIndex; } @Override public String toString() { ToStringHelper toStrHelper = MoreObjects.toStringHelper(getClass()); if (attrList != null) { toStrHelper.add("AttributeList", attrList); } if (rroObj instanceof PcepRroObjectVer1) { toStrHelper.add("RroObject", rroObj); } if (bandwidth instanceof PcepBandwidthObjectVer1) { toStrHelper.add("bandwidthObject", bandwidth); } return toStrHelper.toString(); } } //SRP Object private PcepSrpObject srpObject; //LSP Object private PcepLspObject lspObject; //PcepMsgPath private PcepStateReport.PcepMsgPath msgPath; /** * Constructor to reset objects. */ public PcepStateReportVer1() { this.srpObject = null; this.lspObject = null; this.msgPath = null; } public PcepStateReportVer1(PcepSrpObject srpObject, PcepLspObject lspObject, PcepStateReport.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 PcepStateReport.PcepMsgPath getMsgPath() { return msgPath; } @Override public void setSrpObject(PcepSrpObject srpObj) { this.srpObject = srpObj; } @Override public void setLspObject(PcepLspObject lspObject) { this.lspObject = lspObject; } @Override public void setMsgPath(PcepStateReport.PcepMsgPath msgPath) { this.msgPath = msgPath; } /** * Builder class for PCEP state report. */ public static class Builder implements PcepStateReport.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 PcepStateReport.PcepMsgPath msgPath; @Override public PcepStateReport build() throws PcepParseException { //PCEP SRP Object PcepSrpObject srpObject = null; //PCEP LSP Object PcepLspObject lspObject = null; //PCEP Attribute list PcepStateReport.PcepMsgPath msgPath = null; if (this.bIsSrpObjectSet) { srpObject = this.srpObject; } if (!this.bIsLspObjectSet) { throw new PcepParseException(" LSP Object NOT Set while building PcepStateReport."); } else { lspObject = this.lspObject; } if (!this.bIsPcepMsgPathSet) { throw new PcepParseException(" Message Path NOT Set while building PcepStateReport."); } else { msgPath = this.msgPath; } return new PcepStateReportVer1(srpObject, lspObject, msgPath); } @Override public PcepSrpObject getSrpObject() { return this.srpObject; } @Override public PcepLspObject getLspObject() { return this.lspObject; } @Override public PcepStateReport.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(PcepStateReport.PcepMsgPath msgPath) { this.msgPath = msgPath; this.bIsPcepMsgPathSet = true; return this; } } @Override public String toString() { return MoreObjects.toStringHelper(getClass()) .omitNullValues() .add("SrpObject", srpObject) .add("LspObject", lspObject) .add("MsgPath", msgPath) .toString(); } }