2 * Copyright (C) 2014 Red Hat, Inc.
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 * Authors : Madhu Venugopal, Brent Salisbury, Srini Seetharaman
10 package org.opendaylight.ovsdb.utils.mdsal.openflow;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
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.SetNwDstActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.DstChoice;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpShaCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxArpThaCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIdCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxTunIpv4DstCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpOpCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpSpaCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfArpTpaCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstOfEthDstCaseBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder;
46 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;
47 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;
48 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;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.NxOutputReg;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.NxOutputRegBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMove;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.NxRegMoveBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.SrcBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.SrcChoice;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxArpShaCaseBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcNxRegCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfArpSpaCaseBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.src.choice.grouping.src.choice.SrcOfEthSrcCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.action.rev140421.OfjNxHashFields;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.action.rev140421.OfjNxMpAlgorithm;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionMultipathNodesNodeTableFlowApplyActionsCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionSetNsiNodesNodeTableFlowApplyActionsCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionSetNspNodesNodeTableFlowApplyActionsCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.multipath.grouping.NxMultipath;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.multipath.grouping.NxMultipathBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.resubmit.grouping.NxResubmit;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.set.nsi.grouping.NxSetNsi;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.set.nsi.grouping.NxSetNsiBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.set.nsp.grouping.NxSetNsp;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.set.nsp.grouping.NxSetNspBuilder;
77 import com.google.common.net.InetAddresses;
79 import java.math.BigInteger;
81 public final class ActionUtils {
82 public static Action dropAction() {
83 return new DropActionCaseBuilder()
84 .setDropAction(new DropActionBuilder()
89 public static Action outputAction(NodeConnectorId id) {
90 return new OutputActionCaseBuilder()
91 .setOutputAction(new OutputActionBuilder()
92 .setOutputNodeConnector(new Uri(id.getValue()))
97 public static Action groupAction(Long id) {
98 return new GroupActionCaseBuilder()
99 .setGroupAction(new GroupActionBuilder()
105 public static Action setDlSrcAction(MacAddress mac) {
106 return new SetDlSrcActionCaseBuilder()
107 .setSetDlSrcAction(new SetDlSrcActionBuilder()
113 public static Action setDlDstAction(MacAddress mac) {
114 return new SetDlDstActionCaseBuilder()
115 .setSetDlDstAction(new SetDlDstActionBuilder()
121 public static Action setNwSrcAction(Address ip) {
122 return new SetNwSrcActionCaseBuilder()
123 .setSetNwSrcAction(new SetNwSrcActionBuilder()
129 public static Action setNwDstAction(Address ip) {
130 return new SetNwDstActionCaseBuilder()
131 .setSetNwDstAction(new SetNwDstActionBuilder()
137 public static Action decNwTtlAction() {
138 return new DecNwTtlCaseBuilder()
139 .setDecNwTtl(new DecNwTtlBuilder()
144 public static Action nxLoadRegAction(DstChoice dstChoice,
147 boolean groupBucket) {
148 NxRegLoad r = new NxRegLoadBuilder()
149 .setDst(new DstBuilder()
150 .setDstChoice(dstChoice)
151 .setStart(Integer.valueOf(0))
152 .setEnd(Integer.valueOf(endOffset))
157 return new NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder()
158 .setNxRegLoad(r).build();
160 return new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
161 .setNxRegLoad(r).build();
165 public static Action nxLoadRegAction(DstChoice dstChoice,
167 return nxLoadRegAction(dstChoice, value, 31, false);
170 public static Action nxLoadRegAction(Class<? extends NxmNxReg> reg,
172 return nxLoadRegAction(new DstNxRegCaseBuilder().setNxReg(reg).build(),
176 public static Action nxLoadTunIPv4Action(String ipAddress,
177 boolean groupBucket) {
178 int ip = InetAddresses.coerceToInteger(InetAddresses.forString(ipAddress));
179 long ipl = ip & 0xffffffffL;
180 return nxLoadRegAction(new DstNxTunIpv4DstCaseBuilder()
181 .setNxTunIpv4Dst(Boolean.TRUE).build(),
182 BigInteger.valueOf(ipl),
187 public static Action nxLoadArpOpAction(BigInteger value) {
188 return nxLoadRegAction(new DstOfArpOpCaseBuilder()
189 .setOfArpOp(Boolean.TRUE).build(), value, 15, false);
192 public static Action nxLoadArpShaAction(MacAddress macAddress) {
193 return nxLoadArpShaAction(BigInteger.valueOf(toLong(macAddress)));
195 public static Action nxLoadArpShaAction(BigInteger value) {
196 return nxLoadRegAction(new DstNxArpShaCaseBuilder()
197 .setNxArpSha(Boolean.TRUE).build(), value, 47, false);
200 public static Action nxLoadArpSpaAction(BigInteger value) {
201 return nxLoadRegAction(new DstOfArpSpaCaseBuilder()
202 .setOfArpSpa(Boolean.TRUE).build(), value);
205 public static Action nxLoadArpSpaAction(String ipAddress) {
206 int ip = InetAddresses.coerceToInteger(InetAddresses.forString(ipAddress));
207 long ipl = ip & 0xffffffffL;
208 return nxLoadArpSpaAction(BigInteger.valueOf(ipl));
211 public static Action nxMoveRegAction(SrcChoice srcChoice,
214 boolean groupBucket) {
215 NxRegMove r = new NxRegMoveBuilder()
216 .setSrc(new SrcBuilder()
217 .setSrcChoice(srcChoice)
218 .setStart(Integer.valueOf(0))
219 .setEnd(Integer.valueOf(endOffset))
221 .setDst(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.move.grouping.nx.reg.move.DstBuilder()
222 .setDstChoice(dstChoice)
223 .setStart(Integer.valueOf(0))
224 .setEnd(Integer.valueOf(endOffset))
228 return new NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder()
229 .setNxRegMove(r).build();
231 return new NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder()
232 .setNxRegMove(r).build();
236 public static Action nxMoveRegAction(SrcChoice srcChoice,
237 DstChoice dstChoice) {
238 return nxMoveRegAction(srcChoice, dstChoice, 31, false);
241 public static Action nxMoveRegTunIdAction(Class<? extends NxmNxReg> src,
242 boolean groupBucket) {
243 return nxMoveRegAction(new SrcNxRegCaseBuilder()
244 .setNxReg(src).build(),
245 new DstNxTunIdCaseBuilder()
246 .setNxTunId(Boolean.TRUE).build(),
251 public static Action nxMoveArpShaToArpThaAction() {
252 return nxMoveRegAction(new SrcNxArpShaCaseBuilder()
253 .setNxArpSha(Boolean.TRUE).build(),
254 new DstNxArpThaCaseBuilder()
255 .setNxArpTha(Boolean.TRUE).build(),
259 public static Action nxMoveEthSrcToEthDstAction() {
260 return nxMoveRegAction(new SrcOfEthSrcCaseBuilder()
261 .setOfEthSrc(Boolean.TRUE).build(),
262 new DstOfEthDstCaseBuilder()
263 .setOfEthDst(Boolean.TRUE).build(),
267 public static Action nxMoveArpSpaToArpTpaAction() {
268 return nxMoveRegAction(new SrcOfArpSpaCaseBuilder()
269 .setOfArpSpa(Boolean.TRUE).build(),
270 new DstOfArpTpaCaseBuilder()
271 .setOfArpTpa(Boolean.TRUE).build());
274 public static Action nxOutputRegAction(SrcChoice srcChoice) {
275 NxOutputReg r = new NxOutputRegBuilder()
276 .setSrc(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.output.reg.grouping.nx.output.reg.SrcBuilder()
277 .setSrcChoice(srcChoice)
278 .setOfsNbits(Integer.valueOf(31))
280 .setMaxLen(Integer.valueOf(0xffff))
282 return new NxActionOutputRegNodesNodeTableFlowApplyActionsCaseBuilder()
283 .setNxOutputReg(r).build();
286 public static Action nxOutputRegAction(Class<? extends NxmNxReg> reg) {
287 return nxOutputRegAction(new SrcNxRegCaseBuilder().setNxReg(reg).build());
290 public static Action nxResubmitAction(Integer inPort, Short table) {
291 NxResubmitBuilder builder = new NxResubmitBuilder();
292 if (inPort != null) {
293 builder.setInPort(inPort);
296 builder.setTable(table);
298 NxResubmit r = builder.build();
299 return new NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder().setNxResubmit(r).build();
302 public static Action nxSetNspAction(Long nsp) {
303 NxSetNspBuilder builder = new NxSetNspBuilder();
307 NxSetNsp r = builder.build();
308 return new NxActionSetNspNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsp(r).build();
311 public static Action nxSetNsiAction(Short nsp) {
312 NxSetNsiBuilder builder = new NxSetNsiBuilder();
316 NxSetNsi r = builder.build();
317 return new NxActionSetNsiNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsi(r).build();
320 public static Action nxMultipathAction(OfjNxHashFields fields, Integer basis,
321 OfjNxMpAlgorithm algorithm, Integer maxLink, Long arg, DstChoice dstChoice,
322 Integer start, Integer end) {
323 NxMultipath r = new NxMultipathBuilder()
326 .setAlgorithm(algorithm)
329 .setDst(new org.opendaylight.yang.gen.v1.urn.opendaylight.ovs.nx.sal.action.rev140714.nx.action.multipath.grouping.nx.multipath.DstBuilder()
330 .setDstChoice(dstChoice)
335 return new NxActionMultipathNodesNodeTableFlowApplyActionsCaseBuilder().setNxMultipath(r).build();
339 * Accepts a MAC address and returns the corresponding long, where the
340 * MAC bytes are set on the lower order bytes of the long.
342 * @return a long containing the mac address bytes
344 public static long toLong(byte[] macAddress) {
346 for (int i = 0; i < 6; i++) {
347 long t = (macAddress[i] & 0xffL) << ((5-i)*8);
354 * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not
355 * matter, and returns the corresponding long, where the MAC bytes are set
356 * on the lower order bytes of the long.
360 * @return a long containing the mac address bytes
362 public static long toLong(MacAddress macAddress) {
363 return toLong(toMACAddress(macAddress.getValue()));
367 * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not
368 * matter, and returns a corresponding byte[].
372 public static byte[] toMACAddress(String macAddress) {
373 final String HEXES = "0123456789ABCDEF";
374 byte[] address = new byte[6];
375 String[] macBytes = macAddress.split(":");
376 if (macBytes.length != 6)
377 throw new IllegalArgumentException(
378 "Specified MAC Address must contain 12 hex digits" +
379 " separated pairwise by :'s.");
380 for (int i = 0; i < 6; ++i) {
381 address[i] = (byte) ((HEXES.indexOf(macBytes[i].toUpperCase()
382 .charAt(0)) << 4) | HEXES.indexOf(macBytes[i].toUpperCase()