blob: a4af6746b0afb5d49a2d3bce1f60788f1cb33b2a [file] [log] [blame]
Phaneendra Manda1c0061d2015-08-06 12:29:38 +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 */
16
17package org.onosproject.pcepio.types;
18
19import org.jboss.netty.buffer.ChannelBuffer;
20import org.slf4j.Logger;
21import org.slf4j.LoggerFactory;
22
bharat saraswalf7364db2015-08-11 13:39:31 +053023import com.google.common.base.MoreObjects;
24
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053025/**
26 * Provides PCEP Object Header which is common for all the objects.
27 * Reference : RFC 5440.
28 */
29
30public class PcepObjectHeader {
31
32 /*
33 0 1 2 3
34 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
35 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36 | Object-Class | OT |Res|P|I| Object Length (bytes) |
37 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38 | |
39 // (Object body) //
40 | |
41 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
42
43 PCEP Common Object Header
44 */
45
46 protected static final Logger log = LoggerFactory.getLogger(PcepObjectHeader.class);
47
48 public static final boolean REQ_OBJ_MUST_PROCESS = true;
49 public static final boolean REQ_OBJ_OPTIONAL_PROCESS = false;
50 public static final boolean RSP_OBJ_IGNORED = true;
51 public static final boolean RSP_OBJ_PROCESSED = false;
52 public static final int OBJECT_TYPE_SHIFT_VALUE = 4;
53 public static final byte PFLAG_SET = 0x02;
54 public static final byte IFLAG_SET = 0x01;
55 public static final int SET = 1;
56 private byte objClass;
57 private byte objType;
58 private boolean bPFlag;
59 private boolean bIFlag;
60 private short objLen;
61
62 /**
63 * Constructor to initialize all the variables in object header.
64 *
65 * @param objClass PCEP Object class
66 * @param objType PCEP Object type
67 * @param bPFlag P flag
68 * @param bIFlag I flag
69 * @param objLen PCEP object length
70 */
bharat saraswale1806302015-08-21 12:16:46 +053071
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053072 public PcepObjectHeader(byte objClass, byte objType, boolean bPFlag, boolean bIFlag, short objLen) {
73 this.objClass = objClass;
74 this.objType = objType;
75 this.bPFlag = bPFlag;
76 this.bIFlag = bIFlag;
77 this.objLen = objLen;
78 }
79
80 /**
81 * Sets the Object class.
82 *
83 * @param value object class
84 */
85 public void setObjClass(byte value) {
86 this.objClass = value;
87 }
88
89 /**
90 * Sets the Object TYPE.
91 *
92 * @param value object type
93 */
94 public void setObjType(byte value) {
95 this.objType = value;
96 }
97
98 /**
99 * Sets the Object P flag.
100 *
101 * @param value p flag
102 */
103 public void setPFlag(boolean value) {
104 this.bPFlag = value;
105 }
106
107 /**
108 * Sets the Object I flag.
109 *
110 * @param value I flag
111 */
112 public void setIFlag(boolean value) {
113 this.bIFlag = value;
114 }
115
116 /**
117 * Sets the Object Length.
118 *
119 * @param value object length
120 */
121 public void setObjLen(short value) {
122 this.objLen = value;
123 }
124
125 /**
126 * Returns Object's P flag.
127 *
128 * @return bPFlag P flag
129 */
130 public boolean getPFlag() {
131 return this.bPFlag;
132 }
133
134 /**
135 * Returns Object's i flag.
136 *
137 * @return bIFlag I flag
138 */
139 public boolean getIFlag() {
140 return this.bIFlag;
141 }
142
143 /**
144 * Returns Object Length.
145 *
146 * @return objLen object length
147 */
148 public short getObjLen() {
149 return this.objLen;
150 }
151
152 /**
153 * Returns Object class.
154 *
155 * @return objClass object class
156 */
157 public byte getObjClass() {
158 return this.objClass;
159 }
160
161 /**
162 * Returns Object Type.
163 *
164 * @return objType object type
165 */
166 public byte getObjType() {
167 return this.objType;
168 }
169
170 /**
171 * Writes Byte stream of PCEP object header to channel buffer.
172 *
bharat saraswale1806302015-08-21 12:16:46 +0530173 * @param cb output channel buffer
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530174 * @return objLenIndex object length index in channel buffer
175 */
bharat saraswale1806302015-08-21 12:16:46 +0530176 public int write(ChannelBuffer cb) {
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530177
bharat saraswale1806302015-08-21 12:16:46 +0530178 cb.writeByte(this.objClass);
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530179 byte temp = (byte) (this.objType << OBJECT_TYPE_SHIFT_VALUE);
180 if (this.bPFlag) {
181 temp = (byte) (temp | PFLAG_SET);
182 }
183 if (this.bIFlag) {
184 temp = (byte) (temp | IFLAG_SET);
185 }
bharat saraswale1806302015-08-21 12:16:46 +0530186 cb.writeByte(temp);
187 int objLenIndex = cb.writerIndex();
188 cb.writeShort((short) 0);
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530189 return objLenIndex;
190 }
191
192 /**
193 * Read from channel buffer and Returns PCEP Objects header.
194 *
bharat saraswale1806302015-08-21 12:16:46 +0530195 * @param cb of type channel buffer
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530196 * @return PCEP Object header
197 */
bharat saraswale1806302015-08-21 12:16:46 +0530198 public static PcepObjectHeader read(ChannelBuffer cb) {
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530199
200 byte objClass;
201 byte objType;
202 boolean bPFlag;
203 boolean bIFlag;
204 short objLen;
bharat saraswale1806302015-08-21 12:16:46 +0530205 objClass = cb.readByte();
206 byte temp = cb.readByte();
Phanendra Mandaf346ea82015-09-04 15:21:39 -0700207 bIFlag = (temp & IFLAG_SET) == IFLAG_SET;
208 bPFlag = (temp & PFLAG_SET) == PFLAG_SET;
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530209 objType = (byte) (temp >> OBJECT_TYPE_SHIFT_VALUE);
bharat saraswale1806302015-08-21 12:16:46 +0530210 objLen = cb.readShort();
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530211 return new PcepObjectHeader(objClass, objType, bPFlag, bIFlag, objLen);
212 }
213
bharat saraswalf7364db2015-08-11 13:39:31 +0530214 @Override
215 public String toString() {
Sho SHIMIZU7cdbcf72015-09-03 14:43:05 -0700216 return MoreObjects.toStringHelper(getClass())
217 .add("ObjectClass", objClass)
218 .add("ObjectType", objType)
219 .add("ObjectLength", objLen)
220 .add("PFlag", (bPFlag) ? 1 : 0)
221 .add("IFlag", (bIFlag) ? 1 : 0)
bharat saraswalf7364db2015-08-11 13:39:31 +0530222 .toString();
223 }
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530224}