2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl;
11 import javax.annotation.Nullable;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceBuilder;
15 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;
16 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;
17 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;
18 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;
19 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;
20 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;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAceBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodesBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.AceIpVersion;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6Builder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpCodeRangeBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpTypeRangeBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.IpProtocol;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.OtherBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.TcpBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.UdpBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodesBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodes;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodesBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder;
49 import com.google.common.base.Optional;
50 import com.google.common.base.Preconditions;
52 public class GbpAceBuilder {
54 private final String name;
55 private Short protocol;
56 private SourcePortRangeBuilder sourcePortRangeBuilder;
57 private DestinationPortRangeBuilder destinationPortRangeBuilder;
58 private AceIpVersion aceIpVersion;
59 private AceIpv4 aceIpv4;
60 private AceIpv6 aceIpv6;
61 private IpProtocol ipProtocol;
62 private Actions action; // deny is a default action in the model
64 private static final Short FIRST_ICMP = 0;
65 private static final Short LAST_ICMP = 254;
67 GbpAceBuilder(String name) {
68 this.name = Preconditions.checkNotNull(name, "Cannot build rule with empty name.");
69 this.sourcePortRangeBuilder = new SourcePortRangeBuilder();
70 this.destinationPortRangeBuilder = new DestinationPortRangeBuilder();
73 public String getName() {
77 public Short getProtocol() {
81 public SourcePortRangeBuilder getSourcePortRangeBuilder() {
82 return sourcePortRangeBuilder;
85 public DestinationPortRangeBuilder getDestinationPortRangeBuilder() {
86 return destinationPortRangeBuilder;
89 public AceIpVersion getAceIpVersion() {
93 public Actions getAction() {
97 public Optional<AceIpVersion> getEtherType() {
98 return (aceIpVersion != null) ? Optional.of(aceIpVersion) : Optional.absent();
101 public GbpAceBuilder setProtocol(short protocol) {
102 this.protocol = protocol;
106 public GbpAceBuilder setSourcePortRange(SourcePortRangeBuilder sourcePortRangeBuilder) {
107 if (sourcePortRangeBuilder != null) {
108 this.sourcePortRangeBuilder = sourcePortRangeBuilder;
113 public GbpAceBuilder setDestinationPortRange(DestinationPortRangeBuilder destPortRangeBuilder) {
114 if (destPortRangeBuilder != null) {
115 this.destinationPortRangeBuilder = destPortRangeBuilder;
120 public GbpAceBuilder setIpv4EtherType() {
121 this.aceIpVersion = new AceIpv4Builder().build();
125 public GbpAceBuilder setIpv6EtherType() {
126 this.aceIpVersion = new AceIpv6Builder().build();
130 public GbpAceBuilder setIpAddresses(@Nullable Ipv4Prefix srcIp, @Nullable Ipv4Prefix dstIp) {
131 AceIpv4Builder aceIpv4Builder = (aceIpv4 != null) ? new AceIpv4Builder(aceIpv4) : new AceIpv4Builder();
133 aceIpv4Builder.setSourceIpv4Network(srcIp);
136 aceIpv4Builder.setDestinationIpv4Network(dstIp);
138 this.aceIpv4 = aceIpv4Builder.build();
139 this.aceIpVersion = aceIpv4;
143 public GbpAceBuilder setIpAddresses(@Nullable Ipv6Prefix srcIp, @Nullable Ipv6Prefix dstIp) {
144 AceIpv6Builder aceIpv6Builder = (aceIpv6 != null) ? new AceIpv6Builder(aceIpv6) : new AceIpv6Builder();
146 aceIpv6Builder.setSourceIpv6Network(srcIp);
149 aceIpv6Builder.setDestinationIpv6Network(dstIp);
151 this.aceIpv6 = aceIpv6Builder.build();
152 this.aceIpVersion = aceIpv6;
156 public GbpAceBuilder setPermit() {
157 this.action = new ActionsBuilder().setPacketHandling(new PermitBuilder().setPermit(true).build()).build();
161 public GbpAceBuilder setDeny() {
162 this.action = new ActionsBuilder().setPacketHandling(new DenyBuilder().setDeny(true).build()).build();
166 public GbpAceBuilder setAction(Actions actions) {
167 this.action = actions;
172 if (protocol == null || protocol == 0) {
174 new OtherBuilder().setOtherNodes(new OtherNodesBuilder().setProtocol((short) 0).build()).build();
177 ipProtocol = new IcmpBuilder().setIcmpNodes(new IcmpNodesBuilder()
178 .setIcmpTypeRange(new IcmpTypeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
179 .setIcmpCodeRange(new IcmpCodeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
182 SourcePortRange sourcePortRange = (sourcePortRangeBuilder.getLowerPort() != null
183 && sourcePortRangeBuilder.getUpperPort() != null) ? sourcePortRangeBuilder.build() : null;
184 DestinationPortRange destPortRange = (destinationPortRangeBuilder.getLowerPort() != null
185 && destinationPortRangeBuilder.getUpperPort() != null) ? destinationPortRangeBuilder.build() : null;
187 TcpNodes tcpNodes = new TcpNodesBuilder().setSourcePortRange(sourcePortRange)
188 .setDestinationPortRange(destPortRange)
190 ipProtocol = new TcpBuilder().setTcpNodes(tcpNodes).build();
192 if (protocol == 17) {
193 UdpNodes udpNodes = new UdpNodesBuilder().setSourcePortRange(sourcePortRange)
194 .setDestinationPortRange(destPortRange)
196 ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
197 ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
200 VppAce vppAce = new VppAceBuilder()
201 .setVppAceNodes(new VppAceNodesBuilder().setAceIpVersion(aceIpVersion).setIpProtocol(ipProtocol).build())
203 Matches matches = new MatchesBuilder().setAceType(vppAce).build();
204 AceBuilder aceBuilder = new AceBuilder();
205 aceBuilder.setMatches(matches);
206 aceBuilder.setActions(action);
207 aceBuilder.setRuleName(name);
208 return aceBuilder.build();
212 public String toString() {
213 StringBuilder sb = new StringBuilder();
214 appendNonNullTo(sb, "GbpAceBuilder [name=", name);
215 if (sourcePortRangeBuilder != null) {
216 appendNonNullTo(sb, ", srcPort=lower:", sourcePortRangeBuilder.getLowerPort());
217 appendNonNullTo(sb, ", srcPort=upper:", sourcePortRangeBuilder.getUpperPort());
219 if (sourcePortRangeBuilder != null) {
220 appendNonNullTo(sb, ", dstPort=lower:", destinationPortRangeBuilder.getLowerPort());
221 appendNonNullTo(sb, ", dstPort=upper:", destinationPortRangeBuilder.getUpperPort());
223 appendNonNullTo(sb, ", protocol=", protocol);
224 appendNonNullTo(sb, ", aceIpVersion=", aceIpVersion);
225 appendNonNullTo(sb, ", action=", action);
226 return sb.toString();
229 private void appendNonNullTo(StringBuilder sb, String key, Object value) {
230 if (value != null && key!= null) {
231 sb.append(key).append(value);