From: Kamal Rameshan Date: Thu, 19 Jun 2014 02:42:41 +0000 (-0700) Subject: Bug-835 - Reserve Ports should be logical ports X-Git-Tag: release/helium~142 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=42df8242a2130336ba6f2ece33c30c72c372a363;p=openflowplugin.git Bug-835 - Reserve Ports should be logical ports - rebased - spread ofVersion parameter Change-Id: I62aa6b441642c8677396522462527d42526775d1 Signed-off-by: Kamal Rameshan Signed-off-by: Michal Rehak --- diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java index 6afef5a729..06350308b4 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java @@ -8,6 +8,7 @@ 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; @@ -54,4 +55,10 @@ public interface ModelDrivenSwitch extends // * @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(); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java index 49b554e16d..2d3fae434c 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java @@ -44,6 +44,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.translator.PortStatusMes 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; @@ -127,6 +128,9 @@ public class MDController implements IMDController, AutoCloseable { */ public void init() { LOG.debug("init"); + + OpenflowPortsUtil.init(); + messageTranslators = new ConcurrentHashMap<>(); popListeners = new ConcurrentHashMap<>(); //TODO: move registration to factory @@ -402,6 +406,7 @@ public class MDController implements IMDController, AutoCloseable { switchConnectionPrv.setSwitchConnectionHandler(null); } switchConnectionProviders = null; + OpenflowPortsUtil.close(); OFSessionUtil.releaseSessionManager(); errorHandler = null; } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java index 59affaf88a..213347c3f8 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java @@ -7,14 +7,10 @@ */ 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; @@ -33,6 +29,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext; 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; @@ -172,10 +169,13 @@ 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; -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 @@ -950,7 +950,8 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch { // 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 @@ -1442,7 +1443,9 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch { // 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()); @@ -1488,7 +1491,8 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch { // 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()); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java index 5e20669753..e19d50c488 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java @@ -9,16 +9,58 @@ */ 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; @@ -46,15 +88,49 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti 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; @@ -615,71 +691,15 @@ public final class ActionConvertor { 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(); @@ -689,10 +709,11 @@ public final class ActionConvertor { * 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 toMDSalActions( - List actionList) { + List actionList, OpenflowVersion ofVersion) { List bucketActions = new ArrayList<>(); for (Action action : actionList) { @@ -756,7 +777,7 @@ public final class ActionConvertor { } 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)) { diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java index 4dbcd265bf..c9e224bafc 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java @@ -7,11 +7,8 @@ */ 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; @@ -21,6 +18,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowMo 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. @@ -35,12 +36,12 @@ public class FlowStatsResponseConvertor { * @param allFlowStats * @return */ - public List toSALFlowStatsList(List allFlowStats,BigInteger datapathid){ + public List toSALFlowStatsList(List allFlowStats, BigInteger datapathid, OpenflowVersion ofVersion){ List convertedSALFlowStats = new ArrayList(); for(FlowStats flowStats : allFlowStats){ - convertedSALFlowStats.add(toSALFlowStats(flowStats, datapathid)); + convertedSALFlowStats.add(toSALFlowStats(flowStats, datapathid, ofVersion)); } return convertedSALFlowStats; @@ -52,7 +53,7 @@ public class FlowStatsResponseConvertor { * @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())); @@ -68,13 +69,13 @@ public class FlowStatsResponseConvertor { 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(), @@ -83,7 +84,7 @@ public class FlowStatsResponseConvertor { flowStats.getFlags().isOFPFFSENDFLOWREM())); } if(flowStats.getInstruction()!= null){ - salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.toSALInstruction(flowStats.getInstruction())); + salFlowStatsBuilder.setInstructions(OFToMDSalFlowConvertor.toSALInstruction(flowStats.getInstruction(), ofVersion)); } return salFlowStatsBuilder.build(); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java index a09265913f..4f8b1728a9 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java @@ -11,6 +11,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor; 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; @@ -107,11 +108,11 @@ public class GroupStatsResponseConvertor { public List toSALGroupDescStatsList( - List allGroupDescStats){ + List allGroupDescStats, OpenflowVersion ofVersion){ List convertedSALGroupsDesc = new ArrayList<>(); for(GroupDesc groupDesc: allGroupDescStats){ - convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc)); + convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc, ofVersion)); } return convertedSALGroupsDesc; @@ -119,13 +120,14 @@ public class GroupStatsResponseConvertor { /** * 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())); @@ -134,7 +136,7 @@ public class GroupStatsResponseConvertor { } public org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc( - List bucketDescStats ){ + List 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(); @@ -143,7 +145,7 @@ public class GroupStatsResponseConvertor { for(BucketsList bucketDetails : bucketDescStats){ BucketBuilder bucketDesc = new BucketBuilder(); List convertedSalActions = - ActionConvertor.toMDSalActions (bucketDetails.getAction()); + ActionConvertor.toMDSalActions (bucketDetails.getAction(), ofVersion); List actions = new ArrayList<>(); int actionKey = 0; diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java index cdc2e72881..72066e8ffe 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java @@ -7,10 +7,7 @@ */ 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; @@ -37,16 +34,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002 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 instructions) { + List instructions, OpenflowVersion ofVersion) { InstructionsBuilder instructionsBuilder = new InstructionsBuilder(); @@ -60,11 +62,7 @@ public class OFToMDSalFlowConvertor { ApplyActionsBuilder applyActionsBuilder = new ApplyActionsBuilder(); - applyActionsBuilder.setAction( - wrapActionList( - ActionConvertor.toMDSalActions(actionsInstruction.getAction() - ) - )); + applyActionsBuilder.setAction(wrapActionList(ActionConvertor.toMDSalActions(actionsInstruction.getAction(), ofVersion))); applyActionsCaseBuilder.setApplyActions(applyActionsBuilder.build()); @@ -126,7 +124,7 @@ public class OFToMDSalFlowConvertor { 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(); @@ -183,10 +181,11 @@ public class OFToMDSalFlowConvertor { /** * Method wraps openflow 1.0 actions list to Apply Action Instructions + * @param ofVersion current ofp version */ public static Instructions wrapOF10ActionsToInstruction( - List actionsList) { + List actionsList, OpenflowVersion ofVersion) { InstructionsBuilder instructionsBuilder = new InstructionsBuilder(); List salInstructionList = new ArrayList(); @@ -194,11 +193,7 @@ public class OFToMDSalFlowConvertor { 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()); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java index 2761f71f69..1201009b10 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java @@ -7,12 +7,10 @@ */ 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; @@ -30,6 +28,10 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument; 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 = "/"; @@ -58,7 +60,7 @@ public class PacketOutConvertor { 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); @@ -73,7 +75,7 @@ public class PacketOutConvertor { NodeConnectorRef outRef = inputPacket.getEgress(); List 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 @@ -108,13 +110,13 @@ public class PacketOutConvertor { 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); } } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java index 51560ae97e..4763bac928 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java @@ -9,6 +9,8 @@ */ 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; @@ -52,7 +54,8 @@ public final class PortConvertor { 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); @@ -119,13 +122,16 @@ public final class PortConvertor { * @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()); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java index 74701163ca..327a8d1c48 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java @@ -18,6 +18,7 @@ import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils; 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; @@ -202,13 +203,15 @@ public class MatchConvertorImpl implements MatchConvertor> { List 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 @@ -430,7 +433,7 @@ public class MatchConvertorImpl implements MatchConvertor> { * @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(); @@ -438,7 +441,7 @@ public class MatchConvertorImpl implements MatchConvertor> { 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) { @@ -554,13 +557,12 @@ public class MatchConvertorImpl implements MatchConvertor> { */ 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 swMatchList, final BigInteger datapathid){ + private static Match OfMatchToSALMatchConvertor(List swMatchList, final BigInteger datapathid, + OpenflowVersion ofVersion){ MatchBuilder matchBuilder = new MatchBuilder(); EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder(); @@ -582,11 +584,11 @@ public class MatchConvertorImpl implements MatchConvertor> { 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); @@ -1338,14 +1340,15 @@ public class MatchConvertorImpl implements MatchConvertor> { * 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(); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java index 64fa7233d8..d1f85ad365 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java @@ -8,7 +8,11 @@ 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; @@ -25,9 +29,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13 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; - /** * */ @@ -336,7 +337,7 @@ public class MatchConvertorV10Impl implements MatchConvertor { */ 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; diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java index e70743603e..2b62876809 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java @@ -9,14 +9,6 @@ */ 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; @@ -24,6 +16,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.Matc 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; @@ -134,6 +127,14 @@ import org.opendaylight.yangtools.yang.binding.DataObject; 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> { protected static final Logger LOG = LoggerFactory.getLogger(FlowRemovedTranslator.class); @@ -171,13 +172,14 @@ public class FlowRemovedTranslator implements IMDMessageTranslator 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())); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java index 77e4cf837f..de68e6e567 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java @@ -7,11 +7,6 @@ */ 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; @@ -19,6 +14,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStats 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; @@ -66,11 +62,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 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; @@ -95,6 +91,11 @@ import org.opendaylight.yangtools.yang.binding.DataObject; 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 ). @@ -116,6 +117,8 @@ public class MultipartReplyTranslator implements IMDMessageTranslator listDataObject = new CopyOnWriteArrayList(); + OpenflowVersion ofVersion = OpenflowVersion.get(sc.getPrimaryConductor().getVersion()); + if(msg instanceof MultipartReplyMessage){ MultipartReplyMessage mpReply = (MultipartReplyMessage)msg; NodeId node = this.nodeIdFromDatapathId(sc.getFeatures().getDatapathId()); @@ -128,7 +131,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslatorsingletonList(pktInEvent); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInV10Translator.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInV10Translator.java index 5b328526b7..5756ce88ad 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInV10Translator.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInV10Translator.java @@ -15,6 +15,7 @@ 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.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; @@ -67,7 +68,8 @@ public class PacketInV10Translator implements IMDMessageTranslatorsingletonList(pktInEvent); } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPSpeaker.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPSpeaker.java index 2799229542..8fd155c08f 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPSpeaker.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPSpeaker.java @@ -7,14 +7,6 @@ */ 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; @@ -23,6 +15,7 @@ import org.opendaylight.controller.sal.utils.EtherTypes; 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; @@ -38,6 +31,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; 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); @@ -72,6 +73,8 @@ public class LLDPSpeaker { public void addNodeConnector(InstanceIdentifier nodeConnectorInstanceId, NodeConnector nodeConnector) { InstanceIdentifier nodeInstanceId = nodeConnectorInstanceId.firstIdentifierOf(Node.class); + ModelDrivenSwitch md = nodeMap.get(nodeInstanceId); + NodeKey nodeKey = InstanceIdentifier.keyOf(nodeInstanceId); NodeId nodeId = nodeKey.getId(); NodeConnectorId nodeConnectorId = nodeConnector.getId(); @@ -79,9 +82,10 @@ public class LLDPSpeaker { 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)); } @@ -91,7 +95,8 @@ public class LLDPSpeaker { nodeConnectorMap.remove(nodeConnectorInstanceId); } - private byte[] lldpDataFrom(InstanceIdentifier nodeInstanceId,InstanceIdentifier nodeConnectorInstanceId,MacAddress src) { + private byte[] lldpDataFrom(InstanceIdentifier nodeInstanceId,InstanceIdentifier nodeConnectorInstanceId,MacAddress src, + Short version) { NodeId nodeId = InstanceIdentifier.keyOf(nodeInstanceId).getId(); NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(nodeConnectorInstanceId).getId(); @@ -117,7 +122,8 @@ public class LLDPSpeaker { .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(); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java index 51708714be..0a82e4265b 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java @@ -153,52 +153,55 @@ public abstract class InventoryDataServiceUtil { 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 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; } diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtil.java new file mode 100644 index 0000000000..9865fc90ca --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtil.java @@ -0,0 +1,106 @@ +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> versionPortMap; + + static final String MAX = "MAX"; + + // the init gets called from MDController at the start + public static void init() { + + // v1.0 ports + ImmutableBiMap OFv10 = new ImmutableBiMap.Builder() + .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 OFv13 = new ImmutableBiMap.Builder() + .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>() + .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); + } +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java new file mode 100644 index 0000000000..d08f49d696 --- /dev/null +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java @@ -0,0 +1,29 @@ +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; + } + +} diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java index 0e237f4366..265f675de4 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java @@ -7,9 +7,6 @@ */ 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; @@ -24,6 +21,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13 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; @@ -87,18 +86,20 @@ public abstract class PortTranslatorUtil { 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())); @@ -110,7 +111,7 @@ public abstract class PortTranslatorUtil { 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(); } diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertorTest.java index 8f0571c89b..3e53c27c56 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertorTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertorTest.java @@ -13,10 +13,11 @@ import java.math.BigInteger; 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; @@ -97,11 +98,22 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6 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 actions = new ArrayList<>(); static Integer actionItem = 0; + /** + * prepare OpenflowPortsUtil util class + */ + @Before + public void setUp() { + OpenflowPortsUtil.init(); + } + @Test public void testActionConvertorwithallParameters() { OutputActionData(); @@ -116,7 +128,7 @@ public class ActionConvertorTest { setFieldData(); setExperimenterData(); List OFActionsList = ActionConvertor.getActions(actions, (short) 0X4,BigInteger.valueOf(1)); + .actions.grouping.Action> OFActionsList = ActionConvertor.getActions(actions, (short) 0X4, BigInteger.ONE); // OutputActions(OFActionsList); diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtilTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtilTest.java new file mode 100644 index 0000000000..a9921f8ee3 --- /dev/null +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtilTest.java @@ -0,0 +1,136 @@ +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 mapOF10Ports; + private static Map mapOF13Ports; + private static Map> mapVersionToPorts; + + @BeforeClass + public static void setupClass() { + OpenflowPortsUtil.init(); + + mapOF10Ports = new HashMap(); + 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(); + 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>(); + 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")); + + } + +}