aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Gradzki <mgradzki@cisco.com>2016-06-27 10:45:09 +0200
committerMarek Gradzki <mgradzki@cisco.com>2016-06-27 17:11:41 +0200
commit310dca43a3d0c1a541d91f54a8034401c702c8e5 (patch)
tree2e75b522dddbb110915961bbb5bc0eebdc2724aa
parentea3e1fc8754d7ebeca85ecc448b263f6ccb6ae6f (diff)
Add support for classify table/session read to jvpp:
* provides length information for variable length arrays in classify table/sessione reply messages * provides jvpp example for reading classify tables/sessions Change-Id: I47f8fca5c849ec874d4e23f28177e310689db522 Signed-off-by: Marek Gradzki <mgradzki@cisco.com>
-rw-r--r--vpp-api/java/jvpp/org/openvpp/jvpp/test/L2AclTest.java130
-rw-r--r--vpp/vpp-api/vpe.api6
2 files changed, 110 insertions, 26 deletions
diff --git a/vpp-api/java/jvpp/org/openvpp/jvpp/test/L2AclTest.java b/vpp-api/java/jvpp/org/openvpp/jvpp/test/L2AclTest.java
index d8d04eddfad..802df631162 100644
--- a/vpp-api/java/jvpp/org/openvpp/jvpp/test/L2AclTest.java
+++ b/vpp-api/java/jvpp/org/openvpp/jvpp/test/L2AclTest.java
@@ -16,32 +16,42 @@
package org.openvpp.jvpp.test;
+import java.util.Arrays;
+import javax.xml.bind.DatatypeConverter;
import org.openvpp.jvpp.JVppImpl;
import org.openvpp.jvpp.VppJNIConnection;
import org.openvpp.jvpp.dto.ClassifyAddDelSession;
import org.openvpp.jvpp.dto.ClassifyAddDelSessionReply;
import org.openvpp.jvpp.dto.ClassifyAddDelTable;
import org.openvpp.jvpp.dto.ClassifyAddDelTableReply;
+import org.openvpp.jvpp.dto.ClassifySessionDetails;
+import org.openvpp.jvpp.dto.ClassifySessionDetailsReplyDump;
+import org.openvpp.jvpp.dto.ClassifySessionDump;
+import org.openvpp.jvpp.dto.ClassifyTableByInterface;
+import org.openvpp.jvpp.dto.ClassifyTableByInterfaceReply;
+import org.openvpp.jvpp.dto.ClassifyTableIds;
+import org.openvpp.jvpp.dto.ClassifyTableIdsReply;
+import org.openvpp.jvpp.dto.ClassifyTableInfo;
+import org.openvpp.jvpp.dto.ClassifyTableInfoReply;
import org.openvpp.jvpp.dto.InputAclSetInterface;
import org.openvpp.jvpp.dto.InputAclSetInterfaceReply;
import org.openvpp.jvpp.future.FutureJVppFacade;
/**
- * <p>Tests L2 ACL creation.<br>
- * Equivalent to the following vppctl commands:<br>
+ * <p>Tests L2 ACL creation and read.<br> Equivalent to the following vppctl commands:<br>
*
* <pre>{@code
* vppctl classify table mask l2 src
* vppctl classify session acl-hit-next deny opaque-index 0 table-index 0 match l2 src 01:02:03:04:05:06
- * vppctl vppctl set int input acl intfc local0 l2-table 0
+ * vppctl set int input acl intfc local0 l2-table 0
+ * vppctl sh class table verbose
* }
* </pre>
- *
- * To verify invoke:<br>
- * {@code vppctl sh class table verbose}
*/
public class L2AclTest {
+ private static final int LOCAL0_IFACE_ID = 0;
+
private static ClassifyAddDelTable createClassifyTable() {
ClassifyAddDelTable request = new ClassifyAddDelTable();
request.isAdd = 1;
@@ -53,8 +63,14 @@ public class L2AclTest {
request.skipNVectors = 0;
request.matchNVectors = 1;
request.mask =
- new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
- (byte) 0xff, (byte) 0xff, 0x00, 0x00, 0x00, 0x00};
+ new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+ (byte) 0xff, (byte) 0xff, 0x00, 0x00, 0x00, 0x00};
+ return request;
+ }
+
+ private static ClassifyTableInfo createClassifyTableInfoRequest(final int tableId) {
+ ClassifyTableInfo request = new ClassifyTableInfo();
+ request.tableId = tableId;
return request;
}
@@ -67,39 +83,89 @@ public class L2AclTest {
request.advance = 0; // default
// match 01:02:03:04:05:06 mac address
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};
+ new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04,
+ (byte) 0x05, (byte) 0x06, 0x00, 0x00, 0x00, 0x00};
+ return request;
+ }
+
+ private static ClassifySessionDump createClassifySessionDumpRequest(final int newTableIndex) {
+ ClassifySessionDump request = new ClassifySessionDump();
+ request.tableId = newTableIndex;
return request;
}
private static InputAclSetInterface aclSetInterface() {
InputAclSetInterface request = new InputAclSetInterface();
request.isAdd = 1;
- request.swIfIndex = 0;
+ request.swIfIndex = LOCAL0_IFACE_ID;
request.ip4TableIndex = ~0; // skip
request.ip6TableIndex = ~0; // skip
request.l2TableIndex = 0;
return request;
}
+ private static ClassifyTableByInterface createClassifyTableByInterfaceRequest() {
+ ClassifyTableByInterface request = new ClassifyTableByInterface();
+ request.swIfIndex = LOCAL0_IFACE_ID;
+ return request;
+ }
+
private static void print(ClassifyAddDelTableReply reply) {
System.out.printf("ClassifyAddDelTableReply: context=%d, " +
- "newTableIndex=%d, skipNVectors=%d, matchNVectors=%d\n",
- reply.context,
- reply.newTableIndex,
- reply.skipNVectors,
- reply.matchNVectors);
+ "newTableIndex=%d, skipNVectors=%d, matchNVectors=%d\n",
+ reply.context, reply.newTableIndex, reply.skipNVectors, reply.matchNVectors);
+ }
+
+ private static void print(ClassifyTableIdsReply reply) {
+ System.out.printf("ClassifyTableIdsReply: context=%d, count=%d, ids.length=%d\n",
+ reply.context, reply.count, reply.ids.length);
+ Arrays.stream(reply.ids).forEach(System.out::println);
+ }
+
+ private static void print(final ClassifyTableInfoReply reply) {
+ final StringBuilder builder = new StringBuilder("ClassifyTableInfoReply:\n");
+ builder.append("context: ").append(reply.context).append('\n');
+ builder.append("tableId: ").append(reply.tableId).append('\n');
+ builder.append("nbuckets: ").append(reply.nbuckets).append('\n');
+ builder.append("matchNVectors: ").append(reply.matchNVectors).append('\n');
+ builder.append("skipNVectors: ").append(reply.skipNVectors).append('\n');
+ builder.append("activeSessions: ").append(reply.activeSessions).append('\n');
+ builder.append("nextTableIndex: ").append(reply.nextTableIndex).append('\n');
+ builder.append("missNextIndex: ").append(reply.missNextIndex).append('\n');
+ builder.append("maskLength: ").append(reply.maskLength).append('\n');
+ builder.append("mask: ").append(DatatypeConverter.printHexBinary(reply.mask)).append('\n');
+ System.out.println(builder.toString());
}
private static void print(ClassifyAddDelSessionReply reply) {
System.out.printf("ClassifyAddDelSessionReply: context=%d\n",
- reply.context);
+ reply.context);
+ }
+
+ private static void print(final ClassifySessionDetailsReplyDump reply) {
+ if (reply.classifySessionDetails == null) {
+ System.out.println("ClassifySessionDetailsReplyDump: classifySessionDetails == NULL");
+ }
+ for (final ClassifySessionDetails details : reply.classifySessionDetails) {
+ final StringBuilder builder = new StringBuilder("ClassifySessionDetails:\n");
+ builder.append("context: ").append(details.context).append('\n');
+ builder.append("tableId: ").append(details.tableId).append('\n');
+ builder.append("hitNextIndex: ").append(details.hitNextIndex).append('\n');
+ builder.append("advance: ").append(details.advance).append('\n');
+ builder.append("opaqueIndex: ").append(details.opaqueIndex).append('\n');
+ builder.append("matchLength: ").append(details.matchLength).append('\n');
+ builder.append("match: ").append(DatatypeConverter.printHexBinary(details.match)).append('\n');
+ System.out.println(builder.toString());
+ }
}
private static void print(final InputAclSetInterfaceReply reply) {
- System.out.printf("InputAclSetInterfaceReply: context=%d\n",
- reply.context);
+ System.out.printf("InputAclSetInterfaceReply: context=%d\n", reply.context);
+ }
+ private static void print(final ClassifyTableByInterfaceReply reply) {
+ System.out.printf("ClassifyAddDelTableReply: context=%d, swIfIndex=%d, l2TableId=%d, ip4TableId=%d," +
+ "ip6TableId=%d\n", reply.context, reply.swIfIndex, reply.l2TableId, reply.ip4TableId, reply.ip6TableId);
}
private static void testL2Acl() throws Exception {
@@ -111,18 +177,36 @@ public class L2AclTest {
Thread.sleep(1000);
final ClassifyAddDelTableReply classifyAddDelTableReply =
- jvppFacade.classifyAddDelTable(createClassifyTable()).toCompletableFuture().get();
+ jvppFacade.classifyAddDelTable(createClassifyTable()).toCompletableFuture().get();
print(classifyAddDelTableReply);
+ final ClassifyTableIdsReply classifyTableIdsReply =
+ jvppFacade.classifyTableIds(new ClassifyTableIds()).toCompletableFuture().get();
+ print(classifyTableIdsReply);
+
+ final ClassifyTableInfoReply classifyTableInfoReply =
+ jvppFacade.classifyTableInfo(createClassifyTableInfoRequest(classifyAddDelTableReply.newTableIndex))
+ .toCompletableFuture().get();
+ print(classifyTableInfoReply);
+
final ClassifyAddDelSessionReply classifyAddDelSessionReply =
- jvppFacade.classifyAddDelSession(createClassifySession(classifyAddDelTableReply.newTableIndex))
- .toCompletableFuture().get();
+ jvppFacade.classifyAddDelSession(createClassifySession(classifyAddDelTableReply.newTableIndex))
+ .toCompletableFuture().get();
print(classifyAddDelSessionReply);
+ final ClassifySessionDetailsReplyDump classifySessionDetailsReplyDump =
+ jvppFacade.classifySessionDump(createClassifySessionDumpRequest(classifyAddDelTableReply.newTableIndex))
+ .toCompletableFuture().get();
+ print(classifySessionDetailsReplyDump);
+
final InputAclSetInterfaceReply inputAclSetInterfaceReply =
- jvppFacade.inputAclSetInterface(aclSetInterface()).toCompletableFuture().get();
+ jvppFacade.inputAclSetInterface(aclSetInterface()).toCompletableFuture().get();
print(inputAclSetInterfaceReply);
+ final ClassifyTableByInterfaceReply classifyTableByInterfaceReply =
+ jvppFacade.classifyTableByInterface(createClassifyTableByInterfaceRequest()).toCompletableFuture().get();
+ print(classifyTableByInterfaceReply);
+
System.out.println("Disconnecting...");
jvpp.close();
Thread.sleep(1000);
diff --git a/vpp/vpp-api/vpe.api b/vpp/vpp-api/vpe.api
index a1ea1b2fe0b..0184a3e16bd 100644
--- a/vpp/vpp-api/vpe.api
+++ b/vpp/vpp-api/vpe.api
@@ -3854,7 +3854,7 @@ manual_java define classify_table_ids_reply {
u32 context;
u32 retval;
u32 count;
- u32 ids[0];
+ u32 ids[count];
};
/** \brief Classify table ids by interface index request
@@ -3919,7 +3919,7 @@ manual_java define classify_table_info_reply {
u32 next_table_index;
u32 miss_next_index;
u32 mask_length;
- u8 mask[0];
+ u8 mask[mask_length];
};
/** \brief Classify sessions dump request
@@ -3950,5 +3950,5 @@ manual_java define classify_session_details {
i32 advance;
u32 opaque_index;
u32 match_length;
- u8 match[0];
+ u8 match[match_length];
};