L3: Add eth to br-ex
[netvirt.git] / utils / mdsal-openflow / src / main / java / org / opendaylight / ovsdb / utils / mdsal / openflow / ActionUtils.java
1 /*
2  * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.ovsdb.utils.mdsal.openflow;
10
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;
80
81 import com.google.common.net.InetAddresses;
82
83 import java.math.BigInteger;
84
85 public final class ActionUtils {
86     public static Action dropAction() {
87         return new DropActionCaseBuilder()
88             .setDropAction(new DropActionBuilder()
89                 .build())
90             .build();
91     }
92
93     public static Action outputAction(NodeConnectorId id) {
94         return new OutputActionCaseBuilder()
95             .setOutputAction(new OutputActionBuilder()
96                 .setOutputNodeConnector(new Uri(id.getValue()))
97                 .build())
98             .build();
99     }
100
101     public static Action groupAction(Long id) {
102         return new GroupActionCaseBuilder()
103             .setGroupAction(new GroupActionBuilder()
104                 .setGroupId(id)
105                 .build())
106             .build();
107     }
108
109     public static Action popVlanAction() {
110         return new PopVlanActionCaseBuilder()
111             .setPopVlanAction(new PopVlanActionBuilder()
112                     .build())
113             .build();
114     }
115
116     public static Action setDlSrcAction(MacAddress mac) {
117         return new SetDlSrcActionCaseBuilder()
118             .setSetDlSrcAction(new SetDlSrcActionBuilder()
119                 .setAddress(mac)
120                 .build())
121             .build();
122     }
123
124     public static Action setDlDstAction(MacAddress mac) {
125         return new SetDlDstActionCaseBuilder()
126             .setSetDlDstAction(new SetDlDstActionBuilder()
127                 .setAddress(mac)
128                 .build())
129             .build();
130     }
131
132     public static Action setNwSrcAction(Address ip) {
133         return new SetNwSrcActionCaseBuilder()
134             .setSetNwSrcAction(new SetNwSrcActionBuilder()
135                 .setAddress(ip)
136                 .build())
137             .build();
138     }
139
140     public static Action setNwDstAction(Address ip) {
141         return new SetNwDstActionCaseBuilder()
142             .setSetNwDstAction(new SetNwDstActionBuilder()
143                 .setAddress(ip)
144                 .build())
145             .build();
146     }
147
148     public static Action decNwTtlAction() {
149         return new DecNwTtlCaseBuilder()
150             .setDecNwTtl(new DecNwTtlBuilder()
151                 .build())
152             .build();
153     }
154
155     public static Action setTunnelIdAction(BigInteger tunnelId) {
156
157         SetFieldBuilder setFieldBuilder = new SetFieldBuilder();
158
159         // Build the Set Tunnel Field Action
160         TunnelBuilder tunnel = new TunnelBuilder();
161         tunnel.setTunnelId(tunnelId);
162         setFieldBuilder.setTunnel(tunnel.build());
163
164         return new SetFieldCaseBuilder()
165                 .setSetField(setFieldBuilder.build())
166                 .build();
167     }
168
169     public static Action nxLoadRegAction(DstChoice dstChoice,
170                                          BigInteger value,
171                                          int endOffset,
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))
178                 .build())
179             .setValue(value)
180             .build();
181         if (groupBucket) {
182             return new NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder()
183                 .setNxRegLoad(r).build();
184         } else {
185             return new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder()
186                 .setNxRegLoad(r).build();
187         }
188     }
189
190     public static Action nxLoadRegAction(DstChoice dstChoice,
191                                          BigInteger value) {
192         return nxLoadRegAction(dstChoice, value, 31, false);
193     }
194
195     public static Action nxLoadRegAction(Class<? extends NxmNxReg> reg,
196                                          BigInteger value) {
197         return nxLoadRegAction(new DstNxRegCaseBuilder().setNxReg(reg).build(),
198                                value);
199     }
200
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),
208                                31,
209                                groupBucket);
210     }
211
212     public static Action nxLoadArpOpAction(BigInteger value) {
213         return nxLoadRegAction(new DstOfArpOpCaseBuilder()
214             .setOfArpOp(Boolean.TRUE).build(), value, 15, false);
215     }
216
217     public static Action nxLoadArpShaAction(MacAddress macAddress) {
218         return nxLoadArpShaAction(BigInteger.valueOf(toLong(macAddress)));
219     }
220     public static Action nxLoadArpShaAction(BigInteger value) {
221         return nxLoadRegAction(new DstNxArpShaCaseBuilder()
222             .setNxArpSha(Boolean.TRUE).build(), value, 47, false);
223     }
224
225     public static Action nxLoadArpSpaAction(BigInteger value) {
226         return nxLoadRegAction(new DstOfArpSpaCaseBuilder()
227             .setOfArpSpa(Boolean.TRUE).build(), value);
228     }
229
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));
234     }
235
236     public static Action nxMoveRegAction(SrcChoice srcChoice,
237                                          DstChoice dstChoice,
238                                          int endOffset,
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))
245                 .build())
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))
250                 .build())
251             .build();
252         if (groupBucket) {
253             return new NxActionRegMoveNodesNodeGroupBucketsBucketActionsCaseBuilder()
254                 .setNxRegMove(r).build();
255         } else {
256             return new NxActionRegMoveNodesNodeTableFlowApplyActionsCaseBuilder()
257                 .setNxRegMove(r).build();
258         }
259     }
260
261     public static Action nxMoveRegAction(SrcChoice srcChoice,
262                                          DstChoice dstChoice) {
263         return nxMoveRegAction(srcChoice, dstChoice, 31, false);
264     }
265
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(),
272                                31,
273                                groupBucket);
274     }
275
276     public static Action nxMoveArpShaToArpThaAction() {
277         return nxMoveRegAction(new SrcNxArpShaCaseBuilder()
278                                    .setNxArpSha(Boolean.TRUE).build(),
279                                new DstNxArpThaCaseBuilder()
280                                    .setNxArpTha(Boolean.TRUE).build(),
281                                47, false);
282     }
283
284     public static Action nxMoveEthSrcToEthDstAction() {
285         return nxMoveRegAction(new SrcOfEthSrcCaseBuilder()
286                                    .setOfEthSrc(Boolean.TRUE).build(),
287                                new DstOfEthDstCaseBuilder()
288                                    .setOfEthDst(Boolean.TRUE).build(),
289                                47, false);
290     }
291
292     public static Action nxMoveArpSpaToArpTpaAction() {
293         return nxMoveRegAction(new SrcOfArpSpaCaseBuilder()
294                                    .setOfArpSpa(Boolean.TRUE).build(),
295                                new DstOfArpTpaCaseBuilder()
296                                    .setOfArpTpa(Boolean.TRUE).build());
297     }
298
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))
304                 .build())
305             .setMaxLen(Integer.valueOf(0xffff))
306             .build();
307         return new NxActionOutputRegNodesNodeTableFlowApplyActionsCaseBuilder()
308             .setNxOutputReg(r).build();
309     }
310
311     public static Action nxOutputRegAction(Class<? extends NxmNxReg> reg) {
312         return nxOutputRegAction(new SrcNxRegCaseBuilder().setNxReg(reg).build());
313     }
314
315     public static Action nxResubmitAction(Integer inPort, Short table) {
316         NxResubmitBuilder builder = new NxResubmitBuilder();
317         if (inPort != null) {
318             builder.setInPort(inPort);
319         }
320         if (table != null) {
321             builder.setTable(table);
322         }
323         NxResubmit r = builder.build();
324         return new NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder().setNxResubmit(r).build();
325     }
326
327     public static Action nxSetNspAction(Long nsp) {
328         NxSetNspBuilder builder = new NxSetNspBuilder();
329         if (nsp != null) {
330             builder.setNsp(nsp);
331         }
332         NxSetNsp r = builder.build();
333         return new NxActionSetNspNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsp(r).build();
334     }
335
336     public static Action nxSetNsiAction(Short nsp) {
337         NxSetNsiBuilder builder = new NxSetNsiBuilder();
338         if (nsp != null) {
339             builder.setNsi(nsp);
340         }
341         NxSetNsi r = builder.build();
342         return new NxActionSetNsiNodesNodeTableFlowApplyActionsCaseBuilder().setNxSetNsi(r).build();
343     }
344
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()
349             .setFields(fields)
350             .setBasis(basis)
351             .setAlgorithm(algorithm)
352             .setMaxLink(maxLink)
353             .setArg(arg)
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)
356                 .setStart(start)
357                 .setEnd(end)
358                 .build())
359             .build();
360         return new NxActionMultipathNodesNodeTableFlowApplyActionsCaseBuilder().setNxMultipath(r).build();
361     }
362
363     /**
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.
366      * @param macAddress
367      * @return a long containing the mac address bytes
368      */
369     public static long toLong(byte[] macAddress) {
370         long mac = 0;
371         for (int i = 0; i < 6; i++) {
372             long t = (macAddress[i] & 0xffL) << ((5-i)*8);
373             mac |= t;
374         }
375         return mac;
376     }
377
378     /**
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.
382      *
383      * @param macAddress
384      *            in String format
385      * @return a long containing the mac address bytes
386      */
387     public static long toLong(MacAddress macAddress) {
388         return toLong(toMACAddress(macAddress.getValue()));
389     }
390
391     /**
392      * Accepts a MAC address of the form 00:aa:11:bb:22:cc, case does not
393      * matter, and returns a corresponding byte[].
394      * @param macAddress
395      * @return
396      */
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.");
405         }
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()
409                                                                                                   .charAt(1)));
410         }
411         return address;
412     }
413 }