[SDFAB-356] Extend P4RuntimeMeterProgrammable and Codecs to support reset scenario

Change-Id: Ifad0b296568d3f78b2aa792fa63f2f81fa80ebae
diff --git a/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java b/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java
index b210709..2da12d1 100644
--- a/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java
+++ b/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/MeterEntryCodec.java
@@ -34,8 +34,13 @@
 
     static P4RuntimeOuterClass.MeterConfig getP4Config(PiMeterCellConfig piConfig)
             throws CodecException {
-        if (piConfig.meterBands().size() != 2) {
-            throw new CodecException("Number of meter bands should be 2");
+        // A reset config has no band
+        if (piConfig.isReset()) {
+            return null;
+        }
+        // A modify config has exactly 2 bands
+        if (!piConfig.isModify()) {
+            throw new CodecException("Number of meter bands should be 2 (Modify) or 0 (Reset)");
         }
         final PiMeterBand[] bands = piConfig.meterBands().toArray(new PiMeterBand[0]);
         long cir, cburst, pir, pburst;
@@ -68,12 +73,17 @@
             throws P4InfoBrowser.NotFoundException, CodecException {
         final int meterId = browser.meters().getByName(
                 piEntity.cellId().meterId().id()).getPreamble().getId();
-        return P4RuntimeOuterClass.MeterEntry.newBuilder()
+        P4RuntimeOuterClass.MeterEntry.Builder builder =
+            P4RuntimeOuterClass.MeterEntry.newBuilder()
                 .setMeterId(meterId)
                 .setIndex(P4RuntimeOuterClass.Index.newBuilder()
-                                  .setIndex(piEntity.cellId().index()).build())
-                .setConfig(getP4Config(piEntity))
-                .build();
+                                .setIndex(piEntity.cellId().index()).build());
+        // We keep the config field unset if it is reset scenario
+        P4RuntimeOuterClass.MeterConfig meterConfig = getP4Config(piEntity);
+        if (meterConfig != null) {
+            builder = builder.setConfig(meterConfig);
+        }
+        return builder.build();
     }
 
     @Override