hello-VersionBitmap fixed
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartRequestMessageFactory.java
index d4a07f6f9ef97244aea43cb6a0c182db1c9eb964..7b9f7b1110398a05cab6cd98895a4328fc20b5c2 100644 (file)
@@ -9,11 +9,23 @@ import java.util.Map;
 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;\r
 \r
 /**\r
  * @author timotej.kubas\r
- *\r
+ * @author michal.polkorab\r
  */\r
 public class MultipartRequestMessageFactory implements OFSerializer<MultipartRequestMessage> {\r
     private static final byte MESSAGE_TYPE = 18;\r
@@ -27,7 +39,7 @@ public class MultipartRequestMessageFactory implements OFSerializer<MultipartReq
     /**\r
      * @return singleton factory\r
      */\r
-    public static MultipartRequestMessageFactory getInstance() {\r
+    public static synchronized MultipartRequestMessageFactory getInstance() {\r
         if (instance == null) {\r
             instance = new MultipartRequestMessageFactory();\r
         }\r
@@ -40,12 +52,32 @@ public class MultipartRequestMessageFactory implements OFSerializer<MultipartReq
         ByteBufUtils.writeOFHeader(instance, message, out);\r
         out.writeShort(message.getType().getIntValue());\r
         out.writeShort(createMultipartRequestFlagsBitmask(message.getFlags()));\r
-        // TODO multipart body (message.getMultipartRequestBody())\r
         ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_MESSAGE, out);\r
+        \r
+        if (message.getMultipartRequestBody() instanceof MultipartRequestFlow) {\r
+            encodeFlowBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestAggregate) {\r
+            encodeAggregateBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestPortStats) {\r
+            encodePortStatsBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestQueue) {\r
+            encodeQueBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestGroup) {\r
+            encodeGroupStatsBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestMeter) {\r
+            encodeMeterBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestMeterConfig) {\r
+            encodeMeterConfigBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestExperimenter) {\r
+            encodeExperimenterBody(message.getMultipartRequestBody(), out);\r
+        } else if (message.getMultipartRequestBody() instanceof MultipartRequestTableFeatures) {\r
+            encodeTableFeaturesBody(message.getMultipartRequestBody(), out);\r
+        }\r
     }\r
     \r
     @Override\r
-    public int computeLength() {\r
+    public int computeLength(MultipartRequestMessage message) {\r
+        // TODO\r
         return MESSAGE_LENGTH;\r
     }\r
     @Override\r
@@ -61,4 +93,98 @@ public class MultipartRequestMessageFactory implements OFSerializer<MultipartReq
         multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);\r
         return multipartRequestFlagsBitmask;\r
     }\r
+    \r
+    private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;\r
+        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;\r
+        MultipartRequestFlow flow = (MultipartRequestFlow) multipartRequestBody;\r
+        output.writeByte(flow.getTableId().byteValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01, output);\r
+        output.writeInt(flow.getOutPort().intValue());\r
+        output.writeInt(flow.getOutGroup().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02, output);\r
+        output.writeLong(flow.getCookie().longValue()); \r
+        output.writeLong(flow.getCookieMask().longValue());\r
+        //TODO match field\r
+    }\r
+    \r
+    private static void encodeAggregateBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01 = 3;\r
+        final byte PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02 = 4;\r
+        MultipartRequestAggregate aggregate = (MultipartRequestAggregate) multipartRequestBody;\r
+        output.writeByte(aggregate.getTableId().byteValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_01, output);\r
+        output.writeInt(aggregate.getOutPort().intValue());\r
+        output.writeInt(aggregate.getOutGroup().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_AGREGGATE_BODY_02, output);\r
+        output.writeLong(aggregate.getCookie().longValue()); \r
+        output.writeLong(aggregate.getCookieMask().longValue());\r
+        //TODO match field\r
+    }\r
+    \r
+    private static void encodePortStatsBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;\r
+        MultipartRequestPortStats portstats = (MultipartRequestPortStats) multipartRequestBody;\r
+        output.writeInt(portstats.getPortNo().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY, output);\r
+    }\r
+    \r
+    private static void encodeQueBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        MultipartRequestQueue queue = (MultipartRequestQueue) multipartRequestBody;\r
+        output.writeInt(queue.getPortNo().intValue());\r
+        output.writeInt(queue.getQueueId().intValue());\r
+    }\r
+    \r
+    private static void encodeGroupStatsBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;\r
+        MultipartRequestGroup groupStats = (MultipartRequestGroup) multipartRequestBody;\r
+        output.writeInt(groupStats.getGroupId().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY, output);\r
+    }\r
+    \r
+    private static void encodeMeterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;\r
+        MultipartRequestMeter meter = (MultipartRequestMeter) multipartRequestBody;\r
+        output.writeInt(meter.getMeterId().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_BODY, output);\r
+    }\r
+    \r
+    private static void encodeMeterConfigBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;\r
+        MultipartRequestMeterConfig meterConfig = (MultipartRequestMeterConfig) multipartRequestBody;\r
+        output.writeInt(meterConfig.getMeterId().intValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY, output);\r
+    }\r
+    \r
+    private static void encodeExperimenterBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        MultipartRequestExperimenter experimenter = (MultipartRequestExperimenter) multipartRequestBody;\r
+        output.writeInt(experimenter.getExperimenter().intValue());\r
+        output.writeInt(experimenter.getExpType().intValue());\r
+    }\r
+    \r
+    private static void encodeTableFeaturesBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {\r
+        MultipartRequestTableFeatures tableFeatures = (MultipartRequestTableFeatures) multipartRequestBody;\r
+        \r
+        for (TableFeatures currTableFeature : tableFeatures.getTableFeatures()) {\r
+            final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;\r
+            output.writeByte(currTableFeature.getTableId());\r
+            ByteBufUtils.padBuffer(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY, output);\r
+            output.writeBytes(currTableFeature.getName().getBytes());\r
+            ByteBufUtils.padBuffer((32 - currTableFeature.getName().getBytes().length), output);\r
+            output.writeLong(currTableFeature.getMetadataMatch().longValue());\r
+            output.writeLong(currTableFeature.getMetadataWrite().longValue());\r
+            output.writeInt(createTableConfigBitmask(currTableFeature.getConfig()));\r
+            output.writeInt(currTableFeature.getMaxEntries().intValue());\r
+            //TODO properties\r
+        }\r
+    }\r
+    \r
+    private static int createTableConfigBitmask(TableConfig tableConfig) {\r
+        int tableConfigBitmask = 0;\r
+        Map<Integer, Boolean> tableConfigMap = new HashMap<>();\r
+        tableConfigMap.put(3, tableConfig.isOFPTCDEPRECATEDMASK());\r
+        \r
+        tableConfigBitmask = ByteBufUtils.fillBitMaskFromMap(tableConfigMap);\r
+        return tableConfigBitmask;\r
+    }\r
 }\r