Bump mdsal to 5.0.2
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertorTest.java
1 /*
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.sal.convertor.match;
10
11 import java.math.BigInteger;
12 import java.util.List;
13 import java.util.Optional;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowplugin.api.OFConstants;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.PacketTypeMatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PacketType;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PacketTypeCase;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;
146 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;
147 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;
148 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;
149
150 /**
151  * Unit tests for match conversion.
152  *
153  * @author michal.polkorab
154  */
155 public class MatchConvertorTest {
156
157     private ConvertorManager converterManager;
158
159     /**
160      * Initializes OpenflowPortsUtil.
161      */
162     @Before
163     public void startUp() {
164         converterManager = ConvertorManagerFactory.createDefaultManager();
165     }
166
167     @Test
168     public void testConversion() {
169         MatchBuilder builder = new MatchBuilder();
170         builder.setInPort(new NodeConnectorId("openflow:42:1"));
171         builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));
172         MetadataBuilder metadataBuilder = new MetadataBuilder();
173         metadataBuilder.setMetadata(new BigInteger("3"));
174         builder.setMetadata(metadataBuilder.build());
175         EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
176         EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
177         ethTypeBuilder.setType(new EtherType(4L));
178         ethernetBuilder.setEthernetType(ethTypeBuilder.build());
179         EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
180         ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
181         ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
182         EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
183         ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
184         ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
185         builder.setEthernetMatch(ethernetBuilder.build());
186         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
187         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
188         vlanIdBuilder.setVlanId(new VlanId(7));
189         vlanIdBuilder.setVlanIdPresent(true);
190         vlanBuilder.setVlanId(vlanIdBuilder.build());
191         vlanBuilder.setVlanPcp(new VlanPcp((short) 7));
192         builder.setVlanMatch(vlanBuilder.build());
193         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
194         ipMatchBuilder.setIpDscp(new Dscp((short) 8));
195         ipMatchBuilder.setIpEcn((short) 9);
196         ipMatchBuilder.setIpProtocol((short) 10);
197         builder.setIpMatch(ipMatchBuilder.build());
198         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
199         tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));
200         tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));
201         builder.setLayer4Match(tcpMatchBuilder.build());
202         Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();
203         icmpv4Builder.setIcmpv4Type((short) 13);
204         icmpv4Builder.setIcmpv4Code((short) 14);
205         builder.setIcmpv4Match(icmpv4Builder.build());
206         Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();
207         icmpv6Builder.setIcmpv6Type((short) 15);
208         icmpv6Builder.setIcmpv6Code((short) 16);
209         builder.setIcmpv6Match(icmpv6Builder.build());
210         ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
211         protoBuilder.setMplsLabel(17L);
212         protoBuilder.setMplsTc((short) 18);
213         protoBuilder.setMplsBos((short) 19);
214         PbbBuilder pbbBuilder = new PbbBuilder();
215         pbbBuilder.setPbbIsid(20L);
216         protoBuilder.setPbb(pbbBuilder.build());
217         builder.setProtocolMatchFields(protoBuilder.build());
218         TunnelBuilder tunnelBuilder = new TunnelBuilder();
219         tunnelBuilder.setTunnelId(new BigInteger("21"));
220         builder.setTunnel(tunnelBuilder.build());
221         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
222         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
223         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
224         builder.setLayer3Match(ipv4MatchBuilder.build());
225         Match match = builder.build();
226
227         Optional<List<MatchEntry>> entriesOptional =
228                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
229         List<MatchEntry> entries = entriesOptional.get();
230         Assert.assertEquals("Wrong entries size", 24, entries.size());
231         MatchEntry entry = entries.get(0);
232         checkEntryHeader(entry, InPort.class, false);
233         Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()
234                 .getPortNumber().getValue().intValue());
235
236         entry = entries.get(1);
237         checkEntryHeader(entry, InPhyPort.class, false);
238         Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue())
239                 .getInPhyPort().getPortNumber().getValue().intValue());
240
241         entry = entries.get(2);
242         checkEntryHeader(entry, Metadata.class, false);
243         Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
244                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
245         entry = entries.get(3);
246         checkEntryHeader(entry, EthDst.class, false);
247         Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
248                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
249         entry = entries.get(4);
250         checkEntryHeader(entry, EthSrc.class, false);
251         Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
252                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
253         entry = entries.get(5);
254         checkEntryHeader(entry, EthType.class, false);
255         Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())
256                 .getEthType().getEthType().getValue().intValue());
257         entry = entries.get(6);
258         checkEntryHeader(entry, VlanVid.class, false);
259         Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())
260                 .getVlanVid().getVlanVid().intValue());
261         Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())
262                 .getVlanVid().isCfiBit());
263         entry = entries.get(7);
264         checkEntryHeader(entry,
265                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);
266         Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())
267                 .getVlanPcp().getVlanPcp().intValue());
268         entry = entries.get(8);
269         checkEntryHeader(entry, IpDscp.class, false);
270         Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())
271                 .getIpDscp().getDscp().getValue().intValue());
272         entry = entries.get(9);
273         checkEntryHeader(entry, IpEcn.class, false);
274         Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())
275                 .getIpEcn().getEcn().intValue());
276         entry = entries.get(10);
277         checkEntryHeader(entry, IpProto.class, false);
278         Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())
279                 .getIpProto().getProtocolNumber().intValue());
280         entry = entries.get(11);
281         checkEntryHeader(entry, TcpSrc.class, false);
282         Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())
283                 .getTcpSrc().getPort().getValue().intValue());
284         entry = entries.get(12);
285         checkEntryHeader(entry, TcpDst.class, false);
286         Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())
287                 .getTcpDst().getPort().getValue().intValue());
288         entry = entries.get(13);
289         checkEntryHeader(entry, Icmpv4Type.class, false);
290         Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())
291                 .getIcmpv4Type().getIcmpv4Type().intValue());
292         entry = entries.get(14);
293         checkEntryHeader(entry, Icmpv4Code.class, false);
294         Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())
295                 .getIcmpv4Code().getIcmpv4Code().intValue());
296         entry = entries.get(15);
297         checkEntryHeader(entry, Icmpv6Type.class, false);
298         Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())
299                 .getIcmpv6Type().getIcmpv6Type().intValue());
300         entry = entries.get(16);
301         checkEntryHeader(entry, Icmpv6Code.class, false);
302         Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())
303                 .getIcmpv6Code().getIcmpv6Code().intValue());
304         entry = entries.get(17);
305         checkEntryHeader(entry, Ipv4Src.class, false);
306         Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())
307                 .getIpv4Src().getIpv4Address().getValue());
308         entry = entries.get(18);
309         checkEntryHeader(entry, Ipv4Dst.class, false);
310         Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())
311                 .getIpv4Dst().getIpv4Address().getValue());
312         entry = entries.get(19);
313         checkEntryHeader(entry, MplsLabel.class, false);
314         Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())
315                 .getMplsLabel().getMplsLabel().intValue());
316         entry = entries.get(20);
317         checkEntryHeader(entry, MplsBos.class, false);
318         Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());
319         entry = entries.get(21);
320         checkEntryHeader(entry, MplsTc.class, false);
321         Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())
322                 .getMplsTc().getTc().intValue());
323         entry = entries.get(22);
324         checkEntryHeader(entry, PbbIsid.class, false);
325         Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
326                 .getPbbIsid().getIsid().intValue());
327         entry = entries.get(23);
328         checkEntryHeader(entry, TunnelId.class, false);
329         Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
330                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
331     }
332
333     private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {
334         Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());
335         Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());
336         Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());
337     }
338
339     @Test
340     public void testIpv4MatchArbitraryBitMaskwithNoMask() {
341         MatchBuilder builder = new MatchBuilder();
342         Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
343         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("10.2.2.2"));
344         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("10.1.1.1"));
345         builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
346         Match match = builder.build();
347
348         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match,
349                 new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
350         List<MatchEntry> entries = entriesOptional.get();
351         Assert.assertEquals("Wrong entries size", 2, entries.size());
352
353         MatchEntry entry = entries.get(0);
354         checkEntryHeader(entry, Ipv4Src.class, false);
355         Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",
356                 ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
357         entry = entries.get(1);
358         checkEntryHeader(entry, Ipv4Dst.class, false);
359         Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",
360                 ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
361     }
362
363     @Test
364     public void testIpv4MatchArbitraryBitMaskwithMask() {
365         Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
366         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("10.2.2.2"));
367         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));
368         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("10.1.1.1"));
369         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));
370
371         MatchBuilder builder = new MatchBuilder();
372         builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
373         Match match = builder.build();
374
375         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match,
376                 new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
377         List<MatchEntry> entries = entriesOptional.get();
378         Assert.assertEquals("Wrong entries size", 2, entries.size());
379
380         MatchEntry entry = entries.get(0);
381         checkEntryHeader(entry, Ipv4Src.class, true);
382         Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",
383                 ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
384         entry = entries.get(1);
385         checkEntryHeader(entry, Ipv4Dst.class, true);
386         Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",
387                 ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
388     }
389
390     @Test
391     public void testUdpMatchConversion() {
392         MatchBuilder builder = new MatchBuilder();
393         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
394         udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
395         udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
396         builder.setLayer4Match(udpMatchBuilder.build());
397         Match match = builder.build();
398
399         Optional<List<MatchEntry>> entriesOptional =
400                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
401         List<MatchEntry> entries = entriesOptional.get();
402         Assert.assertEquals("Wrong entries size", 2, entries.size());
403         MatchEntry entry = entries.get(0);
404         checkEntryHeader(entry, UdpSrc.class, false);
405         Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()
406                 .getPort().getValue().intValue());
407         entry = entries.get(1);
408         checkEntryHeader(entry, UdpDst.class, false);
409         Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())
410                 .getUdpDst().getPort().getValue().intValue());
411     }
412
413     @Test
414     public void testTunnelIpv4MatchConversion() {
415         MatchBuilder builder = new MatchBuilder();
416         TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
417         tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
418         tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
419         builder.setLayer3Match(tunnelIpv4MatchBuilder.build());
420         Match match = builder.build();
421
422         Optional<List<MatchEntry>> entriesOptional =
423                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
424         List<MatchEntry> entries = entriesOptional.get();
425         Assert.assertEquals("Wrong entries size", 2, entries.size());
426         MatchEntry entry = entries.get(0);
427         checkEntryHeader(entry, Ipv4Src.class, false);
428         Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()
429                 .getIpv4Address().getValue());
430         entry = entries.get(1);
431         checkEntryHeader(entry, Ipv4Dst.class, false);
432         Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()
433                 .getIpv4Address().getValue());
434     }
435
436     @Test
437     public void testSctpMatchConversion() {
438         MatchBuilder builder = new MatchBuilder();
439         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
440         sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));
441         sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));
442         builder.setLayer4Match(sctpMatchBuilder.build());
443         Match match = builder.build();
444
445         Optional<List<MatchEntry>> entriesOptional =
446                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
447         List<MatchEntry> entries = entriesOptional.get();
448         Assert.assertEquals("Wrong entries size", 2, entries.size());
449         MatchEntry entry = entries.get(0);
450         checkEntryHeader(entry, SctpSrc.class, false);
451         Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()
452                 .getPort().getValue().intValue());
453         entry = entries.get(1);
454         checkEntryHeader(entry, SctpDst.class, false);
455         Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())
456                 .getSctpDst().getPort().getValue().intValue());
457     }
458
459     @Test
460     public void testArpMatchConversion() {
461         ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
462         arpBuilder.setArpOp(5);
463         arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));
464         arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));
465         ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
466         srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
467         arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
468         ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
469         dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
470         arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
471
472         MatchBuilder builder = new MatchBuilder();
473         builder.setLayer3Match(arpBuilder.build());
474         Match match = builder.build();
475
476         Optional<List<MatchEntry>> entriesOptional =
477                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
478         List<MatchEntry> entries = entriesOptional.get();
479         Assert.assertEquals("Wrong entries size", 5, entries.size());
480         MatchEntry entry = entries.get(0);
481         checkEntryHeader(entry, ArpOp.class, false);
482         Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())
483                 .getArpOp().getOpCode().intValue());
484         entry = entries.get(1);
485         checkEntryHeader(entry, ArpSpa.class, false);
486         Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())
487                 .getArpSpa().getIpv4Address().getValue());
488         entry = entries.get(2);
489         checkEntryHeader(entry, ArpTpa.class, false);
490         Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())
491                 .getArpTpa().getIpv4Address().getValue());
492         entry = entries.get(3);
493         checkEntryHeader(entry, ArpSha.class, false);
494         Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
495                 .getArpSha().getMacAddress().getValue());
496         entry = entries.get(4);
497         checkEntryHeader(entry, ArpTha.class, false);
498         Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())
499                 .getArpTha().getMacAddress().getValue());
500     }
501
502     @Test
503     public void testArpMatchConversionWithMasks() {
504         ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
505         /* Use canonnical prefixes !!! */
506         arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));
507         arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));
508         ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
509         srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
510         srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
511         arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
512         ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
513         dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
514         dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
515         arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
516
517         MatchBuilder builder = new MatchBuilder();
518         builder.setLayer3Match(arpBuilder.build());
519         Match match = builder.build();
520
521         Optional<List<MatchEntry>> entriesOptional =
522                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
523         List<MatchEntry> entries = entriesOptional.get();
524         Assert.assertEquals("Wrong entries size", 4, entries.size());
525         MatchEntry entry = entries.get(0);
526         entry = entries.get(0);
527         checkEntryHeader(entry, ArpSpa.class, true);
528         Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())
529                 .getArpSpa().getIpv4Address().getValue());
530         Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},
531                 ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());
532         entry = entries.get(1);
533         checkEntryHeader(entry, ArpTpa.class, true);
534         Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()
535                 .getIpv4Address().getValue());
536         Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},
537                 ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());
538         entry = entries.get(2);
539         checkEntryHeader(entry, ArpSha.class, true);
540         Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
541                 .getArpSha().getMacAddress().getValue());
542         Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},
543                 ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());
544         entry = entries.get(3);
545         checkEntryHeader(entry, ArpTha.class, true);
546         Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()
547                 .getMacAddress().getValue());
548         Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},
549                 ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());
550     }
551
552     @Test
553     public void testIpv6MatchConversion() {
554         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
555         ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));
556         ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));
557         Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
558         ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));
559         ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());
560         ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));
561         ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));
562         ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));
563         Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
564         extHdrBuilder.setIpv6Exthdr(153);
565         ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
566
567         MatchBuilder builder = new MatchBuilder();
568         builder.setLayer3Match(ipv6Builder.build());
569         Match match = builder.build();
570
571         Optional<List<MatchEntry>> entriesOptional =
572                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
573         List<MatchEntry> entries = entriesOptional.get();
574         Assert.assertEquals("Wrong entries size", 7, entries.size());
575         MatchEntry entry = entries.get(0);
576         /* Due to conversion ambiguities, we always get "has mask" because
577          * an ip with no mask and prefix with /128 (or 32 in v4) cannot
578          * be distinguished */
579         checkEntryHeader(entry, Ipv6Src.class, false);
580         Assert.assertEquals("Wrong ipv6 src", "::1",
581                 ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
582         entry = entries.get(1);
583         checkEntryHeader(entry, Ipv6Dst.class, false);
584         Assert.assertEquals("Wrong ipv6 dst", "::2",
585                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
586         entry = entries.get(2);
587         checkEntryHeader(entry, Ipv6Flabel.class, false);
588         Assert.assertEquals("Wrong ipv6 flabel", 3,
589                 ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());
590         entry = entries.get(3);
591         checkEntryHeader(entry, Ipv6NdTarget.class, false);
592         Assert.assertEquals("Wrong ipv6 nd target", "::4",
593                 ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());
594         entry = entries.get(4);
595         checkEntryHeader(entry, Ipv6NdSll.class, false);
596         Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",
597                 ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());
598         entry = entries.get(5);
599         checkEntryHeader(entry, Ipv6NdTll.class, false);
600         Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",
601                 ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());
602         entry = entries.get(6);
603         checkEntryHeader(entry, Ipv6Exthdr.class, false);
604         Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,
605             true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
606     }
607
608     @Test
609     public void testIpv6MatchConversionWithMasks() {
610         MatchBuilder builder = new MatchBuilder();
611         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
612         ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));
613         ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));
614         builder.setLayer3Match(ipv6Builder.build());
615         Match match = builder.build();
616
617         Optional<List<MatchEntry>> entriesOptional =
618                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
619         List<MatchEntry> entries = entriesOptional.get();
620         Assert.assertEquals("Wrong entries size", 2, entries.size());
621         MatchEntry entry = entries.get(0);
622         checkEntryHeader(entry, Ipv6Src.class, true);
623         Assert.assertEquals("Wrong ipv6 src", "::",
624                 ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
625         Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,
626             0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());
627         entry = entries.get(1);
628         checkEntryHeader(entry, Ipv6Dst.class, true);
629         Assert.assertEquals("Wrong ipv6 dst", "::",
630                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
631         Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,
632             (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},
633             ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());
634     }
635
636     @Test
637     public void testIpv6ExtHeaderConversion() {
638         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
639         Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
640         extHdrBuilder.setIpv6Exthdr(358);
641         extHdrBuilder.setIpv6ExthdrMask(258);
642         ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
643
644         MatchBuilder builder = new MatchBuilder();
645         builder.setLayer3Match(ipv6Builder.build());
646         Match match = builder.build();
647
648         Optional<List<MatchEntry>> entriesOptional =
649                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
650         List<MatchEntry> entries = entriesOptional.get();
651         Assert.assertEquals("Wrong entries size", 1, entries.size());
652         MatchEntry entry = entries.get(0);
653         checkEntryHeader(entry, Ipv6Exthdr.class, true);
654         Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,
655                 true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
656         Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},
657                 ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());
658     }
659
660     @Test
661     public void testConversionWithMasks() {
662         MatchBuilder builder = new MatchBuilder();
663         MetadataBuilder metadataBuilder = new MetadataBuilder();
664         metadataBuilder.setMetadata(new BigInteger("3"));
665         metadataBuilder.setMetadataMask(new BigInteger("15"));
666         builder.setMetadata(metadataBuilder.build());
667         EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
668         EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
669         ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
670         ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
671         ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
672         EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
673         ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
674         ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
675         ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
676         builder.setEthernetMatch(ethernetBuilder.build());
677         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
678         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
679         vlanIdBuilder.setVlanId(new VlanId(0));
680         vlanIdBuilder.setVlanIdPresent(true);
681         vlanBuilder.setVlanId(vlanIdBuilder.build());
682         builder.setVlanMatch(vlanBuilder.build());
683         ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
684         PbbBuilder pbbBuilder = new PbbBuilder();
685         pbbBuilder.setPbbIsid(20L);
686         pbbBuilder.setPbbMask(8L);
687         protoBuilder.setPbb(pbbBuilder.build());
688         builder.setProtocolMatchFields(protoBuilder.build());
689         TunnelBuilder tunnelBuilder = new TunnelBuilder();
690         tunnelBuilder.setTunnelId(new BigInteger("21"));
691         tunnelBuilder.setTunnelMask(new BigInteger("14"));
692         builder.setTunnel(tunnelBuilder.build());
693         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
694         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));
695         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));
696         builder.setLayer3Match(ipv4MatchBuilder.build());
697         Match match = builder.build();
698
699         Optional<List<MatchEntry>> entriesOptional =
700                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
701         List<MatchEntry> entries = entriesOptional.get();
702         Assert.assertEquals("Wrong entries size", 8, entries.size());
703         MatchEntry entry = entries.get(0);
704         checkEntryHeader(entry, Metadata.class, true);
705         Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
706                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
707         Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},
708                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());
709         entry = entries.get(1);
710         checkEntryHeader(entry, EthDst.class, true);
711         Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
712                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
713         Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},
714                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());
715         entry = entries.get(2);
716         checkEntryHeader(entry, EthSrc.class, true);
717         Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
718                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
719         Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},
720                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());
721         entry = entries.get(3);
722         checkEntryHeader(entry, VlanVid.class, true);
723         Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
724                 .getVlanVid().intValue());
725         Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
726                 .isCfiBit());
727         Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},
728                 ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());
729         entry = entries.get(4);
730         checkEntryHeader(entry, Ipv4Src.class, true);
731         Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())
732                 .getIpv4Src().getIpv4Address().getValue());
733         Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},
734                 ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());
735         entry = entries.get(5);
736         checkEntryHeader(entry, Ipv4Dst.class, true);
737         Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())
738                 .getIpv4Dst().getIpv4Address().getValue());
739         Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},
740                 ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());
741         entry = entries.get(6);
742         checkEntryHeader(entry, PbbIsid.class, true);
743         Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
744                 .getPbbIsid().getIsid().intValue());
745         Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},
746                 ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());
747         entry = entries.get(7);
748         checkEntryHeader(entry, TunnelId.class, true);
749         Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
750                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
751         Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},
752                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());
753     }
754
755     @Test
756     public void testIpv6MatchArbitraryBitMask() {
757         Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
758         ipv6MatchArbitraryBitMaskBuilder
759                 .setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
760         ipv6MatchArbitraryBitMaskBuilder
761                 .setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
762         ipv6MatchArbitraryBitMaskBuilder
763                 .setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
764         ipv6MatchArbitraryBitMaskBuilder
765                 .setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
766
767         MatchBuilder builder = new MatchBuilder();
768         builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
769         Match match = builder.build();
770
771         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match,
772                 new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
773         List<MatchEntry> entries = entriesOptional.get();
774         Assert.assertEquals("Wrong entries size", 2, entries.size());
775
776         MatchEntry entry = entries.get(0);
777         checkEntryHeader(entry, Ipv6Src.class, true);
778         Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",
779                 ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
780         entry = entries.get(1);
781         checkEntryHeader(entry, Ipv6Dst.class, true);
782         Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",
783                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
784     }
785
786     @Test
787     public void testPacketTypeConversion() {
788         MatchBuilder builder = new MatchBuilder();
789         builder.setPacketTypeMatch(new PacketTypeMatchBuilder().setPacketType(0x1894fL).build());
790         Match match = builder.build();
791
792         Optional<List<MatchEntry>> entriesOptional =
793                 converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
794         List<MatchEntry> entries = entriesOptional.get();
795         Assert.assertEquals("Wrong entries size", 1, entries.size());
796         MatchEntry entry = entries.get(0);
797         checkEntryHeader(entry, PacketType.class, false);
798         Assert.assertEquals("Wrong in port", 0x1894f,
799                 ((PacketTypeCase) entry.getMatchEntryValue()).getPacketType().getPacketType().longValue());
800     }
801 }
802