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.yang.types.rev100924.MacAddress;
\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;
\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ExperimenterClass;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
\r
30 * @author timotej.kubas
\r
31 * @author michal.polkorab
\r
33 public abstract class MatchEntriesCreator {
\r
34 private static List<MatchEntries> matchEntriesList = new ArrayList<>();
\r
35 private static MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
\r
38 * @param in input ByteBuf
\r
39 * @param matchArrayLength to infer size of array
\r
40 * @return MatchEntriesList
\r
42 public static List<MatchEntries> createMatchEntry(ByteBuf in, int matchArrayLength) {
\r
43 int currMatchLength = 0;
\r
44 final byte MATCH_LENGTH = 1;
\r
46 while(currMatchLength < matchArrayLength) {
\r
48 switch (in.readUnsignedShort()) {
\r
50 matchEntriesBuilder.setOxmClass(Nxm0Class.class);
\r
53 matchEntriesBuilder.setOxmClass(Nxm1Class.class);
\r
56 matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);
\r
59 matchEntriesBuilder.setOxmClass(ExperimenterClass.class);
\r
64 currMatchLength = currMatchLength +2;
\r
66 int matchField = in.readUnsignedByte() >>> 1;
\r
67 in.skipBytes(MATCH_LENGTH);
\r
69 currMatchLength = currMatchLength + 2;
\r
71 switch(matchField) {
\r
73 matchEntriesBuilder.setOxmMatchField(InPort.class);
\r
74 PortNumberMatchEntryBuilder port = new PortNumberMatchEntryBuilder();
\r
75 port.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
76 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, port.build());
\r
77 currMatchLength = currMatchLength + 4;
\r
80 matchEntriesBuilder.setOxmMatchField(InPhyPort.class);
\r
81 PortNumberMatchEntryBuilder phyPort = new PortNumberMatchEntryBuilder();
\r
82 phyPort.setPortNumber(new PortNumber(in.readUnsignedInt()));
\r
83 matchEntriesBuilder.addAugmentation(PortNumberMatchEntry.class, phyPort.build());
\r
84 currMatchLength = currMatchLength + 4;
\r
87 matchEntriesBuilder.setOxmMatchField(Metadata.class);
\r
88 MetadataMatchEntryBuilder metadata = new MetadataMatchEntryBuilder();
\r
89 byte[] metadataBytes = new byte[Long.SIZE/Byte.SIZE];
\r
90 in.readBytes(metadataBytes);
\r
91 metadata.setMetadata(metadataBytes);
\r
92 matchEntriesBuilder.addAugmentation(MetadataMatchEntry.class, metadata.build());
\r
93 currMatchLength = currMatchLength + 8;
\r
96 matchEntriesBuilder.setOxmMatchField(EthDst.class);
\r
97 MacAddressMatchEntryBuilder macAddress = new MacAddressMatchEntryBuilder();
\r
98 StringBuffer macToString = new StringBuffer();
\r
99 final int macAddressLength = 6;
\r
100 for(int i=0; i<macAddressLength ; i++){
\r
102 mac = in.readUnsignedByte();
\r
103 macToString.append(String.format("%02X", mac));
\r
105 macAddress.setMacAddress(new MacAddress(macToString.toString()));
\r
106 matchEntriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());
\r
107 currMatchLength = currMatchLength + 8;
\r
112 matchEntriesList.add(matchEntriesBuilder.build());
\r
115 return matchEntriesList;
\r