Multiple meter support added and meter action added for OF1.5
MeterFeaturesFlag added for OF1.5

Change-Id: I84d2785f37ea51b08244de9c54effe5224af9531
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
index 24fd49f..90a8a9b 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/impl/MeterModBuilder.java
@@ -22,6 +22,7 @@
 import org.projectfloodlight.openflow.protocol.OFMeterFlags;
 import org.projectfloodlight.openflow.protocol.OFMeterMod;
 import org.projectfloodlight.openflow.protocol.OFMeterModCommand;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.protocol.meterband.OFMeterBand;
 import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDrop;
 import org.projectfloodlight.openflow.protocol.meterband.OFMeterBandDscpRemark;
@@ -118,8 +119,13 @@
             default:
                 log.warn("Unknown unit type {}", unit);
         }
-        //FIXME: THIS WILL CHANGE IN OF1.4 to setBands.
-        builder.setMeters(buildBands());
+
+        if (factory.getVersion().getWireVersion() >= OFVersion.OF_14.getWireVersion()) {
+            builder.setBands(buildBands());
+        } else {
+            builder.setMeters(buildBands());
+        }
+
         builder.setFlags(flags)
                 .setMeterId(id)
                 .setXid(xid);
diff --git a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/util/MeterFeaturesBuilder.java b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/util/MeterFeaturesBuilder.java
index abfa4aa..35f9dde 100644
--- a/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/util/MeterFeaturesBuilder.java
+++ b/providers/openflow/meter/src/main/java/org/onosproject/provider/of/meter/util/MeterFeaturesBuilder.java
@@ -21,7 +21,9 @@
 import org.onosproject.net.meter.DefaultMeterFeatures;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterFeatures;
+import org.onosproject.net.meter.MeterFeaturesFlag;
 import org.projectfloodlight.openflow.protocol.OFMeterFeatures;
+import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,9 +34,15 @@
 import static org.onosproject.net.meter.Band.Type.REMARK;
 import static org.onosproject.net.meter.Meter.Unit.KB_PER_SEC;
 import static org.onosproject.net.meter.Meter.Unit.PKTS_PER_SEC;
+import static org.onosproject.net.meter.MeterFeaturesFlag.ACTION_SET;
+import static org.onosproject.net.meter.MeterFeaturesFlag.ANY_POSITION;
+import static org.onosproject.net.meter.MeterFeaturesFlag.MULTI_LIST;
 import static org.projectfloodlight.openflow.protocol.ver13.OFMeterBandTypeSerializerVer13.DROP_VAL;
 import static org.projectfloodlight.openflow.protocol.ver13.OFMeterBandTypeSerializerVer13.DSCP_REMARK_VAL;
 import static org.projectfloodlight.openflow.protocol.ver13.OFMeterFlagsSerializerVer13.*;
+import static org.projectfloodlight.openflow.protocol.ver15.OFMeterFeatureFlagsSerializerVer15.ACTION_SET_VAL;
+import static org.projectfloodlight.openflow.protocol.ver15.OFMeterFeatureFlagsSerializerVer15.ANY_POSITION_VAL;
+import static org.projectfloodlight.openflow.protocol.ver15.OFMeterFeatureFlagsSerializerVer15.MULTI_LIST_VAL;
 
 /**
  * OpenFlow builder of MeterFeatures.
@@ -98,6 +106,24 @@
          * Stats are supported ?
          */
         builder.hasStats((STATS_VAL & ofMeterFeatures.getCapabilities()) != 0);
+
+        /*
+         * Along with the OF1.5, we extract meter features flags
+         */
+        if (ofMeterFeatures.getVersion().wireVersion >= OFVersion.OF_15.wireVersion) {
+            Set<MeterFeaturesFlag> meterFeaturesFlags = Sets.newHashSet();
+            if ((ACTION_SET_VAL & ofMeterFeatures.getFeatures()) != 0) {
+                meterFeaturesFlags.add(ACTION_SET);
+            }
+            if ((ANY_POSITION_VAL & ofMeterFeatures.getFeatures()) != 0) {
+                meterFeaturesFlags.add(ANY_POSITION);
+            }
+            if ((MULTI_LIST_VAL & ofMeterFeatures.getFeatures()) != 0) {
+                meterFeaturesFlags.add(MULTI_LIST);
+            }
+            builder.withFeatures(meterFeaturesFlags);
+        }
+
         return builder.build();
     }