7b9f7b1110398a05cab6cd98895a4328fc20b5c2
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartRequestMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.HashMap;\r
7 import java.util.Map;\r
8 \r
9 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
10 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;\r
25 \r
26 /**\r
27  * @author timotej.kubas\r
28  * @author michal.polkorab\r
29  */\r
30 public class MultipartRequestMessageFactory implements OFSerializer<MultipartRequestMessage> {\r
31     private static final byte MESSAGE_TYPE = 18;\r
32     private static final int MESSAGE_LENGTH = 16;\r
33     private static MultipartRequestMessageFactory instance; \r
34     private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;\r
35     private MultipartRequestMessageFactory() {\r
36         // singleton\r
37     }\r
38     \r
39     /**\r
40      * @return singleton factory\r
41      */\r
42     public static synchronized MultipartRequestMessageFactory getInstance() {\r
43         if (instance == null) {\r
44             instance = new MultipartRequestMessageFactory();\r
45         }\r
46         return instance;\r
47     }\r
48     \r
49     @Override\r
50     public void messageToBuffer(short version, ByteBuf out,\r
51             MultipartRequestMessage message) {\r
52         ByteBufUtils.writeOFHeader(instance, message, out);\r
53         out.writeShort(message.getType().getIntValue());\r
54         out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));\r
55         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_MESSAGE, out);\r
56         \r
57         if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {\r
58             encodeFlowBody(message.getMultipartRequestBody(), out);\r
59         } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {\r
60             encodeAggregateBody(message.getMultipartRequestBody(), out);\r
61         } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {\r
62             encodePortStatsBody(message.getMultipartRequestBody(), out);\r
63         } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {\r
64             encodeQueBody(message.getMultipartRequestBody(), out);\r
65         } else if (message.getMultipartRequestBody() instanceof MultipartRequestGroup) {\r
66             encodeGroupStatsBody(message.getMultipartRequestBody(), out);\r
67         } else if (message.getMultipartRequestBody() instanceof MultipartRequestMeter) {\r
68             encodeMeterBody(message.getMultipartRequestBody(), out);\r
69         } else if (message.getMultipartRequestBody() instanceof MultipartRequestMeterConfig) {\r
70             encodeMeterConfigBody(message.getMultipartRequestBody(), out);\r
71         } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {\r
72             encodeExperimenterBody(message.getMultipartRequestBody(), out);\r
73         } else if (message.getMultipartRequestBody() instanceof MultipartRequestTableFeatures) {\r
74             encodeTableFeaturesBody(message.getMultipartRequestBody(), out);\r
75         }\r
76     }\r
77     \r
78     @Override\r
79     public int computeLength(MultipartRequestMessage message) {\r
80         // TODO\r
81         return MESSAGE_LENGTH;\r
82     }\r
83     @Override\r
84     public byte getMessageType() {\r
85         return MESSAGE_TYPE;\r
86     } \r
87     \r
88     private static int createMultipartRequestFlagsBitmask(MultipartRequestFlags flags) {\r
89         int multipartRequestFlagsBitmask = 0;\r
90         Map<Integer, Boolean> multipartRequestFlagsMap = new HashMap<>();\r
91         multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE());\r
92         \r
93         multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);\r
94         return multipartRequestFlagsBitmask;\r
95     }\r
96     \r
97     private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
98         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;\r
99         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;\r
100         MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;\r
101         output.writeByte(flow.getTableId().byteValue());\r
102         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01, output);\r
103         output.writeInt(flow.getOutPort().intValue());\r
104         output.writeInt(flow.getOutGroup().intValue());\r
105         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02, output);\r
106         output.writeLong(flow.getCookie().longValue()); \r
107         output.writeLong(flow.getCookieMask().longValue());\r
108         //TODO match field\r
109     }\r
110     \r
111     private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
112         final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01 = 3;\r
113         final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02 = 4;\r
114         MultipartRequestAggregate aggregate = (MultipartRequestAggregate) multipartRequestBody;\r
115         output.writeByte(aggregate.getTableId().byteValue());\r
116         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01, output);\r
117         output.writeInt(aggregate.getOutPort().intValue());\r
118         output.writeInt(aggregate.getOutGroup().intValue());\r
119         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02, output);\r
120         output.writeLong(aggregate.getCookie().longValue()); \r
121         output.writeLong(aggregate.getCookieMask().longValue());\r
122         //TODO match field\r
123     }\r
124     \r
125     private static void encodePortStatsBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
126         final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;\r
127         MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;\r
128         output.writeInt(portstats.getPortNo().intValue());\r
129         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY, output);\r
130     }\r
131     \r
132     private static void encodeQueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
133         MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;\r
134         output.writeInt(queue.getPortNo().intValue());\r
135         output.writeInt(queue.getQueueId().intValue());\r
136     }\r
137     \r
138     private static void encodeGroupStatsBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
139         final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;\r
140         MultipartRequestGroup groupStats = (MultipartRequestGroup) multipartRequestBody;\r
141         output.writeInt(groupStats.getGroupId().intValue());\r
142         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY, output);\r
143     }\r
144     \r
145     private static void encodeMeterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
146         final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;\r
147         MultipartRequestMeter meter = (MultipartRequestMeter) multipartRequestBody;\r
148         output.writeInt(meter.getMeterId().intValue());\r
149         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_BODY, output);\r
150     }\r
151     \r
152     private static void encodeMeterConfigBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
153         final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;\r
154         MultipartRequestMeterConfig meterConfig = (MultipartRequestMeterConfig) multipartRequestBody;\r
155         output.writeInt(meterConfig.getMeterId().intValue());\r
156         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY, output);\r
157     }\r
158     \r
159     private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
160         MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;\r
161         output.writeInt(experimenter.getExperimenter().intValue());\r
162         output.writeInt(experimenter.getExpType().intValue());\r
163     }\r
164     \r
165     private static void encodeTableFeaturesBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
166         MultipartRequestTableFeatures tableFeatures = (MultipartRequestTableFeatures) multipartRequestBody;\r
167         \r
168         for (TableFeatures currTableFeature : tableFeatures.getTableFeatures()) {\r
169             final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;\r
170             output.writeByte(currTableFeature.getTableId());\r
171             ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY, output);\r
172             output.writeBytes(currTableFeature.getName().getBytes());\r
173             ByteBufUtils.padBuffer((32 - currTableFeature.getName().getBytes().length), output);\r
174             output.writeLong(currTableFeature.getMetadataMatch().longValue());\r
175             output.writeLong(currTableFeature.getMetadataWrite().longValue());\r
176             output.writeInt(createTableConfigBitmask(currTableFeature.getConfig()));\r
177             output.writeInt(currTableFeature.getMaxEntries().intValue());\r
178             //TODO properties\r
179         }\r
180     }\r
181     \r
182     private static int createTableConfigBitmask(TableConfig tableConfig) {\r
183         int tableConfigBitmask = 0;\r
184         Map<Integer, Boolean> tableConfigMap = new HashMap<>();\r
185         tableConfigMap.put(3, tableConfig.isOFPTCDEPRECATEDMASK());\r
186         \r
187         tableConfigBitmask = ByteBufUtils.fillBitMaskFromMap(tableConfigMap);\r
188         return tableConfigBitmask;\r
189     }\r
190 }\r