import java.util.List;
import java.util.concurrent.Future;
+import org.opendaylight.controller.sal.common.util.Arguments;
import org.opendaylight.controller.sal.common.util.Rpcs;
import org.opendaylight.openflowjava.protocol.api.util.BinContent;
import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OpenflowEnumConstant;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.TableFeaturesConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+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.output.action._case.OutputActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowTableStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
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.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.NodeConnectorRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
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.AddMeterOutput;
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.augments.rev131002.MaxLengthAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
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.GroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
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.common.types.rev130731.PortNumber;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
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.BarrierInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
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.PacketOutInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
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.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterFeaturesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesCaseBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table._case.MultipartRequestTableBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.MultipartRequestTableFeaturesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features._case.multipart.request.table.features.TableFeatures;
-//import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features.TableFeatures;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.GetPortOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetPortStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutputBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
+import com.google.common.base.Objects;
import com.google.common.util.concurrent.Futures;
/**
version = context.getPrimaryConductor().getVersion();
}
+
@Override
public Future<RpcResult<AddFlowOutput>> addFlow(AddFlowInput input) {
// Convert the AddFlowInput to FlowModInput
FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
+ BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+ barrierInput.setVersion(version);
// For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
// the request can be routed through any connection to the switch
SwitchConnectionDistinguisher cookie = null ;
+ if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+ Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+ }
LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
// Convert the AddMeterInput to MeterModInput
MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input, version);
-
// For Meter provisioning, the SwitchConnectionDistinguisher is set to null so
// the request can be routed through any connection to the switch
public Future<RpcResult<RemoveFlowOutput>> removeFlow(RemoveFlowInput input) {
// Convert the RemoveFlowInput to FlowModInput
FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input, version);
-
+ BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+ barrierInput.setVersion(version);
// For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
// the request can be routed through any connection to the switch
SwitchConnectionDistinguisher cookie = null ;
-
+ if (Objects.firstNonNull(input.isBarrier(), Boolean.FALSE)) {
+ Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+ }
+
LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
@Override
public Future<RpcResult<Void>> transmitPacket(TransmitPacketInput input) {
- // TODO Auto-generated method stub
- return null;
+ LOG.info("TransmitPacket - {}",input);
+ // Convert TransmitPacket to PacketOutInput
+
+ // TODO VD create PacketConvertor and move convert logic there
+
+ // Build Port ID from TransmitPacketInput.Ingress
+ PortNumber inPortNr = null;
+
+ List<PathArgument> inArgs = input.getIngress().getValue().getPath();
+ if (inArgs.size() >= 3) {
+ InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(inArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+ NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+ String[] split = key.getId().getValue().split(":");
+ Long port = Long.decode(split[split.length-1]);
+ inPortNr = new PortNumber(port);
+ } else {
+ // TODO Ed could by in this way or Exception or something else ?
+ inPortNr = new PortNumber(0xfffffffdL);
+ }
+
+ // Build Buffer ID from TransmitPacketInput.Ingress
+ // TODO VD P! find how to fix PacketIn to add BufferID to augmetation
+ Long bufferId = OFConstants.OFP_NO_BUFFER;
+
+ PortNumber outPort = null;
+ NodeConnectorRef outRef = input.getEgress();
+ List<PathArgument> outArgs = outRef.getValue().getPathArguments();
+ if (outArgs.size() >= 3) {
+ InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(outArgs.get(2), InstanceIdentifier.IdentifiableItem.class);
+ NodeConnectorKey key = Arguments.checkInstanceOf(item.getKey(), NodeConnectorKey.class);
+ String[] split = key.getId().getValue().split(":");
+ Long port = Long.decode(split[split.length-1]);
+ outPort = new PortNumber(port);
+ } else {
+ new Exception("PORT NR not exist in Egress"); //TODO : P4 search for some normal exception
+ }
+
+ // TODO VD P! wait for way to move Actions (e.g. augmentation)
+
+ // TODO VD implementation for testing PacketIn (REMOVE IT)
+ List<ActionsList> actions = new ArrayList<ActionsList>();
+ ActionsListBuilder asBuild = new ActionsListBuilder();
+ ActionBuilder aBuild = new ActionBuilder();
+ aBuild.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
+ PortActionBuilder paBuild = new PortActionBuilder();
+ paBuild.setPort(outPort);
+ aBuild.addAugmentation(PortAction.class, paBuild.build());
+ MaxLengthActionBuilder mlBuild = new MaxLengthActionBuilder();
+ mlBuild.setMaxLength(0xffff);
+ aBuild.addAugmentation(MaxLengthAction.class, mlBuild.build());
+ asBuild.setAction(aBuild.build());
+ actions.add(asBuild.build());
+
+ PacketOutInputBuilder builder = new PacketOutInputBuilder();
+ builder.setActionsList(actions);
+ builder.setData(input.getPayload());
+ builder.setVersion(version);
+ builder.setXid(sessionContext.getNextXid());
+ builder.setInPort(inPortNr);
+ builder.setBufferId(bufferId);
+ // --------------------------------------------------------
+
+ PacketOutInput message = builder.build();
+
+ // TODO VD NULL for yet - find how to translate cookie from TransmitPacketInput
+// SwitchConnectionDistinguisher cookie = ( "what is need to do" ) input.getCookie();
+ SwitchConnectionDistinguisher cookie = null ;
+
+ LOG.debug("Calling the transmitPacket RPC method");
+ return messageService.packetOut(message, cookie);
}
private FlowModInputBuilder toFlowModInputBuilder(Flow source) {
public Future<RpcResult<UpdateFlowOutput>> updateFlow(UpdateFlowInput input) {
// Convert the UpdateFlowInput to FlowModInput
FlowModInput ofFlowModInput = FlowConvertor.toFlowModInput(input.getUpdatedFlow(), version);
-
+ BarrierInputBuilder barrierInput = new BarrierInputBuilder();
+ barrierInput.setVersion(version);
// Call the RPC method on MessageDispatchService
// For Flow provisioning, the SwitchConnectionDistinguisher is set to null so
// the request can be routed through any connection to the switch
SwitchConnectionDistinguisher cookie = null ;
-
+ if (Objects.firstNonNull(input.getUpdatedFlow().isBarrier(), Boolean.FALSE)) {
+ Future<RpcResult<BarrierOutput>> barrierOFLib = messageService.barrier(barrierInput.build(), cookie);
+ }
+
LOG.debug("Calling the FlowMod RPC method on MessageDispatchService");
Future<RpcResult<UpdateFlowOutput>> resultFromOFLib = messageService.flowMod(ofFlowModInput, cookie) ;
MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
MultipartRequestPortStatsBuilder mprPortStatsBuilder = new MultipartRequestPortStatsBuilder();
//Select all ports
- //TODO :need to change once i rebase on latest code.
- mprPortStatsBuilder.setPortNo(OpenflowEnumConstant.OFPP_ANY);
+ mprPortStatsBuilder.setPortNo(OFConstants.OFPP_ANY);
caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
//Set request body to main multipart request
@Override
public Future<RpcResult<UpdateTableOutput>> updateTable(
- UpdateTableInput input) {
+ UpdateTableInput input) {
// Get the Xid. The same Xid has to be sent in all the Multipart requests
Long xid = this.getSessionContext().getNextXid();
//Convert the list of all MD-SAL table feature object into OF library object
List<TableFeatures> ofTableFeatureList = TableFeaturesConvertor.toTableFeaturesRequest(input.getUpdatedTable()) ;
- int totalNoOfTableFeatureEntry = ofTableFeatureList.size();
+
MultipartRequestTableFeaturesCaseBuilder caseRequest = new MultipartRequestTableFeaturesCaseBuilder();
MultipartRequestTableFeaturesBuilder tableFeaturesRequest = new MultipartRequestTableFeaturesBuilder();
- // Slice the multipart request based on the configuration parameter, which is the no. of TableFeatureList element
- // to be put in one multipart message. Default is 5
- // This parameter must be set based on switch's Buffer capacity
-
- List<TableFeatures> tmpOfTableFeatureList = null ;
- String tableFeatureListCount = System.getProperty( "of.tableFeaturesCountPerMultipart", "5") ;
- int noOfEntriesInMPR = Integer.parseInt(tableFeatureListCount) ;
-
- int index = 0 ;
- while(totalNoOfTableFeatureEntry-index > 0 ) {
- if( (totalNoOfTableFeatureEntry-index) > noOfEntriesInMPR ) {
- mprInput.setFlags(new MultipartRequestFlags(true));
- tmpOfTableFeatureList = ofTableFeatureList.subList(index, index + noOfEntriesInMPR);
- }
- else {
- // Last multipart request
- mprInput.setFlags(new MultipartRequestFlags(false));
- tmpOfTableFeatureList = ofTableFeatureList.subList(index, totalNoOfTableFeatureEntry );
- }
-
- tableFeaturesRequest.setTableFeatures(tmpOfTableFeatureList) ;
+ mprInput.setFlags(new MultipartRequestFlags(true));
+
+ tableFeaturesRequest.setTableFeatures(ofTableFeatureList) ;
+
//Set request body to main multipart request
caseRequest.setMultipartRequestTableFeatures(tableFeaturesRequest.build());
mprInput.setMultipartRequestBody(caseRequest.build());
//Send the request, no cookies associated, use any connection
- LOG.debug("Send Table Feature request :{}",tmpOfTableFeatureList);
+ LOG.debug("Send Table Feature request :{}",ofTableFeatureList);
this.messageService.multipartRequest(mprInput.build(), null);
- index += noOfEntriesInMPR ;
- tmpOfTableFeatureList = null ; // To avoid any corrupt data
- }
+
//Extract the Xid only from the Future for the last RPC and
- // send it back to the NSF
+ // send it back to the NSF
LOG.debug("Returning the result and transaction id to NSF");
LOG.debug("Return results and transaction id back to caller");
UpdateTableOutputBuilder output = new UpdateTableOutputBuilder();
MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder ();
MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
mprFlowRequestBuilder.setTableId(arg0.getTableId().getValue());
- mprFlowRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
- mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
- mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
- mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+ mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+ mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+ mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+ mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
- //TODO: repeating code
if(version == OFConstants.OFP_VERSION_1_0){
LOG.info("Target node is running openflow version 1.0");
- FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+ FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
}
if(version == OFConstants.OFP_VERSION_1_3){
// Create multipart request body for fetch all the group stats
MultipartRequestFlowCaseBuilder multipartRequestFlowCaseBuilder = new MultipartRequestFlowCaseBuilder();
MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
- mprFlowRequestBuilder.setTableId(OpenflowEnumConstant.OFPTT_ALL);
- mprFlowRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
- mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
- mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
- mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
- mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+ mprFlowRequestBuilder.setTableId(OFConstants.OFPTT_ALL);
+ mprFlowRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+ mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+ mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+ mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
+ mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
//TODO: repeating code
if(version == OFConstants.OFP_VERSION_1_0){
- FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+ FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
mprFlowRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
}
if(version == OFConstants.OFP_VERSION_1_3){
MultipartRequestFlowBuilder mprFlowRequestBuilder = new MultipartRequestFlowBuilder();
mprFlowRequestBuilder.setTableId(arg0.getTableId());
mprFlowRequestBuilder.setOutPort(arg0.getOutPort().longValue());
- mprFlowRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
- mprFlowRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
- mprFlowRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+ mprFlowRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+ mprFlowRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+ mprFlowRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
// convert and inject match
MatchReactor.getInstance().convert(arg0.getMatch(), version, mprFlowRequestBuilder);
MultipartRequestAggregateCaseBuilder multipartRequestAggregateCaseBuilder = new MultipartRequestAggregateCaseBuilder ();
MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
mprAggregateRequestBuilder.setTableId(arg0.getTableId().getValue());
- mprAggregateRequestBuilder.setOutPort(OpenflowEnumConstant.OFPP_ANY);
- mprAggregateRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
- mprAggregateRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
- mprAggregateRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+ mprAggregateRequestBuilder.setOutPort(OFConstants.OFPP_ANY);
+ mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+ mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+ mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
//TODO: repeating code
if(version == OFConstants.OFP_VERSION_1_0){
- FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,false,false,false,false,false,false,false,false,false,false);
+ FlowWildcardsV10 wildCard = new FlowWildcardsV10(true,true,true,true,true,true,true,true,true,true);
mprAggregateRequestBuilder.setMatchV10(new MatchV10Builder().setWildcards(wildCard).build());
}
if(version == OFConstants.OFP_VERSION_1_3){
MultipartRequestAggregateBuilder mprAggregateRequestBuilder = new MultipartRequestAggregateBuilder();
mprAggregateRequestBuilder.setTableId(arg0.getTableId());
mprAggregateRequestBuilder.setOutPort(arg0.getOutPort().longValue());
- mprAggregateRequestBuilder.setOutGroup(OpenflowEnumConstant.OFPG_ANY);
- mprAggregateRequestBuilder.setCookie(OpenflowEnumConstant.DEFAULT_COOKIE);
- mprAggregateRequestBuilder.setCookieMask(OpenflowEnumConstant.DEFAULT_COOKIE_MASK);
+ mprAggregateRequestBuilder.setOutGroup(OFConstants.OFPG_ANY);
+ mprAggregateRequestBuilder.setCookie(OFConstants.DEFAULT_COOKIE);
+ mprAggregateRequestBuilder.setCookieMask(OFConstants.DEFAULT_COOKIE_MASK);
MatchReactor.getInstance().convert(arg0.getMatch(), version, mprAggregateRequestBuilder);
return Futures.immediateFuture(rpcResult);
}
+ @Override
+ public Future<RpcResult<GetAllQueuesStatisticsFromAllPortsOutput>> getAllQueuesStatisticsFromAllPorts(
+ GetAllQueuesStatisticsFromAllPortsInput arg0) {
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.info("Prepare queue statistics request to collect stats for all queues attached to all the ports of node {} - TrasactionId - {}",arg0.getNode().getValue(),xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPQUEUE);
+ mprInput.setVersion(version);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body to fetch stats for all the port of the node
+ MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+ MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+ //Select all ports
+ mprQueueBuilder.setPortNo(OFConstants.OFPP_ANY);
+ //Select all the ports
+ mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+
+ caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(caseBuilder.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ GetAllQueuesStatisticsFromAllPortsOutputBuilder output = new GetAllQueuesStatisticsFromAllPortsOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setQueueIdAndStatisticsMap(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetAllQueuesStatisticsFromAllPortsOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetAllQueuesStatisticsFromGivenPortOutput>> getAllQueuesStatisticsFromGivenPort(
+ GetAllQueuesStatisticsFromGivenPortInput arg0) {
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.info("Prepare queue statistics request to collect stats for " +
+ "all queues attached to given port {} of node {} - TrasactionId - {}",arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPQUEUE);
+ mprInput.setVersion(version);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body to fetch stats for all the port of the node
+ MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+ MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+ //Select all queues
+ mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
+ //Select specific port
+ mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+
+ caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(caseBuilder.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ GetAllQueuesStatisticsFromGivenPortOutputBuilder output = new GetAllQueuesStatisticsFromGivenPortOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setQueueIdAndStatisticsMap(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetAllQueuesStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
+ @Override
+ public Future<RpcResult<GetQueueStatisticsFromGivenPortOutput>> getQueueStatisticsFromGivenPort(
+ GetQueueStatisticsFromGivenPortInput arg0) {
+ //Generate xid to associate it with the request
+ Long xid = this.getSessionContext().getNextXid();
+
+ LOG.info("Prepare queue statistics request to collect stats for " +
+ "given queue attached to given port {} of node {} - TrasactionId - {}",arg0.getQueueId().toString(),arg0.getNodeConnectorId().toString(),arg0.getNode().getValue(),xid);
+
+ // Create multipart request header
+ MultipartRequestInputBuilder mprInput = new MultipartRequestInputBuilder();
+ mprInput.setType(MultipartType.OFPMPQUEUE);
+ mprInput.setVersion(version);
+ mprInput.setXid(xid);
+ mprInput.setFlags(new MultipartRequestFlags(false));
+
+ // Create multipart request body to fetch stats for all the port of the node
+ MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+ MultipartRequestQueueBuilder mprQueueBuilder = new MultipartRequestQueueBuilder();
+ //Select specific queue
+ mprQueueBuilder.setQueueId(arg0.getQueueId().getValue());
+ //Select specific port
+ mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+
+ caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
+
+ //Set request body to main multipart request
+ mprInput.setMultipartRequestBody(caseBuilder.build());
+
+ //Send the request, no cookies associated, use any connection
+ LOG.debug("Send queue statistics request :{}",mprQueueBuilder.build().toString());
+ this.messageService.multipartRequest(mprInput.build(), null);
+
+ // Prepare rpc return output. Set xid and send it back.
+ GetQueueStatisticsFromGivenPortOutputBuilder output = new GetQueueStatisticsFromGivenPortOutputBuilder();
+ output.setTransactionId(generateTransactionId(xid));
+ output.setQueueIdAndStatisticsMap(null);
+
+ Collection<RpcError> errors = Collections.emptyList();
+ RpcResult<GetQueueStatisticsFromGivenPortOutput> rpcResult = Rpcs.getRpcResult(true, output.build(), errors);
+ return Futures.immediateFuture(rpcResult);
+ }
+
@Override
public Future<RpcResult<GetAllFlowStatisticsOutput>> getAllFlowStatistics(GetAllFlowStatisticsInput arg0) {
//TODO: Depricated, need to clean it up. Sal-Compatibility layes is dependent on it.
// TODO Auto-generated method stub
return null;
}
+
}