[ONOS] PCEP provider changes, added node listeners to topology provider
Change-Id: I98bc6445ee78a8f0bf53f897f0a25f678ec7fc99
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
index 744731f..bbad497 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepChannelHandler.java
@@ -55,6 +55,7 @@
import org.onosproject.pcepio.types.IPv4RouterIdOfLocalNodeSubTlv;
import org.onosproject.pcepio.types.NodeAttributesTlv;
import org.onosproject.pcepio.types.PceccCapabilityTlv;
+import org.onosproject.pcepio.types.SrPceCapabilityTlv;
import org.onosproject.pcepio.types.StatefulPceCapabilityTlv;
import org.onosproject.pcepio.types.PcepErrorDetailInfo;
import org.onosproject.pcepio.types.PcepValueType;
@@ -260,6 +261,8 @@
disconnectDuplicate(h);
} else {
h.setState(ESTABLISHED);
+ //Session is established, add a PCEP device
+ h.addNode();
}
}
}
@@ -469,6 +472,20 @@
}
/**
+ * Adds PCEP device once session is established.
+ */
+ private void addNode() {
+ pc.addNode(pc);
+ }
+
+ /**
+ * Deletes PCEP device when session is disconnected.
+ */
+ private void deleteNode() {
+ pc.deleteNode(pc.getPccId());
+ }
+
+ /**
* Return a string describing this client based on the already available
* information (ip address and/or remote socket).
*
@@ -523,6 +540,8 @@
boolean pceccCapability = false;
boolean statefulPceCapability = false;
boolean pcInstantiationCapability = false;
+ boolean labelStackCapability = false;
+ boolean srCapability = false;
ListIterator<PcepValueType> listIterator = tlvList.listIterator();
while (listIterator.hasNext()) {
@@ -531,6 +550,9 @@
switch (tlv.getType()) {
case PceccCapabilityTlv.TYPE:
pceccCapability = true;
+ if (((PceccCapabilityTlv) tlv).sBit()) {
+ labelStackCapability = true;
+ }
break;
case StatefulPceCapabilityTlv.TYPE:
statefulPceCapability = true;
@@ -539,11 +561,15 @@
pcInstantiationCapability = true;
}
break;
+ case SrPceCapabilityTlv.TYPE:
+ srCapability = true;
+ break;
default:
continue;
}
}
- this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability);
+ this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability,
+ labelStackCapability, srCapability);
}
/**
@@ -563,6 +589,8 @@
*/
private void sendErrMsgAndCloseChannel() {
// TODO send error message
+ //Remove PCEP device from topology
+ deleteNode();
channel.close();
}
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
index 1f58bed..19e2ce4 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientControllerImpl.java
@@ -25,12 +25,16 @@
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.Service;
+import org.onosproject.net.device.DeviceService;
import org.onosproject.pcep.controller.PccId;
import org.onosproject.pcep.controller.PcepClient;
import org.onosproject.pcep.controller.PcepClientController;
import org.onosproject.pcep.controller.PcepClientListener;
import org.onosproject.pcep.controller.PcepEventListener;
+import org.onosproject.pcep.controller.PcepNodeListener;
import org.onosproject.pcep.controller.driver.PcepAgent;
import org.onosproject.pcepio.protocol.PcepError;
import org.onosproject.pcepio.protocol.PcepErrorInfo;
@@ -55,6 +59,9 @@
private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class);
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DeviceService deviceService;
+
protected ConcurrentHashMap<PccId, PcepClient> connectedClients =
new ConcurrentHashMap<>();
@@ -62,6 +69,7 @@
protected Set<PcepClientListener> pcepClientListener = new HashSet<>();
protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet();
+ protected Set<PcepNodeListener> pcepNodeListener = Sets.newHashSet();
private final Controller ctrl = new Controller();
@@ -117,6 +125,16 @@
}
@Override
+ public void addNodeListener(PcepNodeListener listener) {
+ pcepNodeListener.add(listener);
+ }
+
+ @Override
+ public void removeNodeListener(PcepNodeListener listener) {
+ pcepNodeListener.remove(listener);
+ }
+
+ @Override
public void processClientMessage(PccId pccId, PcepMessage msg) {
PcepClient pc = getClient(pccId);
@@ -173,6 +191,8 @@
break;
case LABEL_RANGE_RESERV:
break;
+ case LS_REPORT: //TODO: need to handle LS report to add or remove node
+ break;
case MAX:
break;
case END:
@@ -270,5 +290,19 @@
public void processPcepMessage(PccId pccId, PcepMessage m) {
processClientMessage(pccId, m);
}
+
+ @Override
+ public void addNode(PcepClient pc) {
+ for (PcepNodeListener l : pcepNodeListener) {
+ l.addNode(pc);
+ }
+ }
+
+ @Override
+ public void deleteNode(PccId pccId) {
+ for (PcepNodeListener l : pcepNodeListener) {
+ l.deleteNode(pccId);
+ }
+ }
}
}
diff --git a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
index 8328f2b..6f2d8fd 100644
--- a/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
+++ b/protocols/pcep/ctl/src/main/java/org/onosproject/pcep/controller/impl/PcepClientImpl.java
@@ -26,6 +26,7 @@
import org.onlab.packet.IpAddress;
import org.onosproject.pcep.controller.ClientCapability;
import org.onosproject.pcep.controller.PccId;
+import org.onosproject.pcep.controller.PcepClient;
import org.onosproject.pcep.controller.PcepPacketStats;
import org.onosproject.pcep.controller.PcepSyncStatus;
import org.onosproject.pcep.controller.driver.PcepAgent;
@@ -203,6 +204,16 @@
}
@Override
+ public void addNode(PcepClient pc) {
+ this.agent.addNode(pc);
+ }
+
+ @Override
+ public void deleteNode(PccId pccId) {
+ this.agent.deleteNode(pccId);
+ }
+
+ @Override
public final boolean connectClient() {
return this.agent.addConnectedClient(pccId, this);
}