2 * Copyright 2015 Open Networking Laboratory
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.onosproject.pcepio.protocol.ver1;
18 import java.util.LinkedList;
19 import java.util.ListIterator;
21 import org.jboss.netty.buffer.ChannelBuffer;
22 import org.onosproject.pcepio.exceptions.PcepParseException;
23 import org.onosproject.pcepio.protocol.PcepRPObject;
24 import org.onosproject.pcepio.types.PcepObjectHeader;
25 import org.onosproject.pcepio.types.PcepValueType;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
29 import com.google.common.base.MoreObjects;
32 * Provides PCEP RP object.
34 public class PcepRPObjectVer1 implements PcepRPObject {
39 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
40 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
48 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 protected static final Logger log = LoggerFactory.getLogger(PcepRPObjectVer1.class);
53 public static final byte RP_OBJ_TYPE = 1;
54 public static final byte RP_OBJ_CLASS = 2;
55 public static final byte RP_OBJECT_VERSION = 1;
56 public static final short RP_OBJ_MINIMUM_LENGTH = 12;
58 public static final int DEFAULT_REQUEST_ID_NUM = 0;
59 //Signalled , all default values to be checked.
60 public static final boolean DEFAULT_OFLAG = false;
61 public static final boolean DEFAULT_BFLAG = false;
62 public static final boolean DEFAULT_RFLAG = false;
63 public static final byte DEFAULT_PRIFLAG = 0;
64 public static final int OBJECT_HEADER_LENGTH = 4;
65 public static final int OFLAG_SHIFT_VALUE = 5;
66 public static final int BFLAG_SHIFT_VALUE = 4;
67 public static final int RFLAG_SHIFT_VALUE = 3;
68 public static final int OFLAG_TEMP_SHIFT_VALUE = 0x20;
69 public static final int BFLAG_TEMP_SHIFT_VALUE = 0x10;
70 public static final int RFLAG_TEMP_SHIFT_VALUE = 0x08;
71 public static final int PRIFLAG_TEMP_SHIFT_VALUE = 0x07;
72 public static final int BIT_SET = 1;
73 public static final int BIT_RESET = 0;
74 public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
76 public static final PcepObjectHeader DEFAULT_RP_OBJECT_HEADER = new PcepObjectHeader(RP_OBJ_CLASS, RP_OBJ_TYPE,
77 PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, RP_OBJ_MINIMUM_LENGTH);
79 private PcepObjectHeader rpObjHeader;
80 private int iRequestIdNum;
81 private boolean bOFlag;
82 private boolean bBFlag;
83 private boolean bRFlag;
84 private byte yPriFlag; // 3bytes
85 private LinkedList<PcepValueType> llOptionalTlv;
88 * Constructor to initialize variables.
90 * @param rpObjHeader RP-OBJECT header
91 * @param iRequestIdNum Request-ID-number
92 * @param bOFlag O-flag
93 * @param bBFlag B-flag
94 * @param bRFlag R-flag
95 * @param yPriFlag Pri-flag
96 * @param llOptionalTlv linked list of Optional TLV
98 public PcepRPObjectVer1(PcepObjectHeader rpObjHeader, int iRequestIdNum, boolean bOFlag, boolean bBFlag,
99 boolean bRFlag, byte yPriFlag, LinkedList<PcepValueType> llOptionalTlv) {
100 this.rpObjHeader = rpObjHeader;
101 this.iRequestIdNum = iRequestIdNum;
102 this.bOFlag = bOFlag;
103 this.bBFlag = bBFlag;
104 this.bRFlag = bRFlag;
105 this.yPriFlag = yPriFlag;
106 this.llOptionalTlv = llOptionalTlv;
110 * Sets RP Object header.
112 * @param obj RP Object header
114 public void setRPObjHeader(PcepObjectHeader obj) {
115 this.rpObjHeader = obj;
119 public void setRequestIdNum(int iRequestIdNum) {
120 this.iRequestIdNum = iRequestIdNum;
124 public void setOFlag(boolean bOFlag) {
125 this.bOFlag = bOFlag;
129 public void setBFlag(boolean bBFlag) {
130 this.bBFlag = bBFlag;
134 public void setRFlag(boolean bRFlag) {
135 this.bRFlag = bRFlag;
139 public void setPriFlag(byte yPriFlag) {
140 this.yPriFlag = yPriFlag;
144 * Returns RP Object header.
146 * @return rpObjHeader
148 public PcepObjectHeader getRPObjHeader() {
149 return this.rpObjHeader;
153 public int getRequestIdNum() {
154 return this.iRequestIdNum;
158 public boolean getOFlag() {
163 public boolean getBFlag() {
168 public boolean getRFlag() {
173 public byte getPriFlag() {
174 return this.yPriFlag;
178 * Reads the channel buffer and returns the object of PcepRPObject.
180 * @param cb of type channel buffer
181 * @return the object of PcepRPObject
182 * @throws PcepParseException if mandatory fields are missing
184 public static PcepRPObject read(ChannelBuffer cb) throws PcepParseException {
186 PcepObjectHeader rpObjHeader;
191 byte yPriFlag; // 3bytes
192 LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
194 rpObjHeader = PcepObjectHeader.read(cb);
196 //take only LspObject buffer.
197 ChannelBuffer tempCb = cb.readBytes(rpObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
199 int iTemp = tempCb.readInt();
200 yPriFlag = (byte) (iTemp & PRIFLAG_TEMP_SHIFT_VALUE);
201 bOFlag = (iTemp & OFLAG_TEMP_SHIFT_VALUE) == OFLAG_TEMP_SHIFT_VALUE;
202 bBFlag = (iTemp & BFLAG_TEMP_SHIFT_VALUE) == BFLAG_TEMP_SHIFT_VALUE;
203 bRFlag = (iTemp & RFLAG_TEMP_SHIFT_VALUE) == RFLAG_TEMP_SHIFT_VALUE;
205 iRequestIdNum = tempCb.readInt();
207 // parse optional TLV
208 llOptionalTlv = parseOptionalTlv(tempCb);
210 return new PcepRPObjectVer1(rpObjHeader, iRequestIdNum, bOFlag, bBFlag, bRFlag, yPriFlag, llOptionalTlv);
214 public int write(ChannelBuffer cb) throws PcepParseException {
216 //write Object header
217 int objStartIndex = cb.writerIndex();
219 int objLenIndex = rpObjHeader.write(cb);
221 if (objLenIndex <= 0) {
222 throw new PcepParseException("ObjectLength Index is " + objLenIndex);
227 iTemp = (bOFlag) ? (iTemp | OFLAG_SHIFT_VALUE) : iTemp;
228 iTemp = (bBFlag) ? (iTemp | BFLAG_SHIFT_VALUE) : iTemp;
229 iTemp = (bRFlag) ? (iTemp | RFLAG_SHIFT_VALUE) : iTemp;
232 cb.writeInt(iRequestIdNum);
237 //Update object length now
238 int length = cb.writerIndex() - objStartIndex;
240 //will be helpful during print().
241 rpObjHeader.setObjLen((short) length);
243 cb.setShort(objLenIndex, (short) length);
244 return cb.writerIndex();
248 * Returns list of optional tlvs.
250 * @param cb of type channel buffer.
251 * @return llOutOptionalTlv linked list of Optional TLV
252 * @throws PcepParseException if mandatory fields are missing
254 protected static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
256 LinkedList<PcepValueType> llOutOptionalTlv = new LinkedList<>();
257 //Currently no optional TLvs, will be added based on requirements.
258 return llOutOptionalTlv;
262 * Returns optional tlvs.
264 * @param cb of type channel buffer
265 * @return llOptionalTlv linked list of Optional TLV
267 protected int packOptionalTlv(ChannelBuffer cb) {
269 ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
270 while (listIterator.hasNext()) {
271 listIterator.next().write(cb);
274 return cb.writerIndex();
278 * Builder class for PCEP rp object.
280 public static class Builder implements PcepRPObject.Builder {
282 private boolean bIsHeaderSet = false;
283 private boolean bIsRequestIdNumSet = false;
284 private boolean bIsOFlagSet = false;
285 private boolean bIsRFlagset = false;
286 private boolean bIsBFlagSet = false;
287 private boolean bIsPriFlagSet = false;
289 private PcepObjectHeader rpObjHeader;
290 private int requestIdNum;
291 private boolean bOFlag;
292 private boolean bBFlag;
293 private boolean bRFlag;
294 private byte yPriFlag;
295 private LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
297 private boolean bIsPFlagSet = false;
298 private boolean bPFlag;
300 private boolean bIsIFlagSet = false;
301 private boolean bIFlag;
304 public PcepRPObject build() {
305 PcepObjectHeader lspObjHeader = this.bIsHeaderSet ? this.rpObjHeader : DEFAULT_RP_OBJECT_HEADER;
307 int requestIdNum = this.bIsRequestIdNumSet ? this.requestIdNum : DEFAULT_REQUEST_ID_NUM;
308 boolean bOFlag = this.bIsOFlagSet ? this.bOFlag : DEFAULT_OFLAG;
309 boolean bBFlag = this.bIsBFlagSet ? this.bBFlag : DEFAULT_BFLAG;
310 boolean bRFlag = this.bIsRFlagset ? this.bRFlag : DEFAULT_RFLAG;
311 byte yPriFlag = this.bIsPriFlagSet ? this.yPriFlag : DEFAULT_PRIFLAG;
314 lspObjHeader.setPFlag(bPFlag);
318 lspObjHeader.setIFlag(bIFlag);
321 return new PcepRPObjectVer1(lspObjHeader, requestIdNum, bOFlag, bBFlag, bRFlag, yPriFlag, llOptionalTlv);
325 public PcepObjectHeader getRPObjHeader() {
326 return this.rpObjHeader;
330 public Builder setRPObjHeader(PcepObjectHeader obj) {
331 this.rpObjHeader = obj;
332 this.bIsHeaderSet = true;
337 public int getRequestIdNum() {
338 return this.requestIdNum;
342 public Builder setRequestIdNum(int value) {
343 this.requestIdNum = value;
344 this.bIsRequestIdNumSet = true;
349 public Builder setOFlag(boolean value) {
351 this.bIsOFlagSet = true;
356 public boolean getBFlag() {
361 public Builder setBFlag(boolean value) {
363 this.bIsBFlagSet = true;
368 public boolean getRFlag() {
373 public Builder setRFlag(boolean value) {
375 this.bIsRFlagset = true;
380 public byte getPriFlag() {
381 return this.yPriFlag;
385 public Builder setPriFlag(byte value) {
386 this.yPriFlag = value;
387 this.bIsPriFlagSet = true;
392 public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
393 this.llOptionalTlv = llOptionalTlv;
398 public LinkedList<PcepValueType> getOptionalTlv() {
399 return this.llOptionalTlv;
403 public Builder setPFlag(boolean value) {
405 this.bIsPFlagSet = true;
410 public Builder setIFlag(boolean value) {
412 this.bIsIFlagSet = true;
417 public boolean getOFlag() {
424 public LinkedList<PcepValueType> getOptionalTlv() {
425 return this.llOptionalTlv;
429 public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
430 this.llOptionalTlv = llOptionalTlv;
434 public String toString() {
435 return MoreObjects.toStringHelper(getClass())
436 .add("ObjectHeader", rpObjHeader)
437 .add("OFlag", (bOFlag) ? 1 : 0)
438 .add("BFlag", (bBFlag) ? 1 : 0)
439 .add("RFlag", (bRFlag) ? 1 : 0)
440 .add("PriFlag", yPriFlag)
441 .add("RequestIdNumber", iRequestIdNum)
442 .add("OptionalTlv", llOptionalTlv)