import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
SalFlowService, //
SalMeterService, //
PacketProcessingService, //
+ OpendaylightGroupStatisticsService,
+ OpendaylightMeterStatisticsService,
Identifiable<InstanceIdentifier<Node>> {
CompositeObjectRegistration<ModelDrivenSwitch> register(ProviderContext ctx);
import org.opendaylight.openflowplugin.openflow.md.core.translator.FlowRemovedTranslator;
import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartMessageDescToNodeUpdatedTranslator;
import org.opendaylight.openflowplugin.openflow.md.core.translator.MultiPartReplyPortToNodeConnectorUpdatedTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.translator.MultipartReplyTranslator;
import org.opendaylight.openflowplugin.openflow.md.core.translator.PacketInTranslator;
import org.opendaylight.openflowplugin.openflow.md.core.translator.PortStatusMessageToNodeConnectorUpdatedTranslator;
import org.opendaylight.openflowplugin.openflow.md.queue.PopListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;
addMessageTranslator(MultipartReplyMessage.class,OF13,new MultiPartReplyPortToNodeConnectorUpdatedTranslator());
addMessageTranslator(MultipartReplyMessage.class,OF13, new MultiPartMessageDescToNodeUpdatedTranslator());
addMessageTranslator(ExperimenterMessage.class, OF10, new ExperimenterTranslator());
+ addMessageTranslator(MultipartReplyMessage.class,OF13, new MultipartReplyTranslator());
//TODO: move registration to factory
NotificationPopListener<DataObject> notificationPopListener = new NotificationPopListener<DataObject>();
addMessagePopListener(PacketReceived.class,notificationPopListener);
addMessagePopListener(TransmitPacketInput.class, notificationPopListener);
addMessagePopListener(NodeUpdated.class, notificationPopListener);
+
+ //Notification registrations for group-statistics
+ addMessagePopListener(GroupStatisticsUpdated.class, notificationPopListener);
+ addMessagePopListener(GroupFeaturesUpdated.class, notificationPopListener);
+ addMessagePopListener(GroupDescStatsUpdated.class, notificationPopListener);
+
+ //Notification registrations for meter-statistics
+ addMessagePopListener(MeterStatisticsUpdated.class, notificationPopListener);
+ addMessagePopListener(MeterConfigStatsUpdated.class, notificationPopListener);
+ addMessagePopListener(MeterFeaturesUpdated.class, notificationPopListener);
+
// Push the updated Listeners to Session Manager which will be then picked up by ConnectionConductor eventually
OFSessionUtil.getSessionManager().setTranslatorMapping(messageTranslators);
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.SalGroupService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
import org.opendaylight.yangtools.concepts.CompositeObjectRegistration.CompositeObjectRegistrationBuilder;
private RoutedRpcRegistration<PacketProcessingService> packetRegistration;
+ private RoutedRpcRegistration<OpendaylightGroupStatisticsService> groupStatisticsRegistration;
+
+ private RoutedRpcRegistration<OpendaylightMeterStatisticsService> meterStatisticsRegistration;
+
protected final SessionContext sessionContext;
protected AbstractModelDrivenSwitch(InstanceIdentifier<Node> identifier,SessionContext conductor) {
//packetRegistration = ctx.addRoutedRpcImplementation(PacketProcessingService.class, this);
//packetRegistration.registerPath(NodeContext.class, getIdentifier());
//builder.add(packetRegistration);
+
+ groupStatisticsRegistration = ctx.addRoutedRpcImplementation(OpendaylightGroupStatisticsService.class, this);
+ groupStatisticsRegistration.registerPath(NodeContext.class, getIdentifier());
+ builder.add(groupStatisticsRegistration);
+
+ meterStatisticsRegistration = ctx.addRoutedRpcImplementation(OpendaylightMeterStatisticsService.class, this);
+ meterStatisticsRegistration.registerPath(NodeContext.class, getIdentifier());
+ builder.add(meterStatisticsRegistration);
return builder.toInstance();
}
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import java.util.concurrent.Future;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Meter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcError;
public NodeId getNodeId() {
return nodeId;
}
+
+ /*
+ * Methods for requesting statistics from switch
+ */
+ @Override
+ public Future<RpcResult<GetAllGroupStatisticsOutput>> getAllGroupStatistics(GetAllGroupStatisticsInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare statistics request for all the groups - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPGROUP);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the group stats
+ MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+ mprGroupBuild.setGroupId((long) Group.OFPGALL.getIntValue());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprGroupBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send group statistics request to the switch :{}",mprGroupBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetAllGroupStatisticsOutputBuilder output = new GetAllGroupStatisticsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setGroupStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetAllGroupStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+
+ }
+
+ @Override
+ public Future<RpcResult<GetGroupDescriptionOutput>> getGroupDescription(GetGroupDescriptionInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare group description statistics request - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPGROUPDESC);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the group description stats
+ MultipartRequestGroupDescBuilder mprGroupDescBuild = new MultipartRequestGroupDescBuilder();
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprGroupDescBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send group desciption statistics request to switch : {}",mprGroupDescBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetGroupDescriptionOutputBuilder output = new GetGroupDescriptionOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setGroupDescStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetGroupDescriptionOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+
+ }
+
+ @Override
+ public Future<RpcResult<GetGroupFeaturesOutput>> getGroupFeatures(GetGroupFeaturesInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare group features statistics request - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPGROUPFEATURES);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the group description stats
+ MultipartRequestGroupFeaturesBuilder mprGroupFeaturesBuild = new MultipartRequestGroupFeaturesBuilder();
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprGroupFeaturesBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send group features statistics request :{}",mprGroupFeaturesBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetGroupFeaturesOutputBuilder output = new GetGroupFeaturesOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetGroupFeaturesOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetGroupStatisticsOutput>> getGroupStatistics(GetGroupStatisticsInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare statistics request for group ({}) - Transaction id - {}",input.getId().toString(),xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPGROUP);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the group stats
+ MultipartRequestGroupBuilder mprGroupBuild = new MultipartRequestGroupBuilder();
+ mprGroupBuild.setGroupId(input.getGroupId().getValue());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprGroupBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send group statistics request :{}",mprGroupBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetGroupStatisticsOutputBuilder output = new GetGroupStatisticsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setGroupStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetGroupStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetAllMeterConfigStatisticsOutput>> getAllMeterConfigStatistics(
+ GetAllMeterConfigStatisticsInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare config request for all the meters - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPMETERCONFIG);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the meter stats
+ MultipartRequestMeterConfigBuilder mprMeterConfigBuild = new MultipartRequestMeterConfigBuilder();
+ mprMeterConfigBuild.setMeterId((long) Meter.OFPMALL.getIntValue());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprMeterConfigBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send meter statistics request :{}",mprMeterConfigBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetAllMeterConfigStatisticsOutputBuilder output = new GetAllMeterConfigStatisticsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setMeterConfigStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetAllMeterConfigStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetAllMeterStatisticsOutput>> getAllMeterStatistics(GetAllMeterStatisticsInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare statistics request for all the meters - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPMETER);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the meter stats
+ MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
+ mprMeterBuild.setMeterId((long) Meter.OFPMALL.getIntValue());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprMeterBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send meter statistics request :{}",mprMeterBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetAllMeterStatisticsOutputBuilder output = new GetAllMeterStatisticsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setMeterStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetAllMeterStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetMeterFeaturesOutput>> getMeterFeatures(GetMeterFeaturesInput input) {
+
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Prepare features statistics request for all the meters - Transaction id - {}",xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPMETERFEATURES);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the group description stats
+ MultipartRequestMeterFeaturesBuilder mprMeterFeaturesBuild = new MultipartRequestMeterFeaturesBuilder();
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprMeterFeaturesBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send meter features statistics request :{}",mprMeterFeaturesBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetMeterFeaturesOutputBuilder output = new GetMeterFeaturesOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetMeterFeaturesOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetMeterStatisticsOutput>> getMeterStatistics(GetMeterStatisticsInput input) {
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.debug("Preprae statistics request for Meter ({}) - Transaction id - {}",input.getMeterId().getValue(),xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPMETER);
+ mprInput.setVersion((short)0x04);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body for fetch all the meter stats
+ MultipartRequestMeterBuilder mprMeterBuild = new MultipartRequestMeterBuilder();
+ //Select specific meter
+ mprMeterBuild.setMeterId(input.getMeterId().getValue());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(mprMeterBuild.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send meter statistics request :{}",mprMeterBuild);
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ LOG.debug("Return results and transaction id back to caller");
+ GetMeterStatisticsOutputBuilder output = new GetMeterStatisticsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setMeterStats(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetMeterStatisticsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ private TransactionId generateTransactionId(Long xid){
+ String stringXid =xid.toString();
+ BigInteger bigIntXid = new BigInteger( stringXid );
+ return new TransactionId(bigIntXid);
+
+ }
}
import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlIn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
/**
* @author usha@ericsson Action List:This class takes data from SAL layer and
* converts into OF Data
+ * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL actions
*
*/
public final class ActionConvertor {
actionsListBuilder.setAction(actionBuilder.build());
return actionsListBuilder.build();
}
+
+ /**
+ * Method to convert OF actions associated with bucket to SAL Actions.
+ * @param actionList
+ * @return List of converted SAL Actions.
+ */
+ public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(List<ActionsList> actionList){
+
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions =
+ new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
+
+ for(ActionsList actionDesc : actionList){
+
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action
+ = actionDesc.getAction();
+
+ if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
+ bucketActions.add(ofToSALOutputAction(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
+ bucketActions.add(ofToSALGroupAction(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut){
+ CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
+ bucketActions.add(copyTtlOutaction.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn){
+ CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
+ bucketActions.add(copyTtlInaction.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
+ bucketActions.add(ofToSALSetMplsTtl(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl){
+ DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
+ bucketActions.add(decMplsTtl.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
+ bucketActions.add(ofToSALPushVlanAction(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan){
+ PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
+ bucketActions.add(popVlan.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls){
+ PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
+ bucketActions.add(pushMpls.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls){
+ PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
+ bucketActions.add(popMpls.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
+ bucketActions.add(ofToSALSetQueue(action));
+
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
+ bucketActions.add(ofToSALSetNwTtl(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl){
+ DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
+ bucketActions.add(decNwTtl.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
+ bucketActions.add(FlowConvertor.ofToSALSetField(action));
+
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
+ bucketActions.add(ofToSALPushPbbAction(action));
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb){
+ PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
+ bucketActions.add(popPbb.build());
+ }
+ else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter){
+ //bucketActions.add(ofToSALExperimenter(action));
+ // TODO: Need to explore/discuss on how to handle experimenter case.
+ }
+
+ }
+ return bucketActions;
+ }
+
+ /**
+ * Method converts OF Output action object to SAL Output action object.
+ * @param action org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action
+ * @return OutputAction
+ */
+ public static OutputAction ofToSALOutputAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ OutputActionBuilder outputAction = new OutputActionBuilder();
+ PortAction port = action.getAugmentation(PortAction.class);
+ if(port != null){
+ outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
+ }else {
+ logger.error("Provided action is not OF Output action, no associated port found!" );
+ }
+
+ MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
+ if(length != null){
+ outputAction.setMaxLength(length.getMaxLength());
+ }else{
+ logger.error("Provided action is not OF Output action, no associated length found!");
+ }
+
+ return outputAction.build();
+ }
+
+ /**
+ * Method converts OF GroupAction object to SAL GroupAction object
+ * @param action
+ * @return GroupAction
+ */
+ public static GroupAction ofToSALGroupAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ GroupActionBuilder groupAction = new GroupActionBuilder();
+
+ GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
+ groupAction.setGroupId(groupId.getGroupId());
+
+ return groupAction.build();
+ }
+
+ /**
+ * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action object.
+ * @param action
+ * @return
+ */
+ public static SetMplsTtlAction ofToSALSetMplsTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
+
+ SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
+ MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
+ mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
+ return mplsTtlAction.build();
+ }
+
+ /**
+ * Method converts OF Pushvlan action to SAL PushVlan action.
+ * @param action
+ * @return PushVlanAction
+ */
+ public static PushVlanAction ofToSALPushVlanAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
+
+ EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
+ pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
+
+ return pushVlanAction.build();
+ }
+
+ /**
+ * Method converts OF SetQueue action to SAL SetQueue action.
+ * @param action
+ * @return SetQueueAction
+ */
+ public static SetQueueAction ofToSALSetQueue(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
+
+ QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
+ setQueueAction.setQueueId(queueId.getQueueId());
+
+ return setQueueAction.build();
+ }
+
+ /**
+ * Method converts OF SetNwTtl action to SAL SetNwTtl action.
+ * @param action
+ * @return SetNwTtlAction
+ */
+ public static SetNwTtlAction ofToSALSetNwTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
+ NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
+ setNwTtl.setNwTtl(nwTtl.getNwTtl());
+
+ return setNwTtl.build();
+ }
+
+ /**
+ * Method converts OF Pushvlan action to SAL PushVlan action.
+ * @param action
+ * @return PushVlanAction
+ */
+ public static PushPbbAction ofToSALPushPbbAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+
+ PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
+
+ EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
+ pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
+
+ return pushPbbAction.build();
+ }
+
+ public static Object ofToSALExperimenter(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
+
+ ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
+
+ return null;
+ /*
+ * TODO: Need to explore/discuss about how to handle experimenter
+ *
+ */
+
+ }
}
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActions;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadata;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionsInstructionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstructionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
matchEntriesBuilder.setOxmMatchField(VlanPcp.class);
VlanPcpMatchEntryBuilder vlanPcpBuilder = new VlanPcpMatchEntryBuilder();
vlanPcpBuilder.setVlanPcp(vlanMatch.getVlanPcp().getValue());
- matchEntriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanPcpBuilder.build());
+ matchEntriesBuilder.addAugmentation(VlanPcpMatchEntry.class, vlanPcpBuilder.build());
matchEntriesList.add(matchEntriesBuilder.build());
}
}
portBuilder.setPort(port);
builder.addAugmentation(PortMatchEntry.class, portBuilder.build());
}
+
+ /**
+ * Method converts OF SetField Match to SAL SetFiled matches
+ * @param action
+ * @return
+ */
+ public static SetField ofToSALSetField(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
+ logger.info("OF SetField match to SAL SetField match converstion begins");
+ SetFieldBuilder setField = new SetFieldBuilder();
+/* OxmFieldsAction oxmFields = action.getAugmentation(OxmFieldsAction.class);
+
+ List<MatchEntries> matchEntries = oxmFields.getMatchEntries();
+ org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field.MatchBuilder match =new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field.MatchBuilder();
+
+ EthernetMatchBuilder ethernetMatchBuilder = null;
+ VlanMatchBuilder vlanMatchBuilder = null;
+ IpMatchBuilder ipMatchBuilder = null;
+ TcpMatchBuilder tcpMatchBuilder = null;
+ UdpMatchBuilder udpMatchBuilder = null;
+ SctpMatchBuilder sctpMatchBuilder = null;
+ Icmpv4MatchBuilder icmpv4MatchBuilder = null;
+ Icmpv6MatchBuilder icmpv6MatchBuilder = null;
+ Ipv4MatchBuilder ipv4MatchBuilder = null;
+ ArpMatchBuilder arpMatchBuilder = null;
+ Ipv6MatchBuilder ipv6MatchBuilder = null;
+ ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = null;
+
+ for(MatchEntries matchEntry : matchEntries){
+ if(matchEntry instanceof InPort){
+ PortNumberMatchEntry inPort = matchEntry.getAugmentation(PortNumberMatchEntry.class);
+ match.setInPort(inPort.getPortNumber().getValue());
+ }else if (matchEntry instanceof InPhyPort){
+ PortNumberMatchEntry phyPort = matchEntry.getAugmentation(PortNumberMatchEntry.class);
+ match.setInPhyPort(phyPort.getPortNumber().getValue());
+ }else if (matchEntry instanceof Metadata){
+ MetadataMatchEntry metadataMatch = matchEntry.getAugmentation(MetadataMatchEntry.class);
+ MetadataBuilder metadataBuilder = new MetadataBuilder();
+ metadataBuilder.setMetadata(new BigInteger(metadataMatch.getMetadata()));
+ MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+ if (maskMatch != null){
+ metadataBuilder.setMetadataMask(maskMatch.getMask());
+ }
+ match.setMetadata(metadataBuilder.build());
+ }else if (matchEntry instanceof EthDst){
+
+ if(ethernetMatchBuilder == null)
+ ethernetMatchBuilder = new EthernetMatchBuilder();
+
+ MacAddressMatchEntry macAddressMatch = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+ EthernetDestinationBuilder ethernetDestination = new EthernetDestinationBuilder();
+ ethernetDestination.setAddress(macAddressMatch.getMacAddress());
+ if(maskMatch != null){
+ ethernetDestination.setMask(maskMatch.getMask());
+ }
+ ethernetMatchBuilder.setEthernetDestination(ethernetDestination.build());
+ }else if (matchEntry instanceof EthSrc){
+ if(ethernetMatchBuilder == null)
+ ethernetMatchBuilder = new EthernetMatchBuilder();
+
+ MacAddressMatchEntry macAddressMatch = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+ EthernetSourceBuilder ethernetSource = new EthernetSourceBuilder();
+ ethernetSource.setAddress(macAddressMatch.getMacAddress());
+ if(maskMatch != null){
+ ethernetSource.setMask(maskMatch.getMask());
+ }
+ ethernetMatchBuilder.setEthernetSource(ethernetSource.build());
+ }else if (matchEntry instanceof EthType){
+ if(ethernetMatchBuilder == null)
+ ethernetMatchBuilder = new EthernetMatchBuilder();
+
+ EthTypeMatchEntry etherTypeMatch = matchEntry.getAugmentation(EthTypeMatchEntry.class);
+ EthernetTypeBuilder ethernetType= new EthernetTypeBuilder();
+ org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType etherType = new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType((long)etherTypeMatch.getEthType().getValue());
+ ethernetType.setType(etherType);
+ ethernetMatchBuilder.setEthernetType(ethernetType.build());
+ }else if (matchEntry instanceof VlanVid){
+ if(vlanMatchBuilder == null)
+ vlanMatchBuilder = new VlanMatchBuilder();
+
+ VlanVidMatchEntry vlanVidMatch = matchEntry.getAugmentation(VlanVidMatchEntry.class);
+ MaskMatchEntry maskMatch = matchEntry.getAugmentation(MaskMatchEntry.class);
+
+ VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
+ vlanIdBuilder.setVlanId(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanVidMatch.getVlanVid()));
+ if(maskMatch != null){
+ vlanIdBuilder.setMask(maskMatch.getMask());
+ }
+ vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
+
+ }else if (matchEntry instanceof VlanPcp){
+ if(vlanMatchBuilder == null)
+ vlanMatchBuilder = new VlanMatchBuilder();
+
+ VlanPcpMatchEntry vlanPcpMatch = matchEntry.getAugmentation(VlanPcpMatchEntry.class);
+ vlanMatchBuilder.setVlanPcp(
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp(vlanPcpMatch.getVlanPcp()));
+ }else if (matchEntry instanceof IpDscp){
+ if(ipMatchBuilder == null)
+ ipMatchBuilder = new IpMatchBuilder();
+
+ DscpMatchEntry dscpMatchEntry = matchEntry.getAugmentation(DscpMatchEntry.class);
+ ipMatchBuilder.setIpDscp(dscpMatchEntry.getDscp());
+
+ }else if (matchEntry instanceof IpEcn){
+ if(ipMatchBuilder == null)
+ ipMatchBuilder = new IpMatchBuilder();
+
+ EcnMatchEntry ecnMatchEntry = matchEntry.getAugmentation(EcnMatchEntry.class);
+ ipMatchBuilder.setIpEcn(ecnMatchEntry.getEcn());
+
+ }else if (matchEntry instanceof IpProto){
+ if(ipMatchBuilder == null)
+ ipMatchBuilder = new IpMatchBuilder();
+
+ ProtocolNumberMatchEntry protocolNumberMatch = matchEntry.getAugmentation(ProtocolNumberMatchEntry.class);
+ ipMatchBuilder.setIpProtocol(protocolNumberMatch.getProtocolNumber());
+ }else if (matchEntry instanceof TcpSrc){
+ if(tcpMatchBuilder == null)
+ tcpMatchBuilder = new TcpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ tcpMatchBuilder.setTcpSourcePort(portMatchEntry.getPort());
+
+ }else if (matchEntry instanceof TcpDst){
+ if(tcpMatchBuilder == null)
+ tcpMatchBuilder = new TcpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ tcpMatchBuilder.setTcpDestinationPort(portMatchEntry.getPort());
+
+ }else if (matchEntry instanceof UdpSrc){
+ if(udpMatchBuilder == null)
+ udpMatchBuilder = new UdpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ udpMatchBuilder.setUdpSourcePort(portMatchEntry.getPort());
+
+
+ }else if (matchEntry instanceof UdpDst){
+ if(udpMatchBuilder == null)
+ udpMatchBuilder = new UdpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ udpMatchBuilder.setUdpDestinationPort(portMatchEntry.getPort());
+ }else if (matchEntry instanceof SctpSrc){
+ if(sctpMatchBuilder == null)
+ sctpMatchBuilder = new SctpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ sctpMatchBuilder.setSctpSourcePort(portMatchEntry.getPort());
+
+ }else if (matchEntry instanceof SctpDst){
+ if(sctpMatchBuilder == null)
+ sctpMatchBuilder = new SctpMatchBuilder();
+
+ PortMatchEntry portMatchEntry = matchEntry.getAugmentation(PortMatchEntry.class);
+ sctpMatchBuilder.setSctpDestinationPort(portMatchEntry.getPort());
+ }else if (matchEntry instanceof Icmpv4Type){
+ if(icmpv4MatchBuilder == null)
+ icmpv4MatchBuilder = new Icmpv4MatchBuilder();
+
+ Icmpv4TypeMatchEntry icmpv4TypeMatchEntry = matchEntry.getAugmentation(Icmpv4TypeMatchEntry.class);
+ icmpv4MatchBuilder.setIcmpv4Type(icmpv4TypeMatchEntry.getIcmpv4Type());
+
+ }else if (matchEntry instanceof Icmpv4Code){
+ if(icmpv4MatchBuilder == null)
+ icmpv4MatchBuilder = new Icmpv4MatchBuilder();
+
+ Icmpv4CodeMatchEntry icmpv4CodeMatchEntry = matchEntry.getAugmentation(Icmpv4CodeMatchEntry.class);
+ icmpv4MatchBuilder.setIcmpv4Code(icmpv4CodeMatchEntry.getIcmpv4Code());
+
+ }else if (matchEntry instanceof Icmpv6Type){
+ if(icmpv6MatchBuilder == null)
+ icmpv6MatchBuilder = new Icmpv6MatchBuilder();
+
+ Icmpv6TypeMatchEntry icmpv6TypeMatchEntry = matchEntry.getAugmentation(Icmpv6TypeMatchEntry.class);
+ icmpv6MatchBuilder.setIcmpv6Type(icmpv6TypeMatchEntry.getIcmpv6Type());
+ }else if (matchEntry instanceof Icmpv6Code){
+ if(icmpv6MatchBuilder == null)
+ icmpv6MatchBuilder = new Icmpv6MatchBuilder();
+
+ Icmpv6CodeMatchEntry icmpv6CodeMatchEntry = matchEntry.getAugmentation(Icmpv6CodeMatchEntry.class);
+ icmpv6MatchBuilder.setIcmpv6Code(icmpv6CodeMatchEntry.getIcmpv6Code());
+ }else if (matchEntry instanceof Ipv4Src){
+ if(ipv4MatchBuilder == null)
+ ipv4MatchBuilder = new Ipv4MatchBuilder();
+
+ Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ipv4MatchBuilder.setIpv4Source(
+ new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+ +"/"+new String(maskMatchEntry.getMask())));
+
+ }else if (matchEntry instanceof Ipv4Dst){
+ if(ipv4MatchBuilder == null)
+ ipv4MatchBuilder = new Ipv4MatchBuilder();
+
+ Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ipv4MatchBuilder.setIpv4Destination(
+ new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+ +"/"+new String(maskMatchEntry.getMask())));
+ }else if (matchEntry instanceof ArpOp){
+ if(arpMatchBuilder == null)
+ arpMatchBuilder = new ArpMatchBuilder();
+
+ OpCodeMatchEntry opCodeMatchEntry = matchEntry.getAugmentation(OpCodeMatchEntry.class);
+ arpMatchBuilder.setArpOp(opCodeMatchEntry.getOpCode());
+
+ }else if (matchEntry instanceof ArpSpa){
+ if(arpMatchBuilder == null)
+ arpMatchBuilder = new ArpMatchBuilder();
+
+ Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ arpMatchBuilder.setArpSourceTransportAddress(
+ new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+ +"/"+new String(maskMatchEntry.getMask())));
+
+ }else if (matchEntry instanceof ArpTpa){
+ if(arpMatchBuilder == null)
+ arpMatchBuilder = new ArpMatchBuilder();
+
+ Ipv4AddressMatchEntry ipv4AddressMatchEntry = matchEntry.getAugmentation(Ipv4AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ arpMatchBuilder.setArpTargetTransportAddress(
+ new Ipv4Prefix(ipv4AddressMatchEntry.getIpv4Address().getValue()
+ +"/"+new String(maskMatchEntry.getMask())));
+
+ }else if (matchEntry instanceof ArpSha){
+ if(arpMatchBuilder == null)
+ arpMatchBuilder = new ArpMatchBuilder();
+
+ MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
+ arpSourceHardwareAddressBuilder.setAddress(macAddressMatchEntry.getMacAddress());
+ arpSourceHardwareAddressBuilder.setMask(maskMatchEntry.getMask());
+ arpMatchBuilder.setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder.build());
+
+ }else if (matchEntry instanceof ArpTha){
+ if(arpMatchBuilder == null)
+ arpMatchBuilder = new ArpMatchBuilder();
+
+ MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
+ arpTargetHardwareAddressBuilder.setAddress(macAddressMatchEntry.getMacAddress());
+ arpTargetHardwareAddressBuilder.setMask(maskMatchEntry.getMask());
+ arpMatchBuilder.setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder.build());
+ }else if (matchEntry instanceof Ipv6Src){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix (ipv6AddressMatchEntry.getIpv6Address().getValue()+
+ "/"+new String(maskMatchEntry.getMask())));
+
+ }else if (matchEntry instanceof Ipv6Dst){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ ipv6MatchBuilder.setIpv6Destination(new Ipv6Prefix (ipv6AddressMatchEntry.getIpv6Address().getValue()+
+ "/"+new String(maskMatchEntry.getMask())));
+
+ }else if (matchEntry instanceof Ipv6Flabel){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ Ipv6FlabelMatchEntry ipv6FlabelMatchEntry = matchEntry.getAugmentation(Ipv6FlabelMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
+ ipv6LabelBuilder.setIpv6Flabel(ipv6FlabelMatchEntry.getIpv6Flabel());
+ ipv6LabelBuilder.setFlabelMask(maskMatchEntry.getMask());
+ ipv6MatchBuilder.setIpv6Label(ipv6LabelBuilder.build());
+
+ }else if (matchEntry instanceof Ipv6NdTarget){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+ Ipv6AddressMatchEntry ipv6AddressMatchEntry = matchEntry.getAugmentation(Ipv6AddressMatchEntry.class);
+ ipv6MatchBuilder.setIpv6NdTarget(ipv6AddressMatchEntry.getIpv6Address());
+
+ }else if (matchEntry instanceof Ipv6NdSll){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ ipv6MatchBuilder.setIpv6NdSll(macAddressMatchEntry.getMacAddress());
+ }else if (matchEntry instanceof Ipv6NdTll){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ MacAddressMatchEntry macAddressMatchEntry = matchEntry.getAugmentation(MacAddressMatchEntry.class);
+ ipv6MatchBuilder.setIpv6NdTll(macAddressMatchEntry.getMacAddress());
+
+ }else if (matchEntry instanceof Ipv6Exthdr){
+ if(ipv6MatchBuilder == null)
+ ipv6MatchBuilder = new Ipv6MatchBuilder();
+
+ PseudoFieldMatchEntry pseudoFieldMatchEntry = matchEntry.getAugmentation(PseudoFieldMatchEntry.class);
+ PseudoField pseudoField = pseudoFieldMatchEntry.getPseudoField();
+ int pseudoFieldInt = 0;
+ pseudoFieldInt |= pseudoField.isNonext()?(1 << 0):~(1 << 0);
+ pseudoFieldInt |= pseudoField.isEsp()?(1 << 1):~(1 << 1);
+ pseudoFieldInt |= pseudoField.isAuth()?(1 << 2):~(1 << 2);
+ pseudoFieldInt |= pseudoField.isDest()?(1 << 3):~(1 << 3);
+ pseudoFieldInt |= pseudoField.isFrag()?(1 << 4):~(1 << 4);
+ pseudoFieldInt |= pseudoField.isRouter()?(1 << 5):~(1 << 5);
+ pseudoFieldInt |= pseudoField.isHop()?(1 << 6):~(1 << 6);
+ pseudoFieldInt |= pseudoField.isUnrep()?(1 << 7):~(1 << 7);
+ pseudoFieldInt |= pseudoField.isUnseq()?(1 << 8):~(1 << 8);
+
+ ipv6MatchBuilder.setIpv6Exthdr(pseudoFieldInt);
+ }else if (matchEntry instanceof MplsLabel){
+ if(protocolMatchFieldsBuilder == null)
+ protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+
+ MplsLabelMatchEntry MplsLabelMatchEntry = matchEntry.getAugmentation(MplsLabelMatchEntry.class);
+ protocolMatchFieldsBuilder.setMplsLabel(MplsLabelMatchEntry.getMplsLabel());
+
+ }else if (matchEntry instanceof MplsBos){
+ if(protocolMatchFieldsBuilder == null)
+ protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+
+ BosMatchEntry bosMatchEntry = matchEntry.getAugmentation(BosMatchEntry.class);
+ protocolMatchFieldsBuilder.setMplsBos(bosMatchEntry.isBos()?(short)1:(short)0);
+
+ }else if (matchEntry instanceof MplsTc) {
+ if(protocolMatchFieldsBuilder == null)
+ protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+
+ TcMatchEntry tcMatchEntry = matchEntry.getAugmentation(TcMatchEntry.class);
+ protocolMatchFieldsBuilder.setMplsTc(tcMatchEntry.getTc());
+
+ }else if (matchEntry instanceof PbbIsid){
+ if(protocolMatchFieldsBuilder == null)
+ protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
+
+ IsidMatchEntry isidMatchEntry = matchEntry.getAugmentation(IsidMatchEntry.class);
+ PbbBuilder pbbBuilder = new PbbBuilder();
+ pbbBuilder.setPbbIsid(isidMatchEntry.getIsid());
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ if(maskMatchEntry != null)
+ pbbBuilder.setPbbMask(maskMatchEntry.getMask());
+
+ protocolMatchFieldsBuilder.setPbb(pbbBuilder.build());
+ }else if (matchEntry instanceof TunnelId){
+ MetadataMatchEntry metadataMatchEntry = matchEntry.getAugmentation(MetadataMatchEntry.class);
+ MaskMatchEntry maskMatchEntry = matchEntry.getAugmentation(MaskMatchEntry.class);
+ TunnelBuilder tunnelBuilder = new TunnelBuilder();
+ tunnelBuilder.setTunnelId(new BigInteger(metadataMatchEntry.getMetadata()));
+ tunnelBuilder.setTunnelMask(maskMatchEntry.getMask());
+ match.setTunnel(tunnelBuilder.build());
+ }
+ }
+ if(ethernetMatchBuilder != null){
+ match.setEthernetMatch(ethernetMatchBuilder.build());
+ }
+ if (vlanMatchBuilder != null){
+ match.setVlanMatch(vlanMatchBuilder.build());
+ }
+ if(ipMatchBuilder != null){
+ match.setIpMatch(ipMatchBuilder.build());
+ }
+ if(tcpMatchBuilder != null){
+ match.setLayer4Match(tcpMatchBuilder.build());
+ }
+ if(udpMatchBuilder != null){
+ match.setLayer4Match(udpMatchBuilder.build());
+ }
+ if(sctpMatchBuilder != null){
+ match.setLayer4Match(sctpMatchBuilder.build());
+ }
+ if(icmpv4MatchBuilder != null){
+ match.setIcmpv4Match(icmpv4MatchBuilder.build());
+ }
+ if(icmpv6MatchBuilder != null){
+ match.setIcmpv6Match(icmpv6MatchBuilder.build());
+ }
+ if(ipv4MatchBuilder != null){
+ match.setLayer3Match(ipv4MatchBuilder.build());
+ }
+ if(arpMatchBuilder != null){
+ match.setLayer3Match(arpMatchBuilder.build());
+ }
+ if(ipv6MatchBuilder != null){
+ match.setLayer3Match(ipv6MatchBuilder.build());
+ }
+ if(protocolMatchFieldsBuilder != null){
+ match.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
+ }
+ setField.setMatch(match.build());
+
+ */ return setField.build();
+ }
+
}
\ No newline at end of file
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.BucketsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc;
+
+/**
+ * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
+ * messages.
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class GroupStatsResponseConvertor {
+
+ public List<GroupStats> toSALGroupStatsList(
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats> allGroupStats){
+ List<GroupStats> convertedSALGroups = new ArrayList<GroupStats>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats group: allGroupStats){
+ convertedSALGroups.add(toSALGroupStats(group));
+ }
+ return convertedSALGroups;
+
+ }
+ /**
+ * Method convert GroupStats message from library to MD SAL defined GroupStats
+ * @param groupStats GroupStats from library
+ * @return GroupStats -- GroupStats defined in MD-SAL
+ */
+ public GroupStats toSALGroupStats(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.GroupStats groupStats){
+
+ GroupStatsBuilder salGroupStats = new GroupStatsBuilder();
+
+ salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats()));
+ salGroupStats.setByteCount(new Counter64(groupStats.getByteCount()));
+
+ DurationBuilder time = new DurationBuilder();
+ time.setSecond(new Counter32(groupStats.getDurationSec()));
+ time.setNanosecond(new Counter32(groupStats.getDurationNsec()));
+
+ salGroupStats.setDuration(time.build());
+ salGroupStats.setGroupId(groupStats.getGroupId().intValue());
+ salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount()));
+ salGroupStats.setRefCount(new Counter32(groupStats.getRefCount()));
+
+ return salGroupStats.build();
+ }
+
+ public Buckets toSALBuckets(
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats> bucketStats ){
+
+ BucketsBuilder salBuckets = new BucketsBuilder();
+
+ List<BucketCounter> allBucketStats = new ArrayList<BucketCounter>();
+
+ for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.group.stats.BucketStats bucketStat : bucketStats){
+ BucketCounterBuilder bucketCounter = new BucketCounterBuilder();
+ bucketCounter.setByteCount(new Counter64(bucketStat.getByteCount()));
+ bucketCounter.setPacketCount(new Counter64(bucketStat.getPacketCount()));
+ allBucketStats.add(bucketCounter.build());
+ }
+ salBuckets.setBucketCounter(allBucketStats);
+ return salBuckets.build();
+ }
+
+
+ public List<GroupDescStats> toSALGroupDescStatsList(
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.
+ multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc> allGroupDescStats){
+
+ List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<GroupDescStats>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc.GroupDesc groupDesc: allGroupDescStats){
+ convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc));
+ }
+ return convertedSALGroupsDesc;
+
+ }
+ /**
+ * Method convert GroupStats message from library to MD SAL defined GroupStats
+ * @param groupDesc GroupStats from library
+ * @return GroupStats -- GroupStats defined in MD-SAL
+ */
+ public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc){
+
+ GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
+
+ salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList()));
+ salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId()));
+ salGroupDescStats.setGroupType(GroupType.forValue(groupDesc.getType().getIntValue()));
+
+ return salGroupDescStats.build();
+ }
+
+ public org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList> bucketDescStats ){
+
+ org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc =
+ new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder();
+
+ List<Bucket> allBuckets = new ArrayList<Bucket>();
+
+ for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList bucketDetails : bucketDescStats){
+ BucketBuilder bucketDesc = new BucketBuilder();
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> convertedSalActions =
+ ActionConvertor.toSALBucketActions (bucketDetails.getActionsList());
+
+ List<Action> actions = new ArrayList<Action>();
+ for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions){
+ ActionBuilder warppedAction = new ActionBuilder();
+ warppedAction.setAction(action);
+ actions.add(warppedAction.build());
+ }
+ bucketDesc.setAction(actions);
+ bucketDesc.setWeight(bucketDetails.getWeight());
+ bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue());
+ bucketDesc.setWatchGroup(bucketDetails.getWatchGroup());
+ allBuckets.add(bucketDesc.build());
+ }
+ salBucketsDesc.setBucket(allBuckets);
+ return salBucketsDesc.build();
+ }
+
+}
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter64;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.ExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.config.stats.reply.MeterConfigStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.DurationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.MeterBandStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStat;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.meter.band.stats.BandStatBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDrop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemark;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenter;
+
+/**
+ * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
+ * messages.
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class MeterStatsResponseConvertor {
+
+ /**
+ * Method converts list of OF Meter Stats to SAL Meter Stats.
+ * @param allMeterStats
+ * @return List of MeterStats
+ */
+ public List<MeterStats> toSALMeterStatsList(
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats> allMeterStats){
+ List<MeterStats> convertedSALMeters = new ArrayList<MeterStats>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meter: allMeterStats){
+ convertedSALMeters.add(toSALMeterStats(meter));
+ }
+ return convertedSALMeters;
+
+ }
+
+ /**
+ * Method convert MeterStats message from library to MD SAL defined MeterStats
+ * @param meterStats MeterStats from library
+ * @return MeterStats -- MeterStats defined in MD-SAL
+ */
+ public MeterStats toSALMeterStats(
+ org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.MeterStats meterStats){
+
+ MeterStatsBuilder salMeterStats = new MeterStatsBuilder();
+ salMeterStats.setByteInCount(new Counter64(meterStats.getByteInCount()));
+
+ DurationBuilder time = new DurationBuilder();
+ time.setSecond(new Counter32(meterStats.getDurationSec()));
+ time.setNanosecond(new Counter32(meterStats.getDurationNsec()));
+ salMeterStats.setDuration(time.build());
+
+ salMeterStats.setFlowCount(new Counter32(meterStats.getFlowCount()));
+ salMeterStats.setMeterId(meterStats.getMeterId().intValue());
+ salMeterStats.setPacketInCount(new Counter64(meterStats.getPacketInCount()));
+
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
+ .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
+ .meter.stats.MeterBandStats> allMeterBandStats = meterStats.getMeterBandStats();
+
+ MeterBandStatsBuilder meterBandStatsBuilder = new MeterBandStatsBuilder();
+ List<BandStat> listAllBandStats = new ArrayList<BandStat>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol
+ .rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter
+ .meter.stats.MeterBandStats meterBandStats : allMeterBandStats){
+ BandStatBuilder bandStatBuilder = new BandStatBuilder();
+ bandStatBuilder.setByteBandCount(new Counter64(meterBandStats.getByteBandCount()));
+ bandStatBuilder.setPacketBandCount(new Counter64(meterBandStats.getPacketBandCount()));
+ listAllBandStats.add(bandStatBuilder.build());
+ }
+ meterBandStatsBuilder.setBandStat(listAllBandStats);
+ salMeterStats.setMeterBandStats(meterBandStatsBuilder.build());
+ return salMeterStats.build();
+ }
+
+ /**
+ * Method convert list of OF Meter config Stats to SAL Meter Config stats
+ * @param allMeterConfigs
+ * @return list of MeterConfigStats
+ */
+ public List<MeterConfigStats> toSALMeterConfigList(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig> allMeterConfigs){
+
+ List<MeterConfigStats> listMeterConfigStats = new ArrayList<MeterConfigStats>();
+ for( org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.MeterConfig meterConfig : allMeterConfigs){
+ MeterConfigStatsBuilder meterConfigStatsBuilder = new MeterConfigStatsBuilder();
+ meterConfigStatsBuilder.setMeterId(new MeterId(meterConfig.getMeterId()));
+ //TODO: Set flag should be bitmap and not once enum value.
+ //Need to discuss with openflowjava team.
+ //meterConfigStatsBuilder.setFlags(value);
+
+ MeterBandHeadersBuilder meterBandHeadersBuilder = new MeterBandHeadersBuilder();
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands> bands = meterConfig.getBands();
+
+ List<MeterBandHeader> listBandHeaders = new ArrayList<MeterBandHeader>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.config.meter.config.Bands band : bands){
+ MeterBandHeaderBuilder meterBandHeaderBuilder = new MeterBandHeaderBuilder();
+ if(band.getMeterBand() instanceof MeterBandDrop){
+ MeterBandDrop dropBand = (MeterBandDrop)band.getMeterBand();
+ DropBuilder dropBuilder = new DropBuilder();
+ dropBuilder.setBurstSize(dropBand.getBurstSize());
+ dropBuilder.setRate(dropBand.getRate());
+ meterBandHeaderBuilder.setBandType(dropBuilder.build());
+
+ meterBandHeaderBuilder.setBurstSize(dropBand.getBurstSize());
+ meterBandHeaderBuilder.setRate(dropBand.getRate());
+ listBandHeaders.add(meterBandHeaderBuilder.build());
+ }else if (band.getMeterBand() instanceof MeterBandDscpRemark){
+ MeterBandDscpRemark dscpRemarkBand = (MeterBandDscpRemark)band.getMeterBand();
+ DscpRemarkBuilder dscpRemarkBuilder = new DscpRemarkBuilder();
+ dscpRemarkBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
+ dscpRemarkBuilder.setRate(dscpRemarkBand.getRate());
+ meterBandHeaderBuilder.setBandType(dscpRemarkBuilder.build());
+
+ meterBandHeaderBuilder.setBurstSize(dscpRemarkBand.getBurstSize());
+ meterBandHeaderBuilder.setRate(dscpRemarkBand.getRate());
+ listBandHeaders.add(meterBandHeaderBuilder.build());
+
+ }else if (band.getMeterBand() instanceof MeterBandExperimenter){
+ MeterBandExperimenter experimenterBand = (MeterBandExperimenter)band.getMeterBand();
+ ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
+ experimenterBuilder.setBurstSize(experimenterBand.getBurstSize());
+ experimenterBuilder.setRate(experimenterBand.getRate());
+ meterBandHeaderBuilder.setBandType(experimenterBuilder.build());
+
+ meterBandHeaderBuilder.setBurstSize(experimenterBand.getBurstSize());
+ meterBandHeaderBuilder.setRate(experimenterBand.getRate());
+ listBandHeaders.add(meterBandHeaderBuilder.build());
+
+ }
+ }
+ meterBandHeadersBuilder.setMeterBandHeader(listBandHeaders);
+ meterConfigStatsBuilder.setMeterBandHeaders(meterBandHeadersBuilder.build());
+ listMeterConfigStats.add(meterConfigStatsBuilder.build());
+ }
+
+ return listMeterConfigStats;
+ }
+}
* @return - the future
*/
Future<RpcResult<java.lang.Void>> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie);
-
+
}
public Future<RpcResult<Void>> tableMod(TableModInput input, SwitchConnectionDistinguisher cookie) {
return getConnectionAdapter(cookie).tableMod(input);
}
-
}
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.core.translator;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
+import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.Counter32;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupDescStatsUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFeatures.Capabilities;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupFeatures.Types;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdatedBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupDesc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeatures;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class converts multipart reply messages to the notification objects defined
+ * by statistics provider (manager ).
+ *
+ * @author avishnoi@in.ibm.com
+ *
+ */
+public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
+
+ protected static final Logger logger = LoggerFactory
+ .getLogger(MultipartReplyTranslator.class);
+
+ private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
+ private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
+
+ @Override
+ public List<DataObject> translate(SwitchConnectionDistinguisher cookie, SessionContext sc, OfHeader msg) {
+
+ List<DataObject> listDataObject = new CopyOnWriteArrayList<DataObject>();
+
+ if(msg instanceof MultipartReplyMessage){
+ MultipartReplyMessage mpReply = (MultipartReplyMessage)msg;
+ NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId());
+ switch (mpReply.getType()){
+ case OFPMPGROUP:{
+ logger.info("Received group statistics multipart reponse");
+ GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+ MultipartReplyGroup replyBody = (MultipartReplyGroup)mpReply.getMultipartReplyBody();
+ message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+ logger.debug("Converted group statistics : {}",message.toString());
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ case OFPMPGROUPDESC:{
+ logger.info("Received group description statistics multipart reponse");
+
+ GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+ MultipartReplyGroupDesc replyBody = (MultipartReplyGroupDesc)mpReply.getMultipartReplyBody();
+ message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc()));
+ logger.debug("Converted group statistics : {}",message.toString());
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ case OFPMPGROUPFEATURES: {
+ logger.info("Received group features multipart reponse");
+ GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+ MultipartReplyGroupFeatures replyBody = (MultipartReplyGroupFeatures)mpReply.getMultipartReplyBody();
+ message.setTypes(new Types(replyBody.getTypes().isOFPGTALL(),
+ replyBody.getTypes().isOFPGTSELECT(),
+ replyBody.getTypes().isOFPGTINDIRECT(),
+ replyBody.getTypes().isOFPGTSELECT()));
+ message.setMaxGroups(replyBody.getMaxGroups());
+ message.setCapabilities(new Capabilities(replyBody.getCapabilities().isOFPGFCCHAINING(),
+ replyBody.getCapabilities().isOFPGFCCHAININGCHECKS(),
+ replyBody.getCapabilities().isOFPGFCSELECTLIVENESS(),
+ replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()));
+
+ message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ case OFPMPMETER: {
+ logger.info("Received meter statistics multipart reponse");
+ MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+ MultipartReplyMeter replyBody = (MultipartReplyMeter)mpReply.getMultipartReplyBody();
+ message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
+
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ case OFPMPMETERCONFIG:{
+ logger.info("Received meter config statistics multipart reponse");
+
+ MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+ MultipartReplyMeterConfig replyBody = (MultipartReplyMeterConfig)mpReply.getMultipartReplyBody();
+ message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ case OFPMPMETERFEATURES:{
+ logger.info("Received meter features multipart reponse");
+
+ MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
+ message.setId(node);
+ message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+ message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+ MultipartReplyMeterFeatures replyBody = (MultipartReplyMeterFeatures)mpReply.getMultipartReplyBody();
+ message.setMaxBands(replyBody.getMaxBands());
+ message.setMaxColor(replyBody.getMaxColor());
+ message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
+ message.setCapabilities(new Counter32(getMeterBandCapabilityBitmap(replyBody.getCapabilities())));
+
+ // TODO: Band Types is bitmaps, but plugin is receiving enum.
+
+ //message.setBandTypes(replyBody.getBandTypes())
+ listDataObject.add(message.build());
+ return listDataObject;
+ }
+ default:
+ logger.info(" Type : {}, not handled yet",mpReply.getType().name() );
+ return listDataObject;
+ }
+ }
+
+ return listDataObject;
+ }
+
+ private NodeId nodeIdFromDatapathId(BigInteger datapathId) {
+ String current = datapathId.toString();
+ return new NodeId("openflow:" + current);
+ }
+
+ private TransactionId generateTransactionId(Long xid){
+ String stringXid =xid.toString();
+ BigInteger bigIntXid = new BigInteger( stringXid );
+ return new TransactionId(bigIntXid);
+
+ }
+
+ /*
+ * Method returns the bitmap of actions supported by each group.
+ * TODO: My recommendation would be, its good to have a respective model of
+ * 'type bits', which will generate a class where all these flags will eventually
+ * be stored as boolean. It will be convenient for application to check the
+ * supported action, rather then doing bitmap operation.
+ * @param actionsSupported
+ * @return
+ */
+ private List<Long> getGroupActionsSupportBitmap(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType> actionsSupported){
+ List<Long> supportActionByGroups = new ArrayList<Long>();
+ for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType supportedActions : actionsSupported){
+ long supportActionBitmap = 0;
+ supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): ~(1 << 0);
+ supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): ~(1 << 11);
+ supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): ~(1 << 12);
+ supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): ~(1 << 15);
+ supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): ~(1 << 16);
+ supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 16): ~(1 << 16);
+ supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 17): ~(1 << 17);
+ supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 18): ~(1 << 18);
+ supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 19): ~(1 << 19);
+ supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 20): ~(1 << 20);
+ supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 21): ~(1 << 21);
+ supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 22): ~(1 << 22);
+ supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 23): ~(1 << 23);
+ supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 24): ~(1 << 24);
+ supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 25): ~(1 << 25);
+ supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 26): ~(1 << 26);
+ supportActionBitmap |= supportedActions.isOFPATEXPERIMENTER()?(1 << 27): ~(1 << 27);
+ supportActionByGroups.add(new Long(supportActionBitmap));
+ }
+ return supportActionByGroups;
+ }
+ /*
+ * Method returns Capability Bitmap of the meter band.
+ * TODO: I would recommend to use the 'type bits' model to store
+ * the bitmap for the same reason as i given above for method
+ * getGroupActionsSupportBitmap.
+ * @param capabilityFlags
+ * @return
+ */
+
+ private long getMeterBandCapabilityBitmap (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags capabilityFlags){
+ long capabilityBitmap = 0;
+ capabilityBitmap |= capabilityFlags.isOFPMFKBPS()?(1 << 0): ~(1 << 0);
+ capabilityBitmap |= capabilityFlags.isOFPMFPKTPS()?(1 << 1): ~(1 << 1);
+ capabilityBitmap |= capabilityFlags.isOFPMFBURST()?(1 << 2): ~(1 << 2);
+ capabilityBitmap |= capabilityFlags.isOFPMFSTATS()?(1 << 3): ~(1 << 3);
+ return capabilityBitmap;
+ }
+
+}