blob: b7dbfda0f7fdb579d0710b4f5b68a3809f5f998f [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();
239 if (stateRpt.getLspObject().getSFlag()) {
240 if (pc.lspDbSyncStatus() != PcepSyncStatus.IN_SYNC) {
241 // Initialize LSP DB sync and temporary cache.
242 pc.setLspDbSyncStatus(PcepSyncStatus.IN_SYNC);
243 pc.initializeSyncMsgList(pccId);
244 }
245 // Store stateRpt in temporary cache.
246 pc.addSyncMsgToList(pccId, stateRpt);
247
248 // Don't send to provider as of now.
249 continue;
250 } else {
251 if (pc.lspDbSyncStatus() == PcepSyncStatus.IN_SYNC) {
252 // Set end of LSPDB sync.
253 pc.setLspDbSyncStatus(PcepSyncStatus.SYNCED);
254
255 // Call packet provider to initiate label DB sync (only if PCECC capable).
256 if (pc.capability().pceccCapability()) {
257 pc.setLabelDbSyncStatus(IN_SYNC);
258 for (PcepPacketListener l : pcepPacketListener) {
259 l.sendPacketIn(pccId);
260 }
261 } else {
262 // If label db sync is not to be done, handle end of LSPDB sync actions.
263 agent.analyzeSyncMsgList(pccId);
264 }
265 continue;
266 }
267 }
268
269 // It's a usual report message while sync is not undergoing. So process it immediately.
270 LinkedList<PcepStateReport> llPcRptList = new LinkedList<>();
271 llPcRptList.add(stateRpt);
272 PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList))
273 .build();
274 for (PcepEventListener l : pcepEventListener) {
275 l.handleMessage(pccId, pcReportMsg);
276 }
Priyanka Bd2b28882016-04-04 16:57:04 +0530277 }
278 } else {
279 // Send PCEP-ERROR message.
280 pc.sendMessage(Collections.singletonList(getErrMsg(pc.factory(),
281 ERROR_TYPE_19, ERROR_VALUE_5)));
SureshBR25058b72015-08-13 13:05:06 +0530282 }
283 break;
Priyanka Bd2b28882016-04-04 16:57:04 +0530284 case LABEL_RANGE_RESERV:
SureshBR25058b72015-08-13 13:05:06 +0530285 break;
Priyanka B94395bf2016-05-21 18:39:46 +0530286 case LS_REPORT: //TODO: need to handle LS report to add or remove node
287 break;
SureshBR25058b72015-08-13 13:05:06 +0530288 case MAX:
289 break;
290 case END:
291 break;
292 default:
293 break;
294 }
295 }
296
297 @Override
298 public void closeConnectedClients() {
299 PcepClient pc;
300 for (PccId id : connectedClients.keySet()) {
301 pc = getClient(id);
302 pc.disconnectClient();
303 }
304 }
305
306 /**
Priyanka Bd2b28882016-04-04 16:57:04 +0530307 * Returns pcep error message with specific error type and value.
308 *
309 * @param factory represents pcep factory
310 * @param errorType pcep error type
311 * @param errorValue pcep error value
312 * @return pcep error message
313 */
314 public PcepErrorMsg getErrMsg(PcepFactory factory, byte errorType, byte errorValue) {
315 LinkedList<PcepError> llPcepErr = new LinkedList<>();
316
317 LinkedList<PcepErrorObject> llerrObj = new LinkedList<>();
318 PcepErrorMsg errMsg;
319
320 PcepErrorObject errObj = factory.buildPcepErrorObject().setErrorValue(errorValue).setErrorType(errorType)
321 .build();
322
323 llerrObj.add(errObj);
324 PcepError pcepErr = factory.buildPcepError().setErrorObjList(llerrObj).build();
325
326 llPcepErr.add(pcepErr);
327
328 PcepErrorInfo errInfo = factory.buildPcepErrorInfo().setPcepErrorList(llPcepErr).build();
329
330 errMsg = factory.buildPcepErrorMsg().setPcepErrorInfo(errInfo).build();
331 return errMsg;
332 }
333
334 /**
SureshBR25058b72015-08-13 13:05:06 +0530335 * Implementation of an Pcep Agent which is responsible for
336 * keeping track of connected clients and the state in which
337 * they are.
338 */
339 public class PcepClientAgent implements PcepAgent {
340
341 private final Logger log = LoggerFactory.getLogger(PcepClientAgent.class);
SureshBR25058b72015-08-13 13:05:06 +0530342
343 @Override
344 public boolean addConnectedClient(PccId pccId, PcepClient pc) {
345
346 if (connectedClients.get(pccId) != null) {
347 log.error("Trying to add connectedClient but found a previous "
348 + "value for pcc ip: {}", pccId.toString());
349 return false;
350 } else {
351 log.debug("Added Client {}", pccId.toString());
352 connectedClients.put(pccId, pc);
353 for (PcepClientListener l : pcepClientListener) {
354 l.clientConnected(pccId);
355 }
356 return true;
357 }
358 }
359
360 @Override
361 public boolean validActivation(PccId pccId) {
362 if (connectedClients.get(pccId) == null) {
363 log.error("Trying to activate client but is not in "
364 + "connected client: pccIp {}. Aborting ..", pccId.toString());
365 return false;
366 }
367
368 return true;
369 }
370
371 @Override
372 public void removeConnectedClient(PccId pccId) {
373
374 connectedClients.remove(pccId);
375 for (PcepClientListener l : pcepClientListener) {
376 log.warn("removal for {}", pccId.toString());
377 l.clientDisconnected(pccId);
378 }
379 }
380
381 @Override
382 public void processPcepMessage(PccId pccId, PcepMessage m) {
383 processClientMessage(pccId, m);
384 }
Priyanka B94395bf2016-05-21 18:39:46 +0530385
386 @Override
387 public void addNode(PcepClient pc) {
388 for (PcepNodeListener l : pcepNodeListener) {
Avantika-Huaweife44ea62016-05-27 19:21:24 +0530389 l.addDevicePcepConfig(pc);
Priyanka B94395bf2016-05-21 18:39:46 +0530390 }
391 }
392
393 @Override
394 public void deleteNode(PccId pccId) {
395 for (PcepNodeListener l : pcepNodeListener) {
Avantika-Huaweife44ea62016-05-27 19:21:24 +0530396 l.deleteDevicePcepConfig(pccId);
Priyanka B94395bf2016-05-21 18:39:46 +0530397 }
398 }
Avantika-Huaweid1e36bd2016-05-26 12:47:16 +0530399
400 @SuppressWarnings({ "unchecked", "rawtypes" })
401 @Override
402 public boolean analyzeSyncMsgList(PccId pccId) {
403 PcepClient pc = getClient(pccId);
404 /*
405 * PLSP_ID is null while tunnel is created at PCE and PCInit msg carries it as 0. It is allocated by PCC and
406 * in that case it becomes the first PCRpt msg from PCC for this LSP, and hence symbolic path name must be
407 * carried in the PCRpt msg. Draft says: The SYMBOLIC-PATH-NAME TLV "MUST" be included in the LSP object in
408 * the LSP State Report (PCRpt) message when during a given PCEP session an LSP is "first" reported to a
409 * PCE. So two separate lists with separate keys are maintained.
410 */
411 Map<LspKey, Tunnel> preSyncLspDbByKey = new HashMap<>();
412 Map<String, Tunnel> preSyncLspDbByName = new HashMap<>();
413
414 // Query tunnel service and fetch all the tunnels with this PCC as ingress.
415 // Organize into two maps, with LSP key if known otherwise with symbolic path name, for quick search.
416 Collection<Tunnel> queriedTunnels = tunnelService.queryTunnel(Tunnel.Type.MPLS);
417 for (Tunnel tunnel : queriedTunnels) {
418 if (((IpTunnelEndPoint) tunnel.src()).ip().equals(pccId.ipAddress())) {
419 String pLspId = tunnel.annotations().value(PLSP_ID);
420 if (pLspId != null) {
421 String localLspId = tunnel.annotations().value(LOCAL_LSP_ID);
422 checkNotNull(localLspId);
423 LspKey lspKey = new LspKey(Integer.valueOf(pLspId), Short.valueOf(localLspId));
424 preSyncLspDbByKey.put(lspKey, tunnel);
425 } else {
426 preSyncLspDbByName.put(tunnel.tunnelName().value(), tunnel);
427 }
428 }
429 }
430
431 List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId);
432 Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator();
433
434 // For every report, fetch PLSP id, local LSP id and symbolic path name from the message.
435 while (syncStateRptList.iterator().hasNext()) {
436 PcepStateReport stateRpt = stateRptListIterator.next();
437 Tunnel tunnel = null;
438
439 PcepLspObject lspObj = stateRpt.getLspObject();
440 ListIterator<PcepValueType> listTlvIterator = lspObj.getOptionalTlv().listIterator();
441 StatefulIPv4LspIdentifiersTlv ipv4LspIdenTlv = null;
442 SymbolicPathNameTlv pathNameTlv = null;
443
444 while (listTlvIterator.hasNext()) {
445 PcepValueType tlv = listTlvIterator.next();
446 switch (tlv.getType()) {
447 case StatefulIPv4LspIdentifiersTlv.TYPE:
448 ipv4LspIdenTlv = (StatefulIPv4LspIdentifiersTlv) tlv;
449 break;
450
451 case SymbolicPathNameTlv.TYPE:
452 pathNameTlv = (SymbolicPathNameTlv) tlv;
453 break;
454
455 default:
456 break;
457 }
458 }
459
460 LspKey lspKeyOfRpt = new LspKey(lspObj.getPlspId(), ipv4LspIdenTlv.getLspId());
461 tunnel = preSyncLspDbByKey.get(lspKeyOfRpt);
462 // PCE tunnel is matched with PCRpt LSP. Now delete it from the preSyncLspDb list as the residual
463 // non-matching list will be processed at the end.
464 if (tunnel != null) {
465 preSyncLspDbByKey.remove(lspKeyOfRpt);
466 } else if (pathNameTlv != null) {
467 tunnel = preSyncLspDbByName.get(Arrays.toString(pathNameTlv.getValue()));
468 if (tunnel != null) {
469 preSyncLspDbByName.remove(tunnel.tunnelName());
470 }
471 }
472
473 if (tunnel == null) {
474 // If remove flag is set, and tunnel is not known to PCE, ignore it.
475 if (lspObj.getCFlag() && !lspObj.getRFlag()) {
476 // For initiated LSP, need to send PCInit delete msg.
477 try {
478 PcInitiatedLspRequest releaseLspRequest = pc.factory().buildPcInitiatedLspRequest()
479 .setLspObject(lspObj).build();
480 LinkedList<PcInitiatedLspRequest> llPcInitiatedLspRequestList
481 = new LinkedList<PcInitiatedLspRequest>();
482 llPcInitiatedLspRequestList.add(releaseLspRequest);
483
484 PcepInitiateMsg pcInitiateMsg = pc.factory().buildPcepInitiateMsg()
485 .setPcInitiatedLspRequestList(llPcInitiatedLspRequestList).build();
486
487 for (PcepEventListener l : pcepEventListener) {
488 l.handleEndOfSyncAction(pccId, pcInitiateMsg, SEND_DELETE);
489 }
490
491 } catch (PcepParseException e) {
492 log.error("Exception occured while sending initiate delete message {}", e.getMessage());
493 }
494 }
495 continue;
496 }
497
498 if (!lspObj.getCFlag()) {
499 // For learned LSP process both add/update PCRpt.
500 LinkedList<PcepStateReport> llPcRptList = new LinkedList<>();
501 llPcRptList.add(stateRpt);
502 PcepMessage pcReportMsg = pc.factory().buildReportMsg().setStateReportList((llPcRptList))
503 .build();
504
505 for (PcepEventListener l : pcepEventListener) {
506 l.handleMessage(pccId, pcReportMsg);
507 }
508 continue;
509 }
510
511 // Implied that tunnel != null and lspObj.getCFlag() is set
512 // State different for PCC sent LSP and PCE known LSP, send PCUpd msg.
513 State tunnelState = PcepLspStatus
514 .getTunnelStatusFromLspStatus(PcepLspStatus.values()[lspObj.getOFlag()]);
515 if (tunnelState != tunnel.state()) {
516 for (PcepEventListener l : pcepEventListener) {
517 l.handleEndOfSyncAction(tunnel, SEND_UPDATE);
518 }
519 }
520 }
521
522 // Check which tunnels are extra at PCE that were not reported by PCC.
523 Map<Object, Tunnel> preSyncLspDb = (Map) preSyncLspDbByKey;
524 handleResidualTunnels(preSyncLspDb);
525 preSyncLspDbByKey = null;
526
527 preSyncLspDb = (Map) preSyncLspDbByName;
528 handleResidualTunnels(preSyncLspDb);
529 preSyncLspDbByName = null;
530 preSyncLspDb = null;
531
532 pc.removeSyncMsgList(pccId);
533 return true;
534 }
535
536 /*
537 * Go through the tunnels which are known by PCE but were not reported by PCC during LSP DB sync and take
538 * appropriate actions.
539 */
540 private void handleResidualTunnels(Map<Object, Tunnel> preSyncLspDb) {
541 for (Tunnel pceExtraTunnel : preSyncLspDb.values()) {
542 if (pceExtraTunnel.annotations().value(PCE_INIT) == null
543 || "false".equalsIgnoreCase(pceExtraTunnel.annotations().value(PCE_INIT))) {
544 // PCC initiated tunnels should be removed from tunnel store.
545 for (PcepEventListener l : pcepEventListener) {
546 l.handleEndOfSyncAction(pceExtraTunnel, REMOVE);
547 }
548 } else {
549 // PCE initiated tunnels should be initiated again.
550 for (PcepEventListener l : pcepEventListener) {
551 l.handleEndOfSyncAction(pceExtraTunnel, UNSTABLE);
552 }
553 }
554 }
555 }
SureshBR25058b72015-08-13 13:05:06 +0530556 }
557}