[ONOS-7236] Supports simple IPv4 routing on fabric.p4
Change-Id: Ie92b26361b1d646491bd382f698c0f8f61a058a1
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 d403ec1..4bbb123 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
@@ -127,6 +127,7 @@
break;
case LPM:
mask = getMaskFromPrefixLength(prefixLength, value.size());
+ break;
default:
throw new RuntimeException("Unrecognized init type " + initType.name());
}
@@ -163,8 +164,7 @@
* @return a byte sequence
*/
private ImmutableByteSequence getMaskFromPrefixLength(int prefixLength, int maskSize) {
- // TODO: implement.
- throw new RuntimeException("getMaskFromPrefixLength() not implemented yet.");
+ return ImmutableByteSequence.prefixOnes(maskSize, prefixLength);
}
/**
@@ -175,7 +175,32 @@
* @return optional prefix length
*/
private Optional<Integer> getPrefixLengthFromMask(ImmutableByteSequence mask) {
- // TODO: implement.
- throw new RuntimeException("getPrefixLengthFromMask() not implemented yet.");
+ Integer prefixLength = 0;
+
+ byte[] byteArray = mask.asArray();
+ int byteArrayIndex = 0;
+ while (byteArrayIndex < byteArray.length && byteArray[byteArrayIndex] == (byte) 0xff) {
+ prefixLength += Byte.SIZE;
+ byteArrayIndex++;
+ }
+
+ byte byteVal = byteArray[byteArrayIndex];
+ while (byteVal != 0) {
+ if ((byteVal & Integer.MIN_VALUE) != Integer.MIN_VALUE) {
+ return Optional.empty();
+ }
+ prefixLength++;
+ byteVal <<= 1;
+ }
+
+ byteArrayIndex++;
+ while (byteArrayIndex < byteArray.length) {
+ if (byteArray[byteArrayIndex] != 0) {
+ return Optional.empty();
+ }
+ byteArrayIndex++;
+ }
+
+ return Optional.of(prefixLength);
}
}