diff options
Diffstat (limited to 'framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/DecodeCriterionCodecHelper.java')
-rw-r--r-- | framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/DecodeCriterionCodecHelper.java | 449 |
1 files changed, 449 insertions, 0 deletions
diff --git a/framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/DecodeCriterionCodecHelper.java b/framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/DecodeCriterionCodecHelper.java new file mode 100644 index 00000000..4e0f2bd9 --- /dev/null +++ b/framework/src/onos/core/common/src/main/java/org/onosproject/codec/impl/DecodeCriterionCodecHelper.java @@ -0,0 +1,449 @@ +/* + * Copyright 2015 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.codec.impl; + +import java.util.HashMap; +import java.util.Map; + +import org.onlab.packet.Ip6Address; +import org.onlab.packet.IpPrefix; +import org.onlab.packet.MacAddress; +import org.onlab.packet.MplsLabel; +import org.onlab.packet.TpPort; +import org.onlab.packet.VlanId; +import org.onosproject.net.ChannelSpacing; +import org.onosproject.net.GridType; +import org.onosproject.net.Lambda; +import org.onosproject.net.PortNumber; +import org.onosproject.net.flow.criteria.Criteria; +import org.onosproject.net.flow.criteria.Criterion; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import static org.onlab.util.Tools.nullIsIllegal; + +/** + * Decode portion of the criterion codec. + */ +public final class DecodeCriterionCodecHelper { + + private final ObjectNode json; + + protected static final String MISSING_MEMBER_MESSAGE = + " member is required in Criterion"; + + private interface CriterionDecoder { + Criterion decodeCriterion(ObjectNode json); + } + private final Map<String, CriterionDecoder> decoderMap; + + /** + * Creates a decode criterion codec object. + * Initializes the lookup map for criterion subclass decoders. + * + * @param json JSON object to decode + */ + public DecodeCriterionCodecHelper(ObjectNode json) { + this.json = json; + decoderMap = new HashMap<>(); + + decoderMap.put(Criterion.Type.IN_PORT.name(), new InPortDecoder()); + decoderMap.put(Criterion.Type.IN_PHY_PORT.name(), new InPhyPortDecoder()); + decoderMap.put(Criterion.Type.METADATA.name(), new MetadataDecoder()); + decoderMap.put(Criterion.Type.ETH_DST.name(), new EthDstDecoder()); + decoderMap.put(Criterion.Type.ETH_SRC.name(), new EthSrcDecoder()); + decoderMap.put(Criterion.Type.ETH_TYPE.name(), new EthTypeDecoder()); + decoderMap.put(Criterion.Type.VLAN_VID.name(), new VlanVidDecoder()); + decoderMap.put(Criterion.Type.VLAN_PCP.name(), new VlanPcpDecoder()); + decoderMap.put(Criterion.Type.IP_DSCP.name(), new IpDscpDecoder()); + decoderMap.put(Criterion.Type.IP_ECN.name(), new IpEcnDecoder()); + decoderMap.put(Criterion.Type.IP_PROTO.name(), new IpProtoDecoder()); + decoderMap.put(Criterion.Type.IPV4_SRC.name(), new IpV4SrcDecoder()); + decoderMap.put(Criterion.Type.IPV4_DST.name(), new IpV4DstDecoder()); + decoderMap.put(Criterion.Type.TCP_SRC.name(), new TcpSrcDecoder()); + decoderMap.put(Criterion.Type.TCP_DST.name(), new TcpDstDecoder()); + decoderMap.put(Criterion.Type.UDP_SRC.name(), new UdpSrcDecoder()); + decoderMap.put(Criterion.Type.UDP_DST.name(), new UdpDstDecoder()); + decoderMap.put(Criterion.Type.SCTP_SRC.name(), new SctpSrcDecoder()); + decoderMap.put(Criterion.Type.SCTP_DST.name(), new SctpDstDecoder()); + decoderMap.put(Criterion.Type.ICMPV4_TYPE.name(), new IcmpV4TypeDecoder()); + decoderMap.put(Criterion.Type.ICMPV4_CODE.name(), new IcmpV4CodeDecoder()); + decoderMap.put(Criterion.Type.IPV6_SRC.name(), new IpV6SrcDecoder()); + decoderMap.put(Criterion.Type.IPV6_DST.name(), new IpV6DstDecoder()); + decoderMap.put(Criterion.Type.IPV6_FLABEL.name(), new IpV6FLabelDecoder()); + decoderMap.put(Criterion.Type.ICMPV6_TYPE.name(), new IcmpV6TypeDecoder()); + decoderMap.put(Criterion.Type.ICMPV6_CODE.name(), new IcmpV6CodeDecoder()); + decoderMap.put(Criterion.Type.IPV6_ND_TARGET.name(), new V6NDTargetDecoder()); + decoderMap.put(Criterion.Type.IPV6_ND_SLL.name(), new V6NDSllDecoder()); + decoderMap.put(Criterion.Type.IPV6_ND_TLL.name(), new V6NDTllDecoder()); + decoderMap.put(Criterion.Type.MPLS_LABEL.name(), new MplsLabelDecoder()); + decoderMap.put(Criterion.Type.IPV6_EXTHDR.name(), new IpV6ExthdrDecoder()); + decoderMap.put(Criterion.Type.OCH_SIGID.name(), new OchSigIdDecoder()); + decoderMap.put(Criterion.Type.OCH_SIGTYPE.name(), new OchSigTypeDecoder()); + decoderMap.put(Criterion.Type.TUNNEL_ID.name(), new TunnelIdDecoder()); + } + + private class EthTypeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + int ethType = nullIsIllegal(json.get(CriterionCodec.ETH_TYPE), + CriterionCodec.ETH_TYPE + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchEthType(ethType); + } + } + + private class EthDstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC), + CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText()); + + return Criteria.matchEthDst(mac); + } + } + + private class EthSrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC), + CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText()); + + return Criteria.matchEthSrc(mac); + } + } + + private class InPortDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + PortNumber port = PortNumber.portNumber(nullIsIllegal(json.get(CriterionCodec.PORT), + CriterionCodec.PORT + MISSING_MEMBER_MESSAGE).asLong()); + + return Criteria.matchInPort(port); + } + } + + private class InPhyPortDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + PortNumber port = PortNumber.portNumber(nullIsIllegal(json.get(CriterionCodec.PORT), + CriterionCodec.PORT + MISSING_MEMBER_MESSAGE).asLong()); + + return Criteria.matchInPhyPort(port); + } + } + + private class MetadataDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + long metadata = nullIsIllegal(json.get(CriterionCodec.METADATA), + CriterionCodec.METADATA + MISSING_MEMBER_MESSAGE).asLong(); + + return Criteria.matchMetadata(metadata); + } + } + + private class VlanVidDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short vlanId = (short) nullIsIllegal(json.get(CriterionCodec.VLAN_ID), + CriterionCodec.VLAN_ID + MISSING_MEMBER_MESSAGE).asInt(); + + return Criteria.matchVlanId(VlanId.vlanId(vlanId)); + } + } + + private class VlanPcpDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + byte priority = (byte) nullIsIllegal(json.get(CriterionCodec.PRIORITY), + CriterionCodec.VLAN_ID + MISSING_MEMBER_MESSAGE).asInt(); + + return Criteria.matchVlanPcp(priority); + } + } + + private class IpDscpDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + byte ipDscp = (byte) nullIsIllegal(json.get(CriterionCodec.IP_DSCP), + CriterionCodec.IP_DSCP + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIPDscp(ipDscp); + } + } + + private class IpEcnDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + byte ipEcn = (byte) nullIsIllegal(json.get(CriterionCodec.IP_ECN), + CriterionCodec.IP_ECN + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIPEcn(ipEcn); + } + } + + private class IpProtoDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short proto = (short) nullIsIllegal(json.get(CriterionCodec.PROTOCOL), + CriterionCodec.PROTOCOL + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIPProtocol(proto); + } + } + + private class IpV4SrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + String ip = nullIsIllegal(json.get(CriterionCodec.IP), + CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText(); + return Criteria.matchIPSrc(IpPrefix.valueOf(ip)); + } + } + + private class IpV4DstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + String ip = nullIsIllegal(json.get(CriterionCodec.IP), + CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText(); + return Criteria.matchIPDst(IpPrefix.valueOf(ip)); + } + } + + private class IpV6SrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + String ip = nullIsIllegal(json.get(CriterionCodec.IP), + CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText(); + return Criteria.matchIPv6Src(IpPrefix.valueOf(ip)); + } + } + + private class IpV6DstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + String ip = nullIsIllegal(json.get(CriterionCodec.IP), + CriterionCodec.IP + MISSING_MEMBER_MESSAGE).asText(); + return Criteria.matchIPv6Dst(IpPrefix.valueOf(ip)); + } + } + + private class TcpSrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT), + CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchTcpSrc(tcpPort); + } + } + + private class TcpDstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort tcpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.TCP_PORT), + CriterionCodec.TCP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchTcpDst(tcpPort); + } + } + + private class UdpSrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT), + CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchUdpSrc(udpPort); + } + } + + private class UdpDstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort udpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.UDP_PORT), + CriterionCodec.UDP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchUdpDst(udpPort); + } + } + + private class SctpSrcDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT), + CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchSctpSrc(sctpPort); + } + } + + private class SctpDstDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + TpPort sctpPort = TpPort.tpPort(nullIsIllegal(json.get(CriterionCodec.SCTP_PORT), + CriterionCodec.SCTP_PORT + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchSctpDst(sctpPort); + } + } + + private class IcmpV4TypeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short type = (short) nullIsIllegal(json.get(CriterionCodec.ICMP_TYPE), + CriterionCodec.ICMP_TYPE + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIcmpType(type); + } + } + + private class IcmpV4CodeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short code = (short) nullIsIllegal(json.get(CriterionCodec.ICMP_CODE), + CriterionCodec.ICMP_CODE + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIcmpCode(code); + } + } + + private class IpV6FLabelDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + int flowLabel = nullIsIllegal(json.get(CriterionCodec.FLOW_LABEL), + CriterionCodec.FLOW_LABEL + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIPv6FlowLabel(flowLabel); + } + } + + private class IcmpV6TypeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short type = (short) nullIsIllegal(json.get(CriterionCodec.ICMPV6_TYPE), + CriterionCodec.ICMPV6_TYPE + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIcmpv6Type(type); + } + } + + private class IcmpV6CodeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + short code = (short) nullIsIllegal(json.get(CriterionCodec.ICMPV6_CODE), + CriterionCodec.ICMPV6_CODE + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIcmpv6Code(code); + } + } + + private class V6NDTargetDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + Ip6Address target = Ip6Address.valueOf(nullIsIllegal(json.get(CriterionCodec.TARGET_ADDRESS), + CriterionCodec.TARGET_ADDRESS + MISSING_MEMBER_MESSAGE).asText()); + return Criteria.matchIPv6NDTargetAddress(target); + } + } + + private class V6NDSllDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC), + CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText()); + return Criteria.matchIPv6NDSourceLinkLayerAddress(mac); + } + } + + private class V6NDTllDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + MacAddress mac = MacAddress.valueOf(nullIsIllegal(json.get(CriterionCodec.MAC), + CriterionCodec.MAC + MISSING_MEMBER_MESSAGE).asText()); + return Criteria.matchIPv6NDTargetLinkLayerAddress(mac); + } + } + + private class MplsLabelDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + int label = nullIsIllegal(json.get(CriterionCodec.LABEL), + CriterionCodec.LABEL + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchMplsLabel(MplsLabel.mplsLabel(label)); + } + } + + private class IpV6ExthdrDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + int exthdrFlags = nullIsIllegal(json.get(CriterionCodec.EXT_HDR_FLAGS), + CriterionCodec.EXT_HDR_FLAGS + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchIPv6ExthdrFlags(exthdrFlags); + } + } + + private class OchSigIdDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + if (json.get(CriterionCodec.LAMBDA) != null) { + Lambda lambda = Lambda.indexedLambda(nullIsIllegal(json.get(CriterionCodec.LAMBDA), + CriterionCodec.LAMBDA + MISSING_MEMBER_MESSAGE).asInt()); + return Criteria.matchLambda(lambda); + } else { + JsonNode ochSignalId = nullIsIllegal(json.get(CriterionCodec.OCH_SIGNAL_ID), + CriterionCodec.GRID_TYPE + MISSING_MEMBER_MESSAGE); + GridType gridType = + GridType.valueOf( + nullIsIllegal(ochSignalId.get(CriterionCodec.GRID_TYPE), + CriterionCodec.GRID_TYPE + MISSING_MEMBER_MESSAGE).asText()); + ChannelSpacing channelSpacing = + ChannelSpacing.valueOf( + nullIsIllegal(ochSignalId.get(CriterionCodec.CHANNEL_SPACING), + CriterionCodec.CHANNEL_SPACING + MISSING_MEMBER_MESSAGE).asText()); + int spacingMultiplier = nullIsIllegal(ochSignalId.get(CriterionCodec.SPACING_MULIPLIER), + CriterionCodec.SPACING_MULIPLIER + MISSING_MEMBER_MESSAGE).asInt(); + int slotGranularity = nullIsIllegal(ochSignalId.get(CriterionCodec.SLOT_GRANULARITY), + CriterionCodec.SLOT_GRANULARITY + MISSING_MEMBER_MESSAGE).asInt(); + return Criteria.matchLambda( + Lambda.ochSignal(gridType, channelSpacing, + spacingMultiplier, slotGranularity)); + } + } + } + + private class OchSigTypeDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + return null; + } + } + + private class TunnelIdDecoder implements CriterionDecoder { + @Override + public Criterion decodeCriterion(ObjectNode json) { + long tunnelId = nullIsIllegal(json.get(CriterionCodec.TUNNEL_ID), + CriterionCodec.TUNNEL_ID + MISSING_MEMBER_MESSAGE).asLong(); + return Criteria.matchTunnelId(tunnelId); + } + } + + /** + * Decodes the JSON into a criterion object. + * + * @return Criterion object + * @throws IllegalArgumentException if the JSON is invalid + */ + public Criterion decode() { + String type = json.get(CriterionCodec.TYPE).asText(); + + CriterionDecoder decoder = decoderMap.get(type); + if (decoder != null) { + return decoder.decodeCriterion(json); + } + + throw new IllegalArgumentException("Type " + type + " is unknown"); + } + + +} |