[ONOS-4687] GoldenEye - Label map download issues.

Change-Id: I5b56ccc6b8bad3c585f4d33ddd6d9094751c8797
This commit is contained in:
Avantika-Huawei 2016-06-10 16:13:55 +05:30
parent 8e9f8d1510
commit fc10dca2dc
15 changed files with 185 additions and 143 deletions

View File

@ -893,9 +893,7 @@ public class PceManager implements PceService {
// Check whether device has SR-TE Capability // Check whether device has SR-TE Capability
if (cfg.labelStackCap()) { if (cfg.labelStackCap()) {
if (!srTeHandler.allocateNodeLabel(deviceId, lsrId)) { srTeHandler.allocateNodeLabel(deviceId, lsrId);
log.error("Node label allocation for a device id {} has failed.", deviceId.toString());
}
} }
} }
@ -974,10 +972,7 @@ public class PceManager implements PceService {
// Check whether device has SR-TE Capability // Check whether device has SR-TE Capability
if (cfg.labelStackCap()) { if (cfg.labelStackCap()) {
if (!srTeHandler.allocateAdjacencyLabel(link)) { srTeHandler.allocateAdjacencyLabel(link);
log.error("Unable to allocate adjacency label for a link {}.", link.toString());
return;
}
} }
return; return;
@ -1209,16 +1204,13 @@ public class PceManager implements PceService {
if (cfg.labelStackCap()) { if (cfg.labelStackCap()) {
if (mastershipService.getLocalRole(deviceId) == MastershipRole.MASTER) { if (mastershipService.getLocalRole(deviceId) == MastershipRole.MASTER) {
// Allocate node-label // Allocate node-label
if (!srTeHandler.allocateNodeLabel(deviceId, lsrId)) { srTeHandler.allocateNodeLabel(deviceId, lsrId);
log.error("Node label allocation for a device id {} has failed.", deviceId.toString());
}
// Allocate adjacency label to links which are // Allocate adjacency label to links which are
// originated from this specific device id // originated from this specific device id
Set<Link> links = linkService.getDeviceEgressLinks(deviceId); Set<Link> links = linkService.getDeviceEgressLinks(deviceId);
for (Link link : links) { for (Link link : links) {
if (!srTeHandler.allocateAdjacencyLabel(link)) { if (!srTeHandler.allocateAdjacencyLabel(link)) {
log.debug("Unable to allocate adjacency labels for a link {}.", link.toString());
return; return;
} }
} }
@ -1240,6 +1232,7 @@ public class PceManager implements PceService {
return false; return false;
} }
if (pceStore.getGlobalNodeLabel(deviceId) != null) {
Map<DeviceId, LabelResourceId> globalNodeLabelMap = pceStore.getGlobalNodeLabels(); Map<DeviceId, LabelResourceId> globalNodeLabelMap = pceStore.getGlobalNodeLabels();
for (Entry<DeviceId, LabelResourceId> entry : globalNodeLabelMap.entrySet()) { for (Entry<DeviceId, LabelResourceId> entry : globalNodeLabelMap.entrySet()) {
@ -1248,8 +1241,8 @@ public class PceManager implements PceService {
Device srcDevice = deviceService.getDevice(entry.getKey()); Device srcDevice = deviceService.getDevice(entry.getKey());
/* /*
* If there is a slight difference in timing such that if device subsystem has removed the device but PCE * If there is a slight difference in timing such that if device subsystem has removed the device but
* store still has it, just ignore such devices. * PCE store still has it, just ignore such devices.
*/ */
if (srcDevice == null) { if (srcDevice == null) {
continue; continue;
@ -1276,6 +1269,7 @@ public class PceManager implements PceService {
Objective.Operation.ADD); Objective.Operation.ADD);
} }
} }
}
srTeHandler.advertiseNodeLabelRule(deviceId, srTeHandler.advertiseNodeLabelRule(deviceId,
LabelResourceId.labelResourceId(0), LabelResourceId.labelResourceId(0),

View File

@ -28,7 +28,6 @@ import java.util.Set;
import org.onlab.packet.IpAddress; import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix; import org.onlab.packet.IpPrefix;
import org.onlab.packet.MplsLabel; import org.onlab.packet.MplsLabel;
import org.onlab.packet.TpPort;
import org.onosproject.core.ApplicationId; import org.onosproject.core.ApplicationId;
import org.onosproject.incubator.net.resource.label.DefaultLabelResource; import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
import org.onosproject.incubator.net.resource.label.LabelResource; import org.onosproject.incubator.net.resource.label.LabelResource;
@ -184,7 +183,7 @@ public final class PceccSrTeBeHandler {
// Check whether node-label was already configured for this specific device. // Check whether node-label was already configured for this specific device.
if (pceStore.getGlobalNodeLabel(specificDeviceId) != null) { if (pceStore.getGlobalNodeLabel(specificDeviceId) != null) {
log.error("Node label was already configured for device {}.", specificDeviceId.toString()); log.debug("Node label was already configured for device {}.", specificDeviceId.toString());
return false; return false;
} }
@ -228,13 +227,16 @@ public final class PceccSrTeBeHandler {
// Push to device // Push to device
// Push label information of specificDeviceId to otherDevId in list and vice versa. // Push label information of specificDeviceId to otherDevId in list and vice versa.
if (!otherDevId.equals(specificDeviceId)) {
advertiseNodeLabelRule(otherDevId, specificLabelId, advertiseNodeLabelRule(otherDevId, specificLabelId,
IpPrefix.valueOf(IpAddress.valueOf(specificLsrId), PREFIX_LENGTH), IpPrefix.valueOf(IpAddress.valueOf(specificLsrId), PREFIX_LENGTH),
Objective.Operation.ADD, false); Objective.Operation.ADD, false);
advertiseNodeLabelRule(specificDeviceId, otherLabelId, advertiseNodeLabelRule(specificDeviceId, otherLabelId,
IpPrefix.valueOf(IpAddress.valueOf(otherLsrId), PREFIX_LENGTH), IpPrefix.valueOf(IpAddress.valueOf(otherLsrId), PREFIX_LENGTH),
Objective.Operation.ADD, false); Objective.Operation.ADD, false);
} }
}
return true; return true;
} }
@ -519,8 +521,8 @@ public final class PceccSrTeBeHandler {
TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder();
selectorBuilder.matchMplsLabel(MplsLabel.mplsLabel(labelId.id().intValue())); selectorBuilder.matchMplsLabel(MplsLabel.mplsLabel(labelId.id().intValue()));
selectorBuilder.matchTcpSrc(TpPort.tpPort((int) srcPortNum.toLong())); selectorBuilder.matchIPSrc(IpPrefix.valueOf((int) srcPortNum.toLong(), 32));
selectorBuilder.matchTcpDst(TpPort.tpPort((int) dstPortNum.toLong())); selectorBuilder.matchIPDst(IpPrefix.valueOf((int) dstPortNum.toLong(), 32));
TrafficTreatment treatment = DefaultTrafficTreatment.builder().build(); TrafficTreatment treatment = DefaultTrafficTreatment.builder().build();

View File

@ -219,19 +219,19 @@ public class DistributedPceStore implements PceStore {
@Override @Override
public LabelResourceId getGlobalNodeLabel(DeviceId id) { public LabelResourceId getGlobalNodeLabel(DeviceId id) {
checkNotNull(id, DEVICE_ID_NULL); checkNotNull(id, DEVICE_ID_NULL);
return globalNodeLabelMap.get(id).value(); return globalNodeLabelMap.get(id) == null ? null : globalNodeLabelMap.get(id).value();
} }
@Override @Override
public LabelResourceId getAdjLabel(Link link) { public LabelResourceId getAdjLabel(Link link) {
checkNotNull(link, LINK_NULL); checkNotNull(link, LINK_NULL);
return adjLabelMap.get(link).value(); return adjLabelMap.get(link) == null ? null : adjLabelMap.get(link).value();
} }
@Override @Override
public PceccTunnelInfo getTunnelInfo(TunnelId tunnelId) { public PceccTunnelInfo getTunnelInfo(TunnelId tunnelId) {
checkNotNull(tunnelId, TUNNEL_ID_NULL); checkNotNull(tunnelId, TUNNEL_ID_NULL);
return tunnelInfoMap.get(tunnelId).value(); return tunnelInfoMap.get(tunnelId) == null ? null : tunnelInfoMap.get(tunnelId).value();
} }
@Override @Override

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.onosproject.provider.pcep.tunnel.impl; package org.onosproject.pcep.controller;
/** /**
* Collection of keys for annotation for PCEP tunnels. * Collection of keys for annotation for PCEP tunnels.

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.onosproject.provider.pcep.tunnel.impl; package org.onosproject.pcep.controller;
import static org.slf4j.LoggerFactory.getLogger; import static org.slf4j.LoggerFactory.getLogger;

View File

@ -62,6 +62,8 @@ import org.onosproject.pcepio.types.PcepValueType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import static org.onosproject.pcep.controller.PcepSyncStatus.NOT_SYNCED;
/** /**
* Channel handler deals with the pcc client connection and dispatches * Channel handler deals with the pcc client connection and dispatches
* messages from client to the appropriate locations. * messages from client to the appropriate locations.
@ -233,6 +235,11 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler {
h.pcepPacketStats); h.pcepPacketStats);
//Get pc instance and set capabilities //Get pc instance and set capabilities
h.pc.setCapability(h.capability); h.pc.setCapability(h.capability);
// Initilialize DB sync status.
h.pc.setLspDbSyncStatus(NOT_SYNCED);
h.pc.setLabelDbSyncStatus(NOT_SYNCED);
// set the status of pcc as connected // set the status of pcc as connected
h.pc.setConnected(true); h.pc.setConnected(true);
h.pc.setChannel(h.channel); h.pc.setChannel(h.channel);
@ -258,6 +265,7 @@ class PcepChannelHandler extends IdleStateAwareChannelHandler {
log.debug("Keep alive time : " + keepAliveTimer); log.debug("Keep alive time : " + keepAliveTimer);
//set the state handshake completion. //set the state handshake completion.
h.sendKeepAliveMessage(); h.sendKeepAliveMessage();
h.pcepPacketStats.addOutPacket(); h.pcepPacketStats.addOutPacket();
h.setHandshakeComplete(true); h.setHandshakeComplete(true);

View File

@ -434,10 +434,16 @@ public class PcepClientControllerImpl implements PcepClientController {
} }
List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId); List<PcepStateReport> syncStateRptList = pc.getSyncMsgList(pccId);
if (syncStateRptList == null) {
// When there are no LSPs to sync, directly end-of-sync PCRpt will come and the
// list will be null.
syncStateRptList = Collections.EMPTY_LIST;
}
Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator(); Iterator<PcepStateReport> stateRptListIterator = syncStateRptList.iterator();
// For every report, fetch PLSP id, local LSP id and symbolic path name from the message. // For every report, fetch PLSP id, local LSP id and symbolic path name from the message.
while (syncStateRptList.iterator().hasNext()) { while (stateRptListIterator.hasNext()) {
PcepStateReport stateRpt = stateRptListIterator.next(); PcepStateReport stateRpt = stateRptListIterator.next();
Tunnel tunnel = null; Tunnel tunnel = null;

View File

@ -73,7 +73,7 @@ public class PcepClientImpl implements PcepClientDriver {
private byte sessionId; private byte sessionId;
private PcepPacketStatsImpl pktStats; private PcepPacketStatsImpl pktStats;
private Map<LspKey, Boolean> lspDelegationInfo; private Map<LspKey, Boolean> lspDelegationInfo;
private Map<PccId, List<PcepStateReport>> sycRptCache = new HashMap<>(); private Map<PccId, List<PcepStateReport>> syncRptCache = new HashMap<>();
@Override @Override
public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) { public void init(PccId pccId, PcepVersion pcepVersion, PcepPacketStats pktStats) {
@ -267,24 +267,24 @@ public class PcepClientImpl implements PcepClientDriver {
@Override @Override
public void initializeSyncMsgList(PccId pccId) { public void initializeSyncMsgList(PccId pccId) {
List<PcepStateReport> rptMsgList = new LinkedList<>(); List<PcepStateReport> rptMsgList = new LinkedList<>();
sycRptCache.put(pccId, rptMsgList); syncRptCache.put(pccId, rptMsgList);
} }
@Override @Override
public List<PcepStateReport> getSyncMsgList(PccId pccId) { public List<PcepStateReport> getSyncMsgList(PccId pccId) {
return sycRptCache.get(pccId); return syncRptCache.get(pccId);
} }
@Override @Override
public void removeSyncMsgList(PccId pccId) { public void removeSyncMsgList(PccId pccId) {
sycRptCache.remove(pccId); syncRptCache.remove(pccId);
} }
@Override @Override
public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) { public void addSyncMsgToList(PccId pccId, PcepStateReport rptMsg) {
List<PcepStateReport> rptMsgList = sycRptCache.get(pccId); List<PcepStateReport> rptMsgList = syncRptCache.get(pccId);
rptMsgList.add(rptMsg); rptMsgList.add(rptMsg);
sycRptCache.put(pccId, rptMsgList); syncRptCache.put(pccId, rptMsgList);
} }
@Override @Override

View File

@ -15,6 +15,9 @@
*/ */
package org.onosproject.provider.bgpcep.flow.impl; package org.onosproject.provider.bgpcep.flow.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -28,7 +31,6 @@ import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix; import org.onlab.packet.IpPrefix;
import org.onlab.packet.MplsLabel; import org.onlab.packet.MplsLabel;
import org.onosproject.bgp.controller.BgpController; import org.onosproject.bgp.controller.BgpController;
import org.onosproject.cfg.ComponentConfigService;
import org.onosproject.core.ApplicationId; import org.onosproject.core.ApplicationId;
import org.onosproject.incubator.net.resource.label.LabelResourceId; import org.onosproject.incubator.net.resource.label.LabelResourceId;
import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint; import org.onosproject.incubator.net.tunnel.IpTunnelEndPoint;
@ -42,21 +44,24 @@ import org.onosproject.net.Link;
import org.onosproject.net.Path; import org.onosproject.net.Path;
import org.onosproject.net.PortNumber; import org.onosproject.net.PortNumber;
import org.onosproject.net.device.DeviceService; import org.onosproject.net.device.DeviceService;
import org.onosproject.net.flow.CompletedBatchOperation;
import org.onosproject.net.flow.DefaultFlowEntry;
import org.onosproject.net.flow.FlowEntry;
import org.onosproject.net.flow.FlowRule; import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.flow.FlowRuleBatchEntry;
import org.onosproject.net.flow.FlowRuleBatchOperation; import org.onosproject.net.flow.FlowRuleBatchOperation;
import org.onosproject.net.flow.FlowRuleProvider; import org.onosproject.net.flow.FlowRuleProvider;
import org.onosproject.net.flow.FlowRuleProviderRegistry; import org.onosproject.net.flow.FlowRuleProviderRegistry;
import org.onosproject.net.flow.FlowRuleProviderService; import org.onosproject.net.flow.FlowRuleProviderService;
import org.onosproject.net.flow.TrafficSelector; import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.FlowEntry.FlowEntryState;
import org.onosproject.net.flow.criteria.Criterion; import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flow.criteria.IPCriterion; import org.onosproject.net.flow.criteria.IPCriterion;
import org.onosproject.net.flow.criteria.MetadataCriterion; import org.onosproject.net.flow.criteria.MetadataCriterion;
import org.onosproject.net.flow.criteria.MplsBosCriterion; import org.onosproject.net.flow.criteria.MplsBosCriterion;
import org.onosproject.net.flow.criteria.MplsCriterion; import org.onosproject.net.flow.criteria.MplsCriterion;
import org.onosproject.net.flow.criteria.PortCriterion; import org.onosproject.net.flow.criteria.PortCriterion;
import org.onosproject.net.flow.criteria.TcpPortCriterion;
import org.onosproject.net.flow.criteria.TunnelIdCriterion; import org.onosproject.net.flow.criteria.TunnelIdCriterion;
import org.onosproject.net.flowobjective.Objective;
import org.onosproject.net.provider.AbstractProvider; import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId; import org.onosproject.net.provider.ProviderId;
import org.onosproject.net.resource.ResourceService; import org.onosproject.net.resource.ResourceService;
@ -81,13 +86,14 @@ import org.onosproject.pcepio.types.PcepLabelDownload;
import org.onosproject.pcepio.types.PcepLabelMap; import org.onosproject.pcepio.types.PcepLabelMap;
import org.onosproject.pcepio.types.PcepValueType; import org.onosproject.pcepio.types.PcepValueType;
import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv; import org.onosproject.pcepio.types.StatefulIPv4LspIdentifiersTlv;
import org.onosproject.provider.pcep.tunnel.impl.SrpIdGenerators; import org.onosproject.pcep.controller.SrpIdGenerators;
import org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys; import org.onosproject.pcep.controller.PcepAnnotationKeys;
import org.osgi.service.component.ComponentContext; import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC; import static org.onosproject.pcep.controller.PcepSyncStatus.IN_SYNC;
import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED; import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
import static org.onosproject.net.flow.criteria.Criterion.Type.EXTENSION;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static org.slf4j.LoggerFactory.getLogger; import static org.slf4j.LoggerFactory.getLogger;
@ -103,9 +109,6 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected FlowRuleProviderRegistry providerRegistry; protected FlowRuleProviderRegistry providerRegistry;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ComponentConfigService cfgService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected BgpController bgpController; protected BgpController bgpController;
@ -129,6 +132,12 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
public static final long SET = 0xFFFFFFFFL; public static final long SET = 0xFFFFFFFFL;
private static final String LSRID = "lsrId"; private static final String LSRID = "lsrId";
private enum PcepFlowType {
ADD,
MODIFY,
REMOVE
}
/** /**
* Creates a BgpFlow host provider. * Creates a BgpFlow host provider.
*/ */
@ -138,14 +147,12 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
@Activate @Activate
public void activate(ComponentContext context) { public void activate(ComponentContext context) {
cfgService.registerProperties(getClass());
providerService = providerRegistry.register(this); providerService = providerRegistry.register(this);
log.info("Started"); log.info("Started");
} }
@Deactivate @Deactivate
public void deactivate(ComponentContext context) { public void deactivate(ComponentContext context) {
cfgService.unregisterProperties(getClass(), false);
providerRegistry.unregister(this); providerRegistry.unregister(this);
providerService = null; providerService = null;
log.info("Stopped"); log.info("Stopped");
@ -154,26 +161,25 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
@Override @Override
public void applyFlowRule(FlowRule... flowRules) { public void applyFlowRule(FlowRule... flowRules) {
for (FlowRule flowRule : flowRules) { for (FlowRule flowRule : flowRules) {
processRule(flowRule, Objective.Operation.ADD); processRule(flowRule, PcepFlowType.ADD);
} }
} }
@Override @Override
public void removeFlowRule(FlowRule... flowRules) { public void removeFlowRule(FlowRule... flowRules) {
for (FlowRule flowRule : flowRules) { for (FlowRule flowRule : flowRules) {
processRule(flowRule, Objective.Operation.REMOVE); processRule(flowRule, PcepFlowType.REMOVE);
} }
} }
private void processRule(FlowRule flowRule, Objective.Operation type) { private void processRule(FlowRule flowRule, PcepFlowType type) {
MplsLabel mplsLabel = null; MplsLabel mplsLabel = null;
IpPrefix ip4Prefix = null; IpPrefix ip4PrefixSrc = null;
IpPrefix ip4PrefixDst = null;
PortNumber port = null; PortNumber port = null;
TunnelId tunnelId = null; TunnelId tunnelId = null;
long labelType = 0; long labelType = 0;
boolean bottomOfStack = false; boolean bottomOfStack = false;
int srcPort = 0;
int dstPort = 0;
TrafficSelector selector = flowRule.selector(); TrafficSelector selector = flowRule.selector();
for (Criterion c : selector.criteria()) { for (Criterion c : selector.criteria()) {
@ -184,20 +190,16 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
break; break;
case IPV4_SRC: case IPV4_SRC:
IPCriterion ipCriterion = (IPCriterion) c; IPCriterion ipCriterion = (IPCriterion) c;
ip4Prefix = ipCriterion.ip().getIp4Prefix(); ip4PrefixSrc = ipCriterion.ip().getIp4Prefix();
break;
case IPV4_DST:
ipCriterion = (IPCriterion) c;
ip4PrefixDst = ipCriterion.ip().getIp4Prefix();
break; break;
case IN_PORT: case IN_PORT:
PortCriterion inPort = (PortCriterion) c; PortCriterion inPort = (PortCriterion) c;
port = inPort.port(); port = inPort.port();
break; break;
case TCP_SRC:
TcpPortCriterion srcTcpPort = (TcpPortCriterion) c;
srcPort = srcTcpPort.tcpPort().toInt();
break;
case TCP_DST:
TcpPortCriterion dstTcpPort = (TcpPortCriterion) c;
dstPort = dstTcpPort.tcpPort().toInt();
break;
case TUNNEL_ID: case TUNNEL_ID:
TunnelIdCriterion tc = (TunnelIdCriterion) c; TunnelIdCriterion tc = (TunnelIdCriterion) c;
tunnelId = TunnelId.valueOf(String.valueOf(tc.tunnelId())); tunnelId = TunnelId.valueOf(String.valueOf(tc.tunnelId()));
@ -224,13 +226,12 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
return; return;
} }
if (srcPort != 0 && dstPort != 0) { if (ip4PrefixDst != null) {
pushAdjacencyLabel(flowRule.deviceId(), label, PortNumber.portNumber(srcPort), pushAdjacencyLabel(flowRule.deviceId(), label, ip4PrefixSrc, ip4PrefixDst, type);
PortNumber.portNumber(dstPort), type);
return; return;
} }
pushGlobalNodeLabel(flowRule.deviceId(), label, ip4Prefix, type, bottomOfStack); pushGlobalNodeLabel(flowRule.deviceId(), label, ip4PrefixSrc, type, bottomOfStack);
} catch (PcepParseException e) { } catch (PcepParseException e) {
log.error("Exception occured while sending label message to PCC {}", e.getMessage()); log.error("Exception occured while sending label message to PCC {}", e.getMessage());
@ -255,7 +256,7 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
//Pushes node labels to the specified device. //Pushes node labels to the specified device.
private void pushGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId, private void pushGlobalNodeLabel(DeviceId deviceId, LabelResourceId labelId,
IpPrefix ipPrefix, Objective.Operation type, boolean isBos) throws PcepParseException { IpPrefix ipPrefix, PcepFlowType type, boolean isBos) throws PcepParseException {
checkNotNull(deviceId); checkNotNull(deviceId);
checkNotNull(labelId); checkNotNull(labelId);
@ -271,7 +272,7 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
if (ipPrefix == null) { if (ipPrefix == null) {
// Pushing self node label to device. // Pushing self node label to device.
IpPrefix.valueOf(pc.getPccId().ipAddress(), 32); ipPrefix = IpPrefix.valueOf(pc.getPccId().ipAddress(), 32);
} }
PcepFecObjectIPv4 fecObject = pc.factory().buildFecObjectIpv4() PcepFecObjectIPv4 fecObject = pc.factory().buildFecObjectIpv4()
@ -279,17 +280,10 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
.build(); .build();
boolean bSFlag = false; boolean bSFlag = false;
if (pc.labelDbSyncStatus() == IN_SYNC) { if (pc.labelDbSyncStatus() == IN_SYNC && !isBos) {
if (isBos) { // Need to set sync flag in all messages till sync completes.
/*
* 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; bSFlag = true;
} }
}
PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag); PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
@ -312,14 +306,19 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
.build(); .build();
pc.sendMessage(labelMsg); pc.sendMessage(labelMsg);
if (isBos) {
// Sync is completed.
pc.setLabelDbSyncStatus(SYNCED);
}
} }
private PcepSrpObject getSrpObject(PcepClient pc, Objective.Operation type, boolean bSFlag) private PcepSrpObject getSrpObject(PcepClient pc, PcepFlowType type, boolean bSFlag)
throws PcepParseException { throws PcepParseException {
PcepSrpObject srpObj; PcepSrpObject srpObj;
boolean bRFlag = false; boolean bRFlag = false;
if (!type.equals(Objective.Operation.ADD)) { if (!type.equals(PcepFlowType.ADD)) {
// To cleanup labels, R bit is set // To cleanup labels, R bit is set
bRFlag = true; bRFlag = true;
} }
@ -334,13 +333,14 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
} }
//Pushes adjacency labels to the specified device. //Pushes adjacency labels to the specified device.
private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId, private void pushAdjacencyLabel(DeviceId deviceId, LabelResourceId labelId, IpPrefix ip4PrefixSrc,
PortNumber srcPortNum, PortNumber dstPortNum, Objective.Operation type) throws PcepParseException { IpPrefix ip4PrefixDst, PcepFlowType type)
throws PcepParseException {
checkNotNull(deviceId); checkNotNull(deviceId);
checkNotNull(labelId); checkNotNull(labelId);
checkNotNull(srcPortNum); checkNotNull(ip4PrefixSrc);
checkNotNull(dstPortNum); checkNotNull(ip4PrefixDst);
checkNotNull(type); checkNotNull(type);
PcepClient pc = getPcepClient(deviceId); PcepClient pc = getPcepClient(deviceId);
@ -351,17 +351,21 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
LinkedList<PcepLabelUpdate> labelUpdateList = new LinkedList<>(); LinkedList<PcepLabelUpdate> labelUpdateList = new LinkedList<>();
long srcPortNo = srcPortNum.toLong(); int srcPortNo = ip4PrefixSrc.address().getIp4Address().toInt();
long dstPortNo = dstPortNum.toLong(); int dstPortNo = ip4PrefixDst.address().getIp4Address().toInt();
srcPortNo = ((srcPortNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? srcPortNo & SET : srcPortNo;
dstPortNo = ((dstPortNo & IDENTIFIER_SET) == IDENTIFIER_SET) ? dstPortNo & SET : dstPortNo;
PcepFecObjectIPv4Adjacency fecAdjObject = pc.factory().buildFecIpv4Adjacency() PcepFecObjectIPv4Adjacency fecAdjObject = pc.factory().buildFecIpv4Adjacency()
.seRemoteIPv4Address((int) dstPortNo) .seRemoteIPv4Address(dstPortNo)
.seLocalIPv4Address((int) srcPortNo) .seLocalIPv4Address(srcPortNo)
.build(); .build();
PcepSrpObject srpObj = getSrpObject(pc, type, false); boolean bSFlag = false;
if (pc.labelDbSyncStatus() == IN_SYNC) {
// Need to set sync flag in all messages till sync completes.
bSFlag = true;
}
PcepSrpObject srpObj = getSrpObject(pc, type, bSFlag);
//Adjacency label object //Adjacency label object
PcepLabelObject labelObject = pc.factory().buildLabelObject() PcepLabelObject labelObject = pc.factory().buildLabelObject()
@ -387,7 +391,7 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
//Pushes local labels to the device which is specific to path [CR-case]. //Pushes local labels to the device which is specific to path [CR-case].
private void pushLocalLabels(DeviceId deviceId, LabelResourceId labelId, private void pushLocalLabels(DeviceId deviceId, LabelResourceId labelId,
PortNumber portNum, TunnelId tunnelId, PortNumber portNum, TunnelId tunnelId,
Boolean isBos, Long labelType, Objective.Operation type) throws PcepParseException { Boolean isBos, Long labelType, PcepFlowType type) throws PcepParseException {
checkNotNull(deviceId); checkNotNull(deviceId);
checkNotNull(labelId); checkNotNull(labelId);
@ -559,6 +563,31 @@ public class BgpcepFlowRuleProvider extends AbstractProvider
@Override @Override
public void executeBatch(FlowRuleBatchOperation batch) { public void executeBatch(FlowRuleBatchOperation batch) {
//TODO Collection<FlowEntry> flowEntries = new ArrayList<>();
for (FlowRuleBatchEntry fbe : batch.getOperations()) {
Criterion criteria = fbe.target().selector().getCriterion(EXTENSION);
switch (fbe.operator()) {
case ADD:
if (criteria == null) {
processRule(fbe.target(), PcepFlowType.ADD);
flowEntries.add(new DefaultFlowEntry(fbe.target(), FlowEntryState.ADDED, 0, 0, 0));
}
break;
case REMOVE:
if (criteria == null) {
processRule(fbe.target(), PcepFlowType.REMOVE);
flowEntries.add(new DefaultFlowEntry(fbe.target(), FlowEntryState.REMOVED, 0, 0, 0));
}
break;
default:
log.error("Unknown flow operation: {}", fbe);
}
}
CompletedBatchOperation status = new CompletedBatchOperation(true, Collections.emptySet(), batch.deviceId());
providerService.batchOperationCompleted(batch.id(), status);
providerService.pushFlowMetrics(batch.deviceId(), flowEntries);
} }
} }

View File

@ -82,6 +82,7 @@ import org.onosproject.pcep.controller.PcepClientListener;
import org.onosproject.pcep.controller.PcepEventListener; import org.onosproject.pcep.controller.PcepEventListener;
import org.onosproject.pcep.controller.PcepLspStatus; import org.onosproject.pcep.controller.PcepLspStatus;
import org.onosproject.pcep.controller.PcepLspSyncAction; import org.onosproject.pcep.controller.PcepLspSyncAction;
import org.onosproject.pcep.controller.SrpIdGenerators;
import org.onosproject.pcepio.exceptions.PcepParseException; import org.onosproject.pcepio.exceptions.PcepParseException;
import org.onosproject.pcepio.protocol.PcInitiatedLspRequest; import org.onosproject.pcepio.protocol.PcInitiatedLspRequest;
import org.onosproject.pcepio.protocol.PcepAttribute; import org.onosproject.pcepio.protocol.PcepAttribute;
@ -131,13 +132,13 @@ import static org.onosproject.net.PortNumber.portNumber;
import static org.onosproject.pcep.api.PcepDpid.uri; import static org.onosproject.pcep.api.PcepDpid.uri;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH; import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.PCC_TUNNEL_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.DELEGATE;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.COST_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.COST_TYPE;
import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE; import static org.onosproject.provider.pcep.tunnel.impl.RequestType.CREATE;
import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE; import static org.onosproject.provider.pcep.tunnel.impl.RequestType.DELETE;
import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT; import static org.onosproject.provider.pcep.tunnel.impl.RequestType.LSP_STATE_RPT;

View File

@ -23,7 +23,7 @@ import static org.onosproject.net.DefaultAnnotations.EMPTY;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -23,7 +23,7 @@ import static org.hamcrest.Matchers.nullValue;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.SR_WITHOUT_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -19,12 +19,12 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.is;
import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS; import static org.onosproject.incubator.net.tunnel.Tunnel.Type.MPLS;
import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT; import static org.onosproject.incubator.net.tunnel.Tunnel.State.INIT;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.BANDWIDTH; import static org.onosproject.pcep.controller.PcepAnnotationKeys.BANDWIDTH;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LOCAL_LSP_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PCC_TUNNEL_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.PCC_TUNNEL_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.PLSP_ID; import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.DELEGATE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.DELEGATE;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITHOUT_SIGNALLING_AND_WITHOUT_SR;
import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED; import static org.onosproject.pcep.controller.PcepSyncStatus.SYNCED;
import static org.onosproject.net.Device.Type.ROUTER; import static org.onosproject.net.Device.Type.ROUTER;

View File

@ -20,7 +20,7 @@ import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNot.not;
import static org.onosproject.net.DefaultAnnotations.EMPTY; import static org.onosproject.net.DefaultAnnotations.EMPTY;
import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING; import static org.onosproject.provider.pcep.tunnel.impl.LspType.WITH_SIGNALLING;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -20,7 +20,9 @@ import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.core.Is.is; import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.IsNot.not;
import static org.onosproject.net.DefaultAnnotations.EMPTY; import static org.onosproject.net.DefaultAnnotations.EMPTY;
import static org.onosproject.provider.pcep.tunnel.impl.PcepAnnotationKeys.LSP_SIG_TYPE; import static org.onosproject.pcep.controller.PcepAnnotationKeys.LSP_SIG_TYPE;
import static org.onosproject.pcep.controller.PcepAnnotationKeys.LOCAL_LSP_ID;
import static org.onosproject.pcep.controller.PcepAnnotationKeys.PLSP_ID;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -112,8 +114,8 @@ public class PcepUpdateTunnelProviderTest {
path = new DefaultPath(pid, links, 20, EMPTY); path = new DefaultPath(pid, links, 20, EMPTY);
Annotations annotations = DefaultAnnotations.builder() Annotations annotations = DefaultAnnotations.builder()
.set(PcepAnnotationKeys.PLSP_ID, "1") .set(PLSP_ID, "1")
.set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") .set(LOCAL_LSP_ID, "1")
.set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) .set(LSP_SIG_TYPE, WITH_SIGNALLING.name())
.build(); .build();
@ -173,8 +175,8 @@ public class PcepUpdateTunnelProviderTest {
Annotations annotations = DefaultAnnotations.builder() Annotations annotations = DefaultAnnotations.builder()
.set(LSP_SIG_TYPE, WITH_SIGNALLING.name()) .set(LSP_SIG_TYPE, WITH_SIGNALLING.name())
.set(PcepAnnotationKeys.PLSP_ID, "1") .set(PLSP_ID, "1")
.set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") .set(LOCAL_LSP_ID, "1")
.build(); .build();
tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,
@ -233,8 +235,8 @@ public class PcepUpdateTunnelProviderTest {
Annotations annotations = DefaultAnnotations.builder() Annotations annotations = DefaultAnnotations.builder()
.set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name()) .set(LSP_SIG_TYPE, SR_WITHOUT_SIGNALLING.name())
.set(PcepAnnotationKeys.PLSP_ID, "1") .set(PLSP_ID, "1")
.set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") .set(LOCAL_LSP_ID, "1")
.build(); .build();
tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,
@ -293,8 +295,8 @@ public class PcepUpdateTunnelProviderTest {
Annotations annotations = DefaultAnnotations.builder() Annotations annotations = DefaultAnnotations.builder()
.set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name()) .set(LSP_SIG_TYPE, WITHOUT_SIGNALLING_AND_WITHOUT_SR.name())
.set(PcepAnnotationKeys.PLSP_ID, "1") .set(PLSP_ID, "1")
.set(PcepAnnotationKeys.LOCAL_LSP_ID, "1") .set(LOCAL_LSP_ID, "1")
.build(); .build();
tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS, tunnel = new DefaultTunnel(pid, ipTunnelEndPointSrc, ipTunnelEndPointDst, Tunnel.Type.MPLS,