Avantika-Huawei

[ONOS-4170] Label Db sync

Change-Id: I7322d962551e3c5a046b64884ebc7a2f15ee0cd3
......@@ -57,6 +57,20 @@ public interface PcepSrpObject {
void setRFlag(boolean bRFlag);
/**
* Returns S flag of SRP Object.
*
* @return S flag of SRP Object
*/
boolean getSFlag();
/**
* Sets S(sync) flag with specified value.
*
* @param bSFlag S Flag of SRP Object
*/
void setSFlag(boolean bSFlag);
/**
* sets the optional TLvs.
*
* @param llOptionalTlv list of optional tlvs
......@@ -130,6 +144,13 @@ public interface PcepSrpObject {
boolean getRFlag();
/**
* Returns S(sync) flag of SRP Object.
*
* @return S flag of SRP Object
*/
boolean getSFlag();
/**
* Sets R flag and returns its builder.
*
* @param bRFlag R flag
......@@ -138,6 +159,14 @@ public interface PcepSrpObject {
Builder setRFlag(boolean bRFlag);
/**
* Sets S flag and returns its builder.
*
* @param bSFlag S flag
* @return Builder by setting S flag
*/
Builder setSFlag(boolean bSFlag);
/**
* Returns list of optional tlvs.
*
* @return llOptionalTlv list of optional tlvs
......
......@@ -43,7 +43,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Object-Class | OT |Res|P|I| Object Length (bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags |R|
| Flags |S|R|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SRP-ID-number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
......@@ -60,7 +60,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
public static final byte SRP_OBJECT_VERSION = 1;
public static final short SRP_OBJ_MINIMUM_LENGTH = 12;
public static final int MINIMUM_COMMON_HEADER_LENGTH = 4;
public static final boolean DEFAULT_RFLAG = false;
public static final boolean FLAG_DEFAULT_VALUE = false;
static final PcepObjectHeader DEFAULT_SRP_OBJECT_HEADER = new PcepObjectHeader(SRP_OBJ_CLASS, SRP_OBJ_TYPE,
PcepObjectHeader.REQ_OBJ_OPTIONAL_PROCESS, PcepObjectHeader.RSP_OBJ_PROCESSED, SRP_OBJ_MINIMUM_LENGTH);
......@@ -68,6 +68,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
private PcepObjectHeader srpObjHeader;
private static int flags;
private boolean bRFlag;
private boolean bSFlag;
private int srpId;
//Optional TLV
......@@ -80,14 +81,16 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
*
* @param srpObjHeader srp object header
* @param bRFlag R flag
* @param bSFlag S (sync) flag
* @param srpID srp Id
* @param llOptionalTlv list of optional tlv
*/
public PcepSrpObjectVer1(PcepObjectHeader srpObjHeader, boolean bRFlag, int srpID,
public PcepSrpObjectVer1(PcepObjectHeader srpObjHeader, boolean bRFlag, boolean bSFlag, int srpID,
LinkedList<PcepValueType> llOptionalTlv) {
this.srpObjHeader = srpObjHeader;
this.bRFlag = bRFlag;
this.bSFlag = bSFlag;
this.srpId = srpID;
this.llOptionalTlv = llOptionalTlv;
}
......@@ -111,6 +114,11 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
this.bRFlag = bRFlag;
}
@Override
public void setSFlag(boolean bSFlag) {
this.bSFlag = bSFlag;
}
/**
* Returns SRP object header.
*
......@@ -131,6 +139,11 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
}
@Override
public boolean getSFlag() {
return this.bSFlag;
}
@Override
public void setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
......@@ -153,6 +166,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
log.debug("SrpObject::read");
PcepObjectHeader srpObjHeader;
boolean bRFlag;
boolean bSFlag;
int srpID;
int flags;
......@@ -167,12 +181,13 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
//take only SrpObject buffer.
ChannelBuffer tempCb = cb.readBytes(srpObjHeader.getObjLen() - MINIMUM_COMMON_HEADER_LENGTH);
flags = tempCb.readInt();
bRFlag = 0 < flags;
bRFlag = 0 < (flags & 0x1);
bSFlag = 0 < ((flags >> 1) & 0x1);
srpID = tempCb.readInt();
llOptionalTlv = parseOptionalTlv(tempCb);
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, srpID, llOptionalTlv);
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, bSFlag, srpID, llOptionalTlv);
}
@Override
......@@ -187,6 +202,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
byte bFlag;
bFlag = (bRFlag) ? BBIT_SET : BBIT_RESET;
bFlag |= (((bSFlag) ? BBIT_SET : BBIT_RESET) << 1);
cb.writeInt(bFlag);
......@@ -292,10 +308,12 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
private boolean bIsHeaderSet = false;
private boolean bIsSrpIdset = false;
private boolean bIsRFlagSet = false;
private boolean bIsSFlagSet = false;
private PcepObjectHeader srpObjHeader;
private int srpId;
private boolean bRFlag;
private boolean bSFlag;
LinkedList<PcepValueType> llOptionalTlv = new LinkedList<>();
private boolean bIsPFlagSet = false;
......@@ -308,7 +326,8 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
public PcepSrpObject build() throws PcepParseException {
PcepObjectHeader srpObjHeader = this.bIsHeaderSet ? this.srpObjHeader : DEFAULT_SRP_OBJECT_HEADER;
boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : DEFAULT_RFLAG;
boolean bRFlag = this.bIsRFlagSet ? this.bRFlag : FLAG_DEFAULT_VALUE;
boolean bSFlag = this.bIsSFlagSet ? this.bSFlag : FLAG_DEFAULT_VALUE;
if (!this.bIsSrpIdset) {
throw new PcepParseException("SrpID not set while building SRP Object.");
......@@ -322,7 +341,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
srpObjHeader.setIFlag(bIFlag);
}
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, this.srpId, this.llOptionalTlv);
return new PcepSrpObjectVer1(srpObjHeader, bRFlag, bSFlag, this.srpId, this.llOptionalTlv);
}
@Override
......@@ -362,6 +381,18 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
}
@Override
public boolean getSFlag() {
return this.bSFlag;
}
@Override
public Builder setSFlag(boolean bSFlag) {
this.bSFlag = bSFlag;
this.bIsSFlagSet = true;
return this;
}
@Override
public Builder setOptionalTlv(LinkedList<PcepValueType> llOptionalTlv) {
this.llOptionalTlv = llOptionalTlv;
return this;
......@@ -392,6 +423,7 @@ public class PcepSrpObjectVer1 implements PcepSrpObject {
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("RFlag", bRFlag)
.add("SFlag", bSFlag)
.add("SRPID", srpId)
.add("OptionalTlvList", llOptionalTlv)
.toString();
......
......@@ -74,6 +74,9 @@ import org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC;
import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger;
/**
......@@ -188,7 +191,13 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
//Pushes node labels to the specified device.
private void pushGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId,
IpPrefix ipPrefix, Objective.Operation type) throws PcepParseException {
IpPrefix ipPrefix, Objective.Operation type, boolean isBos) throws PcepParseException {
checkNotNull(deviceId);
checkNotNull(labelId);
checkNotNull(ipPrefix);
checkNotNull(type);
PcepClient pc = getPcepClient(deviceId);
if (pc == null) {
log.error("PCEP client not found");
......@@ -201,7 +210,20 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
.setNodeID(ipPrefix.address().getIp4Address().toInt())
.build();
PcepSrpObject srpObj = getSrpObject(pc, type);
boolean bSFlag = false;
if (pc.labelDbSyncStatus() == IN_SYNC) {
if (isBos) {
/*
* Now the sync is completed.
* Need to send label DB end-of-sync msg, i.e. S flag in SRP id is reset.
*/
pc.setLabelDbSyncStatus(SYNCED);
} else {
bSFlag = true;
}
}
PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
//Global NODE-SID as label object
PcepLabelObject labelObject = pc.factory().buildLabelObject()
......@@ -224,26 +246,35 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
pc.sendMessage(labelMsg);
}
private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type) throws PcepParseException {
private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type, boolean bSFlag)
throws PcepParseException {
PcepSrpObject srpObj;
if (type.equals(Objective.Operation.ADD)) {
srpObj = pc.factory().buildSrpObject()
.setRFlag(false)
.setSrpID(SrpIdGenerators.create())
.build();
} else {
//To cleanup labels, R bit is set
srpObj = pc.factory().buildSrpObject()
.setRFlag(true)
.setSrpID(SrpIdGenerators.create())
.build();
boolean bRFlag = false;
if (!type.equals(Objective.Operation.ADD)) {
// To cleanup labels, R bit is set
bRFlag = true;
}
srpObj = pc.factory().buildSrpObject()
.setRFlag(bRFlag)
.setSFlag(bSFlag)
.setSrpID(SrpIdGenerators.create())
.build();
return srpObj;
}
//Pushes adjacency labels to the specified device.
private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId,
PortNumber srcPortNum, PortNumber dstPortNum, Objective.Operation type) throws PcepParseException {
checkNotNull(deviceId);
checkNotNull(labelId);
checkNotNull(srcPortNum);
checkNotNull(dstPortNum);
checkNotNull(type);
PcepClient pc = getPcepClient(deviceId);
if (pc == null) {
log.error("PCEP client not found");
......@@ -262,7 +293,7 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
.seLocalIPv4Address((int) srcPortNo)
.build();
PcepSrpObject srpObj = getSrpObject(pc, type);
PcepSrpObject srpObj = getSrpObject(pc, type, false);
//Adjacency label object
PcepLabelObject labelObject = pc.factory().buildLabelObject()
......@@ -290,6 +321,13 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
PortNumber portNum, TunnelId tunnelId,
Boolean isBos, Long labelType, Objective.Operation type) throws PcepParseException {
checkNotNull(deviceId);
checkNotNull(labelId);
checkNotNull(portNum);
checkNotNull(tunnelId);
checkNotNull(labelType);
checkNotNull(type);
PcepClient pc = getPcepClient(deviceId);
if (pc == null) {
log.error("PCEP client not found");
......@@ -335,7 +373,7 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
//Add OUT label object in case of transit node
labelObjects.add(labelObj);
srpObj = getSrpObject(pc, type);
srpObj = getSrpObject(pc, type, false);
String lspId = tunnel.annotations().value(PcepAnnotationKeys.PLSP_ID);
String plspId = tunnel.annotations().value(PcepAnnotationKeys.LOCAL_LSP_ID);
......