7d5456c15724cd2ba3519e44857fc5437e8d76ff
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / MatchEntriesCreator.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.util;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \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
27 \r
28 /**\r
29  * To create matches\r
30  * @author timotej.kubas\r
31  * @author michal.polkorab\r
32  */\r
33 public abstract class MatchEntriesCreator {\r
34     private static List<MatchEntries> matchEntriesList = new ArrayList<>();\r
35     private static MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder(); \r
36     \r
37     /**\r
38      * @param in input ByteBuf\r
39      * @param matchArrayLength to infer size of array\r
40      * @return MatchEntriesList\r
41      */\r
42     public static List<MatchEntries> createMatchEntry(ByteBuf in, int matchArrayLength) {\r
43         int currMatchLength = 0;\r
44         final byte MATCH_LENGTH = 1;\r
45         \r
46         while(currMatchLength < matchArrayLength) {\r
47             \r
48             switch (in.readUnsignedShort()) { \r
49             case 0x0000:\r
50                         matchEntriesBuilder.setOxmClass(Nxm0Class.class);\r
51                         break;\r
52             case 0x0001:\r
53                         matchEntriesBuilder.setOxmClass(Nxm1Class.class);\r
54                         break;\r
55             case 0x8000:\r
56                         matchEntriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
57                         break;\r
58             case 0xFFFF:\r
59                         matchEntriesBuilder.setOxmClass(ExperimenterClass.class);\r
60                         break;\r
61             default:\r
62                         break;\r
63             }\r
64             currMatchLength = currMatchLength +2;\r
65             \r
66             int matchField = in.readUnsignedByte() >>> 1;\r
67             in.skipBytes(MATCH_LENGTH);\r
68             \r
69             currMatchLength = currMatchLength + 2;\r
70             \r
71             switch(matchField) {\r
72             case 0: \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
78                 break;\r
79             case 1:\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
85                 break;\r
86             case 2:\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
94                 break;\r
95             case 3:\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
101                     short mac = 0;\r
102                     mac = in.readUnsignedByte();\r
103                     macToString.append(String.format("%02X", mac));\r
104                 }\r
105                 macAddress.setMacAddress(new MacAddress(macToString.toString())); \r
106                 matchEntriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddress.build());\r
107                 currMatchLength = currMatchLength + 8;\r
108                 break;\r
109             default: \r
110                 break;\r
111             }\r
112           matchEntriesList.add(matchEntriesBuilder.build());\r
113         }\r
114         \r
115         return matchEntriesList;\r
116     }\r
117 }\r