[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/DirectMeterEntryCodec.java b/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java
index 3bedfbf..0f32417 100644
--- a/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java
+++ b/protocols/p4runtime/utils/src/main/java/org/onosproject/p4runtime/ctl/codec/DirectMeterEntryCodec.java
@@ -38,11 +38,16 @@
PiMeterCellConfig piEntity, Object ignored, PiPipeconf pipeconf,
P4InfoBrowser browser)
throws CodecException {
- return P4RuntimeOuterClass.DirectMeterEntry.newBuilder()
+ P4RuntimeOuterClass.DirectMeterEntry.Builder builder =
+ P4RuntimeOuterClass.DirectMeterEntry.newBuilder()
.setTableEntry(CODECS.tableEntry().encode(
- piEntity.cellId().tableEntry(), null, pipeconf))
- .setConfig(MeterEntryCodec.getP4Config(piEntity))
- .build();
+ piEntity.cellId().tableEntry(), null, pipeconf));
+ // We keep the config field unset if it is reset scenario
+ P4RuntimeOuterClass.MeterConfig meterConfig = MeterEntryCodec.getP4Config(piEntity);
+ if (meterConfig != null) {
+ builder = builder.setConfig(meterConfig);
+ }
+ return builder.build();
}
@Override
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