blob: f61fe67fb6647970d823be9de4a46bd85a01b317 [file] [log] [blame]
Bharat saraswal30777172015-08-21 15:51:10 +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.protocol.ver1;
18
19import org.jboss.netty.buffer.ChannelBuffer;
20import org.onosproject.pcepio.exceptions.PcepParseException;
21import org.onosproject.pcepio.protocol.PcepFecObjectIPv4UnnumberedAdjacency;
22import org.onosproject.pcepio.protocol.PcepVersion;
23import org.onosproject.pcepio.types.PcepObjectHeader;
24import org.slf4j.Logger;
25import org.slf4j.LoggerFactory;
26
27import com.google.common.base.MoreObjects;
28
29public class PcepFecObjectIPv4UnnumberedAdjacencyVer1 implements PcepFecObjectIPv4UnnumberedAdjacency {
30
31 /*
32 * ref : draft-zhao-pce-pcep-extension-for-pce-controller-01 , section : 7.5
33 *
34 0 1 2 3
35 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
36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37 | Local Node-ID |
38 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 | Local Interface ID |
40 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41 | Remote Node-ID |
42 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 | Remote Interface ID |
44 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45
46 FEC Object-Type is 5, Unnumbered Adjacency with IPv4 NodeIDs
47 */
48 protected static final Logger log = LoggerFactory.getLogger(PcepFecObjectIPv4UnnumberedAdjacencyVer1.class);
49
50 public static final byte FEC_OBJ_TYPE = 5;
51 public static final byte FEC_OBJ_CLASS = 63; //to be defined
52 public static final byte FEC_OBJECT_VERSION = 1;
53 public static final short FEC_OBJ_MINIMUM_LENGTH = 20;
54 public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
55
56 static final PcepObjectHeader DEFAULT_FEC_OBJECT_HEADER = new PcepObjectHeader(FEC_OBJ_CLASS, FEC_OBJ_TYPE,
57 PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, FEC_OBJ_MINIMUM_LENGTH);
58
59 private PcepObjectHeader fecObjHeader;
60 private int localNodeID;
61 private int localInterfaceID;
62 private int remoteNodeID;
63 private int remoteInterfaceID;
64
65 /**
66 * Constructor to initialize parameter for PCEP fec object.
67 *
68 * @param fecObjHeader fec object header
69 * @param localNodeID local node ID
70 * @param localInterfaceID local interface ID
71 * @param remoteNodeID remote node ID
72 * @param remoteInterfaceID remote interface ID
73 */
74 public PcepFecObjectIPv4UnnumberedAdjacencyVer1(PcepObjectHeader fecObjHeader, int localNodeID,
75 int localInterfaceID, int remoteNodeID, int remoteInterfaceID) {
76 this.fecObjHeader = fecObjHeader;
77 this.localNodeID = localNodeID;
78 this.localInterfaceID = localInterfaceID;
79 this.remoteNodeID = remoteNodeID;
80 this.remoteInterfaceID = remoteInterfaceID;
81 }
82
83 /**
84 * Sets Object Header.
85 *
86 * @param obj object header
87 */
88 public void setFecIpv4UnnumberedAdjacencyObjHeader(PcepObjectHeader obj) {
89 this.fecObjHeader = obj;
90 }
91
92 @Override
93 public void setLocalNodeID(int localNodeID) {
94 this.localNodeID = localNodeID;
95 }
96
97 /**
98 * Returns Object Header.
99 *
100 * @return fecObjHeader fec object header
101 */
102 public PcepObjectHeader getFecIpv4UnnumberedAdjacencyObjHeader() {
103 return this.fecObjHeader;
104 }
105
106 @Override
107 public int getLocalNodeID() {
108 return this.localNodeID;
109 }
110
111 @Override
112 public int getLocalInterfaceID() {
113 return this.localInterfaceID;
114 }
115
116 @Override
117 public void setLocalInterfaceID(int localInterfaceID) {
118 this.localInterfaceID = localInterfaceID;
119 }
120
121 @Override
122 public int getRemoteNodeID() {
123 return this.remoteNodeID;
124 }
125
126 @Override
127 public void setRemoteNodeID(int remoteNodeID) {
128 this.remoteNodeID = remoteNodeID;
129 }
130
131 @Override
132 public int getRemoteInterfaceID() {
133 return this.remoteInterfaceID;
134 }
135
136 @Override
137 public void setRemoteInterfaceID(int remoteInterfaceID) {
138 this.remoteInterfaceID = remoteInterfaceID;
139 }
140
141 /**
142 * Reads from channel buffer and returns object of PcepFecObjectIPv4UnnumberedAdjacency.
143 *
144 * @param cb of channel buffer
145 * @return object of PcepFecObjectIPv4UnnumberedAdjacency
146 * @throws PcepParseException when fails to read from channel buffer
147 */
148 public static PcepFecObjectIPv4UnnumberedAdjacency read(ChannelBuffer cb) throws PcepParseException {
149
150 PcepObjectHeader fecObjHeader;
151 int localNodeID;
152 int localInterfaceID;
153 int remoteNodeID;
154 int remoteInterfaceID;
155
156 fecObjHeader = PcepObjectHeader.read(cb);
157
158 //take only FEC IPv4 Unnumbered Adjacency Object buffer.
159 ChannelBuffer tempCb = cb.readBytes(fecObjHeader.getObjLen() - MINIMUM_COMMON_HEADER_LENGTH);
160 localNodeID = tempCb.readInt();
161 localInterfaceID = tempCb.readInt();
162 remoteNodeID = tempCb.readInt();
163 remoteInterfaceID = tempCb.readInt();
164
165 return new PcepFecObjectIPv4UnnumberedAdjacencyVer1(fecObjHeader, localNodeID, localInterfaceID, remoteNodeID,
166 remoteInterfaceID);
167 }
168
169 @Override
170 public int write(ChannelBuffer cb) throws PcepParseException {
171
172 int objStartIndex = cb.writerIndex();
173
174 //Write common header
175 int objLenIndex = fecObjHeader.write(cb);
176 cb.writeInt(localNodeID);
177 cb.writeInt(localInterfaceID);
178 cb.writeInt(remoteNodeID);
179 cb.writeInt(remoteInterfaceID);
180
181 //Now write FEC IPv4 Unnumbered Adjacency Object Length
182 cb.setShort(objLenIndex, (short) (cb.writerIndex() - objStartIndex));
183
184 return cb.writerIndex();
185 }
186
187 /**
188 * Builder class for PCEP Fec object IPv4 unnumbered Adjacency.
189 */
190 public static class Builder implements PcepFecObjectIPv4UnnumberedAdjacency.Builder {
191 private boolean bIsHeaderSet = false;
192 private boolean bIsLocalNodeIDset = false;
193 private boolean bIsLocalInterfaceIDset = false;
194 private boolean bIsRemoteNodeIDset = false;
195 private boolean bIsRemoteInterfaceIDset = false;
196
197 private PcepObjectHeader fecObjHeader;
198 private int localNodeID;
199 private int localInterfaceID;
200 private int remoteNodeID;
201 private int remoteInterfaceID;
202
203 private boolean bIsPFlagSet = false;
204 private boolean bPFlag;
205
206 private boolean bIsIFlagSet = false;
207 private boolean bIFlag;
208
209 @Override
210 public PcepFecObjectIPv4UnnumberedAdjacency build() throws PcepParseException {
211 PcepObjectHeader fecObjHeader = this.bIsHeaderSet ? this.fecObjHeader : DEFAULT_FEC_OBJECT_HEADER;
212
213 if (!this.bIsLocalNodeIDset) {
214 throw new PcepParseException(
215 " Local Node ID not set while building PcepFecObjectIPv4UnnumberedAdjacency object.");
216 }
217 if (!this.bIsLocalInterfaceIDset) {
218 throw new PcepParseException(
219 " Local Interface ID not set while building PcepFecObjectIPv4UnnumberedAdjacency object.");
220 }
221 if (!this.bIsRemoteNodeIDset) {
222 throw new PcepParseException(
223 " Remote Node ID not set while building PcepFecObjectIPv4UnnumberedAdjacency object.");
224 }
225 if (!this.bIsRemoteInterfaceIDset) {
226 throw new PcepParseException(
227 " Remote Interface ID not set while building PcepFecObjectIPv4UnnumberedAdjacency object.");
228 }
229 if (bIsPFlagSet) {
230 fecObjHeader.setPFlag(bPFlag);
231 }
232 if (bIsIFlagSet) {
233 fecObjHeader.setIFlag(bIFlag);
234 }
235 return new PcepFecObjectIPv4UnnumberedAdjacencyVer1(fecObjHeader, this.localNodeID, this.localInterfaceID,
236 this.remoteNodeID, this.remoteInterfaceID);
237 }
238
239 @Override
240 public Builder setPFlag(boolean value) {
241 this.bPFlag = value;
242 this.bIsPFlagSet = true;
243 return this;
244 }
245
246 @Override
247 public Builder setIFlag(boolean value) {
248 this.bIFlag = value;
249 this.bIsIFlagSet = true;
250 return this;
251 }
252
253 @Override
254 public PcepObjectHeader getFecIpv4UnnumberedAdjacencyObjHeader() {
255 return this.fecObjHeader;
256 }
257
258 @Override
259 public Builder setFecIpv4UnnumberedAdjacencyObjHeader(PcepObjectHeader obj) {
260 this.fecObjHeader = obj;
261 this.bIsHeaderSet = true;
262 return this;
263 }
264
265 @Override
266 public int getLocalNodeID() {
267 return this.localNodeID;
268 }
269
270 @Override
271 public Builder setLocalNodeID(int value) {
272 this.localNodeID = value;
273 this.bIsLocalNodeIDset = true;
274 return this;
275 }
276
277 @Override
278 public int getLocalInterfaceID() {
279 return this.localInterfaceID;
280 }
281
282 @Override
283 public Builder setLocalInterfaceID(int value) {
284 this.localInterfaceID = value;
285 this.bIsLocalInterfaceIDset = true;
286 return this;
287 }
288
289 @Override
290 public int getRemoteNodeID() {
291 return this.remoteNodeID;
292 }
293
294 @Override
295 public Builder setRemoteNodeID(int value) {
296 this.remoteNodeID = value;
297 this.bIsRemoteNodeIDset = true;
298 return this;
299 }
300
301 @Override
302 public int getRemoteInterfaceID() {
303 return this.remoteInterfaceID;
304 }
305
306 @Override
307 public Builder setRemoteInterfaceID(int value) {
308 this.remoteInterfaceID = value;
309 this.bIsRemoteInterfaceIDset = true;
310 return this;
311 }
312 }
313
314 @Override
315 public PcepVersion getVersion() {
316 return PcepVersion.PCEP_1;
317 }
318
319 @Override
320 public int getType() {
321 return FEC_OBJ_TYPE;
322 }
323
324 @Override
325 public String toString() {
326 return MoreObjects.toStringHelper(getClass()).add("LocalNodeID: ", localNodeID)
327 .add("LocalInterfaceID: ", localInterfaceID).add("RemoteNodeID: ", remoteNodeID)
328 .add("RemoteInterfaceID: ", remoteInterfaceID).toString();
329 }
330}