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