Bug-835 - Reserve Ports should be logical ports 18/7618/3
authorKamal Rameshan <kramesha@cisco.com>
Thu, 19 Jun 2014 02:42:41 +0000 (19:42 -0700)
committerMichal Rehak <mirehak@cisco.com>
Thu, 26 Jun 2014 14:15:39 +0000 (16:15 +0200)
- rebased
- spread ofVersion parameter

Change-Id: I62aa6b441642c8677396522462527d42526775d1
Signed-off-by: Kamal Rameshan <kramesha@cisco.com>
Signed-off-by: Michal Rehak <mirehak@cisco.com>
22 files changed:
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/ModelDrivenSwitch.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/MDController.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/ModelDrivenSwitchImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/FlowStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/OFToMDSalFlowConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PacketOutConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorV10Impl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/FlowRemovedTranslator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInTranslator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/PacketInV10Translator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/lldp/LLDPSpeaker.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtil.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowVersion.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/PortTranslatorUtil.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ActionConvertorTest.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/util/OpenflowPortsUtilTest.java [new file with mode: 0644]

index 6afef5a729252be479c3a12523ef573bd704612a..06350308b4de6155d356c02204179c2dc55bc012 100644 (file)
@@ -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();
 }
index 49b554e16d03d740f085329c42695efb242dd41c..2d3fae434c90d145f860bfa45cc7a0419df274a8 100644 (file)
@@ -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;
     }
index 59affaf88a6aaa4f080ba87b219aebd372da5e29..213347c3f8e69958f6bd0afd55d0e20479ccdef4 100644 (file)
@@ -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());
 
index 5e20669753b037bb5d87d9659fd5ff8c428eff59..e19d50c488608f64f9a714a34c80d23b01e24391 100644 (file)
@@ -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<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) {
@@ -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)) {
index 4dbcd265bf214c2e487e4aec70d78d09df2206cf..c9e224bafc44fddd51226d28bd990a250806dbbb 100644 (file)
@@ -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<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;
@@ -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();
index a09265913fd55ec3112edcf46e7d8714882ab046..4f8b1728a93a6da48a21915165a6d2d1446074e8 100644 (file)
@@ -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<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;
         
@@ -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<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();
@@ -143,7 +145,7 @@ public class GroupStatsResponseConvertor {
         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;
index cdc2e7288142a5743f7394c3c43faa8a7c236550..72066e8ffecc8efa468c2f7e453fa0b2e66e2223 100644 (file)
@@ -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<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();
         
@@ -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<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>();
@@ -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());
                 
index 2761f71f69014a0480f25b9414ea34f6a6ddd378..1201009b101ff657f7c0c3cac6c56609a52b0309 100644 (file)
@@ -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<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
@@ -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);
     }
 }
index 51560ae97ecdc66da7f9a4ae848f266c7169aaeb..4763bac928a4f840e7e3a857f98351c45d4f6955 100644 (file)
@@ -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());
index 74701163cacade026bd62def819d3c5cac9e21c7..327a8d1c4891e567fcfa210b6a3613164e040de8 100644 (file)
@@ -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<MatchEntries>> {
         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
@@ -430,7 +433,7 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
      * @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<List<MatchEntries>> {
         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<List<MatchEntries>> {
      */
     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();
@@ -582,11 +584,11 @@ public class MatchConvertorImpl implements MatchConvertor<List<MatchEntries>> {
             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<List<MatchEntries>> {
      * 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();
     }
index 64fa7233d8c01701570ec4a92512c2ddee87c42f..d1f85ad365d0ecabf0ee52b3625d21aee718e205 100644 (file)
@@ -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<MatchV10> {
      */
     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;
index e70743603e34eba44e00284607ecf4edea34235f..2b628768093821334fe9e5d9a8414a2b2c222209 100644 (file)
@@ -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<OfHeader, List<DataObject>> {
 
     protected static final Logger LOG = LoggerFactory.getLogger(FlowRemovedTranslator.class);
@@ -171,13 +172,14 @@ public class FlowRemovedTranslator implements IMDMessageTranslator<OfHeader, Lis
 
             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()
@@ -191,8 +193,8 @@ public class FlowRemovedTranslator implements IMDMessageTranslator<OfHeader, Lis
     }
 
 
-    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;
@@ -210,11 +212,11 @@ public class FlowRemovedTranslator implements IMDMessageTranslator<OfHeader, Lis
         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()));
index 77e4cf837fc2e108402e65bba015c488f6ebfd19..de68e6e567dbc7cc0039806ea79c33e3f5e3695c 100644 (file)
@@ -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<OfHeader,
         
         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());
@@ -128,7 +131,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 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());
@@ -171,7 +174,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                             new NodeConnectorStatisticsAndPortNumberMapBuilder();
                     statsBuilder.setNodeConnectorId(
                             InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(sc.getFeatures().getDatapathId(),
-                                    portStats.getPortNo()));
+                                    portStats.getPortNo(), ofVersion));
                     
                     BytesBuilder bytesBuilder = new BytesBuilder();
                     bytesBuilder.setReceived(portStats.getRxBytes());
@@ -230,7 +233,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 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());
@@ -409,7 +412,7 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                             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()));
@@ -420,7 +423,8 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                     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());
                 }
index 85eea8ca29d1245171414f1625973da569a2c61d..ece40020ab86039ffeb03fc1f3a0ba02d56f1b7a 100644 (file)
@@ -16,6 +16,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistingu
 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;
@@ -94,13 +95,14 @@ public class PacketInTranslator implements IMDMessageTranslator<OfHeader, List<D
                } 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);
                }
index 5b328526b7682582bc9f552872ddea2b5a56643f..5756ce88ad8bbb3bf616d0e0f852b69ae480aa1d 100644 (file)
@@ -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 IMDMessageTranslator<OfHeader, Lis
                 } 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);
                 }
index 2799229542189ba640ea06d716710062b01ed0eb..8fd155c08fa75e0f982c64d66cfe2789857c7a65 100644 (file)
@@ -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<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();
@@ -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<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();
@@ -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();
index 51708714be0edaf8307669e76c8edb25ff14174b..0a82e4265b6802bf5fd186e6fa8dab33e6ad4eae 100644 (file)
@@ -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<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;
     }
 
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 (file)
index 0000000..9865fc9
--- /dev/null
@@ -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<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);
+    }
+}
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 (file)
index 0000000..d08f49d
--- /dev/null
@@ -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;
+    }
+
+}
index 0e237f436663edba8ce99bcd52f487f98f4f6c3e..265f675de4247889b0824d60d690db8047b0d53a 100644 (file)
@@ -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();
     }
index 8f0571c89b6235347c12df6bcf52cb691be6e06e..3e53c27c56110e53df927e52609db0b8300eabc9 100644 (file)
@@ -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<Action> 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<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);
 
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 (file)
index 0000000..a9921f8
--- /dev/null
@@ -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<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"));
+
+    }
+
+}