2 * Copyright © 2016, 2017 Red Hat, Inc. and others.
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
8 package org.opendaylight.genius.mdsalutil.actions;
10 import java.util.ArrayList;
11 import java.util.Collections;
12 import java.util.List;
13 import java.util.stream.Collectors;
15 import org.opendaylight.genius.mdsalutil.ActionInfo;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrackBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActions;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.nx.conntrack.CtActionsBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder;
30 * NX conntrack action.
32 public class ActionNxConntrack extends ActionInfo {
33 private static final long serialVersionUID = 1L;
35 private final int flags;
36 private final long zoneSrc;
37 private final int conntrackZone;
38 private final short recircTable;
39 private final List<NxCtAction> ctActions = new ArrayList<>();
41 public ActionNxConntrack(int flags, long zoneSrc, int conntrackZone, short recircTable) {
42 this(0, flags, zoneSrc, conntrackZone, recircTable, Collections.emptyList());
45 public ActionNxConntrack(int flags, long zoneSrc, int conntrackZone, short recircTable,
46 List<NxCtAction> ctActions) {
47 this(0, flags, zoneSrc, conntrackZone, recircTable, ctActions);
50 public ActionNxConntrack(int actionKey, int flags, long zoneSrc, int conntrackZone, short recircTable) {
51 this(actionKey, flags, zoneSrc, conntrackZone, recircTable, Collections.emptyList());
54 public ActionNxConntrack(int actionKey, int flags, long zoneSrc, int conntrackZone, short recircTable,
55 List<NxCtAction> ctActions) {
58 this.zoneSrc = zoneSrc;
59 this.conntrackZone = conntrackZone;
60 this.recircTable = recircTable;
61 this.ctActions.addAll(ctActions);
65 public Action buildAction() {
66 return buildAction(getActionKey());
70 public Action buildAction(int newActionKey) {
71 NxConntrackBuilder ctb = new NxConntrackBuilder()
74 .setConntrackZone(conntrackZone)
75 .setRecircTable(recircTable);
76 ctb.setCtActions(this.ctActions.stream().map(NxCtAction::buildCtActions).collect(Collectors.toList()));
77 ActionBuilder ab = new ActionBuilder();
78 ab.setAction(new NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder()
79 .setNxConntrack(ctb.build()).build());
80 ab.setKey(new ActionKey(newActionKey));
84 public int getFlags() {
88 public long getZoneSrc() {
92 public int getConntrackZone() {
96 public short getRecircTable() {
100 public List<NxCtAction> getCtActions() {
105 public boolean equals(Object other) {
109 if (other == null || getClass() != other.getClass()) {
112 if (!super.equals(other)) {
116 ActionNxConntrack that = (ActionNxConntrack) other;
118 if (flags != that.flags) {
121 if (zoneSrc != that.zoneSrc) {
124 if (conntrackZone != that.conntrackZone) {
127 if (recircTable != that.recircTable) {
130 return ctActions.equals(that.ctActions);
134 public int hashCode() {
135 int result = super.hashCode();
136 result = 31 * result + flags;
137 result = 31 * result + (int) (zoneSrc ^ zoneSrc >>> 32);
138 result = 31 * result + conntrackZone;
139 result = 31 * result + recircTable;
140 result = 31 * result + ctActions.hashCode();
145 public String toString() {
146 return "ActionNxConntrack [flags=" + flags + ", zoneSrc=" + zoneSrc + ", conntrackZone=" + conntrackZone
147 + ", recircTable=" + recircTable + ", ctActions=" + ctActions + ", getActionKey()=" + getActionKey()
151 public interface NxCtAction {
152 CtActions buildCtActions();
155 public static class NxNat implements NxCtAction {
156 private final int flags;
157 private final int rangePresent;
158 private final IpAddress ipAddressMin;
159 private final IpAddress ipAddressMax;
160 private final int portMin;
161 private final int portMax;
163 public NxNat(int actionKey, int flags, int natType, IpAddress ipAddressMin,
164 IpAddress ipAddressMax,int portMin, int portMax) {
166 this.rangePresent = natType;
167 this.ipAddressMin = ipAddressMin;
168 this.ipAddressMax = ipAddressMax;
169 this.portMin = portMin;
170 this.portMax = portMax;
173 public int getFlags() {
177 public int getRangePresent() {
181 public IpAddress getIpAddressMin() {
185 public IpAddress getIpAddressMax() {
189 public int getPortMin() {
193 public int getPortMax() {
198 public CtActions buildCtActions() {
199 NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder()
201 .setRangePresent(rangePresent)
202 .setIpAddressMin(ipAddressMin)
203 .setIpAddressMax(ipAddressMax)
205 .setPortMax(portMax);
207 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
208 NxActionNatCaseBuilder caseBuilder = new NxActionNatCaseBuilder();
209 caseBuilder.setNxActionNat(nxActionNatBuilder.build());
210 ctActionsBuilder.setOfpactActions(caseBuilder.build());
211 return ctActionsBuilder.build();
215 public boolean equals(Object other) {
219 if (other == null || getClass() != other.getClass()) {
223 NxNat that = (NxNat) other;
225 if (flags != that.flags) {
228 if (rangePresent != that.rangePresent) {
231 if (ipAddressMin != null ? !ipAddressMin.equals(that.ipAddressMin) : that.ipAddressMin != null) {
234 if (ipAddressMax != null ? !ipAddressMax.equals(that.ipAddressMax) : that.ipAddressMax != null) {
237 if (portMin != that.portMin) {
240 return portMax == that.portMax;
244 public int hashCode() {
246 result = 31 * result + rangePresent;
247 result = 31 * result + ipAddressMin.hashCode();
248 result = 31 * result + ipAddressMax.hashCode();
249 result = 31 * result + portMin;
250 result = 31 * result + portMax;
255 public String toString() {
256 return "NxNat [flags=" + flags + ", rangePresent=" + rangePresent + ", ipAddressMin=" + ipAddressMin
257 + ", ipAddressMax=" + ipAddressMax + ", portMin=" + portMin + ", portMax=" + portMax + "]";
261 public static class NxCtMark implements NxCtAction {
262 private final long ctMark;
264 public NxCtMark(long ctMark) {
265 this.ctMark = ctMark;
269 public CtActions buildCtActions() {
270 NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder()
273 CtActionsBuilder ctActionsBuilder = new CtActionsBuilder();
274 NxActionCtMarkCaseBuilder caseBuilder = new NxActionCtMarkCaseBuilder();
275 caseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build());
276 ctActionsBuilder.setOfpactActions(caseBuilder.build());
277 return ctActionsBuilder.build();
281 public boolean equals(Object other) {
285 if (other == null || getClass() != other.getClass()) {
289 NxCtMark that = (NxCtMark) other;
291 return ctMark == that.ctMark;
295 public int hashCode() {
296 return 31 * (int) (ctMark ^ (ctMark >>> 32));