package org.opendaylight.openflowplugin.openflow.md;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
+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.flow.statistics.rev130819.OpendaylightFlowStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService;
* @return id of encapsulated node (served by this impl)
*/
NodeId getNodeId();
+
+ /**
+ * returnes the session context associated with this model-driven switch
+ * @return session context object
+ */
+ SessionContext getSessionContext();
}
import org.opendaylight.openflowplugin.openflow.md.lldp.LLDPSpeakerPopListener;
import org.opendaylight.openflowplugin.openflow.md.queue.MessageSpy;
import org.opendaylight.openflowplugin.openflow.md.queue.PopListener;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsUpdate;
*/
public void init() {
LOG.debug("init");
+
+ OpenflowPortsUtil.init();
+
messageTranslators = new ConcurrentHashMap<>();
popListeners = new ConcurrentHashMap<>();
//TODO: move registration to factory
switchConnectionPrv.setSwitchConnectionHandler(null);
}
switchConnectionProviders = null;
+ OpenflowPortsUtil.close();
OFSessionUtil.releaseSessionManager();
errorHandler = null;
}
*/
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 java.util.concurrent.TimeUnit;
-
+import com.google.common.base.Objects;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.JdkFutureAdapters;
+import com.google.common.util.concurrent.ListenableFuture;
import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
import org.opendaylight.controller.sal.common.util.Rpcs;
import org.opendaylight.openflowjava.protocol.api.util.BinContent;
import org.opendaylight.openflowplugin.openflow.md.core.session.SwitchConnectionCookieOFImpl;
import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.FlowRemovedBuilder;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
-import com.google.common.base.Objects;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.JdkFutureAdapters;
-import com.google.common.util.concurrent.ListenableFuture;
+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 java.util.concurrent.TimeUnit;
/**
* RPC implementation of MD-switch
// Set specific port
mprPortStatsBuilder
- .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+ .setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+ OpenflowVersion.get(version), arg0.getNodeConnectorId()));
caseBuilder.setMultipartRequestPortStats(mprPortStatsBuilder.build());
// Set request body to main multipart request
// Select all queues
mprQueueBuilder.setQueueId(OFConstants.OFPQ_ANY);
// Select specific port
- mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+ mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(
+ OpenflowVersion.get(version),
+ arg0.getNodeConnectorId()));
caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
// Select specific queue
mprQueueBuilder.setQueueId(arg0.getQueueId().getValue());
// Select specific port
- mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(arg0.getNodeConnectorId()));
+ mprQueueBuilder.setPortNo(InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.get(version),
+ arg0.getNodeConnectorId()));
caseBuilder.setMultipartRequestQueue(mprQueueBuilder.build());
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-import org.opendaylight.openflowjava.protocol.api.util.BinContent;
import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwDstReactor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.ActionSetNwSrcReactor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
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.CopyTtlInCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
+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.ExperimenterAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
+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.MplsTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
+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.augments.rev131002.QueueIdAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
+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.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.PopMpls;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;
+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.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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
Uri uri = outputAction.getOutputNodeConnector();
- if (version >= OFConstants.OFP_VERSION_1_3) {
-
- if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
- .getIntValue())));
- } else if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
- } else if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
- portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())));
-
- } else if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
- logger.error("Unknown Port Type for the Version");
- } else if (InventoryDataServiceUtil.portNumberfromNodeConnectorId(outputAction.getOutputNodeConnector()
- .getValue()) < MAXPortOF13) {
- portAction.setPort(new PortNumber(InventoryDataServiceUtil.portNumberfromNodeConnectorId(outputAction
- .getOutputNodeConnector().getValue())));
- } else {
- logger.error("Invalid Port for Output Action");
- }
- } else if (version == OFConstants.OFP_VERSION_1_0) {
-
- if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.FLOOD.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.INPORT.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.TABLE.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
- portAction.setPort(new PortNumber((long) PortNumberValuesV10.NONE.getIntValue()));
- } else if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
- logger.error("Unknown Port Type for the Version");
- } else if (InventoryDataServiceUtil.portNumberfromNodeConnectorId(outputAction.getOutputNodeConnector()
- .getValue()) < MAXPortOF10) {
- portAction.setPort(new PortNumber(InventoryDataServiceUtil.portNumberfromNodeConnectorId(outputAction
- .getOutputNodeConnector().getValue())));
- } else {
- logger.error("Invalid Port for Output Action");
- }
+ OpenflowVersion ofVersion = OpenflowVersion.get(version);
+ Long portNumber = InventoryDataServiceUtil.portNumberfromNodeConnectorId(ofVersion, uri.getValue());
+ if (portNumber != null && (OpenflowPortsUtil.isPortReserved(ofVersion, portNumber) || portNumber < OpenflowPortsUtil.getMaxPortForVersion(ofVersion)) ) {
+ portAction.setPort(new PortNumber(portNumber));
+ } else {
+ logger.error("Invalid Port specified "+ portNumber + " for Output Action for OF version:"+ ofVersion);
}
- actionBuilder
- .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
+ actionBuilder.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
actionBuilder.addAugmentation(PortAction.class, portAction.build());
return actionBuilder.build();
* Method to convert OF actions associated with bucket to SAL Actions.
*
* @param actionList
+ * @param ofVersion current ofp version
* @return List of converted SAL Actions.
*/
public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toMDSalActions(
- List<Action> actionList) {
+ List<Action> actionList, OpenflowVersion ofVersion) {
List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = new ArrayList<>();
for (Action action : actionList) {
} else if (action.getType().equals(
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class)) {
- bucketActions.add(new SetFieldCaseBuilder().setSetField(MatchConvertorImpl.fromOFSetFieldToSALSetFieldAction(action))
+ bucketActions.add(new SetFieldCaseBuilder().setSetField(MatchConvertorImpl.fromOFSetFieldToSALSetFieldAction(action, ofVersion))
.build());
} else if (action.getType().equals(
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb.class)) {
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Class is an utility class for converting flow related statistics messages coming from openflow
* switch to MD-SAL messages.
* @param allFlowStats
* @return
*/
- public List<FlowAndStatisticsMapList> toSALFlowStatsList(List<FlowStats> allFlowStats,BigInteger datapathid){
+ public List<FlowAndStatisticsMapList> toSALFlowStatsList(List<FlowStats> allFlowStats, BigInteger datapathid, OpenflowVersion ofVersion){
List<FlowAndStatisticsMapList> convertedSALFlowStats = new ArrayList<FlowAndStatisticsMapList>();
for(FlowStats flowStats : allFlowStats){
- convertedSALFlowStats.add(toSALFlowStats(flowStats, datapathid));
+ convertedSALFlowStats.add(toSALFlowStats(flowStats, datapathid, ofVersion));
}
return convertedSALFlowStats;
* @param flowStats
* @return
*/
- public FlowAndStatisticsMapList toSALFlowStats(FlowStats flowStats,BigInteger datapathid){
+ public FlowAndStatisticsMapList toSALFlowStats(FlowStats flowStats, BigInteger datapathid, OpenflowVersion ofVersion){
FlowAndStatisticsMapListBuilder salFlowStatsBuilder = new FlowAndStatisticsMapListBuilder();
salFlowStatsBuilder.setByteCount(new Counter64(flowStats.getByteCount()));
salFlowStatsBuilder.setCookie(new FlowCookie(flowStats.getCookie()));
salFlowStatsBuilder.setPriority(flowStats.getPriority());
salFlowStatsBuilder.setTableId(flowStats.getTableId());
if(flowStats.getMatchV10() != null){
- salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchV10ToSALMatch(flowStats.getMatchV10(),datapathid));
+ salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchV10ToSALMatch(flowStats.getMatchV10(),datapathid, OpenflowVersion.OF10));
if(flowStats.getAction().size()!=0){
- salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.wrapOF10ActionsToInstruction(flowStats.getAction()));
+ salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.wrapOF10ActionsToInstruction(flowStats.getAction(), ofVersion));
}
}
if(flowStats.getMatch() != null){
- salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchToSALMatch(flowStats.getMatch(),datapathid));
+ salFlowStatsBuilder.setMatch(MatchConvertorImpl.fromOFMatchToSALMatch(flowStats.getMatch(),datapathid, ofVersion));
salFlowStatsBuilder.setFlags(
new FlowModFlags(flowStats.getFlags().isOFPFFCHECKOVERLAP(),
flowStats.getFlags().isOFPFFRESETCOUNTS(),
flowStats.getFlags().isOFPFFSENDFLOWREM()));
}
if(flowStats.getInstruction()!= null){
- salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.toSALInstruction(flowStats.getInstruction()));
+ salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.toSALInstruction(flowStats.getInstruction(), ofVersion));
}
return salFlowStatsBuilder.build();
import java.util.ArrayList;
import java.util.List;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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;
public List<GroupDescStats> toSALGroupDescStatsList(
- List<GroupDesc> allGroupDescStats){
+ List<GroupDesc> allGroupDescStats, OpenflowVersion ofVersion){
List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<>();
for(GroupDesc groupDesc: allGroupDescStats){
- convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc));
+ convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc, ofVersion));
}
return convertedSALGroupsDesc;
/**
* Method convert GroupStats message from library to MD SAL defined GroupStats
* @param groupDesc GroupStats from library
+ * @param ofVersion TODO
* @return GroupStats -- GroupStats defined in MD-SAL
*/
- public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc){
+ public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc, OpenflowVersion ofVersion){
GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
- salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList()));
+ salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), ofVersion));
salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue()));
salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue()));
salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId()));
}
public org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(
- List<BucketsList> bucketDescStats ){
+ List<BucketsList> bucketDescStats, OpenflowVersion ofVersion ){
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();
for(BucketsList bucketDetails : bucketDescStats){
BucketBuilder bucketDesc = new BucketBuilder();
List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> convertedSalActions =
- ActionConvertor.toMDSalActions (bucketDetails.getAction());
+ ActionConvertor.toMDSalActions (bucketDetails.getAction(), ofVersion);
List<Action> actions = new ArrayList<>();
int actionKey = 0;
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.action.types.rev131112.action.list.ActionKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MeterIdInstruction;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TableIdInstruction;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
public class OFToMDSalFlowConvertor {
/**
* Method convert Openflow 1.3+ specific instructions to MD-SAL format
* flow instruction
* @param instructions
+ * @param ofVersion current ofp version
* @return
*/
public static Instructions toSALInstruction(
- List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction> instructions) {
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction> instructions, OpenflowVersion ofVersion) {
InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
- applyActionsBuilder.setAction(
- wrapActionList(
- ActionConvertor.toMDSalActions(actionsInstruction.getAction()
- )
- ));
+ applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion)));
applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build());
WriteActionsCaseBuilder writeActionsCaseBuilder = new WriteActionsCaseBuilder();
WriteActionsBuilder writeActionsBuilder = new WriteActionsBuilder();
- writeActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction())));
+ writeActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion)));
writeActionsCaseBuilder.setWriteActions(writeActionsBuilder.build());
InstructionBuilder instBuilder = new InstructionBuilder();
/**
* Method wraps openflow 1.0 actions list to Apply Action Instructions
+ * @param ofVersion current ofp version
*/
public static Instructions wrapOF10ActionsToInstruction(
- List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action> actionsList) {
+ List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action> actionsList, OpenflowVersion ofVersion) {
InstructionsBuilder instructionsBuilder = new InstructionsBuilder();
List<Instruction> salInstructionList = new ArrayList<Instruction>();
ApplyActionsCaseBuilder applyActionsCaseBuilder = new ApplyActionsCaseBuilder();
ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder();
- applyActionsBuilder.setAction(
- wrapActionList(
- ActionConvertor.toMDSalActions(actionsList
- )
- ));
+ applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsList, ofVersion)));
applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build());
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
import org.opendaylight.controller.sal.common.util.Arguments;
import org.opendaylight.openflowplugin.openflow.md.OFConstants;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
public class PacketOutConvertor {
private static final Logger logger = LoggerFactory.getLogger(MeterConvertor.class);
private static final String PREFIX_SEPARATOR = "/";
inArgs = inputPacket.getIngress().getValue().getPath();
}
if (inArgs != null && inArgs.size() >= 3) {
- inPortNr = getPortNumber(inArgs.get(2));
+ inPortNr = getPortNumber(inArgs.get(2), version);
} else {
// The packetOut originated from the controller
inPortNr = new PortNumber(0xfffffffdL);
NodeConnectorRef outRef = inputPacket.getEgress();
List<PathArgument> outArgs = outRef.getValue().getPath();
if (outArgs.size() >= 3) {
- outPort = getPortNumber(outArgs.get(2));
+ outPort = getPortNumber(outArgs.get(2), version);
} else {
new Exception("PORT NR not exist in Egress"); // TODO : P4 search
// for some normal
return builder.build();
}
- private static PortNumber getPortNumber(PathArgument pathArgument) {
+ private static PortNumber getPortNumber(PathArgument pathArgument, Short ofVersion) {
// FIXME VD P! find InstanceIdentifier helper
InstanceIdentifier.IdentifiableItem item = Arguments.checkInstanceOf(pathArgument,
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]);
+ Long port = OpenflowPortsUtil.getPortFromLogicalName(OpenflowVersion.get(ofVersion), split[split.length - 1]);
return new PortNumber(port);
}
}
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.openflow.common.types.rev130731.PortConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfigV10;
PortModInputBuilder portModInputBuilder = new PortModInputBuilder();
portModInputBuilder.setAdvertise(getPortFeatures(source.getAdvertisedFeatures()));
- portModInputBuilder.setPortNo(new PortNumber(source.getPortNumber()));
+ portModInputBuilder.setPortNo(new PortNumber(
+ OpenflowPortsUtil.getProtocolPortNumber(OpenflowVersion.get(version), source.getPortNumber())));
portModInputBuilder.setConfig(config);
portModInputBuilder.setMask(config);
* @return OF:Ports
*/
public static Ports toPortDesc(
- org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowCapablePort source) {
+ org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowCapablePort source,
+ short version) {
PortConfig config = null;
PortState portState = null;
PortsBuilder OFPortDescDataBuilder = new PortsBuilder();
- OFPortDescDataBuilder.setPortNo(source.getPortNumber()); // portNO
+
+ OFPortDescDataBuilder.setPortNo(
+ OpenflowPortsUtil.getProtocolPortNumber(OpenflowVersion.get(version), source.getPortNumber())); // portNO
OFPortDescDataBuilder.setHwAddr(source.getHardwareAddress());
OFPortDescDataBuilder.setName(source.getName());
import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
List<MatchEntries> matchEntriesList = new ArrayList<>();
if (match.getInPort() != null) {
+ //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
matchEntriesList.add(toOfPort(InPort.class,
- InventoryDataServiceUtil.portNumberfromNodeConnectorId(match.getInPort())));
+ InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPort())));
}
if (match.getInPhyPort() != null) {
+ //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
matchEntriesList.add(toOfPort(InPhyPort.class,
- InventoryDataServiceUtil.portNumberfromNodeConnectorId(match.getInPhyPort())));
+ InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPhyPort())));
}
org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata = match
* @return
* @author avishnoi@in.ibm.com
*/
- public static Match fromOFMatchV10ToSALMatch(final MatchV10 swMatch, final BigInteger datapathid) {
+ public static Match fromOFMatchV10ToSALMatch(final MatchV10 swMatch, final BigInteger datapathid, final OpenflowVersion ofVersion) {
MatchBuilder matchBuilder = new MatchBuilder();
EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder();
VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
if (!swMatch.getWildcards().isINPORT().booleanValue() && swMatch.getInPort() != null) {
matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
- (long) swMatch.getInPort()));
+ (long) swMatch.getInPort(), ofVersion));
}
if (!swMatch.getWildcards().isDLSRC().booleanValue() && swMatch.getDlSrc() != null) {
*/
public static Match fromOFMatchToSALMatch(
final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match swMatch,
- final BigInteger datapathid) {
-
- return OfMatchToSALMatchConvertor(swMatch.getMatchEntries(), datapathid);
-
+ final BigInteger datapathid, final OpenflowVersion ofVersion) {
+ return OfMatchToSALMatchConvertor(swMatch.getMatchEntries(), datapathid, ofVersion);
}
- private static Match OfMatchToSALMatchConvertor(List<MatchEntries> swMatchList, final BigInteger datapathid){
+ private static Match OfMatchToSALMatchConvertor(List<MatchEntries> swMatchList, final BigInteger datapathid,
+ OpenflowVersion ofVersion){
MatchBuilder matchBuilder = new MatchBuilder();
EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder();
if (ofMatch.getOxmMatchField().equals(InPort.class)) {
PortNumberMatchEntry portNumber = ofMatch.getAugmentation(PortNumberMatchEntry.class);
matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
- portNumber.getPortNumber().getValue()));
+ portNumber.getPortNumber().getValue(), ofVersion));
} else if (ofMatch.getOxmMatchField().equals(InPhyPort.class)) {
PortNumberMatchEntry portNumber = ofMatch.getAugmentation(PortNumberMatchEntry.class);
matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
- portNumber.getPortNumber().getValue()));
+ portNumber.getPortNumber().getValue(), ofVersion));
} else if (ofMatch.getOxmMatchField().equals(Metadata.class)) {
MetadataBuilder metadataBuilder = new MetadataBuilder();
MetadataMatchEntry metadataMatchEntry = ofMatch.getAugmentation(MetadataMatchEntry.class);
* Method converts OF SetField action to SAL SetFiled action.
*
* @param action
+ * @param ofVersion current ofp version
* @return
*/
public static SetField fromOFSetFieldToSALSetFieldAction(
- final Action action) {
+ final Action action, OpenflowVersion ofVersion) {
logger.debug("Converting OF SetField action to SAL SetField action");
SetFieldBuilder setField = new SetFieldBuilder();
OxmFieldsAction oxmFields = action.getAugmentation(OxmFieldsAction.class);
- Match match = OfMatchToSALMatchConvertor(oxmFields.getMatchEntries(), null);
+ Match match = OfMatchToSALMatchConvertor(oxmFields.getMatchEntries(), null, ofVersion);
setField.fieldsFrom(match);
return setField.build();
}
package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
+import java.math.BigInteger;
+import java.util.Iterator;
+
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
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.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
-import java.math.BigInteger;
-import java.util.Iterator;
-
/**
*
*/
*/
private static boolean convertInPortMatch(final MatchV10Builder matchBuilder, final NodeConnectorId inPort) {
if (inPort != null) {
- matchBuilder.setInPort(InventoryDataServiceUtil.portNumberfromNodeConnectorId(inPort).intValue());
+ matchBuilder.setInPort(InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF10, inPort).intValue());
return false;
}
return true;
*/
package org.opendaylight.openflowplugin.openflow.md.core.translator;
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.CopyOnWriteArrayList;
-
import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.core.IMDMessageTranslator;
import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.CopyOnWriteArrayList;
+
public class FlowRemovedTranslator implements IMDMessageTranslator<OfHeader, List<DataObject>> {
protected static final Logger LOG = LoggerFactory.getLogger(FlowRemovedTranslator.class);
salFlowRemoved.setRemovedReason(removeReasonFlag);
+ OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion());
org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match ofMatch = ofFlow
.getMatch();
if (ofMatch != null) {
- salFlowRemoved.setMatch(fromMatch(ofMatch,sc.getFeatures().getDatapathId()));
+ salFlowRemoved.setMatch(fromMatch(ofMatch, sc.getFeatures().getDatapathId(), ofVersion));
}
else if(ofFlow.getMatchV10() != null){
- MatchBuilder matchBuilder = new MatchBuilder(MatchConvertorImpl.fromOFMatchV10ToSALMatch(ofFlow.getMatchV10(),sc.getFeatures().getDatapathId()));
+ MatchBuilder matchBuilder = new MatchBuilder(MatchConvertorImpl.fromOFMatchV10ToSALMatch(ofFlow.getMatchV10(), sc.getFeatures().getDatapathId(), ofVersion));
salFlowRemoved.setMatch(matchBuilder.build());
}
salFlowRemoved.setNode(new NodeRef(InventoryDataServiceUtil.identifierFromDatapathId(sc.getFeatures()
}
- public Match fromMatch(
- org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match ofMatch,BigInteger datapathid) {
+ public Match fromMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match ofMatch,
+ BigInteger datapathid, OpenflowVersion ofVersion) {
MatchBuilder matchBuilder = new MatchBuilder();
EthernetMatchBuilder ethernetMatch = null;
VlanMatchBuilder vlanMatch = null;
for (MatchEntries entry : ofMatch.getMatchEntries()) {
Class<? extends MatchField> field = entry.getOxmMatchField();
if (field.equals(InPort.class)) {
- matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue()
- .longValue()));
+ matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
+ entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue().longValue(), ofVersion));
} else if (field.equals(InPhyPort.class)) {
- matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue()
- .longValue()));
+ matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
+ entry.getAugmentation(PortNumberMatchEntry.class).getPortNumber().getValue().longValue(), ofVersion));
} else if (field.equals(Metadata.class)) {
MetadataBuilder metadata = new MetadataBuilder();
metadata.setMetadata(new BigInteger(1, entry.getAugmentation(MetadataMatchEntry.class).getMetadata()));
*/
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.FlowStatsResponseConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.flow.statistics.rev130819.AggregateFlowStatisticsUpdateBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterConfigCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
/**
* Class converts multipart reply messages to the notification objects defined
* by statistics provider (manager ).
List<DataObject> listDataObject = new CopyOnWriteArrayList<DataObject>();
+ OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion());
+
if(msg instanceof MultipartReplyMessage){
MultipartReplyMessage mpReply = (MultipartReplyMessage)msg;
NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId());
message.setTransactionId(generateTransactionId(mpReply.getXid()));
MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase)mpReply.getMultipartReplyBody();
MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
- message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(),sc.getFeatures().getDatapathId()));
+ message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(),sc.getFeatures().getDatapathId(), ofVersion));
logger.debug("Converted flow statistics : {}",message.build().toString());
listDataObject.add(message.build());
new NodeConnectorStatisticsAndPortNumberMapBuilder();
statsBuilder.setNodeConnectorId(
InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
- portStats.getPortNo()));
+ portStats.getPortNo(), ofVersion));
BytesBuilder bytesBuilder = new BytesBuilder();
bytesBuilder.setReceived(portStats.getRxBytes());
MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase)mpReply.getMultipartReplyBody();
MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
- message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc()));
+ message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
logger.debug("Converted group statistics : {}",message.toString());
listDataObject.add(message.build());
new QueueIdAndStatisticsMapBuilder();
statsBuilder.setNodeConnectorId(
InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
- queueStats.getPortNo()));
+ queueStats.getPortNo(), ofVersion));
statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors()));
statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes()));
statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets()));
statsBuilder.setDuration(durationBuilder.build());
statsBuilder.setQueueId(new QueueId(queueStats.getQueueId()));
- statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(), queueStats.getPortNo()));
+ statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
+ queueStats.getPortNo(), ofVersion));
statsMap.add(statsBuilder.build());
}
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.openflowplugin.openflow.md.util.PacketInUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
} else {
LOG.trace("Received packet_in from {} on port {}", dpid, port);
- Match match = MatchConvertorImpl.fromOFMatchToSALMatch(message.getMatch(),dpid);
+ OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion());
+ Match match = MatchConvertorImpl.fromOFMatchToSALMatch(message.getMatch(),dpid, ofVersion);
MatchBuilder matchBuilder = new MatchBuilder(match);
pktInBuilder.setMatch(matchBuilder.build());
pktInBuilder.setPacketInReason(PacketInUtil.getMdSalPacketInReason(message.getReason()));
pktInBuilder.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId(message.getTableId().getValue().shortValue()));
- pktInBuilder.setIngress(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(dpid,port));
+ pktInBuilder.setIngress(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(dpid, port, ofVersion));
PacketReceived pktInEvent = pktInBuilder.build();
salPacketIn = Collections.<DataObject>singletonList(pktInEvent);
}
import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
import org.opendaylight.openflowplugin.openflow.md.util.PacketInUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
} else {
LOG.trace("Received packet_in from {} on port {}", dpid, port);
pktInBuilder.setPacketInReason(PacketInUtil.getMdSalPacketInReason(message.getReason()));
- pktInBuilder.setIngress(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(dpid, port));
+ pktInBuilder.setIngress(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(dpid, port,
+ OpenflowVersion.get(sc.getPrimaryConductor().getVersion())));
PacketReceived pktInEvent = pktInBuilder.build();
salPacketIn = Collections.<DataObject>singletonList(pktInEvent);
}
*/
package org.opendaylight.openflowplugin.openflow.md.lldp;
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ConcurrentHashMap;
-
import org.opendaylight.controller.sal.packet.Ethernet;
import org.opendaylight.controller.sal.packet.LLDP;
import org.opendaylight.controller.sal.packet.LLDPTLV;
import org.opendaylight.controller.sal.utils.HexEncode;
import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowVersion;
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.flow.inventory.rev130819.FlowCapableNodeConnector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ConcurrentHashMap;
+
public class LLDPSpeaker {
private static Logger LOG = LoggerFactory.getLogger(LLDPSpeaker.class);
public void addNodeConnector(InstanceIdentifier<NodeConnector> nodeConnectorInstanceId, NodeConnector nodeConnector) {
InstanceIdentifier<Node> nodeInstanceId = nodeConnectorInstanceId.firstIdentifierOf(Node.class);
+ ModelDrivenSwitch md = nodeMap.get(nodeInstanceId);
+
NodeKey nodeKey = InstanceIdentifier.keyOf(nodeInstanceId);
NodeId nodeId = nodeKey.getId();
NodeConnectorId nodeConnectorId = nodeConnector.getId();
TransmitPacketInputBuilder tpib = new TransmitPacketInputBuilder();
tpib.setEgress(new NodeConnectorRef(nodeConnectorInstanceId));
tpib.setNode(new NodeRef(nodeInstanceId));
- tpib.setPayload(lldpDataFrom(nodeInstanceId,nodeConnectorInstanceId,flowConnector.getHardwareAddress()));
+ tpib.setPayload(lldpDataFrom(nodeInstanceId,nodeConnectorInstanceId,flowConnector.getHardwareAddress(),
+ md.getSessionContext().getPrimaryConductor().getVersion()));
nodeConnectorMap.put(nodeConnectorInstanceId, tpib.build());
- ModelDrivenSwitch md = nodeMap.get(nodeInstanceId);
+
md.transmitPacket(nodeConnectorMap.get(nodeConnectorInstanceId));
}
nodeConnectorMap.remove(nodeConnectorInstanceId);
}
- private byte[] lldpDataFrom(InstanceIdentifier<Node> nodeInstanceId,InstanceIdentifier<NodeConnector> nodeConnectorInstanceId,MacAddress src) {
+ private byte[] lldpDataFrom(InstanceIdentifier<Node> nodeInstanceId,InstanceIdentifier<NodeConnector> nodeConnectorInstanceId,MacAddress src,
+ Short version) {
NodeId nodeId = InstanceIdentifier.keyOf(nodeInstanceId).getId();
NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(nodeConnectorInstanceId).getId();
.setValue(snValue);
// Create LLDP PortID TL
- Long portNo = InventoryDataServiceUtil.portNumberfromNodeConnectorId(nodeConnectorId);
+ Long portNo = InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.get(version), nodeConnectorId);
+
String hexString = Long.toHexString(portNo);
byte[] pidValue = LLDPTLV.createPortIDTLVValue(hexString);
LLDPTLV portIdTlv = new LLDPTLV();
return nodeKeyToInstanceIdentifier(new NodeKey(nodeId));
}
- public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo) {
- return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + portNo);
+ public static NodeConnectorId nodeConnectorIdfromDatapathPortNo(BigInteger datapathid, Long portNo,
+ OpenflowVersion ofVersion) {
+ String logicalName = OpenflowPortsUtil.getPortLogicalName(ofVersion, portNo);
+ return new NodeConnectorId(OF_URI_PREFIX + datapathid + ":" + (logicalName == null? portNo : logicalName));
}
- public static Long portNumberfromNodeConnectorId(NodeConnectorId ncId) {
- return portNumberfromNodeConnectorId(ncId.getValue());
+ public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, NodeConnectorId ncId) {
+ return portNumberfromNodeConnectorId(ofVersion, ncId.getValue());
}
- public static Long portNumberfromNodeConnectorId(String ncId){
+ public static Long portNumberfromNodeConnectorId(OpenflowVersion ofVersion, String ncId){
String[] split = ncId.split(":");
+ // It can happen that token length will be just 1 i.e 2 or CONTROLLER
// If the length is just one then this cannot be the new MD-SAL style node connector Id which
// is of the form openflow:1:3.
- if(split.length == 1){
- return Long.decode(ncId);
- }
+
String portNoString = split[split.length-1];
- Long portNo = Long.decode(portNoString);
+ Long portNo = OpenflowPortsUtil.getPortFromLogicalName(ofVersion, portNoString);
return portNo;
}
- public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo) {
- return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo));
+ public static NodeConnectorRef nodeConnectorRefFromDatapathIdPortno(BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
+ return new NodeConnectorRef(nodeConnectorInstanceIdentifierFromDatapathIdPortno(datapathId, portNo, ofVersion));
}
public static InstanceIdentifier<NodeConnector> nodeConnectorInstanceIdentifierFromDatapathIdPortno(
- BigInteger datapathId, Long portNo) {
+ BigInteger datapathId, Long portNo, OpenflowVersion ofVersion) {
NodeId nodeId = nodeIdFromDatapathId(datapathId);
- NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo);
+ NodeConnectorId nodeConnectorId = nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion);
return InstanceIdentifier.builder(Nodes.class) //
.child(Node.class, new NodeKey(nodeId)) //
.child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)).toInstance();
}
- public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+ public static NodeConnectorUpdatedBuilder nodeConnectorUpdatedBuilderFromDatapathIdPortNo(BigInteger datapathId,
+ Long portNo, OpenflowVersion ofVersion) {
NodeConnectorUpdatedBuilder builder = new NodeConnectorUpdatedBuilder();
- builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
- builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo));
+ builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, portNo, ofVersion));
+ builder.setNodeConnectorRef(InventoryDataServiceUtil.nodeConnectorRefFromDatapathIdPortno(datapathId,portNo, ofVersion));
return builder;
}
- public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId, Long portNo) {
+ public static NodeConnectorBuilder nodeConnectorBuilderFromDatapathIdPortNo(BigInteger datapathId,
+ Long portNo, OpenflowVersion ofVersion) {
NodeConnectorBuilder builder = new NodeConnectorBuilder();
- builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo));
+ builder.setId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId,portNo, ofVersion));
return builder;
}
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.util;
+
+import com.google.common.collect.ImmutableBiMap;
+import org.opendaylight.openflowjava.protocol.api.util.BinContent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.CommonPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
+
+/**
+ * Class which integrates the port constants defined and used by MDSAL and the ports defined in openflow java
+ *
+ * This class is responsible for converting MDSAL given logical names to port numbers and back.
+ *
+ * Any newer version of openflow can have a similar mapping or can/should be extended.
+ *
+ * @author Kamal Rameshan on 5/2/14.
+ */
+public class OpenflowPortsUtil {
+
+ static ImmutableBiMap<OpenflowVersion, ImmutableBiMap<String, Long>> versionPortMap;
+
+ static final String MAX = "MAX";
+
+ // the init gets called from MDController at the start
+ public static void init() {
+
+ // v1.0 ports
+ ImmutableBiMap<String, Long> OFv10 = new ImmutableBiMap.Builder<String, Long>()
+ .put(OutputPortValues.MAX.toString(), new Long(PortNumberValuesV10.MAX.getIntValue())) //0xff00
+ .put(OutputPortValues.INPORT.toString(), new Long(PortNumberValuesV10.INPORT.getIntValue())) //0xfff8
+ .put(OutputPortValues.TABLE.toString(), new Long(PortNumberValuesV10.TABLE.getIntValue())) //0xfff9
+ .put(OutputPortValues.NORMAL.toString(), new Long(PortNumberValuesV10.NORMAL.getIntValue())) //0xfffa
+ .put(OutputPortValues.FLOOD.toString(), new Long(PortNumberValuesV10.FLOOD.getIntValue())) //0xfffb
+ .put(OutputPortValues.ALL.toString(), new Long(PortNumberValuesV10.ALL.getIntValue())) //0xfffc
+ .put(OutputPortValues.CONTROLLER.toString(), new Long(PortNumberValuesV10.CONTROLLER.getIntValue())) //0xfffd
+ .put(OutputPortValues.LOCAL.toString(), new Long(PortNumberValuesV10.LOCAL.getIntValue())) //0xfffe
+ .put(OutputPortValues.NONE.toString(), new Long(PortNumberValuesV10.NONE.getIntValue())) //0xfffe
+ .build();
+
+ // openflow 1.3 reserved ports.
+ // PortNumberValues are defined in OFJava yang. And yang maps an int to all enums. Hence we need to create longs from (-ve) ints
+ // TODO: do we need to define these ports in yang?
+ ImmutableBiMap<String, Long> OFv13 = new ImmutableBiMap.Builder<String, Long>()
+ .put(OutputPortValues.MAX.toString(), BinContent.intToUnsignedLong(PortNumberValues.MAX.getIntValue())) //0xffffff00
+ .put(OutputPortValues.INPORT.toString(), BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())) //0xfffffff8
+ .put(OutputPortValues.TABLE.toString(), BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())) //0xfffffff9
+ .put(OutputPortValues.NORMAL.toString(), BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())) //0xfffffffa
+ .put(OutputPortValues.FLOOD.toString(), BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())) //0xfffffffb
+ .put(OutputPortValues.ALL.toString(), BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())) //0xfffffffc
+ .put(OutputPortValues.CONTROLLER.toString(), BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER.getIntValue())) //0xfffffffd
+ .put(OutputPortValues.LOCAL.toString(), BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())) //0xfffffffe
+ .put(OutputPortValues.ANY.toString(), BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())) //0xffffffff
+ .build();
+
+ versionPortMap = new ImmutableBiMap.Builder<OpenflowVersion, ImmutableBiMap<String, Long>>()
+ .put(OpenflowVersion.OF10, OFv10)
+ .put(OpenflowVersion.OF13, OFv13)
+ .build();
+
+ }
+
+ public static void close() {
+ versionPortMap = null;
+ }
+
+ public static String getPortLogicalName(OpenflowVersion ofVersion, Long portNumber) {
+ return versionPortMap.get(ofVersion).inverse().get(portNumber);
+ }
+
+ public static Long getPortFromLogicalName(OpenflowVersion ofVersion, String logicalNameOrPort) {
+ Long port = versionPortMap.get(ofVersion).get(logicalNameOrPort);
+ if (port == null) {
+ try {
+ port = Long.decode(logicalNameOrPort);
+ } catch(NumberFormatException ne) {
+ //ignore, sent null back.
+ }
+ }
+ return port;
+ }
+
+ public static CommonPort.PortNumber getProtocolAgnosticPort(OpenflowVersion ofVersion, Long portNumber) {
+ String reservedPortLogicalName = getPortLogicalName(ofVersion, portNumber);
+ return (reservedPortLogicalName == null ? new CommonPort.PortNumber(portNumber) :
+ new CommonPort.PortNumber(reservedPortLogicalName));
+ }
+
+ public static Long getProtocolPortNumber(OpenflowVersion ofVersion, CommonPort.PortNumber port) {
+ String portLogicalName = port.getString();
+
+ if (portLogicalName != null) {
+ return versionPortMap.get(ofVersion).get(portLogicalName);
+ } else {
+ return port.getUint32();
+ }
+ }
+
+ public static Long getMaxPortForVersion(OpenflowVersion ofVersion) {
+ return getPortFromLogicalName (ofVersion, MAX);
+ }
+
+ public static boolean isPortReserved(OpenflowVersion ofVersion, Long portNumber) {
+ return versionPortMap.get(ofVersion).inverse().containsKey(portNumber);
+ }
+}
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.util;
+
+/** List of Openflow versions supported by the plugin
+ * Note: If you add a version here, make sure to update {@link OpenflowPortsUtil} as well.
+ * Created by kramesha on 5/2/14.
+ */
+public enum OpenflowVersion {
+
+ OF10((short)0x01),
+ OF13((short)0x04),
+ UNSUPPORTED((short)0x00);
+
+
+ private short version;
+
+ OpenflowVersion(short version) {
+ this.version = version;
+ }
+
+ public static OpenflowVersion get(Short version) {
+ for (OpenflowVersion ofv : OpenflowVersion.values()) {
+ if (ofv.version == version) {
+ return ofv;
+ }
+ }
+ return UNSUPPORTED;
+ }
+
+}
*/
package org.opendaylight.openflowplugin.openflow.md.util;
-import java.math.BigInteger;
-
-import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdatedBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.flow.capable.port.State;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortStateV10;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
+import java.math.BigInteger;
+
public abstract class PortTranslatorUtil {
public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures translatePortFeatures(PortFeatures apf) {
org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures napf = null;
return npc;
}
- public static NodeConnectorUpdated translatePort(Short version,BigInteger datapathId,Long portNo, PortGrouping port) {
+ public static NodeConnectorUpdated translatePort(Short version, BigInteger datapathId,Long portNumber, PortGrouping port) {
+ OpenflowVersion ofVersion = OpenflowVersion.get(version);
NodeConnectorUpdatedBuilder builder = InventoryDataServiceUtil
- .nodeConnectorUpdatedBuilderFromDatapathIdPortNo(datapathId,port.getPortNo());
+ .nodeConnectorUpdatedBuilderFromDatapathIdPortNo(datapathId, port.getPortNo(), ofVersion);
FlowCapableNodeConnectorUpdatedBuilder fcncub = new FlowCapableNodeConnectorUpdatedBuilder();
- if(version == OFConstants.OFP_VERSION_1_3) {
+ if(ofVersion == OpenflowVersion.OF13) {
fcncub.setAdvertisedFeatures(PortTranslatorUtil.translatePortFeatures(port.getAdvertisedFeatures()));
fcncub.setConfiguration(PortTranslatorUtil.translatePortConfig(port.getConfig()));
fcncub.setCurrentFeature(PortTranslatorUtil.translatePortFeatures(port.getCurrentFeatures()));
fcncub.setPeerFeatures(PortTranslatorUtil.translatePortFeatures(port.getPeerFeatures()));
fcncub.setState(PortTranslatorUtil.translatePortState(port.getState()));
fcncub.setSupported(PortTranslatorUtil.translatePortFeatures(port.getSupportedFeatures()));
- } else if (version == OFConstants.OFP_VERSION_1_0) {
+
+ } else if (ofVersion == OpenflowVersion.OF10) {
fcncub.setAdvertisedFeatures(PortTranslatorUtil.translatePortFeatures(port.getAdvertisedFeaturesV10()));
fcncub.setConfiguration(PortTranslatorUtil.translatePortConfig(port.getConfigV10()));
fcncub.setCurrentFeature(PortTranslatorUtil.translatePortFeatures(port.getCurrentFeaturesV10()));
fcncub.setHardwareAddress(port.getHwAddr());
fcncub.setMaximumSpeed(port.getMaxSpeed());
fcncub.setName(port.getName());
- fcncub.setPortNumber(port.getPortNo());
+ fcncub.setPortNumber(OpenflowPortsUtil.getProtocolAgnosticPort(ofVersion, portNumber));
builder.addAugmentation(FlowCapableNodeConnectorUpdated.class, fcncub.build());
return builder.build();
}
import java.util.ArrayList;
import java.util.List;
-import junit.framework.Assert;
-
+import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.sal.action.PopVlan;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
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.inet.types.rev100924.Uri;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
+/**
+ * test for {@link ActionConvertor}
+ */
public class ActionConvertorTest {
List<Action> actions = new ArrayList<>();
static Integer actionItem = 0;
+ /**
+ * prepare OpenflowPortsUtil util class
+ */
+ @Before
+ public void setUp() {
+ OpenflowPortsUtil.init();
+ }
+
@Test
public void testActionConvertorwithallParameters() {
OutputActionData();
setFieldData();
setExperimenterData();
List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731
- .actions.grouping.Action> OFActionsList = ActionConvertor.getActions(actions, (short) 0X4,BigInteger.valueOf(1));
+ .actions.grouping.Action> OFActionsList = ActionConvertor.getActions(actions, (short) 0X4, BigInteger.ONE);
// OutputActions(OFActionsList);
--- /dev/null
+package org.opendaylight.openflowplugin.openflow.md.util;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: Kamal Rameshan (kramesha@cisco.com)
+ * @since : 6/2/14
+ */
+public class OpenflowPortsUtilTest {
+ private static Map<String, Long> mapOF10Ports;
+ private static Map<String, Long> mapOF13Ports;
+ private static Map<OpenflowVersion, Map<String, Long>> mapVersionToPorts;
+
+ @BeforeClass
+ public static void setupClass() {
+ OpenflowPortsUtil.init();
+
+ mapOF10Ports = new HashMap<String, Long>();
+ mapOF10Ports.put(OutputPortValues.MAX.toString(), 65280L);
+ mapOF10Ports.put(OutputPortValues.INPORT.toString(), 65528L);
+ mapOF10Ports.put(OutputPortValues.TABLE.toString(), 65529L);
+ mapOF10Ports.put(OutputPortValues.NORMAL.toString(), 65530L);
+ mapOF10Ports.put(OutputPortValues.FLOOD.toString(), 65531L);
+ mapOF10Ports.put(OutputPortValues.ALL.toString(), 65532L);
+ mapOF10Ports.put(OutputPortValues.CONTROLLER.toString(), 65533L);
+ mapOF10Ports.put(OutputPortValues.LOCAL.toString(), 65534L);
+ mapOF10Ports.put(OutputPortValues.NONE.toString(), 65535L);
+
+ mapOF13Ports = new HashMap<String, Long>();
+ mapOF13Ports.put(OutputPortValues.MAX.toString(), 4294967040L);
+ mapOF13Ports.put(OutputPortValues.INPORT.toString(), 4294967288L);
+ mapOF13Ports.put(OutputPortValues.TABLE.toString(), 4294967289L);
+ mapOF13Ports.put(OutputPortValues.NORMAL.toString(), 4294967290L);
+ mapOF13Ports.put(OutputPortValues.FLOOD.toString(), 4294967291L);
+ mapOF13Ports.put(OutputPortValues.ALL.toString(), 4294967292L);
+ mapOF13Ports.put(OutputPortValues.CONTROLLER.toString(), 4294967293L);
+ mapOF13Ports.put(OutputPortValues.LOCAL.toString(), 4294967294L);
+ mapOF13Ports.put(OutputPortValues.ANY.toString(), 4294967295L);
+
+ mapVersionToPorts = new HashMap<OpenflowVersion, Map<String, Long>>();
+ mapVersionToPorts.put(OpenflowVersion.OF10, mapOF10Ports);
+ mapVersionToPorts.put(OpenflowVersion.OF13, mapOF13Ports);
+
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ OpenflowPortsUtil.close();
+ mapOF10Ports.clear();
+ mapOF13Ports.clear();
+ mapVersionToPorts.clear();
+ }
+
+ //helper
+ private void matchGetLogicalName(OpenflowVersion version, String logicalName) {
+ Assert.assertEquals("Controller reserve port not matching to logical-name for "+ version,
+ logicalName,
+ OpenflowPortsUtil.getPortLogicalName(version, mapVersionToPorts.get(version).get(logicalName)));
+ }
+
+ //helper
+ private void matchGetPortfromLogicalName(OpenflowVersion version, String logicalName) {
+ Assert.assertEquals("Controller reserve port not matching to logical-name for "+ version,
+ mapVersionToPorts.get(version).get(logicalName), OpenflowPortsUtil.getPortFromLogicalName(version, logicalName));
+ }
+
+ @Test
+ public void testGetPortLogicalName() {
+
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.toString());
+ matchGetLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.toString());
+
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.toString());
+ matchGetLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.toString());
+
+ Assert.assertNull("Invalid port number should return a null",
+ OpenflowPortsUtil.getPortLogicalName(OpenflowVersion.OF10, 99999L));
+
+ Assert.assertNull("Invalid port number should return a null",
+ OpenflowPortsUtil.getPortLogicalName(OpenflowVersion.OF13, 99999L));
+ }
+
+
+ @Test
+ public void testGetPortFromLogicalName() {
+
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.MAX.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.INPORT.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.TABLE.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NORMAL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.FLOOD.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.ALL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.CONTROLLER.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.LOCAL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF10, OutputPortValues.NONE.toString());
+
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.MAX.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.INPORT.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.TABLE.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.NORMAL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.FLOOD.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ALL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.CONTROLLER.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.LOCAL.toString());
+ matchGetPortfromLogicalName(OpenflowVersion.OF13, OutputPortValues.ANY.toString());
+
+ Assert.assertNull("Invalid port logical name should return a null",
+ OpenflowPortsUtil.getPortFromLogicalName(OpenflowVersion.OF10, "abc"));
+
+ Assert.assertNull("Invalid port logical name should return a null",
+ OpenflowPortsUtil.getPortFromLogicalName(OpenflowVersion.OF13, "abc"));
+
+ }
+
+}