5130d9e9be579ee27aeef086e7a05c2555f4b285
[onosfw.git] /
1 /*
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 package org.onosproject.pcepio.protocol.ver1;
17
18 import org.jboss.netty.buffer.ChannelBuffer;
19 import org.onosproject.pcepio.exceptions.PcepParseException;
20 import org.onosproject.pcepio.protocol.PcepInterLayerObject;
21 import org.onosproject.pcepio.types.PcepObjectHeader;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import com.google.common.base.MoreObjects;
26
27 /**
28  * Provides PCEP inter layer object.
29  */
30 public class PcepInterLayerObjectVer1 implements PcepInterLayerObject {
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         |    Reserved                                               |N|I|
37         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38      */
39     protected static final Logger log = LoggerFactory.getLogger(PcepInterLayerObjectVer1.class);
40
41     public static final byte INTER_LAYER_OBJ_TYPE = 1;
42     public static final byte INTER_LAYER_OBJ_CLASS = 18;
43     public static final byte INTER_LAYER_OBJECT_VERSION = 1;
44     public static final short INTER_LAYER_OBJ_MINIMUM_LENGTH = 8;
45     public static final boolean DEFAULT_IFLAG = false;
46     public static final boolean DEFAULT_NFLAG = false;
47     public static final int OBJECT_HEADER_LENGTH = 4;
48     public static final int NFLAG_SHIFT_VALUE = 0x02;
49     public static final int IFLAG_SHIFT_VALUE = 0x01;
50
51     static final PcepObjectHeader DEFAULT_INTER_LAYER_OBJECT_HEADER = new PcepObjectHeader(INTER_LAYER_OBJ_CLASS,
52             INTER_LAYER_OBJ_TYPE, PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED,
53             INTER_LAYER_OBJ_MINIMUM_LENGTH);
54
55     private PcepObjectHeader interLayerObjHeader;
56     private boolean bNFlag;
57     private boolean bIFlag;
58
59     /**
60      * Constructor to initialize all parameters for Pcep Inter Layer Object.
61      *
62      * @param interLayerObjHeader inter layer object header
63      * @param bNFlag N flag
64      * @param bIFlag I flag
65      */
66     public PcepInterLayerObjectVer1(PcepObjectHeader interLayerObjHeader, boolean bNFlag, boolean bIFlag) {
67
68         this.interLayerObjHeader = interLayerObjHeader;
69         this.bNFlag = bNFlag;
70         this.bIFlag = bIFlag;
71     }
72
73     /**
74      * Sets Object Header.
75      *
76      * @param obj object header
77      */
78     public void setInterLayerObjHeader(PcepObjectHeader obj) {
79         this.interLayerObjHeader = obj;
80     }
81
82     @Override
83     public void setbNFlag(boolean bNFlag) {
84         this.bNFlag = bNFlag;
85     }
86
87     @Override
88     public void setbIFlag(boolean bIFlag) {
89         this.bIFlag = bIFlag;
90     }
91
92     /**
93      * Returns object header.
94      *
95      * @return inter Layer Object Header
96      */
97     public PcepObjectHeader getInterLayerObjHeader() {
98         return this.interLayerObjHeader;
99     }
100
101     @Override
102     public boolean getbNFlag() {
103         return this.bNFlag;
104     }
105
106     @Override
107     public boolean getbIFlag() {
108         return this.bIFlag;
109     }
110
111     /**
112      * Reads channel buffer and returns object of PcepInterLayerObject.
113      *
114      * @param cb of type channel buffer
115      * @return object of PcepInterLayerObject
116      * @throws PcepParseException when fails to read from channel buffer
117      */
118     public static PcepInterLayerObject read(ChannelBuffer cb) throws PcepParseException {
119
120         PcepObjectHeader interLayerObjHeader;
121         boolean bNFlag;
122         boolean bIFlag;
123
124         interLayerObjHeader = PcepObjectHeader.read(cb);
125
126         //take only InterLayerObject buffer.
127         ChannelBuffer tempCb = cb.readBytes(interLayerObjHeader.getObjLen() - OBJECT_HEADER_LENGTH);
128
129         int iTemp = tempCb.readInt();
130         bIFlag = ((iTemp & (byte) IFLAG_SHIFT_VALUE) == IFLAG_SHIFT_VALUE);
131         bNFlag = ((iTemp & (byte) NFLAG_SHIFT_VALUE) == NFLAG_SHIFT_VALUE);
132
133         return new PcepInterLayerObjectVer1(interLayerObjHeader, bNFlag, bIFlag);
134     }
135
136     @Override
137     public int write(ChannelBuffer cb) throws PcepParseException {
138
139         //write Object header
140         int objStartIndex = cb.writerIndex();
141
142         int objLenIndex = interLayerObjHeader.write(cb);
143
144         if (objLenIndex <= 0) {
145             throw new PcepParseException(" ObjectLength Index is " + objLenIndex);
146         }
147
148         int iTemp = 0;
149
150         if (bIFlag) {
151             iTemp = iTemp | (byte) IFLAG_SHIFT_VALUE;
152         }
153         if (bNFlag) {
154             iTemp = iTemp | (byte) NFLAG_SHIFT_VALUE;
155         }
156
157         cb.writeInt(iTemp);
158
159         //Update object length now
160         int length = cb.writerIndex() - objStartIndex;
161         //will be helpful during print().
162         interLayerObjHeader.setObjLen((short) length);
163         cb.setShort(objLenIndex, (short) length);
164
165         objLenIndex = cb.writerIndex();
166         return objLenIndex;
167     }
168
169     /**
170      * Builder class for PCEP inter layer object.
171      */
172     public static class Builder implements PcepInterLayerObject.Builder {
173
174         private boolean bIsHeaderSet = false;
175         private boolean bIsNFlagset = false;
176         private boolean bIsIFlagset = false;
177
178         private PcepObjectHeader interLayerObjHeader;
179         private boolean bNFlag;
180         private boolean bIFlag;
181
182         private boolean bIsPFlagSet = false;
183         private boolean bPFalg;
184
185         private boolean bIsIFlagSet = false;
186         private boolean iFlag;
187
188         @Override
189         public PcepInterLayerObject build() {
190             PcepObjectHeader interLayerObjHeader = this.bIsHeaderSet ? this.interLayerObjHeader
191                     : DEFAULT_INTER_LAYER_OBJECT_HEADER;
192
193             boolean bNFlag = this.bIsNFlagset ? this.bNFlag : DEFAULT_NFLAG;
194             boolean bIFlag = this.bIsIFlagset ? this.bIFlag : DEFAULT_IFLAG;
195
196             if (bIsPFlagSet) {
197                 interLayerObjHeader.setPFlag(bPFalg);
198             }
199
200             if (bIsIFlagSet) {
201                 interLayerObjHeader.setIFlag(iFlag);
202             }
203             return new PcepInterLayerObjectVer1(interLayerObjHeader, bNFlag, bIFlag);
204         }
205
206         @Override
207         public PcepObjectHeader getInterLayerObjHeader() {
208             return this.interLayerObjHeader;
209         }
210
211         @Override
212         public Builder setInterLayerObjHeader(PcepObjectHeader obj) {
213             this.interLayerObjHeader = obj;
214             this.bIsHeaderSet = true;
215             return this;
216         }
217
218         @Override
219         public boolean getbNFlag() {
220             return this.bNFlag;
221         }
222
223         @Override
224         public Builder setbNFlag(boolean value) {
225             this.bNFlag = value;
226             this.bIsNFlagset = true;
227             return this;
228         }
229
230         @Override
231         public boolean getbIFlag() {
232             return this.bIFlag;
233         }
234
235         @Override
236         public Builder setbIFlag(boolean value) {
237             this.bIFlag = value;
238             this.bIsIFlagset = true;
239             return this;
240         }
241
242         @Override
243         public Builder setPFlag(boolean value) {
244             this.bPFalg = value;
245             this.bIsPFlagSet = true;
246             return this;
247         }
248
249         @Override
250         public Builder setIFlag(boolean value) {
251             this.iFlag = value;
252             this.bIsIFlagSet = true;
253             return this;
254         }
255     }
256
257     @Override
258     public String toString() {
259         return MoreObjects.toStringHelper(getClass())
260                 .add("IFlag", bIFlag)
261                 .add("NFlag", bNFlag).toString();
262     }
263 }