blob: 6055642cfd4436419fa1998a2b84271348d00aef [file] [log] [blame]
Mahesh Poojary S5afd06c2015-08-21 14:51:04 +05301/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16package org.onosproject.pcepio.protocol.ver1;
17
18import java.util.LinkedList;
19import java.util.ListIterator;
20
21import org.jboss.netty.buffer.ChannelBuffer;
22import org.onosproject.pcepio.exceptions.PcepParseException;
23import org.onosproject.pcepio.protocol.PcepRPObject;
24import org.onosproject.pcepio.types.PcepObjectHeader;
25import org.onosproject.pcepio.types.PcepValueType;
26import org.slf4j.Logger;
27import org.slf4j.LoggerFactory;
28
29import com.google.common.base.MoreObjects;
30
31public class PcepRPObjectVer1 implements PcepRPObject {
32
33 /*
34 * RP Object.
35 0 1 2 3
36 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
37 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38 | Flags |O|B|R| Pri |
39 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40 | Request-ID-number |
41 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42 | |
43 // Optional TLVs //
44 | |
45 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
46 */
47
48 protected static final Logger log = LoggerFactory.getLogger(PcepRPObjectVer1.class);
49
50 public static final byte RP_OBJ_TYPE = 1;
51 public static final byte RP_OBJ_CLASS = 2;
52 public static final byte RP_OBJECT_VERSION = 1;
53 public static final short RP_OBJ_MINIMUM_LENGTH = 12;
54
55 public static final int DEFAULT_REQUEST_ID_NUM = 0;
56 //Signalled , all default values to be checked.
57 public static final boolean DEFAULT_OFLAG = false;
58 public static final boolean DEFAULT_BFLAG = false;
59 public static final boolean DEFAULT_RFLAG = false;
60 public static final byte DEFAULT_PRIFLAG = 0;
61 public static final int OBJECT_HEADER_LENGTH = 4;
62 public static final int OFLAG_SHIFT_VALUE = 5;
63 public static final int BFLAG_SHIFT_VALUE = 4;
64 public static final int RFLAG_SHIFT_VALUE = 3;
65 public static final int OFLAG_TEMP_SHIFT_VALUE = 0x20;
66 public static final int BFLAG_TEMP_SHIFT_VALUE = 0x10;
67 public static final int RFLAG_TEMP_SHIFT_VALUE = 0x08;
68 public static final int PRIFLAG_TEMP_SHIFT_VALUE = 0x07;
69 public static final int BIT_SET = 1;
70 public static final int BIT_RESET = 0;
71 public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
72
73 public static final PcepObjectHeader DEFAULT_RP_OBJECT_HEADER = new PcepObjectHeader(RP_OBJ_CLASS, RP_OBJ_TYPE,
74 PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, RP_OBJ_MINIMUM_LENGTH);
75
76 private PcepObjectHeader rpObjHeader;
77 private int iRequestIdNum;
78 private boolean bOFlag;
79 private boolean bBFlag;
80 private boolean bRFlag;
81 private byte yPriFlag; // 3bytes
82 private LinkedList<PcepValueType> llOptionalTlv;
83
84 /**
85 * Constructor to initialize variables.
86 *
87 * @param rpObjHeader RP-OBJECT header
88 * @param iRequestIdNum Request-ID-number
89 * @param bOFlag O-flag
90 * @param bBFlag B-flag
91 * @param bRFlag R-flag
92 * @param yPriFlag Pri-flag
93 * @param llOptionalTlv linked list of Optional TLV
94 */
95 public PcepRPObjectVer1(PcepObjectHeader rpObjHeader, int iRequestIdNum, boolean bOFlag, boolean bBFlag,
96 boolean bRFlag, byte yPriFlag, LinkedList<PcepValueType> llOptionalTlv) {
97 this.rpObjHeader = rpObjHeader;
98 this.iRequestIdNum = iRequestIdNum;
99 this.bOFlag = bOFlag;
100 this.bBFlag = bBFlag;
101 this.bRFlag = bRFlag;
102 this.yPriFlag = yPriFlag;
103 this.llOptionalTlv = llOptionalTlv;
104 }
105
106 /**
107 * Sets RP Object header.
108 *
109 * @param obj RP Object header
110 */
111 public void setRPObjHeader(PcepObjectHeader obj) {
112 this.rpObjHeader = obj;
113 }
114
115 @Override
116 public void setRequestIdNum(int iRequestIdNum) {
117 this.iRequestIdNum = iRequestIdNum;
118 }
119
120 @Override
121 public void setOFlag(boolean bOFlag) {
122 this.bOFlag = bOFlag;
123 }
124
125 @Override
126 public void setBFlag(boolean bBFlag) {
127 this.bBFlag = bBFlag;
128 }
129
130 @Override
131 public void setRFlag(boolean bRFlag) {
132 this.bRFlag = bRFlag;
133 }
134
135 @Override
136 public void setPriFlag(byte yPriFlag) {
137 this.yPriFlag = yPriFlag;
138 }
139
140 /**
141 * Returns RP Object header.
142 *
143 * @return rpObjHeader
144 */
145 public PcepObjectHeader getRPObjHeader() {
146 return this.rpObjHeader;
147 }
148
149 @Override
150 public int getRequestIdNum() {
151 return this.iRequestIdNum;
152 }
153
154 @Override
155 public boolean getOFlag() {
156 return this.bOFlag;
157 }
158
159 @Override
160 public boolean getBFlag() {
161 return this.bBFlag;
162 }
163
164 @Override
165 public boolean getRFlag() {
166 return this.bRFlag;
167 }
168
169 @Override
170 public byte getPriFlag() {
171 return this.yPriFlag;
172 }
173
174 /**
175 * Reads the channel buffer and returns the object of PcepRPObject.
176 *
177 * @param cb of type channel buffer
178 * @return the object of PcepRPObject
179 * @throws PcepParseException if mandatory fields are missing
180 */
181 public static PcepRPObject read(ChannelBuffer cb) throws PcepParseException {
182 log.debug("read");
183 PcepObjectHeader rpObjHeader;
184 int iRequestIdNum;
185 boolean bOFlag;
186 boolean bBFlag;
187 boolean bRFlag;
188 byte yPriFlag; // 3bytes
189 LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
190
191 rpObjHeader = PcepObjectHeader.read(cb);
192
193 //take only LspObject buffer.
194 ChannelBuffer tempCb = cb.readBytes(rpObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
195
196 int iTemp = tempCb.readInt();
197 yPriFlag = (byte) (iTemp & PRIFLAG_TEMP_SHIFT_VALUE);
198 bOFlag = (iTemp & OFLAG_TEMP_SHIFT_VALUE) == OFLAG_TEMP_SHIFT_VALUE ? true : false;
199 bBFlag = (iTemp & BFLAG_TEMP_SHIFT_VALUE) == BFLAG_TEMP_SHIFT_VALUE ? true : false;
200 bRFlag = (iTemp & RFLAG_TEMP_SHIFT_VALUE) == RFLAG_TEMP_SHIFT_VALUE ? true : false;
201
202 iRequestIdNum = tempCb.readInt();
203
204 // parse optional TLV
205 llOptionalTlv = parseOptionalTlv(tempCb);
206
207 return new PcepRPObjectVer1(rpObjHeader, iRequestIdNum, bOFlag, bBFlag, bRFlag, yPriFlag, llOptionalTlv);
208 }
209
210 @Override
211 public int write(ChannelBuffer cb) throws PcepParseException {
212
213 //write Object header
214 int objStartIndex = cb.writerIndex();
215
216 int objLenIndex = rpObjHeader.write(cb);
217
218 if (objLenIndex <= 0) {
219 throw new PcepParseException("ObjectLength Index is " + objLenIndex);
220 }
221 int iTemp;
222 iTemp = (yPriFlag);
223
224 iTemp = (bOFlag) ? (iTemp | OFLAG_SHIFT_VALUE) : iTemp;
225 iTemp = (bBFlag) ? (iTemp | BFLAG_SHIFT_VALUE) : iTemp;
226 iTemp = (bRFlag) ? (iTemp | RFLAG_SHIFT_VALUE) : iTemp;
227
228 cb.writeInt(iTemp);
229 cb.writeInt(iRequestIdNum);
230
231 // Add optional TLV
232 packOptionalTlv(cb);
233
234 //Update object length now
235 int length = cb.writerIndex() - objStartIndex;
236
237 //will be helpful during print().
238 rpObjHeader.setObjLen((short) length);
239
240 cb.setShort(objLenIndex, (short) length);
241 return cb.writerIndex();
242 }
243
244 /**
245 * Returns list of optional tlvs.
246 *
247 * @param cb of type channel buffer.
248 * @return llOutOptionalTlv linked list of Optional TLV
249 * @throws PcepParseException if mandatory fields are missing
250 */
251 protected static LinkedList<PcepValueType> parseOptionalTlv(ChannelBuffer cb) throws PcepParseException {
252
253 LinkedList<PcepValueType> llOutOptionalTlv = new LinkedList<PcepValueType>();
254 //Currently no optional TLvs, will be added based on requirements.
255 return llOutOptionalTlv;
256 }
257
258 /**
259 * Returns optional tlvs.
260 *
261 * @param cb of type channel buffer
262 * @return llOptionalTlv linked list of Optional TLV
263 */
264 protected int packOptionalTlv(ChannelBuffer cb) {
265
266 ListIterator<PcepValueType> listIterator = llOptionalTlv.listIterator();
267 while (listIterator.hasNext()) {
268 listIterator.next().write(cb);
269 }
270
271 return cb.writerIndex();
272 }
273
274 public static class Builder implements PcepRPObject.Builder {
275
276 private boolean bIsHeaderSet = false;
277 private boolean bIsRequestIdNumSet = false;
278 private boolean bIsOFlagSet = false;
279 private boolean bIsRFlagset = false;
280 private boolean bIsBFlagSet = false;
281 private boolean bIsPriFlagSet = false;
282
283 private PcepObjectHeader rpObjHeader;
284 private int requestIdNum;
285 private boolean bOFlag;
286 private boolean bBFlag;
287 private boolean bRFlag;
288 private byte yPriFlag;
289 private LinkedList<PcepValueType> llOptionalTlv = new LinkedList<PcepValueType>();
290
291 private boolean bIsPFlagSet = false;
292 private boolean bPFlag;
293
294 private boolean bIsIFlagSet = false;
295 private boolean bIFlag;
296
297 @Override
298 public PcepRPObject build() {
299 PcepObjectHeader lspObjHeader = this.bIsHeaderSet ? this.rpObjHeader : DEFAULT_RP_OBJECT_HEADER;
300
301 int requestIdNum = this.bIsRequestIdNumSet ? this.requestIdNum : DEFAULT_REQUEST_ID_NUM;
302 boolean bOFlag = this.bIsOFlagSet ? this.bOFlag : DEFAULT_OFLAG;
303 boolean bBFlag = this.bIsBFlagSet ? this.bBFlag : DEFAULT_BFLAG;
304 boolean bRFlag = this.bIsRFlagset ? this.bRFlag : DEFAULT_RFLAG;
305 byte yPriFlag = this.bIsPriFlagSet ? this.yPriFlag : DEFAULT_PRIFLAG;
306
307 if (bIsPFlagSet) {
308 lspObjHeader.setPFlag(bPFlag);
309 }
310
311 if (bIsIFlagSet) {
312 lspObjHeader.setIFlag(bIFlag);
313 }
314
315 return new PcepRPObjectVer1(lspObjHeader, requestIdNum, bOFlag, bBFlag, bRFlag, yPriFlag, llOptionalTlv);
316 }
317
318 @Override
319 public PcepObjectHeader getRPObjHeader() {
320 return this.rpObjHeader;
321 }
322
323 @Override
324 public Builder setRPObjHeader(PcepObjectHeader obj) {
325 this.rpObjHeader = obj;
326 this.bIsHeaderSet = true;
327 return this;
328 }
329
330 @Override
331 public int getRequestIdNum() {
332 return this.requestIdNum;
333 }
334
335 @Override
336 public Builder setRequestIdNum(int value) {
337 this.requestIdNum = value;
338 this.bIsRequestIdNumSet = true;
339 return this;
340 }
341
342 @Override
343 public Builder setOFlag(boolean value) {
344 this.bOFlag = value;
345 this.bIsOFlagSet = true;
346 return this;
347 }
348
349 @Override
350 public boolean getBFlag() {
351 return this.bBFlag;
352 }
353
354 @Override
355 public Builder setBFlag(boolean value) {
356 this.bBFlag = value;
357 this.bIsBFlagSet = true;
358 return this;
359 }
360
361 @Override
362 public boolean getRFlag() {
363 return this.bRFlag;
364 }
365
366 @Override
367 public Builder setRFlag(boolean value) {
368 this.bRFlag = value;
369 this.bIsRFlagset = true;
370 return this;
371 }
372
373 @Override
374 public byte getPriFlag() {
375 return this.yPriFlag;
376 }
377
378 @Override
379 public Builder setPriFlag(byte value) {
380 this.yPriFlag = value;
381 this.bIsPriFlagSet = true;
382 return this;
383 }
384
385 @Override
386 public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
387 this.llOptionalTlv = llOptionalTlv;
388 return this;
389 }
390
391 @Override
392 public LinkedList<PcepValueType> getOptionalTlv() {
393 return this.llOptionalTlv;
394 }
395
396 @Override
397 public Builder setPFlag(boolean value) {
398 this.bPFlag = value;
399 this.bIsPFlagSet = true;
400 return this;
401 }
402
403 @Override
404 public Builder setIFlag(boolean value) {
405 this.bIFlag = value;
406 this.bIsIFlagSet = true;
407 return this;
408 }
409
410 @Override
411 public boolean getOFlag() {
412 return this.bOFlag;
413 }
414
415 }
416
417 @Override
418 public LinkedList<PcepValueType> getOptionalTlv() {
419 return this.llOptionalTlv;
420 }
421
422 @Override
423 public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
424 this.llOptionalTlv = llOptionalTlv;
425 }
426
427 @Override
428 public String toString() {
429 return MoreObjects.toStringHelper(getClass()).add("ObjectHeader", rpObjHeader).add("OFlag", (bOFlag) ? 1 : 0)
430 .add("BFlag", (bBFlag) ? 1 : 0).add("RFlag", (bRFlag) ? 1 : 0).add("PriFlag", yPriFlag)
431 .add("RequestIdNumber", iRequestIdNum).add("OptionalTlv", llOptionalTlv).toString();
432 }
433}