Support for bitwise AND/OR/XOR in ImmutableByteSequence
Also, minor refactoring of the fit() method to improve code readability
Change-Id: I826650c3fc45573c723d9d2dd8692da174d9ae08
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
index 36e9068..9b2b4a0 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/AbstractCriterionTranslator.java
@@ -23,7 +23,6 @@
import java.util.Optional;
import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
-import static org.onlab.util.ImmutableByteSequence.fit;
/**
* Abstract implementation of a criterion translator that opportunistically tries to generate different types of match
@@ -48,7 +47,7 @@
void initAsExactMatch(ImmutableByteSequence value, int bitWidth)
throws ByteSequenceTrimException {
this.initType = PiMatchType.EXACT;
- this.value = fit(value, bitWidth);
+ this.value = value.fit(bitWidth);
this.bitWidth = bitWidth;
}
@@ -63,8 +62,8 @@
void initAsTernaryMatch(ImmutableByteSequence value, ImmutableByteSequence mask, int bitWidth)
throws ByteSequenceTrimException {
this.initType = PiMatchType.TERNARY;
- this.value = fit(value, bitWidth);
- this.mask = fit(mask, bitWidth);
+ this.value = value.fit(bitWidth);
+ this.mask = mask.fit(bitWidth);
this.bitWidth = bitWidth;
}
@@ -79,7 +78,7 @@
void initAsLpm(ImmutableByteSequence value, int prefixLength, int bitWidth)
throws ByteSequenceTrimException {
this.initType = PiMatchType.LPM;
- this.value = fit(value, bitWidth);
+ this.value = value.fit(bitWidth);
this.prefixLength = prefixLength;
this.bitWidth = bitWidth;
}
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
index b4ce830..85c763c 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiFlowRuleTranslatorImpl.java
@@ -59,7 +59,6 @@
import static java.lang.String.format;
import static org.onlab.util.ImmutableByteSequence.ByteSequenceTrimException;
-import static org.onlab.util.ImmutableByteSequence.fit;
import static org.onosproject.net.flow.criteria.Criterion.Type.PROTOCOL_INDEPENDENT;
import static org.onosproject.net.pi.impl.CriterionTranslatorHelper.translateCriterion;
import static org.onosproject.net.pi.impl.PiUtils.getInterpreterOrNull;
@@ -247,7 +246,7 @@
"Not such parameter '%s' for action '%s'", param.id(), actionModel)));
try {
newActionBuilder.withParameter(new PiActionParam(param.id(),
- fit(param.value(), paramModel.bitWidth())));
+ param.value().fit(paramModel.bitWidth())));
} catch (ByteSequenceTrimException e) {
throw new PiTranslationException(format(
"Size mismatch for parameter '%s' of action '%s': %s",
@@ -413,11 +412,11 @@
switch (fieldModel.matchType()) {
case EXACT:
return new PiExactFieldMatch(fieldMatch.fieldId(),
- fit(((PiExactFieldMatch) fieldMatch).value(), modelBitWidth));
+ ((PiExactFieldMatch) fieldMatch).value().fit(modelBitWidth));
case TERNARY:
return new PiTernaryFieldMatch(fieldMatch.fieldId(),
- fit(((PiTernaryFieldMatch) fieldMatch).value(), modelBitWidth),
- fit(((PiTernaryFieldMatch) fieldMatch).mask(), modelBitWidth));
+ ((PiTernaryFieldMatch) fieldMatch).value().fit(modelBitWidth),
+ ((PiTernaryFieldMatch) fieldMatch).mask().fit(modelBitWidth));
case LPM:
PiLpmFieldMatch lpmfield = (PiLpmFieldMatch) fieldMatch;
if (lpmfield.prefixLength() > modelBitWidth) {
@@ -426,12 +425,12 @@
fieldMatch.fieldId(), lpmfield.prefixLength(), modelBitWidth));
}
return new PiLpmFieldMatch(fieldMatch.fieldId(),
- fit(lpmfield.value(), modelBitWidth),
+ lpmfield.value().fit(modelBitWidth),
lpmfield.prefixLength());
case RANGE:
return new PiRangeFieldMatch(fieldMatch.fieldId(),
- fit(((PiRangeFieldMatch) fieldMatch).lowValue(), modelBitWidth),
- fit(((PiRangeFieldMatch) fieldMatch).highValue(), modelBitWidth));
+ ((PiRangeFieldMatch) fieldMatch).lowValue().fit(modelBitWidth),
+ ((PiRangeFieldMatch) fieldMatch).highValue().fit(modelBitWidth));
case VALID:
return fieldMatch;
default: