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
/**\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
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
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