BUG-2637: migration consequence - fix unit test
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / test / java / org / opendaylight / controller / sal / compatibility / test / TestToSalConversionsUtils.java
1 /*
2  * Copyright (c) 2013-2014 Cisco Systems, 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 package org.opendaylight.controller.sal.compatibility.test;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNotNull;
12 import static org.junit.Assert.assertTrue;
13 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.CRUDP;
14 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.ETHERNET_ARP;
15 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.TCP;
16 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.UDP;
17
18 import java.math.BigInteger;
19 import java.net.Inet4Address;
20 import java.net.Inet6Address;
21 import java.net.InetAddress;
22 import java.util.ArrayList;
23 import java.util.Collections;
24 import java.util.List;
25
26 import org.junit.Test;
27 import org.opendaylight.controller.sal.action.Flood;
28 import org.opendaylight.controller.sal.action.FloodAll;
29 import org.opendaylight.controller.sal.action.HwPath;
30 import org.opendaylight.controller.sal.action.Loopback;
31 import org.opendaylight.controller.sal.action.Output;
32 import org.opendaylight.controller.sal.action.PopVlan;
33 import org.opendaylight.controller.sal.action.PushVlan;
34 import org.opendaylight.controller.sal.action.SetDlDst;
35 import org.opendaylight.controller.sal.action.SetDlSrc;
36 import org.opendaylight.controller.sal.action.SetDlType;
37 import org.opendaylight.controller.sal.action.SetNextHop;
38 import org.opendaylight.controller.sal.action.SetNwDst;
39 import org.opendaylight.controller.sal.action.SetNwSrc;
40 import org.opendaylight.controller.sal.action.SetNwTos;
41 import org.opendaylight.controller.sal.action.SetTpDst;
42 import org.opendaylight.controller.sal.action.SetTpSrc;
43 import org.opendaylight.controller.sal.action.SetVlanCfi;
44 import org.opendaylight.controller.sal.action.SetVlanId;
45 import org.opendaylight.controller.sal.action.SetVlanPcp;
46 import org.opendaylight.controller.sal.action.SwPath;
47 import org.opendaylight.controller.sal.compatibility.ToSalConversionsUtils;
48 import org.opendaylight.controller.sal.core.ConstructionException;
49 import org.opendaylight.controller.sal.core.Node;
50 import org.opendaylight.controller.sal.core.Node.NodeIDType;
51 import org.opendaylight.controller.sal.core.NodeConnector;
52 import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
53 import org.opendaylight.controller.sal.flowprogrammer.Flow;
54 import org.opendaylight.controller.sal.match.MatchType;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCaseBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCaseBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCaseBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.type.action._case.SetDlTypeActionBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.next.hop.action._case.SetNextHopActionBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.cfi.action._case.SetVlanCfiActionBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
146 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
147 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
148
149 import com.google.common.net.InetAddresses;
150
151 public class TestToSalConversionsUtils {
152     // prefix:
153     // od|Od = Open Daylight
154     private enum MtchType {
155         other, untagged, ipv4, ipv6, arp, sctp, tcp, udp
156     }
157
158     @Test
159     public void testToSalConversion() throws ConstructionException {
160         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
161         odNodeFlowBuilder = prepareOdFlowCommon();
162
163         Node node = new Node(NodeIDType.OPENFLOW,(long)1);
164
165         Flow salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.other), node);
166         checkSalMatch(salFlow.getMatch(), MtchType.other);
167
168         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.untagged), node);
169         checkSalMatch(salFlow.getMatch(), MtchType.untagged);
170
171         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv4), node);
172         checkSalMatch(salFlow.getMatch(), MtchType.ipv4);
173
174         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv6), node);
175         checkSalMatch(salFlow.getMatch(), MtchType.ipv6);
176
177         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.arp), node);
178         checkSalMatch(salFlow.getMatch(), MtchType.arp);
179
180         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.sctp), node);
181         checkSalMatch(salFlow.getMatch(), MtchType.sctp);
182
183         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.tcp), node);
184         checkSalMatch(salFlow.getMatch(), MtchType.tcp);
185
186         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.udp), node);
187         checkSalMatch(salFlow.getMatch(), MtchType.udp);
188
189         checkSalFlow(salFlow);
190     }
191
192     /**
193      * test of {@link ToSalConversionsUtils#fromNodeConnectorRef(Uri, Node)}
194      * @throws ConstructionException
195      */
196     @Test
197     public void testFromNodeConnectorRef() throws ConstructionException {
198         Node node = new Node(NodeIDType.OPENFLOW, 42L);
199         NodeConnector nodeConnector = ToSalConversionsUtils.fromNodeConnectorRef(new Uri("1"), node);
200         assertEquals("OF|1@OF|00:00:00:00:00:00:00:2a", nodeConnector.toString());
201     }
202
203     @Test
204     public void testActionFrom() throws ConstructionException {
205         // Bug 2021: Convert AD-SAL notation into MD-SAL notation before calling NodeConnector
206         Node node = new Node(NodeIDType.OPENFLOW, 42L);
207         List<Action> odActions = new ArrayList<>();
208
209         OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
210         outputActionBuilder.setOutputNodeConnector(new Uri("CONTROLLER"));
211         OutputActionCaseBuilder outputActionCaseBuilder = new OutputActionCaseBuilder();
212         outputActionCaseBuilder.setOutputAction(outputActionBuilder.build());
213         odActions.add(new ActionBuilder().setAction(outputActionCaseBuilder.build()).build());
214
215         List<org.opendaylight.controller.sal.action.Action> targetAction =
216                 ToSalConversionsUtils.actionFrom(odActions, node);
217         assertNotNull(targetAction);
218         assertTrue( Output.class.isInstance(targetAction.get(0)) );
219         Output targetActionOutput = (Output) targetAction.get(0);
220         NodeConnector port = targetActionOutput.getPort();
221         assertNotNull(port);
222         assertEquals(port.getType(), NodeConnectorIDType.CONTROLLER);
223         assertEquals(port.getID(), org.opendaylight.controller.sal.core.NodeConnector.SPECIALNODECONNECTORID);
224     }
225
226     private void checkSalMatch(org.opendaylight.controller.sal.match.Match match, MtchType mt) throws ConstructionException {
227         switch (mt) {
228         case other:
229             /*assertNotNull("DL_DST isn't equal.", "3C:A9:F4:00:E0:C8",
230                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
231             assertEquals("DL_SRC isn't equal.", "24:77:03:7C:C5:F1",
232                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
233             */
234             Node node = new Node(NodeIDType.OPENFLOW, 12L);
235             NodeConnector port = new NodeConnector(NodeConnectorIDType.OPENFLOW, Short.valueOf((short)345), node);
236             assertEquals("IN_PORT isn't equal.", port, match.getField(MatchType.IN_PORT).getValue());
237             assertEquals("DL_TYPE isn't equal.", (short) 0xffff, (short) match.getField(MatchType.DL_TYPE).getValue());
238             assertEquals("NW_TOS isn't equal.", (byte) 0x33, (byte) match.getField(MatchType.NW_TOS).getValue());
239             assertEquals("NW_PROTO isn't equal.", (byte) 0x3f, (byte) match.getField(MatchType.NW_PROTO).getValue());
240             assertEquals("DL_VLAN isn't equal.", (short) 0xfff, (short) match.getField(MatchType.DL_VLAN).getValue());
241             assertEquals("DL_VLAN_PR isn't equal.", (byte) 0x7, (byte) match.getField(MatchType.DL_VLAN_PR).getValue());
242             break;
243         case untagged:
244             assertEquals("DL_TYPE isn't equal.", (short) 0xffff, (short) match.getField(MatchType.DL_TYPE).getValue());
245             assertEquals("NW_TOS isn't equal.", (byte) 0x33, (byte) match.getField(MatchType.NW_TOS).getValue());
246             assertEquals("NW_PROTO isn't equal.", (byte) 0x3f, (byte) match.getField(MatchType.NW_PROTO).getValue());
247             assertEquals("DL_VLAN isn't equal.", MatchType.DL_VLAN_NONE, (short) match.getField(MatchType.DL_VLAN).getValue());
248             break;
249         case arp:
250             /*
251             assertEquals("DL_SRC isn't equal.", "22:44:66:88:AA:CC",
252                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
253             assertEquals("DL_DST isn't equal.", "11:33:55:77:BB:DD",
254                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
255             */
256             assertEquals("NW_SRC isn't equal.", "192.168.1.101",
257                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
258             assertEquals("NW_DST isn't equal.", "192.168.1.102",
259                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
260             assertEquals("DL_TYPE isn't equal.", ETHERNET_ARP, match.getField(MatchType.DL_TYPE).getValue());
261             break;
262         case ipv4:
263             assertEquals("NW_SRC isn't equal.", "192.168.1.104",
264                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
265             assertEquals("NW_DST isn't equal.", "192.168.1.105",
266                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
267             break;
268         case ipv6:
269             assertEquals("NW_SRC isn't equal.", "3001:db8:85a3::8a2e:370:7334",
270                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
271             assertEquals("NW_DST isn't equal.", "3001:db8:85a3::8a2e:370:7335",
272                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
273             break;
274         case sctp:
275             assertEquals("TP_SRC isn't equal.", 31, (short) match.getField(MatchType.TP_SRC).getValue());
276             assertEquals("TP_DST isn't equal.", 32, (short) match.getField(MatchType.TP_DST).getValue());
277             assertEquals("NW_PROTO isn't equal.", CRUDP, (byte) match.getField(MatchType.NW_PROTO).getValue());
278             break;
279         case tcp:
280             assertEquals("TP_SRC isn't equal.", 21, (short) match.getField(MatchType.TP_SRC).getValue());
281             assertEquals("TP_DST isn't equal.", 22, (short) match.getField(MatchType.TP_DST).getValue());
282             assertEquals("NW_PROTO isn't equal.", TCP, (byte) match.getField(MatchType.NW_PROTO).getValue());
283             break;
284         case udp:
285             assertEquals("TP_SRC isn't equal.", 11, (short) match.getField(MatchType.TP_SRC).getValue());
286             assertEquals("TP_DST isn't equal.", 12, (short) match.getField(MatchType.TP_DST).getValue());
287             assertEquals("NW_PROTO isn't equal.", UDP, (byte) match.getField(MatchType.NW_PROTO).getValue());
288             break;
289         default:
290             break;
291
292         }
293
294     }
295
296     private void checkSalFlow(Flow salFlow) {
297         assertTrue("Id value is incorrect.", salFlow.getId() == 9223372036854775807L);
298         assertTrue("Hard timeout is incorrect.", salFlow.getHardTimeout() == 32767);
299         assertTrue("Iddle timeout is incorrect.", salFlow.getIdleTimeout() == 32767);
300         assertTrue("Priority value is incorrect.", salFlow.getPriority() == 32767);
301
302         checkSalActions(salFlow.getActions());
303     }
304
305     private void checkSalActions(List<org.opendaylight.controller.sal.action.Action> actions) {
306         checkSalAction(actions, Flood.class, 1);
307         checkSalAction(actions, FloodAll.class, 1);
308         checkSalAction(actions, HwPath.class, 1);
309         checkSalAction(actions, Loopback.class, 1);
310         checkSalAction(actions, Output.class, 1, true);
311         checkSalAction(actions, PopVlan.class, 1);
312         checkSalAction(actions, PushVlan.class, 1, true);
313         checkSalAction(actions, SetDlDst.class, 1, true);
314         checkSalAction(actions, SetDlSrc.class, 1, true);
315         checkSalAction(actions, SetDlType.class, 1, true);
316         checkSalAction(actions, SetNextHop.class, 2, true);
317         checkSalAction(actions, SetNwDst.class, 2, true);
318         checkSalAction(actions, SetNwSrc.class, 2, true);
319         checkSalAction(actions, SetNwTos.class, 1, true);
320         checkSalAction(actions, SetTpDst.class, 1, true);
321         checkSalAction(actions, SetTpSrc.class, 1, true);
322         checkSalAction(actions, SetVlanCfi.class, 1, true);
323         checkSalAction(actions, SetVlanId.class, 1, true);
324         checkSalAction(actions, SetVlanPcp.class, 1, true);
325         checkSalAction(actions, SwPath.class, 1);
326     }
327
328     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
329             int numOfActions) {
330         checkSalAction(actions, cls, numOfActions, false);
331     }
332
333     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
334             int numOfActions, boolean additionalCheck) {
335         int numOfEqualClass = 0;
336         for (org.opendaylight.controller.sal.action.Action action : actions) {
337             if (action.getClass().equals(cls)) {
338                 if (additionalCheck) {
339                     additionalActionCheck(action);
340                 }
341                 numOfEqualClass++;
342             }
343         }
344         assertEquals("Incorrect number of actions of type " + cls.getName() + " was found.", numOfActions,
345                 numOfEqualClass);
346     }
347
348     // implement special checks
349     private void additionalActionCheck(org.opendaylight.controller.sal.action.Action action) {
350         if (action instanceof Output) {
351             // ((Output)action).getPort() //TODO finish check when mapping will
352             // be defined
353         } else if (action instanceof PushVlan) {
354             assertEquals("Wrong value for action PushVlan for tag.", 0x8100, ((PushVlan) action).getTag());
355         } else if (action instanceof SetDlDst) {
356             //assertEquals("Wrong value for action SetDlDst for MAC address.", "3C:A9:F4:00:E0:C8", new String(
357             //        ((SetDlDst) action).getDlAddress()));
358         } else if (action instanceof SetDlSrc) {
359             //assertEquals("Wrong value for action SetDlSrc for MAC address.", "24:77:03:7C:C5:F1", new String(
360             //      ((SetDlSrc) action).getDlAddress()));
361         } else if (action instanceof SetDlType) {
362             assertEquals("Wrong value for action SetDlType for.", 513L, ((SetDlType) action).getDlType());
363         } else if (action instanceof SetNextHop) {
364             InetAddress inetAddress = ((SetNextHop) action).getAddress();
365             checkIpAddresses(inetAddress, "192.168.100.100", "2001:db8:85a3::8a2e:370:7334");
366         } else if (action instanceof SetNwDst) {
367             InetAddress inetAddress = ((SetNwDst) action).getAddress();
368             checkIpAddresses(inetAddress, "192.168.100.101", "2001:db8:85a3::8a2e:370:7335");
369         } else if (action instanceof SetNwSrc) {
370             InetAddress inetAddress = ((SetNwSrc) action).getAddress();
371             checkIpAddresses(inetAddress, "192.168.100.102", "2001:db8:85a3::8a2e:370:7336");
372         } else if (action instanceof SetNwTos) {
373             assertEquals("Wrong value for action SetNwTos for tos.", 63, ((SetNwTos) action).getNwTos());
374         } else if (action instanceof SetTpDst) {
375             assertEquals("Wrong value for action SetTpDst for port.", 65535, ((SetTpDst) action).getPort());
376         } else if (action instanceof SetTpSrc) {
377             assertEquals("Wrong value for action SetTpSrc for port.", 65535, ((SetTpSrc) action).getPort());
378         } else if (action instanceof SetVlanCfi) {
379             assertEquals("Wrong value for action SetVlanCfi for port.", 1, ((SetVlanCfi) action).getCfi());
380         } else if (action instanceof SetVlanId) {
381             assertEquals("Wrong value for action SetVlanId for vlan ID.", 4095, ((SetVlanId) action).getVlanId());
382         } else if (action instanceof SetVlanPcp) {
383             assertEquals("Wrong value for action SetVlanPcp for vlan ID.", 7, ((SetVlanPcp) action).getPcp());
384         }
385     }
386
387     private void checkIpAddresses(InetAddress inetAddress, String ipv4, String ipv6) {
388         if (inetAddress instanceof Inet4Address) {
389             assertEquals("Wrong value for IP address.", ipv4, InetAddresses.toAddrString(inetAddress));
390         } else if (inetAddress instanceof Inet6Address) {
391             assertEquals("Wrong value for IP address.", ipv6, InetAddresses.toAddrString(inetAddress));
392         }
393     }
394
395     private FlowAddedBuilder prepareOdFlowCommon() {
396         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
397
398         odNodeFlowBuilder.setCookie(new FlowCookie(new BigInteger("9223372036854775807")));
399         odNodeFlowBuilder.setHardTimeout(32767);
400         odNodeFlowBuilder.setIdleTimeout(32767);
401         odNodeFlowBuilder.setPriority(32767);
402         odNodeFlowBuilder.setInstructions(prepareOdActions());
403         return odNodeFlowBuilder;
404     }
405
406     private NodeFlow prepareOdFlow(FlowAddedBuilder odNodeFlowBuilder, MtchType mt) {
407         odNodeFlowBuilder.setMatch(prepOdMatch(mt));
408         return odNodeFlowBuilder.build();
409     }
410
411     private Instructions prepareOdActions() {
412         List<Action> odActions = new ArrayList<>();
413
414         ControllerActionCaseBuilder controllerActionBuilder = new ControllerActionCaseBuilder();
415         DropActionCaseBuilder dropActionBuilder = new DropActionCaseBuilder();
416         FloodActionCaseBuilder floodActionBuilder = new FloodActionCaseBuilder();
417         FloodAllActionCaseBuilder floodAllActionBuilder = new FloodAllActionCaseBuilder();
418         HwPathActionCaseBuilder hwPathActionBuilder = new HwPathActionCaseBuilder();
419         LoopbackActionCaseBuilder loopbackActionBuilder = new LoopbackActionCaseBuilder();
420         OutputActionCaseBuilder outputActionBuilder = new OutputActionCaseBuilder();
421         PopMplsActionCaseBuilder popMplsActionBuilder = new PopMplsActionCaseBuilder();
422         PopVlanActionCaseBuilder popVlanActionBuilder = new PopVlanActionCaseBuilder();
423         PushMplsActionCaseBuilder pushMplsActionBuilder = new PushMplsActionCaseBuilder();
424         PushPbbActionCaseBuilder pushPbbActionBuilder = new PushPbbActionCaseBuilder();
425         PushVlanActionCaseBuilder pushVlanActionBuilder = new PushVlanActionCaseBuilder();
426         SetDlDstActionCaseBuilder setDlDstActionBuilder = new SetDlDstActionCaseBuilder();
427         SetDlSrcActionCaseBuilder setDlSrcActionBuilder = new SetDlSrcActionCaseBuilder();
428         SetDlTypeActionCaseBuilder setDlTypeActionBuilder = new SetDlTypeActionCaseBuilder();
429         SetMplsTtlActionCaseBuilder setMplsTtlActionBuilder = new SetMplsTtlActionCaseBuilder();
430         SetNwTosActionCaseBuilder setNwTosActionBuilder = new SetNwTosActionCaseBuilder();
431         SetNwTtlActionCaseBuilder setNwTtlActionBuilder = new SetNwTtlActionCaseBuilder();
432         SetQueueActionCaseBuilder setQueueActionBuilder = new SetQueueActionCaseBuilder();
433         SetTpDstActionCaseBuilder setTpDstActionBuilder = new SetTpDstActionCaseBuilder();
434         SetTpSrcActionCaseBuilder setTpSrcActionBuilder = new SetTpSrcActionCaseBuilder();
435         SetVlanCfiActionCaseBuilder setVlanCfiActionBuilder = new SetVlanCfiActionCaseBuilder();
436         SetVlanIdActionCaseBuilder setVlanIdActionBuilder = new SetVlanIdActionCaseBuilder();
437         SetVlanPcpActionCaseBuilder setVlanPcpActionBuilder = new SetVlanPcpActionCaseBuilder();
438         SwPathActionCaseBuilder swPathActionBuilder = new SwPathActionCaseBuilder();
439
440         prepareActionOutput(outputActionBuilder);
441         prepareActionPushVlan(pushVlanActionBuilder);
442         prepareActionSetDlDst(setDlDstActionBuilder);
443         prepareActionSetDlSrc(setDlSrcActionBuilder);
444         prepareActionSetDlType(setDlTypeActionBuilder);
445         prepareActionNextHop(odActions);
446         prepareActionSetNwDst(odActions);
447         prepareActionSetNwSrc(odActions);
448         prepareActionSetNwTos(setNwTosActionBuilder);
449         prepareActionSetTpDst(setTpDstActionBuilder);
450         prepareActionSetTpSrc(setTpSrcActionBuilder);
451         prepareActionSetVlanCfi(setVlanCfiActionBuilder);
452         prepareActionSetVladId(setVlanIdActionBuilder);
453         prepareActionSetVlanPcp(setVlanPcpActionBuilder);
454
455         odActions.add(new ActionBuilder().setAction(controllerActionBuilder.build()).build());
456         odActions.add(new ActionBuilder().setAction(dropActionBuilder.build()).build());
457         odActions.add(new ActionBuilder().setAction(floodActionBuilder.build()).build());
458         odActions.add(new ActionBuilder().setAction(floodAllActionBuilder.build()).build());
459         odActions.add(new ActionBuilder().setAction(hwPathActionBuilder.build()).build());
460         odActions.add(new ActionBuilder().setAction(loopbackActionBuilder.build()).build());
461         odActions.add(new ActionBuilder().setAction(outputActionBuilder.build()).build());
462         odActions.add(new ActionBuilder().setAction(popMplsActionBuilder.build()).build());
463         odActions.add(new ActionBuilder().setAction(popVlanActionBuilder.build()).build());
464         odActions.add(new ActionBuilder().setAction(pushMplsActionBuilder.build()).build());
465         odActions.add(new ActionBuilder().setAction(pushPbbActionBuilder.build()).build());
466         odActions.add(new ActionBuilder().setAction(pushVlanActionBuilder.build()).build());
467         odActions.add(new ActionBuilder().setAction(setDlDstActionBuilder.build()).build());
468         odActions.add(new ActionBuilder().setAction(setDlSrcActionBuilder.build()).build());
469         odActions.add(new ActionBuilder().setAction(setDlTypeActionBuilder.build()).build());
470         odActions.add(new ActionBuilder().setAction(setMplsTtlActionBuilder.build()).build());
471         odActions.add(new ActionBuilder().setAction(setNwTosActionBuilder.build()).build());
472         odActions.add(new ActionBuilder().setAction(setNwTtlActionBuilder.build()).build());
473         odActions.add(new ActionBuilder().setAction(setQueueActionBuilder.build()).build());
474         odActions.add(new ActionBuilder().setAction(setTpDstActionBuilder.build()).build());
475         odActions.add(new ActionBuilder().setAction(setTpSrcActionBuilder.build()).build());
476         odActions.add(new ActionBuilder().setAction(setVlanCfiActionBuilder.build()).build());
477         odActions.add(new ActionBuilder().setAction(setVlanIdActionBuilder.build()).build());
478         odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build());
479         odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build());
480
481
482         ApplyActionsCase innerInst = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(odActions).build()).build();
483         Instruction applyActions = new InstructionBuilder().setInstruction(innerInst).build();
484         List<Instruction> instructions = Collections.singletonList(applyActions );
485         InstructionsBuilder instBuilder = new InstructionsBuilder();
486
487         instBuilder.setInstruction(instructions);
488
489         return instBuilder.build();
490     }
491
492     private void prepareActionSetVlanPcp(SetVlanPcpActionCaseBuilder wrapper) {
493         SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder();
494         setVlanPcpActionBuilder.setVlanPcp(new VlanPcp((short) 7));
495         wrapper.setSetVlanPcpAction(setVlanPcpActionBuilder.build());
496     }
497
498     private void prepareActionSetVladId(SetVlanIdActionCaseBuilder wrapper) {
499         SetVlanIdActionBuilder setVlanIdActionBuilder = new SetVlanIdActionBuilder();
500         setVlanIdActionBuilder.setVlanId(new VlanId(4095));
501         wrapper.setSetVlanIdAction(setVlanIdActionBuilder.build());
502     }
503
504     private void prepareActionSetVlanCfi(SetVlanCfiActionCaseBuilder wrapper) {
505         SetVlanCfiActionBuilder setVlanCfiActionBuilder = new SetVlanCfiActionBuilder();
506         setVlanCfiActionBuilder.setVlanCfi(new VlanCfi(1));
507         wrapper.setSetVlanCfiAction(setVlanCfiActionBuilder.build());
508     }
509
510     private void prepareActionSetTpDst(SetTpDstActionCaseBuilder wrapper) {
511         SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder();
512         setTpDstActionBuilder.setPort(new PortNumber(65535));
513         wrapper.setSetTpDstAction(setTpDstActionBuilder.build());
514     }
515
516     private void prepareActionSetTpSrc(SetTpSrcActionCaseBuilder wrapper) {
517         SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder();
518         setTpSrcActionBuilder.setPort(new PortNumber(65535));
519         wrapper.setSetTpSrcAction(setTpSrcActionBuilder.build());
520     }
521
522     private void prepareActionSetNwTos(SetNwTosActionCaseBuilder wrapper) {
523         SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder();
524         setNwTosActionBuilder.setTos(252);
525         wrapper.setSetNwTosAction(setNwTosActionBuilder.build());
526     }
527
528     private void prepareActionSetNwSrc(List<Action> odActions) {
529         // test case for IPv4
530         SetNwSrcActionBuilder setNwSrcActionBuilderIpv4 = new SetNwSrcActionBuilder();
531         setNwSrcActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.102"));
532         odActions.add(new ActionBuilder().setAction(new SetNwSrcActionCaseBuilder().setSetNwSrcAction(setNwSrcActionBuilderIpv4.build()).build()).build());
533
534         // test case for IPv6
535         SetNwSrcActionBuilder setNwSrcActionBuilderIpv6 = new SetNwSrcActionBuilder();
536         setNwSrcActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7336"));
537         odActions.add(new ActionBuilder().setAction(new SetNwSrcActionCaseBuilder().setSetNwSrcAction(setNwSrcActionBuilderIpv6.build()).build()).build());
538     }
539
540     private void prepareActionSetNwDst(List<Action> odActions) {
541         // test case for IPv4
542
543         SetNwDstActionBuilder setNwDstActionBuilderIpv4 = new SetNwDstActionBuilder();
544         setNwDstActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.101"));
545         odActions.add(new ActionBuilder().setAction(new SetNwDstActionCaseBuilder().setSetNwDstAction(setNwDstActionBuilderIpv4.build()).build()).build());
546
547         // test case for IPv6
548         SetNwDstActionBuilder setNwDstActionBuilderIpv6 = new SetNwDstActionBuilder();
549         setNwDstActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7335"));
550         odActions.add(new ActionBuilder().setAction(new SetNwDstActionCaseBuilder().setSetNwDstAction(setNwDstActionBuilderIpv6.build()).build()).build());
551     }
552
553     private void prepareActionNextHop(List<Action> odActions) {
554         // test case for IPv4
555         SetNextHopActionBuilder setNextHopActionBuilderIpv4 = new SetNextHopActionBuilder();
556         setNextHopActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.100"));
557         odActions.add(new ActionBuilder().setAction(new SetNextHopActionCaseBuilder().setSetNextHopAction(setNextHopActionBuilderIpv4.build()).build()).build());
558
559         // test case for IPv6
560         SetNextHopActionBuilder setNextHopActionBuilderIpv6 = new SetNextHopActionBuilder();
561         setNextHopActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
562         odActions.add(new ActionBuilder().setAction(new SetNextHopActionCaseBuilder().setSetNextHopAction(setNextHopActionBuilderIpv6.build()).build()).build());
563     }
564
565     private Address prapareIpv4Address(String ipv4Address) {
566         Ipv4Builder ipv4Builder = new Ipv4Builder();
567         ipv4Builder.setIpv4Address(new Ipv4Prefix(ipv4Address + "/32"));
568         return ipv4Builder.build();
569     }
570
571     private Address prapareIpv6Address(String ipv6Address) {
572         Ipv6Builder ipv6Builder = new Ipv6Builder();
573         ipv6Builder.setIpv6Address(new Ipv6Prefix(ipv6Address));
574         return ipv6Builder.build();
575     }
576
577     private void prepareActionSetDlType(SetDlTypeActionCaseBuilder wrapper) {
578         SetDlTypeActionBuilder setDlTypeActionBuilder = new SetDlTypeActionBuilder();
579         setDlTypeActionBuilder.setDlType(new EtherType(513L));
580         wrapper.setSetDlTypeAction(setDlTypeActionBuilder.build());
581     }
582
583     private void prepareActionSetDlSrc(SetDlSrcActionCaseBuilder wrapper) {
584         SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder();
585         setDlSrcActionBuilder.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
586         wrapper.setSetDlSrcAction(setDlSrcActionBuilder.build());
587     }
588
589     private void prepareActionSetDlDst(SetDlDstActionCaseBuilder wrapper) {
590         SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder();
591         setDlDstActionBuilder.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
592         wrapper.setSetDlDstAction(setDlDstActionBuilder.build());
593     }
594
595     private void prepareActionPushVlan(PushVlanActionCaseBuilder wrapper) {
596         PushVlanActionBuilder pushVlanActionBuilder = new PushVlanActionBuilder();
597         pushVlanActionBuilder.setTag(0x8100); // 12 bit
598         wrapper.setPushVlanAction(pushVlanActionBuilder.build());
599     }
600
601     private void prepareActionOutput(OutputActionCaseBuilder wrapper) {
602         OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
603         outputActionBuilder.setOutputNodeConnector(new Uri("1"));
604         wrapper.setOutputAction(outputActionBuilder.build());
605     }
606
607     private Match prepOdMatch(MtchType mt) {
608         MatchBuilder odMatchBuilder = new MatchBuilder();
609         switch (mt) {
610         case other:
611             odMatchBuilder.setInPort(new NodeConnectorId("openflow:12:345"));
612             odMatchBuilder.setEthernetMatch(prepEthernetMatch());
613             odMatchBuilder.setIpMatch(prepIpMatch());
614             odMatchBuilder.setVlanMatch(prepVlanMatch());
615             break;
616         case untagged:
617             odMatchBuilder.setEthernetMatch(prepEthernetMatch());
618             odMatchBuilder.setIpMatch(prepIpMatch());
619             odMatchBuilder.setVlanMatch(prepVlanNoneMatch());
620             break;
621         case ipv4:
622             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv4());
623             break;
624         case ipv6:
625             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv6());
626             break;
627         case arp:
628             odMatchBuilder.setLayer3Match(prepLayer3MatchArp());
629             break;
630         case sctp:
631             odMatchBuilder.setLayer4Match(prepLayer4MatchSctp());
632             break;
633         case tcp:
634             odMatchBuilder.setLayer4Match(prepLayer4MatchTcp());
635             break;
636         case udp:
637             odMatchBuilder.setLayer4Match(prepLayer4MatchUdp());
638             break;
639         }
640         return odMatchBuilder.build();
641     }
642
643     private Layer4Match prepLayer4MatchUdp() {
644         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
645
646         udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
647         udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
648
649         return udpMatchBuilder.build();
650     }
651
652     private Layer4Match prepLayer4MatchTcp() {
653         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
654
655         tcpMatchBuilder.setTcpSourcePort(new PortNumber(21));
656         tcpMatchBuilder.setTcpDestinationPort(new PortNumber(22));
657
658         return tcpMatchBuilder.build();
659     }
660
661     private Layer4Match prepLayer4MatchSctp() {
662         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
663
664         sctpMatchBuilder.setSctpSourcePort(new PortNumber(31));
665         sctpMatchBuilder.setSctpDestinationPort(new PortNumber(32));
666
667         return sctpMatchBuilder.build();
668     }
669
670     private Layer3Match prepLayer3MatchIpv4() {
671         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
672         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.104/32"));
673         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.105/32"));
674         return ipv4MatchBuilder.build();
675     }
676
677     private Layer3Match prepLayer3MatchIpv6() {
678         Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
679         ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7334"));
680         ipv6MatchBuilder.setIpv6Destination(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7335"));
681         return ipv6MatchBuilder.build();
682     }
683
684     private Layer3Match prepLayer3MatchArp() {
685         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
686         arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix("192.168.1.101/32"));
687         arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix("192.168.1.102/32"));
688
689         ArpSourceHardwareAddressBuilder arpSourAddressBuild = new ArpSourceHardwareAddressBuilder();
690         arpSourAddressBuild.setAddress(new MacAddress("22:44:66:88:AA:CC"));
691         arpMatchBuilder.setArpSourceHardwareAddress(arpSourAddressBuild.build());
692
693         ArpTargetHardwareAddressBuilder arpTarAddressBuild = new ArpTargetHardwareAddressBuilder();
694         arpTarAddressBuild.setAddress(new MacAddress("11:33:55:77:BB:DD"));
695         arpMatchBuilder.setArpTargetHardwareAddress(arpTarAddressBuild.build());
696         return arpMatchBuilder.build();
697     }
698
699     private VlanMatch prepVlanMatch() {
700         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
701
702         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder().setVlanId(new VlanId(0xfff));
703         vlanMatchBuilder.setVlanId(vlanIdBuilder.setVlanIdPresent(true).build());
704         vlanMatchBuilder.setVlanPcp(new VlanPcp((short) 0x7));
705
706         return vlanMatchBuilder.build();
707     }
708
709     private VlanMatch prepVlanNoneMatch() {
710         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
711
712         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder().
713             setVlanIdPresent(false);
714         vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
715
716         return vlanMatchBuilder.build();
717     }
718
719     private IpMatch prepIpMatch() {
720         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
721         ipMatchBuilder.setIpDscp(new Dscp((short) 0x33));
722         ipMatchBuilder.setIpProtocol((short) 0x3f);
723         return ipMatchBuilder.build();
724     }
725
726     private EthernetMatch prepEthernetMatch() {
727         EthernetMatchBuilder odEthernetMatchBuilder = new EthernetMatchBuilder();
728         odEthernetMatchBuilder.setEthernetDestination(prepEthDest());
729         odEthernetMatchBuilder.setEthernetSource(prepEthSour());
730         odEthernetMatchBuilder.setEthernetType(prepEthType());
731         return odEthernetMatchBuilder.build();
732     }
733
734     private EthernetType prepEthType() {
735         EthernetTypeBuilder ethTypeBuild = new EthernetTypeBuilder();
736         ethTypeBuild.setType(new EtherType(0xffffL));
737         return ethTypeBuild.build();
738     }
739
740     private EthernetSource prepEthSour() {
741         EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder();
742         ethSourBuild.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
743         return ethSourBuild.build();
744     }
745
746     private EthernetDestination prepEthDest() {
747         EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder();
748         ethDestBuild.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
749         return ethDestBuild.build();
750     }
751 }