[ONOS-4209] Unsuccessful PCEP session formation between ONOS and IOS XR
Change-Id: Ic509c50c5cef39e5f1a5319570f8c9406177b788
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 cf768ff..dd5d5f5 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
@@ -38,6 +38,7 @@
import org.jboss.netty.handler.timeout.IdleStateHandler;
import org.jboss.netty.handler.timeout.ReadTimeoutException;
import org.onlab.packet.IpAddress;
+import org.onosproject.pcep.controller.ClientCapability;
import org.onosproject.pcep.controller.PccId;
import org.onosproject.pcep.controller.driver.PcepClientDriver;
import org.onosproject.pcepio.exceptions.PcepParseException;
@@ -51,7 +52,6 @@
import org.onosproject.pcepio.protocol.PcepOpenObject;
import org.onosproject.pcepio.protocol.PcepType;
import org.onosproject.pcepio.protocol.PcepVersion;
-import org.onosproject.pcepio.types.ErrorObjListWithOpen;
import org.onosproject.pcepio.types.PceccCapabilityTlv;
import org.onosproject.pcepio.types.StatefulPceCapabilityTlv;
import org.onosproject.pcepio.types.PcepErrorDetailInfo;
@@ -74,6 +74,7 @@
private byte sessionId = 0;
private byte keepAliveTime;
private byte deadTime;
+ private ClientCapability capability;
private PcepPacketStatsImpl pcepPacketStats;
static final int MAX_WRONG_COUNT_PACKET = 5;
static final int BYTE_MASK = 0xFF;
@@ -146,8 +147,8 @@
h.pcepPacketStats.addInPacket();
PcepOpenMsg pOpenmsg = (PcepOpenMsg) m;
- // do Capability validation.
- if (h.capabilityValidation(pOpenmsg)) {
+ //Do Capability negotiation.
+ h.capabilityNegotiation(pOpenmsg);
log.debug("Sending handshake OPEN message");
h.sessionId = pOpenmsg.getPcepOpenObject().getSessionId();
h.pcepVersion = pOpenmsg.getPcepOpenObject().getVersion();
@@ -168,13 +169,6 @@
h.sendHandshakeOpenMessage();
h.pcepPacketStats.addOutPacket();
h.setState(KEEPWAIT);
- } else {
- log.debug("Capability validation failed. Sending PCEP-ERROR message to PCC.");
- // Send PCEP-ERROR message.
- PcepErrorMsg errMsg = h.getErrorMsg(PcepErrorDetailInfo.ERROR_TYPE_2,
- PcepErrorDetailInfo.ERROR_VALUE_2);
- h.channel.write(Collections.singletonList(errMsg));
- }
}
}
},
@@ -203,6 +197,8 @@
h.thispccId = PccId.pccId(IpAddress.valueOf(inetAddress.getAddress()));
h.pc = h.controller.getPcepClientInstance(h.thispccId, h.sessionId, h.pcepVersion,
h.pcepPacketStats);
+ //Get pc instance and set capabilities
+ h.pc.setCapability(h.capability);
// set the status of pcc as connected
h.pc.setConnected(true);
h.pc.setChannel(h.channel);
@@ -493,17 +489,12 @@
channel.write(Collections.singletonList(msg));
}
- /**
- * Capability Validation.
- *
- * @param pOpenmsg pcep open message
- * @return success or failure
- */
- private boolean capabilityValidation(PcepOpenMsg pOpenmsg) {
+ //Capability negotiation
+ private void capabilityNegotiation(PcepOpenMsg pOpenmsg) {
LinkedList<PcepValueType> tlvList = pOpenmsg.getPcepOpenObject().getOptionalTlv();
- boolean bFoundPceccCapability = false;
- boolean bFoundStatefulPceCapability = false;
- boolean bFoundPcInstantiationCapability = false;
+ boolean pceccCapability = false;
+ boolean statefulPceCapability = false;
+ boolean pcInstantiationCapability = false;
ListIterator<PcepValueType> listIterator = tlvList.listIterator();
while (listIterator.hasNext()) {
@@ -511,21 +502,20 @@
switch (tlv.getType()) {
case PceccCapabilityTlv.TYPE:
- bFoundPceccCapability = true;
+ pceccCapability = true;
break;
case StatefulPceCapabilityTlv.TYPE:
- bFoundStatefulPceCapability = true;
+ statefulPceCapability = true;
StatefulPceCapabilityTlv stetefulPcCapTlv = (StatefulPceCapabilityTlv) tlv;
if (stetefulPcCapTlv.getIFlag()) {
- bFoundPcInstantiationCapability = true;
+ pcInstantiationCapability = true;
}
break;
default:
continue;
}
}
-
- return (bFoundPceccCapability && bFoundStatefulPceCapability && bFoundPcInstantiationCapability);
+ this.capability = new ClientCapability(pceccCapability, statefulPceCapability, pcInstantiationCapability);
}
/**
@@ -579,23 +569,6 @@
llerrObj.add(errObj);
- if (state == ChannelState.OPENWAIT) {
- //If Error caught in Openmessage
- PcepOpenObject openObj = null;
- ErrorObjListWithOpen errorObjListWithOpen = null;
-
- if (0 != sessionId) {
- openObj = factory1.buildOpenObject().setSessionId(sessionId).build();
- errorObjListWithOpen = new ErrorObjListWithOpen(llerrObj, openObj);
- } else {
- errorObjListWithOpen = new ErrorObjListWithOpen(llerrObj, null);
- }
-
- errMsg = factory1.buildPcepErrorMsg()
- .setErrorObjListWithOpen(errorObjListWithOpen)
- .build();
- } else {
-
//If Error caught in other than Openmessage
LinkedList<PcepError> llPcepErr = new LinkedList<>();
@@ -612,7 +585,6 @@
errMsg = factory1.buildPcepErrorMsg()
.setPcepErrorInfo(errInfo)
.build();
- }
return errMsg;
}