import java.util.List;\r
\r
import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ActionCreator;\r
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.bucket.ActionsList;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroup;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDesc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDescBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeter;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfig;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow.FlowStatsBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDescBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.group.desc.BucketsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.group.desc.BucketsListBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStatsBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats;\r
break; \r
case 6: builder.setMultipartReplyBody(setGroup(rawMessage));\r
break;\r
+ case 7: builder.setMultipartReplyBody(setGroupDesc(rawMessage));\r
+ break;\r
case 9: builder.setMultipartReplyBody(setMeter(rawMessage));\r
break;\r
case 10: builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
private static MultipartReplyFlow setFlow(ByteBuf input) {\r
final byte PADDING_IN_FLOW_STATS_HEADER_01 = 1;\r
final byte PADDING_IN_FLOW_STATS_HEADER_02 = 4;\r
+ final byte flowLength = 2;\r
MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();\r
List<FlowStats> flowStatsList = new ArrayList<>();\r
FlowStatsBuilder flowStatsBuilder = new FlowStatsBuilder();\r
- int flowLen = 0;\r
while (input.readableBytes() > 0) {\r
- flowLen = input.readUnsignedShort();\r
+ input.skipBytes(flowLength);\r
flowStatsBuilder.setTableId(input.readUnsignedByte());\r
input.skipBytes(PADDING_IN_FLOW_STATS_HEADER_01);\r
flowStatsBuilder.setDurationSec(input.readUnsignedInt());\r
private static MultipartReplyMeterConfig setMeterConfig(ByteBuf input) {\r
final byte METER_BAND_LENGTH = 16;\r
final byte METER_CONFIG_LENGTH = 8;\r
+ final byte bandLength = 2;\r
int actualLength;\r
MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();\r
List<MeterConfig> meterConfigList = new ArrayList<>();\r
MeterBandDscpRemarkBuilder bandDscpRemarkBuilder = new MeterBandDscpRemarkBuilder();\r
final byte PADDING_IN_METER_BAND_DSCP_HEADER = 3;\r
MeterBandExperimenterBuilder bandExperimenterBuilder = new MeterBandExperimenterBuilder(); \r
- int bandLen = 0;\r
int bandType = input.readUnsignedShort();\r
switch (bandType) {\r
case 1: bandDropBuilder.setType(MeterBandType.forValue(bandType));\r
- bandLen = input.readUnsignedShort();\r
+ input.skipBytes(bandLength);\r
bandDropBuilder.setRate(input.readUnsignedInt());\r
bandDropBuilder.setBurstSize(input.readUnsignedInt());\r
input.skipBytes(PADDING_IN_METER_BAND_DROP_HEADER);\r
bandsBuilder.setMeterBand(bandDropBuilder.build());\r
break;\r
case 2: bandDscpRemarkBuilder.setType(MeterBandType.forValue(bandType));\r
- bandLen = input.readUnsignedShort();\r
+ input.skipBytes(bandLength);\r
bandDscpRemarkBuilder.setRate(input.readUnsignedInt());\r
bandDscpRemarkBuilder.setBurstSize(input.readUnsignedInt());\r
bandDscpRemarkBuilder.setPrecLevel(input.readUnsignedByte());\r
bandsBuilder.setMeterBand(bandDscpRemarkBuilder.build());\r
break;\r
case 0xFFFF: bandExperimenterBuilder.setType(MeterBandType.forValue(bandType));\r
- bandLen = input.readUnsignedShort(); \r
+ input.skipBytes(bandLength);\r
bandExperimenterBuilder.setRate(input.readUnsignedInt());\r
bandExperimenterBuilder.setBurstSize(input.readUnsignedInt());\r
bandExperimenterBuilder.setExperimenter(input.readUnsignedInt());\r
return new PortFeatures(_10mbHd, _10mbFd, _100mbHd, _100mbFd, _1gbHd, _1gbFd, _10gbFd,\r
_40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\r
}\r
+ \r
+ private static MultipartReplyGroupDesc setGroupDesc(ByteBuf input) {\r
+ final byte PADDING_IN_GROUP_DESC_HEADER = 1;\r
+ final byte PADDING_IN_BUCKETS_HEADER = 4;\r
+ final byte GROUP_DESC_HEADER_LENGTH = 8;\r
+ int actualLength;\r
+ int bucketsLength = 0;\r
+ int bucketsCurrentLength = 0;\r
+ int bodyLength = 0;\r
+ MultipartReplyGroupDescBuilder builder = new MultipartReplyGroupDescBuilder();\r
+ GroupDescBuilder groupDescBuilder = new GroupDescBuilder();\r
+ List<GroupDesc> groupDescsList = new ArrayList<>();\r
+ BucketsListBuilder bucketsBuilder = new BucketsListBuilder();\r
+ List<BucketsList> bucketsList = new ArrayList<>();\r
+ List<ActionsList> actionsList = new ArrayList<>();\r
+ \r
+ while (input.readableBytes() > 0) {\r
+ bodyLength = input.readUnsignedShort();\r
+ actualLength = 0;\r
+ \r
+ groupDescBuilder.setType(GroupType.forValue(input.readUnsignedByte())); // TODO enum or class?\r
+ input.skipBytes(PADDING_IN_GROUP_DESC_HEADER);\r
+ groupDescBuilder.setGroupId(input.readUnsignedInt());\r
+ actualLength = GROUP_DESC_HEADER_LENGTH;\r
+ \r
+ while (actualLength < bodyLength) {\r
+ \r
+ bucketsLength = input.readUnsignedShort();\r
+ bucketsBuilder.setWeight(input.readUnsignedShort());\r
+ bucketsBuilder.setWatchPort(new PortNumber(input.readUnsignedInt()));\r
+ bucketsBuilder.setWatchGroup(input.readUnsignedInt());\r
+ input.skipBytes(PADDING_IN_BUCKETS_HEADER);\r
+ bucketsCurrentLength = bucketsLength;\r
+ actionsList = ActionCreator.createActionsList(input, bucketsLength);\r
+ bucketsBuilder.setActionsList(new ArrayList<>(actionsList));\r
+ actionsList.clear();\r
+ bucketsList.add(bucketsBuilder.build());\r
+ actualLength = actualLength + bucketsCurrentLength;\r
+ }\r
+ groupDescBuilder.setBucketsList(new ArrayList<>(bucketsList));\r
+ bucketsList.clear();\r
+ groupDescsList.add(groupDescBuilder.build());\r
+ }\r
+ builder.setGroupDesc(new ArrayList<>(groupDescsList));\r
+ groupDescsList.clear();\r
+ return builder.build();\r
+ }\r
+ \r
}\r