1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
6 import java.util.HashMap;
\r
7 import java.util.Map;
\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
27 * @author timotej.kubas
\r
28 * @author michal.polkorab
\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
40 * @return singleton factory
\r
42 public static synchronized MultipartRequestMessageFactory getInstance() {
\r
43 if (instance == null) {
\r
44 instance = new MultipartRequestMessageFactory();
\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
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
79 public int computeLength(MultipartRequestMessage message) {
\r
81 return MESSAGE_LENGTH;
\r
84 public byte getMessageType() {
\r
85 return MESSAGE_TYPE;
\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
93 multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap);
\r
94 return multipartRequestFlagsBitmask;
\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
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
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
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
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
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
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
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
165 private static void encodeTableFeaturesBody(MultipartRequestBody multipartRequestBody, ByteBuf output) {
\r
166 MultipartRequestTableFeatures tableFeatures = (MultipartRequestTableFeatures) multipartRequestBody;
\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
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
187 tableConfigBitmask = ByteBufUtils.fillBitMaskFromMap(tableConfigMap);
\r
188 return tableConfigBitmask;
\r