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