/*
* Copyright (c) 2016 Cisco and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openvpp.jvpp.test;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
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.InputAclSetInterface;
import org.openvpp.jvpp.dto.InputAclSetInterfaceReply;
import org.openvpp.jvpp.dto.JVppReply;
import org.openvpp.jvpp.future.FutureJVppFacade;
import org.openvpp.jvpp.future.FutureJVppFacadeCallback;
/**
*
Tests L2 ACL creation.
* Equivalent to the following vppctl commands:
*
*
{@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
* }
*
*
* To verify invoke:
* {@code vppctl sh class table verbose}
*/
public class L2AclTest {
private static ClassifyAddDelTable createClassifyTable() {
ClassifyAddDelTable request = new ClassifyAddDelTable();
request.isAdd = 1;
request.tableIndex = ~0; // default
request.nbuckets = 2;
request.memorySize = 2 << 20;
request.nextTableIndex = ~0; // default
request.missNextIndex = ~0; // default
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};
return request;
}
private static ClassifyAddDelSession createClassifySession(final int tableIndex) {
ClassifyAddDelSession request = new ClassifyAddDelSession();
request.isAdd = 1;
request.tableIndex = tableIndex;
request.hitNextIndex = 0; // deny
request.opaqueIndex = 0;
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};
return request;
}
private static InputAclSetInterface aclSetInterface() {
InputAclSetInterface request = new InputAclSetInterface();
request.isAdd = 1;
request.swIfIndex = 0;
request.ip4TableIndex = ~0; // skip
request.ip6TableIndex = ~0; // skip
request.l2TableIndex = 0;
return request;
}
private static void print(ClassifyAddDelTableReply reply) {
System.out.printf("ClassifyAddDelTableReply: context=%d, retval=%d, " +
"newTableIndex=%d, skipNVectors=%d, matchNVectors=%d\n",
reply.context,
reply.retval,
reply.newTableIndex,
reply.skipNVectors,
reply.matchNVectors);
}
private static void print(ClassifyAddDelSessionReply reply) {
System.out.printf("ClassifyAddDelSessionReply: context=%d, retval=%d\n",
reply.context,
reply.retval);
}
private static void print(final InputAclSetInterfaceReply reply) {
System.out.printf("InputAclSetInterfaceReply: context=%d, retval=%d\n",
reply.context,
reply.retval);
}
private static void testL2Acl() throws Exception {
System.out.println("Testing L2 ACLs using Java callback API");
final Map>> map = new HashMap<>();
final JVppImpl jvpp = new JVppImpl(VppJNIConnection.create("FutureApiTest", new FutureJVppFacadeCallback(map)));
final FutureJVppFacade jvppFacade = new FutureJVppFacade(jvpp, map);
System.out.println("Successfully connected to VPP");
Thread.sleep(1000);
final ClassifyAddDelTableReply classifyAddDelTableReply =
jvppFacade.classifyAddDelTable(createClassifyTable()).toCompletableFuture().get();
print(classifyAddDelTableReply);
final ClassifyAddDelSessionReply classifyAddDelSessionReply =
jvppFacade.classifyAddDelSession(createClassifySession(classifyAddDelTableReply.newTableIndex))
.toCompletableFuture().get();
print(classifyAddDelSessionReply);
final InputAclSetInterfaceReply inputAclSetInterfaceReply =
jvppFacade.inputAclSetInterface(aclSetInterface()).toCompletableFuture().get();
print(inputAclSetInterfaceReply);
System.out.println("Disconnecting...");
jvpp.close();
Thread.sleep(1000);
}
public static void main(String[] args) throws Exception {
testL2Acl();
}
}