blob: ad4615c591272e7a75935446641ec02c2be8ea2c [file] [log] [blame]
Phaneendra Manda1c0061d2015-08-06 12:29:38 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Phaneendra Manda1c0061d2015-08-06 12:29:38 +05303 *
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
Priyanka B413fbe82016-05-26 11:44:45 +053019import java.util.Objects;
20
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053021import org.jboss.netty.buffer.ChannelBuffer;
22import org.slf4j.Logger;
23import org.slf4j.LoggerFactory;
24
bharat saraswalf7364db2015-08-11 13:39:31 +053025import com.google.common.base.MoreObjects;
26
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053027/**
28 * Provides PCEP Object Header which is common for all the objects.
29 * Reference : RFC 5440.
30 */
31
32public class PcepObjectHeader {
33
34 /*
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 | Object-Class | OT |Res|P|I| Object Length (bytes) |
39 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
40 | |
41 // (Object body) //
42 | |
43 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
44
45 PCEP Common Object Header
46 */
47
Ray Milkey9c9cde42018-01-12 14:22:06 -080048 private static final Logger log = LoggerFactory.getLogger(PcepObjectHeader.class);
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053049
50 public static final boolean REQ_OBJ_MUST_PROCESS = true;
51 public static final boolean REQ_OBJ_OPTIONAL_PROCESS = false;
52 public static final boolean RSP_OBJ_IGNORED = true;
53 public static final boolean RSP_OBJ_PROCESSED = false;
54 public static final int OBJECT_TYPE_SHIFT_VALUE = 4;
55 public static final byte PFLAG_SET = 0x02;
56 public static final byte IFLAG_SET = 0x01;
57 public static final int SET = 1;
58 private byte objClass;
59 private byte objType;
60 private boolean bPFlag;
61 private boolean bIFlag;
62 private short objLen;
63
64 /**
65 * Constructor to initialize all the variables in object header.
66 *
67 * @param objClass PCEP Object class
68 * @param objType PCEP Object type
69 * @param bPFlag P flag
70 * @param bIFlag I flag
71 * @param objLen PCEP object length
72 */
bharat saraswale1806302015-08-21 12:16:46 +053073
Phaneendra Manda1c0061d2015-08-06 12:29:38 +053074 public PcepObjectHeader(byte objClass, byte objType, boolean bPFlag, boolean bIFlag, short objLen) {
75 this.objClass = objClass;
76 this.objType = objType;
77 this.bPFlag = bPFlag;
78 this.bIFlag = bIFlag;
79 this.objLen = objLen;
80 }
81
82 /**
83 * Sets the Object class.
84 *
85 * @param value object class
86 */
87 public void setObjClass(byte value) {
88 this.objClass = value;
89 }
90
91 /**
92 * Sets the Object TYPE.
93 *
94 * @param value object type
95 */
96 public void setObjType(byte value) {
97 this.objType = value;
98 }
99
100 /**
101 * Sets the Object P flag.
102 *
103 * @param value p flag
104 */
105 public void setPFlag(boolean value) {
106 this.bPFlag = value;
107 }
108
109 /**
110 * Sets the Object I flag.
111 *
112 * @param value I flag
113 */
114 public void setIFlag(boolean value) {
115 this.bIFlag = value;
116 }
117
118 /**
119 * Sets the Object Length.
120 *
121 * @param value object length
122 */
123 public void setObjLen(short value) {
124 this.objLen = value;
125 }
126
127 /**
128 * Returns Object's P flag.
129 *
130 * @return bPFlag P flag
131 */
132 public boolean getPFlag() {
133 return this.bPFlag;
134 }
135
136 /**
137 * Returns Object's i flag.
138 *
139 * @return bIFlag I flag
140 */
141 public boolean getIFlag() {
142 return this.bIFlag;
143 }
144
145 /**
146 * Returns Object Length.
147 *
148 * @return objLen object length
149 */
150 public short getObjLen() {
151 return this.objLen;
152 }
153
154 /**
155 * Returns Object class.
156 *
157 * @return objClass object class
158 */
159 public byte getObjClass() {
160 return this.objClass;
161 }
162
163 /**
164 * Returns Object Type.
165 *
166 * @return objType object type
167 */
168 public byte getObjType() {
169 return this.objType;
170 }
171
172 /**
173 * Writes Byte stream of PCEP object header to channel buffer.
174 *
bharat saraswale1806302015-08-21 12:16:46 +0530175 * @param cb output channel buffer
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530176 * @return objLenIndex object length index in channel buffer
177 */
bharat saraswale1806302015-08-21 12:16:46 +0530178 public int write(ChannelBuffer cb) {
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530179
bharat saraswale1806302015-08-21 12:16:46 +0530180 cb.writeByte(this.objClass);
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530181 byte temp = (byte) (this.objType << OBJECT_TYPE_SHIFT_VALUE);
182 if (this.bPFlag) {
183 temp = (byte) (temp | PFLAG_SET);
184 }
185 if (this.bIFlag) {
186 temp = (byte) (temp | IFLAG_SET);
187 }
bharat saraswale1806302015-08-21 12:16:46 +0530188 cb.writeByte(temp);
189 int objLenIndex = cb.writerIndex();
190 cb.writeShort((short) 0);
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530191 return objLenIndex;
192 }
193
194 /**
195 * Read from channel buffer and Returns PCEP Objects header.
196 *
bharat saraswale1806302015-08-21 12:16:46 +0530197 * @param cb of type channel buffer
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530198 * @return PCEP Object header
199 */
bharat saraswale1806302015-08-21 12:16:46 +0530200 public static PcepObjectHeader read(ChannelBuffer cb) {
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530201
202 byte objClass;
203 byte objType;
204 boolean bPFlag;
205 boolean bIFlag;
206 short objLen;
bharat saraswale1806302015-08-21 12:16:46 +0530207 objClass = cb.readByte();
208 byte temp = cb.readByte();
Phanendra Mandaf346ea82015-09-04 15:21:39 -0700209 bIFlag = (temp & IFLAG_SET) == IFLAG_SET;
210 bPFlag = (temp & PFLAG_SET) == PFLAG_SET;
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530211 objType = (byte) (temp >> OBJECT_TYPE_SHIFT_VALUE);
bharat saraswale1806302015-08-21 12:16:46 +0530212 objLen = cb.readShort();
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530213 return new PcepObjectHeader(objClass, objType, bPFlag, bIFlag, objLen);
214 }
215
bharat saraswalf7364db2015-08-11 13:39:31 +0530216 @Override
Priyanka B413fbe82016-05-26 11:44:45 +0530217 public int hashCode() {
218 return Objects.hash(objClass, objType, bPFlag, bIFlag, objLen);
219 }
220
221 @Override
222 public boolean equals(Object obj) {
223 if (this == obj) {
224 return true;
225 }
226 if (obj instanceof PcepObjectHeader) {
227 PcepObjectHeader other = (PcepObjectHeader) obj;
228 return Objects.equals(objClass, other.objClass)
229 && Objects.equals(objType, other.objType)
230 && Objects.equals(bPFlag, other.bPFlag)
231 && Objects.equals(bIFlag, other.bIFlag)
232 && Objects.equals(objLen, other.objLen);
233 }
234 return false;
235 }
236
237 @Override
bharat saraswalf7364db2015-08-11 13:39:31 +0530238 public String toString() {
Sho SHIMIZU7cdbcf72015-09-03 14:43:05 -0700239 return MoreObjects.toStringHelper(getClass())
240 .add("ObjectClass", objClass)
241 .add("ObjectType", objType)
242 .add("ObjectLength", objLen)
243 .add("PFlag", (bPFlag) ? 1 : 0)
244 .add("IFlag", (bIFlag) ? 1 : 0)
bharat saraswalf7364db2015-08-11 13:39:31 +0530245 .toString();
246 }
Phaneendra Manda1c0061d2015-08-06 12:29:38 +0530247}