2 * Copyright (c) 2015 NetIDE Consortium and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
10 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
11 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint64;
12 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
14 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
15 import io.netty.buffer.ByteBuf;
16 import java.util.ArrayList;
17 import java.util.List;
18 import java.util.Objects;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
21 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
22 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
23 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
24 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMaker;
25 import org.opendaylight.openflowjava.protocol.impl.util.CodeKeyMakerFactory;
26 import org.opendaylight.openflowjava.protocol.impl.util.ListDeserializer;
27 import org.opendaylight.openflowjava.util.ByteBufUtils;
28 import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.ActionRelatedTableFeaturePropertyBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.InstructionRelatedTableFeaturePropertyBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.NextTableRelatedTableFeaturePropertyBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.OxmRelatedTableFeaturePropertyBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.next.table.related.table.feature.property.NextTableIds;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.next.table.related.table.feature.property.NextTableIdsBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescCaseBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCase;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesCaseBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCase;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortDescCaseBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCase;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCase;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.desc._case.MultipartRequestDescBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenterBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group.desc._case.MultipartRequestGroupDescBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group.features._case.MultipartRequestGroupFeaturesBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.features._case.MultipartRequestMeterFeaturesBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.desc._case.MultipartRequestPortDescBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeatures;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeaturesBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;
96 import org.opendaylight.yangtools.yang.common.Empty;
97 import org.opendaylight.yangtools.yang.common.Uint32;
100 * Translates MultipartRequestInput messages.
102 * @author giuseppex.petralia@intel.com
104 @SuppressFBWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") // FB doesn't recognize Objects.requireNonNull
105 public class MultipartRequestInputMessageFactory
106 implements OFDeserializer<MultipartRequestInput>, DeserializerRegistryInjector {
107 private static final byte PADDING = 4;
108 private static final byte FLOW_PADDING_1 = 3;
109 private static final byte FLOW_PADDING_2 = 4;
110 private static final byte AGGREGATE_PADDING_1 = 3;
111 private static final byte AGGREGATE_PADDING_2 = 4;
112 private static final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES = 5;
113 private static final byte MAX_TABLE_NAME_LENGTH = 32;
114 private static final byte MULTIPART_REQUEST_TABLE_FEATURES_STRUCTURE_LENGTH = 64;
115 private static final byte COMMON_PROPERTY_LENGTH = 4;
117 private DeserializerRegistry registry;
120 public void injectDeserializerRegistry(final DeserializerRegistry deserializerRegistry) {
121 registry = deserializerRegistry;
125 public MultipartRequestInput deserialize(final ByteBuf rawMessage) {
126 Objects.requireNonNull(registry);
128 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder()
129 .setVersion(EncodeConstants.OF_VERSION_1_3)
130 .setXid(readUint32(rawMessage));
131 MultipartType type = getMultipartType(rawMessage.readUnsignedShort());
132 builder.setType(type);
133 builder.setFlags(getMultipartRequestFlags(rawMessage.readUnsignedShort()));
134 rawMessage.skipBytes(PADDING);
137 builder.setMultipartRequestBody(setDesc(rawMessage));
140 builder.setMultipartRequestBody(setFlow(rawMessage));
143 builder.setMultipartRequestBody(setAggregate(rawMessage));
146 builder.setMultipartRequestBody(setTable(rawMessage));
148 case OFPMPTABLEFEATURES:
149 builder.setMultipartRequestBody(setTableFeatures(rawMessage));
152 builder.setMultipartRequestBody(setPortStats(rawMessage));
155 builder.setMultipartRequestBody(setPortDesc(rawMessage));
158 builder.setMultipartRequestBody(setQueue(rawMessage));
161 builder.setMultipartRequestBody(setGroup(rawMessage));
164 builder.setMultipartRequestBody(setGroupDesc(rawMessage));
166 case OFPMPGROUPFEATURES:
167 builder.setMultipartRequestBody(setGroupFeatures(rawMessage));
170 builder.setMultipartRequestBody(setMeter(rawMessage));
172 case OFPMPMETERCONFIG:
173 builder.setMultipartRequestBody(setMeterConfig(rawMessage));
175 case OFPMPMETERFEATURES:
176 builder.setMultipartRequestBody(setMeterFeatures(rawMessage));
178 case OFPMPEXPERIMENTER:
179 builder.setMultipartRequestBody(setExperimenter(rawMessage));
185 return builder.build();
188 private static MultipartType getMultipartType(final int input) {
189 return MultipartType.forValue(input);
192 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
193 private static MultipartRequestFlags getMultipartRequestFlags(final int input) {
194 final Boolean _oFPMPFREQMORE = (input & 1 << 0) != 0;
195 MultipartRequestFlags flag = new MultipartRequestFlags(_oFPMPFREQMORE);
199 private MultipartRequestTableFeaturesCase setTableFeatures(final ByteBuf input) {
200 MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder();
201 MultipartRequestTableFeaturesBuilder tableFeaturesBuilder = new MultipartRequestTableFeaturesBuilder();
202 List<TableFeatures> features = new ArrayList<>();
203 while (input.readableBytes() > 0) {
204 TableFeaturesBuilder featuresBuilder = new TableFeaturesBuilder();
205 final int length = input.readUnsignedShort();
206 featuresBuilder.setTableId(readUint8(input));
207 input.skipBytes(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES);
208 featuresBuilder.setName(ByteBufUtils.decodeNullTerminatedString(input, MAX_TABLE_NAME_LENGTH));
209 featuresBuilder.setMetadataMatch(readUint64(input));
210 featuresBuilder.setMetadataWrite(readUint64(input));
211 featuresBuilder.setConfig(createTableConfig(input.readUnsignedInt()));
212 featuresBuilder.setMaxEntries(readUint32(input));
213 featuresBuilder.setTableFeatureProperties(
214 createTableFeaturesProperties(input, length - MULTIPART_REQUEST_TABLE_FEATURES_STRUCTURE_LENGTH));
215 features.add(featuresBuilder.build());
217 tableFeaturesBuilder.setTableFeatures(features);
218 caseBuilder.setMultipartRequestTableFeatures(tableFeaturesBuilder.build());
219 return caseBuilder.build();
222 private List<TableFeatureProperties> createTableFeaturesProperties(final ByteBuf input, final int length) {
223 List<TableFeatureProperties> properties = new ArrayList<>();
224 int tableFeaturesLength = length;
225 while (tableFeaturesLength > 0) {
226 int propStartIndex = input.readerIndex();
227 TableFeaturePropertiesBuilder builder = new TableFeaturePropertiesBuilder();
228 TableFeaturesPropType type = TableFeaturesPropType.forValue(input.readUnsignedShort());
229 builder.setType(type);
230 int propertyLength = input.readUnsignedShort();
231 int paddingRemainder = propertyLength % EncodeConstants.PADDING;
232 tableFeaturesLength -= propertyLength;
233 if (type.equals(TableFeaturesPropType.OFPTFPTINSTRUCTIONS)
234 || type.equals(TableFeaturesPropType.OFPTFPTINSTRUCTIONSMISS)) {
235 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createInstructionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
236 List<Instruction> instructions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
237 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
238 builder.addAugmentation(new InstructionRelatedTableFeaturePropertyBuilder()
239 .setInstruction(instructions)
241 } else if (type.equals(TableFeaturesPropType.OFPTFPTNEXTTABLES)
242 || type.equals(TableFeaturesPropType.OFPTFPTNEXTTABLESMISS)) {
243 propertyLength -= COMMON_PROPERTY_LENGTH;
244 List<NextTableIds> ids = new ArrayList<>();
245 while (propertyLength > 0) {
246 NextTableIdsBuilder nextTableIdsBuilder = new NextTableIdsBuilder();
247 nextTableIdsBuilder.setTableId(readUint8(input));
248 ids.add(nextTableIdsBuilder.build());
251 builder.addAugmentation(new NextTableRelatedTableFeaturePropertyBuilder().setNextTableIds(ids).build());
252 } else if (type.equals(TableFeaturesPropType.OFPTFPTWRITEACTIONS)
253 || type.equals(TableFeaturesPropType.OFPTFPTWRITEACTIONSMISS)
254 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYACTIONS)
255 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYACTIONSMISS)) {
256 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createActionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
257 List<Action> actions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
258 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
259 builder.addAugmentation(new ActionRelatedTableFeaturePropertyBuilder().setAction(actions).build());
260 } else if (type.equals(TableFeaturesPropType.OFPTFPTMATCH)
261 || type.equals(TableFeaturesPropType.OFPTFPTWILDCARDS)
262 || type.equals(TableFeaturesPropType.OFPTFPTWRITESETFIELD)
263 || type.equals(TableFeaturesPropType.OFPTFPTWRITESETFIELDMISS)
264 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYSETFIELD)
265 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYSETFIELDMISS)) {
266 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createMatchEntriesKeyMaker(EncodeConstants.OF_VERSION_1_3);
267 List<MatchEntry> entries = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
268 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
269 builder.addAugmentation(new OxmRelatedTableFeaturePropertyBuilder().setMatchEntry(entries).build());
270 } else if (type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTER)
271 || type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTERMISS)) {
272 final Uint32 expId = readUint32(input);
273 input.readerIndex(propStartIndex);
274 OFDeserializer<TableFeatureProperties> propDeserializer = registry
275 .getDeserializer(ExperimenterDeserializerKeyFactory
276 .createMultipartReplyTFDeserializerKey(EncodeConstants.OF_VERSION_1_3, expId));
277 TableFeatureProperties expProp = propDeserializer.deserialize(input);
278 properties.add(expProp);
281 if (paddingRemainder != 0) {
282 input.skipBytes(EncodeConstants.PADDING - paddingRemainder);
283 tableFeaturesLength -= EncodeConstants.PADDING - paddingRemainder;
285 properties.add(builder.build());
290 private static TableConfig createTableConfig(final long input) {
291 boolean deprecated = (input & 3) != 0;
292 return new TableConfig(deprecated);
295 private static MultipartRequestDescCase setDesc(final ByteBuf input) {
296 MultipartRequestDescCaseBuilder caseBuilder = new MultipartRequestDescCaseBuilder();
297 MultipartRequestDescBuilder descBuilder = new MultipartRequestDescBuilder();
298 descBuilder.setEmpty(Empty.getInstance());
299 caseBuilder.setMultipartRequestDesc(descBuilder.build());
300 return caseBuilder.build();
303 private MultipartRequestFlowCase setFlow(final ByteBuf input) {
304 final MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();
305 MultipartRequestFlowBuilder flowBuilder = new MultipartRequestFlowBuilder();
306 flowBuilder.setTableId(readUint8(input));
307 input.skipBytes(FLOW_PADDING_1);
308 flowBuilder.setOutPort(readUint32(input));
309 flowBuilder.setOutGroup(readUint32(input));
310 input.skipBytes(FLOW_PADDING_2);
311 flowBuilder.setCookie(readUint64(input));
312 flowBuilder.setCookieMask(readUint64(input));
313 OFDeserializer<Match> matchDeserializer = registry.getDeserializer(
314 new MessageCodeKey(EncodeConstants.OF_VERSION_1_3, EncodeConstants.EMPTY_VALUE, Match.class));
315 flowBuilder.setMatch(matchDeserializer.deserialize(input));
316 caseBuilder.setMultipartRequestFlow(flowBuilder.build());
317 return caseBuilder.build();
320 private MultipartRequestAggregateCase setAggregate(final ByteBuf input) {
321 final MultipartRequestAggregateCaseBuilder caseBuilder = new MultipartRequestAggregateCaseBuilder();
322 MultipartRequestAggregateBuilder aggregateBuilder = new MultipartRequestAggregateBuilder();
323 aggregateBuilder.setTableId(readUint8(input));
324 input.skipBytes(AGGREGATE_PADDING_1);
325 aggregateBuilder.setOutPort(readUint32(input));
326 aggregateBuilder.setOutGroup(readUint32(input));
327 input.skipBytes(AGGREGATE_PADDING_2);
328 aggregateBuilder.setCookie(readUint64(input));
329 aggregateBuilder.setCookieMask(readUint64(input));
330 OFDeserializer<Match> matchDeserializer = registry.getDeserializer(
331 new MessageCodeKey(EncodeConstants.OF_VERSION_1_3, EncodeConstants.EMPTY_VALUE, Match.class));
332 aggregateBuilder.setMatch(matchDeserializer.deserialize(input));
333 caseBuilder.setMultipartRequestAggregate(aggregateBuilder.build());
334 return caseBuilder.build();
337 private static MultipartRequestPortDescCase setPortDesc(final ByteBuf input) {
338 MultipartRequestPortDescCaseBuilder caseBuilder = new MultipartRequestPortDescCaseBuilder();
339 MultipartRequestPortDescBuilder portBuilder = new MultipartRequestPortDescBuilder();
340 portBuilder.setEmpty(Empty.getInstance());
341 caseBuilder.setMultipartRequestPortDesc(portBuilder.build());
342 return caseBuilder.build();
345 private static MultipartRequestPortStatsCase setPortStats(final ByteBuf input) {
346 MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
347 MultipartRequestPortStatsBuilder portBuilder = new MultipartRequestPortStatsBuilder();
348 portBuilder.setPortNo(readUint32(input));
349 caseBuilder.setMultipartRequestPortStats(portBuilder.build());
350 return caseBuilder.build();
353 private static MultipartRequestQueueCase setQueue(final ByteBuf input) {
354 MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
355 MultipartRequestQueueBuilder queueBuilder = new MultipartRequestQueueBuilder();
356 queueBuilder.setPortNo(readUint32(input));
357 queueBuilder.setQueueId(readUint32(input));
358 caseBuilder.setMultipartRequestQueue(queueBuilder.build());
359 return caseBuilder.build();
362 private static MultipartRequestGroupCase setGroup(final ByteBuf input) {
363 MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
364 MultipartRequestGroupBuilder groupBuilder = new MultipartRequestGroupBuilder();
365 groupBuilder.setGroupId(new GroupId(readUint32(input)));
366 caseBuilder.setMultipartRequestGroup(groupBuilder.build());
367 return caseBuilder.build();
370 private static MultipartRequestGroupDescCase setGroupDesc(final ByteBuf input) {
371 MultipartRequestGroupDescCaseBuilder caseBuilder = new MultipartRequestGroupDescCaseBuilder();
372 MultipartRequestGroupDescBuilder groupBuilder = new MultipartRequestGroupDescBuilder();
373 groupBuilder.setEmpty(Empty.getInstance());
374 caseBuilder.setMultipartRequestGroupDesc(groupBuilder.build());
375 return caseBuilder.build();
378 private static MultipartRequestGroupFeaturesCase setGroupFeatures(final ByteBuf input) {
379 MultipartRequestGroupFeaturesCaseBuilder caseBuilder = new MultipartRequestGroupFeaturesCaseBuilder();
380 MultipartRequestGroupFeaturesBuilder groupBuilder = new MultipartRequestGroupFeaturesBuilder();
381 groupBuilder.setEmpty(Empty.getInstance());
382 caseBuilder.setMultipartRequestGroupFeatures(groupBuilder.build());
383 return caseBuilder.build();
386 private static MultipartRequestMeterCase setMeter(final ByteBuf input) {
387 MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
388 MultipartRequestMeterBuilder meterBuilder = new MultipartRequestMeterBuilder();
389 meterBuilder.setMeterId(new MeterId(readUint32(input)));
390 caseBuilder.setMultipartRequestMeter(meterBuilder.build());
391 return caseBuilder.build();
394 private static MultipartRequestMeterConfigCase setMeterConfig(final ByteBuf input) {
395 MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
396 MultipartRequestMeterConfigBuilder meterBuilder = new MultipartRequestMeterConfigBuilder();
397 meterBuilder.setMeterId(new MeterId(readUint32(input)));
398 caseBuilder.setMultipartRequestMeterConfig(meterBuilder.build());
399 return caseBuilder.build();
402 private static MultipartRequestMeterFeaturesCase setMeterFeatures(final ByteBuf input) {
403 MultipartRequestMeterFeaturesCaseBuilder caseBuilder = new MultipartRequestMeterFeaturesCaseBuilder();
404 MultipartRequestMeterFeaturesBuilder meterBuilder = new MultipartRequestMeterFeaturesBuilder();
405 meterBuilder.setEmpty(Empty.getInstance());
406 caseBuilder.setMultipartRequestMeterFeatures(meterBuilder.build());
407 return caseBuilder.build();
410 private static MultipartRequestTableCase setTable(final ByteBuf input) {
411 MultipartRequestTableCaseBuilder caseBuilder = new MultipartRequestTableCaseBuilder();
412 MultipartRequestTableBuilder tableBuilder = new MultipartRequestTableBuilder();
413 tableBuilder.setEmpty(Empty.getInstance());
414 caseBuilder.setMultipartRequestTable(tableBuilder.build());
415 return caseBuilder.build();
418 private static MultipartRequestExperimenterCase setExperimenter(final ByteBuf input) {
419 MultipartRequestExperimenterCaseBuilder caseBuilder = new MultipartRequestExperimenterCaseBuilder();
420 MultipartRequestExperimenterBuilder experimenterBuilder = new MultipartRequestExperimenterBuilder();
421 caseBuilder.setMultipartRequestExperimenter(experimenterBuilder.build());
422 return caseBuilder.build();