2 * Copyright (c) 2014, 2015 Red Hat, 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.ovsdb.utils.mdsal.openflow;
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.DstChoice;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIdCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4DstCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpOpCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpSpaCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpTpaCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthDstCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder;
50 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.NxActionOutputRegNodesNodeTableFlowApplyActionsCaseBuilder;
51 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.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder;
52 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.NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.NxOutputReg;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.NxOutputRegBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMove;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMoveBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.SrcBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.SrcChoice;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpShaCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxRegCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpSpaCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthSrcCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjNxHashFields;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.OfjNxMpAlgorithm;
68 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.NxActionMultipathNodesNodeTableFlowApplyActionsCaseBuilder;
69 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.NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder;
70 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.NxActionSetNsiNodesNodeTableFlowApplyActionsCaseBuilder;
71 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.NxActionSetNspNodesNodeTableFlowApplyActionsCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.multipath.grouping.NxMultipath;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.multipath.grouping.NxMultipathBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmit;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.set.nsi.grouping.NxSetNsi;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.set.nsi.grouping.NxSetNsiBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.set.nsp.grouping.NxSetNsp;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.set.nsp.grouping.NxSetNspBuilder;
81 import com.google.common.net.InetAddresses;
83 import java.math.BigInteger;
85 public final class ActionUtils {
86 public static Action dropAction() {
87 return new DropActionCaseBuilder()
88 .setDropAction(new DropActionBuilder()
93 public static Action outputAction(NodeConnectorId id) {
94 return new OutputActionCaseBuilder()
95 .setOutputAction(new OutputActionBuilder()
96 .setOutputNodeConnector(new Uri(id.getValue()))
101 public static Action groupAction(Long id) {
102 return new GroupActionCaseBuilder()
103 .setGroupAction(new GroupActionBuilder()
109 public static Action popVlanAction() {
110 return new PopVlanActionCaseBuilder()
111 .setPopVlanAction(new PopVlanActionBuilder()
116 public static Action setDlSrcAction(MacAddress mac) {
117 return new SetDlSrcActionCaseBuilder()
118 .setSetDlSrcAction(new SetDlSrcActionBuilder()
124 public static Action setDlDstAction(MacAddress mac) {
125 return new SetDlDstActionCaseBuilder()
126 .setSetDlDstAction(new SetDlDstActionBuilder()
132 public static Action setNwSrcAction(Address ip) {
133 return new SetNwSrcActionCaseBuilder()
134 .setSetNwSrcAction(new SetNwSrcActionBuilder()
140 public static Action setNwDstAction(Address ip) {
141 return new SetNwDstActionCaseBuilder()
142 .setSetNwDstAction(new SetNwDstActionBuilder()
148 public static Action decNwTtlAction() {
149 return new DecNwTtlCaseBuilder()
150 .setDecNwTtl(new DecNwTtlBuilder()
155 public static Action setTunnelIdAction(BigInteger tunnelId) {
157 SetFieldBuilder setFieldBuilder = new SetFieldBuilder();
159 // Build the Set Tunnel Field Action
160 TunnelBuilder tunnel = new TunnelBuilder();
161 tunnel.setTunnelId(tunnelId);
162 setFieldBuilder.setTunnel(tunnel.build());
164 return new SetFieldCaseBuilder()
165 .setSetField(setFieldBuilder.build())
169 public static Action nxLoadRegAction(DstChoice dstChoice,
172 boolean groupBucket) {
173 NxRegLoad r = new NxRegLoadBuilder()
174 .setDst(new DstBuilder()
175 .setDstChoice(dstChoice)
176 .setStart(Integer.valueOf(0))
177 .setEnd(Integer.valueOf(endOffset))
182 return new NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder()
183 .setNxRegLoad(r).build();
185 return new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
186 .setNxRegLoad(r).build();
190 public static Action nxLoadRegAction(DstChoice dstChoice,
192 return nxLoadRegAction(dstChoice, value, 31, false);
195 public static Action nxLoadRegAction(Class<? extends NxmNxReg> reg,
197 return nxLoadRegAction(new DstNxRegCaseBuilder().setNxReg(reg).build(),
201 public static Action nxLoadTunIPv4Action(String ipAddress,
202 boolean groupBucket) {
203 int ip = InetAddresses.coerceToInteger(InetAddresses.forString(ipAddress));
204 long ipl = ip & 0xffffffffL;
205 return nxLoadRegAction(new DstNxTunIpv4DstCaseBuilder()
206 .setNxTunIpv4Dst(Boolean.TRUE).build(),
207 BigInteger.valueOf(ipl),
212 public static Action nxLoadArpOpAction(BigInteger value) {
213 return nxLoadRegAction(new DstOfArpOpCaseBuilder()
214 .setOfArpOp(Boolean.TRUE).build(), value, 15, false);
217 public static Action nxLoadArpShaAction(MacAddress macAddress) {
218 return nxLoadArpShaAction(BigInteger.valueOf(toLong(macAddress)));
220 public static Action nxLoadArpShaAction(BigInteger value) {
221 return nxLoadRegAction(new DstNxArpShaCaseBuilder()
222 .setNxArpSha(Boolean.TRUE).build(), value, 47, false);
225 public static Action nxLoadArpSpaAction(BigInteger value) {
226 return nxLoadRegAction(new DstOfArpSpaCaseBuilder()
227 .setOfArpSpa(Boolean.TRUE).build(), value);
230 public static Action nxLoadArpSpaAction(String ipAddress) {
231 int ip = InetAddresses.coerceToInteger(InetAddresses.forString(ipAddress));
232 long ipl = ip & 0xffffffffL;
233 return nxLoadArpSpaAction(BigInteger.valueOf(ipl));
236 public static Action nxMoveRegAction(SrcChoice srcChoice,
239 boolean groupBucket) {
240 NxRegMove r = new NxRegMoveBuilder()
241 .setSrc(new SrcBuilder()
242 .setSrcChoice(srcChoice)
243 .setStart(Integer.valueOf(0))
244 .setEnd(Integer.valueOf(endOffset))
246 .setDst(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.DstBuilder()
247 .setDstChoice(dstChoice)
248 .setStart(Integer.valueOf(0))
249 .setEnd(Integer.valueOf(endOffset))
253 return new NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder()
254 .setNxRegMove(r).build();
256 return new NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder()
257 .setNxRegMove(r).build();
261 public static Action nxMoveRegAction(SrcChoice srcChoice,
262 DstChoice dstChoice) {
263 return nxMoveRegAction(srcChoice, dstChoice, 31, false);
266 public static Action nxMoveRegTunIdAction(Class<? extends NxmNxReg> src,
267 boolean groupBucket) {
268 return nxMoveRegAction(new SrcNxRegCaseBuilder()
269 .setNxReg(src).build(),
270 new DstNxTunIdCaseBuilder()
271 .setNxTunId(Boolean.TRUE).build(),
276 public static Action nxMoveArpShaToArpThaAction() {
277 return nxMoveRegAction(new SrcNxArpShaCaseBuilder()
278 .setNxArpSha(Boolean.TRUE).build(),
279 new DstNxArpThaCaseBuilder()
280 .setNxArpTha(Boolean.TRUE).build(),
284 public static Action nxMoveEthSrcToEthDstAction() {
285 return nxMoveRegAction(new SrcOfEthSrcCaseBuilder()
286 .setOfEthSrc(Boolean.TRUE).build(),
287 new DstOfEthDstCaseBuilder()
288 .setOfEthDst(Boolean.TRUE).build(),
292 public static Action nxMoveArpSpaToArpTpaAction() {
293 return nxMoveRegAction(new SrcOfArpSpaCaseBuilder()
294 .setOfArpSpa(Boolean.TRUE).build(),
295 new DstOfArpTpaCaseBuilder()
296 .setOfArpTpa(Boolean.TRUE).build());
299 public static Action nxOutputRegAction(SrcChoice srcChoice) {
300 NxOutputReg r = new NxOutputRegBuilder()
301 .setSrc(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.nx.output.reg.SrcBuilder()
302 .setSrcChoice(srcChoice)
303 .setOfsNbits(Integer.valueOf(31))
305 .setMaxLen(Integer.valueOf(0xffff))
307 return new NxActionOutputRegNodesNodeTableFlowApplyActionsCaseBuilder()
308 .setNxOutputReg(r).build();
311 public static Action nxOutputRegAction(Class<? extends NxmNxReg> reg) {
312 return nxOutputRegAction(new SrcNxRegCaseBuilder().setNxReg(reg).build());
315 public static Action nxResubmitAction(Integer inPort, Short table) {
316 NxResubmitBuilder builder = new NxResubmitBuilder();
317 if (inPort != null) {
318 builder.setInPort(inPort);
321 builder.setTable(table);
323 NxResubmit r = builder.build();
324 return new NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder().setNxResubmit(r).build();
327 public static Action nxSetNspAction(Long nsp) {
328 NxSetNspBuilder builder = new NxSetNspBuilder();
332 NxSetNsp r = builder.build();
333 return new NxActionSetNspNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsp(r).build();
336 public static Action nxSetNsiAction(Short nsp) {
337 NxSetNsiBuilder builder = new NxSetNsiBuilder();
341 NxSetNsi r = builder.build();
342 return new NxActionSetNsiNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsi(r).build();
345 public static Action nxMultipathAction(OfjNxHashFields fields, Integer basis,
346 OfjNxMpAlgorithm algorithm, Integer maxLink, Long arg, DstChoice dstChoice,
347 Integer start, Integer end) {
348 NxMultipath r = new NxMultipathBuilder()
351 .setAlgorithm(algorithm)
354 .setDst(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.multipath.grouping.nx.multipath.DstBuilder()
355 .setDstChoice(dstChoice)
360 return new NxActionMultipathNodesNodeTableFlowApplyActionsCaseBuilder().setNxMultipath(r).build();
364 * Accepts a MAC address and returns the corresponding long, where the
365 * MAC bytes are set on the lower order bytes of the long.
367 * @return a long containing the mac address bytes
369 public static long toLong(byte[] macAddress) {
371 for (int i = 0; i < 6; i++) {
372 long t = (macAddress[i] & 0xffL) << ((5-i)*8);
379 * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not
380 * matter, and returns the corresponding long, where the MAC bytes are set
381 * on the lower order bytes of the long.
385 * @return a long containing the mac address bytes
387 public static long toLong(MacAddress macAddress) {
388 return toLong(toMACAddress(macAddress.getValue()));
392 * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not
393 * matter, and returns a corresponding byte[].
397 public static byte[] toMACAddress(String macAddress) {
398 final String HEXES = "0123456789ABCDEF";
399 byte[] address = new byte[6];
400 String[] macBytes = macAddress.split(":");
401 if (macBytes.length != 6) {
402 throw new IllegalArgumentException(
403 "Specified MAC Address must contain 12 hex digits" +
404 " separated pairwise by :'s.");
406 for (int i = 0; i < 6; ++i) {
407 address[i] = (byte) ((HEXES.indexOf(macBytes[i].toUpperCase()
408 .charAt(0)) << 4) | HEXES.indexOf(macBytes[i].toUpperCase()