mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-17 02:11:38 +02:00
Match VLAN_VID in TMAC table for mcast flows
Matching VLAN_VID in TMAC table is mandatory on QMX switches XGS switches support optional VLAN_VID matching so this patch is effective for both platforms In addition, - Take native vlan into account when assigning VLAN for untagged multicast traffic - Fix a bug that puts wrong eth_type in TMAC table Change-Id: I19caf2d6d69096a96b75cb528b6ed37b28d7d988
This commit is contained in:
parent
525ff40850
commit
b4879a558c
@ -774,7 +774,7 @@ public class McastHandler {
|
|||||||
}
|
}
|
||||||
// Reuse unicast VLAN if the port has subnet configured
|
// Reuse unicast VLAN if the port has subnet configured
|
||||||
if (cp != null) {
|
if (cp != null) {
|
||||||
VlanId untaggedVlan = srManager.getUntaggedVlanId(cp);
|
VlanId untaggedVlan = srManager.getInternalVlanId(cp);
|
||||||
return (untaggedVlan != null) ? untaggedVlan : INTERNAL_VLAN;
|
return (untaggedVlan != null) ? untaggedVlan : INTERNAL_VLAN;
|
||||||
}
|
}
|
||||||
// Use DEFAULT_VLAN if none of the above matches
|
// Use DEFAULT_VLAN if none of the above matches
|
||||||
|
@ -326,7 +326,7 @@ public class CpqdOfdpa2Pipeline extends Ofdpa2Pipeline {
|
|||||||
|
|
||||||
// Multicast MAC
|
// Multicast MAC
|
||||||
if (ethCriterion.mask() != null) {
|
if (ethCriterion.mask() != null) {
|
||||||
return processMcastEthDstFilter(ethCriterion, applicationId);
|
return processMcastEthDstFilter(ethCriterion, assignedVlan, applicationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
//handling untagged packets via assigned VLAN
|
//handling untagged packets via assigned VLAN
|
||||||
|
@ -98,7 +98,7 @@ public class CpqdOfdpa2VlanPipeline extends CpqdOfdpa2Pipeline {
|
|||||||
|
|
||||||
// Multicast MAC
|
// Multicast MAC
|
||||||
if (ethCriterion.mask() != null) {
|
if (ethCriterion.mask() != null) {
|
||||||
return processMcastEthDstFilter(ethCriterion, applicationId);
|
return processMcastEthDstFilter(ethCriterion, assignedVlan, applicationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
//handling untagged packets via assigned VLAN
|
//handling untagged packets via assigned VLAN
|
||||||
|
@ -93,6 +93,8 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
import static java.util.concurrent.Executors.newScheduledThreadPool;
|
import static java.util.concurrent.Executors.newScheduledThreadPool;
|
||||||
import static org.onlab.packet.MacAddress.BROADCAST;
|
import static org.onlab.packet.MacAddress.BROADCAST;
|
||||||
|
import static org.onlab.packet.MacAddress.IPV4_MULTICAST;
|
||||||
|
import static org.onlab.packet.MacAddress.IPV6_MULTICAST;
|
||||||
import static org.onlab.packet.MacAddress.NONE;
|
import static org.onlab.packet.MacAddress.NONE;
|
||||||
import static org.onlab.util.Tools.groupedThreads;
|
import static org.onlab.util.Tools.groupedThreads;
|
||||||
import static org.onosproject.driver.pipeline.ofdpa.OfdpaGroupHandlerUtility.*;
|
import static org.onosproject.driver.pipeline.ofdpa.OfdpaGroupHandlerUtility.*;
|
||||||
@ -637,7 +639,7 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline
|
|||||||
|
|
||||||
// Multicast MAC
|
// Multicast MAC
|
||||||
if (ethCriterion.mask() != null) {
|
if (ethCriterion.mask() != null) {
|
||||||
return processMcastEthDstFilter(ethCriterion, applicationId);
|
return processMcastEthDstFilter(ethCriterion, assignedVlan, applicationId);
|
||||||
}
|
}
|
||||||
|
|
||||||
//handling untagged packets via assigned VLAN
|
//handling untagged packets via assigned VLAN
|
||||||
@ -870,37 +872,47 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected List<FlowRule> processMcastEthDstFilter(EthCriterion ethCriterion,
|
protected List<FlowRule> processMcastEthDstFilter(EthCriterion ethCriterion,
|
||||||
|
VlanId assignedVlan,
|
||||||
ApplicationId applicationId) {
|
ApplicationId applicationId) {
|
||||||
ImmutableList.Builder<FlowRule> builder = ImmutableList.builder();
|
ImmutableList.Builder<FlowRule> builder = ImmutableList.builder();
|
||||||
TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
|
TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
|
||||||
TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
|
TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
|
||||||
selector.matchEthType(Ethernet.TYPE_IPV4);
|
FlowRule rule;
|
||||||
selector.matchEthDstMasked(ethCriterion.mac(), ethCriterion.mask());
|
|
||||||
treatment.transition(MULTICAST_ROUTING_TABLE);
|
|
||||||
FlowRule rule = DefaultFlowRule.builder()
|
|
||||||
.forDevice(deviceId)
|
|
||||||
.withSelector(selector.build())
|
|
||||||
.withTreatment(treatment.build())
|
|
||||||
.withPriority(DEFAULT_PRIORITY)
|
|
||||||
.fromApp(applicationId)
|
|
||||||
.makePermanent()
|
|
||||||
.forTable(TMAC_TABLE).build();
|
|
||||||
builder.add(rule);
|
|
||||||
|
|
||||||
selector = DefaultTrafficSelector.builder();
|
if (IPV4_MULTICAST.equals(ethCriterion.mac())) {
|
||||||
treatment = DefaultTrafficTreatment.builder();
|
selector.matchEthType(Ethernet.TYPE_IPV4);
|
||||||
selector.matchEthType(Ethernet.TYPE_IPV6);
|
selector.matchEthDstMasked(ethCriterion.mac(), ethCriterion.mask());
|
||||||
selector.matchEthDstMasked(ethCriterion.mac(), ethCriterion.mask());
|
selector.matchVlanId(assignedVlan);
|
||||||
treatment.transition(MULTICAST_ROUTING_TABLE);
|
treatment.transition(MULTICAST_ROUTING_TABLE);
|
||||||
rule = DefaultFlowRule.builder()
|
rule = DefaultFlowRule.builder()
|
||||||
.forDevice(deviceId)
|
.forDevice(deviceId)
|
||||||
.withSelector(selector.build())
|
.withSelector(selector.build())
|
||||||
.withTreatment(treatment.build())
|
.withTreatment(treatment.build())
|
||||||
.withPriority(DEFAULT_PRIORITY)
|
.withPriority(DEFAULT_PRIORITY)
|
||||||
.fromApp(applicationId)
|
.fromApp(applicationId)
|
||||||
.makePermanent()
|
.makePermanent()
|
||||||
.forTable(TMAC_TABLE).build();
|
.forTable(TMAC_TABLE).build();
|
||||||
return builder.add(rule).build();
|
builder.add(rule);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IPV6_MULTICAST.equals(ethCriterion.mac())) {
|
||||||
|
selector = DefaultTrafficSelector.builder();
|
||||||
|
treatment = DefaultTrafficTreatment.builder();
|
||||||
|
selector.matchEthType(Ethernet.TYPE_IPV6);
|
||||||
|
selector.matchEthDstMasked(ethCriterion.mac(), ethCriterion.mask());
|
||||||
|
selector.matchVlanId(assignedVlan);
|
||||||
|
treatment.transition(MULTICAST_ROUTING_TABLE);
|
||||||
|
rule = DefaultFlowRule.builder()
|
||||||
|
.forDevice(deviceId)
|
||||||
|
.withSelector(selector.build())
|
||||||
|
.withTreatment(treatment.build())
|
||||||
|
.withPriority(DEFAULT_PRIORITY)
|
||||||
|
.fromApp(applicationId)
|
||||||
|
.makePermanent()
|
||||||
|
.forTable(TMAC_TABLE).build();
|
||||||
|
builder.add(rule);
|
||||||
|
}
|
||||||
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection<FlowRule> processForward(ForwardingObjective fwd) {
|
private Collection<FlowRule> processForward(ForwardingObjective fwd) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user