/* * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl; import javax.annotation.Nullable; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.ActionsBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.MatchesBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.DenyBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; 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.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.AceIpVersion; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6Builder; 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.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.IcmpBuilder; 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.TcpBuilder; 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.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.TcpNodes; 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.UdpNodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev161214.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder; import com.google.common.base.Preconditions; public class GbpAceBuilder { private final String name; private Short protocol; private SourcePortRangeBuilder sourcePortRangeBuilder; private DestinationPortRangeBuilder destinationPortRangeBuilder; private AceIpVersion aceIpVersion; private AceIpv4 aceIpv4; private AceIpv6 aceIpv6; private IpProtocol ipProtocol; private Actions action; // deny is a default action in the model private static final Short FIRST_ICMP = 0; private static final Short LAST_ICMP = 254; GbpAceBuilder(String name) { this.name = Preconditions.checkNotNull(name, "Cannot build rule with empty name."); this.sourcePortRangeBuilder = new SourcePortRangeBuilder(); this.destinationPortRangeBuilder = new DestinationPortRangeBuilder(); } public String getName() { return name; } public Short getProtocol() { return protocol; } public SourcePortRangeBuilder getSourcePortRangeBuilder() { return sourcePortRangeBuilder; } public DestinationPortRangeBuilder getDestinationPortRangeBuilder() { return destinationPortRangeBuilder; } public AceIpVersion getAceIpVersion() { return aceIpVersion; } public Actions getAction() { return action; } public GbpAceBuilder setProtocol(short protocol) { this.protocol = protocol; return this; } public GbpAceBuilder setSourcePortRange(SourcePortRangeBuilder sourcePortRangeBuilder) { if (sourcePortRangeBuilder != null) { this.sourcePortRangeBuilder = sourcePortRangeBuilder; } return this; } public GbpAceBuilder setDestinationPortRange(DestinationPortRangeBuilder destPortRangeBuilder) { if (destPortRangeBuilder != null) { this.destinationPortRangeBuilder = destPortRangeBuilder; } return this; } public GbpAceBuilder setIpAddresses(@Nullable Ipv4Prefix srcIp, @Nullable Ipv4Prefix dstIp) { AceIpv4Builder aceIpv4Builder = (aceIpv4 != null) ? new AceIpv4Builder(aceIpv4) : new AceIpv4Builder(); if (srcIp != null) { aceIpv4Builder.setSourceIpv4Network(srcIp); } if (dstIp != null) { aceIpv4Builder.setDestinationIpv4Network(dstIp); } this.aceIpv4 = aceIpv4Builder.build(); this.aceIpVersion = aceIpv4; return this; } public GbpAceBuilder setIpAddresses(@Nullable Ipv6Prefix srcIp, @Nullable Ipv6Prefix dstIp) { AceIpv6Builder aceIpv6Builder = (aceIpv6 != null) ? new AceIpv6Builder(aceIpv6) : new AceIpv6Builder(); if (srcIp != null) { aceIpv6Builder.setSourceIpv6Network(srcIp); } if (dstIp != null) { aceIpv6Builder.setDestinationIpv6Network(dstIp); } this.aceIpv6 = aceIpv6Builder.build(); this.aceIpVersion = aceIpv6; return this; } public GbpAceBuilder setPermit() { this.action = new ActionsBuilder().setPacketHandling(new PermitBuilder().setPermit(true).build()).build(); return this; } public GbpAceBuilder setDeny() { this.action = new ActionsBuilder().setPacketHandling(new DenyBuilder().setDeny(true).build()).build(); return this; } public GbpAceBuilder setAction(Actions actions) { this.action = actions; return this; } public Ace build() { if (protocol == null || protocol == 0) { ipProtocol = new OtherBuilder().setOtherNodes(new OtherNodesBuilder().setProtocol((short) 0).build()).build(); } else { if (protocol == 1) { ipProtocol = new IcmpBuilder().setIcmpNodes(new IcmpNodesBuilder() .setIcmpTypeRange(new IcmpTypeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build()) .setIcmpCodeRange(new IcmpCodeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build()) .build()).build(); } SourcePortRange sourcePortRange = (sourcePortRangeBuilder.getLowerPort() != null && sourcePortRangeBuilder.getUpperPort() != null) ? sourcePortRangeBuilder.build() : null; DestinationPortRange destPortRange = (destinationPortRangeBuilder.getLowerPort() != null && destinationPortRangeBuilder.getUpperPort() != null) ? destinationPortRangeBuilder.build() : null; if (protocol == 6) { TcpNodes tcpNodes = new TcpNodesBuilder().setSourcePortRange(sourcePortRange) .setDestinationPortRange(destPortRange) .build(); ipProtocol = new TcpBuilder().setTcpNodes(tcpNodes).build(); } if (protocol == 17) { UdpNodes udpNodes = new UdpNodesBuilder().setSourcePortRange(sourcePortRange) .setDestinationPortRange(destPortRange) .build(); ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build(); ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build(); } } VppAce vppAce = new VppAceBuilder() .setVppAceNodes(new VppAceNodesBuilder().setAceIpVersion(aceIpVersion).setIpProtocol(ipProtocol).build()) .build(); Matches matches = new MatchesBuilder().setAceType(vppAce).build(); AceBuilder aceBuilder = new AceBuilder(); aceBuilder.setMatches(matches); aceBuilder.setActions(action); aceBuilder.setRuleName(name); return aceBuilder.build(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); appendNonNullTo(sb, "GbpAceBuilder [name=", name); if (sourcePortRangeBuilder != null) { appendNonNullTo(sb, ", srcPort=lower:", sourcePortRangeBuilder.getLowerPort()); appendNonNullTo(sb, ", srcPort=upper:", sourcePortRangeBuilder.getUpperPort()); } if (sourcePortRangeBuilder != null) { appendNonNullTo(sb, ", dstPort=lower:", destinationPortRangeBuilder.getLowerPort()); appendNonNullTo(sb, ", dstPort=upper:", destinationPortRangeBuilder.getUpperPort()); } appendNonNullTo(sb, ", protocol=", protocol); appendNonNullTo(sb, ", aceIpVersion=", aceIpVersion); appendNonNullTo(sb, ", action=", action); return sb.toString(); } private void appendNonNullTo(StringBuilder sb, String key, Object value) { if (value != null && key!= null) { sb.append(key).append(value); } } }