These convertors are used decoding the SAL data to OF Data 96/2896/3
authorusha <usha.m.s@ericsson.com>
Wed, 20 Nov 2013 10:55:31 +0000 (16:25 +0530)
committerusha <usha.m.s@ericsson.com>
Wed, 20 Nov 2013 12:39:24 +0000 (18:09 +0530)
Signed-off-by: usha <usha.m.s@ericsson.com>
Change-Id: Ic09e5554765e448e251d6d1fdf79416e2f7387b6

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/FlowConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java [moved from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConverter.java with 89% similarity]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java [new file with mode: 0644]

index e24121ed783d8471d162df7cf615b557a2a973ae..b05aacd7534027841bee0f71d247d70b27fd39e6 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.controller.sal.common.util.Rpcs;
 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConverter;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
 import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
@@ -155,7 +155,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     @Override
     public Future<RpcResult<AddMeterOutput>> addMeter(AddMeterInput input) {
        // Convert the AddMeterInput to MeterModInput 
-       MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input) ;
+       MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input) ;
        
                
        // For Meter provisioning, the SwitchConnectionDistinguisher is set to null so  
@@ -262,7 +262,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<RemoveMeterOutput>> removeMeter(
             RemoveMeterInput input) {
        // Convert the RemoveMeterInput to MeterModInput 
-       MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input) ;
+       MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input) ;
        
                
        // For Meter provisioning, the SwitchConnectionDistinguisher is set to null so  
@@ -402,7 +402,7 @@ public class ModelDrivenSwitchImpl extends AbstractModelDrivenSwitch {
     public Future<RpcResult<UpdateMeterOutput>> updateMeter(
             UpdateMeterInput input) {
        // Convert the UpdateMeterInput to MeterModInput 
-       MeterModInput ofMeterModInput = MeterConverter.toMeterModInput(input.getUpdatedMeter()) ;
+       MeterModInput ofMeterModInput = MeterConvertor.toMeterModInput(input.getUpdatedMeter()) ;
        
                
        // For Meter provisioning, the SwitchConnectionDistinguisher is set to null so  
index 24e321dedb52e563011dd64b3970a815b85c47c1..44e605304d04275e81f5f42953e46a701199d64f 100644 (file)
@@ -17,6 +17,7 @@ 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.PushMplsAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
@@ -33,6 +34,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
 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;
@@ -53,8 +56,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.openflow.protocol.OFPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 
@@ -68,7 +74,8 @@ import org.openflow.protocol.OFPort;
  *
  */
 public final class ActionConvertor {
-
+    private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
+    private static final String PREFIX_SEPARATOR = "/";
     private ActionConvertor() {
         // NOOP
     }
@@ -113,8 +120,9 @@ public final class ActionConvertor {
                 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
             else if (action instanceof DecNwTtl)
                 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
-            // else if(action instanceof SetF) //TODO:SAL Class Missing //
-            // actionsList.add(SalToOFSetField(action));
+            else if (action instanceof SetField)
+                actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
+
             else if (action instanceof PushPbbAction)
                 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
             else if (action instanceof PopPbbAction)
@@ -129,6 +137,27 @@ public final class ActionConvertor {
     }
 
 
+    private static ActionsList SalToOFSetField(Action action, ActionBuilder actionBuilder,
+            ActionsListBuilder actionsListBuilder) {
+
+        org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = ((SetField) action)
+                .getMatch();
+
+        List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
+
+        OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
+
+        oxmFieldsActionBuilder.setMatchEntries(matchEntries);
+
+        actionBuilder
+                .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
+
+        actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
+        actionsListBuilder.setAction(actionBuilder.build());
+        return actionsListBuilder.build();
+
+    }
+
     private static ActionsList SalToOFDecNwTtl(Action action, ActionBuilder actionBuilder,
             ActionsListBuilder actionsListBuilder) {
         actionBuilder.setType(DecNwTtl.class);
@@ -336,7 +365,7 @@ Action action, ActionBuilder actionBuilder,
             }
 
             if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
-                portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
+                //portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
             }
 
         actionBuilder
index e77d22df2525d981bfb3a0b755585b94de0c1300..68d0f94a02cd37df68a45883c9656012403791f4 100644 (file)
@@ -23,9 +23,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Remo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTable;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.Meter;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadata;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress;
@@ -149,7 +149,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Vlan
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowMod;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;
@@ -214,7 +213,7 @@ public class FlowConvertor {
         flowMod.setFlags(ofFlowModFlags);
 
         if (flow.getMatch() != null) {
-            flowMod.setMatch(toMatch(flow.getMatch()));
+            flowMod.setMatch((Match) toMatch(flow.getMatch()));
         }
 
         if (flow.getInstructions() != null) {
@@ -224,7 +223,8 @@ public class FlowConvertor {
         return flowMod.build();
     }
 
-    private static Match toMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match match) {
+    public static List<MatchEntries> toMatch(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match) {
 
         MatchEntriesBuilder matchEntriesBuilder = new MatchEntriesBuilder();
         MatchBuilder matchBuilder = new MatchBuilder();
@@ -682,7 +682,7 @@ public class FlowConvertor {
         }
 
         matchBuilder.setMatchEntries(matchEntriesList);
-        return matchBuilder.build();
+        return matchEntriesList;
     }
 
     private static List<Instructions> toInstructions(
similarity index 89%
rename from openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConverter.java
rename to openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/MeterConvertor.java
index 1dde02ac7030e338db6ade879c3b69e690b2c150..18d26c1a13a991741fb42b54beafa4fc7c22f8cd 100644 (file)
@@ -1,47 +1,41 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
-
 /****
-*
-* This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
-*
-*/
+ *
+ * This class is used for converting the data from SAL layer to OF Library Layer for Meter Mod Command.
+ *
+ */
 
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags.Flags;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeaders;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeader;
-// import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.MeterBand;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;
-
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
+//import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder;
 
 
-public final class MeterConverter {
-       
-        private MeterConverter(){
+public final class MeterConvertor {
+
+        private static List<Bands> bands;
+        private static MeterModInputBuilder meterModInputBuilder;
+        private static MeterFlags flags;
+        private MeterConvertor(){
 
         }
 
@@ -51,9 +45,6 @@ public final class MeterConverter {
         * @return MeterModInput required by OF Library
         */
        public static MeterModInput  toMeterModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter source ) {
-                List<Bands> bands = null;
-                MeterModInputBuilder meterModInputBuilder = null;
-                MeterFlags flags = null ;
 
                 meterModInputBuilder = new MeterModInputBuilder();
 
@@ -67,16 +58,16 @@ public final class MeterConverter {
 
                        meterModInputBuilder.setMeterId(new MeterId(source.getMeterId().getValue()));
 
-                       getFlagsFromSAL(source.getFlags(), flags);
+                       getFlagsFromSAL(source.getFlags());
                                meterModInputBuilder.setFlags(flags);
-                       getBandsFromSAL(source.getMeterBandHeaders(), bands);
+                       getBandsFromSAL(source.getMeterBandHeaders());
                                 meterModInputBuilder.setBands(bands);
                 return meterModInputBuilder.build();
         }
 
 
 
-        private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders, List<Bands> bands) {
+        private static void getBandsFromSAL(MeterBandHeaders meterBandHeaders) {
 
                Iterator <MeterBandHeader> bandHeadersIterator  = meterBandHeaders.getMeterBandHeader().iterator();
                MeterBandHeader meterBandHeader;
@@ -89,7 +80,7 @@ public final class MeterConverter {
                                meterBandHeader = bandHeadersIterator.next();
                                MeterBand meterBandItem = null;
                                //The band types :drop,DSCP_Remark or experimenter.
-                       //      meterBandHeaderBuilder = new MeterBandHeaderBuilder();
+                               //meterBandHeaderBuilder = new MeterBandHeaderBuilder();
 
 
                                if(meterBandHeader.getMeterBandTypes().getFlags().isOfpmbtDrop()){
@@ -140,7 +131,7 @@ public final class MeterConverter {
        }
 
         //get it from plugin(SAL) layer
-        private static void getFlagsFromSAL(Flags flags2, MeterFlags flags) {
+        private static void getFlagsFromSAL(Flags flags2) {
                                boolean meterBurst_SAL = false;
                                boolean meterKbps_SAL = false;
                                boolean meterPktps_SAL = false;
@@ -157,4 +148,5 @@ public final class MeterConverter {
 
                }
 
-}
\ No newline at end of file
+
+}
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/PortConvertor.java
new file mode 100644 (file)
index 0000000..fe8a235
--- /dev/null
@@ -0,0 +1,191 @@
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
+
+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.PortFeatures;
+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.PortReason;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.desc.PortsBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author esssuuu This convertor class is used for Port Mod,port status and
+ *         port description messages,decodes SAL and encodes to OF Data
+ *
+ */
+public final class PortConvertor {
+    private static final Logger log = LoggerFactory.getLogger(PortConvertor.class);
+
+    private PortConvertor() {
+
+    }
+
+    /**
+     * This method is used by PORT_MOD_MESSAGE
+     *
+     * @param source
+     * @return
+     */
+    public static PortModInput toPortModInput(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port source) {
+
+        PortConfig config = null;
+
+        PortModInputBuilder portModInputBuilder = new PortModInputBuilder();
+        portModInputBuilder.setAdvertise(getPortFeatures(source.getAdvertisedFeatures()));
+        portModInputBuilder.setPortNo(new PortNumber(source.getPortNumber()));
+        maskPortConfigFields(source.getConfiguration(), config);
+        portModInputBuilder.setConfig(config);
+        portModInputBuilder.setHwAddress(new MacAddress(source.getHardwareAddress()));
+        config = null;
+        maskPortConfigFields(source.getMask(), config);
+        portModInputBuilder.setMask(config);
+
+        return portModInputBuilder.build();
+
+    }
+
+    private static void maskPortConfigFields(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig configData,
+            PortConfig config) {
+        Boolean portDown = false;
+        Boolean noRecv = false;
+        Boolean noFwd = false;
+        Boolean noPacketIn = false;
+        if (configData.isNOFWD())
+            noFwd = true;
+        if (configData.isNOPACKETIN())
+            noPacketIn = true;
+        if (configData.isNORECV())
+            noRecv = true;
+        if (configData.isPORTDOWN())
+            portDown = true;
+
+        config = new PortConfig(noFwd, noPacketIn, noRecv, portDown);
+
+    }
+
+    private static PortFeatures getPortFeatures(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures salPortFeatures) {
+
+        return new PortFeatures(salPortFeatures.is_100gbFd(), salPortFeatures.is_100mbFd(),
+                salPortFeatures.is_100mbHd(), salPortFeatures.is_10gbFd(), salPortFeatures.is_10mbFd(),
+                salPortFeatures.is_10mbHd(), salPortFeatures.is_1gbFd(), salPortFeatures.is_1gbHd(),
+                salPortFeatures.is_1tbFd(), salPortFeatures.is_40gbFd(), salPortFeatures.isAutoeng(),
+                salPortFeatures.isCopper(), salPortFeatures.isFiber(), salPortFeatures.isOther(),
+                salPortFeatures.isPause(), salPortFeatures.isPauseAsym());
+    }
+
+    /*
+     * This method is called as a reply to OFPMP_PORT_DESCRIPTION
+     * message(OF1.3.1)
+     */
+    /**
+     * @param source
+     *            :SAL FlowCapablePort
+     * @return OF:Ports
+     */
+    public static Ports toPortDesc(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowCapablePort source) {
+
+        PortConfig config = null;
+        PortState portState = null;
+
+        PortsBuilder OFPortDescDataBuilder = new PortsBuilder();
+        OFPortDescDataBuilder.setPortNo(source.getPortNumber()); // portNO
+
+        OFPortDescDataBuilder.setHwAddr(source.getHardwareAddress());
+        OFPortDescDataBuilder.setName(source.getName());
+
+        maskPortConfigFields(source.getConfiguration(), config);
+
+        OFPortDescDataBuilder.setConfig(config);
+
+        getPortState(source.getState(), portState);
+        OFPortDescDataBuilder.setState(portState);
+        OFPortDescDataBuilder.setCurrentFeatures(getPortFeatures(source.getCurrentFeature()));
+        OFPortDescDataBuilder.setAdvertisedFeatures(getPortFeatures(source.getAdvertisedFeatures()));
+        OFPortDescDataBuilder.setSupportedFeatures(getPortFeatures(source.getSupported()));
+        OFPortDescDataBuilder.setPeerFeatures(getPortFeatures(source.getPeerFeatures()));
+        OFPortDescDataBuilder.setCurrSpeed(source.getCurrentSpeed());
+        OFPortDescDataBuilder.setMaxSpeed(source.getMaximumSpeed());
+
+        return OFPortDescDataBuilder.build();
+
+    }
+
+    private static void getPortState(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortState state, PortState portState) {
+
+        boolean isLinkDown = false;// (0),
+        boolean isBlocked = false; // (1),
+        boolean isLive = false; // (2);
+
+        if (state.getIntValue() == 0) {
+            isLinkDown = true;
+        } else if (state.getIntValue() == 1) {
+            isBlocked = true;
+        } else if (state.getIntValue() == 2) {
+            isLive = true;
+        }
+        portState = new PortState(isLinkDown, isBlocked, isLive);
+
+    }
+
+    /**
+     * This method is used called when the ports are added, modi ed, and removed
+     * from the datapath, the controller needs to be informed with the
+     * OFPT_PORT_STATUS message
+     *
+     * @param source
+     *            :SAL Layer input from say REST API
+     * @return OF Layer data required for constructing the OFPT_PORT_STATUS
+     *         message
+     */
+    public static PortStatus toGetPortStatus(
+            org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.FlowPortStatus source) {
+
+        PortConfig config = null;
+        PortState portState = null;
+
+        PortStatusMessageBuilder portStatusMessageBuilder = new PortStatusMessageBuilder();
+
+        if (source.getReason().getIntValue() == 0)
+            portStatusMessageBuilder.setReason(PortReason.OFPPRADD);
+
+        else if (source.getReason().getIntValue() == 1)
+            portStatusMessageBuilder.setReason(PortReason.OFPPRDELETE);
+
+        else if (source.getReason().getIntValue() == 2)
+            portStatusMessageBuilder.setReason(PortReason.OFPPRMODIFY);
+
+        portStatusMessageBuilder.setPortNo(source.getPortNumber()); // portNO
+
+        portStatusMessageBuilder.setHwAddr(source.getHardwareAddress());
+        portStatusMessageBuilder.setName(source.getName());
+
+        maskPortConfigFields(source.getConfiguration(), config);
+
+        portStatusMessageBuilder.setConfig(config);
+
+        getPortState(source.getState(), portState);
+        portStatusMessageBuilder.setState(portState);
+        portStatusMessageBuilder.setCurrentFeatures(getPortFeatures(source.getCurrentFeature()));
+        portStatusMessageBuilder.setAdvertisedFeatures(getPortFeatures(source.getAdvertisedFeatures()));
+        portStatusMessageBuilder.setSupportedFeatures(getPortFeatures(source.getSupported()));
+        portStatusMessageBuilder.setPeerFeatures(getPortFeatures(source.getPeerFeatures()));
+        portStatusMessageBuilder.setCurrSpeed(source.getCurrentSpeed());
+        portStatusMessageBuilder.setMaxSpeed(source.getMaximumSpeed());
+
+        return portStatusMessageBuilder.build();
+
+    }
+
+}