a2293d3511d4acb2847fa67c85523b44539ac2f9
[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 java.util.LinkedList;
20 import java.util.ListIterator;
21
22 import org.jboss.netty.buffer.ChannelBuffer;
23 import org.onosproject.pcepio.exceptions.PcepParseException;
24 import org.onosproject.pcepio.protocol.PcepFecObject;
25 import org.onosproject.pcepio.protocol.PcepLabelObject;
26 import org.onosproject.pcepio.protocol.PcepLabelUpdate;
27 import org.onosproject.pcepio.protocol.PcepLspObject;
28 import org.onosproject.pcepio.protocol.PcepSrpObject;
29 import org.onosproject.pcepio.types.PcepLabelDownload;
30 import org.onosproject.pcepio.types.PcepLabelMap;
31 import org.onosproject.pcepio.types.PcepObjectHeader;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 import com.google.common.base.MoreObjects;
36
37 /**
38  * Provides PCEP LABEL update .
39  * Reference :draft-zhao-pce-pcep-extension-for-pce-controller-01.
40  */
41 public class PcepLabelUpdateVer1 implements PcepLabelUpdate {
42
43     /*
44      *       <pce-label-update>      ::= (<pce-label-download>|<pce-label-map>)
45
46             Where:
47              <pce-label-download>    ::= <SRP>
48                                          <LSP>
49                                          <label-list>
50
51              <pce-label-map>         ::= <SRP>
52                                          <LABEL>
53                                          <FEC>
54
55              <label-list >           ::= <LABEL>
56                                          [<label-list>]
57      */
58     protected static final Logger log = LoggerFactory.getLogger(PcepLabelUpdateVer1.class);
59
60     //Either PceLabelDownload or PceLabelMap is mandatory.
61     //label Download
62     private PcepLabelDownload labelDownload;
63     private boolean isLabelDownloadSet;
64     //label Map
65     private PcepLabelMap labelMap;
66     private boolean isLabelMapSet;
67
68     /**
69      * Constructor to reset parameters.
70      */
71     public PcepLabelUpdateVer1() {
72         this.labelDownload = null;
73         this.isLabelDownloadSet = false;
74         this.labelMap = null;
75         this.isLabelMapSet = false;
76     }
77
78     /**
79      * Constructor to initialize PCEP label download.
80      *
81      * @param labelDownload PCEP label download
82      */
83     public PcepLabelUpdateVer1(PcepLabelDownload labelDownload) {
84         this.labelDownload = labelDownload;
85         this.isLabelDownloadSet = true;
86         this.labelMap = null;
87         this.isLabelMapSet = false;
88     }
89
90     /**
91      * Constructor to initialize PCEP label map.
92      *
93      * @param labelMap PCEP label map
94      */
95     public PcepLabelUpdateVer1(PcepLabelMap labelMap) {
96         this.labelDownload = null;
97         this.isLabelDownloadSet = false;
98         this.labelMap = labelMap;
99         this.isLabelMapSet = true;
100     }
101
102     /**
103      * builder class for PCEP label update.
104      */
105     static class Builder implements PcepLabelUpdate.Builder {
106
107         private PcepLabelDownload labelDownload;
108         private boolean isLabelDownloadSet;
109         private PcepLabelMap labelMap;
110         private boolean isLabelMapSet;
111
112         @Override
113         public PcepLabelUpdate build() throws PcepParseException {
114
115             if (isLabelDownloadSet) {
116                 return new PcepLabelUpdateVer1(labelDownload);
117             }
118             if (isLabelMapSet) {
119                 return new PcepLabelUpdateVer1(labelMap);
120             }
121             if (!isLabelDownloadSet && !isLabelMapSet) {
122                 throw new PcepParseException(
123                         "Label Download or Label Map is not set while building PcepLabelUpdate Message");
124             }
125             return new PcepLabelUpdateVer1();
126         }
127
128         @Override
129         public Builder setLabelDownload(PcepLabelDownload labelDownload) {
130             this.labelDownload = labelDownload;
131             this.isLabelDownloadSet = true;
132             return this;
133         }
134
135         @Override
136         public PcepLabelDownload getLabelDownload() {
137             return labelDownload;
138         }
139
140         @Override
141         public Builder setLabelMap(PcepLabelMap labelMap) {
142             this.labelMap = labelMap;
143             this.isLabelMapSet = true;
144             return this;
145         }
146
147         @Override
148         public PcepLabelMap getLabelMap() {
149             return labelMap;
150         }
151     }
152
153     /**
154      * Reads PcepLabels from the byte stream received from channel buffer.
155      *
156      * @param cb of type channel buffer.
157      * @return PcepLabelUpdate object.
158      * @throws PcepParseException when fails to read from channel buffer
159      */
160     public static PcepLabelUpdate read(ChannelBuffer cb) throws PcepParseException {
161
162         PcepLabelUpdateVer1 pceLabelUpdate = new PcepLabelUpdateVer1();
163
164         PcepSrpObject srpObject;
165         PcepObjectHeader tempObjHeader;
166
167         //read SRP mandatory Object
168         srpObject = PcepSrpObjectVer1.read(cb);
169
170         //checking next object
171         cb.markReaderIndex();
172
173         tempObjHeader = PcepObjectHeader.read(cb);
174         cb.resetReaderIndex();
175
176         if (tempObjHeader.getObjClass() == PcepLspObjectVer1.LSP_OBJ_CLASS) {
177
178             //now it is belong to <pce-label-download>
179             PcepLabelDownload labelDownload = new PcepLabelDownload();
180
181             //set SRP
182             labelDownload.setSrpObject(srpObject);
183
184             //read and set LSP
185             labelDownload.setLspObject(PcepLspObjectVer1.read(cb));
186
187             //<label-list>
188             LinkedList<PcepLabelObject> llLabelList = new LinkedList<>();
189             PcepLabelObject labelObject;
190
191             while (0 < cb.readableBytes()) {
192
193                 cb.markReaderIndex();
194                 tempObjHeader = PcepObjectHeader.read(cb);
195                 cb.resetReaderIndex();
196
197                 if (tempObjHeader.getObjClass() != PcepLabelObjectVer1.LABEL_OBJ_CLASS) {
198                     break;
199                 }
200                 labelObject = PcepLabelObjectVer1.read(cb);
201                 llLabelList.add(labelObject);
202             }
203             labelDownload.setLabelList(llLabelList);
204             pceLabelUpdate.setLabelDownload(labelDownload);
205         } else if (tempObjHeader.getObjClass() == PcepLabelObjectVer1.LABEL_OBJ_CLASS) {
206             //belong to <pce-label-map>
207             PcepLabelMap labelMap = new PcepLabelMap();
208
209             //set SRP Object
210             labelMap.setSrpObject(srpObject);
211
212             //read and set Label Object
213             labelMap.setLabelObject(PcepLabelObjectVer1.read(cb));
214
215             cb.markReaderIndex();
216             tempObjHeader = PcepObjectHeader.read(cb);
217             cb.resetReaderIndex();
218
219             PcepFecObject fecObject = null;
220             switch (tempObjHeader.getObjType()) {
221             case PcepFecObjectIPv4Ver1.FEC_OBJ_TYPE:
222                 fecObject = PcepFecObjectIPv4Ver1.read(cb);
223                 break;
224             case PcepFecObjectIPv6Ver1.FEC_OBJ_TYPE:
225                 fecObject = PcepFecObjectIPv6Ver1.read(cb);
226                 break;
227             case PcepFecObjectIPv4AdjacencyVer1.FEC_OBJ_TYPE:
228                 fecObject = PcepFecObjectIPv4AdjacencyVer1.read(cb);
229                 break;
230             case PcepFecObjectIPv6AdjacencyVer1.FEC_OBJ_TYPE:
231                 fecObject = PcepFecObjectIPv6AdjacencyVer1.read(cb);
232                 break;
233             case PcepFecObjectIPv4UnnumberedAdjacencyVer1.FEC_OBJ_TYPE:
234                 fecObject = PcepFecObjectIPv4UnnumberedAdjacencyVer1.read(cb);
235                 break;
236             default:
237                 throw new PcepParseException("Unkown FEC object type " + tempObjHeader.getObjType());
238             }
239             labelMap.setFECObject(fecObject);
240             pceLabelUpdate.setLabelMap(labelMap);
241         } else {
242             throw new PcepParseException(
243                     "Either <pce-label-download> or <pce-label-map> should be present. Received Class: "
244                             + tempObjHeader.getObjClass());
245         }
246         return pceLabelUpdate;
247     }
248
249     @Override
250     public void write(ChannelBuffer cb) throws PcepParseException {
251
252         if ((labelDownload != null) && (labelMap != null)) {
253             throw new PcepParseException("Label Download and Label Map both can't be present.");
254         }
255
256         if ((labelDownload == null) && (labelMap == null)) {
257             throw new PcepParseException("Either Label Download or Label Map should be present.");
258         }
259
260         if (labelDownload != null) {
261
262             PcepLspObject lspObject;
263             PcepSrpObject srpObject;
264             PcepLabelObject labelObject;
265             LinkedList<PcepLabelObject> llLabelList;
266
267             srpObject = labelDownload.getSrpObject();
268             if (srpObject == null) {
269                 throw new PcepParseException("SRP Object is mandatory object for Label Download.");
270             } else {
271                 srpObject.write(cb);
272             }
273
274             lspObject = labelDownload.getLspObject();
275             if (lspObject == null) {
276                 throw new PcepParseException("LSP Object is mandatory object for Label Download.");
277             } else {
278                 lspObject.write(cb);
279             }
280
281             llLabelList = labelDownload.getLabelList();
282             if (llLabelList == null) {
283                 throw new PcepParseException("Label list is mandatory object for Label Download.");
284             } else {
285                 ListIterator<PcepLabelObject> listIterator = llLabelList.listIterator();
286                 while (listIterator.hasNext()) {
287                     labelObject = listIterator.next();
288                     labelObject.write(cb);
289                 }
290             }
291         }
292
293         if (labelMap != null) {
294
295             PcepSrpObject srpObject;
296             PcepLabelObject labelObject;
297             PcepFecObject fecObject;
298
299             srpObject = labelMap.getSrpObject();
300             if (srpObject == null) {
301                 throw new PcepParseException("SRP Object is mandatory object for Label map.");
302             } else {
303                 srpObject.write(cb);
304             }
305             labelObject = labelMap.getLabelObject();
306             if (labelObject == null) {
307                 throw new PcepParseException("label Object is mandatory object for Label map.");
308             } else {
309                 labelObject.write(cb);
310             }
311             fecObject = labelMap.getFECObject();
312             if (fecObject == null) {
313                 throw new PcepParseException("fec Object is mandatory object for Label map.");
314             } else {
315                 fecObject.write(cb);
316             }
317         }
318     }
319
320     @Override
321     public void setLabelDownload(PcepLabelDownload labelDownload) {
322         if (this.isLabelMapSet) {
323             return;
324         }
325         this.labelDownload = labelDownload;
326         this.isLabelDownloadSet = true;
327     }
328
329     @Override
330     public PcepLabelDownload getLabelDownload() {
331         return this.labelDownload;
332     }
333
334     @Override
335     public void setLabelMap(PcepLabelMap labelMap) {
336         if (this.isLabelDownloadSet) {
337             return;
338         }
339         this.labelMap = labelMap;
340         this.isLabelMapSet = true;
341     }
342
343     @Override
344     public PcepLabelMap getLabelMap() {
345         return this.labelMap;
346     }
347
348     @Override
349     public String toString() {
350         return MoreObjects.toStringHelper(getClass())
351                 .omitNullValues()
352                 .add("LabelDownload", labelDownload)
353                 .add("LabelMap", labelMap)
354                 .toString();
355     }
356 }