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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
\r
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
\r
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
\r
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;
\r
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;
\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;
\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry.PseudoField;
\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;
\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;
\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;
\r
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;
\r
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;
\r
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
\r
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
\r
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;
\r
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ExperimenterClass;
\r
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;
\r
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;
\r
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;
\r
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;
\r
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
\r
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
\r
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
\r
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
\r
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
\r
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
\r
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
\r
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;
\r
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;
\r
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;
\r
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;
\r
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;
\r
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;
\r
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
\r
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
\r
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
\r
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
\r
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
\r
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;
\r
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
\r
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
\r
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
\r
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
\r
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
\r
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
\r
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
\r
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
\r
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
\r
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;
\r
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;
\r
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
\r
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
\r
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
\r
111 import org.slf4j.Logger;
\r
112 import org.slf4j.LoggerFactory;
\r
114 import com.google.common.base.Joiner;
\r
117 * Class for easy creation of matches
\r
118 * @author timotej.kubas
\r
119 * @author michal.polkorab
\r
121 public abstract class MatchEntriesDeserializer {
\r
122 private static final Logger LOGGER = LoggerFactory.getLogger(MatchEntriesDeserializer.class);
\r
123 private static final byte SIZE_OF_LONG_IN_BYTES = Long.SIZE / Byte.SIZE;
\r
124 private static final byte SIZE_OF_INT_IN_BYTES = Integer.SIZE / Byte.SIZE;
\r
125 private static final byte SIZE_OF_SHORT_IN_BYTES = Short.SIZE / Byte.SIZE;
\r
126 private static final byte SIZE_OF_BYTE_IN_BYTES = Byte.SIZE / Byte.SIZE;
\r
127 private static final byte SIZE_OF_IPV6_ADDRESS_IN_BYTES = (8 * Short.SIZE) / Byte.SIZE;
\r
128 private static List<MatchEntries> matchEntriesList = new ArrayList<>();
\r
129 private static MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
\r
132 * @param in input ByteBuf
\r
133 * @param matchArrayLength to infer size of array
\r
134 * @return MatchEntriesList
\r
136 public static List<MatchEntries> createMatchEntry(ByteBuf in, int matchArrayLength) {
\r
137 int currMatchLength = 0;
\r
138 while(currMatchLength < matchArrayLength) {
\r
139 switch (in.readUnsignedShort()) {
\r
141 matchEntriesBuilder.setOxmClass(Nxm0Class.class);
\r
144 matchEntriesBuilder.setOxmClass(Nxm1Class.class);
\r
147 matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);
\r
150 matchEntriesBuilder.setOxmClass(ExperimenterClass.class);
\r
156 int matchField = in.readUnsignedByte() >>> 1;
\r
157 short matchEntryLength = in.readUnsignedByte();
\r
158 currMatchLength = currMatchLength + SIZE_OF_SHORT_IN_BYTES + (2 * SIZE_OF_BYTE_IN_BYTES) + matchEntryLength;
\r
160 switch(matchField) {
\r
162 matchEntriesBuilder.setOxmMatchField(InPort.class);
\r
163 PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder();
\r
164 port.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
165 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build());
\r
168 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);
\r
169 PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder();
\r
170 phyPort.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
171 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build());
\r
174 matchEntriesBuilder.setOxmMatchField(Metadata.class);
\r
175 currMatchLength = matchEntryLength;
\r
176 addMetadataAugmentation(matchEntriesBuilder, in);
\r
177 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
178 if (matchEntryLength > 0) {
\r
179 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
183 matchEntriesBuilder.setOxmMatchField(EthDst.class);
\r
184 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
185 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
186 if (matchEntryLength > 0) {
\r
187 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
191 matchEntriesBuilder.setOxmMatchField(EthSrc.class);
\r
192 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
193 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
194 if (matchEntryLength > 0) {
\r
195 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
199 matchEntriesBuilder.setOxmMatchField(EthType.class);
\r
200 EthTypeMatchEntryBuilder ethertypeBuilder = new EthTypeMatchEntryBuilder();
\r
201 ethertypeBuilder.setEthType(new EtherType(in.readUnsignedShort()));
\r
202 matchEntriesBuilder.addAugmentation(EthTypeMatchEntry.class, ethertypeBuilder.build());
\r
205 matchEntriesBuilder.setOxmMatchField(VlanVid.class);
\r
206 VlanVidMatchEntryBuilder vlanVidBuilder = new VlanVidMatchEntryBuilder();
\r
207 vlanVidBuilder.setVlanVid(in.readUnsignedShort());
\r
208 matchEntriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanVidBuilder.build());
\r
209 matchEntryLength -= SIZE_OF_SHORT_IN_BYTES;
\r
210 if (matchEntryLength > 0) {
\r
211 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
215 matchEntriesBuilder.setOxmMatchField(VlanPcp.class);
\r
216 VlanPcpMatchEntryBuilder vlanPcpBuilder = new VlanPcpMatchEntryBuilder();
\r
217 vlanPcpBuilder.setVlanPcp(in.readUnsignedByte());
\r
218 matchEntriesBuilder.addAugmentation(VlanPcpMatchEntry.class, vlanPcpBuilder.build());
\r
221 matchEntriesBuilder.setOxmMatchField(IpDscp.class);
\r
222 DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();
\r
223 dscpBuilder.setDscp(new Dscp(in.readUnsignedByte()));
\r
224 matchEntriesBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());
\r
227 matchEntriesBuilder.setOxmMatchField(IpEcn.class);
\r
228 EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();
\r
229 ecnBuilder.setEcn(in.readUnsignedByte());
\r
230 matchEntriesBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());
\r
233 matchEntriesBuilder.setOxmMatchField(IpProto.class);
\r
234 ProtocolNumberMatchEntryBuilder protoNumberBuilder = new ProtocolNumberMatchEntryBuilder();
\r
235 protoNumberBuilder.setProtocolNumber(in.readUnsignedByte());
\r
236 matchEntriesBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoNumberBuilder.build());
\r
239 matchEntriesBuilder.setOxmMatchField(Ipv4Src.class);
\r
240 // TODO - ipv4address - check format with tests
\r
241 LOGGER.warn("IPV4address(ipv4src): received but possible wrong deserialization");
\r
242 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
243 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
244 if (matchEntryLength > 0) {
\r
245 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
249 matchEntriesBuilder.setOxmMatchField(Ipv4Dst.class);
\r
250 // TODO - ipv4address - check format with tests
\r
251 LOGGER.warn("IPV4address(ipv4dst): received but possible wrong deserialization");
\r
252 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
253 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
254 if (matchEntryLength > 0) {
\r
255 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
259 matchEntriesBuilder.setOxmMatchField(TcpSrc.class);
\r
260 addPortAugmentation(null, in);
\r
263 matchEntriesBuilder.setOxmMatchField(TcpDst.class);
\r
264 addPortAugmentation(null, in);
\r
267 matchEntriesBuilder.setOxmMatchField(UdpSrc.class);
\r
268 addPortAugmentation(null, in);
\r
271 matchEntriesBuilder.setOxmMatchField(UdpDst.class);
\r
272 addPortAugmentation(null, in);
\r
275 matchEntriesBuilder.setOxmMatchField(SctpSrc.class);
\r
276 addPortAugmentation(null, in);
\r
279 matchEntriesBuilder.setOxmMatchField(SctpDst.class);
\r
280 addPortAugmentation(null, in);
\r
283 matchEntriesBuilder.setOxmMatchField(Icmpv4Type.class);
\r
284 Icmpv4TypeMatchEntryBuilder icmpv4TypeBuilder = new Icmpv4TypeMatchEntryBuilder();
\r
285 icmpv4TypeBuilder.setIcmpv4Type(in.readUnsignedByte());
\r
286 matchEntriesBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4TypeBuilder.build());
\r
289 matchEntriesBuilder.setOxmMatchField(Icmpv4Code.class);
\r
290 Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();
\r
291 icmpv4CodeBuilder.setIcmpv4Code(in.readUnsignedByte());
\r
292 matchEntriesBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());
\r
295 matchEntriesBuilder.setOxmMatchField(ArpOp.class);
\r
296 OpCodeMatchEntryBuilder opcodeBuilder = new OpCodeMatchEntryBuilder();
\r
297 opcodeBuilder.setOpCode(in.readUnsignedShort());
\r
298 matchEntriesBuilder.addAugmentation(OpCodeMatchEntry.class, opcodeBuilder.build());
\r
301 matchEntriesBuilder.setOxmMatchField(ArpSpa.class);
\r
302 // TODO - ipv4address - check format with tests
\r
303 LOGGER.warn("IPV4address(arpspa): received but possible wrong deserialization");
\r
304 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
305 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
306 if (matchEntryLength > 0) {
\r
307 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
311 matchEntriesBuilder.setOxmMatchField(ArpTpa.class);
\r
312 // TODO - ipv4address - check format with tests
\r
313 LOGGER.warn("IPV4address(arptpa): received but possible wrong deserialization");
\r
314 addIpv4AddressAugmentation(matchEntriesBuilder, in);
\r
315 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
316 if (matchEntryLength > 0) {
\r
317 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
321 matchEntriesBuilder.setOxmMatchField(ArpSha.class);
\r
322 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
323 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
324 if (matchEntryLength > 0) {
\r
325 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
329 matchEntriesBuilder.setOxmMatchField(ArpTha.class);
\r
330 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
331 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
332 if (matchEntryLength > 0) {
\r
333 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
337 matchEntriesBuilder.setOxmMatchField(Ipv6Src.class);
\r
338 // TODO - ipv6address - check format with tests
\r
339 LOGGER.warn("IPV6address(Ipv6Src): received but possible wrong deserialization");
\r
340 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
341 matchEntryLength -= SIZE_OF_IPV6_ADDRESS_IN_BYTES;
\r
342 if (matchEntryLength > 0) {
\r
343 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
347 matchEntriesBuilder.setOxmMatchField(Ipv6Dst.class);
\r
348 // TODO - ipv6address - check format with tests
\r
349 LOGGER.warn("IPV6address(Ipv6Dst): received but possible wrong deserialization");
\r
350 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
351 matchEntryLength -= SIZE_OF_IPV6_ADDRESS_IN_BYTES;
\r
352 if (matchEntryLength > 0) {
\r
353 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
357 matchEntriesBuilder.setOxmMatchField(Ipv6Flabel.class);
\r
358 Ipv6FlabelMatchEntryBuilder ipv6FlabelBuilder = new Ipv6FlabelMatchEntryBuilder();
\r
359 ipv6FlabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(in.readUnsignedInt()));
\r
360 matchEntriesBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, ipv6FlabelBuilder.build());
\r
361 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
362 if (matchEntryLength > 0) {
\r
363 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
367 matchEntriesBuilder.setOxmMatchField(Icmpv6Type.class);
\r
368 Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();
\r
369 icmpv6TypeBuilder.setIcmpv6Type(in.readUnsignedByte());
\r
370 matchEntriesBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());
\r
373 matchEntriesBuilder.setOxmMatchField(Icmpv6Code.class);
\r
374 Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();
\r
375 icmpv6CodeBuilder.setIcmpv6Code(in.readUnsignedByte());
\r
376 matchEntriesBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());
\r
379 matchEntriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
\r
380 // TODO - ipv6address - check format with tests
\r
381 LOGGER.warn("IPV6address(Ipv6NdTarget): received but possible wrong deserialization");
\r
382 addIpv6AddressAugmentation(matchEntriesBuilder, in);
\r
385 matchEntriesBuilder.setOxmMatchField(Ipv6NdSll.class);
\r
386 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
389 matchEntriesBuilder.setOxmMatchField(Ipv6NdTll.class);
\r
390 addMacAddressAugmentation(matchEntriesBuilder, in);
\r
393 matchEntriesBuilder.setOxmMatchField(MplsLabel.class);
\r
394 MplsLabelMatchEntryBuilder mplsLabelBuilder = new MplsLabelMatchEntryBuilder();
\r
395 mplsLabelBuilder.setMplsLabel(in.readUnsignedInt());
\r
396 matchEntriesBuilder.addAugmentation(MplsLabelMatchEntry.class, mplsLabelBuilder.build());
\r
399 matchEntriesBuilder.setOxmMatchField(MplsTc.class);
\r
400 TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();
\r
401 tcBuilder.setTc(in.readUnsignedByte());
\r
402 matchEntriesBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());
\r
405 matchEntriesBuilder.setOxmMatchField(MplsBos.class);
\r
406 BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();
\r
407 if (in.readUnsignedByte() != 0) {
\r
408 bosBuilder.setBos(true);
\r
410 bosBuilder.setBos(false);
\r
412 matchEntriesBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());
\r
415 matchEntriesBuilder.setOxmMatchField(PbbIsid.class);
\r
416 IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();
\r
417 isidBuilder.setIsid(in.readUnsignedInt());
\r
418 matchEntriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());
\r
419 matchEntryLength -= SIZE_OF_INT_IN_BYTES;
\r
420 if (matchEntryLength > 0) {
\r
421 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
425 matchEntriesBuilder.setOxmMatchField(TunnelId.class);
\r
426 addMetadataAugmentation(matchEntriesBuilder, in);
\r
427 matchEntryLength -= SIZE_OF_LONG_IN_BYTES;
\r
428 if (matchEntryLength > 0) {
\r
429 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
433 matchEntriesBuilder.setOxmMatchField(Ipv6Exthdr.class);
\r
434 PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();
\r
435 int bitmap = in.readUnsignedShort();
\r
436 final Boolean NONEXT = ((bitmap) & (1<<0)) != 0;
\r
437 final Boolean ESP = ((bitmap) & (1<<1)) != 0;
\r
438 final Boolean AUTH = ((bitmap) & (1<<2)) != 0;
\r
439 final Boolean DEST = ((bitmap) & (1<<3)) != 0;
\r
440 final Boolean FRAG = ((bitmap) & (1<<4)) != 0;
\r
441 final Boolean ROUTER = ((bitmap) & (1<<5)) != 0;
\r
442 final Boolean HOP = ((bitmap) & (1<<6)) != 0;
\r
443 final Boolean UNREP = ((bitmap) & (1<<7)) != 0;
\r
444 final Boolean UNSEQ = ((bitmap) & (1<<8)) != 0;
\r
445 pseudoBuilder.setPseudoField(new PseudoField(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ));
\r
446 matchEntriesBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());
\r
447 matchEntryLength -= SIZE_OF_SHORT_IN_BYTES;
\r
448 if (matchEntryLength > 0) {
\r
449 addMaskAugmentation(matchEntriesBuilder, in, matchEntryLength);
\r
455 matchEntriesList.add(matchEntriesBuilder.build());
\r
458 return matchEntriesList;
\r
461 private static void addMaskAugmentation(MatchEntriesBuilder builder, ByteBuf in, int matchEntryLength) {
\r
462 // TODO - check if matchEntryLength is in bytes
\r
463 MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();
\r
464 byte[] mask = new byte[matchEntryLength];
\r
465 in.readBytes(mask);
\r
466 maskBuilder.setMask(mask);
\r
467 builder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());
\r
470 private static void addIpv6AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
471 final byte GROUPS_IN_IPV6_ADDRESS = 8;
\r
472 Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();
\r
473 List<String> groups = new ArrayList<>();
\r
474 for (int i = 0; i < GROUPS_IN_IPV6_ADDRESS; i++) {
\r
475 groups.add(String.format("X", in.readUnsignedShort()));
\r
477 Joiner joiner = Joiner.on(":");
\r
478 ipv6AddressBuilder.setIpv6Address(new Ipv6Address(joiner.join(groups)));
\r
479 builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());
\r
482 private static void addMetadataAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
483 MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder();
\r
484 byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE];
\r
485 in.readBytes(metadataBytes);
\r
486 metadata.setMetadata(metadataBytes);
\r
487 builder.addAugmentation(MetadataMatchEntry.class, metadata.build());
\r
490 private static void addIpv4AddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
491 final byte GROUPS_IN_IPV4_ADDRESS = 4;
\r
492 Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();
\r
493 StringBuffer sb = new StringBuffer();
\r
494 for (int i = 0; i < GROUPS_IN_IPV4_ADDRESS; i++) {
\r
495 sb.append(in.readUnsignedByte());
\r
497 ipv4AddressBuilder.setIpv4Address(new Ipv4Address(sb.toString()));
\r
498 builder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());
\r
501 private static void addMacAddressAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
502 MacAddressMatchEntryBuilder macAddress = new MacAddressMatchEntryBuilder();
\r
503 StringBuffer macToString = new StringBuffer();
\r
504 final int macAddressLength = 6;
\r
505 for(int i=0; i<macAddressLength ; i++){
\r
507 mac = in.readUnsignedByte();
\r
508 macToString.append(String.format("%02X", mac));
\r
510 macAddress.setMacAddress(new MacAddress(macToString.toString()));
\r
511 builder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());
\r
514 private static void addPortAugmentation(MatchEntriesBuilder builder, ByteBuf in) {
\r
515 PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();
\r
516 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.
\r
517 xml.ns.yang.ietf.inet.types.rev100924.PortNumber(in.readUnsignedShort()));
\r
518 builder.addAugmentation(PortMatchEntry.class, portBuilder.build());
\r