2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowjava.protocol.impl.util;
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.UnpooledByteBufAllocator;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
21 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
22 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
23 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;
128 * @author michal.polkorab
131 public class OF13MatchSerializer02Test {
133 private SerializerRegistry registry;
134 private OFSerializer<Match> matchSerializer;
137 * Initializes serializer table and stores correct factory in field
140 public void startUp() {
141 registry = new SerializerRegistryImpl();
143 matchSerializer = registry.getSerializer(
144 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Match.class));
148 * Testing serialization of match
151 public void testEmptyMatch() {
152 MatchBuilder builder = new MatchBuilder();
153 builder.setType(OxmMatchType.class);
154 Match match = builder.build();
156 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
157 matchSerializer.serialize(match, out);
159 Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());
160 Assert.assertEquals("Wrong match length", 4, out.readUnsignedShort());
161 Assert.assertTrue("Wrong padding", out.readableBytes() == 4);
165 * Testing serialization of match
169 MatchBuilder builder = new MatchBuilder();
170 builder.setType(OxmMatchType.class);
171 List<MatchEntries> entries = new ArrayList<>();
172 MatchEntriesBuilder entryBuilder = new MatchEntriesBuilder();
173 entryBuilder.setOxmClass(OpenflowBasicClass.class);
174 entryBuilder.setOxmMatchField(InPort.class);
175 entryBuilder.setHasMask(false);
176 PortNumberMatchEntryBuilder portNumberBuilder = new PortNumberMatchEntryBuilder();
177 portNumberBuilder.setPortNumber(new PortNumber(42L));
178 entryBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());
179 entries.add(entryBuilder.build());
180 entryBuilder = new MatchEntriesBuilder();
181 entryBuilder.setOxmClass(OpenflowBasicClass.class);
182 entryBuilder.setOxmMatchField(InPhyPort.class);
183 entryBuilder.setHasMask(false);
184 portNumberBuilder = new PortNumberMatchEntryBuilder();
185 portNumberBuilder.setPortNumber(new PortNumber(43L));
186 entryBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());
187 entries.add(entryBuilder.build());
188 entryBuilder = new MatchEntriesBuilder();
189 entryBuilder.setOxmClass(OpenflowBasicClass.class);
190 entryBuilder.setOxmMatchField(Metadata.class);
191 entryBuilder.setHasMask(true);
192 MetadataMatchEntryBuilder metadataBuilder = new MetadataMatchEntryBuilder();
193 metadataBuilder.setMetadata(new byte[]{0,0,0,0,0,0,0,1});
194 entryBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());
195 MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();
196 maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});
197 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
198 entries.add(entryBuilder.build());
199 entryBuilder = new MatchEntriesBuilder();
200 entryBuilder.setOxmClass(OpenflowBasicClass.class);
201 entryBuilder.setOxmMatchField(EthDst.class);
202 entryBuilder.setHasMask(true);
203 MacAddressMatchEntryBuilder macBuilder = new MacAddressMatchEntryBuilder();
204 macBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));
205 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
206 maskBuilder = new MaskMatchEntryBuilder();
207 maskBuilder.setMask(new byte[]{0,0,0,0,0,5});
208 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
209 entries.add(entryBuilder.build());
210 entryBuilder = new MatchEntriesBuilder();
211 entryBuilder.setOxmClass(OpenflowBasicClass.class);
212 entryBuilder.setOxmMatchField(EthSrc.class);
213 entryBuilder.setHasMask(true);
214 macBuilder = new MacAddressMatchEntryBuilder();
215 macBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));
216 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
217 maskBuilder = new MaskMatchEntryBuilder();
218 maskBuilder.setMask(new byte[]{0,0,0,0,0,2});
219 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
220 entries.add(entryBuilder.build());
221 entryBuilder = new MatchEntriesBuilder();
222 entryBuilder.setOxmClass(OpenflowBasicClass.class);
223 entryBuilder.setOxmMatchField(EthType.class);
224 entryBuilder.setHasMask(false);
225 EthTypeMatchEntryBuilder ethBuilder = new EthTypeMatchEntryBuilder();
226 ethBuilder.setEthType(new EtherType(46));
227 entryBuilder.addAugmentation(EthTypeMatchEntry.class, ethBuilder.build());
228 entries.add(entryBuilder.build());
229 entryBuilder = new MatchEntriesBuilder();
230 entryBuilder.setOxmClass(OpenflowBasicClass.class);
231 entryBuilder.setOxmMatchField(VlanVid.class);
232 entryBuilder.setHasMask(true);
233 VlanVidMatchEntryBuilder vidBuilder = new VlanVidMatchEntryBuilder();
234 vidBuilder.setCfiBit(true);
235 vidBuilder.setVlanVid(45);
236 entryBuilder.addAugmentation(VlanVidMatchEntry.class, vidBuilder.build());
237 maskBuilder = new MaskMatchEntryBuilder();
238 maskBuilder.setMask(new byte[]{0,9});
239 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
240 entries.add(entryBuilder.build());
241 entryBuilder = new MatchEntriesBuilder();
242 entryBuilder.setOxmClass(OpenflowBasicClass.class);
243 entryBuilder.setOxmMatchField(VlanPcp.class);
244 entryBuilder.setHasMask(false);
245 VlanPcpMatchEntryBuilder pcpBuilder = new VlanPcpMatchEntryBuilder();
246 pcpBuilder.setVlanPcp((short) 14);
247 entryBuilder.addAugmentation(VlanPcpMatchEntry.class, pcpBuilder.build());
248 entries.add(entryBuilder.build());
249 entryBuilder = new MatchEntriesBuilder();
250 entryBuilder.setOxmClass(OpenflowBasicClass.class);
251 entryBuilder.setOxmMatchField(IpDscp.class);
252 entryBuilder.setHasMask(false);
253 DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();
254 dscpBuilder.setDscp(new Dscp((short) 48));
255 entryBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());
256 entries.add(entryBuilder.build());
257 entryBuilder = new MatchEntriesBuilder();
258 entryBuilder.setOxmClass(OpenflowBasicClass.class);
259 entryBuilder.setOxmMatchField(IpEcn.class);
260 entryBuilder.setHasMask(false);
261 EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();
262 ecnBuilder.setEcn((short) 49);
263 entryBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());
264 entries.add(entryBuilder.build());
265 entryBuilder = new MatchEntriesBuilder();
266 entryBuilder.setOxmClass(OpenflowBasicClass.class);
267 entryBuilder.setOxmMatchField(IpProto.class);
268 entryBuilder.setHasMask(false);
269 ProtocolNumberMatchEntryBuilder protoBuilder = new ProtocolNumberMatchEntryBuilder();
270 protoBuilder.setProtocolNumber((short) 50);
271 entryBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoBuilder.build());
272 entries.add(entryBuilder.build());
273 entryBuilder = new MatchEntriesBuilder();
274 entryBuilder.setOxmClass(OpenflowBasicClass.class);
275 entryBuilder.setOxmMatchField(Ipv4Src.class);
276 entryBuilder.setHasMask(true);
277 Ipv4AddressMatchEntryBuilder ipv4Builder = new Ipv4AddressMatchEntryBuilder();
278 ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.1"));
279 entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());
280 maskBuilder = new MaskMatchEntryBuilder();
281 maskBuilder.setMask(new byte[]{0,0,0,14});
282 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
283 entries.add(entryBuilder.build());
284 entryBuilder = new MatchEntriesBuilder();
285 entryBuilder.setOxmClass(OpenflowBasicClass.class);
286 entryBuilder.setOxmMatchField(Ipv4Dst.class);
287 entryBuilder.setHasMask(true);
288 ipv4Builder = new Ipv4AddressMatchEntryBuilder();
289 ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.2"));
290 entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());
291 maskBuilder = new MaskMatchEntryBuilder();
292 maskBuilder.setMask(new byte[]{0,0,0,15});
293 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
294 entries.add(entryBuilder.build());
295 entryBuilder = new MatchEntriesBuilder();
296 entryBuilder.setOxmClass(OpenflowBasicClass.class);
297 entryBuilder.setOxmMatchField(TcpSrc.class);
298 entryBuilder.setHasMask(false);
299 PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();
300 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
301 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6653));
302 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
303 entries.add(entryBuilder.build());
304 entryBuilder = new MatchEntriesBuilder();
305 entryBuilder.setOxmClass(OpenflowBasicClass.class);
306 entryBuilder.setOxmMatchField(TcpDst.class);
307 entryBuilder.setHasMask(false);
308 portBuilder = new PortMatchEntryBuilder();
309 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
310 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6654));
311 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
312 entries.add(entryBuilder.build());
313 entryBuilder = new MatchEntriesBuilder();
314 entryBuilder.setOxmClass(OpenflowBasicClass.class);
315 entryBuilder.setOxmMatchField(UdpSrc.class);
316 entryBuilder.setHasMask(false);
317 portBuilder = new PortMatchEntryBuilder();
318 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
319 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6655));
320 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
321 entries.add(entryBuilder.build());
322 entryBuilder = new MatchEntriesBuilder();
323 entryBuilder.setOxmClass(OpenflowBasicClass.class);
324 entryBuilder.setOxmMatchField(UdpDst.class);
325 entryBuilder.setHasMask(false);
326 portBuilder = new PortMatchEntryBuilder();
327 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
328 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6656));
329 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
330 entries.add(entryBuilder.build());
331 entryBuilder = new MatchEntriesBuilder();
332 entryBuilder.setOxmClass(OpenflowBasicClass.class);
333 entryBuilder.setOxmMatchField(SctpSrc.class);
334 entryBuilder.setHasMask(false);
335 portBuilder = new PortMatchEntryBuilder();
336 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
337 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6657));
338 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
339 entries.add(entryBuilder.build());
340 entryBuilder = new MatchEntriesBuilder();
341 entryBuilder.setOxmClass(OpenflowBasicClass.class);
342 entryBuilder.setOxmMatchField(SctpDst.class);
343 entryBuilder.setHasMask(false);
344 portBuilder = new PortMatchEntryBuilder();
345 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
346 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6658));
347 entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());
348 entries.add(entryBuilder.build());
349 entryBuilder = new MatchEntriesBuilder();
350 entryBuilder.setOxmClass(OpenflowBasicClass.class);
351 entryBuilder.setOxmMatchField(Icmpv4Type.class);
352 entryBuilder.setHasMask(false);
353 Icmpv4TypeMatchEntryBuilder icmpv4typeBuilder = new Icmpv4TypeMatchEntryBuilder();
354 icmpv4typeBuilder.setIcmpv4Type((short) 51);
355 entryBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4typeBuilder.build());
356 entries.add(entryBuilder.build());
357 entryBuilder = new MatchEntriesBuilder();
358 entryBuilder.setOxmClass(OpenflowBasicClass.class);
359 entryBuilder.setOxmMatchField(Icmpv4Code.class);
360 entryBuilder.setHasMask(false);
361 Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();
362 icmpv4CodeBuilder.setIcmpv4Code((short) 52);
363 entryBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());
364 entries.add(entryBuilder.build());
365 entryBuilder = new MatchEntriesBuilder();
366 entryBuilder.setOxmClass(OpenflowBasicClass.class);
367 entryBuilder.setOxmMatchField(ArpOp.class);
368 entryBuilder.setHasMask(false);
369 OpCodeMatchEntryBuilder opBuilder = new OpCodeMatchEntryBuilder();
370 opBuilder.setOpCode(53);
371 entryBuilder.addAugmentation(OpCodeMatchEntry.class, opBuilder.build());
372 entries.add(entryBuilder.build());
373 entryBuilder = new MatchEntriesBuilder();
374 entryBuilder.setOxmClass(OpenflowBasicClass.class);
375 entryBuilder.setOxmMatchField(ArpSpa.class);
376 entryBuilder.setHasMask(true);
377 ipv4Builder = new Ipv4AddressMatchEntryBuilder();
378 ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.4"));
379 entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());
380 maskBuilder = new MaskMatchEntryBuilder();
381 maskBuilder.setMask(new byte[]{0,0,0,16});
382 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
383 entries.add(entryBuilder.build());
384 entryBuilder = new MatchEntriesBuilder();
385 entryBuilder.setOxmClass(OpenflowBasicClass.class);
386 entryBuilder.setOxmMatchField(ArpTpa.class);
387 entryBuilder.setHasMask(true);
388 ipv4Builder = new Ipv4AddressMatchEntryBuilder();
389 ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.5"));
390 entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());
391 maskBuilder = new MaskMatchEntryBuilder();
392 maskBuilder.setMask(new byte[]{0,0,0,17});
393 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
394 entries.add(entryBuilder.build());
395 entryBuilder = new MatchEntriesBuilder();
396 entryBuilder.setOxmClass(OpenflowBasicClass.class);
397 entryBuilder.setOxmMatchField(ArpSha.class);
398 entryBuilder.setHasMask(true);
399 macBuilder = new MacAddressMatchEntryBuilder();
400 macBuilder.setMacAddress(new MacAddress("00:01:02:03:04:05"));
401 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
402 maskBuilder = new MaskMatchEntryBuilder();
403 maskBuilder.setMask(new byte[]{0,0,4,0,0,6});
404 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
405 entries.add(entryBuilder.build());
406 entryBuilder = new MatchEntriesBuilder();
407 entryBuilder.setOxmClass(OpenflowBasicClass.class);
408 entryBuilder.setOxmMatchField(ArpTha.class);
409 entryBuilder.setHasMask(true);
410 macBuilder = new MacAddressMatchEntryBuilder();
411 macBuilder.setMacAddress(new MacAddress("00:00:00:00:00:03"));
412 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
413 maskBuilder = new MaskMatchEntryBuilder();
414 maskBuilder.setMask(new byte[]{0,0,6,0,0,4});
415 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
416 entries.add(entryBuilder.build());
417 entryBuilder = new MatchEntriesBuilder();
418 entryBuilder.setOxmClass(OpenflowBasicClass.class);
419 entryBuilder.setOxmMatchField(Ipv6Src.class);
420 entryBuilder.setHasMask(true);
421 Ipv6AddressMatchEntryBuilder ipv6Builder = new Ipv6AddressMatchEntryBuilder();
422 ipv6Builder.setIpv6Address(new Ipv6Address("0:0:0:0:0:0:0:1"));
423 entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());
424 maskBuilder = new MaskMatchEntryBuilder();
425 maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1});
426 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
427 entries.add(entryBuilder.build());
428 entryBuilder = new MatchEntriesBuilder();
429 entryBuilder.setOxmClass(OpenflowBasicClass.class);
430 entryBuilder.setOxmMatchField(Ipv6Dst.class);
431 entryBuilder.setHasMask(true);
432 ipv6Builder = new Ipv6AddressMatchEntryBuilder();
433 ipv6Builder.setIpv6Address(new Ipv6Address("0:0:1:0:1:0:0:1"));
434 entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());
435 maskBuilder = new MaskMatchEntryBuilder();
436 maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1});
437 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
438 entries.add(entryBuilder.build());
439 entryBuilder = new MatchEntriesBuilder();
440 entryBuilder.setOxmClass(OpenflowBasicClass.class);
441 entryBuilder.setOxmMatchField(Ipv6Flabel.class);
442 entryBuilder.setHasMask(true);
443 Ipv6FlabelMatchEntryBuilder flabelBuilder = new Ipv6FlabelMatchEntryBuilder();
444 flabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(58L));
445 entryBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, flabelBuilder.build());
446 maskBuilder = new MaskMatchEntryBuilder();
447 maskBuilder.setMask(new byte[]{0,1,0,2});
448 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
449 entries.add(entryBuilder.build());
450 entryBuilder = new MatchEntriesBuilder();
451 entryBuilder.setOxmClass(OpenflowBasicClass.class);
452 entryBuilder.setOxmMatchField(Icmpv6Type.class);
453 entryBuilder.setHasMask(false);
454 Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();
455 icmpv6TypeBuilder.setIcmpv6Type((short) 59);
456 entryBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());
457 entries.add(entryBuilder.build());
458 entryBuilder = new MatchEntriesBuilder();
459 entryBuilder.setOxmClass(OpenflowBasicClass.class);
460 entryBuilder.setOxmMatchField(Icmpv6Code.class);
461 entryBuilder.setHasMask(false);
462 Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();
463 icmpv6CodeBuilder.setIcmpv6Code((short) 60);
464 entryBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());
465 entries.add(entryBuilder.build());
466 entryBuilder.setOxmClass(OpenflowBasicClass.class);
467 entryBuilder.setOxmMatchField(Ipv6NdTarget.class);
468 entryBuilder.setHasMask(false);
469 ipv6Builder = new Ipv6AddressMatchEntryBuilder();
470 ipv6Builder.setIpv6Address(new Ipv6Address("F:0:0::0:0:0:1"));
471 entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());
472 entries.add(entryBuilder.build());
473 entryBuilder = new MatchEntriesBuilder();
474 entryBuilder.setOxmClass(OpenflowBasicClass.class);
475 entryBuilder.setOxmMatchField(Ipv6NdSll.class);
476 entryBuilder.setHasMask(false);
477 macBuilder = new MacAddressMatchEntryBuilder();
478 macBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));
479 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
480 entries.add(entryBuilder.build());
481 entryBuilder = new MatchEntriesBuilder();
482 entryBuilder.setOxmClass(OpenflowBasicClass.class);
483 entryBuilder.setOxmMatchField(Ipv6NdTll.class);
484 entryBuilder.setHasMask(false);
485 macBuilder = new MacAddressMatchEntryBuilder();
486 macBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));
487 entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());
488 entries.add(entryBuilder.build());
489 entryBuilder = new MatchEntriesBuilder();
490 entryBuilder.setOxmClass(OpenflowBasicClass.class);
491 entryBuilder.setOxmMatchField(MplsLabel.class);
492 entryBuilder.setHasMask(false);
493 MplsLabelMatchEntryBuilder labelBuilder = new MplsLabelMatchEntryBuilder();
494 labelBuilder.setMplsLabel(61L);
495 entryBuilder.addAugmentation(MplsLabelMatchEntry.class, labelBuilder.build());
496 entries.add(entryBuilder.build());
497 entryBuilder = new MatchEntriesBuilder();
498 entryBuilder.setOxmClass(OpenflowBasicClass.class);
499 entryBuilder.setOxmMatchField(MplsTc.class);
500 entryBuilder.setHasMask(false);
501 TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();
502 tcBuilder.setTc((short) 62);
503 entryBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());
504 entries.add(entryBuilder.build());
505 entryBuilder = new MatchEntriesBuilder();
506 entryBuilder.setOxmClass(OpenflowBasicClass.class);
507 entryBuilder.setOxmMatchField(MplsBos.class);
508 entryBuilder.setHasMask(false);
509 BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();
510 bosBuilder.setBos(true);
511 entryBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());
512 entries.add(entryBuilder.build());
514 entryBuilder = new MatchEntriesBuilder();
515 entryBuilder.setOxmClass(OpenflowBasicClass.class);
516 entryBuilder.setOxmMatchField(PbbIsid.class);
517 entryBuilder.setHasMask(true);
518 IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();
519 isidBuilder.setIsid(64L);
520 entryBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());
521 maskBuilder = new MaskMatchEntryBuilder();
522 maskBuilder.setMask(new byte[]{0,1,2});
523 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
524 entries.add(entryBuilder.build());
526 entryBuilder = new MatchEntriesBuilder();
527 entryBuilder.setOxmClass(OpenflowBasicClass.class);
528 entryBuilder.setOxmMatchField(TunnelId.class);
529 entryBuilder.setHasMask(true);
530 metadataBuilder = new MetadataMatchEntryBuilder();
531 metadataBuilder.setMetadata(new byte[]{0,0,0,0,0,0,0,1});
532 entryBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());
533 maskBuilder = new MaskMatchEntryBuilder();
534 maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});
535 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
536 entries.add(entryBuilder.build());
538 entryBuilder = new MatchEntriesBuilder();
539 entryBuilder.setOxmClass(OpenflowBasicClass.class);
540 entryBuilder.setOxmMatchField(Ipv6Exthdr.class);
541 entryBuilder.setHasMask(true);
542 PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();
543 pseudoBuilder.setPseudoField(new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true));
544 entryBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());
545 maskBuilder = new MaskMatchEntryBuilder();
546 maskBuilder.setMask(new byte[]{0,2});
547 entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
548 entries.add(entryBuilder.build());
552 builder.setMatchEntries(entries);
553 Match match = builder.build();
555 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
556 matchSerializer.serialize(match, out);
558 Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());
559 Assert.assertEquals("Wrong match length", 428, out.readUnsignedShort());
560 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
561 Assert.assertEquals("Wrong match entry field & hasMask", 0, out.readUnsignedByte());
562 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
563 Assert.assertEquals("Wrong match entry value", 42, out.readUnsignedInt());
564 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
565 Assert.assertEquals("Wrong match entry field & hasMask", 2, out.readUnsignedByte());
566 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
567 Assert.assertEquals("Wrong match entry value", 43, out.readUnsignedInt());
568 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
569 Assert.assertEquals("Wrong match entry field & hasMask", 5, out.readUnsignedByte());
570 Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
571 Assert.assertEquals("Wrong match entry value", 1L, out.readLong());
572 Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());
573 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
574 Assert.assertEquals("Wrong match entry field & hasMask", 7, out.readUnsignedByte());
575 Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
576 byte[] array = new byte[6];
577 out.readBytes(array);
578 Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);
580 out.readBytes(array);
581 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,5}, array);
582 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
583 Assert.assertEquals("Wrong match entry field & hasMask", 9, out.readUnsignedByte());
584 Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
586 out.readBytes(array);
587 Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);
589 out.readBytes(array);
590 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,2}, array);
591 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
592 Assert.assertEquals("Wrong match entry field & hasMask", 10, out.readUnsignedByte());
593 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
594 Assert.assertEquals("Wrong match entry value", 46, out.readUnsignedShort());
595 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
596 Assert.assertEquals("Wrong match entry field & hasMask", 13, out.readUnsignedByte());
597 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
598 Assert.assertEquals("Wrong match entry value", 4141, out.readUnsignedShort());
600 out.readBytes(array);
601 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,9}, array);
602 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
603 Assert.assertEquals("Wrong match entry field & hasMask", 14, out.readUnsignedByte());
604 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
605 Assert.assertEquals("Wrong match entry value", 14, out.readUnsignedByte());
606 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
607 Assert.assertEquals("Wrong match entry field & hasMask", 16, out.readUnsignedByte());
608 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
609 Assert.assertEquals("Wrong match entry value", 48, out.readUnsignedByte());
610 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
611 Assert.assertEquals("Wrong match entry field & hasMask", 18, out.readUnsignedByte());
612 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
613 Assert.assertEquals("Wrong match entry value", 49, out.readUnsignedByte());
614 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
615 Assert.assertEquals("Wrong match entry field & hasMask", 20, out.readUnsignedByte());
616 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
617 Assert.assertEquals("Wrong match entry value", 50, out.readUnsignedByte());
618 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
619 Assert.assertEquals("Wrong match entry field & hasMask", 23, out.readUnsignedByte());
620 Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
622 out.readBytes(array);
623 Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,1}, array);
625 out.readBytes(array);
626 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,14}, array);
627 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
628 Assert.assertEquals("Wrong match entry field & hasMask", 25, out.readUnsignedByte());
629 Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
631 out.readBytes(array);
632 Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,2}, array);
634 out.readBytes(array);
635 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,15}, array);
636 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
637 Assert.assertEquals("Wrong match entry field & hasMask", 26, out.readUnsignedByte());
638 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
639 Assert.assertEquals("Wrong match entry value", 6653, out.readUnsignedShort());
640 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
641 Assert.assertEquals("Wrong match entry field & hasMask", 28, out.readUnsignedByte());
642 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
643 Assert.assertEquals("Wrong match entry value", 6654, out.readUnsignedShort());
644 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
645 Assert.assertEquals("Wrong match entry field & hasMask", 30, out.readUnsignedByte());
646 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
647 Assert.assertEquals("Wrong match entry value", 6655, out.readUnsignedShort());
648 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
649 Assert.assertEquals("Wrong match entry field & hasMask", 32, out.readUnsignedByte());
650 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
651 Assert.assertEquals("Wrong match entry value", 6656, out.readUnsignedShort());
652 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
653 Assert.assertEquals("Wrong match entry field & hasMask", 34, out.readUnsignedByte());
654 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
655 Assert.assertEquals("Wrong match entry value", 6657, out.readUnsignedShort());
656 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
657 Assert.assertEquals("Wrong match entry field & hasMask", 36, out.readUnsignedByte());
658 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
659 Assert.assertEquals("Wrong match entry value", 6658, out.readUnsignedShort());
660 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
661 Assert.assertEquals("Wrong match entry field & hasMask", 38, out.readUnsignedByte());
662 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
663 Assert.assertEquals("Wrong match entry value", 51, out.readUnsignedByte());
664 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
665 Assert.assertEquals("Wrong match entry field & hasMask", 40, out.readUnsignedByte());
666 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
667 Assert.assertEquals("Wrong match entry value", 52, out.readUnsignedByte());
668 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
669 Assert.assertEquals("Wrong match entry field & hasMask", 42, out.readUnsignedByte());
670 Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
671 Assert.assertEquals("Wrong match entry value", 53, out.readUnsignedShort());
672 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
673 Assert.assertEquals("Wrong match entry field & hasMask", 45, out.readUnsignedByte());
674 Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
676 out.readBytes(array);
677 Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,4}, array);
679 out.readBytes(array);
680 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,16}, array);
681 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
682 Assert.assertEquals("Wrong match entry field & hasMask", 47, out.readUnsignedByte());
683 Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
685 out.readBytes(array);
686 Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,5}, array);
688 out.readBytes(array);
689 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,17}, array);
690 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
691 Assert.assertEquals("Wrong match entry field & hasMask", 49, out.readUnsignedByte());
692 Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
694 out.readBytes(array);
695 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,1,2,3,4,5}, array);
697 out.readBytes(array);
698 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,4,0,0,6}, array);
699 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
700 Assert.assertEquals("Wrong match entry field & hasMask", 51, out.readUnsignedByte());
701 Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
703 out.readBytes(array);
704 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,3}, array);
706 out.readBytes(array);
707 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,6,0,0,4}, array);
708 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
709 Assert.assertEquals("Wrong match entry field & hasMask", 53, out.readUnsignedByte());
710 Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());
711 array = new byte[16];
712 out.readBytes(array);
713 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);
714 array = new byte[16];
715 out.readBytes(array);
716 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);
717 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
718 Assert.assertEquals("Wrong match entry field & hasMask", 55, out.readUnsignedByte());
719 Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());
720 array = new byte[16];
721 out.readBytes(array);
722 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1}, array);
723 array = new byte[16];
724 out.readBytes(array);
725 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1}, array);
726 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
727 Assert.assertEquals("Wrong match entry field & hasMask", 57, out.readUnsignedByte());
728 Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
729 Assert.assertEquals("Wrong match entry value", 58, out.readUnsignedInt());
731 out.readBytes(array);
732 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,1,0,2}, array);
733 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
734 Assert.assertEquals("Wrong match entry field & hasMask", 58, out.readUnsignedByte());
735 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
736 Assert.assertEquals("Wrong match entry value", 59, out.readUnsignedByte());
737 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
738 Assert.assertEquals("Wrong match entry field & hasMask", 60, out.readUnsignedByte());
739 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
740 Assert.assertEquals("Wrong match entry value", 60, out.readUnsignedByte());
741 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
742 Assert.assertEquals("Wrong match entry field & hasMask", 62, out.readUnsignedByte());
743 Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
744 array = new byte[16];
745 out.readBytes(array);
746 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);
747 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
748 Assert.assertEquals("Wrong match entry field & hasMask", 64, out.readUnsignedByte());
749 Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
751 out.readBytes(array);
752 Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);
753 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
754 Assert.assertEquals("Wrong match entry field & hasMask", 66, out.readUnsignedByte());
755 Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
757 out.readBytes(array);
758 Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);
759 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
760 Assert.assertEquals("Wrong match entry field & hasMask", 68, out.readUnsignedByte());
761 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
762 Assert.assertEquals("Wrong match entry value", 61, out.readUnsignedInt());
763 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
764 Assert.assertEquals("Wrong match entry field & hasMask", 70, out.readUnsignedByte());
765 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
766 Assert.assertEquals("Wrong match entry value", 62, out.readUnsignedByte());
767 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
768 Assert.assertEquals("Wrong match entry field & hasMask", 72, out.readUnsignedByte());
769 Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
770 Assert.assertEquals("Wrong match entry value", 1, out.readUnsignedByte());
771 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
772 Assert.assertEquals("Wrong match entry field & hasMask", 75, out.readUnsignedByte());
773 Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
774 Assert.assertEquals("Wrong match entry value", 64, out.readUnsignedMedium());
776 out.readBytes(array);
777 Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,1,2}, array);
778 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
779 Assert.assertEquals("Wrong match entry field & hasMask", 77, out.readUnsignedByte());
780 Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
781 Assert.assertEquals("Wrong match entry value", 1L, out.readLong());
782 Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());
783 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
784 Assert.assertEquals("Wrong match entry field & hasMask", 79, out.readUnsignedByte());
785 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
786 Assert.assertEquals("Wrong match entry value", 358, out.readUnsignedShort());
788 out.readBytes(array);
789 Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,2}, array);
790 Assert.assertTrue("Wrong padding", out.readableBytes() == 4);