summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vpp-classifier/impl/src/main/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriter.java23
-rw-r--r--vpp-classifier/impl/src/test/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriterTest.java31
2 files changed, 24 insertions, 30 deletions
diff --git a/vpp-classifier/impl/src/main/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriter.java b/vpp-classifier/impl/src/main/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriter.java
index 7a62e4a74..5674547d7 100644
--- a/vpp-classifier/impl/src/main/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriter.java
+++ b/vpp-classifier/impl/src/main/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriter.java
@@ -16,7 +16,6 @@
package io.fd.hc2vpp.vpp.classifier.write;
-import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.base.Optional;
@@ -115,7 +114,8 @@ public class ClassifySessionWriter extends VppNodeWriter
final int tableIndex = classifyTableContext.getTableIndex(tableName, writeContext.getMappingContext());
final ClassifyTable classifyTable = getClassifyTable(writeContext, id, isAdd);
- final ClassifyAddDelSession request = getClassifyAddDelSessionRequest(isAdd, classifySession, tableIndex);
+ final ClassifyAddDelSession request =
+ getClassifyAddDelSessionRequest(isAdd, classifySession, classifyTable, tableIndex);
// TODO(HC2VPP-9): registry of next_node translators would allow to weaken dependency between policer
// and vpp-classifier models
@@ -127,14 +127,6 @@ public class ClassifySessionWriter extends VppNodeWriter
}
final CompletionStage<ClassifyAddDelSessionReply> createClassifyTableReplyCompletionStage = getFutureJVpp()
.classifyAddDelSession(request);
-
- // VPP requires to prepend classify session with skip_n_vectors*16 bytes:
- final long expectedMatchLen =
- 16 * classifyTable.getSkipNVectors() + getBinaryVector(classifyTable.getMask()).length;
- final long actualMatchLen = Integer.toUnsignedLong(request.matchLen);
- checkArgument(actualMatchLen == expectedMatchLen,
- "Match length should be equal to table.skipNVectors*16 + table.mask length ("
- + expectedMatchLen + ") but was: " + actualMatchLen);
getReplyForWrite(createClassifyTableReplyCompletionStage.toCompletableFuture(), id);
}
@@ -168,6 +160,7 @@ public class ClassifySessionWriter extends VppNodeWriter
private ClassifyAddDelSession getClassifyAddDelSessionRequest(final boolean isAdd,
@Nonnull final ClassifySession classifySession,
+ final ClassifyTable classifyTable,
final int tableIndex) {
ClassifyAddDelSession request = new ClassifyAddDelSession();
request.isAdd = booleanToByte(isAdd);
@@ -176,8 +169,14 @@ public class ClassifySessionWriter extends VppNodeWriter
// default 0:
request.advance = classifySession.getAdvance();
- request.match = getBinaryVector(classifySession.getMatch());
- request.matchLen = request.match.length;
+ // VPP requires match vector of size mask + skip_n_vectors*16 bytes,
+ // so align it with zeros:
+ final int matchLength =
+ (int) (16 * classifyTable.getSkipNVectors() + getBinaryVector(classifyTable.getMask()).length);
+ request.match = new byte[matchLength];
+ final byte[] actualMatch = getBinaryVector(classifySession.getMatch());
+ System.arraycopy(actualMatch, 0, request.match, 0, actualMatch.length);
+ request.matchLen = matchLength;
return request;
}
diff --git a/vpp-classifier/impl/src/test/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriterTest.java b/vpp-classifier/impl/src/test/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriterTest.java
index 68d20a728..c33a21ece 100644
--- a/vpp-classifier/impl/src/test/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriterTest.java
+++ b/vpp-classifier/impl/src/test/java/io/fd/hc2vpp/vpp/classifier/write/ClassifySessionWriterTest.java
@@ -78,15 +78,20 @@ public class ClassifySessionWriterTest extends WriterCustomizerTest {
private static ClassifyAddDelSession generateClassifyAddDelSession(final byte isAdd, final int tableIndex,
final int sessionIndex) {
+ return generateClassifyAddDelSession(isAdd, tableIndex, sessionIndex,
+ new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04,
+ (byte) 0x05, (byte) 0x06, 0x00, 0x00, 0x00, 0x00});
+ }
+
+ private static ClassifyAddDelSession generateClassifyAddDelSession(final byte isAdd, final int tableIndex,
+ final int sessionIndex, final byte[] match) {
final ClassifyAddDelSession request = new ClassifyAddDelSession();
request.isAdd = isAdd;
request.tableIndex = tableIndex;
request.opaqueIndex = sessionIndex;
request.hitNextIndex = 0;
request.advance = 123;
- request.match =
- new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04,
- (byte) 0x05, (byte) 0x06, 0x00, 0x00, 0x00, 0x00};
+ request.match = match;
request.matchLen = request.match.length;
return request;
}
@@ -193,19 +198,6 @@ public class ClassifySessionWriterTest extends WriterCustomizerTest {
customizer.writeCurrentAttributes(id, classifySession, writeContext);
}
- @Test(expected = IllegalArgumentException.class)
- public void testCreateInvalidMatchLength() throws WriteFailedException {
- final ClassifyTable table = mock(ClassifyTable.class);
- when(table.getMask()).thenReturn(new HexString("00:00:00:00:00:00:ff:FF:ff:ff:ff:FF:00:00:00:00"));
- when(table.getSkipNVectors()).thenReturn(1L);
- when(writeContext.readAfter(ArgumentMatchers.any())).thenReturn(Optional.of(table));
-
- final String match = "00:00:00:00:00:00:01:02:03:04:05:06:00:00:00:00";
- final ClassifySession classifySession = generateClassifySession(SESSION_INDEX, match);
- final InstanceIdentifier<ClassifySession> id = getClassifySessionId(TABLE_NAME, match);
- customizer.writeCurrentAttributes(id, classifySession, writeContext);
- }
-
@Test
public void testCreateSkipOneVector() throws WriteFailedException {
final ClassifyTable table = mock(ClassifyTable.class);
@@ -214,10 +206,13 @@ public class ClassifySessionWriterTest extends WriterCustomizerTest {
when(writeContext.readAfter(ArgumentMatchers.any())).thenReturn(Optional.of(table));
whenClassifyAddDelSessionThenSuccess();
- final String match =
- "00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01:02:03:04:05:06:00:00:00:00";
+ final String match = "01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10";
final ClassifySession classifySession = generateClassifySession(SESSION_INDEX, match);
final InstanceIdentifier<ClassifySession> id = getClassifySessionId(TABLE_NAME, match);
customizer.writeCurrentAttributes(id, classifySession, writeContext);
+ verify(api).classifyAddDelSession(generateClassifyAddDelSession((byte) 1, TABLE_INDEX, SESSION_INDEX,
+ new byte[] {
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}));
}
} \ No newline at end of file