diff options
Diffstat (limited to 'acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java')
-rw-r--r-- | acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java new file mode 100644 index 000000000..767baef3d --- /dev/null +++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * + * 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 io.fd.hc2vpp.acl.util.protocol; + +import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.ICMPV6_INDEX; +import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.ICMP_INDEX; +import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.TCP_INDEX; +import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.UDP_INDEX; + +import io.fd.vpp.jvpp.acl.types.AclRule; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpCodeRange; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpCodeRangeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpTypeRange; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.icmp.header.fields.IcmpTypeRangeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.IpProtocol; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.Icmp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.IcmpBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.IcmpV6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.IcmpV6Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.OtherBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.Tcp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.TcpBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.Udp; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.UdpBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.icmp.v6.IcmpV6NodesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder; + +/** + * Utility for parsing IpProtocol DO based on data returned by vpp as {@link AclRule}. + */ +public interface IpProtocolReader { + + default IpProtocol parseProtocol(final AclRule rule) { + switch (rule.proto) { + case ICMP_INDEX: { + return Impl.parseIcmp(rule); + } + + case TCP_INDEX: { + return Impl.parseTcp(rule); + } + + case UDP_INDEX: { + return Impl.parseUdp(rule); + } + + case ICMPV6_INDEX: { + return Impl.parseIcmp6(rule); + } + default: { + return Impl.parse(rule); + } + } + } + + class Impl { + + private static IcmpCodeRange parseIcmpCodeRange(final AclRule rule) { + return new IcmpCodeRangeBuilder() + .setFirst(rule.dstportOrIcmpcodeFirst) + .setLast(rule.dstportOrIcmpcodeLast).build(); + } + + private static IcmpTypeRange parseIcmpTypeRange(final AclRule rule) { + return new IcmpTypeRangeBuilder() + .setFirst(rule.srcportOrIcmptypeFirst) + .setLast(rule.srcportOrIcmptypeLast).build(); + } + + private static Icmp parseIcmp(final AclRule rule) { + final IcmpNodesBuilder nodes = new IcmpNodesBuilder(); + nodes.setIcmpCodeRange(parseIcmpCodeRange(rule)); + nodes.setIcmpTypeRange(parseIcmpTypeRange(rule)); + return new IcmpBuilder().setIcmpNodes(nodes.build()).build(); + } + + private static DestinationPortRange parseDstPortRange(final AclRule rule) { + return new DestinationPortRangeBuilder() + .setLowerPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeFirst))) + .setUpperPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeLast))).build(); + } + + private static SourcePortRange parseSrcPortRange(final AclRule rule) { + return new SourcePortRangeBuilder() + .setLowerPort(new PortNumber(Short.toUnsignedInt(rule.srcportOrIcmptypeFirst))) + .setUpperPort(new PortNumber(Short.toUnsignedInt(rule.srcportOrIcmptypeLast))).build(); + } + + private static Tcp parseTcp(final AclRule rule) { + final TcpNodesBuilder nodes = new TcpNodesBuilder(); + nodes.setDestinationPortRange(parseDstPortRange(rule)); + nodes.setSourcePortRange(parseSrcPortRange(rule)); + nodes.setTcpFlagsMask((short) Byte.toUnsignedInt(rule.tcpFlagsMask)); + nodes.setTcpFlagsValue((short) Byte.toUnsignedInt(rule.tcpFlagsValue)); + return new TcpBuilder().setTcpNodes(nodes.build()).build(); + } + + private static Udp parseUdp(final AclRule rule) { + final UdpNodesBuilder nodes = new UdpNodesBuilder(); + nodes.setDestinationPortRange(parseDstPortRange(rule)); + nodes.setSourcePortRange(parseSrcPortRange(rule)); + return new UdpBuilder().setUdpNodes(nodes.build()).build(); + } + + private static IcmpV6 parseIcmp6(final AclRule rule) { + final IcmpV6NodesBuilder nodes = new IcmpV6NodesBuilder(); + nodes.setIcmpCodeRange(parseIcmpCodeRange(rule)); + nodes.setIcmpTypeRange(parseIcmpTypeRange(rule)); + return new IcmpV6Builder().setIcmpV6Nodes(nodes.build()).build(); + } + + private static IpProtocol parse(final AclRule rule) { + final OtherNodesBuilder nodes = new OtherNodesBuilder(); + nodes.setProtocol((short) Short.toUnsignedInt(rule.proto)); + return new OtherBuilder().setOtherNodes(nodes.build()).build(); + } + } +} |