f2f54cdad90f93f1238f1b475d5fc1a118077a71
[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
17 package org.onosproject.pcepio.protocol.ver1;
18
19 import org.jboss.netty.buffer.ChannelBuffer;
20 import org.onosproject.pcepio.exceptions.PcepParseException;
21 import org.onosproject.pcepio.protocol.PcepFecObjectIPv4UnnumberedAdjacency;
22 import org.onosproject.pcepio.protocol.PcepVersion;
23 import org.onosproject.pcepio.types.PcepObjectHeader;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 import com.google.common.base.MoreObjects;
28
29 /**
30  * Provides Pcep Fec Object IPv4 Unnumbered Adjacency object.
31  */
32 public 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;
54     public static final byte FEC_OBJ_CLASS = 63; //to be defined
55     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() {
329         return MoreObjects.toStringHelper(getClass())
330                 .add("LocalNodeID: ", localNodeID)
331                 .add("LocalInterfaceID: ", localInterfaceID).add("RemoteNodeID: ", remoteNodeID)
332                 .add("RemoteInterfaceID: ", remoteInterfaceID).toString();
333     }
334 }