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>
This commit is contained in:
Marek Gradzki
2016-06-27 10:45:09 +02:00
parent ea3e1fc875
commit 310dca43a3
2 changed files with 110 additions and 26 deletions

View File

@ -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;
@ -58,6 +68,12 @@ public class L2AclTest {
return request;
}
private static ClassifyTableInfo createClassifyTableInfoRequest(final int tableId) {
ClassifyTableInfo request = new ClassifyTableInfo();
request.tableId = tableId;
return request;
}
private static ClassifyAddDelSession createClassifySession(final int tableIndex) {
ClassifyAddDelSession request = new ClassifyAddDelSession();
request.isAdd = 1;
@ -72,23 +88,53 @@ public class L2AclTest {
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);
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) {
@ -96,10 +142,30 @@ public class L2AclTest {
reply.context);
}
private static void print(final InputAclSetInterfaceReply reply) {
System.out.printf("InputAclSetInterfaceReply: context=%d\n",
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);
}
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 {
@ -114,15 +180,33 @@ public class L2AclTest {
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();
print(classifyAddDelSessionReply);
final ClassifySessionDetailsReplyDump classifySessionDetailsReplyDump =
jvppFacade.classifySessionDump(createClassifySessionDumpRequest(classifyAddDelTableReply.newTableIndex))
.toCompletableFuture().get();
print(classifySessionDetailsReplyDump);
final InputAclSetInterfaceReply inputAclSetInterfaceReply =
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);

View File

@ -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];
};