2 * Copyright (c) 2013 Pantheon Technologies s.r.o. 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.readUint16;
11 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
12 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint64;
13 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
15 import io.netty.buffer.ByteBuf;
16 import java.nio.charset.StandardCharsets;
17 import java.util.ArrayList;
18 import java.util.List;
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.ActionType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDescCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyExperimenterCaseBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCase;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCase;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCase;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCase;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCase;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortDescCaseBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCase;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCaseBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDescBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.experimenter._case.MultipartReplyExperimenterBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroupBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStatsBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDescBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDescBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.MultipartReplyMeterBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStats;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.MeterStatsBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.meter.stats.MeterBandStats;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter._case.multipart.reply.meter.meter.stats.MeterBandStatsBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.MultipartReplyMeterConfigBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.MeterConfig;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.MeterConfigBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.meter.config.Bands;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config._case.multipart.reply.meter.config.meter.config.BandsBuilder;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.MultipartReplyPortDescBuilder;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.Ports;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc._case.multipart.reply.port.desc.PortsBuilder;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStatsBuilder;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStatsBuilder;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueueBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStatsBuilder;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTableBuilder;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStatsBuilder;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeaturesBuilder;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeatures;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeaturesBuilder;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;
141 import org.opendaylight.yangtools.yang.common.Uint32;
144 * Translates MultipartReply messages.
146 * @author timotej.kubas
147 * @author michal.polkorab
149 public class MultipartReplyMessageFactory implements OFDeserializer<MultipartReplyMessage>,
150 DeserializerRegistryInjector {
152 private static final byte PADDING_IN_MULTIPART_REPLY_HEADER = 4;
153 private static final int DESC_STR_LEN = 256;
154 private static final int SERIAL_NUM_LEN = 32;
155 private static final byte PADDING_IN_FLOW_STATS_HEADER_01 = 1;
156 private static final byte PADDING_IN_FLOW_STATS_HEADER_02 = 4;
157 private static final byte PADDING_IN_AGGREGATE_HEADER = 4;
158 private static final byte PADDING_IN_TABLE_HEADER = 3;
159 private static final byte PADDING_IN_MULTIPART_REPLY_TABLE_FEATURES = 5;
160 private static final byte MAX_TABLE_NAME_LENGTH = 32;
161 private static final byte MULTIPART_REPLY_TABLE_FEATURES_STRUCTURE_LENGTH = 64;
162 private static final byte COMMON_PROPERTY_LENGTH = 4;
163 private static final byte PADDING_IN_PORT_STATS_HEADER = 4;
164 private static final byte PADDING_IN_GROUP_HEADER_01 = 2;
165 private static final byte PADDING_IN_GROUP_HEADER_02 = 4;
166 private static final byte BUCKET_COUNTER_LENGTH = 16;
167 private static final byte GROUP_BODY_LENGTH = 40;
168 private static final byte PADDING_IN_METER_FEATURES_HEADER = 2;
169 private static final byte PADDING_IN_METER_STATS_HEADER = 6;
170 private static final byte METER_BAND_STATS_LENGTH = 16;
171 private static final byte METER_BODY_LENGTH = 40;
172 private static final byte METER_CONFIG_LENGTH = 8;
173 private static final byte PADDING_IN_METER_BAND_DROP_HEADER = 4;
174 private static final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;
175 private static final byte PADDING_IN_PORT_DESC_HEADER_01 = 4;
176 private static final byte PADDING_IN_PORT_DESC_HEADER_02 = 2;
177 private static final int GROUP_TYPES = 4;
178 private static final byte PADDING_IN_GROUP_DESC_HEADER = 1;
179 private static final byte PADDING_IN_BUCKETS_HEADER = 4;
180 private static final byte GROUP_DESC_HEADER_LENGTH = 8;
181 private static final byte BUCKETS_HEADER_LENGTH = 16;
182 private DeserializerRegistry registry;
185 public MultipartReplyMessage deserialize(final ByteBuf rawMessage) {
186 MultipartReplyMessageBuilder builder = new MultipartReplyMessageBuilder()
187 .setVersion(EncodeConstants.OF_VERSION_1_3)
188 .setXid(readUint32(rawMessage));
189 final MultipartType type = MultipartType.forValue(rawMessage.readUnsignedShort());
190 builder.setType(type);
191 builder.setFlags(new MultipartRequestFlags((rawMessage.readUnsignedShort() & 0x01) != 0));
192 rawMessage.skipBytes(PADDING_IN_MULTIPART_REPLY_HEADER);
196 builder.setMultipartReplyBody(setDesc(rawMessage));
199 builder.setMultipartReplyBody(setFlow(rawMessage));
202 builder.setMultipartReplyBody(setAggregate(rawMessage));
205 builder.setMultipartReplyBody(setTable(rawMessage));
208 builder.setMultipartReplyBody(setPortStats(rawMessage));
211 builder.setMultipartReplyBody(setQueue(rawMessage));
214 builder.setMultipartReplyBody(setGroup(rawMessage));
217 builder.setMultipartReplyBody(setGroupDesc(rawMessage));
219 case OFPMPGROUPFEATURES:
220 builder.setMultipartReplyBody(setGroupFeatures(rawMessage));
223 builder.setMultipartReplyBody(setMeter(rawMessage));
225 case OFPMPMETERCONFIG:
226 builder.setMultipartReplyBody(setMeterConfig(rawMessage));
228 case OFPMPMETERFEATURES:
229 builder.setMultipartReplyBody(setMeterFeatures(rawMessage));
231 case OFPMPTABLEFEATURES:
232 builder.setMultipartReplyBody(setTableFeatures(rawMessage));
235 builder.setMultipartReplyBody(setPortDesc(rawMessage));
237 case OFPMPEXPERIMENTER:
238 builder.setMultipartReplyBody(setExperimenter(rawMessage));
244 return builder.build();
247 private static MultipartReplyDescCase setDesc(final ByteBuf input) {
248 final MultipartReplyDescCaseBuilder caseBuilder = new MultipartReplyDescCaseBuilder();
249 MultipartReplyDescBuilder descBuilder = new MultipartReplyDescBuilder();
250 byte[] mfrDescBytes = new byte[DESC_STR_LEN];
251 input.readBytes(mfrDescBytes);
252 String mfrDesc = new String(mfrDescBytes, StandardCharsets.UTF_8);
253 descBuilder.setMfrDesc(mfrDesc.trim());
254 byte[] hwDescBytes = new byte[DESC_STR_LEN];
255 input.readBytes(hwDescBytes);
256 String hwDesc = new String(hwDescBytes, StandardCharsets.UTF_8);
257 descBuilder.setHwDesc(hwDesc.trim());
258 byte[] swDescBytes = new byte[DESC_STR_LEN];
259 input.readBytes(swDescBytes);
260 String swDesc = new String(swDescBytes, StandardCharsets.UTF_8);
261 descBuilder.setSwDesc(swDesc.trim());
262 byte[] serialNumBytes = new byte[SERIAL_NUM_LEN];
263 input.readBytes(serialNumBytes);
264 String serialNum = new String(serialNumBytes, StandardCharsets.UTF_8);
265 descBuilder.setSerialNum(serialNum.trim());
266 byte[] dpDescBytes = new byte[DESC_STR_LEN];
267 input.readBytes(dpDescBytes);
268 String dpDesc = new String(dpDescBytes, StandardCharsets.UTF_8);
269 descBuilder.setDpDesc(dpDesc.trim());
270 caseBuilder.setMultipartReplyDesc(descBuilder.build());
271 return caseBuilder.build();
274 private MultipartReplyFlowCase setFlow(final ByteBuf input) {
275 MultipartReplyFlowCaseBuilder caseBuilder = new MultipartReplyFlowCaseBuilder();
276 MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();
277 List<FlowStats> flowStatsList = new ArrayList<>();
278 while (input.readableBytes() > 0) {
279 FlowStatsBuilder flowStatsBuilder = new FlowStatsBuilder();
280 int flowRecordLength = input.readUnsignedShort();
281 ByteBuf subInput = input.readSlice(flowRecordLength - Short.BYTES);
282 flowStatsBuilder.setTableId(readUint8(subInput));
283 subInput.skipBytes(PADDING_IN_FLOW_STATS_HEADER_01);
284 flowStatsBuilder.setDurationSec(readUint32(subInput));
285 flowStatsBuilder.setDurationNsec(readUint32(subInput));
286 flowStatsBuilder.setPriority(readUint16(subInput));
287 flowStatsBuilder.setIdleTimeout(readUint16(subInput));
288 flowStatsBuilder.setHardTimeout(readUint16(subInput));
289 flowStatsBuilder.setFlags(createFlowModFlagsFromBitmap(subInput.readUnsignedShort()));
290 subInput.skipBytes(PADDING_IN_FLOW_STATS_HEADER_02);
291 flowStatsBuilder.setCookie(readUint64(subInput));
292 flowStatsBuilder.setPacketCount(readUint64(subInput));
293 flowStatsBuilder.setByteCount(readUint64(subInput));
294 OFDeserializer<Match> matchDeserializer = registry.getDeserializer(new MessageCodeKey(
295 EncodeConstants.OF_VERSION_1_3, EncodeConstants.EMPTY_VALUE, Match.class));
296 flowStatsBuilder.setMatch(matchDeserializer.deserialize(subInput));
297 CodeKeyMaker keyMaker = CodeKeyMakerFactory
298 .createInstructionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
299 List<Instruction> instructions = ListDeserializer.deserializeList(
300 EncodeConstants.OF13_VERSION_ID, subInput.readableBytes(), subInput, keyMaker, registry);
301 flowStatsBuilder.setInstruction(instructions);
302 flowStatsList.add(flowStatsBuilder.build());
304 flowBuilder.setFlowStats(flowStatsList);
305 caseBuilder.setMultipartReplyFlow(flowBuilder.build());
306 return caseBuilder.build();
309 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
310 private static FlowModFlags createFlowModFlagsFromBitmap(final int input) {
311 final Boolean fmfSENDFLOWREM = (input & 1 << 0) != 0;
312 final Boolean fmfCHECKOVERLAP = (input & 1 << 1) != 0;
313 final Boolean fmfRESETCOUNTS = (input & 1 << 2) != 0;
314 final Boolean fmfNOPKTCOUNTS = (input & 1 << 3) != 0;
315 final Boolean fmfNOBYTCOUNTS = (input & 1 << 4) != 0;
316 return new FlowModFlags(fmfCHECKOVERLAP, fmfNOBYTCOUNTS, fmfNOPKTCOUNTS, fmfRESETCOUNTS, fmfSENDFLOWREM);
319 private static MultipartReplyAggregateCase setAggregate(final ByteBuf input) {
320 final MultipartReplyAggregateCaseBuilder caseBuilder = new MultipartReplyAggregateCaseBuilder();
321 MultipartReplyAggregateBuilder builder = new MultipartReplyAggregateBuilder();
322 builder.setPacketCount(readUint64(input));
323 builder.setByteCount(readUint64(input));
324 builder.setFlowCount(readUint32(input));
325 input.skipBytes(PADDING_IN_AGGREGATE_HEADER);
326 caseBuilder.setMultipartReplyAggregate(builder.build());
327 return caseBuilder.build();
330 private static MultipartReplyTableCase setTable(final ByteBuf input) {
331 MultipartReplyTableCaseBuilder caseBuilder = new MultipartReplyTableCaseBuilder();
332 MultipartReplyTableBuilder builder = new MultipartReplyTableBuilder();
333 List<TableStats> tableStatsList = new ArrayList<>();
334 while (input.readableBytes() > 0) {
335 TableStatsBuilder tableStatsBuilder = new TableStatsBuilder();
336 tableStatsBuilder.setTableId(readUint8(input));
337 input.skipBytes(PADDING_IN_TABLE_HEADER);
338 tableStatsBuilder.setActiveCount(readUint32(input));
339 tableStatsBuilder.setLookupCount(readUint64(input));
340 tableStatsBuilder.setMatchedCount(readUint64(input));
341 tableStatsList.add(tableStatsBuilder.build());
343 builder.setTableStats(tableStatsList);
344 caseBuilder.setMultipartReplyTable(builder.build());
345 return caseBuilder.build();
348 private MultipartReplyTableFeaturesCase setTableFeatures(final ByteBuf input) {
349 MultipartReplyTableFeaturesCaseBuilder caseBuilder = new MultipartReplyTableFeaturesCaseBuilder();
350 MultipartReplyTableFeaturesBuilder builder = new MultipartReplyTableFeaturesBuilder();
351 List<TableFeatures> features = new ArrayList<>();
352 while (input.readableBytes() > 0) {
353 TableFeaturesBuilder featuresBuilder = new TableFeaturesBuilder();
354 final int length = input.readUnsignedShort();
355 featuresBuilder.setTableId(readUint8(input));
356 input.skipBytes(PADDING_IN_MULTIPART_REPLY_TABLE_FEATURES);
357 featuresBuilder.setName(ByteBufUtils.decodeNullTerminatedString(input, MAX_TABLE_NAME_LENGTH));
358 byte[] metadataMatch = new byte[Long.BYTES];
359 input.readBytes(metadataMatch);
360 featuresBuilder.setMetadataMatch(metadataMatch);
361 byte[] metadataWrite = new byte[Long.BYTES];
362 input.readBytes(metadataWrite);
363 featuresBuilder.setMetadataWrite(metadataWrite);
364 featuresBuilder.setConfig(createTableConfig(input.readUnsignedInt()));
365 featuresBuilder.setMaxEntries(readUint32(input));
366 featuresBuilder.setTableFeatureProperties(createTableFeaturesProperties(input,
367 length - MULTIPART_REPLY_TABLE_FEATURES_STRUCTURE_LENGTH));
368 features.add(featuresBuilder.build());
370 builder.setTableFeatures(features);
371 caseBuilder.setMultipartReplyTableFeatures(builder.build());
372 return caseBuilder.build();
375 private static TableConfig createTableConfig(final long input) {
376 boolean deprecated = (input & 3) != 0;
377 return new TableConfig(deprecated);
380 private List<TableFeatureProperties> createTableFeaturesProperties(final ByteBuf input, final int length) {
381 List<TableFeatureProperties> properties = new ArrayList<>();
382 int tableFeaturesLength = length;
383 while (tableFeaturesLength > 0) {
384 int propStartIndex = input.readerIndex();
385 TableFeaturePropertiesBuilder builder = new TableFeaturePropertiesBuilder();
386 TableFeaturesPropType type = TableFeaturesPropType.forValue(input.readUnsignedShort());
387 builder.setType(type);
388 int propertyLength = input.readUnsignedShort();
389 int paddingRemainder = propertyLength % EncodeConstants.PADDING;
390 tableFeaturesLength -= propertyLength;
391 if (type.equals(TableFeaturesPropType.OFPTFPTINSTRUCTIONS)
392 || type.equals(TableFeaturesPropType.OFPTFPTINSTRUCTIONSMISS)) {
393 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createInstructionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
394 List<Instruction> instructions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
395 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
396 builder.addAugmentation(new InstructionRelatedTableFeaturePropertyBuilder()
397 .setInstruction(instructions)
399 } else if (type.equals(TableFeaturesPropType.OFPTFPTNEXTTABLES)
400 || type.equals(TableFeaturesPropType.OFPTFPTNEXTTABLESMISS)) {
401 propertyLength -= COMMON_PROPERTY_LENGTH;
402 List<NextTableIds> ids = new ArrayList<>();
403 while (propertyLength > 0) {
404 NextTableIdsBuilder nextTableIdsBuilder = new NextTableIdsBuilder();
405 nextTableIdsBuilder.setTableId(readUint8(input));
406 ids.add(nextTableIdsBuilder.build());
409 builder.addAugmentation(new NextTableRelatedTableFeaturePropertyBuilder().setNextTableIds(ids).build());
410 } else if (type.equals(TableFeaturesPropType.OFPTFPTWRITEACTIONS)
411 || type.equals(TableFeaturesPropType.OFPTFPTWRITEACTIONSMISS)
412 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYACTIONS)
413 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYACTIONSMISS)) {
414 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createActionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
415 List<Action> actions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
416 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
417 builder.addAugmentation(new ActionRelatedTableFeaturePropertyBuilder().setAction(actions).build());
418 } else if (type.equals(TableFeaturesPropType.OFPTFPTMATCH)
419 || type.equals(TableFeaturesPropType.OFPTFPTWILDCARDS)
420 || type.equals(TableFeaturesPropType.OFPTFPTWRITESETFIELD)
421 || type.equals(TableFeaturesPropType.OFPTFPTWRITESETFIELDMISS)
422 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYSETFIELD)
423 || type.equals(TableFeaturesPropType.OFPTFPTAPPLYSETFIELDMISS)) {
424 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createMatchEntriesKeyMaker(EncodeConstants.OF_VERSION_1_3);
425 List<MatchEntry> entries = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,
426 propertyLength - COMMON_PROPERTY_LENGTH, input, keyMaker, registry);
427 builder.addAugmentation(new OxmRelatedTableFeaturePropertyBuilder().setMatchEntry(entries).build());
428 } else if (type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTER)
429 || type.equals(TableFeaturesPropType.OFPTFPTEXPERIMENTERMISS)) {
430 final Uint32 expId = readUint32(input);
431 input.readerIndex(propStartIndex);
432 OFDeserializer<TableFeatureProperties> propDeserializer = registry.getDeserializer(
433 ExperimenterDeserializerKeyFactory.createMultipartReplyTFDeserializerKey(
434 EncodeConstants.OF_VERSION_1_3, expId));
435 TableFeatureProperties expProp = propDeserializer.deserialize(input);
436 properties.add(expProp);
439 if (paddingRemainder != 0) {
440 input.skipBytes(EncodeConstants.PADDING - paddingRemainder);
441 tableFeaturesLength -= EncodeConstants.PADDING - paddingRemainder;
443 properties.add(builder.build());
448 private static MultipartReplyPortStatsCase setPortStats(final ByteBuf input) {
449 MultipartReplyPortStatsCaseBuilder caseBuilder = new MultipartReplyPortStatsCaseBuilder();
450 MultipartReplyPortStatsBuilder builder = new MultipartReplyPortStatsBuilder();
451 List<PortStats> portStatsList = new ArrayList<>();
452 while (input.readableBytes() > 0) {
453 PortStatsBuilder portStatsBuilder = new PortStatsBuilder();
454 portStatsBuilder.setPortNo(readUint32(input));
455 input.skipBytes(PADDING_IN_PORT_STATS_HEADER);
456 portStatsBuilder.setRxPackets(readUint64(input));
457 portStatsBuilder.setTxPackets(readUint64(input));
458 portStatsBuilder.setRxBytes(readUint64(input));
459 portStatsBuilder.setTxBytes(readUint64(input));
460 portStatsBuilder.setRxDropped(readUint64(input));
461 portStatsBuilder.setTxDropped(readUint64(input));
462 portStatsBuilder.setRxErrors(readUint64(input));
463 portStatsBuilder.setTxErrors(readUint64(input));
464 portStatsBuilder.setRxFrameErr(readUint64(input));
465 portStatsBuilder.setRxOverErr(readUint64(input));
466 portStatsBuilder.setRxCrcErr(readUint64(input));
467 portStatsBuilder.setCollisions(readUint64(input));
468 portStatsBuilder.setDurationSec(readUint32(input));
469 portStatsBuilder.setDurationNsec(readUint32(input));
470 portStatsList.add(portStatsBuilder.build());
472 builder.setPortStats(portStatsList);
473 caseBuilder.setMultipartReplyPortStats(builder.build());
474 return caseBuilder.build();
477 private static MultipartReplyQueueCase setQueue(final ByteBuf input) {
478 MultipartReplyQueueCaseBuilder caseBuilder = new MultipartReplyQueueCaseBuilder();
479 MultipartReplyQueueBuilder builder = new MultipartReplyQueueBuilder();
480 List<QueueStats> queueStatsList = new ArrayList<>();
481 while (input.readableBytes() > 0) {
482 QueueStatsBuilder queueStatsBuilder = new QueueStatsBuilder();
483 queueStatsBuilder.setPortNo(readUint32(input));
484 queueStatsBuilder.setQueueId(readUint32(input));
485 queueStatsBuilder.setTxBytes(readUint64(input));
486 queueStatsBuilder.setTxPackets(readUint64(input));
487 queueStatsBuilder.setTxErrors(readUint64(input));
488 queueStatsBuilder.setDurationSec(readUint32(input));
489 queueStatsBuilder.setDurationNsec(readUint32(input));
490 queueStatsList.add(queueStatsBuilder.build());
492 builder.setQueueStats(queueStatsList);
493 caseBuilder.setMultipartReplyQueue(builder.build());
494 return caseBuilder.build();
497 private static MultipartReplyGroupCase setGroup(final ByteBuf input) {
498 MultipartReplyGroupCaseBuilder caseBuilder = new MultipartReplyGroupCaseBuilder();
499 MultipartReplyGroupBuilder builder = new MultipartReplyGroupBuilder();
500 List<GroupStats> groupStatsList = new ArrayList<>();
501 while (input.readableBytes() > 0) {
502 GroupStatsBuilder groupStatsBuilder = new GroupStatsBuilder();
503 final int bodyLength = input.readUnsignedShort();
504 input.skipBytes(PADDING_IN_GROUP_HEADER_01);
505 groupStatsBuilder.setGroupId(new GroupId(readUint32(input)));
506 groupStatsBuilder.setRefCount(readUint32(input));
507 input.skipBytes(PADDING_IN_GROUP_HEADER_02);
508 groupStatsBuilder.setPacketCount(readUint64(input));
509 groupStatsBuilder.setByteCount(readUint64(input));
510 groupStatsBuilder.setDurationSec(readUint32(input));
511 groupStatsBuilder.setDurationNsec(readUint32(input));
512 int actualLength = GROUP_BODY_LENGTH;
513 List<BucketStats> bucketStatsList = new ArrayList<>();
514 while (actualLength < bodyLength) {
515 BucketStatsBuilder bucketStatsBuilder = new BucketStatsBuilder();
516 bucketStatsBuilder.setPacketCount(readUint64(input));
517 bucketStatsBuilder.setByteCount(readUint64(input));
518 bucketStatsList.add(bucketStatsBuilder.build());
519 actualLength += BUCKET_COUNTER_LENGTH;
521 groupStatsBuilder.setBucketStats(bucketStatsList);
522 groupStatsList.add(groupStatsBuilder.build());
524 builder.setGroupStats(groupStatsList);
525 caseBuilder.setMultipartReplyGroup(builder.build());
526 return caseBuilder.build();
529 private static MultipartReplyMeterFeaturesCase setMeterFeatures(final ByteBuf input) {
530 final MultipartReplyMeterFeaturesCaseBuilder caseBuilder = new MultipartReplyMeterFeaturesCaseBuilder();
531 MultipartReplyMeterFeaturesBuilder builder = new MultipartReplyMeterFeaturesBuilder();
532 builder.setMaxMeter(readUint32(input));
533 builder.setBandTypes(createMeterBandsBitmap(input.readUnsignedInt()));
534 builder.setCapabilities(createMeterFlags(input.readUnsignedInt()));
535 builder.setMaxBands(readUint8(input));
536 builder.setMaxColor(readUint8(input));
537 input.skipBytes(PADDING_IN_METER_FEATURES_HEADER);
538 caseBuilder.setMultipartReplyMeterFeatures(builder.build());
539 return caseBuilder.build();
542 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
543 private static MeterFlags createMeterFlags(final long input) {
544 final Boolean mfKBPS = (input & 1 << 0) != 0;
545 final Boolean mfPKTPS = (input & 1 << 1) != 0;
546 final Boolean mfBURST = (input & 1 << 2) != 0;
547 final Boolean mfSTATS = (input & 1 << 3) != 0;
548 return new MeterFlags(mfBURST, mfKBPS, mfPKTPS, mfSTATS);
551 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
552 private static MeterBandTypeBitmap createMeterBandsBitmap(final long input) {
553 final Boolean mbtDROP = (input & 1 << 1) != 0;
554 final Boolean mbtDSCPREMARK = (input & 1 << 2) != 0;
555 return new MeterBandTypeBitmap(mbtDROP, mbtDSCPREMARK);
558 private static MultipartReplyMeterCase setMeter(final ByteBuf input) {
559 MultipartReplyMeterCaseBuilder caseBuilder = new MultipartReplyMeterCaseBuilder();
560 MultipartReplyMeterBuilder builder = new MultipartReplyMeterBuilder();
561 List<MeterStats> meterStatsList = new ArrayList<>();
562 while (input.readableBytes() > 0) {
563 MeterStatsBuilder meterStatsBuilder = new MeterStatsBuilder();
564 meterStatsBuilder.setMeterId(new MeterId(readUint32(input)));
565 final int meterStatsBodyLength = input.readUnsignedShort();
566 input.skipBytes(PADDING_IN_METER_STATS_HEADER);
567 meterStatsBuilder.setFlowCount(readUint32(input));
568 meterStatsBuilder.setPacketInCount(readUint64(input));
569 meterStatsBuilder.setByteInCount(readUint64(input));
570 meterStatsBuilder.setDurationSec(readUint32(input));
571 meterStatsBuilder.setDurationNsec(readUint32(input));
572 int actualLength = METER_BODY_LENGTH;
573 List<MeterBandStats> meterBandStatsList = new ArrayList<>();
574 while (actualLength < meterStatsBodyLength) {
575 MeterBandStatsBuilder meterBandStatsBuilder = new MeterBandStatsBuilder();
576 meterBandStatsBuilder.setPacketBandCount(readUint64(input));
577 meterBandStatsBuilder.setByteBandCount(readUint64(input));
578 meterBandStatsList.add(meterBandStatsBuilder.build());
579 actualLength += METER_BAND_STATS_LENGTH;
581 meterStatsBuilder.setMeterBandStats(meterBandStatsList);
582 meterStatsList.add(meterStatsBuilder.build());
584 builder.setMeterStats(meterStatsList);
585 caseBuilder.setMultipartReplyMeter(builder.build());
586 return caseBuilder.build();
589 private MultipartReplyMeterConfigCase setMeterConfig(final ByteBuf input) {
590 MultipartReplyMeterConfigCaseBuilder caseBuilder = new MultipartReplyMeterConfigCaseBuilder();
591 MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();
592 List<MeterConfig> meterConfigList = new ArrayList<>();
593 while (input.readableBytes() > 0) {
594 MeterConfigBuilder meterConfigBuilder = new MeterConfigBuilder();
595 int meterConfigBodyLength = input.readUnsignedShort();
596 meterConfigBuilder.setFlags(createMeterFlags(input.readUnsignedShort()));
597 meterConfigBuilder.setMeterId(new MeterId(readUint32(input)));
598 int actualLength = METER_CONFIG_LENGTH;
599 List<Bands> bandsList = new ArrayList<>();
600 while (actualLength < meterConfigBodyLength) {
601 int bandStartIndex = input.readerIndex();
602 BandsBuilder bandsBuilder = new BandsBuilder();
603 int bandType = input.readUnsignedShort();
606 final MeterBandDropCaseBuilder bandDropCaseBuilder = new MeterBandDropCaseBuilder();
607 MeterBandDropBuilder bandDropBuilder = new MeterBandDropBuilder();
608 bandDropBuilder.setType(MeterBandType.forValue(bandType));
609 actualLength += input.readUnsignedShort();
610 bandDropBuilder.setRate(readUint32(input));
611 bandDropBuilder.setBurstSize(readUint32(input));
612 input.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);
613 bandDropCaseBuilder.setMeterBandDrop(bandDropBuilder.build());
614 bandsBuilder.setMeterBand(bandDropCaseBuilder.build());
617 final MeterBandDscpRemarkCaseBuilder bandDscpRemarkCaseBuilder =
618 new MeterBandDscpRemarkCaseBuilder();
619 MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();
620 bandDscpRemarkBuilder.setType(MeterBandType.forValue(bandType));
621 actualLength += input.readUnsignedShort();
622 bandDscpRemarkBuilder.setRate(readUint32(input));
623 bandDscpRemarkBuilder.setBurstSize(readUint32(input));
624 bandDscpRemarkBuilder.setPrecLevel(readUint8(input));
625 input.skipBytes(PADDING_IN_METER_BAND_DSCP_HEADER);
626 bandDscpRemarkCaseBuilder.setMeterBandDscpRemark(bandDscpRemarkBuilder.build());
627 bandsBuilder.setMeterBand(bandDscpRemarkCaseBuilder.build());
630 actualLength += input.readUnsignedShort();
631 final Uint32 expId = Uint32.fromIntBits(input.getInt(input.readerIndex() + 2 * Integer.BYTES));
632 input.readerIndex(bandStartIndex);
633 OFDeserializer<MeterBandExperimenterCase> deserializer = registry.getDeserializer(
634 ExperimenterDeserializerKeyFactory.createMeterBandDeserializerKey(
635 EncodeConstants.OF_VERSION_1_3, expId));
636 bandsBuilder.setMeterBand(deserializer.deserialize(input));
641 bandsList.add(bandsBuilder.build());
643 meterConfigBuilder.setBands(bandsList);
644 meterConfigList.add(meterConfigBuilder.build());
646 builder.setMeterConfig(meterConfigList);
647 caseBuilder.setMultipartReplyMeterConfig(builder.build());
648 return caseBuilder.build();
651 private MultipartReplyExperimenterCase setExperimenter(final ByteBuf input) {
652 final Uint32 expId = readUint32(input);
653 final Uint32 expType = readUint32(input);
655 final OFDeserializer<ExperimenterDataOfChoice> deserializer = registry.getDeserializer(
656 ExperimenterDeserializerKeyFactory.createMultipartReplyMessageDeserializerKey(
657 EncodeConstants.OF_VERSION_1_3, expId, expType.toJava()));
659 final MultipartReplyExperimenterBuilder mpExperimenterBld = new MultipartReplyExperimenterBuilder()
660 .setExperimenter(new ExperimenterId(expId))
662 .setExperimenterDataOfChoice(deserializer.deserialize(input));
663 final MultipartReplyExperimenterCaseBuilder mpReplyExperimenterCaseBld =
664 new MultipartReplyExperimenterCaseBuilder().setMultipartReplyExperimenter(mpExperimenterBld.build());
665 return mpReplyExperimenterCaseBld.build();
668 private static MultipartReplyPortDescCase setPortDesc(final ByteBuf input) {
669 MultipartReplyPortDescCaseBuilder caseBuilder = new MultipartReplyPortDescCaseBuilder();
670 MultipartReplyPortDescBuilder builder = new MultipartReplyPortDescBuilder();
671 List<Ports> portsList = new ArrayList<>();
672 while (input.readableBytes() > 0) {
673 PortsBuilder portsBuilder = new PortsBuilder();
674 portsBuilder.setPortNo(readUint32(input));
675 input.skipBytes(PADDING_IN_PORT_DESC_HEADER_01);
676 portsBuilder.setHwAddr(ByteBufUtils.readIetfMacAddress(input));
677 input.skipBytes(PADDING_IN_PORT_DESC_HEADER_02);
678 portsBuilder.setName(ByteBufUtils.decodeNullTerminatedString(input, EncodeConstants.MAX_PORT_NAME_LENGTH));
679 portsBuilder.setConfig(createPortConfig(input.readUnsignedInt()));
680 portsBuilder.setState(createPortState(input.readUnsignedInt()));
681 portsBuilder.setCurrentFeatures(createPortFeatures(input.readUnsignedInt()));
682 portsBuilder.setAdvertisedFeatures(createPortFeatures(input.readUnsignedInt()));
683 portsBuilder.setSupportedFeatures(createPortFeatures(input.readUnsignedInt()));
684 portsBuilder.setPeerFeatures(createPortFeatures(input.readUnsignedInt()));
685 portsBuilder.setCurrSpeed(readUint32(input));
686 portsBuilder.setMaxSpeed(readUint32(input));
687 portsList.add(portsBuilder.build());
689 builder.setPorts(portsList);
690 caseBuilder.setMultipartReplyPortDesc(builder.build());
691 return caseBuilder.build();
694 private static PortConfig createPortConfig(final long input) {
695 final Boolean pcPortDown = (input & 1 << 0) != 0;
696 final Boolean pcNRecv = (input & 1 << 2) != 0;
697 final Boolean pcNFwd = (input & 1 << 5) != 0;
698 final Boolean pcNPacketIn = (input & 1 << 6) != 0;
699 return new PortConfig(pcNFwd, pcNPacketIn, pcNRecv, pcPortDown);
702 private static PortState createPortState(final long input) {
703 final Boolean psLinkDown = (input & 1 << 0) != 0;
704 final Boolean psBlocked = (input & 1 << 1) != 0;
705 final Boolean psLive = (input & 1 << 2) != 0;
706 return new PortState(psBlocked, psLinkDown, psLive);
709 private static PortFeatures createPortFeatures(final long input) {
710 final Boolean pf10mbHd = (input & 1 << 0) != 0;
711 final Boolean pf10mbFd = (input & 1 << 1) != 0;
712 final Boolean pf100mbHd = (input & 1 << 2) != 0;
713 final Boolean pf100mbFd = (input & 1 << 3) != 0;
714 final Boolean pf1gbHd = (input & 1 << 4) != 0;
715 final Boolean pf1gbFd = (input & 1 << 5) != 0;
716 final Boolean pf10gbFd = (input & 1 << 6) != 0;
717 final Boolean pf40gbFd = (input & 1 << 7) != 0;
718 final Boolean pf100gbFd = (input & 1 << 8) != 0;
719 final Boolean pf1tbFd = (input & 1 << 9) != 0;
720 final Boolean pfOther = (input & 1 << 10) != 0;
721 final Boolean pfCopper = (input & 1 << 11) != 0;
722 final Boolean pfFiber = (input & 1 << 12) != 0;
723 final Boolean pfAutoneg = (input & 1 << 13) != 0;
724 final Boolean pfPause = (input & 1 << 14) != 0;
725 final Boolean pfPauseAsym = (input & 1 << 15) != 0;
726 return new PortFeatures(pf100gbFd, pf100mbFd, pf100mbHd, pf10gbFd, pf10mbFd, pf10mbHd, pf1gbFd,
727 pf1gbHd, pf1tbFd, pf40gbFd, pfAutoneg, pfCopper, pfFiber, pfOther, pfPause, pfPauseAsym);
730 private static MultipartReplyGroupFeaturesCase setGroupFeatures(final ByteBuf rawMessage) {
731 final MultipartReplyGroupFeaturesCaseBuilder caseBuilder = new MultipartReplyGroupFeaturesCaseBuilder();
732 MultipartReplyGroupFeaturesBuilder featuresBuilder = new MultipartReplyGroupFeaturesBuilder();
733 featuresBuilder.setTypes(createGroupType(rawMessage.readUnsignedInt()));
734 featuresBuilder.setCapabilities(createCapabilities(rawMessage.readUnsignedInt()));
735 List<Uint32> maxGroupsList = new ArrayList<>(GROUP_TYPES);
736 for (int i = 0; i < GROUP_TYPES; i++) {
737 maxGroupsList.add(Uint32.valueOf(rawMessage.readUnsignedInt()));
739 featuresBuilder.setMaxGroups(maxGroupsList);
740 List<ActionType> actionBitmaps = new ArrayList<>(GROUP_TYPES);
741 for (int i = 0; i < GROUP_TYPES; i++) {
742 actionBitmaps.add(createActionBitmap(rawMessage.readUnsignedInt()));
744 featuresBuilder.setActionsBitmap(actionBitmaps);
745 caseBuilder.setMultipartReplyGroupFeatures(featuresBuilder.build());
746 return caseBuilder.build();
749 @SuppressWarnings("checkstyle:AbbreviationAsWordInName")
750 private static ActionType createActionBitmap(final long input) {
751 final Boolean atOutput = (input & 1 << 0) != 0;
752 final Boolean atCopyTTLout = (input & 1 << 11) != 0;
753 final Boolean atCopyTTLin = (input & 1 << 12) != 0;
754 final Boolean atSetMplsTTL = (input & 1 << 15) != 0;
755 final Boolean atDecMplsTTL = (input & 1 << 16) != 0;
756 final Boolean atPushVLAN = (input & 1 << 17) != 0;
757 final Boolean atPopVLAN = (input & 1 << 18) != 0;
758 final Boolean atPushMPLS = (input & 1 << 19) != 0;
759 final Boolean atPopMPLS = (input & 1 << 20) != 0;
760 final Boolean atSetQueue = (input & 1 << 21) != 0;
761 final Boolean atGroup = (input & 1 << 22) != 0;
762 final Boolean atSetNWTTL = (input & 1 << 23) != 0;
763 final Boolean atDecNWTTL = (input & 1 << 24) != 0;
764 final Boolean atSetField = (input & 1 << 25) != 0;
765 final Boolean atPushPBB = (input & 1 << 26) != 0;
766 final Boolean atPopPBB = (input & 1 << 27) != 0;
767 final Boolean atExperimenter = false;
768 return new ActionType(atCopyTTLin, atCopyTTLout, atDecMplsTTL,
769 atDecNWTTL, atExperimenter, atGroup, atOutput, atPopMPLS,
770 atPopPBB, atPopVLAN, atPushMPLS, atPushPBB, atPushVLAN,
771 atSetField, atSetMplsTTL, atSetNWTTL, atSetQueue);
774 private static GroupCapabilities createCapabilities(final long input) {
775 final Boolean gcSelectWeight = (input & 1 << 0) != 0;
776 final Boolean gcSelectLiveness = (input & 1 << 1) != 0;
777 final Boolean gcChaining = (input & 1 << 2) != 0;
778 final Boolean gcChainingChecks = (input & 1 << 3) != 0;
779 return new GroupCapabilities(gcChaining, gcChainingChecks, gcSelectLiveness, gcSelectWeight);
782 private static GroupTypes createGroupType(final long input) {
783 final Boolean gtAll = (input & 1 << 0) != 0;
784 final Boolean gtSelect = (input & 1 << 1) != 0;
785 final Boolean gtIndirect = (input & 1 << 2) != 0;
786 final Boolean gtFF = (input & 1 << 3) != 0;
787 return new GroupTypes(gtAll, gtFF, gtIndirect, gtSelect);
790 private MultipartReplyGroupDescCase setGroupDesc(final ByteBuf input) {
791 MultipartReplyGroupDescCaseBuilder caseBuilder = new MultipartReplyGroupDescCaseBuilder();
792 MultipartReplyGroupDescBuilder builder = new MultipartReplyGroupDescBuilder();
793 List<GroupDesc> groupDescsList = new ArrayList<>();
794 while (input.readableBytes() > 0) {
795 GroupDescBuilder groupDescBuilder = new GroupDescBuilder();
796 final int bodyLength = input.readUnsignedShort();
797 groupDescBuilder.setType(GroupType.forValue(input.readUnsignedByte()));
798 input.skipBytes(PADDING_IN_GROUP_DESC_HEADER);
799 groupDescBuilder.setGroupId(new GroupId(readUint32(input)));
800 int actualLength = GROUP_DESC_HEADER_LENGTH;
801 List<BucketsList> bucketsList = new ArrayList<>();
802 while (actualLength < bodyLength) {
803 BucketsListBuilder bucketsBuilder = new BucketsListBuilder();
804 final int bucketsLength = input.readUnsignedShort();
805 bucketsBuilder.setWeight(readUint16(input));
806 bucketsBuilder.setWatchPort(new PortNumber(readUint32(input)));
807 bucketsBuilder.setWatchGroup(readUint32(input));
808 input.skipBytes(PADDING_IN_BUCKETS_HEADER);
809 CodeKeyMaker keyMaker = CodeKeyMakerFactory.createActionsKeyMaker(EncodeConstants.OF_VERSION_1_3);
810 List<Action> actions = ListDeserializer.deserializeList(EncodeConstants.OF13_VERSION_ID,
811 bucketsLength - BUCKETS_HEADER_LENGTH, input, keyMaker, registry);
812 bucketsBuilder.setAction(actions);
813 bucketsList.add(bucketsBuilder.build());
814 actualLength += bucketsLength;
816 groupDescBuilder.setBucketsList(bucketsList);
817 groupDescsList.add(groupDescBuilder.build());
819 builder.setGroupDesc(groupDescsList);
820 caseBuilder.setMultipartReplyGroupDesc(builder.build());
821 return caseBuilder.build();
825 public void injectDeserializerRegistry(
826 final DeserializerRegistry deserializerRegistry) {
827 registry = deserializerRegistry;