From d9e47c680fea8cc07e4bf1ca6538c6c9b4a90e9d Mon Sep 17 00:00:00 2001 From: Charles Chan Date: Thu, 5 Oct 2017 15:17:15 -0700 Subject: [PATCH] Replace L4 dst port matching on QMX switches Change-Id: I51c299bec8de3851a0f44cd4a8904013134f2da4 --- .../driver/pipeline/ofdpa/Ofdpa2Pipeline.java | 53 ++++++++++++++++++- .../pipeline/ofdpa/Ofdpa3QmxPipeline.java | 5 ++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java index b18081cd0a..b123accd67 100644 --- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java +++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa2Pipeline.java @@ -21,6 +21,7 @@ import org.onlab.osgi.ServiceDirectory; import org.onlab.packet.Ethernet; import org.onlab.packet.IpAddress; import org.onlab.packet.IpPrefix; +import org.onlab.packet.TpPort; import org.onlab.packet.VlanId; import org.onlab.util.KryoNamespace; import org.onosproject.core.ApplicationId; @@ -57,6 +58,8 @@ import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion; import org.onosproject.net.flow.criteria.MplsBosCriterion; import org.onosproject.net.flow.criteria.MplsCriterion; import org.onosproject.net.flow.criteria.PortCriterion; +import org.onosproject.net.flow.criteria.TcpPortCriterion; +import org.onosproject.net.flow.criteria.UdpPortCriterion; import org.onosproject.net.flow.criteria.VlanIdCriterion; import org.onosproject.net.flow.instructions.Instruction; import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; @@ -93,6 +96,7 @@ import static org.onlab.packet.MacAddress.BROADCAST; import static org.onlab.packet.MacAddress.NONE; import static org.onlab.util.Tools.groupedThreads; import static org.onosproject.driver.pipeline.ofdpa.OfdpaGroupHandlerUtility.*; +import static org.onosproject.net.flow.criteria.Criterion.Type.ETH_TYPE; import static org.slf4j.LoggerFactory.getLogger; import static org.onosproject.net.flow.criteria.Criterion.Type.MPLS_BOS; import static org.onosproject.net.flowobjective.NextObjective.Type.HASHED; @@ -209,6 +213,15 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline return true; } + /** + * Determines whether matching L4 destination port on IPv6 packets is supported in ACL table. + * + * @return true if matching L4 destination port on IPv6 packets is supported in ACL table. + */ + protected boolean supportIpv6L4Dst() { + return true; + } + ////////////////////////////////////// // Flow Objectives ////////////////////////////////////// @@ -953,6 +966,37 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline * the ACL table. */ log.warn("ICMPv6 Type and ICMPv6 Code are not supported"); + } else if (criterion instanceof TcpPortCriterion || criterion instanceof UdpPortCriterion) { + // FIXME: QMX switches do not support L4 dst port matching in ACL table. + // Currently L4 dst port matching is only used by DHCP relay feature + // and therefore is safe to be replaced with L4 src port matching. + // We need to revisit this if L4 dst port is used for other purpose in the future. + if (!supportIpv6L4Dst() && isIpv6(fwd.selector())) { + TpPort tpPort = (criterion instanceof TcpPortCriterion) ? + ((TcpPortCriterion) criterion).tcpPort() : + ((UdpPortCriterion) criterion).udpPort(); + TpPort tpMask = (criterion instanceof TcpPortCriterion) ? + ((TcpPortCriterion) criterion).mask() : + ((UdpPortCriterion) criterion).mask(); + switch (criterion.type()) { + case UDP_DST: + sbuilder.matchUdpSrc(tpPort); + break; + case UDP_DST_MASKED: + sbuilder.matchUdpSrcMasked(tpPort, tpMask); + break; + case TCP_DST: + sbuilder.matchTcpSrc(tpPort); + break; + case TCP_DST_MASKED: + sbuilder.matchTcpSrcMasked(tpPort, tpMask); + break; + default: + sbuilder.add(criterion); + } + } else { + sbuilder.add(criterion); + } } else { sbuilder.add(criterion); } @@ -1535,7 +1579,12 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline return bosCriterion != null && !bosCriterion.mplsBos(); } - protected static VlanId readVlanFromSelector(TrafficSelector selector) { + private static boolean isIpv6(TrafficSelector selector) { + EthTypeCriterion ethTypeCriterion = (EthTypeCriterion) selector.getCriterion(ETH_TYPE); + return ethTypeCriterion != null && ethTypeCriterion.ethType().toShort() == Ethernet.TYPE_IPV6; + } + + static VlanId readVlanFromSelector(TrafficSelector selector) { if (selector == null) { return null; } @@ -1544,7 +1593,7 @@ public class Ofdpa2Pipeline extends AbstractHandlerBehaviour implements Pipeline ? null : ((VlanIdCriterion) criterion).vlanId(); } - protected static IpPrefix readIpDstFromSelector(TrafficSelector selector) { + static IpPrefix readIpDstFromSelector(TrafficSelector selector) { if (selector == null) { return null; } diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3QmxPipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3QmxPipeline.java index 4c6664b58d..d989217c51 100644 --- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3QmxPipeline.java +++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3QmxPipeline.java @@ -36,4 +36,9 @@ public class Ofdpa3QmxPipeline extends Ofdpa3Pipeline { protected boolean matchInPortTmacTable() { return false; } + + @Override + protected boolean supportIpv6L4Dst() { + return false; + } }