[SDFAB-356] Extend P4RuntimeMeterProgrammable and Codecs to support reset scenario
Change-Id: Ifad0b296568d3f78b2aa792fa63f2f81fa80ebae
diff --git a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeMeterProgrammable.java b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeMeterProgrammable.java
index 0bcfcaf..caaa751 100644
--- a/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeMeterProgrammable.java
+++ b/drivers/p4runtime/src/main/java/org/onosproject/drivers/p4runtime/P4RuntimeMeterProgrammable.java
@@ -37,6 +37,7 @@
import org.onosproject.net.pi.model.PiPipelineModel;
import org.onosproject.net.pi.runtime.PiMeterCellConfig;
import org.onosproject.net.pi.runtime.PiMeterCellHandle;
+import org.onosproject.net.pi.runtime.PiMeterCellId;
import org.onosproject.net.pi.service.PiMeterTranslator;
import org.onosproject.net.pi.service.PiTranslationException;
@@ -51,6 +52,9 @@
import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.net.meter.MeterOperation.Type.ADD;
+import static org.onosproject.net.meter.MeterOperation.Type.MODIFY;
+import static org.onosproject.net.meter.MeterOperation.Type.REMOVE;
/**
* Implementation of MeterProgrammable behaviour for P4Runtime.
@@ -95,19 +99,27 @@
}
private boolean processMeterOp(MeterOperation meterOp) {
-
- if (meterOp.type() != MeterOperation.Type.MODIFY) {
- log.warn("P4Runtime meter operations must be MODIFY!");
- return false;
- }
-
PiMeterCellConfig piMeterCellConfig;
- try {
- piMeterCellConfig = translator.translate(meterOp.meter(), pipeconf);
- } catch (PiTranslationException e) {
- log.warn("Unable translate meter, aborting meter operation {}: {}", meterOp.type(), e.getMessage());
- log.debug("exception", e);
- return false;
+ switch (meterOp.type()) {
+ case ADD:
+ case MODIFY:
+ // Create a config for modify operation
+ try {
+ piMeterCellConfig = translator.translate(meterOp.meter(), pipeconf);
+ } catch (PiTranslationException e) {
+ log.warn("Unable translate meter, aborting meter operation {}: {}", meterOp.type(), e.getMessage());
+ log.debug("exception", e);
+ return false;
+ }
+ break;
+ case REMOVE:
+ // Create a empty config for reset operation
+ PiMeterCellId piMeterCellId = (PiMeterCellId) meterOp.meter().meterCellId();
+ piMeterCellConfig = PiMeterCellConfig.reset(piMeterCellId);
+ break;
+ default:
+ log.warn("Meter Operation type {} not supported", meterOp.type());
+ return false;
}
final PiMeterCellHandle handle = PiMeterCellHandle.of(deviceId, piMeterCellConfig);