Search in sources :

Example 6 with PathIntent

use of org.onosproject.net.intent.PathIntent in project onos by opennetworkinglab.

the class PathCompiler method manageMplsEncap.

/**
 * Creates the flow rules for the path intent using MPLS
 * encapsulation.
 *
 * @param creator the flowrules creator
 * @param flows the list of flows to fill
 * @param devices the devices on the path
 * @param intent the PathIntent to compile
 */
private void manageMplsEncap(PathCompilerCreateFlow<T> creator, List<T> flows, List<DeviceId> devices, PathIntent intent) {
    Set<Link> linksSet = Sets.newConcurrentHashSet();
    for (int i = 1; i <= intent.path().links().size() - 2; i++) {
        linksSet.add(intent.path().links().get(i));
    }
    Map<LinkKey, Identifier<?>> mplsLabels = labelAllocator.assignLabelToLinks(linksSet, intent.key(), EncapsulationType.MPLS);
    Iterator<Link> links = intent.path().links().iterator();
    Link srcLink = links.next();
    Link link = links.next();
    // List of flow rules to be installed
    // Ingress traffic
    MplsLabel mplsLabel = (MplsLabel) mplsLabels.get(linkKey(link));
    if (mplsLabel == null) {
        throw new IntentCompilationException(ERROR_MPLS + link);
    }
    MplsLabel prevMplsLabel = mplsLabel;
    Optional<MplsCriterion> mplsCriterion = intent.selector().criteria().stream().filter(criterion -> criterion.type() == Criterion.Type.MPLS_LABEL).map(criterion -> (MplsCriterion) criterion).findAny();
    // Push MPLS if selector does not include MPLS
    TrafficTreatment.Builder treatBuilder = DefaultTrafficTreatment.builder();
    if (!mplsCriterion.isPresent()) {
        treatBuilder.pushMpls();
    }
    // Tag the traffic with the new encapsulation MPLS label
    treatBuilder.setMpls(mplsLabel);
    creator.createFlow(intent.selector(), treatBuilder.build(), srcLink.dst(), link.src(), intent.priority(), true, flows, devices);
    ConnectPoint prev = link.dst();
    while (links.hasNext()) {
        link = links.next();
        if (links.hasNext()) {
            // Transit traffic
            MplsLabel transitMplsLabel = (MplsLabel) mplsLabels.get(linkKey(link));
            if (transitMplsLabel == null) {
                throw new IntentCompilationException(ERROR_MPLS + link);
            }
            TrafficSelector transitSelector = DefaultTrafficSelector.builder().matchInPort(prev.port()).matchEthType(Ethernet.MPLS_UNICAST).matchMplsLabel(prevMplsLabel).build();
            TrafficTreatment.Builder transitTreat = DefaultTrafficTreatment.builder();
            // Set the new MPLS label only if the previous one is different
            if (!prevMplsLabel.equals(transitMplsLabel)) {
                transitTreat.setMpls(transitMplsLabel);
            }
            creator.createFlow(transitSelector, transitTreat.build(), prev, link.src(), intent.priority(), true, flows, devices);
            prevMplsLabel = transitMplsLabel;
            prev = link.dst();
        } else {
            TrafficSelector.Builder egressSelector = DefaultTrafficSelector.builder().matchInPort(prev.port()).matchEthType(Ethernet.MPLS_UNICAST).matchMplsLabel(prevMplsLabel);
            TrafficTreatment.Builder egressTreat = DefaultTrafficTreatment.builder(intent.treatment());
            // than selector needs to match any VlanId
            for (Instruction instruct : intent.treatment().allInstructions()) {
                if (instruct instanceof L2ModificationInstruction) {
                    L2ModificationInstruction l2Mod = (L2ModificationInstruction) instruct;
                    if (l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_PUSH) {
                        break;
                    }
                    if (l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_POP || l2Mod.subtype() == L2ModificationInstruction.L2SubType.VLAN_ID) {
                        egressSelector.matchVlanId(VlanId.ANY);
                    }
                }
            }
            if (mplsCriterion.isPresent()) {
                egressTreat.setMpls(mplsCriterion.get().label());
            } else {
                egressTreat.popMpls(getEthType(intent.selector()));
            }
            creator.createFlow(egressSelector.build(), egressTreat.build(), prev, link.src(), intent.priority(), true, flows, devices);
        }
    }
}
Also used : MplsCriterion(org.onosproject.net.flow.criteria.MplsCriterion) Identifier(org.onlab.util.Identifier) LabelAllocator(org.onosproject.net.resource.impl.LabelAllocator) IntentCompilationException(org.onosproject.net.intent.IntentCompilationException) Link(org.onosproject.net.Link) ResourceService(org.onosproject.net.resource.ResourceService) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) ConnectPoint(org.onosproject.net.ConnectPoint) EncapsulationConstraint(org.onosproject.net.intent.constraint.EncapsulationConstraint) Ethernet(org.onlab.packet.Ethernet) TrafficSelector(org.onosproject.net.flow.TrafficSelector) Map(java.util.Map) L2ModificationInstruction(org.onosproject.net.flow.instructions.L2ModificationInstruction) LinkKey.linkKey(org.onosproject.net.LinkKey.linkKey) DefaultTrafficSelector(org.onosproject.net.flow.DefaultTrafficSelector) Criterion(org.onosproject.net.flow.criteria.Criterion) LinkKey(org.onosproject.net.LinkKey) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) PathIntent(org.onosproject.net.intent.PathIntent) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) MplsLabel(org.onlab.packet.MplsLabel) EthTypeCriterion(org.onosproject.net.flow.criteria.EthTypeCriterion) Instruction(org.onosproject.net.flow.instructions.Instruction) VlanId(org.onlab.packet.VlanId) Set(java.util.Set) Sets(com.google.common.collect.Sets) EthType(org.onlab.packet.EthType) List(java.util.List) EncapsulationType(org.onosproject.net.EncapsulationType) VlanIdCriterion(org.onosproject.net.flow.criteria.VlanIdCriterion) Optional(java.util.Optional) DeviceId(org.onosproject.net.DeviceId) LinkKey(org.onosproject.net.LinkKey) L2ModificationInstruction(org.onosproject.net.flow.instructions.L2ModificationInstruction) DefaultTrafficTreatment(org.onosproject.net.flow.DefaultTrafficTreatment) TrafficTreatment(org.onosproject.net.flow.TrafficTreatment) L2ModificationInstruction(org.onosproject.net.flow.instructions.L2ModificationInstruction) Instruction(org.onosproject.net.flow.instructions.Instruction) ConnectPoint(org.onosproject.net.ConnectPoint) ConnectPoint(org.onosproject.net.ConnectPoint) EncapsulationConstraint(org.onosproject.net.intent.constraint.EncapsulationConstraint) Identifier(org.onlab.util.Identifier) MplsLabel(org.onlab.packet.MplsLabel) MplsCriterion(org.onosproject.net.flow.criteria.MplsCriterion) TrafficSelector(org.onosproject.net.flow.TrafficSelector) DefaultTrafficSelector(org.onosproject.net.flow.DefaultTrafficSelector) IntentCompilationException(org.onosproject.net.intent.IntentCompilationException) Link(org.onosproject.net.Link)

Aggregations

PathIntent (org.onosproject.net.intent.PathIntent)6 List (java.util.List)5 Set (java.util.Set)5 Link (org.onosproject.net.Link)5 Sets (com.google.common.collect.Sets)4 Map (java.util.Map)4 ConnectPoint (org.onosproject.net.ConnectPoint)4 DeviceId (org.onosproject.net.DeviceId)4 Logger (org.slf4j.Logger)4 Iterator (java.util.Iterator)3 Optional (java.util.Optional)3 EthType (org.onlab.packet.EthType)3 Ethernet (org.onlab.packet.Ethernet)3 MplsLabel (org.onlab.packet.MplsLabel)3 VlanId (org.onlab.packet.VlanId)3 Identifier (org.onlab.util.Identifier)3 EncapsulationType (org.onosproject.net.EncapsulationType)3 LinkKey (org.onosproject.net.LinkKey)3 TrafficSelector (org.onosproject.net.flow.TrafficSelector)3 Criterion (org.onosproject.net.flow.criteria.Criterion)3