1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.util;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.ArrayList;
\r
7 import java.util.List;
\r
9 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EncodeConstants;
\r
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
\r
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
\r
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
\r
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;
\r
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;
\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;
\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;
\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry.PseudoField;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;
\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.StandardMatchType;
\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;
\r
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;
\r
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;
\r
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;
\r
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;
\r
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
\r
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
\r
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;
\r
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ExperimenterClass;
\r
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;
\r
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;
\r
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;
\r
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;
\r
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
\r
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
\r
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
\r
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
\r
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
\r
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
\r
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
\r
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;
\r
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;
\r
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;
\r
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;
\r
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;
\r
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;
\r
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
\r
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
\r
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
\r
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
\r
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
\r
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;
\r
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
\r
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
\r
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;
\r
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
\r
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
\r
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
\r
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
\r
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
\r
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
\r
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
\r
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;
\r
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;
\r
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
\r
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
\r
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
\r
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
\r
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;
\r
116 import org.slf4j.Logger;
\r
117 import org.slf4j.LoggerFactory;
\r
119 import com.google.common.base.Joiner;
\r
122 * Class for easy creation of matches
\r
123 * @author timotej.kubas
\r
124 * @author michal.polkorab
\r
126 public abstract class MatchDeserializer {
\r
127 private static final Logger LOGGER = LoggerFactory.getLogger(MatchDeserializer.class);
\r
128 private static final byte SIZE_OF_LONG_IN_BYTES = Long.SIZE / Byte.SIZE;
\r
129 private static final byte SIZE_OF_INT_IN_BYTES = Integer.SIZE / Byte.SIZE;
\r
130 private static final byte SIZE_OF_SHORT_IN_BYTES = Short.SIZE / Byte.SIZE;
\r
131 private static final byte SIZE_OF_BYTE_IN_BYTES = Byte.SIZE / Byte.SIZE;
\r
132 private static final byte SIZE_OF_IPV6_ADDRESS_IN_BYTES = (8 * Short.SIZE) / Byte.SIZE;
\r
137 * @param in input ByteBuf
\r
138 * @return ofp_match
\r
140 public static Match createMatch(ByteBuf in) {
\r
141 if (in.readableBytes() > 0) {
\r
142 MatchBuilder builder = new MatchBuilder();
\r
143 int type = in.readUnsignedShort();
\r
144 int length = in.readUnsignedShort();
\r
147 builder.setType(StandardMatchType.class);
\r
150 builder.setType(OxmMatchType.class);
\r
155 builder.setMatchEntries(createMatchEntries(in, length - 2 * (Short.SIZE / Byte.SIZE)));
\r
156 int paddingRemainder = length % EncodeConstants.PADDING;
\r
157 if (paddingRemainder != 0) {
\r
158 in.skipBytes(EncodeConstants.PADDING - paddingRemainder);
\r
160 return builder.build();
\r
166 * @param in input ByteBuf
\r
167 * @param matchLength to infer size of array
\r
168 * @return MatchEntriesList
\r
170 public static List<MatchEntries> createMatchEntry(ByteBuf in, int matchLength) {
\r
171 return createMatchEntriesInternal(in, matchLength, true);
\r
175 * @param in input ByteBuf
\r
176 * @param matchLength to infer size of array
\r
177 * @return MatchEntriesList
\r
179 public static List<MatchEntries> createMatchEntries(ByteBuf in, int matchLength) {
\r
180 return createMatchEntriesInternal(in, matchLength, false);
\r
183 private static List<MatchEntries> createMatchEntriesInternal(ByteBuf in, int matchLength, boolean oneEntry) {
\r
184 List<MatchEntries> matchEntriesList = new ArrayList<>();
\r
185 int currLength = 0;
\r
186 while(currLength < matchLength) {
\r
187 MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
\r
188 switch (in.readUnsignedShort()) {
\r
190 matchEntriesBuilder.setOxmClass(Nxm0Class.class);
\r
193 matchEntriesBuilder.setOxmClass(Nxm1Class.class);
\r
196 matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);
\r
199 matchEntriesBuilder.setOxmClass(ExperimenterClass.class);
\r
205 int fieldAndMask = in.readUnsignedByte();
\r
206 boolean hasMask = (fieldAndMask & 1) != 0;
\r
207 int matchField = fieldAndMask >> 1;
\r
208 int matchEntryLength = in.readUnsignedByte();
\r
209 currLength += SIZE_OF_SHORT_IN_BYTES + (2 * SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;
\r
211 switch(matchField) {
\r
213 matchEntriesBuilder.setOxmMatchField(InPort.class);
\r
214 PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder();
\r
215 port.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
216 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build());
\r
219 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);
\r
220 PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder();
\r
221 phyPort.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
222 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build());
\r
225 matchEntriesBuilder.setOxmMatchField(Metadata.class);
\r
226 addMetadataAugmentation(matchEntriesBuilder, in);
\r
228 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
232 matchEntriesBuilder.setOxmMatchField(EthDst.class);
\r
233 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
235 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
239 matchEntriesBuilder.setOxmMatchField(EthSrc.class);
\r
240 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
242 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
246 matchEntriesBuilder.setOxmMatchField(EthType.class);
\r
247 EthTypeMatchEntryBuilder ethertypeBuilder = new EthTypeMatchEntryBuilder();
\r
248 ethertypeBuilder.setEthType(new EtherType(in.readUnsignedShort()));
\r
249 matchEntriesBuilder.addAugmentation(EthTypeMatchEntry.class, ethertypeBuilder.build());
\r
252 matchEntriesBuilder.setOxmMatchField(VlanVid.class);
\r
253 VlanVidMatchEntryBuilder vlanVidBuilder = new VlanVidMatchEntryBuilder();
\r
254 int vidEntryValue = in.readUnsignedShort();
\r
255 vlanVidBuilder.setCfiBit((vidEntryValue & 1) != 0);
\r
256 vlanVidBuilder.setVlanVid(vidEntryValue >> 1);
\r
257 matchEntriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanVidBuilder.build());
\r
259 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_SHORT_IN_BYTES);
\r
263 matchEntriesBuilder.setOxmMatchField(VlanPcp.class);
\r
264 VlanPcpMatchEntryBuilder vlanPcpBuilder = new VlanPcpMatchEntryBuilder();
\r
265 vlanPcpBuilder.setVlanPcp(in.readUnsignedByte());
\r
266 matchEntriesBuilder.addAugmentation(VlanPcpMatchEntry.class, vlanPcpBuilder.build());
\r
269 matchEntriesBuilder.setOxmMatchField(IpDscp.class);
\r
270 DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();
\r
271 dscpBuilder.setDscp(new Dscp(in.readUnsignedByte()));
\r
272 matchEntriesBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());
\r
275 matchEntriesBuilder.setOxmMatchField(IpEcn.class);
\r
276 EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();
\r
277 ecnBuilder.setEcn(in.readUnsignedByte());
\r
278 matchEntriesBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());
\r
281 matchEntriesBuilder.setOxmMatchField(IpProto.class);
\r
282 ProtocolNumberMatchEntryBuilder protoNumberBuilder = new ProtocolNumberMatchEntryBuilder();
\r
283 protoNumberBuilder.setProtocolNumber(in.readUnsignedByte());
\r
284 matchEntriesBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoNumberBuilder.build());
\r
287 matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);
\r
288 // TODO - ipv4address - check format with tests
\r
289 LOGGER.warn("IPV4address(ipv4src): received but possible wrong deserialization");
\r
290 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
292 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
296 matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);
\r
297 // TODO - ipv4address - check format with tests
\r
298 LOGGER.warn("IPV4address(ipv4dst): received but possible wrong deserialization");
\r
299 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
301 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
305 matchEntriesBuilder.setOxmMatchField(TcpSrc.class);
\r
306 addPortAugmentation(null, in);
\r
309 matchEntriesBuilder.setOxmMatchField(TcpDst.class);
\r
310 addPortAugmentation(null, in);
\r
313 matchEntriesBuilder.setOxmMatchField(UdpSrc.class);
\r
314 addPortAugmentation(null, in);
\r
317 matchEntriesBuilder.setOxmMatchField(UdpDst.class);
\r
318 addPortAugmentation(null, in);
\r
321 matchEntriesBuilder.setOxmMatchField(SctpSrc.class);
\r
322 addPortAugmentation(null, in);
\r
325 matchEntriesBuilder.setOxmMatchField(SctpDst.class);
\r
326 addPortAugmentation(null, in);
\r
329 matchEntriesBuilder.setOxmMatchField(Icmpv4Type.class);
\r
330 Icmpv4TypeMatchEntryBuilder icmpv4TypeBuilder = new Icmpv4TypeMatchEntryBuilder();
\r
331 icmpv4TypeBuilder.setIcmpv4Type(in.readUnsignedByte());
\r
332 matchEntriesBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4TypeBuilder.build());
\r
335 matchEntriesBuilder.setOxmMatchField(Icmpv4Code.class);
\r
336 Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();
\r
337 icmpv4CodeBuilder.setIcmpv4Code(in.readUnsignedByte());
\r
338 matchEntriesBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());
\r
341 matchEntriesBuilder.setOxmMatchField(ArpOp.class);
\r
342 OpCodeMatchEntryBuilder opcodeBuilder = new OpCodeMatchEntryBuilder();
\r
343 opcodeBuilder.setOpCode(in.readUnsignedShort());
\r
344 matchEntriesBuilder.addAugmentation(OpCodeMatchEntry.class, opcodeBuilder.build());
\r
347 matchEntriesBuilder.setOxmMatchField(ArpSpa.class);
\r
348 // TODO - ipv4address - check format with tests
\r
349 LOGGER.warn("IPV4address(arpspa): received but possible wrong deserialization");
\r
350 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
352 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
356 matchEntriesBuilder.setOxmMatchField(ArpTpa.class);
\r
357 // TODO - ipv4address - check format with tests
\r
358 LOGGER.warn("IPV4address(arptpa): received but possible wrong deserialization");
\r
359 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
361 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
365 matchEntriesBuilder.setOxmMatchField(ArpSha.class);
\r
366 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
368 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
372 matchEntriesBuilder.setOxmMatchField(ArpTha.class);
\r
373 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
375 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
379 matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);
\r
380 // TODO - ipv6address - check format with tests
\r
381 LOGGER.warn("IPV6address(Ipv6Src): received but possible wrong deserialization");
\r
382 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
384 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
388 matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);
\r
389 // TODO - ipv6address - check format with tests
\r
390 LOGGER.warn("IPV6address(Ipv6Dst): received but possible wrong deserialization");
\r
391 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
393 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
397 matchEntriesBuilder.setOxmMatchField(Ipv6Flabel.class);
\r
398 Ipv6FlabelMatchEntryBuilder ipv6FlabelBuilder = new Ipv6FlabelMatchEntryBuilder();
\r
399 ipv6FlabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(in.readUnsignedInt()));
\r
400 matchEntriesBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, ipv6FlabelBuilder.build());
\r
402 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
406 matchEntriesBuilder.setOxmMatchField(Icmpv6Type.class);
\r
407 Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();
\r
408 icmpv6TypeBuilder.setIcmpv6Type(in.readUnsignedByte());
\r
409 matchEntriesBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());
\r
412 matchEntriesBuilder.setOxmMatchField(Icmpv6Code.class);
\r
413 Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();
\r
414 icmpv6CodeBuilder.setIcmpv6Code(in.readUnsignedByte());
\r
415 matchEntriesBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());
\r
418 matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
\r
419 // TODO - ipv6address - check format with tests
\r
420 LOGGER.warn("IPV6address(Ipv6NdTarget): received but possible wrong deserialization");
\r
421 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
424 matchEntriesBuilder.setOxmMatchField(Ipv6NdSll.class);
\r
425 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
428 matchEntriesBuilder.setOxmMatchField(Ipv6NdTll.class);
\r
429 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
432 matchEntriesBuilder.setOxmMatchField(MplsLabel.class);
\r
433 MplsLabelMatchEntryBuilder mplsLabelBuilder = new MplsLabelMatchEntryBuilder();
\r
434 mplsLabelBuilder.setMplsLabel(in.readUnsignedInt());
\r
435 matchEntriesBuilder.addAugmentation(MplsLabelMatchEntry.class, mplsLabelBuilder.build());
\r
438 matchEntriesBuilder.setOxmMatchField(MplsTc.class);
\r
439 TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();
\r
440 tcBuilder.setTc(in.readUnsignedByte());
\r
441 matchEntriesBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());
\r
444 matchEntriesBuilder.setOxmMatchField(MplsBos.class);
\r
445 BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();
\r
446 if (in.readUnsignedByte() != 0) {
\r
447 bosBuilder.setBos(true);
\r
449 bosBuilder.setBos(false);
\r
451 matchEntriesBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());
\r
454 matchEntriesBuilder.setOxmMatchField(PbbIsid.class);
\r
455 IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();
\r
456 isidBuilder.setIsid(in.readUnsignedInt());
\r
457 matchEntriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());
\r
459 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
463 matchEntriesBuilder.setOxmMatchField(TunnelId.class);
\r
464 addMetadataAugmentation(matchEntriesBuilder, in);
\r
466 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
470 matchEntriesBuilder.setOxmMatchField(Ipv6Exthdr.class);
\r
471 PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();
\r
472 int bitmap = in.readUnsignedShort();
\r
473 final Boolean NONEXT = ((bitmap) & (1<<0)) != 0;
\r
474 final Boolean ESP = ((bitmap) & (1<<1)) != 0;
\r
475 final Boolean AUTH = ((bitmap) & (1<<2)) != 0;
\r
476 final Boolean DEST = ((bitmap) & (1<<3)) != 0;
\r
477 final Boolean FRAG = ((bitmap) & (1<<4)) != 0;
\r
478 final Boolean ROUTER = ((bitmap) & (1<<5)) != 0;
\r
479 final Boolean HOP = ((bitmap) & (1<<6)) != 0;
\r
480 final Boolean UNREP = ((bitmap) & (1<<7)) != 0;
\r
481 final Boolean UNSEQ = ((bitmap) & (1<<8)) != 0;
\r
482 pseudoBuilder.setPseudoField(new PseudoField(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ));
\r
483 matchEntriesBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());
\r
485 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_SHORT_IN_BYTES);
\r
491 matchEntriesList.add(matchEntriesBuilder.build());
\r
496 if ((matchLength - currLength) > 0) {
\r
497 in.skipBytes(matchLength - currLength);
\r
499 return matchEntriesList;
\r
502 private static void addMaskAugmentation(MatchEntriesBuilder builder, ByteBuf in, int matchEntryLength) {
\r
503 // TODO - check if matchEntryLength is in bytes
\r
504 MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();
\r
505 byte[] mask = new byte[matchEntryLength];
\r
506 in.readBytes(mask);
\r
507 maskBuilder.setMask(mask);
\r
508 builder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
\r
511 private static void addIpv6AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
512 final byte GROUPS_IN_IPV6_ADDRESS = 8;
\r
513 Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();
\r
514 List<String> groups = new ArrayList<>();
\r
515 for (int i = 0; i < GROUPS_IN_IPV6_ADDRESS; i++) {
\r
516 groups.add(String.format("X", in.readUnsignedShort()));
\r
518 Joiner joiner = Joiner.on(":");
\r
519 ipv6AddressBuilder.setIpv6Address(new Ipv6Address(joiner.join(groups)));
\r
520 builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());
\r
523 private static void addMetadataAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
524 MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder();
\r
525 byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE];
\r
526 in.readBytes(metadataBytes);
\r
527 metadata.setMetadata(metadataBytes);
\r
528 builder.addAugmentation(MetadataMatchEntry.class, metadata.build());
\r
531 private static void addIpv4AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
532 final byte GROUPS_IN_IPV4_ADDRESS = 4;
\r
533 Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();
\r
534 List<String> groups = new ArrayList<>();
\r
535 for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {
\r
536 groups.add(Short.toString(in.readUnsignedByte()));
\r
538 Joiner joiner = Joiner.on(".");
\r
539 ipv4AddressBuilder.setIpv4Address(new Ipv4Address(joiner.join(groups)));
\r
540 builder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());
\r
543 private static void addMacAddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
544 MacAddressMatchEntryBuilder macAddress = new MacAddressMatchEntryBuilder();
\r
545 StringBuffer macToString = new StringBuffer();
\r
546 final int macAddressLength = 6;
\r
547 for(int i=0; i<macAddressLength ; i++){
\r
549 mac = in.readUnsignedByte();
\r
550 macToString.append(String.format("%02X", mac));
\r
552 macAddress.setMacAddress(new MacAddress(macToString.toString()));
\r
553 builder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());
\r
556 private static void addPortAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
557 PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();
\r
558 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.
\r
559 xml.ns.yang.ietf.inet.types.rev100924.PortNumber(in.readUnsignedShort()));
\r
560 builder.addAugmentation(PortMatchEntry.class, portBuilder.build());
\r