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
133 private static List<MatchEntries> matchEntriesList = new ArrayList<>();
\r
134 private static MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
\r
138 * @param in input ByteBuf
\r
139 * @return ofp_match
\r
141 public static Match createMatch(ByteBuf in) {
\r
142 if (in.readableBytes() > 0) {
\r
143 MatchBuilder builder = new MatchBuilder();
\r
144 int type = in.readUnsignedShort();
\r
145 int length = in.readUnsignedShort();
\r
146 LOGGER.debug("length: " + length);
\r
149 builder.setType(StandardMatchType.class);
\r
152 builder.setType(OxmMatchType.class);
\r
157 builder.setMatchEntries(createMatchEntries(in, length - 2 * (Short.SIZE / Byte.SIZE)));
\r
158 int paddingRemainder = length % EncodeConstants.PADDING;
\r
159 if (paddingRemainder != 0) {
\r
160 in.skipBytes(EncodeConstants.PADDING - paddingRemainder);
\r
162 return builder.build();
\r
168 * @param in input ByteBuf
\r
169 * @param matchLength to infer size of array
\r
170 * @return MatchEntriesList
\r
172 public static List<MatchEntries> createMatchEntries(ByteBuf in, int matchLength) {
\r
173 int currLength = 0;
\r
174 while(currLength < matchLength) {
\r
175 switch (in.readUnsignedShort()) {
\r
177 matchEntriesBuilder.setOxmClass(Nxm0Class.class);
\r
180 matchEntriesBuilder.setOxmClass(Nxm1Class.class);
\r
183 matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);
\r
186 matchEntriesBuilder.setOxmClass(ExperimenterClass.class);
\r
192 int fieldAndMask = in.readUnsignedByte();
\r
193 boolean hasMask = (fieldAndMask & 1) != 0;
\r
194 int matchField = fieldAndMask >> 1;
\r
195 int matchEntryLength = in.readUnsignedByte();
\r
196 currLength += SIZE_OF_SHORT_IN_BYTES + (2 * SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;
\r
198 switch(matchField) {
\r
200 matchEntriesBuilder.setOxmMatchField(InPort.class);
\r
201 PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder();
\r
202 port.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
203 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build());
\r
206 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);
\r
207 PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder();
\r
208 phyPort.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
209 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build());
\r
212 matchEntriesBuilder.setOxmMatchField(Metadata.class);
\r
213 addMetadataAugmentation(matchEntriesBuilder, in);
\r
215 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
219 matchEntriesBuilder.setOxmMatchField(EthDst.class);
\r
220 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
222 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
226 matchEntriesBuilder.setOxmMatchField(EthSrc.class);
\r
227 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
229 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
233 matchEntriesBuilder.setOxmMatchField(EthType.class);
\r
234 EthTypeMatchEntryBuilder ethertypeBuilder = new EthTypeMatchEntryBuilder();
\r
235 ethertypeBuilder.setEthType(new EtherType(in.readUnsignedShort()));
\r
236 matchEntriesBuilder.addAugmentation(EthTypeMatchEntry.class, ethertypeBuilder.build());
\r
239 matchEntriesBuilder.setOxmMatchField(VlanVid.class);
\r
240 VlanVidMatchEntryBuilder vlanVidBuilder = new VlanVidMatchEntryBuilder();
\r
241 int vidEntryValue = in.readUnsignedShort();
\r
242 vlanVidBuilder.setCfiBit((vidEntryValue & 1) != 0);
\r
243 vlanVidBuilder.setVlanVid(vidEntryValue >> 1);
\r
244 matchEntriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanVidBuilder.build());
\r
246 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_SHORT_IN_BYTES);
\r
250 matchEntriesBuilder.setOxmMatchField(VlanPcp.class);
\r
251 VlanPcpMatchEntryBuilder vlanPcpBuilder = new VlanPcpMatchEntryBuilder();
\r
252 vlanPcpBuilder.setVlanPcp(in.readUnsignedByte());
\r
253 matchEntriesBuilder.addAugmentation(VlanPcpMatchEntry.class, vlanPcpBuilder.build());
\r
256 matchEntriesBuilder.setOxmMatchField(IpDscp.class);
\r
257 DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();
\r
258 dscpBuilder.setDscp(new Dscp(in.readUnsignedByte()));
\r
259 matchEntriesBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());
\r
262 matchEntriesBuilder.setOxmMatchField(IpEcn.class);
\r
263 EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();
\r
264 ecnBuilder.setEcn(in.readUnsignedByte());
\r
265 matchEntriesBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());
\r
268 matchEntriesBuilder.setOxmMatchField(IpProto.class);
\r
269 ProtocolNumberMatchEntryBuilder protoNumberBuilder = new ProtocolNumberMatchEntryBuilder();
\r
270 protoNumberBuilder.setProtocolNumber(in.readUnsignedByte());
\r
271 matchEntriesBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoNumberBuilder.build());
\r
274 matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);
\r
275 // TODO - ipv4address - check format with tests
\r
276 LOGGER.warn("IPV4address(ipv4src): received but possible wrong deserialization");
\r
277 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
279 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
283 matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);
\r
284 // TODO - ipv4address - check format with tests
\r
285 LOGGER.warn("IPV4address(ipv4dst): received but possible wrong deserialization");
\r
286 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
288 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
292 matchEntriesBuilder.setOxmMatchField(TcpSrc.class);
\r
293 addPortAugmentation(null, in);
\r
296 matchEntriesBuilder.setOxmMatchField(TcpDst.class);
\r
297 addPortAugmentation(null, in);
\r
300 matchEntriesBuilder.setOxmMatchField(UdpSrc.class);
\r
301 addPortAugmentation(null, in);
\r
304 matchEntriesBuilder.setOxmMatchField(UdpDst.class);
\r
305 addPortAugmentation(null, in);
\r
308 matchEntriesBuilder.setOxmMatchField(SctpSrc.class);
\r
309 addPortAugmentation(null, in);
\r
312 matchEntriesBuilder.setOxmMatchField(SctpDst.class);
\r
313 addPortAugmentation(null, in);
\r
316 matchEntriesBuilder.setOxmMatchField(Icmpv4Type.class);
\r
317 Icmpv4TypeMatchEntryBuilder icmpv4TypeBuilder = new Icmpv4TypeMatchEntryBuilder();
\r
318 icmpv4TypeBuilder.setIcmpv4Type(in.readUnsignedByte());
\r
319 matchEntriesBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4TypeBuilder.build());
\r
322 matchEntriesBuilder.setOxmMatchField(Icmpv4Code.class);
\r
323 Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();
\r
324 icmpv4CodeBuilder.setIcmpv4Code(in.readUnsignedByte());
\r
325 matchEntriesBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());
\r
328 matchEntriesBuilder.setOxmMatchField(ArpOp.class);
\r
329 OpCodeMatchEntryBuilder opcodeBuilder = new OpCodeMatchEntryBuilder();
\r
330 opcodeBuilder.setOpCode(in.readUnsignedShort());
\r
331 matchEntriesBuilder.addAugmentation(OpCodeMatchEntry.class, opcodeBuilder.build());
\r
334 matchEntriesBuilder.setOxmMatchField(ArpSpa.class);
\r
335 // TODO - ipv4address - check format with tests
\r
336 LOGGER.warn("IPV4address(arpspa): received but possible wrong deserialization");
\r
337 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
339 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
343 matchEntriesBuilder.setOxmMatchField(ArpTpa.class);
\r
344 // TODO - ipv4address - check format with tests
\r
345 LOGGER.warn("IPV4address(arptpa): received but possible wrong deserialization");
\r
346 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
348 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
352 matchEntriesBuilder.setOxmMatchField(ArpSha.class);
\r
353 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
355 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
359 matchEntriesBuilder.setOxmMatchField(ArpTha.class);
\r
360 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
362 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
366 matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);
\r
367 // TODO - ipv6address - check format with tests
\r
368 LOGGER.warn("IPV6address(Ipv6Src): received but possible wrong deserialization");
\r
369 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
371 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
375 matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);
\r
376 // TODO - ipv6address - check format with tests
\r
377 LOGGER.warn("IPV6address(Ipv6Dst): received but possible wrong deserialization");
\r
378 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
380 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
384 matchEntriesBuilder.setOxmMatchField(Ipv6Flabel.class);
\r
385 Ipv6FlabelMatchEntryBuilder ipv6FlabelBuilder = new Ipv6FlabelMatchEntryBuilder();
\r
386 ipv6FlabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(in.readUnsignedInt()));
\r
387 matchEntriesBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, ipv6FlabelBuilder.build());
\r
389 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
393 matchEntriesBuilder.setOxmMatchField(Icmpv6Type.class);
\r
394 Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();
\r
395 icmpv6TypeBuilder.setIcmpv6Type(in.readUnsignedByte());
\r
396 matchEntriesBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());
\r
399 matchEntriesBuilder.setOxmMatchField(Icmpv6Code.class);
\r
400 Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();
\r
401 icmpv6CodeBuilder.setIcmpv6Code(in.readUnsignedByte());
\r
402 matchEntriesBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());
\r
405 matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
\r
406 // TODO - ipv6address - check format with tests
\r
407 LOGGER.warn("IPV6address(Ipv6NdTarget): received but possible wrong deserialization");
\r
408 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
411 matchEntriesBuilder.setOxmMatchField(Ipv6NdSll.class);
\r
412 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
415 matchEntriesBuilder.setOxmMatchField(Ipv6NdTll.class);
\r
416 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
419 matchEntriesBuilder.setOxmMatchField(MplsLabel.class);
\r
420 MplsLabelMatchEntryBuilder mplsLabelBuilder = new MplsLabelMatchEntryBuilder();
\r
421 mplsLabelBuilder.setMplsLabel(in.readUnsignedInt());
\r
422 matchEntriesBuilder.addAugmentation(MplsLabelMatchEntry.class, mplsLabelBuilder.build());
\r
425 matchEntriesBuilder.setOxmMatchField(MplsTc.class);
\r
426 TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();
\r
427 tcBuilder.setTc(in.readUnsignedByte());
\r
428 matchEntriesBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());
\r
431 matchEntriesBuilder.setOxmMatchField(MplsBos.class);
\r
432 BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();
\r
433 if (in.readUnsignedByte() != 0) {
\r
434 bosBuilder.setBos(true);
\r
436 bosBuilder.setBos(false);
\r
438 matchEntriesBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());
\r
441 matchEntriesBuilder.setOxmMatchField(PbbIsid.class);
\r
442 IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();
\r
443 isidBuilder.setIsid(in.readUnsignedInt());
\r
444 matchEntriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());
\r
446 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_INT_IN_BYTES);
\r
450 matchEntriesBuilder.setOxmMatchField(TunnelId.class);
\r
451 addMetadataAugmentation(matchEntriesBuilder, in);
\r
453 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_LONG_IN_BYTES);
\r
457 matchEntriesBuilder.setOxmMatchField(Ipv6Exthdr.class);
\r
458 PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();
\r
459 int bitmap = in.readUnsignedShort();
\r
460 final Boolean NONEXT = ((bitmap) & (1<<0)) != 0;
\r
461 final Boolean ESP = ((bitmap) & (1<<1)) != 0;
\r
462 final Boolean AUTH = ((bitmap) & (1<<2)) != 0;
\r
463 final Boolean DEST = ((bitmap) & (1<<3)) != 0;
\r
464 final Boolean FRAG = ((bitmap) & (1<<4)) != 0;
\r
465 final Boolean ROUTER = ((bitmap) & (1<<5)) != 0;
\r
466 final Boolean HOP = ((bitmap) & (1<<6)) != 0;
\r
467 final Boolean UNREP = ((bitmap) & (1<<7)) != 0;
\r
468 final Boolean UNSEQ = ((bitmap) & (1<<8)) != 0;
\r
469 pseudoBuilder.setPseudoField(new PseudoField(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ));
\r
470 matchEntriesBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());
\r
472 addMaskAugmentation(matchEntriesBuilder, in, SIZE_OF_SHORT_IN_BYTES);
\r
478 matchEntriesList.add(matchEntriesBuilder.build());
\r
480 return matchEntriesList;
\r
483 private static void addMaskAugmentation(MatchEntriesBuilder builder, ByteBuf in, int matchEntryLength) {
\r
484 // TODO - check if matchEntryLength is in bytes
\r
485 MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();
\r
486 byte[] mask = new byte[matchEntryLength];
\r
487 in.readBytes(mask);
\r
488 maskBuilder.setMask(mask);
\r
489 builder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
\r
492 private static void addIpv6AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
493 final byte GROUPS_IN_IPV6_ADDRESS = 8;
\r
494 Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();
\r
495 List<String> groups = new ArrayList<>();
\r
496 for (int i = 0; i < GROUPS_IN_IPV6_ADDRESS; i++) {
\r
497 groups.add(String.format("X", in.readUnsignedShort()));
\r
499 Joiner joiner = Joiner.on(":");
\r
500 ipv6AddressBuilder.setIpv6Address(new Ipv6Address(joiner.join(groups)));
\r
501 builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());
\r
504 private static void addMetadataAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
505 MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder();
\r
506 byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE];
\r
507 in.readBytes(metadataBytes);
\r
508 metadata.setMetadata(metadataBytes);
\r
509 builder.addAugmentation(MetadataMatchEntry.class, metadata.build());
\r
512 private static void addIpv4AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
513 final byte GROUPS_IN_IPV4_ADDRESS = 4;
\r
514 Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();
\r
515 List<String> groups = new ArrayList<>();
\r
516 for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {
\r
517 groups.add(Short.toString(in.readUnsignedByte()));
\r
519 Joiner joiner = Joiner.on(".");
\r
520 ipv4AddressBuilder.setIpv4Address(new Ipv4Address(joiner.join(groups)));
\r
521 builder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());
\r
524 private static void addMacAddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
525 MacAddressMatchEntryBuilder macAddress = new MacAddressMatchEntryBuilder();
\r
526 StringBuffer macToString = new StringBuffer();
\r
527 final int macAddressLength = 6;
\r
528 for(int i=0; i<macAddressLength ; i++){
\r
530 mac = in.readUnsignedByte();
\r
531 macToString.append(String.format("%02X", mac));
\r
533 macAddress.setMacAddress(new MacAddress(macToString.toString()));
\r
534 builder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());
\r
537 private static void addPortAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
538 PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();
\r
539 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.
\r
540 xml.ns.yang.ietf.inet.types.rev100924.PortNumber(in.readUnsignedShort()));
\r
541 builder.addAugmentation(PortMatchEntry.class, portBuilder.build());
\r