blob: cb40ea0699e9ad7fe733240962a3f4b73a02be11 [file] [log] [blame]
SureshBR25058b72015-08-13 13:05:06 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
SureshBR25058b72015-08-13 13:05:06 +05303 *
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 */
16package org.onosproject.pcep.controller.impl;
17
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053018import java.util.Arrays;
SureshBR25058b72015-08-13 13:05:06 +053019import java.util.Collection;
20import java.util.Collections;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053021import java.util.HashMap;
SureshBR25058b72015-08-13 13:05:06 +053022import java.util.HashSet;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053023import java.util.Iterator;
Priyanka Bd2b28882016-04-04 16:57:04 +053024import java.util.LinkedList;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053025import java.util.List;
26import java.util.ListIterator;
27import java.util.Map;
SureshBR25058b72015-08-13 13:05:06 +053028import java.util.Set;
29import java.util.concurrent.ConcurrentHashMap;
SureshBR25058b72015-08-13 13:05:06 +053030
31import org.apache.felix.scr.annotations.Activate;
32import org.apache.felix.scr.annotations.Component;
33import org.apache.felix.scr.annotations.Deactivate;
Priyanka B94395bf2016-05-21 18:39:46 +053034import org.apache.felix.scr.annotations.Reference;
35import org.apache.felix.scr.annotations.ReferenceCardinality;
SureshBR25058b72015-08-13 13:05:06 +053036import org.apache.felix.scr.annotations.Service;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053037import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
38import org.onosproject.incubator.net.tunnel.Tunnel;
39import org.onosproject.incubator.net.tunnel.TunnelService;
40import org.onosproject.incubator.net.tunnel.Tunnel.State;
Priyanka B94395bf2016-05-21 18:39:46 +053041import org.onosproject.net.device.DeviceService;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053042import org.onosproject.pcep.controller.LspKey;
SureshBR25058b72015-08-13 13:05:06 +053043import org.onosproject.pcep.controller.PccId;
44import org.onosproject.pcep.controller.PcepClient;
45import org.onosproject.pcep.controller.PcepClientController;
46import org.onosproject.pcep.controller.PcepClientListener;
47import org.onosproject.pcep.controller.PcepEventListener;
Priyanka B259847d2016-06-03 21:28:35 +053048import org.onosproject.pcep.controller.PcepLspStatus;
Priyanka B94395bf2016-05-21 18:39:46 +053049import org.onosproject.pcep.controller.PcepNodeListener;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053050import org.onosproject.pcep.controller.PcepPacketListener;
51import org.onosproject.pcep.controller.PcepSyncStatus;
SureshBR25058b72015-08-13 13:05:06 +053052import org.onosproject.pcep.controller.driver.PcepAgent;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053053import org.onosproject.pcepio.exceptions.PcepParseException;
54import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
Priyanka Bd2b28882016-04-04 16:57:04 +053055import org.onosproject.pcepio.protocol.PcepError;
56import org.onosproject.pcepio.protocol.PcepErrorInfo;
57import org.onosproject.pcepio.protocol.PcepErrorMsg;
58import org.onosproject.pcepio.protocol.PcepErrorObject;
59import org.onosproject.pcepio.protocol.PcepFactory;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053060import org.onosproject.pcepio.protocol.PcepInitiateMsg;
61import org.onosproject.pcepio.protocol.PcepLspObject;
SureshBR25058b72015-08-13 13:05:06 +053062import org.onosproject.pcepio.protocol.PcepMessage;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053063import org.onosproject.pcepio.protocol.PcepReportMsg;
64import org.onosproject.pcepio.protocol.PcepStateReport;
65import org.onosproject.pcepio.types.PcepValueType;
66import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
67import org.onosproject.pcepio.types.SymbolicPathNameTlv;
SureshBR25058b72015-08-13 13:05:06 +053068import org.slf4j.Logger;
69import org.slf4j.LoggerFactory;
70
71import com.google.common.collect.Sets;
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053072import static com.google.common.base.Preconditions.checkNotNull;
SureshBR25058b72015-08-13 13:05:06 +053073
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +053074import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC;
75import static org.onosproject.pcep.controller.PcepLspSyncAction.REMOVE;
76import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_UPDATE;
77import static org.onosproject.pcep.controller.PcepLspSyncAction.SEND_DELETE;
78import static org.onosproject.pcep.controller.PcepLspSyncAction.UNSTABLE;
Priyanka Bd2b28882016-04-04 16:57:04 +053079import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_TYPE_19;
80import static org.onosproject.pcepio.types.PcepErrorDetailInfo.ERROR_VALUE_5;
81
Phanendra Manda51fb9c22015-09-01 16:17:41 +053082/**
83 * Implementation of PCEP client controller.
84 */
SureshBR25058b72015-08-13 13:05:06 +053085@Component(immediate = true)
86@Service
87public class PcepClientControllerImpl implements PcepClientController {
88
89 private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class);
90
Priyanka B94395bf2016-05-21 18:39:46 +053091 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
92 protected DeviceService deviceService;
93
SureshBR25058b72015-08-13 13:05:06 +053094 protected ConcurrentHashMap<PccId, PcepClient> connectedClients =
Sho SHIMIZU9b8274c2015-09-04 15:54:24 -070095 new ConcurrentHashMap<>();
SureshBR25058b72015-08-13 13:05:06 +053096
97 protected PcepClientAgent agent = new PcepClientAgent();
98 protected Set<PcepClientListener> pcepClientListener = new HashSet<>();
99
100 protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet();
Priyanka B94395bf2016-05-21 18:39:46 +0530101 protected Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet();
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530102 protected Set<PcepPacketListener> pcepPacketListener = Sets.newHashSet();
SureshBR25058b72015-08-13 13:05:06 +0530103
104 private final Controller ctrl = new Controller();
105
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530106 public static final String BANDWIDTH = "bandwidth";
107 public static final String LSP_SIG_TYPE = "lspSigType";
108 public static final String PCC_TUNNEL_ID = "PccTunnelId";
109 public static final String PLSP_ID = "PLspId";
110 public static final String LOCAL_LSP_ID = "localLspId";
111 public static final String PCE_INIT = "pceInit";
112 public static final String COST_TYPE = "costType";
113 public static final String DELEGATE = "delegation";
114
115 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
116 protected TunnelService tunnelService;
117
SureshBR25058b72015-08-13 13:05:06 +0530118 @Activate
119 public void activate() {
120 ctrl.start(agent);
121 log.info("Started");
122 }
123
124 @Deactivate
125 public void deactivate() {
126 // Close all connected clients
127 closeConnectedClients();
128 ctrl.stop();
129 log.info("Stopped");
130 }
131
132 @Override
133 public Collection<PcepClient> getClients() {
134 return connectedClients.values();
135 }
136
137 @Override
138 public PcepClient getClient(PccId pccId) {
139 return connectedClients.get(pccId);
140 }
141
142 @Override
143 public void addListener(PcepClientListener listener) {
144 if (!pcepClientListener.contains(listener)) {
145 this.pcepClientListener.add(listener);
146 }
147 }
148
149 @Override
150 public void removeListener(PcepClientListener listener) {
151 this.pcepClientListener.remove(listener);
152 }
153
154 @Override
155 public void addEventListener(PcepEventListener listener) {
156 pcepEventListener.add(listener);
157 }
158
159 @Override
160 public void removeEventListener(PcepEventListener listener) {
161 pcepEventListener.remove(listener);
162 }
163
164 @Override
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530165 public void addPacketListener(PcepPacketListener listener) {
166 pcepPacketListener.add(listener);
167 }
168
169 @Override
170 public void removePacketListener(PcepPacketListener listener) {
171 pcepPacketListener.remove(listener);
172 }
173
174 @Override
SureshBR25058b72015-08-13 13:05:06 +0530175 public void writeMessage(PccId pccId, PcepMessage msg) {
176 this.getClient(pccId).sendMessage(msg);
177 }
178
179 @Override
Priyanka B94395bf2016-05-21 18:39:46 +0530180 public void addNodeListener(PcepNodeListener listener) {
181 pcepNodeListener.add(listener);
182 }
183
184 @Override
185 public void removeNodeListener(PcepNodeListener listener) {
186 pcepNodeListener.remove(listener);
187 }
188
189 @Override
SureshBR25058b72015-08-13 13:05:06 +0530190 public void processClientMessage(PccId pccId, PcepMessage msg) {
191 PcepClient pc = getClient(pccId);
192
193 switch (msg.getType()) {
194 case NONE:
195 break;
196 case OPEN:
197 break;
198 case KEEP_ALIVE:
199 break;
200 case PATH_COMPUTATION_REQUEST:
201 break;
202 case PATH_COMPUTATION_REPLY:
203 break;
204 case NOTIFICATION:
205 break;
206 case ERROR:
207 break;
Priyanka Bd2b28882016-04-04 16:57:04 +0530208 case INITIATE:
209 if (!pc.capability().pcInstantiationCapability()) {
210 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), ERROR_TYPE_19,
211 ERROR_VALUE_5)));
212 }
213 break;
214 case UPDATE:
215 if (!pc.capability().statefulPceCapability()) {
216 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), ERROR_TYPE_19,
217 ERROR_VALUE_5)));
218 }
219 break;
220 case LABEL_UPDATE:
221 if (!pc.capability().pceccCapability()) {
222 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(), ERROR_TYPE_19,
223 ERROR_VALUE_5)));
224 }
225 break;
SureshBR25058b72015-08-13 13:05:06 +0530226 case CLOSE:
227 log.info("Sending Close Message to {" + pccId.toString() + "}");
228 pc.sendMessage(Collections.singletonList(pc.factory().buildCloseMsg().build()));
229 //now disconnect client
230 pc.disconnectClient();
231 break;
232 case REPORT:
Priyanka Bd2b28882016-04-04 16:57:04 +0530233 //Only update the listener if respective capability is supported else send PCEP-ERR msg
234 if (pc.capability().statefulPceCapability()) {
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530235
236 ListIterator<PcepStateReport> listIterator = ((PcepReportMsg) msg).getStateReportList().listIterator();
237 while (listIterator.hasNext()) {
238 PcepStateReport stateRpt = listIterator.next();
Avantika-Huawei3524d852016-06-04 20:44:13 +0530239 PcepLspObject lspObj = stateRpt.getLspObject();
240 if (lspObj.getSFlag()) {
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530241 if (pc.lspDbSyncStatus() != PcepSyncStatus.IN_SYNC) {
Avantika-Huawei3524d852016-06-04 20:44:13 +0530242 log.debug("LSP DB sync started for PCC {}", pc.getPccId().id().toString());
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530243 // Initialize LSP DB sync and temporary cache.
244 pc.setLspDbSyncStatus(PcepSyncStatus.IN_SYNC);
245 pc.initializeSyncMsgList(pccId);
246 }
247 // Store stateRpt in temporary cache.
248 pc.addSyncMsgToList(pccId, stateRpt);
249
250 // Don't send to provider as of now.
251 continue;
Avantika-Huawei3524d852016-06-04 20:44:13 +0530252 } else if (lspObj.getPlspId() == 0) {
253 if (pc.lspDbSyncStatus() == PcepSyncStatus.IN_SYNC
254 || pc.lspDbSyncStatus() == PcepSyncStatus.NOT_SYNCED) {
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530255 // Set end of LSPDB sync.
Avantika-Huawei3524d852016-06-04 20:44:13 +0530256 log.debug("LSP DB sync completed for PCC {}", pc.getPccId().id().toString());
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530257 pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED);
258
259 // Call packet provider to initiate label DB sync (only if PCECC capable).
260 if (pc.capability().pceccCapability()) {
Avantika-Huawei3524d852016-06-04 20:44:13 +0530261 log.debug("Trigger label DB sync for PCC {}", pc.getPccId().id().toString());
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530262 pc.setLabelDbSyncStatus(IN_SYNC);
263 for (PcepPacketListener l : pcepPacketListener) {
264 l.sendPacketIn(pccId);
265 }
266 } else {
267 // If label db sync is not to be done, handle end of LSPDB sync actions.
268 agent.analyzeSyncMsgList(pccId);
269 }
270 continue;
271 }
272 }
273
274 // It's a usual report message while sync is not undergoing. So process it immediately.
275 LinkedList<PcepStateReport> llPcRptList = new LinkedList<>();
276 llPcRptList.add(stateRpt);
277 PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList))
278 .build();
279 for (PcepEventListener l : pcepEventListener) {
280 l.handleMessage(pccId, pcReportMsg);
281 }
Priyanka Bd2b28882016-04-04 16:57:04 +0530282 }
283 } else {
284 // Send PCEP-ERROR message.
285 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
286 ERROR_TYPE_19, ERROR_VALUE_5)));
SureshBR25058b72015-08-13 13:05:06 +0530287 }
288 break;
Priyanka Bd2b28882016-04-04 16:57:04 +0530289 case LABEL_RANGE_RESERV:
SureshBR25058b72015-08-13 13:05:06 +0530290 break;
Priyanka B94395bf2016-05-21 18:39:46 +0530291 case LS_REPORT: //TODO: need to handle LS report to add or remove node
292 break;
SureshBR25058b72015-08-13 13:05:06 +0530293 case MAX:
294 break;
295 case END:
296 break;
297 default:
298 break;
299 }
300 }
301
302 @Override
303 public void closeConnectedClients() {
304 PcepClient pc;
305 for (PccId id : connectedClients.keySet()) {
306 pc = getClient(id);
307 pc.disconnectClient();
308 }
309 }
310
311 /**
Priyanka Bd2b28882016-04-04 16:57:04 +0530312 * Returns pcep error message with specific error type and value.
313 *
314 * @param factory represents pcep factory
315 * @param errorType pcep error type
316 * @param errorValue pcep error value
317 * @return pcep error message
318 */
319 public PcepErrorMsg getErrMsg(PcepFactory factory, byte errorType, byte errorValue) {
320 LinkedList<PcepError> llPcepErr = new LinkedList<>();
321
322 LinkedList<PcepErrorObject> llerrObj = new LinkedList<>();
323 PcepErrorMsg errMsg;
324
325 PcepErrorObject errObj = factory.buildPcepErrorObject().setErrorValue(errorValue).setErrorType(errorType)
326 .build();
327
328 llerrObj.add(errObj);
329 PcepError pcepErr = factory.buildPcepError().setErrorObjList(llerrObj).build();
330
331 llPcepErr.add(pcepErr);
332
333 PcepErrorInfo errInfo = factory.buildPcepErrorInfo().setPcepErrorList(llPcepErr).build();
334
335 errMsg = factory.buildPcepErrorMsg().setPcepErrorInfo(errInfo).build();
336 return errMsg;
337 }
338
339 /**
SureshBR25058b72015-08-13 13:05:06 +0530340 * Implementation of an Pcep Agent which is responsible for
341 * keeping track of connected clients and the state in which
342 * they are.
343 */
344 public class PcepClientAgent implements PcepAgent {
345
346 private final Logger log = LoggerFactory.getLogger(PcepClientAgent.class);
SureshBR25058b72015-08-13 13:05:06 +0530347
348 @Override
349 public boolean addConnectedClient(PccId pccId, PcepClient pc) {
350
351 if (connectedClients.get(pccId) != null) {
352 log.error("Trying to add connectedClient but found a previous "
353 + "value for pcc ip: {}", pccId.toString());
354 return false;
355 } else {
356 log.debug("Added Client {}", pccId.toString());
357 connectedClients.put(pccId, pc);
358 for (PcepClientListener l : pcepClientListener) {
359 l.clientConnected(pccId);
360 }
361 return true;
362 }
363 }
364
365 @Override
366 public boolean validActivation(PccId pccId) {
367 if (connectedClients.get(pccId) == null) {
368 log.error("Trying to activate client but is not in "
369 + "connected client: pccIp {}. Aborting ..", pccId.toString());
370 return false;
371 }
372
373 return true;
374 }
375
376 @Override
377 public void removeConnectedClient(PccId pccId) {
378
379 connectedClients.remove(pccId);
380 for (PcepClientListener l : pcepClientListener) {
381 log.warn("removal for {}", pccId.toString());
382 l.clientDisconnected(pccId);
383 }
384 }
385
386 @Override
387 public void processPcepMessage(PccId pccId, PcepMessage m) {
388 processClientMessage(pccId, m);
389 }
Priyanka B94395bf2016-05-21 18:39:46 +0530390
391 @Override
392 public void addNode(PcepClient pc) {
393 for (PcepNodeListener l : pcepNodeListener) {
Avantika-Huaweife44ea62016-05-27 19:21:24 +0530394 l.addDevicePcepConfig(pc);
Priyanka B94395bf2016-05-21 18:39:46 +0530395 }
396 }
397
398 @Override
399 public void deleteNode(PccId pccId) {
400 for (PcepNodeListener l : pcepNodeListener) {
Avantika-Huaweife44ea62016-05-27 19:21:24 +0530401 l.deleteDevicePcepConfig(pccId);
Priyanka B94395bf2016-05-21 18:39:46 +0530402 }
403 }
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530404
405 @SuppressWarnings({ "unchecked", "rawtypes" })
406 @Override
407 public boolean analyzeSyncMsgList(PccId pccId) {
408 PcepClient pc = getClient(pccId);
409 /*
410 * PLSP_ID is null while tunnel is created at PCE and PCInit msg carries it as 0. It is allocated by PCC and
411 * in that case it becomes the first PCRpt msg from PCC for this LSP, and hence symbolic path name must be
412 * carried in the PCRpt msg. Draft says: The SYMBOLIC-PATH-NAME TLV "MUST" be included in the LSP object in
413 * the LSP State Report (PCRpt) message when during a given PCEP session an LSP is "first" reported to a
414 * PCE. So two separate lists with separate keys are maintained.
415 */
416 Map<LspKey, Tunnel> preSyncLspDbByKey = new HashMap<>();
417 Map<String, Tunnel> preSyncLspDbByName = new HashMap<>();
418
419 // Query tunnel service and fetch all the tunnels with this PCC as ingress.
420 // Organize into two maps, with LSP key if known otherwise with symbolic path name, for quick search.
421 Collection<Tunnel> queriedTunnels = tunnelService.queryTunnel(Tunnel.Type.MPLS);
422 for (Tunnel tunnel : queriedTunnels) {
423 if (((IpTunnelEndPoint) tunnel.src()).ip().equals(pccId.ipAddress())) {
424 String pLspId = tunnel.annotations().value(PLSP_ID);
425 if (pLspId != null) {
426 String localLspId = tunnel.annotations().value(LOCAL_LSP_ID);
427 checkNotNull(localLspId);
428 LspKey lspKey = new LspKey(Integer.valueOf(pLspId), Short.valueOf(localLspId));
429 preSyncLspDbByKey.put(lspKey, tunnel);
430 } else {
431 preSyncLspDbByName.put(tunnel.tunnelName().value(), tunnel);
432 }
433 }
434 }
435
436 List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId);
437 Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator();
438
439 // For every report, fetch PLSP id, local LSP id and symbolic path name from the message.
440 while (syncStateRptList.iterator().hasNext()) {
441 PcepStateReport stateRpt = stateRptListIterator.next();
442 Tunnel tunnel = null;
443
444 PcepLspObject lspObj = stateRpt.getLspObject();
445 ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator();
446 StatefulIPv4LspIdentifiersTlv ipv4LspIdenTlv = null;
447 SymbolicPathNameTlv pathNameTlv = null;
448
449 while (listTlvIterator.hasNext()) {
450 PcepValueType tlv = listTlvIterator.next();
451 switch (tlv.getType()) {
452 case StatefulIPv4LspIdentifiersTlv.TYPE:
453 ipv4LspIdenTlv = (StatefulIPv4LspIdentifiersTlv) tlv;
454 break;
455
456 case SymbolicPathNameTlv.TYPE:
457 pathNameTlv = (SymbolicPathNameTlv) tlv;
458 break;
459
460 default:
461 break;
462 }
463 }
464
465 LspKey lspKeyOfRpt = new LspKey(lspObj.getPlspId(), ipv4LspIdenTlv.getLspId());
466 tunnel = preSyncLspDbByKey.get(lspKeyOfRpt);
467 // PCE tunnel is matched with PCRpt LSP. Now delete it from the preSyncLspDb list as the residual
468 // non-matching list will be processed at the end.
469 if (tunnel != null) {
470 preSyncLspDbByKey.remove(lspKeyOfRpt);
471 } else if (pathNameTlv != null) {
472 tunnel = preSyncLspDbByName.get(Arrays.toString(pathNameTlv.getValue()));
473 if (tunnel != null) {
474 preSyncLspDbByName.remove(tunnel.tunnelName());
475 }
476 }
477
478 if (tunnel == null) {
479 // If remove flag is set, and tunnel is not known to PCE, ignore it.
480 if (lspObj.getCFlag() && !lspObj.getRFlag()) {
481 // For initiated LSP, need to send PCInit delete msg.
482 try {
483 PcInitiatedLspRequest releaseLspRequest = pc.factory().buildPcInitiatedLspRequest()
484 .setLspObject(lspObj).build();
485 LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList
486 = new LinkedList<PcInitiatedLspRequest>();
487 llPcInitiatedLspRequestList.add(releaseLspRequest);
488
489 PcepInitiateMsg pcInitiateMsg = pc.factory().buildPcepInitiateMsg()
490 .setPcInitiatedLspRequestList(llPcInitiatedLspRequestList).build();
491
492 for (PcepEventListener l : pcepEventListener) {
493 l.handleEndOfSyncAction(pccId, pcInitiateMsg, SEND_DELETE);
494 }
495
496 } catch (PcepParseException e) {
497 log.error("Exception occured while sending initiate delete message {}", e.getMessage());
498 }
499 }
500 continue;
501 }
502
503 if (!lspObj.getCFlag()) {
504 // For learned LSP process both add/update PCRpt.
505 LinkedList<PcepStateReport> llPcRptList = new LinkedList<>();
506 llPcRptList.add(stateRpt);
507 PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList))
508 .build();
509
510 for (PcepEventListener l : pcepEventListener) {
511 l.handleMessage(pccId, pcReportMsg);
512 }
513 continue;
514 }
515
516 // Implied that tunnel != null and lspObj.getCFlag() is set
517 // State different for PCC sent LSP and PCE known LSP, send PCUpd msg.
518 State tunnelState = PcepLspStatus
519 .getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]);
520 if (tunnelState != tunnel.state()) {
521 for (PcepEventListener l : pcepEventListener) {
522 l.handleEndOfSyncAction(tunnel, SEND_UPDATE);
523 }
524 }
525 }
526
527 // Check which tunnels are extra at PCE that were not reported by PCC.
528 Map<Object, Tunnel> preSyncLspDb = (Map) preSyncLspDbByKey;
529 handleResidualTunnels(preSyncLspDb);
530 preSyncLspDbByKey = null;
531
532 preSyncLspDb = (Map) preSyncLspDbByName;
533 handleResidualTunnels(preSyncLspDb);
534 preSyncLspDbByName = null;
535 preSyncLspDb = null;
536
537 pc.removeSyncMsgList(pccId);
538 return true;
539 }
540
541 /*
542 * Go through the tunnels which are known by PCE but were not reported by PCC during LSP DB sync and take
543 * appropriate actions.
544 */
545 private void handleResidualTunnels(Map<Object, Tunnel> preSyncLspDb) {
546 for (Tunnel pceExtraTunnel : preSyncLspDb.values()) {
547 if (pceExtraTunnel.annotations().value(PCE_INIT) == null
548 || "false".equalsIgnoreCase(pceExtraTunnel.annotations().value(PCE_INIT))) {
549 // PCC initiated tunnels should be removed from tunnel store.
550 for (PcepEventListener l : pcepEventListener) {
551 l.handleEndOfSyncAction(pceExtraTunnel, REMOVE);
552 }
553 } else {
554 // PCE initiated tunnels should be initiated again.
555 for (PcepEventListener l : pcepEventListener) {
556 l.handleEndOfSyncAction(pceExtraTunnel, UNSTABLE);
557 }
558 }
559 }
560 }
SureshBR25058b72015-08-13 13:05:06 +0530561 }
562}