blob: 6ade434e317015137229b9d44a0e0a2687d9a90b [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.net.pi.impl;
import org.onlab.util.ImmutableByteSequence;
import org.onosproject.net.flow.criteria.ArpHaCriterion;
import org.onosproject.net.flow.criteria.ArpOpCriterion;
import org.onosproject.net.flow.criteria.ArpPaCriterion;
import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flow.criteria.EthCriterion;
import org.onosproject.net.flow.criteria.EthTypeCriterion;
import org.onosproject.net.flow.criteria.IPCriterion;
import org.onosproject.net.flow.criteria.IPDscpCriterion;
import org.onosproject.net.flow.criteria.IPEcnCriterion;
import org.onosproject.net.flow.criteria.IPProtocolCriterion;
import org.onosproject.net.flow.criteria.IPv6ExthdrFlagsCriterion;
import org.onosproject.net.flow.criteria.IPv6FlowLabelCriterion;
import org.onosproject.net.flow.criteria.IPv6NDLinkLayerAddressCriterion;
import org.onosproject.net.flow.criteria.IPv6NDTargetAddressCriterion;
import org.onosproject.net.flow.criteria.IcmpCodeCriterion;
import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
import org.onosproject.net.flow.criteria.MetadataCriterion;
import org.onosproject.net.flow.criteria.MplsBosCriterion;
import org.onosproject.net.flow.criteria.MplsCriterion;
import org.onosproject.net.flow.criteria.MplsTcCriterion;
import org.onosproject.net.flow.criteria.PbbIsidCriterion;
import org.onosproject.net.flow.criteria.PortCriterion;
import org.onosproject.net.flow.criteria.SctpPortCriterion;
import org.onosproject.net.flow.criteria.TcpFlagsCriterion;
import org.onosproject.net.flow.criteria.TcpPortCriterion;
import org.onosproject.net.flow.criteria.TunnelIdCriterion;
import org.onosproject.net.flow.criteria.UdpPortCriterion;
import org.onosproject.net.flow.criteria.VlanIdCriterion;
import org.onosproject.net.flow.criteria.VlanPcpCriterion;
import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
import static org.onlab.util.ImmutableByteSequence.copyFrom;
/**
* Factory class of criterion translator implementations.
*/
final class CriterionTranslators {
/**
* Translator of PortCriterion.
*/
static final class PortCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
PortCriterion c = (PortCriterion) criterion;
initAsExactMatch(copyFrom(c.port().toLong()), bitWidth);
}
}
/**
* Translator of EthTypeCriterion.
*/
static final class EthTypeCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
EthTypeCriterion c = (EthTypeCriterion) criterion;
initAsExactMatch(copyFrom(c.ethType().toShort()), bitWidth);
}
}
/**
* Translator of EthCriterion.
*/
static final class EthCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
EthCriterion c = (EthCriterion) criterion;
ImmutableByteSequence value = copyFrom(c.mac().toBytes());
if (c.mask() == null) {
initAsExactMatch(value, bitWidth);
} else {
ImmutableByteSequence mask = copyFrom(c.mask().toBytes());
initAsTernaryMatch(value, mask, bitWidth);
}
}
}
/**
* Translator of IpCriterion.
*/
static final class IpCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPCriterion c = (IPCriterion) criterion;
initAsLpm(copyFrom(c.ip().address().toOctets()), c.ip().prefixLength(), bitWidth);
}
}
/**
* Translator of VlanIdCriterion.
*/
static final class VlanIdCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
VlanIdCriterion c = (VlanIdCriterion) criterion;
initAsExactMatch(copyFrom(c.vlanId().toShort()), bitWidth);
}
}
/**
* Translator of UdpPortCriterion.
*/
static final class UdpPortCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
UdpPortCriterion c = (UdpPortCriterion) criterion;
ImmutableByteSequence value = copyFrom(c.udpPort().toInt());
if (c.mask() == null) {
initAsExactMatch(value, bitWidth);
} else {
ImmutableByteSequence mask = copyFrom(c.mask().toInt());
initAsTernaryMatch(value, mask, bitWidth);
}
}
}
/**
* Translator of IPDscpCriterion.
*/
static final class IPDscpCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPDscpCriterion c = (IPDscpCriterion) criterion;
ImmutableByteSequence value = copyFrom(c.ipDscp());
initAsExactMatch(value, bitWidth);
}
}
/**
* Translator of IPProtocolCriterion.
*/
static final class IPProtocolCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPProtocolCriterion c = (IPProtocolCriterion) criterion;
initAsExactMatch(copyFrom(c.protocol()), bitWidth);
}
}
/**
* Translator of IPv6ExthdrFlagsCriterion.
*/
static final class IPv6ExthdrFlagsCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPv6ExthdrFlagsCriterion c = (IPv6ExthdrFlagsCriterion) criterion;
initAsExactMatch(copyFrom(c.exthdrFlags()), bitWidth);
}
}
/**
* Translator of IPv6FlowLabelCriterion.
*/
static final class IPv6FlowLabelCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPv6FlowLabelCriterion c = (IPv6FlowLabelCriterion) criterion;
initAsExactMatch(copyFrom(c.flowLabel()), bitWidth);
}
}
/**
* Translator of IPv6NDLinkLayerAddressCriterion.
*/
static final class IPv6NDLinkLayerAddressCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPv6NDLinkLayerAddressCriterion c = (IPv6NDLinkLayerAddressCriterion) criterion;
initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
}
}
/**
* Translator of IPv6NDTargetAddressCriterion.
*/
static final class IPv6NDTargetAddressCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPv6NDTargetAddressCriterion c = (IPv6NDTargetAddressCriterion) criterion;
initAsExactMatch(copyFrom(c.targetAddress().getIp6Address().toOctets()), bitWidth);
}
}
/**
* Translator of IcmpCodeCriterion.
*/
static final class IcmpCodeCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IcmpCodeCriterion c = (IcmpCodeCriterion) criterion;
initAsExactMatch(copyFrom(c.icmpCode()), bitWidth);
}
}
/**
* Translator of IcmpTypeCriterion.
*/
static final class IcmpTypeCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IcmpTypeCriterion c = (IcmpTypeCriterion) criterion;
initAsExactMatch(copyFrom(c.icmpType()), bitWidth);
}
}
/**
* Translator of Icmpv6CodeCriterion.
*/
static final class Icmpv6CodeCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
Icmpv6CodeCriterion c = (Icmpv6CodeCriterion) criterion;
initAsExactMatch(copyFrom(c.icmpv6Code()), bitWidth);
}
}
/**
* Translator of Icmpv6TypeCriterion.
*/
static final class Icmpv6TypeCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
Icmpv6TypeCriterion c = (Icmpv6TypeCriterion) criterion;
initAsExactMatch(copyFrom(c.icmpv6Type()), bitWidth);
}
}
/**
* Translator of MetadataCriterion.
*/
static final class MetadataCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
MetadataCriterion c = (MetadataCriterion) criterion;
initAsExactMatch(copyFrom(c.metadata()), bitWidth);
}
}
/**
* Translator of MplsBosCriterion.
*/
static final class MplsBosCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
MplsBosCriterion c = (MplsBosCriterion) criterion;
initAsExactMatch(copyFrom(c.mplsBos() ? 1 : 0), bitWidth);
}
}
/**
* Translator of MplsCriterion.
*/
static final class MplsCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
MplsCriterion c = (MplsCriterion) criterion;
initAsExactMatch(copyFrom(c.label().toInt()), bitWidth);
}
}
/**
* Translator of MplsTcCriterion.
*/
static final class MplsTcCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
MplsTcCriterion c = (MplsTcCriterion) criterion;
initAsExactMatch(copyFrom(c.tc()), bitWidth);
}
}
/**
* Translator of PbbIsidCriterion.
*/
static final class PbbIsidCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
PbbIsidCriterion c = (PbbIsidCriterion) criterion;
initAsExactMatch(copyFrom(c.pbbIsid()), bitWidth);
}
}
/**
* Translator of SctpPortCriterion.
*/
static final class SctpPortCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
SctpPortCriterion c = (SctpPortCriterion) criterion;
ImmutableByteSequence value = copyFrom(c.sctpPort().toInt());
if (c.mask() == null) {
initAsExactMatch(value, bitWidth);
} else {
ImmutableByteSequence mask = copyFrom(c.mask().toInt());
initAsTernaryMatch(value, mask, bitWidth);
}
}
}
/**
* Translator of TcpFlagsCriterion.
*/
static final class TcpFlagsCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
TcpFlagsCriterion c = (TcpFlagsCriterion) criterion;
initAsExactMatch(copyFrom(c.flags()), bitWidth);
}
}
/**
* Translator of TcpPortCriterion.
*/
static final class TcpPortCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
TcpPortCriterion c = (TcpPortCriterion) criterion;
ImmutableByteSequence value = copyFrom(c.tcpPort().toInt());
if (c.mask() == null) {
initAsExactMatch(value, bitWidth);
} else {
ImmutableByteSequence mask = copyFrom(c.mask().toInt());
initAsTernaryMatch(value, mask, bitWidth);
}
}
}
/**
* Translator of TunnelIdCriterion.
*/
static final class TunnelIdCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
TunnelIdCriterion c = (TunnelIdCriterion) criterion;
initAsExactMatch(copyFrom(c.tunnelId()), bitWidth);
}
}
/**
* Translator of VlanPcpCriterion.
*/
static final class VlanPcpCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
VlanPcpCriterion c = (VlanPcpCriterion) criterion;
initAsExactMatch(copyFrom(c.priority()), bitWidth);
}
}
/**
* Translator of ArpHaCriterion.
*/
static final class ArpHaCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
ArpHaCriterion c = (ArpHaCriterion) criterion;
initAsExactMatch(copyFrom(c.mac().toLong()), bitWidth);
}
}
/**
* Translator of ArpOpCriterion.
*/
static final class ArpOpCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
ArpOpCriterion c = (ArpOpCriterion) criterion;
initAsExactMatch(copyFrom(c.arpOp()), bitWidth);
}
}
/**
* Translator of ArpPaCriterion.
*/
static final class ArpPaCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
ArpPaCriterion c = (ArpPaCriterion) criterion;
initAsExactMatch(copyFrom(c.ip().toInt()), bitWidth);
}
}
/**
* Translator of IPEcnCriterion.
*/
static final class IPEcnCriterionTranslator extends AbstractCriterionTranslator {
@Override
public void init(Criterion criterion, int bitWidth) throws ByteSequenceTrimException {
IPEcnCriterion c = (IPEcnCriterion) criterion;
initAsExactMatch(copyFrom(c.ipEcn()), bitWidth);
}
}
}