jvpp-benchmark: add option to select interface mode 42/12742/2
authorMarek Gradzki <[email protected]>
Fri, 25 May 2018 06:21:20 +0000 (08:21 +0200)
committerMarek Gradzki <[email protected]>
Sat, 26 May 2018 06:03:12 +0000 (06:03 +0000)
Changes:
- use loopback interface instead of local0,
- if L3 (default) mode is selected, assing IP to the loop0 interface,
- if L2 mode is selected, create bridge domain and assing loop0 the BD.

To test interface in L2 mode, use:

sudo java -jar ./target/jvpp-benchmark-exec.jar -p mode=L2

Change-Id: I8450d42fe0d164c6dbedf1dacf1444a25d9932b8
Signed-off-by: Marek Gradzki <[email protected]>
(cherry picked from commit 6e5446c9d64df7f2cbde857d276e8685c9175089)

it/jvpp-benchmark/asciidoc/Readme.adoc
it/jvpp-benchmark/pom.xml
it/jvpp-benchmark/src/main/java/io/fd/hc2vpp/it/jvpp/benchmark/AclProviderImpl.java
it/jvpp-benchmark/src/main/java/io/fd/hc2vpp/it/jvpp/benchmark/AclUpdateBenchmark.java

index 604abf9..8c787d4 100644 (file)
@@ -5,7 +5,7 @@ Provides JMH based benchmarks JVpp (Java API for VPP).
 == AclUpdateBenchmark
 
 Creates ACL of size aclSize using acl_add_replace,
-then assigns it to local0 using acl_interface_set_acl_list.
+then assigns it to loopback interface using acl_interface_set_acl_list.
 
 Then ACL is updated synchronously using acl_add_replace.
 By default 20x2s warmup and 100x2s measurment iterations
@@ -42,6 +42,12 @@ To specify aclSetSize (default=100), use:
 sudo java -jar ./target/jvpp-benchmark-exec.jar -p aclSetSize=1000
 ---
 
+To test interface in bridged (L2) / routed (L3) mode (default=L3), use:
+[source,shell]
+---
+sudo java -jar ./target/jvpp-benchmark-exec.jar -p mode=L2
+---
+
 To see more options, use
 [source,shell]
 ---
index 84cf730..bccf54f 100644 (file)
             <artifactId>jvpp-registry</artifactId>
             <version>${jvpp.version}</version>
         </dependency>
+        <dependency>
+            <groupId>io.fd.vpp</groupId>
+            <artifactId>jvpp-core</artifactId>
+            <version>${jvpp.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.fd.vpp</groupId>
             <artifactId>jvpp-acl</artifactId>
index fea9055..98894fe 100644 (file)
@@ -88,7 +88,7 @@ class AclProviderImpl implements AclProvider {
     }
 
     private static final class IpProvider {
-        private long ip = 0x01000000; // 1.0.0.0
+        private long ip = 0x01000001; // 1.0.0.1
 
         private static byte[] getIp(final int i) {
             int b1 = (i >> 24) & 0xff;
index ef314b8..3ec7be9 100644 (file)
 
 package io.fd.hc2vpp.it.jvpp.benchmark;
 
+import static io.fd.hc2vpp.it.jvpp.benchmark.AclUpdateBenchmark.InterfaceMode.L2;
+import static io.fd.hc2vpp.it.jvpp.benchmark.AclUpdateBenchmark.InterfaceMode.L3;
+
 import com.google.common.io.CharStreams;
 import io.fd.vpp.jvpp.JVppRegistryImpl;
 import io.fd.vpp.jvpp.acl.JVppAclImpl;
 import io.fd.vpp.jvpp.acl.dto.AclInterfaceSetAclList;
 import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
+import io.fd.vpp.jvpp.core.JVppCoreImpl;
+import io.fd.vpp.jvpp.core.dto.BridgeDomainAddDel;
+import io.fd.vpp.jvpp.core.dto.CreateLoopback;
+import io.fd.vpp.jvpp.core.dto.CreateLoopbackReply;
+import io.fd.vpp.jvpp.core.dto.SwInterfaceAddDelAddress;
+import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlags;
+import io.fd.vpp.jvpp.core.dto.SwInterfaceSetL2Bridge;
+import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
+import io.fd.vpp.jvpp.dto.JVppReply;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
+import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import org.openjdk.jmh.annotations.Benchmark;
@@ -63,13 +76,17 @@ public class AclUpdateBenchmark {
     @Param( {"100"})
     private int aclSetSize;
 
+    @Param( {"L3"})
+    private InterfaceMode mode;
+
     private AclProvider aclProvider;
     private JVppRegistryImpl registry;
-    private FutureJVppAclFacade jvpp;
+    private FutureJVppAclFacade jvppAcl;
+    private FutureJVppCoreFacade jvppCore;
 
     @Benchmark
     public void testMethod() throws Exception {
-        jvpp.aclAddReplace(aclProvider.next()).toCompletableFuture().get();
+        jvppAcl.aclAddReplace(aclProvider.next()).toCompletableFuture().get();
     }
 
     @Setup(Level.Iteration)
@@ -122,34 +139,77 @@ public class AclUpdateBenchmark {
     private void connect() throws IOException {
         LOG.info("Connecting to JVPP ...");
         registry = new JVppRegistryImpl("ACLUpdateBenchmark");
-        jvpp = new FutureJVppAclFacade(registry, new JVppAclImpl());
+        jvppCore = new FutureJVppCoreFacade(registry, new JVppCoreImpl());
+        jvppAcl = new FutureJVppAclFacade(registry, new JVppAclImpl());
         LOG.info("Successfully connected to JVPP");
     }
 
     private void disconnect() throws Exception {
         LOG.info("Disconnecting ...");
-        jvpp.close();
+        jvppAcl.close();
+        jvppCore.close();
         registry.close();
         LOG.info("Successfully disconnected ...");
     }
 
     /**
-     * Creates ACL and assigns it to local0 interface.
+     * Initializes loopback interface, creates ACL and assigns it to loop0.
      */
     private void initAcl()
         throws ExecutionException, InterruptedException {
+        // Create loopback interface
+        final CreateLoopbackReply loop0 = invoke(jvppCore.createLoopback(new CreateLoopback()));
+
+        // Enable loop0
+        final SwInterfaceSetFlags flags = new SwInterfaceSetFlags();
+        flags.adminUpDown = 1;
+        flags.swIfIndex = loop0.swIfIndex;
+        invoke(jvppCore.swInterfaceSetFlags(flags));
+
+        if (L3.equals(mode)) {
+            // Assign IP to loop0
+            final SwInterfaceAddDelAddress address = new SwInterfaceAddDelAddress();
+            address.address = new byte[]{1,0,0,0};
+            address.addressLength = 8;
+            address.isAdd = 1;
+            address.swIfIndex = loop0.swIfIndex;
+            invoke(jvppCore.swInterfaceAddDelAddress(address));
+        } else if (L2.equals(mode)) {
+            // Create bridge domain 1
+            final BridgeDomainAddDel bd = new BridgeDomainAddDel();
+            bd.bdId = 1;
+            bd.isAdd = 1;
+            invoke(jvppCore.bridgeDomainAddDel(bd));
+
+            // Assign loop0 to BD1:
+            final SwInterfaceSetL2Bridge loop0Bridge = new SwInterfaceSetL2Bridge();
+            loop0Bridge.bdId = bd.bdId;
+            loop0Bridge.rxSwIfIndex = loop0.swIfIndex;
+            loop0Bridge.enable = 1; // set L2 mode
+            invoke(jvppCore.swInterfaceSetL2Bridge(loop0Bridge));
+        }
+
         // Create ACL
-        final int aclId = jvpp.aclAddReplace(aclProvider.next()).toCompletableFuture().get().aclIndex;
+        final int aclId = invoke(jvppAcl.aclAddReplace(aclProvider.next())).aclIndex;
 
-        // Assign the ACL to local0 interface
+        // Assign the ACL to loop0 interface
         final AclInterfaceSetAclList aclList = new AclInterfaceSetAclList();
-        aclList.swIfIndex = 0;
+        aclList.swIfIndex = loop0.swIfIndex;
         aclList.count = 1;
         aclList.nInput = 1;
         aclList.acls = new int[] {aclId};
-        jvpp.aclInterfaceSetAclList(aclList).toCompletableFuture().get();
+        invoke(jvppAcl.aclInterfaceSetAclList(aclList));
 
         // Use ACL index in subsequent executions of aclProvider.next() method
         aclProvider.setAclIndex(aclId);
     }
+
+    public enum InterfaceMode {
+        L2, L3
+    }
+
+    private static <R extends JVppReply<?>> R invoke(final CompletionStage<R> completionStage)
+        throws ExecutionException, InterruptedException {
+        return completionStage.toCompletableFuture().get();
+    }
 }