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.openflowjava.protocol.impl.util.ActionsDeserializer;\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.action.rev130731.actions.ActionsList;\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.GroupCapabilities;\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.GroupTypes;\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.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.buckets.BucketsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsListBuilder;\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.MultipartReplyBody;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregate;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateBuilder;\r
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyDesc;\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.MultipartReplyGroupFeaturesBuilder;\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.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
builder.setType(MultipartType.forValue(rawMessage.readUnsignedShort()));\r
builder.setFlags(new MultipartRequestFlags((rawMessage.readUnsignedShort() & 0x01) != 0));\r
rawMessage.skipBytes(PADDING_IN_MULTIPART_REPLY_HEADER);\r
- // TODO - implement body\r
- //mrmb.setBody(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
\r
switch (builder.getType().getIntValue()) {\r
case 0: builder.setMultipartReplyBody(setDesc(rawMessage));\r
break;\r
case 7: builder.setMultipartReplyBody(setGroupDesc(rawMessage));\r
break;\r
+ case 8: builder.setMultipartReplyBody(setGroupFeatures(rawMessage));\r
+ break;\r
case 9: builder.setMultipartReplyBody(setMeter(rawMessage));\r
break;\r
- case 10: builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
+ case 10: builder.setMultipartReplyBody(setMeterConfig(rawMessage));\r
break;\r
case 11: builder.setMultipartReplyBody(setMeterFeatures(rawMessage));\r
break;\r
}\r
\r
private static FlowModFlags createFlowModFalgsFromBitmap(short input){\r
- final Boolean _oFPFFSENDFLOWREM = (input & (1 << 0)) > 0;\r
- final Boolean _oFPFFCHECKOVERLAP = (input & (1 << 1)) > 0;\r
- final Boolean _oFPFFRESETCOUNTS = (input & (1 << 2)) > 0; \r
- final Boolean _oFPFFNOPKTCOUNTS = (input & (1 << 3)) > 0;\r
- final Boolean _oFPFFNOBYTCOUNTS = (input & (1 << 4)) > 0;\r
+ final Boolean _oFPFFSENDFLOWREM = (input & (1 << 0)) != 0;\r
+ final Boolean _oFPFFCHECKOVERLAP = (input & (1 << 1)) != 0;\r
+ final Boolean _oFPFFRESETCOUNTS = (input & (1 << 2)) != 0; \r
+ final Boolean _oFPFFNOPKTCOUNTS = (input & (1 << 3)) != 0;\r
+ final Boolean _oFPFFNOBYTCOUNTS = (input & (1 << 4)) != 0;\r
return new FlowModFlags(_oFPFFCHECKOVERLAP, _oFPFFNOBYTCOUNTS, _oFPFFNOPKTCOUNTS, _oFPFFRESETCOUNTS, _oFPFFSENDFLOWREM);\r
}\r
\r
}\r
\r
private static MeterFlags decodeMeterModFlags(int input){\r
- final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;\r
- final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;\r
- final Boolean _oFPMFBURST = (input & (1 << 2)) > 0; \r
- final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;\r
+ final Boolean _oFPMFKBPS = (input & (1 << 0)) != 0;\r
+ final Boolean _oFPMFPKTPS = (input & (1 << 1)) != 0;\r
+ final Boolean _oFPMFBURST = (input & (1 << 2)) != 0; \r
+ final Boolean _oFPMFSTATS = (input & (1 << 3)) != 0;\r
return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);\r
}\r
\r
MultipartReplyMeterConfigBuilder builder = new MultipartReplyMeterConfigBuilder();\r
List<MeterConfig> meterConfigList = new ArrayList<>();\r
MeterConfigBuilder meterConfigBuilder = new MeterConfigBuilder();\r
- List<Bands> bandsList = new ArrayList<Bands>();\r
+ List<Bands> bandsList = new ArrayList<>();\r
BandsBuilder bandsBuilder = new BandsBuilder();\r
\r
while (input.readableBytes() > 0) {\r
_40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\r
}\r
\r
+ private static MultipartReplyBody setGroupFeatures(ByteBuf rawMessage) {\r
+ final int SIZE_OF_MAX_GROUPS = 4;\r
+ MultipartReplyGroupFeaturesBuilder featuresBuilder = new MultipartReplyGroupFeaturesBuilder();\r
+ featuresBuilder.setTypes(createGroupType(rawMessage.readUnsignedInt()));\r
+ featuresBuilder.setCapabilities(createCapabilities(rawMessage.readUnsignedInt()));\r
+ List<Long> maxGroupsList = new ArrayList<>();\r
+ for (int i = 0; i < SIZE_OF_MAX_GROUPS ; i++) {\r
+ maxGroupsList.add(rawMessage.readUnsignedInt());\r
+ }\r
+ featuresBuilder.setMaxGroups(maxGroupsList);\r
+ // TODO - groupfeatures - actions bitmap\r
+ rawMessage.skipBytes(4);\r
+ return featuresBuilder.build();\r
+ }\r
+\r
+ private static GroupCapabilities createCapabilities(long input) {\r
+ final Boolean OFOFPGFC_SELECT_WEIGHT = ((input) & (1<<0)) != 0;\r
+ final Boolean OFPGFC_SELECT_LIVENESS = ((input) & (1<<1)) != 0;\r
+ final Boolean OFPGFC_CHAINING = ((input) & (1<<2)) != 0;\r
+ final Boolean OFPGFC_CHAINING_CHECKS = ((input) & (1<<3)) != 0;\r
+ return new GroupCapabilities(OFPGFC_CHAINING, OFPGFC_CHAINING_CHECKS, OFPGFC_SELECT_LIVENESS, OFOFPGFC_SELECT_WEIGHT);\r
+ }\r
+\r
+ private static GroupTypes createGroupType(long input) {\r
+ final Boolean OFPGT_ALL = ((input) & (1<<0)) != 0;\r
+ final Boolean OFPGT_SELECT = ((input) & (1<<1)) != 0;\r
+ final Boolean OFPGT_INDIRECT = ((input) & (1<<2)) != 0;\r
+ final Boolean OFPGT_FF = ((input) & (1<<3)) != 0;\r
+ return new GroupTypes(OFPGT_ALL, OFPGT_FF, OFPGT_INDIRECT, OFPGT_SELECT);\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
bucketsBuilder.setWatchGroup(input.readUnsignedInt());\r
input.skipBytes(PADDING_IN_BUCKETS_HEADER);\r
bucketsCurrentLength = bucketsLength;\r
- actionsList = ActionCreator.createActionsList(input, bucketsLength);\r
+ actionsList = ActionsDeserializer.createActionsList(input, bucketsLength);\r
bucketsBuilder.setActionsList(new ArrayList<>(actionsList));\r
actionsList.clear();\r
bucketsList.add(bucketsBuilder.build());\r