aboutsummaryrefslogtreecommitdiffstats
path: root/vpp-api
diff options
context:
space:
mode:
Diffstat (limited to 'vpp-api')
-rw-r--r--vpp-api/Makefile.am4
-rw-r--r--vpp-api/configure.ac12
-rw-r--r--vpp-api/java/Makefile.am116
-rw-r--r--vpp-api/java/Readme.txt236
-rw-r--r--vpp-api/java/configure.ac24
-rw-r--r--vpp-api/java/jvpp-common/jvpp_common.c65
-rw-r--r--vpp-api/java/jvpp-common/jvpp_common.h67
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackApiTest.java96
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeNotificationTest.java87
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeTest.java103
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackNotificationApiTest.java94
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/ControlPingTest.java68
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CreateSubInterfaceTest.java120
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiNotificationTest.java55
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiTest.java123
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/L2AclTest.java195
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/LispAdjacencyTest.java124
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/NotificationUtils.java53
-rw-r--r--vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/Readme.txt17
-rw-r--r--vpp-api/java/jvpp-core/jvpp_core.c117
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVpp.java56
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistry.java76
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistryImpl.java147
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/NativeLibraryLoader.java73
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java60
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java47
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppConnection.java45
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppInvocationException.java33
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppJNIConnection.java137
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/ControlPingCallback.java29
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppCallback.java29
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppNotificationCallback.java24
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPing.java34
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPingReply.java58
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppDump.java24
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppNotification.java23
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReply.java24
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReplyDump.java25
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppRequest.java34
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/AbstractFutureJVppInvoker.java141
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/FutureJVppInvoker.java49
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistry.java25
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistryProvider.java28
-rw-r--r--vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/test/ConnectionTest.java44
-rw-r--r--vpp-api/java/jvpp-registry/jvpp_registry.c352
-rwxr-xr-xvpp-api/java/jvpp/gen/jvpp_gen.py171
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/__init__.py0
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/callback_gen.py105
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/dto_gen.py308
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/jni_gen.py295
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py343
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py324
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/jvpp_future_facade_gen.py331
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/jvpp_impl_gen.py219
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/notification_gen.py199
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/types_gen.py227
-rw-r--r--vpp-api/java/jvpp/gen/jvppgen/util.py220
-rw-r--r--vpp-api/java/m4/ax_check_java_home.m480
-rw-r--r--vpp-api/java/m4/ax_check_java_plugin.m4101
-rw-r--r--vpp-api/java/m4/ax_java_check_class.m485
-rw-r--r--vpp-api/java/m4/ax_java_options.m448
-rw-r--r--vpp-api/java/m4/ax_libgcj_jar.m483
-rw-r--r--vpp-api/java/m4/ax_prog_jar.m449
-rw-r--r--vpp-api/java/m4/ax_prog_java.m4115
-rw-r--r--vpp-api/java/m4/ax_prog_java_cc.m4104
-rw-r--r--vpp-api/java/m4/ax_prog_java_works.m4134
-rw-r--r--vpp-api/java/m4/ax_prog_javac.m479
-rw-r--r--vpp-api/java/m4/ax_prog_javac_works.m472
-rw-r--r--vpp-api/java/m4/ax_prog_javadoc.m450
-rw-r--r--vpp-api/java/m4/ax_prog_javah.m464
-rw-r--r--vpp-api/java/m4/ax_try_compile_java.m455
-rw-r--r--vpp-api/java/m4/ax_try_run_java.m456
-rw-r--r--vpp-api/lua/README.md50
-rw-r--r--vpp-api/lua/bench.lua70
-rw-r--r--vpp-api/lua/examples/cli/README.md5
-rw-r--r--vpp-api/lua/examples/cli/lua-cli.lua747
-rw-r--r--vpp-api/lua/examples/example-acl-plugin.lua110
-rw-r--r--vpp-api/lua/examples/example-classifier.lua51
-rw-r--r--vpp-api/lua/examples/example-cli.lua44
-rw-r--r--vpp-api/lua/examples/lute/README.md66
-rw-r--r--vpp-api/lua/examples/lute/lute.lua777
-rw-r--r--vpp-api/lua/examples/lute/script-inout-acl-noacl.lute329
-rw-r--r--vpp-api/lua/examples/lute/script-inout-acl-old.lute329
-rw-r--r--vpp-api/lua/examples/lute/script-inout-acl.lute329
-rw-r--r--vpp-api/lua/examples/lute/script.lute7
-rw-r--r--vpp-api/lua/examples/lute/sessions-acl.lute308
-rw-r--r--vpp-api/lua/vpp-lapi.lua989
87 files changed, 0 insertions, 11521 deletions
diff --git a/vpp-api/Makefile.am b/vpp-api/Makefile.am
deleted file mode 100644
index b50522ef..00000000
--- a/vpp-api/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-SUBDIRS = java
-
-# vi:syntax=automake
diff --git a/vpp-api/configure.ac b/vpp-api/configure.ac
deleted file mode 100644
index 278041c7..00000000
--- a/vpp-api/configure.ac
+++ /dev/null
@@ -1,12 +0,0 @@
-AC_INIT(vpp-api, 1.1.0)
-LT_INIT
-AC_CONFIG_MACRO_DIR([m4])
-AC_CONFIG_SUBDIRS([java])
-AM_INIT_AUTOMAKE
-AM_SILENT_RULES([yes])
-
-AC_PROG_CC
-
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
-
diff --git a/vpp-api/java/Makefile.am b/vpp-api/java/Makefile.am
deleted file mode 100644
index b0551965..00000000
--- a/vpp-api/java/Makefile.am
+++ /dev/null
@@ -1,116 +0,0 @@
-# Copyright (c) 2015 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.
-
-AUTOMAKE_OPTIONS = foreign subdir-objects
-ACLOCAL_AMFLAGS = -I m4
-AM_CFLAGS = -Wall
-
-noinst_PROGRAMS =
-BUILT_SOURCES =
-bin_PROGRAMS =
-CLEANFILES =
-lib_LTLIBRARIES =
-
-#
-# jvpp-common
-#
-
-nobase_include_HEADERS = \
- jvpp-common/jvpp_common.h
-
-lib_LTLIBRARIES += libjvpp_common.la
-
-libjvpp_common_la_SOURCES = jvpp-common/jvpp_common.c
-libjvpp_common_la_LIBADD = -lvlibmemoryclient -lvlibapi -lsvm -lvppinfra \
- -lpthread -lm -lrt
-libjvpp_common_la_LDFLAGS = -module
-libjvpp_common_la_CPPFLAGS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
-
-
-#
-# jvpp-registry (connection management + plugin registry)
-#
-lib_LTLIBRARIES += libjvpp_registry.la
-
-libjvpp_registry_la_SOURCES = jvpp-registry/jvpp_registry.c
-libjvpp_registry_la_LIBADD = -lvlibmemoryclient -lvlibapi -lsvm -lvppinfra \
- -lpthread -lm -lrt -ljvpp_common
-libjvpp_registry_la_LDFLAGS = -module
-libjvpp_registry_la_CPPFLAGS = -Ijvpp-registry -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
-EXTRA_libjvpp_registry_la_DEPENDENCIES=libjvpp_common.la
-
-jarfile_jvpp_registry = jvpp-registry-$(PACKAGE_VERSION).jar
-packagedir_jvpp_registry = io/fd/vpp/jvpp
-
-BUILT_SOURCES += jvpp-registry/io_fd_vpp_jvpp_VppJNIConnection.h
-
-jvpp_registry_src_files := $(wildcard @srcdir@/jvpp-registry/$(packagedir_jvpp_registry)/*.java) $(wildcard @srcdir@/jvpp-registry/$(packagedir_jvpp_registry)/**/*.java)
-
-jvpp-registry/io_fd_vpp_jvpp_VppJNIConnection.h: $(jvpp_registry_src_files)
- @echo " jvpp-registry.jar generation"
- mkdir -p jvpp-registry/target
- $(JAVAC) -d jvpp-registry/target $(jvpp_registry_src_files)
- $(JAVAH) -force -classpath jvpp-registry/target -d jvpp-registry io.fd.vpp.jvpp.VppJNIConnection
- $(JAVAH) -force -classpath jvpp-registry/target -d jvpp-registry io.fd.vpp.jvpp.JVppRegistryImpl
-
-$(jarfile_jvpp_registry): libjvpp_registry.la
- cp .libs/libjvpp_registry.so.0.0.0 jvpp-registry/target; \
- $(JAR) cf $(JARFLAGS) $@ -C jvpp-registry/target .;
-
-#
-# jvpp-core (Java wrapper for vpe.api)
-#
-lib_LTLIBRARIES += libjvpp_core.la
-
-libjvpp_core_la_SOURCES = jvpp-core/jvpp_core.c jvpp-core/jvpp_core_gen.h
-libjvpp_core_la_LIBADD = -lvlibmemoryclient -lvlibapi -lsvm -lvppinfra \
- -lpthread -lm -lrt -ljvpp_common
-libjvpp_core_la_LDFLAGS = -module
-libjvpp_core_la_CPPFLAGS = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
-
-jarfile_jvpp_core = jvpp-core-$(PACKAGE_VERSION).jar
-packagedir_jvpp_core = io/fd/vpp/jvpp/core
-
-BUILT_SOURCES += jvpp-core/io_fd_vpp_jvpp_core_JVppCoreImpl.h
-
-JSON_FILES = \
- $(wildcard $(prefix)/../vpp/share/vpp/api/core/*.api.json)
-
-jvpp-core/io_fd_vpp_jvpp_core_JVppCoreImpl.h: \
- jvpp-registry/io_fd_vpp_jvpp_VppJNIConnection.h \
- $(JSON_FILES)
- cp -rf @srcdir@/jvpp-core/* -t jvpp-core/
- mkdir -p jvpp-core/target
- cd jvpp-core \
- && mkdir -p types dto future callfacade callback notification \
- && @srcdir@/jvpp/gen/jvpp_gen.py --plugin_name core \
- -i $(JSON_FILES) \
- && cp -rf types dto future callfacade callback notification *.java -t $(packagedir_jvpp_core) \
- && rm -rf types dto future callfacade callback notification *.java
-
- $(JAVAC) -classpath jvpp-registry/target -d jvpp-core/target jvpp-core/$(packagedir_jvpp_core)/*.java \
- jvpp-core/$(packagedir_jvpp_core)/types/*.java \
- jvpp-core/$(packagedir_jvpp_core)/dto/*.java \
- jvpp-core/$(packagedir_jvpp_core)/callback/*.java \
- jvpp-core/$(packagedir_jvpp_core)/notification/*.java \
- jvpp-core/$(packagedir_jvpp_core)/future/*.java \
- jvpp-core/$(packagedir_jvpp_core)/callfacade/*.java \
- jvpp-core/$(packagedir_jvpp_core)/test/*.java \
- || (echo "jvpp-core compilation failed: $$?"; exit 1)
- $(JAVAH) -force -classpath jvpp-registry/target:jvpp-core/target -d jvpp-core io.fd.vpp.jvpp.core.JVppCoreImpl
-
-$(jarfile_jvpp_core): libjvpp_core.la
- cp .libs/libjvpp_core.so.0.0.0 jvpp-core/target
- $(JAR) cf $(JARFLAGS) $@ -C jvpp-core/target .
-
-all-local: $(jarfile_jvpp_registry) $(jarfile_jvpp_core)
diff --git a/vpp-api/java/Readme.txt b/vpp-api/java/Readme.txt
deleted file mode 100644
index 689b9b37..00000000
--- a/vpp-api/java/Readme.txt
+++ /dev/null
@@ -1,236 +0,0 @@
-= JVpp
-
-JVpp is JNI based Java API for VPP.
-
-== Features
-It is:
-
-* Asynchronous
-* Fully generated
-* Lightweight
-
-== Architecture
-
-=== Plugin support
-
- /-------------\ /--------------\ /---------------\
- | JvppPlugin1 +<-------+ JVppRegistry +--------->+ VppConnection |
- \-------------/ inits \--+-----------/ uses \---------------/
- |
- /-------------\ |
- | JvppPlugin2 +<----------+ inits
- \-------------/ |
- |
- ... |
- |
- /----------\ |
- | JVppCore +<-------------+
- \----------/
-
-
-VppRegistry opens connection to vpp (VppConnection) and manages jvpp plugins.
-Each plugin needs to be registered in the VppRegistry. Registration involves
-plugin initialization (providing JNI implementation with JVppCallback reference,
-vpp client identifier and vpp shared memory queue address).
-
-API user sends message by calling a method of appropriate plugin interface.
-The call is delegated to JNI implementation provided by the particular plugin.
-When JNI code receives reply, it invokes callback method of JVppCallback
-that corresponds to the received message reply.
-
-=== JVppCore as an example of JVpp plugin architecture
-
- JVpp Java
-
- /--------------\ /----------\ /------------\ /------\
- | JVppRegistry | | JVppCore | | Callbacks | | DTOs |
- \----+---------/ \----+-----/ \------+-----/ \------/
- ^ ^ ^
- | implements | implements | implements
- /----+--------------\ /---+----------\ /-----+---------\
- | JVppRegistryImpl* +-------->+ JVppCoreImpl | | JVppCallback |
- \-------+-----------/ inits \---+----------/ \-------+-------/
- | | ^
- | | uses | calls back
- | | |
-----------|--------------------------|-----------------------|---------------------
- | | |
- C JNI | +-------------------+ | /-----------------\
- v | | +-->+ jvpp_core_gen.h |
- /--------+--------\ | | | \-----------------/
- | jpp_registry.c* +---+ /--------+----+----\ | | |
- \-----------------/ | | << shared lib >> | /-+--+---+------\
- + ->+ jvpp_common* <--------+ jvpp_core.c* |
- uses \------------------/ uses \---------------/
-
-
-* Components marked with an asterisk contain manually crafted code, which in addition
-to generated classes form jvpp. Exception applies to Callbacks and DTOs, since there are
-manually crafted marker interfaces in callback and dto package (dto/JVppRequest, dto/JVppReply,
-dto/JVppDump, dto/JVppReplyDump, callback/JVppCallback)
-
-Note: jvpp_core.c calls back the JVppCallback instance with every response. An instance of the
-JVppCallback is provided to jvpp_core.c by JVppRegistryImpl on JVppCoreImpl initialization.
-
-Part of the JVpp is also Future facade. It is asynchronous API returning Future objects
-on top of low level JVpp. It wraps dump reply messages in one DTO using control_ping message
-(provided by JVppRegistry).
-
-
-Future facade
-
- /----------------\ /---------------\
- | FutureJVppCore | +-->+ JVppRegistry* |
- \-----+----------/ | \---------------/
- ^ |
- | implements | uses
- | |
- /--------+-------------\ | /------------------------------\
- | FutureJVppCoreFacade +---+--->+ FutureJVppCoreFacadeCallback |
- \---------+------------/ uses \-------+----------------------/
- | |
----------------|-----------------------------|-------------------------------
- | uses | implements
-JVpp Java | |
- | |
- /----------\ | |
- | JVppCore +<-+ |
- \----+-----/ |
- ^ |
- | implements v
- /----+---------\ /--------+---------------\
- | JVppCoreImpl | | JVppCoreGlobalCallback |
- \--------------/ \------------------------/
-
-
-
-Another useful utility of the JVpp is Callback facade. It is asynchronous API
-capable of calling specific callback instance (provided when performing a call)
-per call.
-
-
-Callback facade
-
- /------------------\ /---------------\
- | CallbackJVppCore | +-->+ JVppRegistry* |
- \-----+------------/ | \---------------/
- ^ |
- | implements | uses
- | |
- /--------+---------------\ | /--------------------------\
- | CallbackJVppCoreFacade +---+--->+ CallbackJVppCoreCallback |
- \---------+--------------/ uses \-----+--------------------/
- | |
----------------|-----------------------------|-------------------------------
- | uses | implements
-JVpp Java | |
- | |
- /----------\ | |
- | JVppCore +<-+ |
- \----+-----/ |
- ^ |
- | implements v
- /----+---------\ /----------+-------------\
- | JVppCoreImpl | | JVppCoreGlobalCallback |
- \--------------/ \------------------------/
-
-
-== Package structure
-
-* *io.fd.vpp.jvpp* - top level package for generated JVpp interface+ implementation and hand-crafted
-VppConnection interface + implementation - packaged as jvpp-registry-version.jar
-
-* *io.fd.vpp.jvpp.[plugin]* - top level package for generated JVpp interface + implementation
-+ plugin's API tests - packaged as jvpp-[plugin]-version.jar
-
-** *dto* - package for DTOs generated from VPP API structures + base/marker hand-crafted interfaces
-(in case of jvpp-registry)
-** *callback* - package for low-level JVpp callbacks and a global callback interface implementing each of
-the low-level JVppcallbacks
-** *future* - package for future based facade on top of JVpp and callbacks
-** *callfacade* - package for callback based facade on top of JVpp and callbacks. Allowing
-users to provide callback per request
-** *test* - package for JVpp standalone tests. Can also serve as samples for JVpp.
-
-C code is structured into modules:
-
-* *jvpp_common* - shared library that provides jvpp_main_t reference used by jvpp_registry and plugins.
-
-* *jvpp_registry* - native library used by JVppRegistryImpl, responsible for:
-
-** VPP connection open/close
-** Rx thread to java thread attach
-** control ping message handling
-
-* *jvpp_core* - native library used by jvpp core plugin:
-** *jvpp_core.c* - contains hand crafted code for core plugin initialization
-** *jvpp_core_gen.h* - contains generated JNI compatible handlers for all requests and replies defined in vpe.api
-
-== Code generators
-All of the required code except the base/marker interfaces is generated using
-simple python2 code generators. The generators use __defs_vpp_papi.py__ input
-file produced by __vppapigen__ from vpe.api file.
-
-=== JNI compatible C code
-Produces __jvpp_[plugin]_gen.h__ file containing JNI compatible handlers for each VPP
-request and reply.
-
-[NOTE]
-====
-Source: jvpp_c_gen.py
-====
-
-=== Request/Reply DTOs
-For all the structures in __defs_vpp_papi.py__ a POJO DTO is produced. Logically,
-there are 4 types of DTOs:
-
-* Request - requests that can be sent to VPP and only a single response is expected
-* DumpRequest - requests that can be sent to VPP and a stream of responses is expected
-* Reply - reply to a simple request or a single response from dump triggered response stream
-* ReplyDump - collection of replies from a single dump request
-* Notifications/Events - Not implemented yet
-
-[NOTE]
-====
-Source: dto_gen.py
-====
-
-=== JVpp
-Produces __JVpp.java__ and __JVppImpl.java__. This is the layer right above JNI compatible C
-code.
-
-[NOTE]
-====
-Source: jvpp_impl_gen.py
-====
-
-=== Callbacks
-Produces callback interface for each VPP reply + a global callback interface called
-__JVpp[plugin]GlobalCallback.java__ aggregating all of the callback interfaces. The JNI
-compatible C code expects only a single instance of this global callback and calls
-it with every reply.
-
-[NOTE]
-====
-Source: callback_gen.py
-====
-
-=== Future facade
-Produces an asynchronous facade on top of JVpp and callbacks, which returns a Future that provides
-matching reply once VPP invocation finishes. Sources produced:
-__FutureJVpp[plugin].java, FutureJVpp[plugin]Facade.java and FutureJVpp[plugin]Callback.java__
-
-[NOTE]
-====
-Source: jvpp_future_facade_gen.py
-====
-
-=== Callback facade
-Similar to future facade, only this facade takes callback objects as part of the invocation
-and the callback is called with result once VPP invocation finishes. Sources produced:
-__CallbackJVpp[plugin].java, CallbackJVpp[plugin]Facade.java and CallbackJVpp[plugin]Callback.java__
-
-[NOTE]
-====
-Source: jvpp_callback_facade_gen.py
-====
diff --git a/vpp-api/java/configure.ac b/vpp-api/java/configure.ac
deleted file mode 100644
index 3082781e..00000000
--- a/vpp-api/java/configure.ac
+++ /dev/null
@@ -1,24 +0,0 @@
-AC_INIT(jvpp, 17.04)
-LT_INIT
-AC_CONFIG_MACRO_DIR([m4])
-AM_INIT_AUTOMAKE
-AM_SILENT_RULES([yes])
-
-AC_PROG_CC
-
-if test -f /usr/bin/lsb_release && test `lsb_release -si` == "Ubuntu" && test `lsb_release -sr` == "14.04" && test -d /usr/lib/jvm/java-8-openjdk-amd64/ ; then
- JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/
- JAVAC=${JAVA_HOME}/bin/javac
- PATH=${JAVA_HOME}/bin/:${PATH}
- break
-fi
-
-AX_CHECK_JAVA_HOME
-AX_PROG_JAVAC
-AX_PROG_JAVAH
-AX_PROG_JAR
-AX_PROG_JAVADOC
-AX_PROG_JAVA
-
-AC_OUTPUT([Makefile])
-
diff --git a/vpp-api/java/jvpp-common/jvpp_common.c b/vpp-api/java/jvpp-common/jvpp_common.c
deleted file mode 100644
index a161c09c..00000000
--- a/vpp-api/java/jvpp-common/jvpp_common.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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.
- */
-#define _GNU_SOURCE /* for strcasestr(3) */
-
-#include "jvpp_common.h"
-
-#ifndef JVPP_DEBUG
-#define JVPP_DEBUG 0
-#endif
-
-#if JVPP_DEBUG == 1
-#define DEBUG_LOG(...) clib_warning(__VA_ARGS__)
-#else
-#define DEBUG_LOG(...)
-#endif
-
-/* shared jvpp main structure */
-jvpp_main_t jvpp_main __attribute__((aligned (64)));
-
-void call_on_error(const char* callName, int contextId, int retval,
- jclass callbackClass, jobject callbackObject,
- jclass callbackExceptionClass) {
- DEBUG_LOG("\nCallOnError : callback=%s, retval=%d, context=%d\n", callName,
- clib_net_to_host_u32(retval), clib_net_to_host_u32(context));
- JNIEnv *env = jvpp_main.jenv;
- if (!callbackClass) {
- DEBUG_LOG("CallOnError : jm->callbackClass is null!\n");
- return;
- }
- jmethodID excConstructor = (*env)->GetMethodID(env, callbackExceptionClass,
- "<init>", "(Ljava/lang/String;II)V");
- if (!excConstructor) {
- DEBUG_LOG("CallOnError : excConstructor is null!\n");
- return;
- }
- jmethodID callbackExcMethod = (*env)->GetMethodID(env, callbackClass,
- "onError", "(Lio/fd/vpp/jvpp/VppCallbackException;)V");
- if (!callbackExcMethod) {
- DEBUG_LOG("CallOnError : callbackExcMethod is null!\n");
- return;
- }
-
- jobject excObject = (*env)->NewObject(env, callbackExceptionClass,
- excConstructor, (*env)->NewStringUTF(env, callName),
- clib_net_to_host_u32(contextId), clib_net_to_host_u32(retval));
- if (!excObject) {
- DEBUG_LOG("CallOnError : excObject is null!\n");
- return;
- }
-
- (*env)->CallVoidMethod(env, callbackObject, callbackExcMethod, excObject);
- DEBUG_LOG("CallOnError : Response sent\n");
-}
diff --git a/vpp-api/java/jvpp-common/jvpp_common.h b/vpp-api/java/jvpp-common/jvpp_common.h
deleted file mode 100644
index bbb203ed..00000000
--- a/vpp-api/java/jvpp-common/jvpp_common.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.
- */
-#ifndef __included_jvpp_common_h__
-#define __included_jvpp_common_h__
-//
-#include <vppinfra/types.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <jni.h>
-
-typedef struct {
- /* Unique identifier used for matching replays with requests */
- volatile u32 context_id;
-
- /* Spinlock */
- volatile u32 lock;
- u32 tag;
-
- /* JNI Native Method Interface pointer for message handlers */
- JNIEnv *jenv;
-
- /* JNI Invoke Interface pointer for attachment of rx thread to java thread */
- JavaVM *jvm;
-
- /* Convenience */
- unix_shared_memory_queue_t * vl_input_queue;
- u32 my_client_index;
-} jvpp_main_t;
-
-extern jvpp_main_t jvpp_main __attribute__((aligned (64)));
-
-static_always_inline u32 vppjni_get_context_id(jvpp_main_t * jm) {
- return __sync_add_and_fetch(&jm->context_id, 1);
-}
-
-static_always_inline void vppjni_lock(jvpp_main_t * jm, u32 tag) {
- while (__sync_lock_test_and_set(&jm->lock, 1))
- ;
- jm->tag = tag;
-}
-
-static_always_inline void vppjni_unlock(jvpp_main_t * jm) {
- jm->tag = 0;
- CLIB_MEMORY_BARRIER();
- jm->lock = 0;
-}
-
-/**
- * Calls onError callback on callbackObject reference. Passes instance of callbackExceptionClass as parameter.
- */
-void call_on_error(const char* callName, int contextId, int retval,
- jclass callbackClass, jobject callbackObject,
- jclass callbackExceptionClass);
-
-#endif /* __included_jvpp_common_h__ */
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackApiTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackApiTest.java
deleted file mode 100644
index 986993b8..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackApiTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.callback.GetNodeIndexCallback;
-import io.fd.vpp.jvpp.core.callback.ShowVersionCallback;
-import io.fd.vpp.jvpp.core.callback.SwInterfaceCallback;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndex;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndexReply;
-import io.fd.vpp.jvpp.core.dto.ShowVersion;
-import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDump;
-
-public class CallbackApiTest {
-
- public static void main(String[] args) throws Exception {
- testCallbackApi();
- }
-
- private static void testCallbackApi() throws Exception {
- System.out.println("Testing Java callback API with JVppRegistry");
- try (final JVppRegistry registry = new JVppRegistryImpl("CallbackApiTest");
- final JVpp jvpp = new JVppCoreImpl()) {
- registry.register(jvpp, new TestCallback());
-
- System.out.println("Sending ShowVersion request...");
- final int result = jvpp.send(new ShowVersion());
- System.out.printf("ShowVersion send result = %d%n", result);
-
- System.out.println("Sending GetNodeIndex request...");
- GetNodeIndex getNodeIndexRequest = new GetNodeIndex();
- getNodeIndexRequest.nodeName = "non-existing-node".getBytes();
- jvpp.send(getNodeIndexRequest);
-
- System.out.println("Sending SwInterfaceDump request...");
- SwInterfaceDump swInterfaceDumpRequest = new SwInterfaceDump();
- swInterfaceDumpRequest.nameFilterValid = 0;
- swInterfaceDumpRequest.nameFilter = "".getBytes();
- jvpp.send(swInterfaceDumpRequest);
-
- Thread.sleep(1000);
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- static class TestCallback implements GetNodeIndexCallback, ShowVersionCallback, SwInterfaceCallback {
-
- @Override
- public void onGetNodeIndexReply(final GetNodeIndexReply msg) {
- System.out.printf("Received GetNodeIndexReply: %s%n", msg);
- }
-
- @Override
- public void onShowVersionReply(final ShowVersionReply msg) {
- System.out.printf("Received ShowVersionReply: context=%d, program=%s, version=%s, "
- + "buildDate=%s, buildDirectory=%s%n",
- msg.context, new String(msg.program), new String(msg.version),
- new String(msg.buildDate), new String(msg.buildDirectory));
- }
-
- @Override
- public void onSwInterfaceDetails(final SwInterfaceDetails msg) {
- System.out.printf("Received SwInterfaceDetails: interfaceName=%s, l2AddressLength=%d, adminUpDown=%d, "
- + "linkUpDown=%d, linkSpeed=%d, linkMtu=%d%n",
- new String(msg.interfaceName), msg.l2AddressLength, msg.adminUpDown,
- msg.linkUpDown, msg.linkSpeed, (int) msg.linkMtu);
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, context=%d, retval=%d%n", ex.getMethodName(),
- ex.getCtxId(), ex.getErrorCode());
- }
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeNotificationTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeNotificationTest.java
deleted file mode 100644
index d84cb034..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeNotificationTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.core.JVppCore;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.callback.WantInterfaceEventsCallback;
-import io.fd.vpp.jvpp.core.callfacade.CallbackJVppCoreFacade;
-import io.fd.vpp.jvpp.core.dto.WantInterfaceEventsReply;
-
-public class CallbackJVppFacadeNotificationTest {
-
- private static void testCallbackFacade() throws Exception {
- System.out.println("Testing CallbackJVppFacade for notifications");
-
- try (final JVppRegistry registry = new JVppRegistryImpl("CallbackFacadeTest");
- final JVppCore jvpp = new JVppCoreImpl()) {
- final CallbackJVppCoreFacade jvppCallbackFacade = new CallbackJVppCoreFacade(registry, jvpp);
- System.out.println("Successfully connected to VPP");
-
- final AutoCloseable notificationListenerReg =
- jvppCallbackFacade.getNotificationRegistry().registerSwInterfaceSetFlagsNotificationCallback(
- NotificationUtils::printNotification
- );
-
- jvppCallbackFacade.wantInterfaceEvents(NotificationUtils.getEnableInterfaceNotificationsReq(),
- new WantInterfaceEventsCallback() {
- @Override
- public void onWantInterfaceEventsReply(final WantInterfaceEventsReply reply) {
- System.out.println("Interface events started");
- }
-
- @Override
- public void onError(final VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, context=%d, retval=%d%n",
- ex.getMethodName(), ex.getCtxId(), ex.getErrorCode());
- }
- });
-
- System.out.println("Changing interface configuration");
- NotificationUtils.getChangeInterfaceState().send(jvpp);
-
- Thread.sleep(1000);
-
- jvppCallbackFacade.wantInterfaceEvents(NotificationUtils.getDisableInterfaceNotificationsReq(),
- new WantInterfaceEventsCallback() {
- @Override
- public void onWantInterfaceEventsReply(final WantInterfaceEventsReply reply) {
- System.out.println("Interface events stopped");
- }
-
- @Override
- public void onError(final VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, context=%d, retval=%d%n",
- ex.getMethodName(), ex.getCtxId(), ex.getErrorCode());
- }
- });
-
- notificationListenerReg.close();
-
- Thread.sleep(2000);
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testCallbackFacade();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeTest.java
deleted file mode 100644
index 9f7cb8de..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackJVppFacadeTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.callback.GetNodeIndexCallback;
-import io.fd.vpp.jvpp.core.callback.ShowVersionCallback;
-import io.fd.vpp.jvpp.core.callfacade.CallbackJVppCoreFacade;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndex;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndexReply;
-import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
-
-/**
- * CallbackJVppFacade together with CallbackJVppFacadeCallback allow for setting different callback for each request.
- * This is more convenient than the approach shown in CallbackApiTest.
- */
-public class CallbackJVppFacadeTest {
-
- private static ShowVersionCallback showVersionCallback1 = new ShowVersionCallback() {
- @Override
- public void onShowVersionReply(final ShowVersionReply msg) {
- System.out.printf("ShowVersionCallback1 received ShowVersionReply: context=%d, program=%s,"
- + "version=%s, buildDate=%s, buildDirectory=%s%n", msg.context, new String(msg.program),
- new String(msg.version), new String(msg.buildDate), new String(msg.buildDirectory));
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception in showVersionCallback1: call=%s, reply=%d, context=%d%n",
- ex.getMethodName(), ex.getErrorCode(), ex.getCtxId());
- }
- };
-
- private static ShowVersionCallback showVersionCallback2 = new ShowVersionCallback() {
- @Override
- public void onShowVersionReply(final ShowVersionReply msg) {
- System.out.printf("ShowVersionCallback2 received ShowVersionReply: context=%d, program=%s,"
- + "version=%s, buildDate=%s, buildDirectory=%s%n", msg.context, new String(msg.program),
- new String(msg.version), new String(msg.buildDate), new String(msg.buildDirectory));
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception in showVersionCallback2: call=%s, reply=%d, context=%d%n",
- ex.getMethodName(), ex.getErrorCode(), ex.getCtxId());
- }
-
- };
-
- private static GetNodeIndexCallback getNodeIndexCallback = new GetNodeIndexCallback() {
- @Override
- public void onGetNodeIndexReply(final GetNodeIndexReply msg) {
- System.out.printf("Received GetNodeIndexReply: %s%n", msg);
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception in getNodeIndexCallback: call=%s, reply=%d, context=%d%n",
- ex.getMethodName(), ex.getErrorCode(), ex.getCtxId());
- }
- };
-
- private static void testCallbackFacade() throws Exception {
- System.out.println("Testing CallbackJVppFacade");
-
- try (final JVppRegistry registry = new JVppRegistryImpl("CallbackFacadeTest");
- final CallbackJVppCoreFacade callbackFacade = new CallbackJVppCoreFacade(registry, new JVppCoreImpl())) {
- System.out.println("Successfully connected to VPP");
-
- callbackFacade.showVersion(showVersionCallback1);
- callbackFacade.showVersion(showVersionCallback2);
-
- GetNodeIndex getNodeIndexRequest = new GetNodeIndex();
- getNodeIndexRequest.nodeName = "dummyNode".getBytes();
- callbackFacade.getNodeIndex(getNodeIndexRequest, getNodeIndexCallback);
-
- Thread.sleep(2000);
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testCallbackFacade();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackNotificationApiTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackNotificationApiTest.java
deleted file mode 100644
index a9f71f11..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CallbackNotificationApiTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getChangeInterfaceState;
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getDisableInterfaceNotificationsReq;
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getEnableInterfaceNotificationsReq;
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.printNotification;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.callback.SwInterfaceSetFlagsCallback;
-import io.fd.vpp.jvpp.core.callback.SwInterfaceSetFlagsNotificationCallback;
-import io.fd.vpp.jvpp.core.callback.WantInterfaceEventsCallback;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlagsNotification;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlagsReply;
-import io.fd.vpp.jvpp.core.dto.WantInterfaceEventsReply;
-
-public class CallbackNotificationApiTest {
-
- private static void testCallbackApi() throws Exception {
- System.out.println("Testing Java callback API for notifications");
- try (final JVppRegistry registry = new JVppRegistryImpl("CallbackNotificationTest");
- final JVpp jvpp = new JVppCoreImpl()) {
- registry.register(jvpp, new TestCallback());
- System.out.println("Successfully connected to VPP");
-
- getEnableInterfaceNotificationsReq().send(jvpp);
- System.out.println("Interface notifications started");
- // TODO test ifc dump which also triggers interface flags send
-
- System.out.println("Changing interface configuration");
- getChangeInterfaceState().send(jvpp);
-
- // Notifications are received
- Thread.sleep(500);
-
- getDisableInterfaceNotificationsReq().send(jvpp);
- System.out.println("Interface events stopped");
-
- Thread.sleep(2000);
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testCallbackApi();
- }
-
- private static class TestCallback implements SwInterfaceSetFlagsNotificationCallback,
- WantInterfaceEventsCallback, SwInterfaceSetFlagsCallback {
-
- @Override
- public void onSwInterfaceSetFlagsNotification(
- final SwInterfaceSetFlagsNotification msg) {
- printNotification(msg);
- }
-
- @Override
- public void onWantInterfaceEventsReply(final WantInterfaceEventsReply wantInterfaceEventsReply) {
- System.out.println("Interface notification stream updated");
- }
-
- @Override
- public void onSwInterfaceSetFlagsReply(final SwInterfaceSetFlagsReply swInterfaceSetFlagsReply) {
- System.out.println("Interface flags set successfully");
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception in getNodeIndexCallback: call=%s, reply=%d, context=%d%n",
- ex.getMethodName(), ex.getErrorCode(), ex.getCtxId());
-
- }
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/ControlPingTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/ControlPingTest.java
deleted file mode 100644
index e97f4e3a..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/ControlPingTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.VppCallbackException;
-import io.fd.vpp.jvpp.callback.ControlPingCallback;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.dto.ControlPing;
-import io.fd.vpp.jvpp.dto.ControlPingReply;
-
-public class ControlPingTest {
-
- private static void testControlPing() throws Exception {
- System.out.println("Testing ControlPing using Java callback API");
- try (JVppRegistry registry = new JVppRegistryImpl("ControlPingTest");
- JVpp jvpp = new JVppCoreImpl()) {
-
- registry.register(jvpp, new ControlPingCallback() {
- @Override
- public void onControlPingReply(final ControlPingReply reply) {
- System.out.printf("Received ControlPingReply: %s%n", reply);
- }
-
- @Override
- public void onError(VppCallbackException ex) {
- System.out.printf("Received onError exception: call=%s, reply=%d, context=%d ", ex.getMethodName(),
- ex.getErrorCode(), ex.getCtxId());
- }
-
- });
- System.out.println("Successfully connected to VPP");
- Thread.sleep(1000);
-
- System.out.println("Sending control ping using JVppRegistry");
- registry.controlPing(jvpp.getClass());
-
- Thread.sleep(2000);
-
- System.out.println("Sending control ping using JVpp plugin");
- jvpp.send(new ControlPing());
-
- Thread.sleep(2000);
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testControlPing();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CreateSubInterfaceTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CreateSubInterfaceTest.java
deleted file mode 100644
index a96258f4..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/CreateSubInterfaceTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import static java.util.Objects.requireNonNull;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.dto.CreateSubif;
-import io.fd.vpp.jvpp.core.dto.CreateSubifReply;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDetailsReplyDump;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDump;
-import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
-
-/**
- * <p>Tests sub-interface creation.<br> Equivalent to:<br>
- *
- * <pre>{@code
- * vppctl create sub GigabitEthernet0/9/0 1 dot1q 100 inner-dot1q any
- * }
- * </pre>
- *
- * To verify invoke:<br>
- * <pre>{@code
- * vpp_api_test json
- * vat# sw_interface_dump
- * }
- */
-public class CreateSubInterfaceTest {
-
- private static SwInterfaceDump createSwInterfaceDumpRequest(final String ifaceName) {
- SwInterfaceDump request = new SwInterfaceDump();
- request.nameFilter = ifaceName.getBytes();
- request.nameFilterValid = 1;
- return request;
- }
-
- private static void requireSingleIface(final SwInterfaceDetailsReplyDump response, final String ifaceName) {
- if (response.swInterfaceDetails.size() != 1) {
- throw new IllegalStateException(
- String.format("Expected one interface matching filter %s but was %d", ifaceName,
- response.swInterfaceDetails.size()));
- }
- }
-
- private static CreateSubif createSubifRequest(final int swIfIndex, final int subId) {
- CreateSubif request = new CreateSubif();
- request.swIfIndex = swIfIndex; // super interface id
- request.subId = subId;
- request.noTags = 0;
- request.oneTag = 0;
- request.twoTags = 1;
- request.dot1Ad = 0;
- request.exactMatch = 1;
- request.defaultSub = 0;
- request.outerVlanIdAny = 0;
- request.innerVlanIdAny = 1;
- request.outerVlanId = 100;
- request.innerVlanId = 0;
- return request;
- }
-
- private static void print(CreateSubifReply reply) {
- System.out.printf("CreateSubifReply: %s%n", reply);
- }
-
- private static void testCreateSubInterface() throws Exception {
- System.out.println("Testing sub-interface creation using Java callback API");
- try (final JVppRegistry registry = new JVppRegistryImpl("CreateSubInterface");
- final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
- System.out.println("Successfully connected to VPP");
- Thread.sleep(1000);
-
- final String ifaceName = "GigabitEthernet0/8/0";
-
- final SwInterfaceDetailsReplyDump swInterfaceDetails =
- jvppFacade.swInterfaceDump(createSwInterfaceDumpRequest(ifaceName)).toCompletableFuture().get();
-
- requireNonNull(swInterfaceDetails, "swInterfaceDump returned null");
- requireNonNull(swInterfaceDetails.swInterfaceDetails, "swInterfaceDetails is null");
- requireSingleIface(swInterfaceDetails, ifaceName);
-
- final int swIfIndex = swInterfaceDetails.swInterfaceDetails.get(0).swIfIndex;
- final int subId = 1;
-
- final CreateSubifReply createSubifReply =
- jvppFacade.createSubif(createSubifRequest(swIfIndex, subId)).toCompletableFuture().get();
- print(createSubifReply);
-
- final String subIfaceName = "GigabitEthernet0/8/0." + subId;
- final SwInterfaceDetailsReplyDump subIface =
- jvppFacade.swInterfaceDump(createSwInterfaceDumpRequest(subIfaceName)).toCompletableFuture().get();
- requireNonNull(swInterfaceDetails, "swInterfaceDump returned null");
- requireNonNull(subIface.swInterfaceDetails, "swInterfaceDump returned null");
- requireSingleIface(swInterfaceDetails, ifaceName);
-
- System.out.println("Disconnecting...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testCreateSubInterface();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiNotificationTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiNotificationTest.java
deleted file mode 100644
index 9efeae19..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiNotificationTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getChangeInterfaceState;
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getDisableInterfaceNotificationsReq;
-import static io.fd.vpp.jvpp.core.test.NotificationUtils.getEnableInterfaceNotificationsReq;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
-
-public class FutureApiNotificationTest {
-
- private static void testFutureApi() throws Exception {
- System.out.println("Testing Java future API for notifications");
- try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiNotificationTest");
- final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl());
- final AutoCloseable notificationListenerReg =
- jvppFacade.getNotificationRegistry()
- .registerSwInterfaceSetFlagsNotificationCallback(NotificationUtils::printNotification)) {
- System.out.println("Successfully connected to VPP");
- jvppFacade.wantInterfaceEvents(getEnableInterfaceNotificationsReq()).toCompletableFuture().get();
- System.out.println("Interface events started");
-
- System.out.println("Changing interface configuration");
- jvppFacade.swInterfaceSetFlags(getChangeInterfaceState()).toCompletableFuture().get();
-
- Thread.sleep(1000);
-
- jvppFacade.wantInterfaceEvents(getDisableInterfaceNotificationsReq()).toCompletableFuture().get();
- System.out.println("Interface events stopped");
- System.out.println("Disconnecting...");
- }
- }
-
- public static void main(String[] args) throws Exception {
- testFutureApi();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiTest.java
deleted file mode 100644
index f478bab4..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/FutureApiTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.dto.BridgeDomainDetailsReplyDump;
-import io.fd.vpp.jvpp.core.dto.BridgeDomainDump;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndex;
-import io.fd.vpp.jvpp.core.dto.GetNodeIndexReply;
-import io.fd.vpp.jvpp.core.dto.ShowVersion;
-import io.fd.vpp.jvpp.core.dto.ShowVersionReply;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDetailsReplyDump;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceDump;
-import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.Future;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class FutureApiTest {
-
- private static final Logger LOG = Logger.getLogger(FutureApiTest.class.getName());
-
- private static void testShowVersion(final FutureJVppCoreFacade jvpp) throws Exception {
- LOG.info("Sending ShowVersion request...");
- final Future<ShowVersionReply> replyFuture = jvpp.showVersion(new ShowVersion()).toCompletableFuture();
- final ShowVersionReply reply = replyFuture.get();
- LOG.info(
- String.format(
- "Received ShowVersionReply: context=%d, program=%s, version=%s, buildDate=%s, buildDirectory=%s%n",
- reply.context, new String(reply.program), new String(reply.version), new String(reply.buildDate),
- new String(reply.buildDirectory)));
- }
-
- private static void testEmptyBridgeDomainDump(final FutureJVppCoreFacade jvpp) throws Exception {
- LOG.info("Sending ShowVersion request...");
- final BridgeDomainDump request = new BridgeDomainDump();
- request.bdId = -1; // dump call
-
- final CompletableFuture<BridgeDomainDetailsReplyDump>
- replyFuture = jvpp.bridgeDomainDump(request).toCompletableFuture();
- final BridgeDomainDetailsReplyDump reply = replyFuture.get();
-
- if (reply == null || reply.bridgeDomainDetails == null) {
- LOG.severe("Received null response for empty dump: " + reply);
- } else {
- LOG.info(
- String.format(
- "Received empty bridge-domain dump reply with list of bridge-domains: %s, %s",
- reply.bridgeDomainDetails, reply.bridgeDomainSwIfDetails));
- }
- }
-
- private static void testGetNodeIndex(final FutureJVppCoreFacade jvpp) {
- LOG.info("Sending GetNodeIndex request...");
- final GetNodeIndex request = new GetNodeIndex();
- request.nodeName = "non-existing-node".getBytes();
- final Future<GetNodeIndexReply> replyFuture = jvpp.getNodeIndex(request).toCompletableFuture();
- try {
- final GetNodeIndexReply reply = replyFuture.get();
- LOG.info(
- String.format(
- "Received GetNodeIndexReply: context=%d, nodeIndex=%d%n", reply.context, reply.nodeIndex));
- } catch (Exception e) {
- LOG.log(Level.SEVERE, "GetNodeIndex request failed", e);
- }
- }
-
- private static void testSwInterfaceDump(final FutureJVppCoreFacade jvpp) throws Exception {
- LOG.info("Sending SwInterfaceDump request...");
- final SwInterfaceDump request = new SwInterfaceDump();
- request.nameFilterValid = 0;
- request.nameFilter = "".getBytes();
-
- final Future<SwInterfaceDetailsReplyDump> replyFuture = jvpp.swInterfaceDump(request).toCompletableFuture();
- final SwInterfaceDetailsReplyDump reply = replyFuture.get();
- for (SwInterfaceDetails details : reply.swInterfaceDetails) {
- Objects.requireNonNull(details, "reply.swInterfaceDetails contains null element!");
- LOG.info(
- String.format("Received SwInterfaceDetails: interfaceName=%s, l2AddressLength=%d, adminUpDown=%d, "
- + "linkUpDown=%d, linkSpeed=%d, linkMtu=%d%n",
- new String(details.interfaceName), details.l2AddressLength, details.adminUpDown,
- details.linkUpDown, details.linkSpeed, (int) details.linkMtu));
- }
- }
-
- private static void testFutureApi() throws Exception {
- LOG.info("Testing Java future API");
- try (final JVppRegistry registry = new JVppRegistryImpl("FutureApiTest");
- final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
- LOG.info("Successfully connected to VPP");
-
- testEmptyBridgeDomainDump(jvppFacade);
- testShowVersion(jvppFacade);
- testGetNodeIndex(jvppFacade);
- testSwInterfaceDump(jvppFacade);
-
- LOG.info("Disconnecting...");
- }
- }
-
- public static void main(String[] args) throws Exception {
- testFutureApi();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/L2AclTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/L2AclTest.java
deleted file mode 100644
index 6b3fa993..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/L2AclTest.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSession;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelSessionReply;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTable;
-import io.fd.vpp.jvpp.core.dto.ClassifyAddDelTableReply;
-import io.fd.vpp.jvpp.core.dto.ClassifySessionDetailsReplyDump;
-import io.fd.vpp.jvpp.core.dto.ClassifySessionDump;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableByInterface;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableByInterfaceReply;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableIds;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableIdsReply;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableInfo;
-import io.fd.vpp.jvpp.core.dto.ClassifyTableInfoReply;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterface;
-import io.fd.vpp.jvpp.core.dto.InputAclSetInterfaceReply;
-import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
-import javax.xml.bind.DatatypeConverter;
-
-/**
- * <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 set int input acl intfc local0 l2-table 0
- * vppctl sh class table verbose
- * }
- * </pre>
- */
-public class L2AclTest {
-
- private static final int LOCAL0_IFACE_ID = 0;
-
- 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 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;
- 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 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 = 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: %s%n", reply);
- }
-
- private static void print(ClassifyTableIdsReply reply) {
- System.out.printf("ClassifyTableIdsReply: %s%n", reply);
- }
-
- private static void print(final ClassifyTableInfoReply reply) {
- System.out.println(reply);
- if (reply != null) {
- System.out.println("Mask hex: " + DatatypeConverter.printHexBinary(reply.mask));
- }
- }
-
- private static void print(ClassifyAddDelSessionReply reply) {
- System.out.printf("ClassifyAddDelSessionReply: context=%s%n", reply);
- }
-
- private static void print(final ClassifySessionDetailsReplyDump reply) {
- System.out.println(reply);
- reply.classifySessionDetails.forEach(detail -> {
- System.out.println(detail);
- System.out.println("Match hex: " + DatatypeConverter.printHexBinary(detail.match));
- });
- }
-
- private static void print(final InputAclSetInterfaceReply reply) {
- System.out.printf("InputAclSetInterfaceReply: context=%s%n", reply);
- }
-
- private static void print(final ClassifyTableByInterfaceReply reply) {
- System.out.printf("ClassifyAddDelTableReply: %s%n", reply);
- }
-
- private static void testL2Acl() throws Exception {
- System.out.println("Testing L2 ACLs using Java callback API");
- try (final JVppRegistry registry = new JVppRegistryImpl("L2AclTest");
- final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
-
- System.out.println("Successfully connected to VPP");
- Thread.sleep(1000);
-
- final ClassifyAddDelTableReply classifyAddDelTableReply =
- 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...");
- }
- Thread.sleep(1000);
- }
-
- public static void main(String[] args) throws Exception {
- testL2Acl();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/LispAdjacencyTest.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/LispAdjacencyTest.java
deleted file mode 100644
index d7f5039b..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/LispAdjacencyTest.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-import io.fd.vpp.jvpp.core.JVppCoreImpl;
-import io.fd.vpp.jvpp.core.dto.LispAddDelAdjacency;
-import io.fd.vpp.jvpp.core.dto.LispAddDelLocalEid;
-import io.fd.vpp.jvpp.core.dto.LispAddDelLocatorSet;
-import io.fd.vpp.jvpp.core.dto.LispAddDelRemoteMapping;
-import io.fd.vpp.jvpp.core.dto.LispAdjacenciesGet;
-import io.fd.vpp.jvpp.core.dto.LispAdjacenciesGetReply;
-import io.fd.vpp.jvpp.core.dto.LispEnableDisable;
-import io.fd.vpp.jvpp.core.future.FutureJVppCoreFacade;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.ExecutionException;
-import java.util.logging.Logger;
-
-/**
- * Tests lisp adjacency creation and read (custom vpe.api type support showcase).
- */
-public class LispAdjacencyTest {
-
- private static final Logger LOG = Logger.getLogger(LispAdjacencyTest.class.getName());
-
- private static void enableLisp(final FutureJVppCoreFacade jvpp) throws ExecutionException, InterruptedException {
- final LispEnableDisable request = new LispEnableDisable();
- request.isEn = 1;
- jvpp.lispEnableDisable(request).toCompletableFuture().get();
- LOG.info("Lisp enabled successfully");
- }
-
- private static void addLocatorSet(final FutureJVppCoreFacade jvpp) throws ExecutionException, InterruptedException {
- final LispAddDelLocatorSet request = new LispAddDelLocatorSet();
- request.isAdd = 1;
- request.locatorSetName = "ls1".getBytes(StandardCharsets.UTF_8);
- jvpp.lispAddDelLocatorSet(request).toCompletableFuture().get();
- LOG.info("Locator set created successfully:" + request.toString());
- }
-
- private static void addLocalEid(final FutureJVppCoreFacade jvpp) throws ExecutionException, InterruptedException {
- final LispAddDelLocalEid request = new LispAddDelLocalEid();
- request.isAdd = 1;
- request.locatorSetName = "ls1".getBytes(StandardCharsets.UTF_8);
- request.eid = new byte[] {1, 2, 1, 10};
- request.eidType = 0; // ip4
- request.vni = 0;
- request.prefixLen = 32;
- jvpp.lispAddDelLocalEid(request).toCompletableFuture().get();
- LOG.info("Local EID created successfully:" + request.toString());
- }
-
- private static void addRemoteMapping(final FutureJVppCoreFacade jvpp)
- throws ExecutionException, InterruptedException {
- final LispAddDelRemoteMapping request = new LispAddDelRemoteMapping();
- request.isAdd = 1;
- request.vni = 0;
- request.eid = new byte[] {1, 2, 1, 20};
- request.eidLen = 32;
- request.rlocNum = 1;
- request.rlocs = new byte[] {1, 1, 1, 1, 2, 1, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
- jvpp.lispAddDelRemoteMapping(request).toCompletableFuture().get();
- LOG.info("Remote mapping created successfully:" + request.toString());
- }
-
- private static void addAdjacency(final FutureJVppCoreFacade jvpp) throws ExecutionException, InterruptedException {
- final LispAddDelAdjacency request = new LispAddDelAdjacency();
- request.isAdd = 1;
- request.leid = new byte[] {1, 2, 1, 10};
- request.leidLen = 32;
- request.reid = new byte[] {1, 2, 1, 20};
- request.reidLen = 32;
- request.eidType = 0; // ip4
- request.vni = 0;
- jvpp.lispAddDelAdjacency(request).toCompletableFuture().get();
- LOG.info("Lisp adjacency created successfully:" + request.toString());
- }
-
- private static void showAdjacencies(final FutureJVppCoreFacade jvpp)
- throws ExecutionException, InterruptedException {
- final LispAdjacenciesGetReply reply =
- jvpp.lispAdjacenciesGet(new LispAdjacenciesGet()).toCompletableFuture().get();
- LOG.info("Lisp adjacency received successfully:" + reply.toString());
- }
-
- private static void testAdjacency(final FutureJVppCoreFacade jvpp) throws Exception {
- enableLisp(jvpp);
- addLocatorSet(jvpp);
- addLocalEid(jvpp);
- addRemoteMapping(jvpp);
- addAdjacency(jvpp);
- showAdjacencies(jvpp);
- }
-
- private static void testFutureApi() throws Exception {
- LOG.info("Create lisp adjacency test");
- try (final JVppRegistry registry = new JVppRegistryImpl("LispAdjacencyTest");
- final FutureJVppCoreFacade jvppFacade = new FutureJVppCoreFacade(registry, new JVppCoreImpl())) {
- LOG.info("Successfully connected to VPP");
-
- testAdjacency(jvppFacade);
- LOG.info("Disconnecting...");
- }
- }
-
- public static void main(String[] args) throws Exception {
- testFutureApi();
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/NotificationUtils.java b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/NotificationUtils.java
deleted file mode 100644
index f82946c3..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/NotificationUtils.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.core.test;
-
-import java.io.PrintStream;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlags;
-import io.fd.vpp.jvpp.core.dto.SwInterfaceSetFlagsNotification;
-import io.fd.vpp.jvpp.core.dto.WantInterfaceEvents;
-
-final class NotificationUtils {
-
- private NotificationUtils() {}
-
- static PrintStream printNotification(final SwInterfaceSetFlagsNotification msg) {
- return System.out.printf("Received interface notification: ifc: %s%n", msg);
- }
-
- static SwInterfaceSetFlags getChangeInterfaceState() {
- final SwInterfaceSetFlags swInterfaceSetFlags = new SwInterfaceSetFlags();
- swInterfaceSetFlags.swIfIndex = 0;
- swInterfaceSetFlags.adminUpDown = 1;
- swInterfaceSetFlags.deleted = 0;
- return swInterfaceSetFlags;
- }
-
- static WantInterfaceEvents getEnableInterfaceNotificationsReq() {
- WantInterfaceEvents wantInterfaceEvents = new WantInterfaceEvents();
- wantInterfaceEvents.pid = 1;
- wantInterfaceEvents.enableDisable = 1;
- return wantInterfaceEvents;
- }
-
- static WantInterfaceEvents getDisableInterfaceNotificationsReq() {
- WantInterfaceEvents wantInterfaceEvents = new WantInterfaceEvents();
- wantInterfaceEvents.pid = 1;
- wantInterfaceEvents.enableDisable = 0;
- return wantInterfaceEvents;
- }
-}
diff --git a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/Readme.txt b/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/Readme.txt
deleted file mode 100644
index 1344dc9e..00000000
--- a/vpp-api/java/jvpp-core/io/fd/vpp/jvpp/core/test/Readme.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This package contains basic tests for jvpp. To run the tests:
-
-- Make sure VPP is running
-- From VPP's build-root/ folder execute:
- - sudo java -cp build-vpp-native/vpp-api/java/jvpp-registry-17.01.jar:build-vpp-native/vpp-api/java/jvpp-core-17.01.jar io.fd.vpp.jvpp.core.test.[test name]
-
-Available tests:
-CallbackApiTest - Similar to ControlPingTest, invokes more complex calls (e.g. interface dump) using low level JVpp APIs
-CallbackJVppFacadeNotificationTest - Tests interface notifications using Callback based JVpp facade
-CallbackJVppFacadeTest - Execution of more complex calls using Callback based JVpp facade
-CallbackNotificationApiTest - Tests interface notifications using low level JVpp APIs
-ControlPingTest - Simple test executing a single control ping using low level JVpp APIs
-CreateSubInterfaceTest - Tests sub-interface creation
-FutureApiNotificationTest - Tests interface notifications using Future based JVpp facade
-FutureApiTest - Execution of more complex calls using Future based JVpp facade
-L2AclTest - Tests L2 ACL creation
-LispAdjacencyTest - Tests lisp adjacency creation and read (custom vpe.api type support showcase)
diff --git a/vpp-api/java/jvpp-core/jvpp_core.c b/vpp-api/java/jvpp-core/jvpp_core.c
deleted file mode 100644
index ef4cb8e3..00000000
--- a/vpp-api/java/jvpp-core/jvpp_core.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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.
- */
-
-#include <vnet/vnet.h>
-
-#include <vpp/api/vpe_msg_enum.h>
-#define vl_typedefs /* define message structures */
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_endianfun
-
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_printfun
-
-#include <vnet/api_errno.h>
-#include <vlibapi/api.h>
-#include <vlibmemory/api.h>
-#include <jni.h>
-
-#include <jvpp-common/jvpp_common.h>
-
-// TODO: generate jvpp_plugin_name.c files (or at least reuse plugin's main structure)
-typedef struct {
- /* Base message index for the jvpp-core plugin */
- u16 msg_id_base;
-
- /* Pointer to shared memory queue */
- unix_shared_memory_queue_t * vl_input_queue;
-
- /* VPP api client index */
- u32 my_client_index;
-
- /* Callback object and class references enabling asynchronous Java calls */
- jobject callbackObject;
- jclass callbackClass;
-
-} core_main_t;
-
-core_main_t core_main __attribute__((aligned (64)));
-
-#include "io_fd_vpp_jvpp_core_JVppCoreImpl.h"
-#include "jvpp_core_gen.h"
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_core_JVppCoreImpl_init0
-(JNIEnv * env, jclass clazz, jobject callback, jlong queue_address, jint my_client_index) {
- core_main_t * plugin_main = &core_main;
- plugin_main->my_client_index = my_client_index;
- plugin_main->vl_input_queue = (unix_shared_memory_queue_t *)queue_address;
-
- plugin_main->callbackObject = (*env)->NewGlobalRef(env, callback);
- plugin_main->callbackClass = (jclass)(*env)->NewGlobalRef(env, (*env)->GetObjectClass(env, callback));
-
- #define _(N,n) \
- vl_msg_api_set_handlers(VL_API_##N, #n, \
- vl_api_##n##_t_handler, \
- vl_noop_handler, \
- vl_noop_handler, \
- vl_noop_handler, \
- sizeof(vl_api_##n##_t), 1);
- foreach_api_reply_handler;
- #undef _
-}
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_core_JVppCoreImpl_close0
-(JNIEnv *env, jclass clazz) {
- core_main_t * plugin_main = &core_main;
-
- // cleanup:
- (*env)->DeleteGlobalRef(env, plugin_main->callbackClass);
- (*env)->DeleteGlobalRef(env, plugin_main->callbackObject);
-
- plugin_main->callbackClass = NULL;
- plugin_main->callbackObject = NULL;
-}
-
-jint JNI_OnLoad(JavaVM *vm, void *reserved) {
- JNIEnv* env;
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return JNI_EVERSION;
- }
-
- if (cache_class_references(env) != 0) {
- clib_warning ("Failed to cache class references\n");
- return JNI_ERR;
- }
-
- return JNI_VERSION_1_8;
-}
-
-void JNI_OnUnload(JavaVM *vm, void *reserved) {
- JNIEnv* env;
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return;
- }
- delete_class_references(env);
-}
-
-
-
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVpp.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVpp.java
deleted file mode 100644
index 55f25a7b..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVpp.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import io.fd.vpp.jvpp.callback.JVppCallback;
-import io.fd.vpp.jvpp.dto.ControlPing;
-import io.fd.vpp.jvpp.dto.JVppRequest;
-
-/**
- * Base interface for plugin's Java API.
- */
-public interface JVpp extends AutoCloseable {
-
- /**
- * Sends request to vpp.
- *
- * @param request request to be sent
- * @return unique identifer of message in message queue
- * @throws VppInvocationException when message could not be sent
- */
- int send(final JVppRequest request) throws VppInvocationException;
-
- /**
- * Initializes plugin's Java API.
- *
- * @param registry plugin registry
- * @param callback called by vpe.api message handlers
- * @param queueAddress address of vpp shared memory queue
- * @param clientIndex vpp client identifier
- */
- void init(final JVppRegistry registry, final JVppCallback callback, final long queueAddress,
- final int clientIndex);
-
- /**
- * Sends control_ping message.
- *
- * @param controlPing request DTO
- * @return unique identifer of message in message queue
- * @throws VppInvocationException when message could not be sent
- */
- int controlPing(final ControlPing controlPing) throws VppInvocationException;
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistry.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistry.java
deleted file mode 100644
index 6535db02..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistry.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import io.fd.vpp.jvpp.callback.JVppCallback;
-
-/**
- * Manages VPP connection and stores plugin callbacks.
- */
-public interface JVppRegistry extends AutoCloseable {
-
- /**
- * Vpp connection managed by the registry.
- *
- * @return representation of vpp connection
- */
- VppConnection getConnection();
-
- /**
- * Registers callback and initializes Java API for given plugin.
- *
- * @param jvpp plugin name
- * @param callback callback provided by the plugin
- * @throws NullPointerException if name or callback is null
- * @throws IllegalArgumentException if plugin was already registered
- */
- void register(final JVpp jvpp, final JVppCallback callback);
-
- /**
- * Unregisters callback for the given plugin.
- *
- * @param name plugin name
- * @throws NullPointerException if name is null
- * @throws IllegalArgumentException if plugin was not registered
- */
- void unregister(final String name);
-
- /**
- * Returns callback registered for the plugin.
- *
- * @param name plugin name
- * @return callback provided by the plugin
- * @throws NullPointerException if name is null
- * @throws IllegalArgumentException if plugin was not registered
- */
- JVppCallback get(final String name);
-
- /**
- * Sends control ping. Reply handler calls callback registered for give plugin.
- *
- * Control ping is used for initial RX thread to Java thread attachment
- * that takes place in the plugin's JNI lib
- * and to wrap dump message replies in one list.
- *
- * VPP plugins don't have to provide special control ping, therefore
- * it is necessary to providing control ping support in JVppRegistry.
-
- * @param clazz identifies plugin that should receive ping callback
- * @return unique identifier of message in message queue
- */
- int controlPing(final Class<? extends JVpp> clazz) throws VppInvocationException;
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistryImpl.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistryImpl.java
deleted file mode 100644
index 98ef1c15..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/JVppRegistryImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import static java.util.Objects.requireNonNull;
-
-import io.fd.vpp.jvpp.callback.ControlPingCallback;
-import io.fd.vpp.jvpp.callback.JVppCallback;
-import io.fd.vpp.jvpp.dto.ControlPingReply;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Default implementation of JVppRegistry.
- */
-public final class JVppRegistryImpl implements JVppRegistry, ControlPingCallback {
-
- private static final Logger LOG = Logger.getLogger(JVppRegistryImpl.class.getName());
-
- private final VppJNIConnection connection;
- // Unguarded concurrent map, no race conditions expected on top of that
- private final Map<String, JVppCallback> pluginRegistry;
- // Guarded by self
- private final Map<Integer, ControlPingCallback> pingCalls;
-
- public JVppRegistryImpl(final String clientName) throws IOException {
- connection = new VppJNIConnection(clientName);
- connection.connect();
- pluginRegistry = new ConcurrentHashMap<>();
- pingCalls = new HashMap<>();
- }
-
- @Override
- public VppConnection getConnection() {
- return connection;
- }
-
- @Override
- public void register(final JVpp jvpp, final JVppCallback callback) {
- requireNonNull(jvpp, "jvpp should not be null");
- requireNonNull(callback, "Callback should not be null");
- final String name = jvpp.getClass().getName();
- if (pluginRegistry.containsKey(name)) {
- throw new IllegalArgumentException(
- String.format("Callback for plugin %s was already registered", name));
- }
- jvpp.init(this, callback, connection.getConnectionInfo().queueAddress,
- connection.getConnectionInfo().clientIndex);
- pluginRegistry.put(name, callback);
- }
-
- @Override
- public void unregister(final String name) {
- requireNonNull(name, "Plugin name should not be null");
- final JVppCallback previous = pluginRegistry.remove(name);
- assertPluginWasRegistered(name, previous);
- }
-
- @Override
- public JVppCallback get(final String name) {
- requireNonNull(name, "Plugin name should not be null");
- JVppCallback value = pluginRegistry.get(name);
- assertPluginWasRegistered(name, value);
- return value;
- }
-
- private native int controlPing0() throws VppInvocationException;
-
- @Override
- public int controlPing(final Class<? extends JVpp> clazz) throws VppInvocationException {
- connection.checkActive();
- final String name = clazz.getName();
-
- final ControlPingCallback callback = (ControlPingCallback) pluginRegistry.get(clazz.getName());
- assertPluginWasRegistered(name, callback);
-
- synchronized (pingCalls) {
- int context = controlPing0();
- if (context < 0) {
- throw new VppInvocationException("controlPing", context);
- }
-
- pingCalls.put(context, callback);
- return context;
- }
- }
-
- @Override
- public void onControlPingReply(final ControlPingReply reply) {
- final ControlPingCallback callback;
- synchronized (pingCalls) {
- callback = pingCalls.remove(reply.context);
- if (callback == null) {
- LOG.log(Level.WARNING, "No callback was registered for reply context=" + reply.context + " Contexts waiting="
- + pingCalls.keySet());
- return;
- }
- }
- // pass the reply to the callback registered by the ping caller
- callback.onControlPingReply(reply);
- }
-
- @Override
- public void onError(final VppCallbackException ex) {
- final int ctxId = ex.getCtxId();
- final ControlPingCallback callback;
-
- synchronized (pingCalls) {
- callback = pingCalls.get(ctxId);
- }
- if (callback == null) {
- LOG.log(Level.WARNING, "No callback was registered for reply id={0} ", ctxId);
- return;
- }
- // pass the error to the callback registered by the ping caller
- callback.onError(ex);
- }
-
- private static void assertPluginWasRegistered(final String name, final JVppCallback value) {
- if (value == null) {
- throw new IllegalArgumentException(String.format("Callback for plugin %s is not registered", name));
- }
- }
-
- @Override
- public void close() throws Exception {
- connection.close();
- }
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/NativeLibraryLoader.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/NativeLibraryLoader.java
deleted file mode 100644
index ce6d1bfc..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/NativeLibraryLoader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.PosixFilePermission;
-import java.nio.file.attribute.PosixFilePermissions;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Utility class for loading JNI libraries.
- */
-public final class NativeLibraryLoader {
-
- private static final Logger LOG = Logger.getLogger(NativeLibraryLoader.class.getName());
-
- private NativeLibraryLoader() {
- throw new UnsupportedOperationException("This utility class cannot be instantiated.");
- }
-
- /**
- * Loads JNI library using class loader of the given class.
- *
- * @param libName name of the library to be loaded
- */
- public static void loadLibrary(final String libName, final Class clazz) throws IOException {
- java.util.Objects.requireNonNull(libName, "libName should not be null");
- java.util.Objects.requireNonNull(clazz, "clazz should not be null");
- try (final InputStream is = clazz.getResourceAsStream('/' + libName)) {
- if (is == null) {
- throw new IOException("Failed to open library resource " + libName);
- }
- loadStream(libName, is);
- }
- }
-
- private static void loadStream(final String libName, final InputStream is) throws IOException {
- final Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
- final Path p = Files.createTempFile(libName, null, PosixFilePermissions.asFileAttribute(perms));
- try {
- Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
- Runtime.getRuntime().load(p.toString());
- } catch (Exception e) {
- throw new IOException("Failed to load library " + p, e);
- } finally {
- try {
- Files.deleteIfExists(p);
- } catch (IOException e) {
- LOG.log(Level.WARNING, String.format("Failed to delete temporary file %s.", p), e);
- }
- }
- }
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java
deleted file mode 100644
index d71e3055..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppBaseCallException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-/**
- * Base exception representing failed operation of JVpp request call
- */
-public abstract class VppBaseCallException extends Exception {
- private final String methodName;
- private final int errorCode;
-
- /**
- * Constructs an VppCallbackException with the specified api method name and error code.
- *
- * @param methodName name of a method, which invocation or execution failed
- * @param errorCode negative error code value associated with this failure
- * @throws NullPointerException if apiMethodName is null
- */
- public VppBaseCallException(final String methodName, final int errorCode) {
- super(String.format("vppApi.%s failed with error code: %d", methodName, errorCode));
- this.methodName = java.util.Objects.requireNonNull(methodName, "apiMethodName is null!");
- this.errorCode = errorCode;
- if(errorCode >= 0) {
- throw new IllegalArgumentException("Error code must be < 0. Was " + errorCode +
- " for " + methodName );
- }
- }
-
- /**
- * Returns name of a method, which invocation failed.
- *
- * @return method name
- */
- public String getMethodName() {
- return methodName;
- }
-
- /**
- * Returns the error code associated with this failure.
- *
- * @return a negative integer error code
- */
- public int getErrorCode() {
- return errorCode;
- }
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java
deleted file mode 100644
index ccfcbd3c..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppCallbackException.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-/**
- * Callback Exception representing failed operation of JVpp request call
- */
-public class VppCallbackException extends VppBaseCallException {
- private final int ctxId;
-
- /**
- * Constructs an VppCallbackException with the specified api method name and error code.
- *
- * @param methodName name of a method, which invocation failed.
- * @param ctxId api request context identifier
- * @param errorCode negative error code value associated with this failure
- * @throws NullPointerException if apiMethodName is null
- */
- public VppCallbackException(final String methodName, final int ctxId, final int errorCode ){
- super(methodName, errorCode);
- this.ctxId = ctxId;
- }
-
- /**
- * Returns api request context identifier.
- *
- * @return value of context identifier
- */
- public int getCtxId() {
- return ctxId;
- }
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppConnection.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppConnection.java
deleted file mode 100644
index e6fd3bdb..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppConnection.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import java.io.IOException;
-
-/**
- * Representation of a management connection to VPP.
- */
-public interface VppConnection extends AutoCloseable {
-
- /**
- * Opens VppConnection for communication with VPP.
- *
- * @throws IOException if connection is not established
- */
- void connect() throws IOException;
-
- /**
- * Checks if this instance connection is active.
- *
- * @throws IllegalStateException if this instance was disconnected.
- */
- void checkActive();
-
- /**
- * Closes Vpp connection.
- */
- @Override
- void close();
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppInvocationException.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppInvocationException.java
deleted file mode 100644
index a7ccb197..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppInvocationException.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-/**
- * Exception thrown when Vpp jAPI method invocation failed.
- */
-public class VppInvocationException extends VppBaseCallException {
- /**
- * Constructs an VppApiInvocationFailedException with the specified api method name and error code.
- *
- * @param methodName name of a method, which invocation failed.
- * @param errorCode negative error code value associated with this failure
- * @throws NullPointerException if apiMethodName is null
- */
- public VppInvocationException(final String methodName, final int errorCode) {
- super(methodName, errorCode);
- }
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppJNIConnection.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppJNIConnection.java
deleted file mode 100644
index 7178bcf7..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/VppJNIConnection.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp;
-
-import static io.fd.vpp.jvpp.NativeLibraryLoader.loadLibrary;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * JNI based representation of a management connection to VPP.
- */
-public final class VppJNIConnection implements VppConnection {
- private static final Logger LOG = Logger.getLogger(VppJNIConnection.class.getName());
-
- static {
- final String libName = "libjvpp_registry.so.0.0.0";
- try {
- loadLibrary(libName, VppJNIConnection.class);
- } catch (IOException e) {
- LOG.log(Level.SEVERE, String.format("Can't find vpp jni library: %s", libName), e);
- throw new ExceptionInInitializerError(e);
- }
- }
-
- private ConnectionInfo connectionInfo;
-
- private final String clientName;
- private volatile boolean disconnected = false;
-
- /**
- * Create VPPJNIConnection instance for client connecting to VPP.
- *
- * @param clientName client name instance to be used for communication. Single connection per clientName is
- * allowed.
- */
- public VppJNIConnection(final String clientName) {
- this.clientName = Objects.requireNonNull(clientName, "Null clientName");
- }
-
- /**
- * Guarded by VppJNIConnection.class
- */
- private static final Map<String, VppJNIConnection> connections = new HashMap<>();
-
- /**
- * Initiate VPP connection for current instance
- *
- * Multiple instances are allowed since this class is not a singleton (VPP allows multiple management connections).
- *
- * However only a single connection per clientName is allowed.
- *
- * @throws IOException in case the connection could not be established
- */
-
- @Override
- public void connect() throws IOException {
- _connect();
- }
-
- private void _connect() throws IOException {
- synchronized (VppJNIConnection.class) {
- if (connections.containsKey(clientName)) {
- throw new IOException("Client " + clientName + " already connected");
- }
-
- connectionInfo = clientConnect(clientName);
- if (connectionInfo.status != 0) {
- throw new IOException("Connection returned error " + connectionInfo.status);
- }
- connections.put(clientName, this);
- }
- }
-
- @Override
- public final void checkActive() {
- if (disconnected) {
- throw new IllegalStateException("Disconnected client " + clientName);
- }
- }
-
- @Override
- public final synchronized void close() {
- if (!disconnected) {
- disconnected = true;
- try {
- clientDisconnect();
- } finally {
- synchronized (VppJNIConnection.class) {
- connections.remove(clientName);
- }
- }
- }
- }
-
- public ConnectionInfo getConnectionInfo() {
- return connectionInfo;
- }
-
- /**
- * VPP connection information used by plugins to reuse the connection.
- */
- public static final class ConnectionInfo {
- public final long queueAddress;
- public final int clientIndex;
- public final int status; // FIXME throw exception instead
-
- public ConnectionInfo(long queueAddress, int clientIndex, int status) {
- this.queueAddress = queueAddress;
- this.clientIndex = clientIndex;
- this.status = status;
- }
- }
-
- private static native ConnectionInfo clientConnect(String clientName);
-
- private static native void clientDisconnect();
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/ControlPingCallback.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/ControlPingCallback.java
deleted file mode 100644
index efddfdbb..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/ControlPingCallback.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.callback;
-
-import io.fd.vpp.jvpp.dto.ControlPingReply;
-
-/**
- * Represents callback for control_ping message.
- */
-public interface ControlPingCallback extends JVppCallback {
-
- void onControlPingReply(ControlPingReply reply);
-
-}
-
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppCallback.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppCallback.java
deleted file mode 100644
index ae02063b..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppCallback.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.callback;
-import io.fd.vpp.jvpp.VppCallbackException;
-
-/**
- * Base JVppCallback interface
- */
-public interface JVppCallback {
- /**
- * onError callback handler used to report failing operation
- * @param ex VppCallbackException object containing details about failing operation
- */
- void onError(VppCallbackException ex);
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppNotificationCallback.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppNotificationCallback.java
deleted file mode 100644
index 8ab0cb21..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/callback/JVppNotificationCallback.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.callback;
-
-/**
-* Notification callback
-*/
-public interface JVppNotificationCallback {
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPing.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPing.java
deleted file mode 100644
index 984e1674..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPing.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.VppInvocationException;
-
-/**
- * Represents request DTO for control_ping message.
- */
-public final class ControlPing implements JVppRequest {
-
- @Override
- public int send(final JVpp jvpp) throws VppInvocationException {
- return jvpp.controlPing(this);
- }
-
-}
-
-
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPingReply.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPingReply.java
deleted file mode 100644
index 61e4d0e4..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/ControlPingReply.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-import java.util.Objects;
-
-/**
- * Represents reply DTO for control_ping message.
- */
-public final class ControlPingReply implements JVppReply<ControlPing> {
-
- public int context;
- public int clientIndex;
- public int vpePid;
-
- @Override
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- final ControlPingReply that = (ControlPingReply) o;
- return context == that.context &&
- clientIndex == that.clientIndex &&
- vpePid == that.vpePid;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(context, clientIndex, vpePid);
- }
-
- @Override
- public String toString() {
- return "ControlPingReply{" +
- "context=" + context +
- ", clientIndex=" + clientIndex +
- ", vpePid=" + vpePid +
- '}';
- }
-}
-
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppDump.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppDump.java
deleted file mode 100644
index 60b98984..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppDump.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-/**
-* Base interface for all dump requests
-*/
-public interface JVppDump extends JVppRequest {
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppNotification.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppNotification.java
deleted file mode 100644
index 5554f501..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppNotification.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-/**
-* Base interface for all notification DTOs
-*/
-public interface JVppNotification {
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReply.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReply.java
deleted file mode 100644
index 73f512d4..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReply.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-/**
-* Base interface for all reply DTOs
-*/
-public interface JVppReply<REQ extends JVppRequest> {
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReplyDump.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReplyDump.java
deleted file mode 100644
index 15111395..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppReplyDump.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-/**
-* Base interface for all dump replies
-*/
-public interface JVppReplyDump<REQ extends JVppRequest, RESP extends JVppReply<REQ>>
- extends JVppReply<REQ> {
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppRequest.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppRequest.java
deleted file mode 100644
index 9b301da2..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/dto/JVppRequest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.dto;
-
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.VppInvocationException;
-
-/**
-* Base interface for all request DTOs
-*/
-public interface JVppRequest {
-
- /**
- * Invoke current operation asynchronously on VPP
- *
- * @return context id of this request. Can be used to track incoming response
- */
- int send(JVpp jvpp) throws VppInvocationException;
-
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/AbstractFutureJVppInvoker.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/AbstractFutureJVppInvoker.java
deleted file mode 100644
index e7df528a..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/AbstractFutureJVppInvoker.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.future;
-
-
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.CompletionStage;
-import io.fd.vpp.jvpp.JVpp;
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.VppInvocationException;
-import io.fd.vpp.jvpp.dto.JVppDump;
-import io.fd.vpp.jvpp.dto.JVppReply;
-import io.fd.vpp.jvpp.dto.JVppReplyDump;
-import io.fd.vpp.jvpp.dto.JVppRequest;
-
-/**
- * Future facade on top of JVpp
- */
-public abstract class AbstractFutureJVppInvoker implements FutureJVppInvoker {
-
- private final JVpp jvpp;
- private final JVppRegistry registry;
-
- /**
- * Guarded by self
- */
- private final Map<Integer, CompletableFuture<? extends JVppReply<?>>> requests;
-
- protected AbstractFutureJVppInvoker(final JVpp jvpp, final JVppRegistry registry,
- final Map<Integer, CompletableFuture<? extends JVppReply<?>>> requestMap) {
- this.jvpp = Objects.requireNonNull(jvpp, "jvpp should not be null");
- this.registry = Objects.requireNonNull(registry, "registry should not be null");
- // Request map represents the shared state between this facade and it's callback
- // where facade puts futures in and callback completes + removes them
- this.requests = Objects.requireNonNull(requestMap, "Null requestMap");
- }
-
- protected final Map<Integer, CompletableFuture<? extends JVppReply<?>>> getRequests() {
- synchronized (requests) {
- return requests;
- }
- }
-
- // TODO use Optional in Future, java8
-
- @Override
- @SuppressWarnings("unchecked")
- public <REQ extends JVppRequest, REPLY extends JVppReply<REQ>> CompletionStage<REPLY> send(REQ req) {
- synchronized(requests) {
- try {
- final CompletableFuture<REPLY> replyCompletableFuture;
- final int contextId = jvpp.send(req);
-
- if(req instanceof JVppDump) {
- throw new IllegalArgumentException("Send with empty reply dump has to be used in case of dump calls");
- }
- replyCompletableFuture = new CompletableFuture<>();
- requests.put(contextId, replyCompletableFuture);
-
- // TODO in case of timeouts/missing replies, requests from the map are not removed
- // consider adding cancel method, that would remove requests from the map and cancel
- // associated replyCompletableFuture
-
- return replyCompletableFuture;
- } catch (VppInvocationException ex) {
- final CompletableFuture<REPLY> replyCompletableFuture = new CompletableFuture<>();
- replyCompletableFuture.completeExceptionally(ex);
- return replyCompletableFuture;
- }
- }
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public <REQ extends JVppRequest, REPLY extends JVppReply<REQ>, DUMP extends JVppReplyDump<REQ, REPLY>> CompletionStage<DUMP> send(
- REQ req, DUMP emptyReplyDump) {
- synchronized(requests) {
- try {
- final CompletableDumpFuture<DUMP> replyCompletableFuture;
- final int contextId = jvpp.send(req);
-
- if(!(req instanceof JVppDump)) {
- throw new IllegalArgumentException("Send without empty reply dump has to be used in case of regular calls");
- }
- replyCompletableFuture = new CompletableDumpFuture<>(contextId, emptyReplyDump);
-
- requests.put(contextId, replyCompletableFuture);
- requests.put(registry.controlPing(jvpp.getClass()), replyCompletableFuture);
-
- // TODO in case of timeouts/missing replies, requests from the map are not removed
- // consider adding cancel method, that would remove requests from the map and cancel
- // associated replyCompletableFuture
-
- return replyCompletableFuture;
- } catch (VppInvocationException ex) {
- final CompletableFuture<DUMP> replyCompletableFuture = new CompletableFuture<>();
- replyCompletableFuture.completeExceptionally(ex);
- return replyCompletableFuture;
- }
- }
- }
-
- public static final class CompletableDumpFuture<T extends JVppReplyDump<?, ?>> extends CompletableFuture<T> {
- private final T replyDump;
- private final int contextId;
-
- public CompletableDumpFuture(final int contextId, final T emptyDump) {
- this.contextId = contextId;
- this.replyDump = emptyDump;
- }
-
- public int getContextId() {
- return contextId;
- }
-
- public T getReplyDump() {
- return replyDump;
- }
- }
-
- @Override
- public void close() throws Exception {
- jvpp.close();
- }
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/FutureJVppInvoker.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/FutureJVppInvoker.java
deleted file mode 100644
index 7a48e418..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/future/FutureJVppInvoker.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.future;
-
-
-import io.fd.vpp.jvpp.dto.JVppReply;
-import io.fd.vpp.jvpp.dto.JVppReplyDump;
-import io.fd.vpp.jvpp.dto.JVppRequest;
-
-import java.util.concurrent.CompletionStage;
-import io.fd.vpp.jvpp.notification.NotificationRegistryProvider;
-
-/**
-* Future facade on top of JVpp
-*/
-public interface FutureJVppInvoker extends NotificationRegistryProvider, AutoCloseable {
-
- /**
- * Invoke asynchronous operation on VPP
- *
- * @return CompletionStage with future result of an async VPP call
- * @throws io.fd.vpp.jvpp.VppInvocationException when send request failed with details
- */
- <REQ extends JVppRequest, REPLY extends JVppReply<REQ>> CompletionStage<REPLY> send(REQ req);
-
-
- /**
- * Invoke asynchronous dump operation on VPP
- *
- * @return CompletionStage with aggregated future result of an async VPP dump call
- * @throws io.fd.vpp.jvpp.VppInvocationException when send request failed with details
- */
- <REQ extends JVppRequest, REPLY extends JVppReply<REQ>, DUMP extends JVppReplyDump<REQ, REPLY>> CompletionStage<DUMP> send(
- REQ req, DUMP emptyReplyDump);
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistry.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistry.java
deleted file mode 100644
index 3c72ff79..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistry.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.notification;
-
-/**
- * Base registry for notification callbacks.
- */
-public interface NotificationRegistry extends AutoCloseable {
-
- void close();
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistryProvider.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistryProvider.java
deleted file mode 100644
index 4a6e06b7..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/notification/NotificationRegistryProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.notification;
-
-/**
- * Provides notification registry
- */
-public interface NotificationRegistryProvider {
-
- /**
- * Get current notification registry instance
- */
- NotificationRegistry getNotificationRegistry();
-}
diff --git a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/test/ConnectionTest.java b/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/test/ConnectionTest.java
deleted file mode 100644
index 27b4d29f..00000000
--- a/vpp-api/java/jvpp-registry/io/fd/vpp/jvpp/test/ConnectionTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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 io.fd.vpp.jvpp.test;
-
-import io.fd.vpp.jvpp.JVppRegistry;
-import io.fd.vpp.jvpp.JVppRegistryImpl;
-
-/**
- * Run using:
- * sudo java -cp build-vpp-native/vpp-api/java/jvpp-registry-16.09.jar io.fd.vpp.jvpp.test.ConnectionTest
- */
-public class ConnectionTest {
-
- private static void testConnect() throws Exception {
- System.out.println("Testing JNI connection with JVppRegistry");
- final JVppRegistry registry = new JVppRegistryImpl("ConnectionTest");
- try {
- System.out.println("Successfully connected to vpp");
- Thread.sleep(5000);
- System.out.println("Disconnecting...");
- Thread.sleep(1000);
- } finally {
- registry.close();
- }
- }
-
- public static void main(String[] args) throws Exception {
- testConnect();
- }
-}
diff --git a/vpp-api/java/jvpp-registry/jvpp_registry.c b/vpp-api/java/jvpp-registry/jvpp_registry.c
deleted file mode 100644
index cbd5e0ab..00000000
--- a/vpp-api/java/jvpp-registry/jvpp_registry.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * 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.
- */
-#define _GNU_SOURCE /* for strcasestr(3) */
-#include <vnet/vnet.h>
-
-#define vl_api_version(n,v) static u32 vpe_api_version = (v);
-#include <vpp/api/vpe.api.h>
-#undef vl_api_version
-
-
-#include <jni.h>
-#include <jvpp-common/jvpp_common.h>
-#include "io_fd_vpp_jvpp_VppJNIConnection.h"
-#include "io_fd_vpp_jvpp_JVppRegistryImpl.h"
-
-#include <vpp/api/vpe_msg_enum.h>
-#define vl_typedefs /* define message structures */
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_typedefs
-
-#define vl_endianfun
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_endianfun
-
-/* instantiate all the print functions we know about */
-#define vl_print(handle, ...)
-#define vl_printfun
-#include <vpp/api/vpe_all_api_h.h>
-#undef vl_printfun
-
-vlib_main_t vlib_global_main;
-vlib_main_t **vlib_mains;
-
-/*
- * The Java runtime isn't compile w/ -fstack-protector,
- * so we have to supply missing external references for the
- * regular vpp libraries.
- */
-void __stack_chk_guard(void) __attribute__((weak));
-void __stack_chk_guard(void) {
-}
-
-typedef struct {
- /* UThread attachment */
- volatile u32 control_ping_result_ready;
- volatile i32 control_ping_retval;
-
- /* Control poing callback */
- jobject registryObject;
- jclass registryClass;
- jclass controlPingReplyClass;
- jclass callbackExceptionClass;
-
- /* Thread cleanup */
- pthread_key_t cleanup_rx_thread_key;
-
- /* Connected indication */
- volatile u8 is_connected;
-} jvpp_registry_main_t;
-
-jvpp_registry_main_t jvpp_registry_main __attribute__((aligned (64)));
-
-void vl_client_add_api_signatures(vl_api_memclnt_create_t *mp) {
- /*
- * Send the main API signature in slot 0. This bit of code must
- * match the checks in ../vpe/api/api.c: vl_msg_api_version_check().
- */
- mp->api_versions[0] = clib_host_to_net_u32(vpe_api_version);
-}
-
-/* cleanup handler for RX thread */
-static_always_inline void cleanup_rx_thread(void *arg) {
- jvpp_main_t * jm = &jvpp_main;
- jvpp_registry_main_t * rm = &jvpp_registry_main;
-
- vppjni_lock(jm, 99);
-
- int getEnvStat = (*jm->jvm)->GetEnv(jm->jvm, (void **) &(jm->jenv),
- JNI_VERSION_1_8);
- if (getEnvStat == JNI_EVERSION) {
- clib_warning("Unsupported JNI version\n");
- rm->control_ping_retval = VNET_API_ERROR_UNSUPPORTED_JNI_VERSION;
- goto out;
- } else if (getEnvStat != JNI_EDETACHED) {
- (*jm->jvm)->DetachCurrentThread(jm->jvm);
- }
- out: vppjni_unlock(jm);
-}
-
-static void vl_api_control_ping_reply_t_handler(
- vl_api_control_ping_reply_t * mp) {
- jvpp_main_t * jm = &jvpp_main;
- jvpp_registry_main_t * rm = &jvpp_registry_main;
- char was_thread_connected = 0;
-
- // attach to java thread if not attached
- int getEnvStat = (*jm->jvm)->GetEnv(jm->jvm, (void **) &(jm->jenv),
- JNI_VERSION_1_8);
- if (getEnvStat == JNI_EDETACHED) {
- if ((*jm->jvm)->AttachCurrentThread(jm->jvm, (void **) &(jm->jenv),
- NULL) != 0) {
- clib_warning("Failed to attach thread\n");
- rm->control_ping_retval =
- VNET_API_ERROR_FAILED_TO_ATTACH_TO_JAVA_THREAD;
- goto out;
- }
-
- // workaround as we can't use pthread_cleanup_push
- pthread_key_create(&rm->cleanup_rx_thread_key, cleanup_rx_thread);
- // destructor is only called if the value of key is non null
- pthread_setspecific(rm->cleanup_rx_thread_key, (void *) 1);
- was_thread_connected = 1;
- } else if (getEnvStat == JNI_EVERSION) {
- clib_warning("Unsupported JNI version\n");
- rm->control_ping_retval = VNET_API_ERROR_UNSUPPORTED_JNI_VERSION;
- goto out;
- }
-
- if (was_thread_connected == 0) {
- JNIEnv *env = jm->jenv;
- if (mp->retval < 0) {
- call_on_error("controlPing", mp->context, mp->retval,
- rm->registryClass, rm->registryObject,
- rm->callbackExceptionClass);
- } else {
- jmethodID constructor = (*env)->GetMethodID(env,
- rm->controlPingReplyClass, "<init>", "()V");
- jmethodID callbackMethod = (*env)->GetMethodID(env,
- rm->registryClass, "onControlPingReply",
- "(Lio/fd/vpp/jvpp/dto/ControlPingReply;)V");
-
- jobject dto = (*env)->NewObject(env, rm->controlPingReplyClass,
- constructor);
-
- jfieldID contextFieldId = (*env)->GetFieldID(env,
- rm->controlPingReplyClass, "context", "I");
- (*env)->SetIntField(env, dto, contextFieldId,
- clib_net_to_host_u32(mp->context));
-
- jfieldID clientIndexFieldId = (*env)->GetFieldID(env,
- rm->controlPingReplyClass, "clientIndex", "I");
- (*env)->SetIntField(env, dto, clientIndexFieldId,
- clib_net_to_host_u32(mp->client_index));
-
- jfieldID vpePidFieldId = (*env)->GetFieldID(env,
- rm->controlPingReplyClass, "vpePid", "I");
- (*env)->SetIntField(env, dto, vpePidFieldId,
- clib_net_to_host_u32(mp->vpe_pid));
-
- (*env)->CallVoidMethod(env, rm->registryObject, callbackMethod,
- dto);
- (*env)->DeleteLocalRef(env, dto);
- }
- }
-
- out: rm->control_ping_result_ready = 1;
-}
-
-static int send_initial_control_ping() {
- f64 timeout;
- clib_time_t clib_time;
- vl_api_control_ping_t * mp;
- jvpp_main_t * jm = &jvpp_main;
- jvpp_registry_main_t * rm = &jvpp_registry_main;
-
- clib_time_init(&clib_time);
-
- rm->control_ping_result_ready = 0;
- mp = vl_msg_api_alloc(sizeof(*mp));
- memset(mp, 0, sizeof(*mp));
- mp->_vl_msg_id = ntohs(VL_API_CONTROL_PING);
- mp->client_index = jm->my_client_index;
-
- // send message:
- vl_msg_api_send_shmem(jm->vl_input_queue, (u8 *) &mp);
-
- // wait for results: Current time + 10 seconds is the timeout
- timeout = clib_time_now(&clib_time) + 10.0;
- int rv = VNET_API_ERROR_RESPONSE_NOT_READY;
- while (clib_time_now(&clib_time) < timeout) {
- if (rm->control_ping_result_ready == 1) {
- rv = rm->control_ping_retval;
- break;
- }
- }
-
- if (rv != 0) {
- clib_warning("common: first control ping failed: %d", rv);
- }
-
- return rv;
-}
-
-static int connect_to_vpe(char *name) {
- jvpp_main_t * jm = &jvpp_main;
- api_main_t * am = &api_main;
-
- if (vl_client_connect_to_vlib("/vpe-api", name, 32) < 0)
- return -1;
-
- jm->my_client_index = am->my_client_index;
-
- jm->vl_input_queue = am->shmem_hdr->vl_input_queue;
-
- vl_msg_api_set_handlers(VL_API_CONTROL_PING_REPLY, "control_ping_reply",
- vl_api_control_ping_reply_t_handler, vl_noop_handler,
- vl_api_control_ping_reply_t_endian,
- vl_api_control_ping_reply_t_print,
- sizeof(vl_api_control_ping_reply_t), 1);
-
- return send_initial_control_ping();
-}
-
-JNIEXPORT jobject JNICALL Java_io_fd_vpp_jvpp_VppJNIConnection_clientConnect(
- JNIEnv *env, jclass obj, jstring clientName) {
- int rv;
- const char *client_name;
- void vl_msg_reply_handler_hookup(void);
- jvpp_main_t * jm = &jvpp_main;
- jvpp_registry_main_t * rm = &jvpp_registry_main;
-
- jclass connectionInfoClass = (*env)->FindClass(env,
- "io/fd/vpp/jvpp/VppJNIConnection$ConnectionInfo");
- jmethodID connectionInfoConstructor = (*env)->GetMethodID(env,
- connectionInfoClass, "<init>", "(JII)V");
-
- /*
- * Bail out now if we're not running as root
- */
- if (geteuid() != 0) {
- return (*env)->NewObject(env, connectionInfoClass,
- connectionInfoConstructor, 0, 0,
- VNET_API_ERROR_NOT_RUNNING_AS_ROOT);
- }
-
- if (rm->is_connected) {
- return (*env)->NewObject(env, connectionInfoClass,
- connectionInfoConstructor, 0, 0,
- VNET_API_ERROR_ALREADY_CONNECTED);
- }
-
- client_name = (*env)->GetStringUTFChars(env, clientName, 0);
- if (!client_name) {
- return (*env)->NewObject(env, connectionInfoClass,
- connectionInfoConstructor, 0, 0, VNET_API_ERROR_INVALID_VALUE);
- }
-
- rv = connect_to_vpe((char *) client_name);
-
- if (rv < 0)
- clib_warning("connection failed, rv %d", rv);
-
- (*env)->ReleaseStringUTFChars(env, clientName, client_name);
-
- return (*env)->NewObject(env, connectionInfoClass,
- connectionInfoConstructor, (jlong) jm->vl_input_queue,
- (jint) jm->my_client_index, (jint) rv);
-}
-
-JNIEXPORT jint JNICALL Java_io_fd_vpp_jvpp_JVppRegistryImpl_controlPing0(
- JNIEnv *env, jobject regstryObject) {
- jvpp_main_t * jm = &jvpp_main;
- vl_api_control_ping_t * mp;
- u32 my_context_id = vppjni_get_context_id(&jvpp_main);
- jvpp_registry_main_t * rm = &jvpp_registry_main;
-
- if (rm->registryObject == 0) {
- rm->registryObject = (*env)->NewGlobalRef(env, regstryObject);
- }
- if (rm->registryClass == 0) {
- rm->registryClass = (jclass) (*env)->NewGlobalRef(env,
- (*env)->GetObjectClass(env, regstryObject));
- }
-
- mp = vl_msg_api_alloc(sizeof(*mp));
- memset(mp, 0, sizeof(*mp));
- mp->_vl_msg_id = ntohs(VL_API_CONTROL_PING);
- mp->client_index = jm->my_client_index;
- mp->context = clib_host_to_net_u32(my_context_id);
-
- // send message:
- vl_msg_api_send_shmem(jm->vl_input_queue, (u8 *) &mp);
- return my_context_id;
-}
-
-JNIEXPORT void JNICALL Java_io_fd_vpp_jvpp_VppJNIConnection_clientDisconnect(
- JNIEnv *env, jclass clazz) {
- jvpp_registry_main_t * rm = &jvpp_registry_main;
- rm->is_connected = 0; // TODO make thread safe
- vl_client_disconnect_from_vlib();
-
- // cleanup:
- if (rm->registryObject) {
- (*env)->DeleteGlobalRef(env, rm->registryObject);
- rm->registryObject = 0;
- }
- if (rm->registryClass) {
- (*env)->DeleteGlobalRef(env, rm->registryClass);
- rm->registryClass = 0;
- }
-}
-
-jint JNI_OnLoad(JavaVM *vm, void *reserved) {
- jvpp_main_t * jm = &jvpp_main;
- jvpp_registry_main_t * rm = &jvpp_registry_main;
- JNIEnv* env;
-
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return JNI_EVERSION;
- }
-
- rm->controlPingReplyClass = (jclass) (*env)->NewGlobalRef(env,
- (*env)->FindClass(env, "io/fd/vpp/jvpp/dto/ControlPingReply"));
- if ((*env)->ExceptionCheck(env)) {
- (*env)->ExceptionDescribe(env);
- clib_warning("Failed to cache class references\n");
- return JNI_ERR;
- }
-
- rm->callbackExceptionClass = (jclass) (*env)->NewGlobalRef(env,
- (*env)->FindClass(env, "io/fd/vpp/jvpp/VppCallbackException"));
- if ((*env)->ExceptionCheck(env)) {
- (*env)->ExceptionDescribe(env);
- return JNI_ERR;
- }
-
- jm->jvm = vm;
- return JNI_VERSION_1_8;
-}
-
-void JNI_OnUnload(JavaVM *vm, void *reserved) {
- jvpp_main_t * jm = &jvpp_main;
- JNIEnv* env;
- if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_8) != JNI_OK) {
- return;
- }
-
- jm->jenv = NULL;
- jm->jvm = NULL;
-}
diff --git a/vpp-api/java/jvpp/gen/jvpp_gen.py b/vpp-api/java/jvpp/gen/jvpp_gen.py
deleted file mode 100755
index 5f8df2a9..00000000
--- a/vpp-api/java/jvpp/gen/jvpp_gen.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#!/usr/bin/env python
-#
-# 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
-# l
-# 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.
-#
-
-import argparse
-import importlib
-import sys
-import os
-import json
-
-from jvppgen import types_gen
-from jvppgen import callback_gen
-from jvppgen import notification_gen
-from jvppgen import dto_gen
-from jvppgen import jvpp_callback_facade_gen
-from jvppgen import jvpp_future_facade_gen
-from jvppgen import jvpp_impl_gen
-from jvppgen import jvpp_c_gen
-from jvppgen import util
-
-blacklist = [ "memclnt.api", "flowperpkt.api" ]
-
-# Invocation:
-# ~/Projects/vpp/vpp-api/jvpp/gen$ mkdir -p java/io/fd/vpp/jvpp && cd java/io/fd/vpp/jvpp
-# ~/Projects/vpp/vpp-api/jvpp/gen/java/io/fd/vpp/jvpp$ ../../../../jvpp_gen.py -idefs_api_vpp_papi.py
-#
-# Compilation:
-# ~/Projects/vpp/vpp-api/jvpp/gen/java/io/fd/vpp/jvpp$ javac *.java dto/*.java callback/*.java
-#
-# where
-# defs_api_vpp_papi.py - vpe.api in python format (generated by vppapigen)
-
-parser = argparse.ArgumentParser(description='VPP Java API generator')
-parser.add_argument('-i', action="store", dest="inputfiles", nargs='+')
-parser.add_argument('--plugin_name', action="store", dest="plugin_name")
-args = parser.parse_args()
-
-sys.path.append(".")
-
-print "Generating Java API for %s" % args.inputfiles
-print "inputfiles %s" % args.inputfiles
-plugin_name = args.plugin_name
-print "plugin_name %s" % plugin_name
-
-cfg = {}
-
-for inputfile in args.inputfiles:
- if any(substring in inputfile for substring in blacklist):
- print "WARNING: Imput file %s blacklisted" % inputfile
- continue
- _cfg = json.load(open(inputfile, 'r'))
- if 'types' in cfg:
- cfg['types'].extend(_cfg['types'])
- else:
- cfg['types'] = _cfg['types']
- if 'messages' in cfg:
- cfg['messages'].extend(_cfg['messages'])
- else:
- cfg['messages'] = _cfg['messages']
-
-
-def is_request_field(field_name):
- return field_name not in {'_vl_msg_id', 'client_index', 'context'}
-
-
-def is_response_field(field_name):
- return field_name not in {'_vl_msg_id'}
-
-
-def get_args(t, filter):
- arg_list = []
- for i in t:
- if is_crc(i):
- continue
- if not filter(i[1]):
- continue
- arg_list.append(i[1])
- return arg_list
-
-
-def get_types(t, filter):
- types_list = []
- lengths_list = []
- crc = None
- for i in t:
- if is_crc(i):
- crc = ('crc', i['crc'][2:])
- continue
- if not filter(i[1]):
- continue
- if len(i) is 3: # array type
- types_list.append(i[0] + '[]')
- lengths_list.append((i[2], False))
- elif len(i) is 4: # variable length array type
- types_list.append(i[0] + '[]')
- lengths_list.append((i[3], True))
- else: # primitive type
- types_list.append(i[0])
- lengths_list.append((0, False))
- return types_list, lengths_list, crc
-
-
-def is_crc(arg):
- """ Check whether the argument inside message definition is just crc """
- return 'crc' in arg
-
-
-def get_definitions(defs):
- # Pass 1
- func_list = []
- func_name = {}
- for a in defs:
- java_name = util.underscore_to_camelcase(a[0])
-
- # For replies include all the arguments except message_id
- if util.is_reply(java_name):
- types, lengths, crc = get_types(a[1:], is_response_field)
- func_name[a[0]] = dict(
- [('name', a[0]), ('java_name', java_name),
- ('args', get_args(a[1:], is_response_field)), ('full_args', get_args(a[1:], lambda x: True)),
- ('types', types), ('lengths', lengths), crc])
- # For requests skip message_id, client_id and context
- else:
- types, lengths, crc = get_types(a[1:], is_request_field)
- func_name[a[0]] = dict(
- [('name', a[0]), ('java_name', java_name),
- ('args', get_args(a[1:], is_request_field)), ('full_args', get_args(a[1:], lambda x: True)),
- ('types', types), ('lengths', lengths), crc])
-
- # Indexed by name
- func_list.append(func_name[a[0]])
- return func_list, func_name
-
-
-base_package = 'io.fd.vpp.jvpp'
-plugin_package = base_package + '.' + plugin_name
-types_package = 'types'
-dto_package = 'dto'
-callback_package = 'callback'
-notification_package = 'notification'
-future_package = 'future'
-# TODO find better package name
-callback_facade_package = 'callfacade'
-
-types_list, types_name = get_definitions(cfg['types'])
-
-types_gen.generate_types(types_list, plugin_package, types_package, args.inputfiles)
-
-func_list, func_name = get_definitions(cfg['messages'])
-
-dto_gen.generate_dtos(func_list, base_package, plugin_package, plugin_name.title(), dto_package, args.inputfiles)
-jvpp_impl_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, args.inputfiles)
-callback_gen.generate_callbacks(func_list, base_package, plugin_package, plugin_name.title(), callback_package, dto_package, args.inputfiles)
-notification_gen.generate_notification_registry(func_list, base_package, plugin_package, plugin_name.title(), notification_package, callback_package, dto_package, args.inputfiles)
-jvpp_c_gen.generate_jvpp(func_list, plugin_name, args.inputfiles)
-jvpp_future_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, future_package, args.inputfiles)
-jvpp_callback_facade_gen.generate_jvpp(func_list, base_package, plugin_package, plugin_name.title(), dto_package, callback_package, notification_package, callback_facade_package, args.inputfiles)
-
-print "Java API for %s generated successfully" % args.inputfiles
diff --git a/vpp-api/java/jvpp/gen/jvppgen/__init__.py b/vpp-api/java/jvpp/gen/jvppgen/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/__init__.py
+++ /dev/null
diff --git a/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py b/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py
deleted file mode 100644
index 68f70126..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/callback_gen.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os
-import util
-from string import Template
-
-from util import remove_suffix
-
-callback_suffix = "Callback"
-
-callback_template = Template("""
-package $plugin_package.$callback_package;
-
-/**
- * <p>Represents callback for plugin's api file message.
- * <br>It was generated by callback_gen.py based on $inputfile preparsed data:
- * <pre>
-$docs
- * </pre>
- */
-public interface $cls_name extends $base_package.$callback_package.$callback_type {
-
- $callback_method
-
-}
-""")
-
-global_callback_template = Template("""
-package $plugin_package.$callback_package;
-
-/**
- * <p>Global aggregated callback interface.
- * <br>It was generated by callback_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface JVpp${plugin_name}GlobalCallback extends $base_package.$callback_package.ControlPingCallback, $callbacks {
-}
-""")
-
-
-def generate_callbacks(func_list, base_package, plugin_package, plugin_name, callback_package, dto_package, inputfile):
- """ Generates callback interfaces """
- print "Generating Callback interfaces"
-
- if not os.path.exists(callback_package):
- raise Exception("%s folder is missing" % callback_package)
-
- callbacks = []
- for func in func_list:
-
- camel_case_name_with_suffix = util.underscore_to_camelcase_upper(func['name'])
-
- if util.is_ignored(func['name']) or util.is_control_ping(camel_case_name_with_suffix):
- continue
- if not util.is_reply(camel_case_name_with_suffix) and not util.is_notification(func['name']):
- continue
-
- if util.is_reply(camel_case_name_with_suffix):
- camel_case_name = util.remove_reply_suffix(camel_case_name_with_suffix)
- callback_type = "JVppCallback"
- else:
- camel_case_name_with_suffix = util.add_notification_suffix(camel_case_name_with_suffix)
- camel_case_name = camel_case_name_with_suffix
- callback_type = "JVppNotificationCallback"
-
- callbacks.append("{0}.{1}.{2}".format(plugin_package, callback_package, camel_case_name + callback_suffix))
- callback_path = os.path.join(callback_package, camel_case_name + callback_suffix + ".java")
- callback_file = open(callback_path, 'w')
-
- reply_type = "%s.%s.%s" % (plugin_package, dto_package, camel_case_name_with_suffix)
- method = "void on{0}({1} reply);".format(camel_case_name_with_suffix, reply_type)
- callback_file.write(
- callback_template.substitute(inputfile=inputfile,
- docs=util.api_message_to_javadoc(func),
- cls_name=camel_case_name + callback_suffix,
- callback_method=method,
- base_package=base_package,
- plugin_package=plugin_package,
- callback_package=callback_package,
- callback_type=callback_type))
- callback_file.flush()
- callback_file.close()
-
- callback_file = open(os.path.join(callback_package, "JVpp%sGlobalCallback.java" % plugin_name), 'w')
- callback_file.write(global_callback_template.substitute(inputfile=inputfile,
- callbacks=", ".join(callbacks),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- callback_package=callback_package))
- callback_file.flush()
- callback_file.close()
diff --git a/vpp-api/java/jvpp/gen/jvppgen/dto_gen.py b/vpp-api/java/jvpp/gen/jvppgen/dto_gen.py
deleted file mode 100644
index a043c945..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/dto_gen.py
+++ /dev/null
@@ -1,308 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os
-from string import Template
-
-import util
-
-dto_template = Template("""
-package $plugin_package.$dto_package;
-
-/**
- * <p>This class represents $description.
- * <br>It was generated by dto_gen.py based on $inputfile preparsed data:
- * <pre>
-$docs
- * </pre>
- */
-public final class $cls_name implements $base_package.$dto_package.$base_type {
-
-$fields
-$methods
-}
-""")
-
-field_template = Template(""" public $type $name;\n""")
-
-send_template = Template(""" @Override
- public int send(final $base_package.JVpp jvpp) throws io.fd.vpp.jvpp.VppInvocationException {
- return (($plugin_package.JVpp${plugin_name})jvpp).$method_name($args);
- }""")
-
-
-def generate_dtos(func_list, base_package, plugin_package, plugin_name, dto_package, inputfile):
- """ Generates dto objects in a dedicated package """
- print "Generating DTOs"
-
- if not os.path.exists(dto_package):
- raise Exception("%s folder is missing" % dto_package)
-
- for func in func_list:
- camel_case_dto_name = util.underscore_to_camelcase_upper(func['name'])
- camel_case_method_name = util.underscore_to_camelcase(func['name'])
- dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")
-
- if util.is_ignored(func['name']) or util.is_control_ping(camel_case_dto_name):
- continue
-
- fields = generate_dto_fields(camel_case_dto_name, func)
- methods = generate_dto_base_methods(camel_case_dto_name, func)
- base_type = ""
-
- # Generate request/reply or dump/dumpReply even if structure can be used as notification
- if not util.is_just_notification(func["name"]):
- if util.is_reply(camel_case_dto_name):
- description = "reply DTO"
- request_dto_name = get_request_name(camel_case_dto_name, func['name'])
- if util.is_details(camel_case_dto_name):
- # FIXME assumption that dump calls end with "Dump" suffix. Not enforced in vpe.api
- base_type += "JVppReply<%s.%s.%s>" % (plugin_package, dto_package, request_dto_name + "Dump")
- generate_dump_reply_dto(request_dto_name, base_package, plugin_package, dto_package,
- camel_case_dto_name, camel_case_method_name, func)
- else:
- base_type += "JVppReply<%s.%s.%s>" % (plugin_package, dto_package, request_dto_name)
- else:
- args = "" if fields is "" else "this"
- methods += send_template.substitute(method_name=camel_case_method_name,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- args=args)
- if util.is_dump(camel_case_dto_name):
- base_type += "JVppDump"
- description = "dump request DTO"
- else:
- base_type += "JVppRequest"
- description = "request DTO"
-
- write_dto_file(base_package, plugin_package, base_type, camel_case_dto_name, description, dto_package,
- dto_path, fields, func, inputfile, methods)
-
- # for structures that are also used as notifications, generate dedicated notification DTO
- if util.is_notification(func["name"]):
- base_type = "JVppNotification"
- description = "notification DTO"
- camel_case_dto_name = util.add_notification_suffix(camel_case_dto_name)
- dto_path = os.path.join(dto_package, camel_case_dto_name + ".java")
- methods = generate_dto_base_methods(camel_case_dto_name, func)
- write_dto_file(base_package, plugin_package, base_type, camel_case_dto_name, description, dto_package,
- dto_path, fields, func, inputfile, methods)
-
- flush_dump_reply_dtos(inputfile)
-
-
-def generate_dto_base_methods(camel_case_dto_name, func):
- methods = generate_dto_hash(func)
- methods += generate_dto_equals(camel_case_dto_name, func)
- methods += generate_dto_tostring(camel_case_dto_name, func)
- return methods
-
-
-def generate_dto_fields(camel_case_dto_name, func):
- fields = ""
- for t in zip(func['types'], func['args']):
- # for retval don't generate dto field in Reply
- field_name = util.underscore_to_camelcase(t[1])
- if util.is_reply(camel_case_dto_name) and util.is_retval_field(field_name):
- continue
- fields += field_template.substitute(type=util.jni_2_java_type_mapping[t[0]],
- name=field_name)
- return fields
-
-
-tostring_field_template = Template(""" \"$field_name=\" + $field_name + ", " +\n""")
-tostring_array_field_template = Template(""" \"$field_name=\" + java.util.Arrays.toString($field_name) + ", " +\n""")
-tostring_template = Template(""" @Override
- public String toString() {
- return "$cls_name{" +
-$fields_tostring "}";
- }\n\n""")
-
-
-def generate_dto_tostring(camel_case_dto_name, func):
- tostring_fields = ""
- for t in zip(func['types'], func['args']):
-
- field_name = util.underscore_to_camelcase(t[1])
- # for retval don't generate dto field in Reply
- if util.is_retval_field(field_name):
- continue
-
- # handle array types
- if util.is_array(util.jni_2_java_type_mapping[t[0]]):
- tostring_fields += tostring_array_field_template.substitute(field_name=field_name)
- else:
- tostring_fields += tostring_field_template.substitute(field_name=field_name)
-
- return tostring_template.substitute(cls_name=camel_case_dto_name,
- fields_tostring=tostring_fields[:-8])
-
-equals_other_template = Template("""
- final $cls_name other = ($cls_name) o;
-\n""")
-equals_field_template = Template(""" if (!java.util.Objects.equals(this.$field_name, other.$field_name)) {
- return false;
- }\n""")
-equals_array_field_template = Template(""" if (!java.util.Arrays.equals(this.$field_name, other.$field_name)) {
- return false;
- }\n""")
-equals_template = Template(""" @Override
- public boolean equals(final Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
-$comparisons
- return true;
- }\n\n""")
-
-
-def generate_dto_equals(camel_case_dto_name, func):
- equals_fields = ""
- for t in zip(func['types'], func['args']):
- field_name = util.underscore_to_camelcase(t[1])
- # for retval don't generate dto field in Reply
- if util.is_retval_field(field_name):
- continue
-
- # handle array types
- if util.is_array(util.jni_2_java_type_mapping[t[0]]):
- equals_fields += equals_array_field_template.substitute(field_name=field_name)
- else:
- equals_fields += equals_field_template.substitute(field_name=field_name)
-
- if equals_fields != "":
- equals_fields = equals_other_template.substitute(cls_name=camel_case_dto_name) + equals_fields
-
- return equals_template.substitute(comparisons=equals_fields)
-
-
-hash_template = Template(""" @Override
- public int hashCode() {
- return java.util.Objects.hash($fields);
- }\n\n""")
-hash_single_array_type_template = Template(""" @Override
- public int hashCode() {
- return java.util.Arrays.hashCode($fields);
- }\n\n""")
-
-
-def generate_dto_hash(func):
- hash_fields = ""
-
- # Special handling for hashCode in case just a single array field is present. Cannot use Objects.equals since the
- # array is mistaken for a varargs parameter. Instead use Arrays.hashCode in such case.
- if len(func['args']) == 1:
- single_type = func['types'][0]
- single_type_name = func['args'][0]
- if util.is_array(util.jni_2_java_type_mapping[single_type]):
- return hash_single_array_type_template.substitute(fields=util.underscore_to_camelcase(single_type_name))
-
- for t in zip(func['types'], func['args']):
- field_name = util.underscore_to_camelcase(t[1])
- # for retval don't generate dto field in Reply
- if util.is_retval_field(field_name):
- continue
-
- hash_fields += field_name + ", "
-
- return hash_template.substitute(fields=hash_fields[:-2])
-
-
-def write_dto_file(base_package, plugin_package, base_type, camel_case_dto_name, description, dto_package, dto_path,
- fields, func, inputfile, methods):
- dto_file = open(dto_path, 'w')
- dto_file.write(dto_template.substitute(inputfile=inputfile,
- description=description,
- docs=util.api_message_to_javadoc(func),
- cls_name=camel_case_dto_name,
- fields=fields,
- methods=methods,
- base_package=base_package,
- plugin_package=plugin_package,
- base_type=base_type,
- dto_package=dto_package))
- dto_file.flush()
- dto_file.close()
-
-
-dump_dto_suffix = "ReplyDump"
-dump_reply_artificial_dtos = {}
-
-
-# Returns request name or special one from unconventional_naming_rep_req map
-def get_request_name(camel_case_dto_name, func_name):
- return util.underscore_to_camelcase_upper(
- util.unconventional_naming_rep_req[func_name]) if func_name in util.unconventional_naming_rep_req \
- else util.remove_reply_suffix(camel_case_dto_name)
-
-
-def flush_dump_reply_dtos(inputfile):
- for dump_reply_artificial_dto in dump_reply_artificial_dtos.values():
- dto_path = os.path.join(dump_reply_artificial_dto['dto_package'],
- dump_reply_artificial_dto['cls_name'] + ".java")
- dto_file = open(dto_path, 'w')
- dto_file.write(dto_template.substitute(inputfile=inputfile,
- description="dump reply wrapper",
- docs=dump_reply_artificial_dto['docs'],
- cls_name=dump_reply_artificial_dto['cls_name'],
- fields=dump_reply_artificial_dto['fields'],
- methods=dump_reply_artificial_dto['methods'],
- plugin_package=dump_reply_artificial_dto['plugin_package'],
- base_package=dump_reply_artificial_dto['base_package'],
- base_type=dump_reply_artificial_dto['base_type'],
- dto_package=dump_reply_artificial_dto['dto_package']))
- dto_file.flush()
- dto_file.close()
-
-
-def generate_dump_reply_dto(request_dto_name, base_package, plugin_package, dto_package, camel_case_dto_name,
- camel_case_method_name, func):
- base_type = "JVppReplyDump<%s.%s.%s, %s.%s.%s>" % (
- plugin_package, dto_package, util.remove_reply_suffix(camel_case_dto_name) + "Dump",
- plugin_package, dto_package, camel_case_dto_name)
- fields = " public java.util.List<%s> %s = new java.util.ArrayList<>();" % (camel_case_dto_name, camel_case_method_name)
- cls_name = camel_case_dto_name + dump_dto_suffix
- # using artificial type for fields, just to bypass the is_array check in base methods generators
- # the type is not really used
- artificial_type = 'u8'
-
- # In case of already existing artificial reply dump DTO, just update it
- # Used for sub-dump dtos
- if request_dto_name in dump_reply_artificial_dtos.keys():
- dump_reply_artificial_dtos[request_dto_name]['fields'] += '\n' + fields
- dump_reply_artificial_dtos[request_dto_name]['field_names'].append(func['name'])
- dump_reply_artificial_dtos[request_dto_name]['field_types'].append(artificial_type)
- methods = '\n' + generate_dto_base_methods(dump_reply_artificial_dtos[request_dto_name]['cls_name'],
- {'args': dump_reply_artificial_dtos[request_dto_name]['field_names'],
- 'types': dump_reply_artificial_dtos[request_dto_name]['field_types']})
- dump_reply_artificial_dtos[request_dto_name]['methods'] = methods
- else:
- methods = '\n' + generate_dto_base_methods(cls_name, {'args': [func['name']],
- 'types': [artificial_type]})
- dump_reply_artificial_dtos[request_dto_name] = ({'docs': util.api_message_to_javadoc(func),
- 'cls_name': cls_name,
- 'fields': fields,
- 'field_names': [func['name']],
- 'field_types': [artificial_type],
- # strip too many newlines at the end of base method block
- 'methods': methods,
- 'plugin_package': plugin_package,
- 'base_package': base_package,
- 'base_type': base_type,
- 'dto_package': dto_package})
diff --git a/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py
deleted file mode 100644
index 328cc8d3..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/jni_gen.py
+++ /dev/null
@@ -1,295 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-from string import Template
-
-import util
-
-variable_length_array_value_template = Template("""mp->${length_var_name}""")
-variable_length_array_template = Template("""clib_net_to_host_${length_field_type}(${value})""")
-
-dto_field_id_template = Template("""
- jfieldID ${field_reference_name}FieldId = (*env)->GetFieldID(env, ${class_ref_name}Class, "${field_name}", "${jni_signature}");""")
-
-default_dto_field_setter_template = Template("""
- (*env)->Set${jni_setter}(env, ${object_name}, ${field_reference_name}FieldId, mp->${c_name});
-""")
-
-variable_length_array_value_template = Template("""mp->${length_var_name}""")
-variable_length_array_template = Template("""clib_net_to_host_${length_field_type}(${value})""")
-
-u16_dto_field_setter_template = Template("""
- (*env)->Set${jni_setter}(env, ${object_name}, ${field_reference_name}FieldId, clib_net_to_host_u16(mp->${c_name}));
-""")
-
-u32_dto_field_setter_template = Template("""
- (*env)->Set${jni_setter}(env, ${object_name}, ${field_reference_name}FieldId, clib_net_to_host_u32(mp->${c_name}));
-""")
-
-u64_dto_field_setter_template = Template("""
- (*env)->Set${jni_setter}(env, ${object_name}, ${field_reference_name}FieldId, clib_net_to_host_u64(mp->${c_name}));
-""")
-
-u8_array_dto_field_setter_template = Template("""
- jbyteArray ${field_reference_name} = (*env)->NewByteArray(env, ${field_length});
- (*env)->SetByteArrayRegion(env, ${field_reference_name}, 0, ${field_length}, (const jbyte*)mp->${c_name});
- (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
- (*env)->DeleteLocalRef(env, ${field_reference_name});
-""")
-
-u16_array_dto_field_setter_template = Template("""
- {
- jshortArray ${field_reference_name} = (*env)->NewShortArray(env, ${field_length});
- jshort * ${field_reference_name}ArrayElements = (*env)->GetShortArrayElements(env, ${field_reference_name}, NULL);
- unsigned int _i;
- for (_i = 0; _i < ${field_length}; _i++) {
- ${field_reference_name}ArrayElements[_i] = clib_net_to_host_u16(mp->${c_name}[_i]);
- }
-
- (*env)->ReleaseShortArrayElements(env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
- (*env)->DeleteLocalRef(env, ${field_reference_name});
- }
-""")
-
-u32_array_dto_field_setter_template = Template("""
- {
- jintArray ${field_reference_name} = (*env)->NewIntArray(env, ${field_length});
- jint * ${field_reference_name}ArrayElements = (*env)->GetIntArrayElements(env, ${field_reference_name}, NULL);
- unsigned int _i;
- for (_i = 0; _i < ${field_length}; _i++) {
- ${field_reference_name}ArrayElements[_i] = clib_net_to_host_u32(mp->${c_name}[_i]);
- }
-
- (*env)->ReleaseIntArrayElements(env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
- (*env)->DeleteLocalRef(env, ${field_reference_name});
- }
-""")
-
-# For each u64 array we get its elements. Then we convert values to host byte order.
-# All changes to jlong* buffer are written to jlongArray (isCopy is set to NULL)
-u64_array_dto_field_setter_template = Template("""
- {
- jlongArray ${field_reference_name} = (*env)->NewLongArray(env, ${field_length});
- jlong * ${field_reference_name}ArrayElements = (*env)->GetLongArrayElements(env, ${field_reference_name}, NULL);
- unsigned int _i;
- for (_i = 0; _i < ${field_length}; _i++) {
- ${field_reference_name}ArrayElements[_i] = clib_net_to_host_u64(mp->${c_name}[_i]);
- }
-
- (*env)->ReleaseLongArrayElements(env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- (*env)->SetObjectField(env, ${object_name}, ${field_reference_name}FieldId, ${field_reference_name});
- (*env)->DeleteLocalRef(env, ${field_reference_name});
- }
-""")
-
-dto_field_setter_templates = {'u8': default_dto_field_setter_template,
- 'u16': u16_dto_field_setter_template,
- 'u32': u32_dto_field_setter_template,
- 'i32': u32_dto_field_setter_template,
- 'u64': u64_dto_field_setter_template,
- 'f64': default_dto_field_setter_template, # fixme
- 'u8[]': u8_array_dto_field_setter_template,
- 'u16[]': u16_array_dto_field_setter_template,
- 'u32[]': u32_array_dto_field_setter_template,
- 'u64[]': u64_array_dto_field_setter_template
- }
-
-
-def jni_reply_handler_for_type(handler_name, ref_name, field_type, c_name, field_reference_name,
- field_name, field_length, is_variable_len_array, length_field_type,
- object_name="dto"):
- """
- Generates jni code that initializes a field of java object (dto or custom type).
- To be used in reply message handlers.
- :param field_type: type of the field to be initialized (as defined in vpe.api)
- :param c_name: name of the message struct member that stores initialization value
- :param field_reference_name: name of the field reference in generated code
- :param field_name: name of the field (camelcase)
- :param field_length: integer or name of variable that stores field length
- :param object_name: name of the object to be initialized
- """
-
- # todo move validation to vppapigen
- if field_type.endswith('[]') and field_length == '0':
- raise Exception('Variable array \'%s\' defined in \'%s\' '
- 'should have defined length (e.g. \'%s[%s_length]\''
- % (c_name, handler_name, c_name, c_name))
-
- if is_variable_len_array:
- length_var_name = field_length
- field_length = variable_length_array_value_template.substitute(length_var_name=length_var_name)
- if length_field_type != 'u8': # we need net to host conversion:
- field_length = variable_length_array_template.substitute(
- length_field_type=length_field_type, value=field_length)
-
- # for retval don't generate setters
- if util.is_retval_field(c_name):
- return ""
-
- jni_signature = util.jni_2_signature_mapping[field_type]
- jni_setter = util.jni_field_accessors[field_type]
-
- result = dto_field_id_template.substitute(
- field_reference_name=field_reference_name,
- field_name=field_name,
- class_ref_name=ref_name,
- jni_signature=jni_signature)
-
- dto_setter_template = dto_field_setter_templates[field_type]
-
- result += dto_setter_template.substitute(
- jni_signature=jni_signature,
- object_name=object_name,
- field_reference_name=field_reference_name,
- c_name=c_name,
- jni_setter=jni_setter,
- field_length=field_length)
- return result
-
-
-request_field_identifier_template = Template("""
- jfieldID ${field_reference_name}FieldId = (*env)->GetFieldID(env, ${object_name}Class, "${field_name}", "${jni_signature}");
- ${jni_type} ${field_reference_name} = (*env)->Get${jni_getter}(env, ${object_name}, ${field_reference_name}FieldId);
- """)
-
-array_length_enforcement_template = Template("""
- size_t max_size = ${field_length};
- if (cnt > max_size) cnt = max_size;""")
-
-u8_struct_setter_template = Template("""
- mp->${c_name} = ${field_reference_name};""")
-
-u16_struct_setter_template = Template("""
- mp->${c_name} = clib_host_to_net_u16(${field_reference_name});""")
-
-u32_struct_setter_template = Template("""
- mp->${c_name} = clib_host_to_net_u32(${field_reference_name});""")
-
-i32_struct_setter_template = Template("""
- mp->${c_name} = clib_host_to_net_i32(${field_reference_name});!""")
-
-u64_struct_setter_template = Template("""
- mp->${c_name} = clib_host_to_net_u64(${field_reference_name});""")
-
-array_length_enforcement_template = Template("""
- size_t max_size = ${field_length};
- if (cnt > max_size) cnt = max_size;""")
-
-u8_array_struct_setter_template = Template("""
- if (${field_reference_name}) {
- jsize cnt = (*env)->GetArrayLength (env, ${field_reference_name});
- ${field_length_check}
- (*env)->GetByteArrayRegion(env, ${field_reference_name}, 0, cnt, (jbyte *)mp->${c_name});
- }
-""")
-
-u16_array_struct_setter_template = Template("""
- if (${field_reference_name}) {
- jshort * ${field_reference_name}ArrayElements = (*env)->GetShortArrayElements(env, ${field_reference_name}, NULL);
- size_t _i;
- jsize cnt = (*env)->GetArrayLength (env, ${field_reference_name});
- ${field_length_check}
- for (_i = 0; _i < cnt; _i++) {
- mp->${c_name}[_i] = clib_host_to_net_u16(${field_reference_name}ArrayElements[_i]);
- }
- (*env)->ReleaseShortArrayElements (env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- }
- """)
-
-u32_array_struct_setter_template = Template("""
- if (${field_reference_name}) {
- jint * ${field_reference_name}ArrayElements = (*env)->GetIntArrayElements(env, ${field_reference_name}, NULL);
- size_t _i;
- jsize cnt = (*env)->GetArrayLength (env, ${field_reference_name});
- ${field_length_check}
- for (_i = 0; _i < cnt; _i++) {
- mp->${c_name}[_i] = clib_host_to_net_u32(${field_reference_name}ArrayElements[_i]);
- }
- (*env)->ReleaseIntArrayElements (env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- }
- """)
-
-u64_array_struct_setter_template = Template("""
- if (${field_reference_name}) {
- jlong * ${field_reference_name}ArrayElements = (*env)->GetLongArrayElements(env, ${field_reference_name}, NULL);
- size_t _i;
- jsize cnt = (*env)->GetArrayLength (env, ${field_reference_name});
- ${field_length_check}
- for (_i = 0; _i < cnt; _i++) {
- mp->${c_name}[_i] = clib_host_to_net_u64(${field_reference_name}ArrayElements[_i]);
- }
- (*env)->ReleaseLongArrayElements (env, ${field_reference_name}, ${field_reference_name}ArrayElements, 0);
- }
- """)
-
-struct_setter_templates = {'u8': u8_struct_setter_template,
- 'u16': u16_struct_setter_template,
- 'u32': u32_struct_setter_template,
- 'i32': u32_struct_setter_template,
- 'u64': u64_struct_setter_template,
- 'u8[]': u8_array_struct_setter_template,
- 'u16[]': u16_array_struct_setter_template,
- 'u32[]': u32_array_struct_setter_template,
- 'u64[]': u64_array_struct_setter_template
- }
-
-
-def jni_request_binding_for_type(field_type, c_name, field_reference_name, field_name, field_length,
- is_variable_len_array, object_name="request"):
- """
- Generates jni code that initializes C structure that corresponds to a field of java object
- (dto or custom type). To be used in request message handlers.
- :param field_type: type of the field to be initialized (as defined in vpe.api)
- :param c_name: name of the message struct member to be initialized
- :param field_reference_name: name of the field reference in generated code
- :param field_name: name of the field (camelcase)
- :param field_length: integer or name of variable that stores field length
- :param object_name: name of the object to be initialized
- """
- # field identifiers
- jni_type = util.vpp_2_jni_type_mapping[field_type]
- jni_signature = util.jni_2_signature_mapping[field_type]
- jni_getter = util.jni_field_accessors[field_type]
-
- # field identifier
- msg_initialization = request_field_identifier_template.substitute(
- jni_type=jni_type,
- field_reference_name=field_reference_name,
- field_name=field_name,
- jni_signature=jni_signature,
- jni_getter=jni_getter,
- object_name=object_name)
-
- # field setter
- field_length_check = ""
-
- # check if we are processing variable length array:
- if is_variable_len_array:
- field_length = util.underscore_to_camelcase(field_length)
-
- # enforce max length if array has fixed length or uses variable length syntax
- if str(field_length) != "0":
- field_length_check = array_length_enforcement_template.substitute(field_length=field_length)
-
- struct_setter_template = struct_setter_templates[field_type]
-
- msg_initialization += struct_setter_template.substitute(
- c_name=c_name,
- field_reference_name=field_reference_name,
- field_length_check=field_length_check)
-
- return msg_initialization
diff --git a/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py
deleted file mode 100644
index 5fc84c7b..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/jvpp_c_gen.py
+++ /dev/null
@@ -1,343 +0,0 @@
-#!/usr/bin/env python
-#
-# 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
-# l
-# 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.
-#
-
-import os, util
-from string import Template
-
-import jni_gen
-
-
-def is_manually_generated(f_name, plugin_name):
- return f_name in {'control_ping_reply'}
-
-
-class_reference_template = Template("""jclass ${ref_name}Class;
-""")
-
-find_class_invocation_template = Template("""
- ${ref_name}Class = (jclass)(*env)->NewGlobalRef(env, (*env)->FindClass(env, "io/fd/vpp/jvpp/${plugin_name}/dto/${class_name}"));
- if ((*env)->ExceptionCheck(env)) {
- (*env)->ExceptionDescribe(env);
- return JNI_ERR;
- }""")
-
-find_class_template = Template("""
- ${ref_name}Class = (jclass)(*env)->NewGlobalRef(env, (*env)->FindClass(env, "${class_name}"));
- if ((*env)->ExceptionCheck(env)) {
- (*env)->ExceptionDescribe(env);
- return JNI_ERR;
- }""")
-
-delete_class_invocation_template = Template("""
- if (${ref_name}Class) {
- (*env)->DeleteGlobalRef(env, ${ref_name}Class);
- }""")
-
-class_cache_template = Template("""
-$class_references
-static int cache_class_references(JNIEnv* env) {
- $find_class_invocations
- return 0;
-}
-
-static void delete_class_references(JNIEnv* env) {
- $delete_class_invocations
-}""")
-
-
-def generate_class_cache(func_list, plugin_name):
- class_references = []
- find_class_invocations = []
- delete_class_invocations = []
- for f in func_list:
- c_name = f['name']
- class_name = util.underscore_to_camelcase_upper(c_name)
- ref_name = util.underscore_to_camelcase(c_name)
-
- if util.is_ignored(c_name) or util.is_control_ping(class_name):
- continue
-
- if util.is_reply(class_name):
- class_references.append(class_reference_template.substitute(
- ref_name=ref_name))
- find_class_invocations.append(find_class_invocation_template.substitute(
- plugin_name=plugin_name,
- ref_name=ref_name,
- class_name=class_name))
- delete_class_invocations.append(delete_class_invocation_template.substitute(ref_name=ref_name))
- elif util.is_notification(c_name):
- class_references.append(class_reference_template.substitute(
- ref_name=util.add_notification_suffix(ref_name)))
- find_class_invocations.append(find_class_invocation_template.substitute(
- plugin_name=plugin_name,
- ref_name=util.add_notification_suffix(ref_name),
- class_name=util.add_notification_suffix(class_name)))
- delete_class_invocations.append(delete_class_invocation_template.substitute(
- ref_name=util.add_notification_suffix(ref_name)))
-
- # add exception class to class cache
- ref_name = 'callbackException'
- class_name = 'io/fd/vpp/jvpp/VppCallbackException'
- class_references.append(class_reference_template.substitute(
- ref_name=ref_name))
- find_class_invocations.append(find_class_template.substitute(
- ref_name=ref_name,
- class_name=class_name))
- delete_class_invocations.append(delete_class_invocation_template.substitute(ref_name=ref_name))
-
- return class_cache_template.substitute(
- class_references="".join(class_references), find_class_invocations="".join(find_class_invocations),
- delete_class_invocations="".join(delete_class_invocations))
-
-
-# TODO: cache method and field identifiers to achieve better performance
-# https://jira.fd.io/browse/HONEYCOMB-42
-request_class_template = Template("""
- jclass requestClass = (*env)->FindClass(env, "io/fd/vpp/jvpp/${plugin_name}/dto/${java_name_upper}");""")
-
-request_field_identifier_template = Template("""
- jfieldID ${field_reference_name}FieldId = (*env)->GetFieldID(env, ${object_name}Class, "${field_name}", "${jni_signature}");
- ${jni_type} ${field_reference_name} = (*env)->Get${jni_getter}(env, ${object_name}, ${field_reference_name}FieldId);
- """)
-
-
-jni_impl_template = Template("""
-/**
- * JNI binding for sending ${c_name} message.
- * Generated based on $inputfile preparsed data:
-$api_data
- */
-JNIEXPORT jint JNICALL Java_io_fd_vpp_jvpp_${plugin_name}_JVpp${java_plugin_name}Impl_${field_name}0
-(JNIEnv * env, jclass clazz$args) {
- ${plugin_name}_main_t *plugin_main = &${plugin_name}_main;
- vl_api_${c_name}_t * mp;
- u32 my_context_id = vppjni_get_context_id (&jvpp_main);
- $request_class
-
- // create message:
- mp = vl_msg_api_alloc(sizeof(*mp));
- memset (mp, 0, sizeof (*mp));
- mp->_vl_msg_id = ntohs (VL_API_${c_name_uppercase} + plugin_main->msg_id_base);
- mp->client_index = plugin_main->my_client_index;
- mp->context = clib_host_to_net_u32 (my_context_id);
-
- $msg_initialization
-
- // send message:
- vl_msg_api_send_shmem (plugin_main->vl_input_queue, (u8 *)&mp);
- if ((*env)->ExceptionCheck(env)) {
- return JNI_ERR;
- }
- return my_context_id;
-}""")
-
-def generate_jni_impl(func_list, plugin_name, inputfile):
- jni_impl = []
- for f in func_list:
- f_name = f['name']
- camel_case_function_name = util.underscore_to_camelcase(f_name)
- if is_manually_generated(f_name, plugin_name) or util.is_reply(camel_case_function_name) \
- or util.is_ignored(f_name) or util.is_just_notification(f_name):
- continue
-
- arguments = ''
- request_class = ''
- msg_initialization = ''
- f_name_uppercase = f_name.upper()
-
- if f['args']:
- arguments = ', jobject request'
- camel_case_function_name_upper = util.underscore_to_camelcase_upper(f_name)
-
- request_class = request_class_template.substitute(
- java_name_upper=camel_case_function_name_upper,
- plugin_name=plugin_name)
-
- for t in zip(f['types'], f['args'], f['lengths']):
- field_name = util.underscore_to_camelcase(t[1])
- msg_initialization += jni_gen.jni_request_binding_for_type(field_type=t[0], c_name=t[1],
- field_reference_name=field_name,
- field_name=field_name,
- field_length=t[2][0],
- is_variable_len_array=t[2][1])
-
- jni_impl.append(jni_impl_template.substitute(
- inputfile=inputfile,
- api_data=util.api_message_to_javadoc(f),
- field_reference_name=camel_case_function_name,
- field_name=camel_case_function_name,
- c_name_uppercase=f_name_uppercase,
- c_name=f_name,
- plugin_name=plugin_name,
- java_plugin_name=plugin_name.title(),
- request_class=request_class,
- msg_initialization=msg_initialization,
- args=arguments))
-
- return "\n".join(jni_impl)
-
-# code fragment for checking result of the operation before sending request reply
-callback_err_handler_template = Template("""
- // for negative result don't send callback message but send error callback
- if (mp->retval<0) {
- call_on_error("${handler_name}", mp->context, mp->retval, plugin_main->callbackClass, plugin_main->callbackObject, callbackExceptionClass);
- return;
- }
- if (mp->retval == VNET_API_ERROR_IN_PROGRESS) {
- clib_warning("Result in progress");
- return;
- }
-""")
-
-msg_handler_template = Template("""
-/**
- * Handler for ${handler_name} message.
- * Generated based on $inputfile preparsed data:
-$api_data
- */
-static void vl_api_${handler_name}_t_handler (vl_api_${handler_name}_t * mp)
-{
- ${plugin_name}_main_t *plugin_main = &${plugin_name}_main;
- JNIEnv *env = jvpp_main.jenv;
-
- $err_handler
-
- jmethodID constructor = (*env)->GetMethodID(env, ${class_ref_name}Class, "<init>", "()V");
- jmethodID callbackMethod = (*env)->GetMethodID(env, plugin_main->callbackClass, "on${dto_name}", "(Lio/fd/vpp/jvpp/${plugin_name}/dto/${dto_name};)V");
-
- jobject dto = (*env)->NewObject(env, ${class_ref_name}Class, constructor);
- $dto_setters
-
- (*env)->CallVoidMethod(env, plugin_main->callbackObject, callbackMethod, dto);
- // free DTO as per http://stackoverflow.com/questions/1340938/memory-leak-when-calling-java-code-from-c-using-jni
- (*env)->DeleteLocalRef(env, dto);
-}""")
-
-
-def generate_msg_handlers(func_list, plugin_name, inputfile):
- handlers = []
- for f in func_list:
- handler_name = f['name']
- dto_name = util.underscore_to_camelcase_upper(handler_name)
- ref_name = util.underscore_to_camelcase(handler_name)
-
- if is_manually_generated(handler_name, plugin_name) or util.is_ignored(handler_name):
- continue
-
- if not util.is_reply(dto_name) and not util.is_notification(handler_name):
- continue
-
- if util.is_notification(handler_name):
- dto_name = util.add_notification_suffix(dto_name)
- ref_name = util.add_notification_suffix(ref_name)
-
- dto_setters = ''
- err_handler = ''
- # dto setters
- for t in zip(f['types'], f['args'], f['lengths']):
- c_name = t[1]
- java_name = util.underscore_to_camelcase(c_name)
- field_length = t[2][0]
- is_variable_len_array = t[2][1]
- length_field_type = None
- if is_variable_len_array:
- length_field_type = f['types'][f['args'].index(field_length)]
- dto_setters += jni_gen.jni_reply_handler_for_type(handler_name=handler_name, ref_name=ref_name,
- field_type=t[0], c_name=t[1],
- field_reference_name=java_name,
- field_name=java_name, field_length=field_length,
- is_variable_len_array=is_variable_len_array,
- length_field_type=length_field_type)
-
- # for retval don't generate setters and generate retval check
- if util.is_retval_field(c_name):
- err_handler = callback_err_handler_template.substitute(
- handler_name=handler_name
- )
- continue
-
- handlers.append(msg_handler_template.substitute(
- inputfile=inputfile,
- api_data=util.api_message_to_javadoc(f),
- handler_name=handler_name,
- plugin_name=plugin_name,
- dto_name=dto_name,
- class_ref_name=ref_name,
- dto_setters=dto_setters,
- err_handler=err_handler))
-
- return "\n".join(handlers)
-
-
-handler_registration_template = Template("""_(${upercase_name}, ${name}) \\
-""")
-
-
-def generate_handler_registration(func_list):
- handler_registration = ["#define foreach_api_reply_handler \\\n"]
- for f in func_list:
- name = f['name']
- camelcase_name = util.underscore_to_camelcase(f['name'])
-
- if (not util.is_reply(camelcase_name) and not util.is_notification(name)) or util.is_ignored(name) \
- or util.is_control_ping(camelcase_name):
- continue
-
- handler_registration.append(handler_registration_template.substitute(
- name=name,
- upercase_name=name.upper()))
-
- return "".join(handler_registration)
-
-
-jvpp_c_template = Template("""/**
- * This file contains JNI bindings for jvpp Java API.
- * It was generated by jvpp_c_gen.py based on $inputfile
- * (python representation of api file generated by vppapigen).
- */
-
-// JAVA class reference cache
-$class_cache
-
-// JNI bindings
-$jni_implementations
-
-// Message handlers
-$msg_handlers
-
-// Registration of message handlers in vlib
-$handler_registration
-""")
-
-def generate_jvpp(func_list, plugin_name, inputfile):
- """ Generates jvpp C file """
- print "Generating jvpp C"
-
- class_cache = generate_class_cache(func_list, plugin_name)
- jni_impl = generate_jni_impl(func_list, plugin_name, inputfile)
- msg_handlers = generate_msg_handlers(func_list, plugin_name, inputfile)
- handler_registration = generate_handler_registration(func_list)
-
- jvpp_c_file = open("jvpp_%s_gen.h" % plugin_name, 'w')
- jvpp_c_file.write(jvpp_c_template.substitute(
- inputfile=inputfile,
- class_cache=class_cache,
- jni_implementations=jni_impl,
- msg_handlers=msg_handlers,
- handler_registration=handler_registration))
- jvpp_c_file.flush()
- jvpp_c_file.close()
-
diff --git a/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py
deleted file mode 100644
index ac096a71..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/jvpp_callback_facade_gen.py
+++ /dev/null
@@ -1,324 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os, util
-from string import Template
-
-import callback_gen
-import dto_gen
-
-jvpp_ifc_template = Template("""
-package $plugin_package.$callback_facade_package;
-
-/**
- * <p>Callback Java API representation of $plugin_package plugin.
- * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface CallbackJVpp${plugin_name} extends $base_package.$notification_package.NotificationRegistryProvider, java.lang.AutoCloseable {
-
- // TODO add send
-
-$methods
-}
-""")
-
-jvpp_impl_template = Template("""
-package $plugin_package.$callback_facade_package;
-
-/**
- * <p>Default implementation of Callback${plugin_name}JVpp interface.
- * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public final class CallbackJVpp${plugin_name}Facade implements CallbackJVpp${plugin_name} {
-
- private final $plugin_package.JVpp${plugin_name} jvpp;
- private final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> callbacks;
- private final $plugin_package.$notification_package.${plugin_name}NotificationRegistryImpl notificationRegistry = new $plugin_package.$notification_package.${plugin_name}NotificationRegistryImpl();
- /**
- * <p>Create CallbackJVpp${plugin_name}Facade object for provided JVpp instance.
- * Constructor internally creates CallbackJVppFacadeCallback class for processing callbacks
- * and then connects to provided JVpp instance
- *
- * @param jvpp provided $base_package.JVpp instance
- *
- * @throws java.io.IOException in case instance cannot connect to JVPP
- */
- public CallbackJVpp${plugin_name}Facade(final $base_package.JVppRegistry registry, final $plugin_package.JVpp${plugin_name} jvpp) throws java.io.IOException {
- this.jvpp = java.util.Objects.requireNonNull(jvpp,"jvpp is null");
- this.callbacks = new java.util.HashMap<>();
- java.util.Objects.requireNonNull(registry, "JVppRegistry should not be null");
- registry.register(jvpp, new CallbackJVpp${plugin_name}FacadeCallback(this.callbacks, notificationRegistry));
- }
-
- @Override
- public $plugin_package.$notification_package.${plugin_name}NotificationRegistry getNotificationRegistry() {
- return notificationRegistry;
- }
-
- @Override
- public void close() throws Exception {
- jvpp.close();
- }
-
- // TODO add send()
-
-$methods
-}
-""")
-
-method_template = Template(
- """ void $name($plugin_package.$dto_package.$request request, $plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException;""")
-
-method_impl_template = Template(""" public final void $name($plugin_package.$dto_package.$request request, $plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException {
- synchronized (callbacks) {
- callbacks.put(jvpp.$name(request), callback);
- }
- }
-""")
-
-no_arg_method_template = Template(""" void $name($plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException;""")
-no_arg_method_impl_template = Template(""" public final void $name($plugin_package.$callback_package.$callback callback) throws $base_package.VppInvocationException {
- synchronized (callbacks) {
- callbacks.put(jvpp.$name(), callback);
- }
- }
-""")
-
-
-def generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, callback_facade_package, inputfile):
- """ Generates callback facade """
- print "Generating JVpp callback facade"
-
- if os.path.exists(callback_facade_package):
- util.remove_folder(callback_facade_package)
-
- os.mkdir(callback_facade_package)
-
- methods = []
- methods_impl = []
- for func in func_list:
-
- if util.is_notification(func['name']) or util.is_ignored(func['name']):
- continue
-
- camel_case_name = util.underscore_to_camelcase(func['name'])
- camel_case_name_upper = util.underscore_to_camelcase_upper(func['name'])
- if util.is_reply(camel_case_name) or util.is_control_ping(camel_case_name):
- continue
-
- # Strip suffix for dump calls
- callback_type = get_request_name(camel_case_name_upper, func['name']) + callback_gen.callback_suffix
-
- if len(func['args']) == 0:
- methods.append(no_arg_method_template.substitute(name=camel_case_name,
- base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=callback_type))
- methods_impl.append(no_arg_method_impl_template.substitute(name=camel_case_name,
- base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=callback_type))
- else:
- methods.append(method_template.substitute(name=camel_case_name,
- request=camel_case_name_upper,
- base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=callback_type))
- methods_impl.append(method_impl_template.substitute(name=camel_case_name,
- request=camel_case_name_upper,
- base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=callback_type))
-
- join = os.path.join(callback_facade_package, "CallbackJVpp%s.java" % plugin_name)
- jvpp_file = open(join, 'w')
- jvpp_file.write(
- jvpp_ifc_template.substitute(inputfile=inputfile,
- methods="\n".join(methods),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package,
- notification_package=notification_package,
- callback_facade_package=callback_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
- jvpp_file = open(os.path.join(callback_facade_package, "CallbackJVpp%sFacade.java" % plugin_name), 'w')
- jvpp_file.write(jvpp_impl_template.substitute(inputfile=inputfile,
- methods="\n".join(methods_impl),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package,
- notification_package=notification_package,
- callback_package=callback_package,
- callback_facade_package=callback_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
- generate_callback(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, callback_facade_package, inputfile)
-
-
-jvpp_facade_callback_template = Template("""
-package $plugin_package.$callback_facade_package;
-
-/**
- * <p>Implementation of JVppGlobalCallback interface for Java Callback API.
- * <br>It was generated by jvpp_callback_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public final class CallbackJVpp${plugin_name}FacadeCallback implements $plugin_package.$callback_package.JVpp${plugin_name}GlobalCallback {
-
- private final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> requests;
- private final $plugin_package.$notification_package.Global${plugin_name}NotificationCallback notificationCallback;
- private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(CallbackJVpp${plugin_name}FacadeCallback.class.getName());
-
- public CallbackJVpp${plugin_name}FacadeCallback(final java.util.Map<Integer, $base_package.$callback_package.JVppCallback> requestMap,
- final $plugin_package.$notification_package.Global${plugin_name}NotificationCallback notificationCallback) {
- this.requests = requestMap;
- this.notificationCallback = notificationCallback;
- }
-
- @Override
- public void onError($base_package.VppCallbackException reply) {
-
- $base_package.$callback_package.JVppCallback failedCall;
- synchronized(requests) {
- failedCall = requests.remove(reply.getCtxId());
- }
-
- if(failedCall != null) {
- try {
- failedCall.onError(reply);
- } catch(RuntimeException ex) {
- ex.addSuppressed(reply);
- LOG.log(java.util.logging.Level.WARNING, String.format("Callback: %s failed while handling exception: %s", failedCall, reply), ex);
- }
- }
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public void onControlPingReply($base_package.$dto_package.ControlPingReply reply) {
-
- $base_package.$callback_package.ControlPingCallback callback;
- synchronized(requests) {
- callback = ($base_package.$callback_package.ControlPingCallback) requests.remove(reply.context);
- }
-
- if(callback != null) {
- callback.onControlPingReply(reply);
- }
- }
-
-$methods
-}
-""")
-
-jvpp_facade_callback_method_template = Template("""
- @Override
- @SuppressWarnings("unchecked")
- public void on$callback_dto($plugin_package.$dto_package.$callback_dto reply) {
-
- $plugin_package.$callback_package.$callback callback;
- synchronized(requests) {
- callback = ($plugin_package.$callback_package.$callback) requests.remove(reply.context);
- }
-
- if(callback != null) {
- callback.on$callback_dto(reply);
- }
- }
-""")
-
-jvpp_facade_callback_notification_method_template = Template("""
- @Override
- @SuppressWarnings("unchecked")
- public void on$callback_dto($plugin_package.$dto_package.$callback_dto notification) {
- notificationCallback.on$callback_dto(notification);
- }
-""")
-
-
-def generate_callback(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, callback_facade_package, inputfile):
- callbacks = []
- for func in func_list:
-
- camel_case_name_with_suffix = util.underscore_to_camelcase_upper(func['name'])
-
- if util.is_ignored(func['name']) or util.is_control_ping(camel_case_name_with_suffix):
- continue
-
- if util.is_reply(camel_case_name_with_suffix):
- callbacks.append(jvpp_facade_callback_method_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=util.remove_reply_suffix(camel_case_name_with_suffix) + callback_gen.callback_suffix,
- callback_dto=camel_case_name_with_suffix))
-
- if util.is_notification(func["name"]):
- with_notification_suffix = util.add_notification_suffix(camel_case_name_with_suffix)
- callbacks.append(jvpp_facade_callback_notification_method_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- callback_package=callback_package,
- callback=with_notification_suffix + callback_gen.callback_suffix,
- callback_dto=with_notification_suffix))
-
- jvpp_file = open(os.path.join(callback_facade_package, "CallbackJVpp%sFacadeCallback.java" % plugin_name), 'w')
- jvpp_file.write(jvpp_facade_callback_template.substitute(inputfile=inputfile,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package,
- notification_package=notification_package,
- callback_package=callback_package,
- methods="".join(callbacks),
- callback_facade_package=callback_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
-
-# Returns request name or special one from unconventional_naming_rep_req map
-def get_request_name(camel_case_dto_name, func_name):
- if func_name in reverse_dict(util.unconventional_naming_rep_req):
- request_name = util.underscore_to_camelcase_upper(reverse_dict(util.unconventional_naming_rep_req)[func_name])
- else:
- request_name = camel_case_dto_name
- return remove_suffix(request_name)
-
-
-def reverse_dict(map):
- return dict((v, k) for k, v in map.iteritems())
-
-
-def remove_suffix(name):
- if util.is_reply(name):
- return util.remove_reply_suffix(name)
- else:
- if util.is_dump(name):
- return util.remove_suffix(name, util.dump_suffix)
- else:
- return name
diff --git a/vpp-api/java/jvpp/gen/jvppgen/jvpp_future_facade_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jvpp_future_facade_gen.py
deleted file mode 100644
index ebb840f7..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/jvpp_future_facade_gen.py
+++ /dev/null
@@ -1,331 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os
-from string import Template
-
-import dto_gen
-import util
-
-jvpp_facade_callback_template = Template("""
-package $plugin_package.$future_package;
-
-/**
- * <p>Async facade callback setting values to future objects
- * <br>It was generated by jvpp_future_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public final class FutureJVpp${plugin_name}FacadeCallback implements $plugin_package.$callback_package.JVpp${plugin_name}GlobalCallback {
-
- private final java.util.Map<java.lang.Integer, java.util.concurrent.CompletableFuture<? extends $base_package.$dto_package.JVppReply<?>>> requests;
- private final $plugin_package.$notification_package.Global${plugin_name}NotificationCallback notificationCallback;
-
- public FutureJVpp${plugin_name}FacadeCallback(
- final java.util.Map<java.lang.Integer, java.util.concurrent.CompletableFuture<? extends $base_package.$dto_package.JVppReply<?>>> requestMap,
- final $plugin_package.$notification_package.Global${plugin_name}NotificationCallback notificationCallback) {
- this.requests = requestMap;
- this.notificationCallback = notificationCallback;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public void onError($base_package.VppCallbackException reply) {
- final java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>> completableFuture;
-
- synchronized(requests) {
- completableFuture = (java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>>) requests.get(reply.getCtxId());
- }
-
- if(completableFuture != null) {
- completableFuture.completeExceptionally(reply);
-
- synchronized(requests) {
- requests.remove(reply.getCtxId());
- }
- }
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public void onControlPingReply($base_package.$dto_package.ControlPingReply reply) {
- final java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>> completableFuture;
-
- synchronized(requests) {
- completableFuture = (java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>>) requests.get(reply.context);
- }
-
- if(completableFuture != null) {
- // Finish dump call
- if (completableFuture instanceof $base_package.$future_package.AbstractFutureJVppInvoker.CompletableDumpFuture) {
- completableFuture.complete((($base_package.$future_package.AbstractFutureJVppInvoker.CompletableDumpFuture) completableFuture).getReplyDump());
- // Remove future mapped to dump call context id
- synchronized(requests) {
- requests.remove((($base_package.$future_package.AbstractFutureJVppInvoker.CompletableDumpFuture) completableFuture).getContextId());
- }
- } else {
- completableFuture.complete(reply);
- }
-
- synchronized(requests) {
- requests.remove(reply.context);
- }
- }
- }
-
-$methods
-}
-""")
-
-jvpp_facade_callback_method_template = Template("""
- @Override
- @SuppressWarnings("unchecked")
- public void on$callback_dto($plugin_package.$dto_package.$callback_dto reply) {
- final java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>> completableFuture;
-
- synchronized(requests) {
- completableFuture = (java.util.concurrent.CompletableFuture<$base_package.$dto_package.JVppReply<?>>) requests.get(reply.context);
- }
-
- if(completableFuture != null) {
- completableFuture.complete(reply);
-
- synchronized(requests) {
- requests.remove(reply.context);
- }
- }
- }
-""")
-
-jvpp_facade_callback_notification_method_template = Template("""
- @Override
- public void on$callback_dto($plugin_package.$dto_package.$callback_dto notification) {
- notificationCallback.on$callback_dto(notification);
- }
-""")
-
-jvpp_facade_details_callback_method_template = Template("""
- @Override
- @SuppressWarnings("unchecked")
- public void on$callback_dto($plugin_package.$dto_package.$callback_dto reply) {
- final $base_package.$future_package.AbstractFutureJVppInvoker.CompletableDumpFuture<$plugin_package.$dto_package.$callback_dto_reply_dump> completableFuture;
-
- synchronized(requests) {
- completableFuture = ($base_package.$future_package.AbstractFutureJVppInvoker.CompletableDumpFuture<$plugin_package.$dto_package.$callback_dto_reply_dump>) requests.get(reply.context);
- }
-
- if(completableFuture != null) {
- completableFuture.getReplyDump().$callback_dto_field.add(reply);
- }
- }
-""")
-
-
-def generate_jvpp(func_list, base_package, plugin_package, plugin_name, dto_package, callback_package, notification_package, future_facade_package, inputfile):
- """ Generates JVpp interface and JNI implementation """
- print "Generating JVpp future facade"
-
- if not os.path.exists(future_facade_package):
- raise Exception("%s folder is missing" % future_facade_package)
-
- methods = []
- methods_impl = []
- callbacks = []
- for func in func_list:
- camel_case_name_with_suffix = util.underscore_to_camelcase_upper(func['name'])
-
- if util.is_ignored(func['name']) or util.is_control_ping(camel_case_name_with_suffix):
- continue
-
- if not util.is_reply(camel_case_name_with_suffix) and not util.is_notification(func['name']):
- continue
-
- camel_case_method_name = util.underscore_to_camelcase(func['name'])
-
- if not util.is_notification(func["name"]):
- camel_case_request_method_name = util.remove_reply_suffix(util.underscore_to_camelcase(func['name']))
- if util.is_details(camel_case_name_with_suffix):
- camel_case_reply_name = get_standard_dump_reply_name(util.underscore_to_camelcase_upper(func['name']),
- func['name'])
- callbacks.append(jvpp_facade_details_callback_method_template.substitute(base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_dto=camel_case_name_with_suffix,
- callback_dto_field=camel_case_method_name,
- callback_dto_reply_dump=camel_case_reply_name + dto_gen.dump_dto_suffix,
- future_package=future_facade_package))
-
- methods.append(future_jvpp_method_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- method_name=camel_case_request_method_name +
- util.underscore_to_camelcase_upper(util.dump_suffix),
- reply_name=camel_case_reply_name + dto_gen.dump_dto_suffix,
- request_name=util.remove_reply_suffix(camel_case_reply_name) +
- util.underscore_to_camelcase_upper(util.dump_suffix)))
- methods_impl.append(future_jvpp_dump_method_impl_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- method_name=camel_case_request_method_name +
- util.underscore_to_camelcase_upper(util.dump_suffix),
- reply_name=camel_case_reply_name + dto_gen.dump_dto_suffix,
- request_name=util.remove_reply_suffix(camel_case_reply_name) +
- util.underscore_to_camelcase_upper(util.dump_suffix)))
- else:
- request_name = util.underscore_to_camelcase_upper(util.unconventional_naming_rep_req[func['name']]) \
- if func['name'] in util.unconventional_naming_rep_req else util.remove_reply_suffix(camel_case_name_with_suffix)
-
- methods.append(future_jvpp_method_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- method_name=camel_case_request_method_name,
- reply_name=camel_case_name_with_suffix,
- request_name=request_name))
- methods_impl.append(future_jvpp_method_impl_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- method_name=camel_case_request_method_name,
- reply_name=camel_case_name_with_suffix,
- request_name=request_name))
-
- callbacks.append(jvpp_facade_callback_method_template.substitute(base_package=base_package,
- plugin_package=plugin_package,
- dto_package=dto_package,
- callback_dto=camel_case_name_with_suffix))
-
- if util.is_notification(func["name"]):
- callbacks.append(jvpp_facade_callback_notification_method_template.substitute(plugin_package=plugin_package,
- dto_package=dto_package,
- callback_dto=util.add_notification_suffix(camel_case_name_with_suffix)))
-
- jvpp_file = open(os.path.join(future_facade_package, "FutureJVpp%sFacadeCallback.java" % plugin_name), 'w')
- jvpp_file.write(jvpp_facade_callback_template.substitute(inputfile=inputfile,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package,
- notification_package=notification_package,
- callback_package=callback_package,
- methods="".join(callbacks),
- future_package=future_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
- jvpp_file = open(os.path.join(future_facade_package, "FutureJVpp%s.java" % plugin_name), 'w')
- jvpp_file.write(future_jvpp_template.substitute(inputfile=inputfile,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- notification_package=notification_package,
- methods="".join(methods),
- future_package=future_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
- jvpp_file = open(os.path.join(future_facade_package, "FutureJVpp%sFacade.java" % plugin_name), 'w')
- jvpp_file.write(future_jvpp_facade_template.substitute(inputfile=inputfile,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package,
- notification_package=notification_package,
- methods="".join(methods_impl),
- future_package=future_facade_package))
- jvpp_file.flush()
- jvpp_file.close()
-
-
-future_jvpp_template = Template('''
-package $plugin_package.$future_package;
-
-/**
- * <p>Async facade extension adding specific methods for each request invocation
- * <br>It was generated by jvpp_future_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface FutureJVpp${plugin_name} extends $base_package.$future_package.FutureJVppInvoker {
-$methods
-
- @Override
- public $plugin_package.$notification_package.${plugin_name}NotificationRegistry getNotificationRegistry();
-
-}
-''')
-
-future_jvpp_method_template = Template('''
- java.util.concurrent.CompletionStage<$plugin_package.$dto_package.$reply_name> $method_name($plugin_package.$dto_package.$request_name request);
-''')
-
-
-future_jvpp_facade_template = Template('''
-package $plugin_package.$future_package;
-
-/**
- * <p>Implementation of FutureJVpp based on AbstractFutureJVppInvoker
- * <br>It was generated by jvpp_future_facade_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public class FutureJVpp${plugin_name}Facade extends $base_package.$future_package.AbstractFutureJVppInvoker implements FutureJVpp${plugin_name} {
-
- private final $plugin_package.$notification_package.${plugin_name}NotificationRegistryImpl notificationRegistry = new $plugin_package.$notification_package.${plugin_name}NotificationRegistryImpl();
-
- /**
- * <p>Create FutureJVpp${plugin_name}Facade object for provided JVpp instance.
- * Constructor internally creates FutureJVppFacadeCallback class for processing callbacks
- * and then connects to provided JVpp instance
- *
- * @param jvpp provided $base_package.JVpp instance
- *
- * @throws java.io.IOException in case instance cannot connect to JVPP
- */
- public FutureJVpp${plugin_name}Facade(final $base_package.JVppRegistry registry, final $base_package.JVpp jvpp) throws java.io.IOException {
- super(jvpp, registry, new java.util.HashMap<>());
- java.util.Objects.requireNonNull(registry, "JVppRegistry should not be null");
- registry.register(jvpp, new FutureJVpp${plugin_name}FacadeCallback(getRequests(), notificationRegistry));
- }
-
- @Override
- public $plugin_package.$notification_package.${plugin_name}NotificationRegistry getNotificationRegistry() {
- return notificationRegistry;
- }
-
-$methods
-}
-''')
-
-future_jvpp_method_impl_template = Template('''
- @Override
- public java.util.concurrent.CompletionStage<$plugin_package.$dto_package.$reply_name> $method_name($plugin_package.$dto_package.$request_name request) {
- return send(request);
- }
-''')
-
-future_jvpp_dump_method_impl_template = Template('''
- @Override
- public java.util.concurrent.CompletionStage<$plugin_package.$dto_package.$reply_name> $method_name($plugin_package.$dto_package.$request_name request) {
- return send(request, new $plugin_package.$dto_package.$reply_name());
- }
-''')
-
-
-# Returns request name or special one from unconventional_naming_rep_req map
-def get_standard_dump_reply_name(camel_case_dto_name, func_name):
- # FIXME this is a hotfix for sub-details callbacks
- # FIXME also for L2FibTableEntry
- # It's all because unclear mapping between
- # request -> reply,
- # dump -> reply, details,
- # notification_start -> reply, notifications
-
- # vpe.api needs to be "standardized" so we can parse the information and create maps before generating java code
- suffix = func_name.split("_")[-1]
- return util.underscore_to_camelcase_upper(
- util.unconventional_naming_rep_req[func_name]) + util.underscore_to_camelcase_upper(suffix) if func_name in util.unconventional_naming_rep_req \
- else camel_case_dto_name
diff --git a/vpp-api/java/jvpp/gen/jvppgen/jvpp_impl_gen.py b/vpp-api/java/jvpp/gen/jvppgen/jvpp_impl_gen.py
deleted file mode 100644
index 4146c141..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/jvpp_impl_gen.py
+++ /dev/null
@@ -1,219 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os, util
-from string import Template
-
-jvpp_ifc_template = Template("""
-package $plugin_package;
-
-/**
- * <p>Java representation of plugin's api file.
- * <br>It was generated by jvpp_impl_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface JVpp${plugin_name} extends $base_package.JVpp {
-
- /**
- * Generic dispatch method for sending requests to VPP
- *
- * @throws io.fd.vpp.jvpp.VppInvocationException if send request had failed
- */
- int send($base_package.$dto_package.JVppRequest request) throws io.fd.vpp.jvpp.VppInvocationException;
-
-$methods
-}
-""")
-
-jvpp_impl_template = Template("""
-package $plugin_package;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.StandardCopyOption;
-import java.nio.file.attribute.PosixFilePermission;
-import java.nio.file.attribute.PosixFilePermissions;
-import java.util.Set;
-import java.util.logging.Logger;
-import $base_package.callback.JVppCallback;
-import $base_package.VppConnection;
-import $base_package.JVppRegistry;
-
-/**
- * <p>Default implementation of JVpp interface.
- * <br>It was generated by jvpp_impl_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public final class JVpp${plugin_name}Impl implements $plugin_package.JVpp${plugin_name} {
-
- private final static Logger LOG = Logger.getLogger(JVpp${plugin_name}Impl.class.getName());
- private static final String LIBNAME = "libjvpp_${plugin_name_underscore}.so.0.0.0";
-
- // FIXME using NativeLibraryLoader makes load fail could not find (WantInterfaceEventsReply).
- static {
- try {
- loadLibrary();
- } catch (Exception e) {
- LOG.severe("Can't find jvpp jni library: " + LIBNAME);
- throw new ExceptionInInitializerError(e);
- }
- }
-
- private static void loadStream(final InputStream is) throws IOException {
- final Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---");
- final Path p = Files.createTempFile(LIBNAME, null, PosixFilePermissions.asFileAttribute(perms));
- try {
- Files.copy(is, p, StandardCopyOption.REPLACE_EXISTING);
-
- try {
- Runtime.getRuntime().load(p.toString());
- } catch (UnsatisfiedLinkError e) {
- throw new IOException("Failed to load library " + p, e);
- }
- } finally {
- try {
- Files.deleteIfExists(p);
- } catch (IOException e) {
- }
- }
- }
-
- private static void loadLibrary() throws IOException {
- try (final InputStream is = JVpp${plugin_name}Impl.class.getResourceAsStream('/' + LIBNAME)) {
- if (is == null) {
- throw new IOException("Failed to open library resource " + LIBNAME);
- }
- loadStream(is);
- }
- }
-
- private VppConnection connection;
- private JVppRegistry registry;
-
- private static native void init0(final JVppCallback callback, final long queueAddress, final int clientIndex);
- @Override
- public void init(final JVppRegistry registry, final JVppCallback callback, final long queueAddress, final int clientIndex) {
- this.registry = java.util.Objects.requireNonNull(registry, "registry should not be null");
- this.connection = java.util.Objects.requireNonNull(registry.getConnection(), "connection should not be null");
- connection.checkActive();
- init0(callback, queueAddress, clientIndex);
- }
-
- private static native void close0();
- @Override
- public void close() {
- close0();
- }
-
- @Override
- public int send($base_package.$dto_package.JVppRequest request) throws io.fd.vpp.jvpp.VppInvocationException {
- return request.send(this);
- }
-
- @Override
- public final int controlPing(final io.fd.vpp.jvpp.dto.ControlPing controlPing) throws io.fd.vpp.jvpp.VppInvocationException {
- return registry.controlPing(JVpp${plugin_name}Impl.class);
- }
-
-$methods
-}
-""")
-
-method_template = Template(""" int $name($plugin_package.$dto_package.$request request) throws io.fd.vpp.jvpp.VppInvocationException;""")
-method_native_template = Template(
- """ private static native int ${name}0($plugin_package.$dto_package.$request request);""")
-method_impl_template = Template(""" public final int $name($plugin_package.$dto_package.$request request) throws io.fd.vpp.jvpp.VppInvocationException {
- java.util.Objects.requireNonNull(request,"Null request object");
- connection.checkActive();
- int result=${name}0(request);
- if(result<0){
- throw new io.fd.vpp.jvpp.VppInvocationException("${name}",result);
- }
- return result;
- }
-""")
-
-no_arg_method_template = Template(""" int $name() throws io.fd.vpp.jvpp.VppInvocationException;""")
-no_arg_method_native_template = Template(""" private static native int ${name}0() throws io.fd.vpp.jvpp.VppInvocationException;""")
-no_arg_method_impl_template = Template(""" public final int $name() throws io.fd.vpp.jvpp.VppInvocationException {
- connection.checkActive();
- int result=${name}0();
- if(result<0){
- throw new io.fd.vpp.jvpp.VppInvocationException("${name}",result);
- }
- return result;
- }
-""")
-
-
-def generate_jvpp(func_list, base_package, plugin_package, plugin_name_underscore, dto_package, inputfile):
- """ Generates JVpp interface and JNI implementation """
- print "Generating JVpp"
- plugin_name = util.underscore_to_camelcase_upper(plugin_name_underscore)
-
- methods = []
- methods_impl = []
- for func in func_list:
-
- # Skip structures that are used only as notifications
- if util.is_just_notification(func['name']) or util.is_ignored(func['name']):
- continue
-
- camel_case_name = util.underscore_to_camelcase(func['name'])
- camel_case_name_upper = util.underscore_to_camelcase_upper(func['name'])
- if util.is_reply(camel_case_name):
- continue
-
- if len(func['args']) == 0:
- methods.append(no_arg_method_template.substitute(name=camel_case_name))
- methods_impl.append(no_arg_method_native_template.substitute(name=camel_case_name))
- methods_impl.append(no_arg_method_impl_template.substitute(name=camel_case_name))
- else:
- methods.append(method_template.substitute(name=camel_case_name,
- request=camel_case_name_upper,
- plugin_package=plugin_package,
- dto_package=dto_package))
- methods_impl.append(method_native_template.substitute(name=camel_case_name,
- request=camel_case_name_upper,
- plugin_package=plugin_package,
- dto_package=dto_package))
- methods_impl.append(method_impl_template.substitute(name=camel_case_name,
- request=camel_case_name_upper,
- plugin_package=plugin_package,
- dto_package=dto_package))
-
- jvpp_file = open("JVpp%s.java" % plugin_name, 'w')
- jvpp_file.write(
- jvpp_ifc_template.substitute(inputfile=inputfile,
- methods="\n".join(methods),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- dto_package=dto_package))
- jvpp_file.flush()
- jvpp_file.close()
-
- jvpp_file = open("JVpp%sImpl.java" % plugin_name, 'w')
- jvpp_file.write(jvpp_impl_template.substitute(inputfile=inputfile,
- methods="\n".join(methods_impl),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- plugin_name_underscore=plugin_name_underscore,
- dto_package=dto_package))
- jvpp_file.flush()
- jvpp_file.close()
diff --git a/vpp-api/java/jvpp/gen/jvppgen/notification_gen.py b/vpp-api/java/jvpp/gen/jvppgen/notification_gen.py
deleted file mode 100644
index eb380fc8..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/notification_gen.py
+++ /dev/null
@@ -1,199 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os
-
-import callback_gen
-import util
-from string import Template
-
-notification_registry_template = Template("""
-package $plugin_package.$notification_package;
-
-/**
- * <p>Registry for notification callbacks defined in ${plugin_name}.
- * <br>It was generated by notification_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface ${plugin_name}NotificationRegistry extends $base_package.$notification_package.NotificationRegistry {
-
- $register_callback_methods
-
- @Override
- void close();
-}
-""")
-
-global_notification_callback_template = Template("""
-package $plugin_package.$notification_package;
-
-/**
- * <p>Aggregated callback interface for notifications only.
- * <br>It was generated by notification_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface Global${plugin_name}NotificationCallback$callbacks {
-
-}
-""")
-
-notification_registry_impl_template = Template("""
-package $plugin_package.$notification_package;
-
-/**
- * <p>Notification registry delegating notification processing to registered callbacks.
- * <br>It was generated by notification_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public final class ${plugin_name}NotificationRegistryImpl implements ${plugin_name}NotificationRegistry, Global${plugin_name}NotificationCallback {
-
- // TODO add a special NotificationCallback interface and only allow those to be registered
- private final java.util.concurrent.ConcurrentMap<Class<? extends $base_package.$dto_package.JVppNotification>, $base_package.$callback_package.JVppNotificationCallback> registeredCallbacks =
- new java.util.concurrent.ConcurrentHashMap<>();
-
- $register_callback_methods
- $handler_methods
-
- @Override
- public void close() {
- registeredCallbacks.clear();
- }
-}
-""")
-
-register_callback_impl_template = Template("""
- public java.lang.AutoCloseable register$callback(final $plugin_package.$callback_package.$callback callback){
- if(null != registeredCallbacks.putIfAbsent($plugin_package.$dto_package.$notification.class, callback)){
- throw new IllegalArgumentException("Callback for " + $plugin_package.$dto_package.$notification.class +
- "notification already registered");
- }
- return () -> registeredCallbacks.remove($plugin_package.$dto_package.$notification.class);
- }
-""")
-
-handler_impl_template = Template("""
- @Override
- public void on$notification(
- final $plugin_package.$dto_package.$notification notification) {
- final $base_package.$callback_package.JVppNotificationCallback jVppNotificationCallback = registeredCallbacks.get($plugin_package.$dto_package.$notification.class);
- if (null != jVppNotificationCallback) {
- (($plugin_package.$callback_package.$callback) registeredCallbacks
- .get($plugin_package.$dto_package.$notification.class))
- .on$notification(notification);
- }
- }
-""")
-
-notification_provider_template = Template("""
-package $plugin_package.$notification_package;
-
- /**
- * Provides ${plugin_name}NotificationRegistry.
- * <br>The file was generated by notification_gen.py based on $inputfile
- * <br>(python representation of api file generated by vppapigen).
- */
-public interface ${plugin_name}NotificationRegistryProvider extends $base_package.$notification_package.NotificationRegistryProvider {
-
- @Override
- public ${plugin_name}NotificationRegistry getNotificationRegistry();
-}
-""")
-
-
-def generate_notification_registry(func_list, base_package, plugin_package, plugin_name, notification_package, callback_package, dto_package, inputfile):
- """ Generates notification registry interface and implementation """
- print "Generating Notification interfaces and implementation"
-
- if not os.path.exists(notification_package):
- raise Exception("%s folder is missing" % notification_package)
-
- callbacks = []
- register_callback_methods = []
- register_callback_methods_impl = []
- handler_methods = []
- for func in func_list:
-
- if not util.is_notification(func['name']):
- continue
-
- camel_case_name_with_suffix = util.underscore_to_camelcase_upper(func['name'])
- notification_dto = util.add_notification_suffix(camel_case_name_with_suffix)
- callback_ifc = notification_dto + callback_gen.callback_suffix
- fully_qualified_callback_ifc = "{0}.{1}.{2}".format(plugin_package, callback_package, callback_ifc)
- callbacks.append(fully_qualified_callback_ifc)
-
- # TODO create NotificationListenerRegistration and return that instead of AutoCloseable to better indicate
- # that the registration should be closed
- register_callback_methods.append("java.lang.AutoCloseable register{0}({1} callback);"
- .format(callback_ifc, fully_qualified_callback_ifc))
- register_callback_methods_impl.append(register_callback_impl_template.substitute(plugin_package=plugin_package,
- callback_package=callback_package,
- dto_package=dto_package,
- notification=notification_dto,
- callback=callback_ifc))
- handler_methods.append(handler_impl_template.substitute(base_package=base_package,
- plugin_package=plugin_package,
- callback_package=callback_package,
- dto_package=dto_package,
- notification=notification_dto,
- callback=callback_ifc))
-
-
- callback_file = open(os.path.join(notification_package, "%sNotificationRegistry.java" % plugin_name), 'w')
- callback_file.write(notification_registry_template.substitute(inputfile=inputfile,
- register_callback_methods="\n ".join(register_callback_methods),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- notification_package=notification_package))
- callback_file.flush()
- callback_file.close()
-
- callback_file = open(os.path.join(notification_package, "Global%sNotificationCallback.java" % plugin_name), 'w')
-
- global_notification_callback_callbacks = ""
- if (callbacks):
- global_notification_callback_callbacks = " extends " + ", ".join(callbacks)
-
- callback_file.write(global_notification_callback_template.substitute(inputfile=inputfile,
- callbacks=global_notification_callback_callbacks,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- notification_package=notification_package))
- callback_file.flush()
- callback_file.close()
-
- callback_file = open(os.path.join(notification_package, "%sNotificationRegistryImpl.java" % plugin_name), 'w')
- callback_file.write(notification_registry_impl_template.substitute(inputfile=inputfile,
- callback_package=callback_package,
- dto_package=dto_package,
- register_callback_methods="".join(register_callback_methods_impl),
- handler_methods="".join(handler_methods),
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- notification_package=notification_package))
- callback_file.flush()
- callback_file.close()
-
- callback_file = open(os.path.join(notification_package, "%sNotificationRegistryProvider.java" % plugin_name), 'w')
- callback_file.write(notification_provider_template.substitute(inputfile=inputfile,
- base_package=base_package,
- plugin_package=plugin_package,
- plugin_name=plugin_name,
- notification_package=notification_package))
- callback_file.flush()
- callback_file.close()
-
diff --git a/vpp-api/java/jvpp/gen/jvppgen/types_gen.py b/vpp-api/java/jvpp/gen/jvppgen/types_gen.py
deleted file mode 100644
index d12fb3d7..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/types_gen.py
+++ /dev/null
@@ -1,227 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os
-from string import Template
-
-import util
-import jni_gen
-import dto_gen
-
-type_template = Template("""
-package $plugin_package.$type_package;
-
-/**
- * <p>This class represents $c_type_name type definition.
- * <br>It was generated by types_gen.py based on $inputfile preparsed data:
- * <pre>
-$docs
- * </pre>
- */
-public final class $java_type_name {
-$fields
-$methods
-}
-""")
-
-field_template = Template(""" public $type $name;\n""")
-
-
-def generate_type_fields(type_definition):
- """
- Generates fields for class representing typeonly definition
- :param type_definition: python representation of typeonly definition
- :return: string representing class fields
- """
- fields = ""
- for t in zip(type_definition['types'], type_definition['args']):
- field_name = util.underscore_to_camelcase(t[1])
- fields += field_template.substitute(type=util.jni_2_java_type_mapping[t[0]],
- name=field_name)
- return fields
-
-object_struct_setter_template = Template("""
- {
- jclass ${field_reference_name}Class = (*env)->FindClass(env, "${class_FQN}");
- memset (&(mp->${c_name}), 0, sizeof (mp->${c_name}));
- ${struct_initialization}
- }
-""")
-
-object_array_struct_setter_template = Template("""
- {
- jclass ${field_reference_name}ArrayElementClass = (*env)->FindClass(env, "${class_FQN}");
- if (${field_reference_name}) {
- size_t _i;
- jsize cnt = (*env)->GetArrayLength (env, ${field_reference_name});
- ${field_length_check}
- for (_i = 0; _i < cnt; _i++) {
- jobject ${field_reference_name}ArrayElement = (*env)->GetObjectArrayElement(env, ${field_reference_name}, _i);
- memset (&(mp->${c_name}[_i]), 0, sizeof (mp->${c_name}[_i]));
- ${struct_initialization}
- }
- }
- }
-""")
-
-object_dto_field_setter_template = Template("""
- {
- jclass ${field_reference_name}Class = (*env)->FindClass(env, "${class_FQN}");
- jmethodID ${field_reference_name}Constructor = (*env)->GetMethodID(env, ${field_reference_name}Class, "<init>", "()V");
- jobject ${field_reference_name} = (*env)->NewObject(env, ${field_reference_name}Class, ${field_reference_name}Constructor);
- ${type_initialization}
- (*env)->SetObjectField(env, dto, ${field_reference_name}FieldId, ${field_reference_name});
- }
-""")
-
-object_array_dto_field_setter_template = Template("""
- {
- jclass ${field_reference_name}Class = (*env)->FindClass(env, "${class_FQN}");
- jobjectArray ${field_reference_name} = (*env)->NewObjectArray(env, ${field_length}, ${field_reference_name}Class, 0);
- unsigned int _i;
- for (_i = 0; _i < ${field_length}; _i++) {
- jmethodID ${field_reference_name}Constructor = (*env)->GetMethodID(env, ${field_reference_name}Class, "<init>", "()V");
- jobject ${field_reference_name}ArrayElement = (*env)->NewObject(env, ${field_reference_name}Class, ${field_reference_name}Constructor);
- ${type_initialization}
- (*env)->SetObjectArrayElement(env, ${field_reference_name}, _i, ${field_reference_name}ArrayElement);
- }
- (*env)->SetObjectField(env, dto, ${field_reference_name}FieldId, ${field_reference_name});
- }
-""")
-
-
-def generate_struct_initialization(type_def, c_name_prefix, object_name, indent):
- struct_initialization = ""
- # field identifiers
- for t in zip(type_def['types'], type_def['args'], type_def['lengths']):
- field_reference_name = "${c_name}" + util.underscore_to_camelcase_upper(t[1])
- field_name = util.underscore_to_camelcase(t[1])
- struct_initialization += jni_gen.jni_request_binding_for_type(field_type=t[0], c_name=c_name_prefix + t[1],
- field_reference_name=field_reference_name,
- field_name=field_name,
- field_length=t[2][0],
- is_variable_len_array=t[2][1],
- object_name=object_name)
- return indent + struct_initialization.replace('\n', '\n' + indent)
-
-
-def generate_type_setter(handler_name, type_def, c_name_prefix, object_name, indent):
- type_initialization = ""
- for t in zip(type_def['types'], type_def['args'], type_def['lengths']):
- field_length = t[2][0]
- is_variable_len_array = t[2][1]
- length_field_type = None
- if is_variable_len_array:
- length_field_type = type_def['types'][type_def['args'].index(field_length)]
- type_initialization += jni_gen.jni_reply_handler_for_type(handler_name=handler_name,
- ref_name="${field_reference_name}",
- field_type=t[0], c_name=c_name_prefix + t[1],
- field_reference_name="${c_name}" + util.underscore_to_camelcase_upper(t[1]),
- field_name=util.underscore_to_camelcase(t[1]),
- field_length=field_length,
- is_variable_len_array=is_variable_len_array,
- length_field_type=length_field_type,
- object_name=object_name)
- return indent + type_initialization.replace('\n', '\n' + indent)
-
-
-def generate_types(types_list, plugin_package, types_package, inputfile):
- """
- Generates Java representation of custom types defined in api file.
- """
-
- #
- if not types_list:
- print "Skipping custom types generation (%s does not define custom types)." % inputfile
- return
-
- print "Generating custom types"
-
- if not os.path.exists(types_package):
- raise Exception("%s folder is missing" % types_package)
-
- for type in types_list:
- c_type_name = type['name']
- java_type_name = util.underscore_to_camelcase_upper(type['name'])
- dto_path = os.path.join(types_package, java_type_name + ".java")
-
- fields = generate_type_fields(type)
-
- dto_file = open(dto_path, 'w')
- dto_file.write(type_template.substitute(plugin_package=plugin_package,
- type_package=types_package,
- c_type_name=c_type_name,
- inputfile=inputfile,
- docs=util.api_message_to_javadoc(type),
- java_type_name=java_type_name,
- fields=fields,
- methods=dto_gen.generate_dto_base_methods(java_type_name, type)
- ))
-
- # update type mappings:
- # todo fix vpe.api to use type_name instead of vl_api_type_name_t
- type_name = "vl_api_" + c_type_name + "_t"
- java_fqn = "%s.%s.%s" % (plugin_package, types_package, java_type_name)
- util.vpp_2_jni_type_mapping[type_name] = "jobject"
- util.vpp_2_jni_type_mapping[type_name + "[]"] = "jobjectArray"
- util.jni_2_java_type_mapping[type_name] = java_fqn
- util.jni_2_java_type_mapping[type_name + "[]"] = java_fqn + "[]"
- jni_name = java_fqn.replace('.', "/")
- jni_signature = "L" + jni_name + ";"
- util.jni_2_signature_mapping[type_name] = "L" + jni_name + ";"
- util.jni_2_signature_mapping[type_name + "[]"] = "[" + jni_signature
- util.jni_field_accessors[type_name] = "ObjectField"
- util.jni_field_accessors[type_name + "[]"] = "ObjectField"
-
- jni_gen.struct_setter_templates[type_name] = Template(
- object_struct_setter_template.substitute(
- c_name="${c_name}",
- field_reference_name="${field_reference_name}",
- class_FQN=jni_name,
- struct_initialization=generate_struct_initialization(type, "${c_name}.",
- "${field_reference_name}", ' ' * 4))
- )
-
- jni_gen.struct_setter_templates[type_name+ "[]"] = Template(
- object_array_struct_setter_template.substitute(
- c_name="${c_name}",
- field_reference_name="${field_reference_name}",
- field_length_check="${field_length_check}",
- class_FQN=jni_name,
- struct_initialization=generate_struct_initialization(type, "${c_name}[_i].",
- "${field_reference_name}ArrayElement", ' ' * 8))
- )
-
- jni_gen.dto_field_setter_templates[type_name] = Template(
- object_dto_field_setter_template.substitute(
- field_reference_name="${field_reference_name}",
- field_length="${field_length}",
- class_FQN=jni_name,
- type_initialization=generate_type_setter(c_type_name, type, "${c_name}.",
- "${field_reference_name}", ' ' * 4))
- )
-
- jni_gen.dto_field_setter_templates[type_name + "[]"] = Template(
- object_array_dto_field_setter_template.substitute(
- field_reference_name="${field_reference_name}",
- field_length="${field_length}",
- class_FQN=jni_name,
- type_initialization=generate_type_setter(c_type_name, type, "${c_name}[_i].",
- "${field_reference_name}ArrayElement", ' ' * 8))
- )
-
- dto_file.flush()
- dto_file.close()
-
diff --git a/vpp-api/java/jvpp/gen/jvppgen/util.py b/vpp-api/java/jvpp/gen/jvppgen/util.py
deleted file mode 100644
index fc971c17..00000000
--- a/vpp-api/java/jvpp/gen/jvppgen/util.py
+++ /dev/null
@@ -1,220 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-
-import os, pprint
-from os import removedirs
-
-
-def underscore_to_camelcase(name):
- name = name.title().replace("_", "")
- return name[0].lower() + name[1:]
-
-
-def underscore_to_camelcase_upper(name):
- name = name.title().replace("_", "")
- return name[0].upper() + name[1:]
-
-
-def remove_folder(folder):
- """ Remove folder with all its files """
- for root, dirs, files in os.walk(folder, topdown=False):
- for name in files:
- os.remove(os.path.join(root, name))
- removedirs(folder)
-
-
-reply_suffixes = ("reply", "details", "l2fibtableentry")
-
-
-def is_reply(name):
- return name.lower().endswith(reply_suffixes)
-
-
-def is_details(name):
- return name.lower().endswith(reply_suffixes[1]) or name.lower().endswith(reply_suffixes[2])
-
-
-def is_retval_field(name):
- return name == 'retval'
-
-dump_suffix = "dump"
-
-
-def is_dump(name):
- return name.lower().endswith(dump_suffix)
-
-
-def get_reply_suffix(name):
- for reply_suffix in reply_suffixes:
- if name.lower().endswith(reply_suffix):
- if reply_suffix == reply_suffixes[2]:
- # FIXME workaround for l2_fib_table_entry
- return 'entry'
- else:
- return reply_suffix
-
-# Mapping according to:
-# http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html
-#
-# Unsigned types are converted to signed java types that have the same size.
-# It is the API user responsibility to interpret them correctly.
-jni_2_java_type_mapping = {'u8': 'byte',
- 'u8[]': 'byte[]',
- 'i8': 'byte',
- 'i8[]': 'byte[]',
- 'u16': 'short',
- 'u16[]': 'short[]',
- 'i16': 'short',
- 'i16[]': 'short[]',
- 'u32': 'int',
- 'u32[]': 'int[]',
- 'i32': 'int',
- 'i32[]': 'int[]',
- 'u64': 'long',
- 'u64[]': 'long[]',
- 'i64': 'long',
- 'i64[]': 'long[]',
- 'f64': 'double',
- 'f64[]': 'double[]'
- }
-
-vpp_2_jni_type_mapping = {'u8': 'jbyte',
- 'u8[]': 'jbyteArray',
- 'i8': 'jbyte',
- 'u8[]': 'jbyteArray',
- 'u16': 'jshort',
- 'u16[]': 'jshortArray',
- 'i16': 'jshort',
- 'i16[]': 'jshortArray',
- 'u32': 'jint',
- 'u32[]': 'jintArray',
- 'i32': 'jint',
- 'i32[]': 'jintArray',
- 'u64': 'jlong',
- 'u64[]': 'jlongArray',
- 'i64': 'jlong',
- 'i64[]': 'jlongArray',
- 'f64': 'jdouble',
- 'f64[]': 'jdoubleArray'
- }
-
-# https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/types.html#type_signatures
-jni_2_signature_mapping = {'u8': 'B',
- 'u8[]': '[B',
- 'i8': 'B',
- 'i8[]': '[B',
- 'u16': 'S',
- 'u16[]': '[S',
- 'i16': 'S',
- 'i16[]': '[S',
- 'u32': 'I',
- 'u32[]': '[I',
- 'i32': 'I',
- 'i32[]': '[I',
- 'u64': 'J',
- 'u64[]': '[J',
- 'i64': 'J',
- 'i64[]': '[J',
- 'f64': 'D',
- 'f64[]': '[D'
- }
-
-# https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#Get_type_Field_routines
-jni_field_accessors = {'u8': 'ByteField',
- 'u8[]': 'ObjectField',
- 'i8': 'ByteField',
- 'i8[]': 'ObjectField',
- 'u16': 'ShortField',
- 'u16[]': 'ObjectField',
- 'i16': 'ShortField',
- 'i16[]': 'ObjectField',
- 'u32': 'IntField',
- 'u32[]': 'ObjectField',
- 'i32': 'IntField',
- 'i32[]': 'ObjectField',
- 'u64': 'LongField',
- 'u64[]': 'ObjectField',
- 'i64': 'LongField',
- 'i64[]': 'ObjectField',
- 'f64': 'DoubleField',
- 'f64[]': 'ObjectField'
- }
-
-
-# vpe.api calls that do not follow naming conventions and have to be handled exceptionally when finding reply -> request mapping
-# FIXME in vpe.api
-unconventional_naming_rep_req = {
- 'cli_reply': 'cli_request',
- 'vnet_summary_stats_reply': 'vnet_get_summary_stats',
- # This below is actually a sub-details callback. We cannot derive the mapping of dump request
- # belonging to this sub-details from naming conventions. We need special mapping
- 'bridge_domain_sw_if_details': 'bridge_domain',
- # This is standard dump call + details reply. However it's not called details but entry
- 'l2_fib_table_entry': 'l2_fib_table'
- }
-
-#
-# FIXME no convention in the naming of events (notifications) in vpe.api
-notifications_message_suffixes = ("event", "counters")
-notification_messages_reused = ["sw_interface_set_flags"]
-
-# messages that must be ignored. These messages are INSUFFICIENTLY marked as disabled in vpe.api
-# FIXME
-ignored_messages = ["is_address_reachable"]
-
-
-def is_notification(name):
- """ Returns true if the structure is a notification regardless of its no other use """
- return is_just_notification(name) or name.lower() in notification_messages_reused
-
-
-def is_just_notification(name):
- """ Returns true if the structure is just a notification and has no other use """
- return name.lower().endswith(notifications_message_suffixes)
-
-
-def is_ignored(param):
- return param.lower() in ignored_messages
-
-
-def remove_reply_suffix(camel_case_name_with_suffix):
- return remove_suffix(camel_case_name_with_suffix, get_reply_suffix(camel_case_name_with_suffix))
-
-
-def remove_suffix(camel_case_name_with_suffix, suffix):
- suffix_length = len(suffix)
- return camel_case_name_with_suffix[:-suffix_length] if suffix_length != 0 else camel_case_name_with_suffix
-
-
-def is_control_ping(camel_case_name_with_suffix):
- return camel_case_name_with_suffix.lower().startswith("controlping");
-
-
-def api_message_to_javadoc(api_message):
- """ Converts vpe.api message description to javadoc """
- str = pprint.pformat(api_message, indent=4, width=120, depth=None)
- return " * " + str.replace("\n", "\n * ")
-
-
-notification_dto_suffix = "Notification"
-
-
-def add_notification_suffix(camel_case_dto_name):
- camel_case_dto_name += notification_dto_suffix
- return camel_case_dto_name
-
-
-def is_array(java_type_as_string):
- return java_type_as_string.endswith("[]")
diff --git a/vpp-api/java/m4/ax_check_java_home.m4 b/vpp-api/java/m4/ax_check_java_home.m4
deleted file mode 100644
index cfe8f589..00000000
--- a/vpp-api/java/m4/ax_check_java_home.m4
+++ /dev/null
@@ -1,80 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_check_java_home.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_CHECK_JAVA_HOME
-#
-# DESCRIPTION
-#
-# Check for Sun Java (JDK / JRE) installation, where the 'java' VM is in.
-# If found, set environment variable JAVA_HOME = Java installation home,
-# else left JAVA_HOME untouch, which in most case means JAVA_HOME is
-# empty.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Gleen Salmon <gleensalmon@yahoo.com>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 6
-
-AU_ALIAS([AC_CHECK_JAVA_HOME], [AX_CHECK_JAVA_HOME])
-
-AC_DEFUN([AX_CHECK_JAVA_HOME],
-[AC_MSG_CHECKING([for JAVA_HOME])
-# We used a fake loop so that we can use "break" to exit when the result
-# is found.
-while true
-do
- # If the user defined JAVA_HOME, don't touch it.
- test "${JAVA_HOME+set}" = set && break
-
- # On Mac OS X 10.5 and following, run /usr/libexec/java_home to get
- # the value of JAVA_HOME to use.
- # (http://developer.apple.com/library/mac/#qa/qa2001/qa1170.html).
- JAVA_HOME=`/usr/libexec/java_home 2>/dev/null`
- test x"$JAVA_HOME" != x && break
-
- # See if we can find the java executable, and compute from there.
- TRY_JAVA_HOME=`ls -dr /usr/java/* 2> /dev/null | head -n 1`
- if test x$TRY_JAVA_HOME != x; then
- PATH=$PATH:$TRY_JAVA_HOME/bin
- fi
- AC_PATH_PROG([JAVA_PATH_NAME], [java])
- if test "x$JAVA_PATH_NAME" != x; then
- JAVA_HOME=`echo $JAVA_PATH_NAME | sed "s/\(.*\)[[/]]bin[[/]]java.*/\1/"`
- break
- fi
-
- AC_MSG_NOTICE([Could not compute JAVA_HOME])
- break
-done
-AC_MSG_RESULT([$JAVA_HOME])
-])
diff --git a/vpp-api/java/m4/ax_check_java_plugin.m4 b/vpp-api/java/m4/ax_check_java_plugin.m4
deleted file mode 100644
index 920753e5..00000000
--- a/vpp-api/java/m4/ax_check_java_plugin.m4
+++ /dev/null
@@ -1,101 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_check_java_plugin.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_CHECK_JAVA_PLUGIN(<shell-variable>)
-#
-# DESCRIPTION
-#
-# This macro sets <shell-variable> to empty on failure and to a compatible
-# version of plugin.jar otherwise. Directories searched are /usr/java/*
-# and /usr/local/java/*, which are assumed to be j{dk,re} installations.
-# Apply the shell variable as you see fit. If sun changes things so
-# <jre>/lib/plugin.jar is not the magic file it will stop working.
-#
-# This macro assumes that unzip, zipinfo or pkzipc is available (and can
-# list the contents of the jar archive). The first two are assumed to work
-# similarly enough to the infozip versisonms. The pkzipc version is
-# assumed to work if I undertstand the documentation on pkware's site but
-# YMMV. I do not have access to pwkware's version to test it.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Duncan Simpson <dps@simpson.demon.co.uk>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 7
-
-AU_ALIAS([DPS_CHECK_PLUGIN], [AX_CHECK_JAVA_PLUGIN])
-AC_DEFUN([AX_CHECK_JAVA_PLUGIN],
-[AC_REQUIRE([AC_PROG_AWK])
-AC_REQUIRE([AC_PROG_FGREP])
-AC_CHECK_PROG(ZIPINFO,[zipinfo unzip pkzipc])
-AC_MSG_CHECKING([for the java plugin])
-case "x$ZIPINFO" in
-[*/zipinfo)]
- zipinf="zipinfo -1" ;;
-[*/unzip)]
- zipinf="unzip -l";;
-[*/pkzipc)]
- ziping="unzipc -view";;
-[x*)]
- AC_MSG_RESULT([skiped, none of zipinfo, unzip and pkzipc found])
- AC_SUBST($1,[])
- zipinf="";;
-esac
-if test "x$zipinf" != "x"; then
-jplugin=""
-for jhome in `ls -dr /usr/java/* /usr/local/java/* 2> /dev/null`; do
-for jfile in lib/plugin.jar jre/lib/plugin.jar; do
-if test "x$jplugin" = "x" && test -f "$jhome/$jfile"; then
-eval "$zipinf $jhome/$jfile | $AWK '{ print \$NF; }' | $FGREP netscape/javascript/JSObject" >/dev/null 2>/dev/null
-if test $? -eq 0; then
-dnl Some version of gcj (and javac) refuse to work with some files
-dnl that pass this test. To stop this problem make sure that the compiler
-dnl still works with this jar file in the classpath
-cat << \EOF > Test.java
-/* [#]line __oline__ "configure" */
-public class Test {
-}
-EOF
-if eval "$JAVAC -classpath $jhome/$jfile Test.java 2>/dev/null >/dev/null" && test -f Test.class; then
-jplugin="$jhome/$jfile"
-fi
-rm -f Test.java Test.class
-fi; fi; done; done
-if test "x$jplugin" != "x"; then
-AC_SUBST($1,$jplugin)
-AC_MSG_RESULT($jplugin)
-else
-AC_MSG_RESULT([java plugin not found])
-AC_SUBST($1,[])
-fi
-fi
-])
diff --git a/vpp-api/java/m4/ax_java_check_class.m4 b/vpp-api/java/m4/ax_java_check_class.m4
deleted file mode 100644
index 917638ae..00000000
--- a/vpp-api/java/m4/ax_java_check_class.m4
+++ /dev/null
@@ -1,85 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_java_check_class.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_JAVA_CHECK_CLASS(<class>,<action-if-found>,<action-if-not-found>)
-#
-# DESCRIPTION
-#
-# Test if a Java class is available. Based on AX_PROG_JAVAC_WORKS. This
-# version uses a cache variable which is both compiler, options and
-# classpath dependent (so if you switch from javac to gcj it correctly
-# notices and redoes the test).
-#
-# The macro tries to compile a minimal program importing <class>. Some
-# newer compilers moan about the failure to use this but fail or produce a
-# class file anyway. All moaing is sunk to /dev/null since I only wanted
-# to know if the class could be imported. This is a recommended followup
-# to AX_CHECK_JAVA_PLUGIN with classpath appropriately adjusted.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Duncan Simpson <dps@simpson.demon.co.uk>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AU_ALIAS([DPS_JAVA_CHECK_CLASS], [AX_JAVA_CHECK_CLASS])
-AC_DEFUN([AX_JAVA_CHECK_CLASS],[
-m4_define([cache_val],[m4_translit(ax_cv_have_java_class_$1, " ." ,"__")])
-if test "x$CLASSPATH" != "x"; then
-xtra=" with classpath ${CLASSPATH}"
-xopts=`echo ${CLASSPATH} | ${SED} 's/^ *://'`
-xopts="-classpath $xopts"
-else xtra=""; xopts=""; fi
-cache_var="cache_val"AS_TR_SH([_Jc_${JAVAC}_Cp_${CLASSPATH}])
-AC_CACHE_CHECK([if the $1 class is available$xtra], [$cache_var], [
-JAVA_TEST=Test.java
-CLASS_TEST=Test.class
-cat << \EOF > $JAVA_TEST
-/* [#]xline __oline__ "configure" */
-import $1;
-public class Test {
-}
-EOF
-if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $xopts $JAVA_TEST) >/dev/null 2>&1; then
- eval "${cache_var}=yes"
-else
- eval "${cache_var}=no"
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
-fi
-rm -f $JAVA_TEST $CLASS_TEST
-])
-if eval 'test "x$'${cache_var}'" = "xyes"'; then
-$2
-true; else
-$3
-false; fi])
diff --git a/vpp-api/java/m4/ax_java_options.m4 b/vpp-api/java/m4/ax_java_options.m4
deleted file mode 100644
index 36c10d92..00000000
--- a/vpp-api/java/m4/ax_java_options.m4
+++ /dev/null
@@ -1,48 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_java_options.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_JAVA_OPTIONS
-#
-# DESCRIPTION
-#
-# AX_JAVA_OPTIONS adds configure command line options used for Java m4
-# macros. This Macro is optional.
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 6
-
-AU_ALIAS([AC_JAVA_OPTIONS], [AX_JAVA_OPTIONS])
-AC_DEFUN([AX_JAVA_OPTIONS],[
-AC_ARG_WITH(java-prefix,
- [ --with-java-prefix=PFX prefix where Java runtime is installed (optional)])
-AC_ARG_WITH(javac-flags,
- [ --with-javac-flags=FLAGS flags to pass to the Java compiler (optional)])
-AC_ARG_WITH(java-flags,
- [ --with-java-flags=FLAGS flags to pass to the Java VM (optional)])
-JAVAPREFIX=$with_java_prefix
-JAVACFLAGS=$with_javac_flags
-JAVAFLAGS=$with_java_flags
-AC_SUBST(JAVAPREFIX)dnl
-AC_SUBST(JAVACFLAGS)dnl
-AC_SUBST(JAVAFLAGS)dnl
-AC_SUBST(JAVA)dnl
-AC_SUBST(JAVAC)dnl
-])
diff --git a/vpp-api/java/m4/ax_libgcj_jar.m4 b/vpp-api/java/m4/ax_libgcj_jar.m4
deleted file mode 100644
index 5e942857..00000000
--- a/vpp-api/java/m4/ax_libgcj_jar.m4
+++ /dev/null
@@ -1,83 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_libgcj_jar.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_LIBGCJ_JAR
-#
-# DESCRIPTION
-#
-# Locate libgcj.jar so you can place it before everything else when using
-# gcj.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Duncan Simpson <dps@simpson.demon.co.uk>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AU_ALIAS([DPS_LIBGCJ_JAR], [AX_LIBGCJ_JAR])
-AC_DEFUN([AX_LIBGCJ_JAR],
-[
-AC_REQUIRE([AC_EXEEXT])
-AC_REQUIRE([AX_PROG_JAVAC])
-AC_REQUIRE([AC_PROG_FGREP])
-AC_PROG_SED
-if test "x$SED" = "x"; then
-AC_MSG_WARN([sed not avaiable, so libgcj.jar test skipped])
-else
-AC_MSG_CHECKING([if $JAVAC is gcj]);
-jc=`eval "[echo x$JAVAC | $SED 's/^x.*\\/\\([^/]*\\)\$/x\\1/;s/^ *\\([^ ]*\\) .*$/\\1/;s/"$EXEEXT"$//']"`
-if test "x$jc" != "xxgcj"; then
-AC_MSG_RESULT(no)
-else
-AC_MSG_RESULT(yes)
-AC_MSG_CHECKING([libgcj.jar location])
-save_cp="$CLASSPATH";
-unset CLASSPATH;
-AC_MSG_CHECKING([gcj default classpath])
-cat << \EOF > Test.java
-/* [#]line __oline__ "configure" */
-public class Test {
-}
-EOF
-lgcj=`eval "[$JAVAC -v -C Test.java 2>&1 | $FGREP \\(system\\) | $SED 's/^ *\\([^ ]*\\) .*$/\\1/;s/\\.jar\\//.jar/']"`;
-if test -f Test.class && test "x$lgcj" != "x"; then
-AC_MSG_RESULT($lgcj)
-$1="$lgcj:"
-else
-AC_MSG_RESULT(failed)
-$1=""
-fi
-if test "x$save_cp" != "x"; then CLASSPATH="$save_cp"; fi
-rm -f Test.java Test.class
-fi
-fi
-])
diff --git a/vpp-api/java/m4/ax_prog_jar.m4 b/vpp-api/java/m4/ax_prog_jar.m4
deleted file mode 100644
index 3c60fcaf..00000000
--- a/vpp-api/java/m4/ax_prog_jar.m4
+++ /dev/null
@@ -1,49 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_jar.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAR
-#
-# DESCRIPTION
-#
-# AX_PROG_JAR tests for an existing jar program. It uses the environment
-# variable JAR then tests in sequence various common jar programs.
-#
-# If you want to force a specific compiler:
-#
-# - at the configure.in level, set JAR=yourcompiler before calling
-# AX_PROG_JAR
-#
-# - at the configure level, setenv JAR
-#
-# You can use the JAR variable in your Makefile.in, with @JAR@.
-#
-# Note: This macro depends on the autoconf M4 macros for Java programs. It
-# is VERY IMPORTANT that you download that whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission.
-#
-# The general documentation of those macros, as well as the sample
-# configure.in, is included in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Egon Willighagen <e.willighagen@science.ru.nl>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 7
-
-AU_ALIAS([AC_PROG_JAR], [AX_PROG_JAR])
-AC_DEFUN([AX_PROG_JAR],[
-AS_IF([test "x$JAVAPREFIX" = x],
- [test "x$JAR" = x && AC_CHECK_PROGS([JAR], [jar])],
- [test "x$JAR" = x && AC_CHECK_PROGS([JAR], [jar], [], [$JAVAPREFIX/bin])])
-test "x$JAR" = x && AC_MSG_ERROR([no acceptable jar program found in \$PATH])
-AC_PROVIDE([$0])dnl
-])
diff --git a/vpp-api/java/m4/ax_prog_java.m4 b/vpp-api/java/m4/ax_prog_java.m4
deleted file mode 100644
index 03961db5..00000000
--- a/vpp-api/java/m4/ax_prog_java.m4
+++ /dev/null
@@ -1,115 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_java.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVA
-#
-# DESCRIPTION
-#
-# Here is a summary of the main macros:
-#
-# AX_PROG_JAVAC: finds a Java compiler.
-#
-# AX_PROG_JAVA: finds a Java virtual machine.
-#
-# AX_CHECK_CLASS: finds if we have the given class (beware of CLASSPATH!).
-#
-# AX_CHECK_RQRD_CLASS: finds if we have the given class and stops
-# otherwise.
-#
-# AX_TRY_COMPILE_JAVA: attempt to compile user given source.
-#
-# AX_TRY_RUN_JAVA: attempt to compile and run user given source.
-#
-# AX_JAVA_OPTIONS: adds Java configure options.
-#
-# AX_PROG_JAVA tests an existing Java virtual machine. It uses the
-# environment variable JAVA then tests in sequence various common Java
-# virtual machines. For political reasons, it starts with the free ones.
-# You *must* call [AX_PROG_JAVAC] before.
-#
-# If you want to force a specific VM:
-#
-# - at the configure.in level, set JAVA=yourvm before calling AX_PROG_JAVA
-#
-# (but after AC_INIT)
-#
-# - at the configure level, setenv JAVA
-#
-# You can use the JAVA variable in your Makefile.in, with @JAVA@.
-#
-# *Warning*: its success or failure can depend on a proper setting of the
-# CLASSPATH env. variable.
-#
-# TODO: allow to exclude virtual machines (rationale: most Java programs
-# cannot run with some VM like kaffe).
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission.
-#
-# A Web page, with a link to the latest CVS snapshot is at
-# <http://www.internatif.org/bortzmeyer/autoconf-Java/>.
-#
-# This is a sample configure.in Process this file with autoconf to produce
-# a configure script.
-#
-# AC_INIT(UnTag.java)
-#
-# dnl Checks for programs.
-# AC_CHECK_CLASSPATH
-# AX_PROG_JAVAC
-# AX_PROG_JAVA
-#
-# dnl Checks for classes
-# AX_CHECK_RQRD_CLASS(org.xml.sax.Parser)
-# AX_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver)
-#
-# AC_OUTPUT(Makefile)
-#
-# LICENSE
-#
-# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AU_ALIAS([AC_PROG_JAVA], [AX_PROG_JAVA])
-AC_DEFUN([AX_PROG_JAVA],[
-m4_define([m4_ax_prog_java_list], [kaffe java])dnl
-AS_IF([test "x$JAVAPREFIX" = x],
- [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [m4_ax_prog_java_list])],
- [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [m4_ax_prog_java_list], [], [$JAVAPREFIX/bin])])
-test x$JAVA = x && AC_MSG_ERROR([no acceptable Java virtual machine found in \$PATH])
-m4_undefine([m4_ax_prog_java_list])dnl
-AX_PROG_JAVA_WORKS
-AC_PROVIDE([$0])dnl
-])
diff --git a/vpp-api/java/m4/ax_prog_java_cc.m4 b/vpp-api/java/m4/ax_prog_java_cc.m4
deleted file mode 100644
index 3df064ff..00000000
--- a/vpp-api/java/m4/ax_prog_java_cc.m4
+++ /dev/null
@@ -1,104 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_java_cc.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVA_CC
-#
-# DESCRIPTION
-#
-# Finds the appropriate java compiler on your path. By preference the java
-# compiler is gcj, then jikes then javac.
-#
-# The macro can take one argument specifying a space separated list of
-# java compiler names.
-#
-# For example:
-#
-# AX_PROG_JAVA_CC(javac, gcj)
-#
-# The macro also sets the compiler options variable: JAVA_CC_OPTS to
-# something sensible:
-#
-# - for GCJ it sets it to: @GCJ_OPTS@
-# (if GCJ_OPTS is not yet defined then it is set to "-C")
-#
-# - no other compiler has applicable options yet
-#
-# Here's an example configure.in:
-#
-# AC_INIT(Makefile.in)
-# AX_PROG_JAVA_CC()
-# AC_OUTPUT(Makefile)
-# dnl End.
-#
-# And here's the start of the Makefile.in:
-#
-# PROJECT_ROOT := @srcdir@
-# # Tool definitions.
-# JAVAC := @JAVA_CC@
-# JAVAC_OPTS := @JAVA_CC_OPTS@
-# JAR_TOOL := @jar_tool@
-#
-# LICENSE
-#
-# Copyright (c) 2008 Nic Ferrier <nferrier@tapsellferrier.co.uk>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 4
-
-# AX_PROG_JAVA_CC([COMPILER ...])
-# --------------------------
-# COMPILER ... is a space separated list of java compilers to search for.
-# This just gives the user an opportunity to specify an alternative
-# search list for the java compiler.
-AU_ALIAS([AC_PROG_JAVA_CC], [AX_PROG_JAVA_CC])
-AC_DEFUN([AX_PROG_JAVA_CC],
-[AC_ARG_VAR([JAVA_CC], [java compiler command])dnl
-AC_ARG_VAR([JAVA_CC_FLAGS], [java compiler flags])dnl
-m4_ifval([$1],
- [AC_CHECK_TOOLS(JAVA_CC, [$1])],
-[AC_CHECK_TOOL(JAVA_CC, gcj)
-if test -z "$JAVA_CC"; then
- AC_CHECK_TOOL(JAVA_CC, javac)
-fi
-if test -z "$JAVA_CC"; then
- AC_CHECK_TOOL(JAVA_CC, jikes)
-fi
-])
-
-if test "$JAVA_CC" = "gcj"; then
- if test "$GCJ_OPTS" = ""; then
- AC_SUBST(GCJ_OPTS,-C)
- fi
- AC_SUBST(JAVA_CC_OPTS, @GCJ_OPTS@,
- [Define the compilation options for GCJ])
-fi
-test -z "$JAVA_CC" && AC_MSG_ERROR([no acceptable java compiler found in \$PATH])
-])# AX_PROG_JAVA_CC
diff --git a/vpp-api/java/m4/ax_prog_java_works.m4 b/vpp-api/java/m4/ax_prog_java_works.m4
deleted file mode 100644
index 54e132af..00000000
--- a/vpp-api/java/m4/ax_prog_java_works.m4
+++ /dev/null
@@ -1,134 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_java_works.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVA_WORKS
-#
-# DESCRIPTION
-#
-# Internal use ONLY.
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 9
-
-AU_ALIAS([AC_PROG_JAVA_WORKS], [AX_PROG_JAVA_WORKS])
-AC_DEFUN([AX_PROG_JAVA_WORKS], [
-AC_PATH_PROG(UUDECODE, uudecode, [no])
-if test x$UUDECODE != xno; then
-AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [
-dnl /**
-dnl * Test.java: used to test if java compiler works.
-dnl */
-dnl public class Test
-dnl {
-dnl
-dnl public static void
-dnl main( String[] argv )
-dnl {
-dnl System.exit (0);
-dnl }
-dnl
-dnl }
-cat << \EOF > Test.uue
-begin-base64 644 Test.class
-yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE
-bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51
-bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s
-YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG
-aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB
-AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB
-AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ=
-====
-EOF
-if $UUDECODE Test.uue; then
- ac_cv_prog_uudecode_base64=yes
-else
- echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AS_MESSAGE_LOG_FD
- echo "configure: failed file was:" >&AS_MESSAGE_LOG_FD
- cat Test.uue >&AS_MESSAGE_LOG_FD
- ac_cv_prog_uudecode_base64=no
-fi
-rm -f Test.uue])
-fi
-if test x$ac_cv_prog_uudecode_base64 != xyes; then
- rm -f Test.class
- AC_MSG_WARN([I have to compile Test.class from scratch])
- if test x$ac_cv_prog_javac_works = xno; then
- AC_MSG_ERROR([Cannot compile java source. $JAVAC does not work properly])
- fi
- if test x$ac_cv_prog_javac_works = x; then
- AX_PROG_JAVAC
- fi
-fi
-AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [
-JAVA_TEST=Test.java
-CLASS_TEST=Test.class
-TEST=Test
-changequote(, )dnl
-cat << \EOF > $JAVA_TEST
-/* [#]line __oline__ "configure" */
-public class Test {
-public static void main (String args[]) {
- System.exit (0);
-} }
-EOF
-changequote([, ])dnl
-if test x$ac_cv_prog_uudecode_base64 != xyes; then
- if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then
- :
- else
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
- AC_MSG_ERROR(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?))
- fi
-fi
-if AC_TRY_COMMAND($JAVA -classpath . $JAVAFLAGS $TEST) >/dev/null 2>&1; then
- ac_cv_prog_java_works=yes
-else
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
- AC_MSG_ERROR(The Java VM $JAVA failed (see config.log, check the CLASSPATH?))
-fi
-rm -fr $JAVA_TEST $CLASS_TEST Test.uue
-])
-AC_PROVIDE([$0])dnl
-]
-)
diff --git a/vpp-api/java/m4/ax_prog_javac.m4 b/vpp-api/java/m4/ax_prog_javac.m4
deleted file mode 100644
index d061243c..00000000
--- a/vpp-api/java/m4/ax_prog_javac.m4
+++ /dev/null
@@ -1,79 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_javac.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVAC
-#
-# DESCRIPTION
-#
-# AX_PROG_JAVAC tests an existing Java compiler. It uses the environment
-# variable JAVAC then tests in sequence various common Java compilers. For
-# political reasons, it starts with the free ones.
-#
-# If you want to force a specific compiler:
-#
-# - at the configure.in level, set JAVAC=yourcompiler before calling
-# AX_PROG_JAVAC
-#
-# - at the configure level, setenv JAVAC
-#
-# You can use the JAVAC variable in your Makefile.in, with @JAVAC@.
-#
-# *Warning*: its success or failure can depend on a proper setting of the
-# CLASSPATH env. variable.
-#
-# TODO: allow to exclude compilers (rationale: most Java programs cannot
-# compile with some compilers like guavac).
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 7
-
-AU_ALIAS([AC_PROG_JAVAC], [AX_PROG_JAVAC])
-AC_DEFUN([AX_PROG_JAVAC],[
-m4_define([m4_ax_prog_javac_list],["gcj -C" guavac jikes javac])dnl
-AS_IF([test "x$JAVAPREFIX" = x],
- [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list])],
- [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list], [], [$JAVAPREFIX/bin])])
-m4_undefine([m4_ax_prog_javac_list])dnl
-test "x$JAVAC" = x && AC_MSG_ERROR([no acceptable Java compiler found in \$PATH])
-AX_PROG_JAVAC_WORKS
-AC_PROVIDE([$0])dnl
-])
diff --git a/vpp-api/java/m4/ax_prog_javac_works.m4 b/vpp-api/java/m4/ax_prog_javac_works.m4
deleted file mode 100644
index 7dfa1e37..00000000
--- a/vpp-api/java/m4/ax_prog_javac_works.m4
+++ /dev/null
@@ -1,72 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_javac_works.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVAC_WORKS
-#
-# DESCRIPTION
-#
-# Internal use ONLY.
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Stephane Bortzmeyer <bortzmeyer@pasteur.fr>
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by the
-# Free Software Foundation; either version 2 of the License, or (at your
-# option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-# Public License for more details.
-#
-# You should have received a copy of the GNU General Public License along
-# with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# As a special exception, the respective Autoconf Macro's copyright owner
-# gives unlimited permission to copy, distribute and modify the configure
-# scripts that are the output of Autoconf when processing the Macro. You
-# need not follow the terms of the GNU General Public License when using
-# or distributing such scripts, even though portions of the text of the
-# Macro appear in them. The GNU General Public License (GPL) does govern
-# all other use of the material that constitutes the Autoconf Macro.
-#
-# This special exception to the GPL applies to versions of the Autoconf
-# Macro released by the Autoconf Archive. When you make and distribute a
-# modified version of the Autoconf Macro, you may extend this special
-# exception to the GPL to apply to your modified version as well.
-
-#serial 6
-
-AU_ALIAS([AC_PROG_JAVAC_WORKS], [AX_PROG_JAVAC_WORKS])
-AC_DEFUN([AX_PROG_JAVAC_WORKS],[
-AC_CACHE_CHECK([if $JAVAC works], ac_cv_prog_javac_works, [
-JAVA_TEST=Test.java
-CLASS_TEST=Test.class
-cat << \EOF > $JAVA_TEST
-/* [#]line __oline__ "configure" */
-public class Test {
-}
-EOF
-if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then
- ac_cv_prog_javac_works=yes
-else
- AC_MSG_ERROR([The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)])
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat $JAVA_TEST >&AS_MESSAGE_LOG_FD
-fi
-rm -f $JAVA_TEST $CLASS_TEST
-])
-AC_PROVIDE([$0])dnl
-])
diff --git a/vpp-api/java/m4/ax_prog_javadoc.m4 b/vpp-api/java/m4/ax_prog_javadoc.m4
deleted file mode 100644
index bcb6045a..00000000
--- a/vpp-api/java/m4/ax_prog_javadoc.m4
+++ /dev/null
@@ -1,50 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_javadoc.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVADOC
-#
-# DESCRIPTION
-#
-# AX_PROG_JAVADOC tests for an existing javadoc generator. It uses the
-# environment variable JAVADOC then tests in sequence various common
-# javadoc generator.
-#
-# If you want to force a specific compiler:
-#
-# - at the configure.in level, set JAVADOC=yourgenerator before calling
-# AX_PROG_JAVADOC
-#
-# - at the configure level, setenv JAVADOC
-#
-# You can use the JAVADOC variable in your Makefile.in, with @JAVADOC@.
-#
-# Note: This macro depends on the autoconf M4 macros for Java programs. It
-# is VERY IMPORTANT that you download that whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission.
-#
-# The general documentation of those macros, as well as the sample
-# configure.in, is included in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Egon Willighagen <e.willighagen@science.ru.nl>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 8
-
-AU_ALIAS([AC_PROG_JAVADOC], [AX_PROG_JAVADOC])
-AC_DEFUN([AX_PROG_JAVADOC],[
-AS_IF([test "x$JAVAPREFIX" = x],
- [test "x$JAVADOC" = x && AC_CHECK_PROGS([JAVADOC], [javadoc])],
- [test "x$JAVADOC" = x && AC_CHECK_PROGS([JAVADOC], [javadoc], [], [$JAVAPREFIX/bin])])
-test "x$JAVADOC" = x && AC_MSG_ERROR([no acceptable javadoc generator found in \$PATH])
-AC_PROVIDE([$0])dnl
-])
diff --git a/vpp-api/java/m4/ax_prog_javah.m4 b/vpp-api/java/m4/ax_prog_javah.m4
deleted file mode 100644
index cefc616d..00000000
--- a/vpp-api/java/m4/ax_prog_javah.m4
+++ /dev/null
@@ -1,64 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_prog_javah.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_PROG_JAVAH
-#
-# DESCRIPTION
-#
-# AX_PROG_JAVAH tests the availability of the javah header generator and
-# looks for the jni.h header file. If available, JAVAH is set to the full
-# path of javah and CPPFLAGS is updated accordingly.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Luc Maisonobe <luc@spaceroots.org>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 8
-
-AU_ALIAS([AC_PROG_JAVAH], [AX_PROG_JAVAH])
-AC_DEFUN([AX_PROG_JAVAH],[
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_CPP])dnl
-AC_PATH_PROG(JAVAH,javah)
-AS_IF([test -n "$ac_cv_path_JAVAH"],
- [
- AC_TRY_CPP([#include <jni.h>],,[
- ac_save_CPPFLAGS="$CPPFLAGS"
- _ACJAVAH_FOLLOW_SYMLINKS("$ac_cv_path_JAVAH")
- ax_prog_javah_bin_dir=`AS_DIRNAME([$_ACJAVAH_FOLLOWED])`
- ac_dir="`AS_DIRNAME([$ax_prog_javah_bin_dir])`/include"
- AS_CASE([$build_os],
- [cygwin*],
- [ac_machdep=win32],
- [ac_machdep=`AS_ECHO($build_os) | sed 's,[[-0-9]].*,,'`])
- CPPFLAGS="$ac_save_CPPFLAGS -I$ac_dir -I$ac_dir/$ac_machdep"
- AC_TRY_CPP([#include <jni.h>],
- ac_save_CPPFLAGS="$CPPFLAGS",
- AC_MSG_WARN([unable to include <jni.h>]))
- CPPFLAGS="$ac_save_CPPFLAGS"])
- ])
-])
-
-AC_DEFUN([_ACJAVAH_FOLLOW_SYMLINKS],[
-# find the include directory relative to the javac executable
-_cur="$1"
-while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do
- AC_MSG_CHECKING([symlink for $_cur])
- _slink=`ls -ld "$_cur" | sed 's/.* -> //'`
- case "$_slink" in
- /*) _cur="$_slink";;
- # 'X' avoids triggering unwanted echo options.
- *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";;
- esac
- AC_MSG_RESULT([$_cur])
-done
-_ACJAVAH_FOLLOWED="$_cur"
-])
diff --git a/vpp-api/java/m4/ax_try_compile_java.m4 b/vpp-api/java/m4/ax_try_compile_java.m4
deleted file mode 100644
index a8ed6b2a..00000000
--- a/vpp-api/java/m4/ax_try_compile_java.m4
+++ /dev/null
@@ -1,55 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_try_compile_java.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_TRY_COMPILE_JAVA
-#
-# DESCRIPTION
-#
-# AX_TRY_COMPILE_JAVA attempt to compile user given source.
-#
-# *Warning*: its success or failure can depend on a proper setting of the
-# CLASSPATH env. variable.
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 8
-
-AU_ALIAS([AC_TRY_COMPILE_JAVA], [AX_TRY_COMPILE_JAVA])
-AC_DEFUN([AX_TRY_COMPILE_JAVA],[
-AC_REQUIRE([AX_PROG_JAVAC])dnl
-cat << \EOF > Test.java
-/* [#]line __oline__ "configure" */
-ifelse([$1], , , [import $1;])
-public class Test {
-[$2]
-}
-EOF
-if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class
-then
-dnl Don't remove the temporary files here, so they can be examined.
- ifelse([$3], , :, [$3])
-else
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat Test.java >&AS_MESSAGE_LOG_FD
-ifelse([$4], , , [ rm -fr Test.java Test.class
- $4
-])dnl
-fi
-rm -fr Test.java Test.class])
diff --git a/vpp-api/java/m4/ax_try_run_java.m4 b/vpp-api/java/m4/ax_try_run_java.m4
deleted file mode 100644
index c680f03f..00000000
--- a/vpp-api/java/m4/ax_try_run_java.m4
+++ /dev/null
@@ -1,56 +0,0 @@
-# ===========================================================================
-# http://www.gnu.org/software/autoconf-archive/ax_try_run_java.html
-# ===========================================================================
-#
-# SYNOPSIS
-#
-# AX_TRY_RUN_JAVA
-#
-# DESCRIPTION
-#
-# AX_TRY_RUN_JAVA attempt to compile and run user given source.
-#
-# *Warning*: its success or failure can depend on a proper setting of the
-# CLASSPATH env. variable.
-#
-# Note: This is part of the set of autoconf M4 macros for Java programs.
-# It is VERY IMPORTANT that you download the whole set, some macros depend
-# on other. Unfortunately, the autoconf archive does not support the
-# concept of set of macros, so I had to break it for submission. The
-# general documentation, as well as the sample configure.in, is included
-# in the AX_PROG_JAVA macro.
-#
-# LICENSE
-#
-# Copyright (c) 2008 Devin Weaver <ktohg@tritarget.com>
-#
-# Copying and distribution of this file, with or without modification, are
-# permitted in any medium without royalty provided the copyright notice
-# and this notice are preserved. This file is offered as-is, without any
-# warranty.
-
-#serial 2
-
-AU_ALIAS([AC_TRY_RUN_JAVA], [AX_TRY_RUN_JAVA])
-AC_DEFUN([AX_TRY_RUN_JAVA],[
-AC_REQUIRE([AX_PROG_JAVAC])dnl
-AC_REQUIRE([AX_PROG_JAVA])dnl
-cat << \EOF > Test.java
-/* [#]line __oline__ "configure" */
-ifelse([$1], , , [include $1;])
-public class Test {
-[$2]
-}
-EOF
-if AC_TRY_COMMAND($JAVAC $JAVACFLAGS Test.java) && test -s Test.class && ($JAVA $JAVAFLAGS Test; exit) 2>/dev/null
-then
-dnl Don't remove the temporary files here, so they can be examined.
- ifelse([$3], , :, [$3])
-else
- echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD
- cat Test.java >&AS_MESSAGE_LOG_FD
-ifelse([$4], , , [ rm -fr Test.java Test.class
- $4
-])dnl
-fi
-rm -fr Test.java Test.class])
diff --git a/vpp-api/lua/README.md b/vpp-api/lua/README.md
deleted file mode 100644
index 4ecdb34d..00000000
--- a/vpp-api/lua/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-This is the experimental version of Lua API, aimed for the luajit use.
-
-Please take a look and send the feedback to ayourtch@gmail.com.
-
-To run the examples here:
-
-1) install luajit - "sudo apt-get install luajit" on ubuntu
-
-2) "make build-vpp-api" in the top VPP directory
-
-3) "make run" in a separate terminal window
- This ensures you have an instance of VPP running
-
-4) sudo luajit examples/example-cli.lua
-
-This will result in something like this:
-
-Version:
-00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
-
-{ [1] = { ["luaapi_message_name"] = show_version_reply,["program"] = vpe,["version"] = ,["build_date"] = Fri Nov 25 10:58:48 UTC 2016,["retval"] = 0,["build_directory"] = /home/ubuntu/vpp,["_vl_msg_id"] = 170,["context"] = 0,} ,}
----
-{ [1] = { ["luaapi_message_name"] = cli_inband_reply,["_vl_msg_id"] = 94,["length"] = 66,["reply"] = vpp v built by ubuntu on vpp-toys at Fri Nov 25 10:58:48 UTC 2016
-,["retval"] = 0,["context"] = 0,} ,}
----
-
-5) You can also run the performance test bench:
-
-$ sudo luajit bench.lua
-10001 iterations, average speed 5624LL per second
-10001 iterations, average speed 6650LL per second
-10001 iterations, average speed 6053LL per second
-10001 iterations, average speed 7056LL per second
-10001 iterations, average speed 6388LL per second
-10001 iterations, average speed 5849LL per second
-10001 iterations, average speed 6321LL per second
-10001 iterations, average speed 6368LL per second
-10001 iterations, average speed 5958LL per second
-10001 iterations, average speed 6482LL per second
-Average tps across the tests: 6274LL
-
-Note: the above is run in an lxd container running inside 2-core
-xhyve VM on a Macbook Pro, so I would not take the performance numbers for granted :)
-
-The "examples" directory contains a few naive examples, as well as a couple of more
-advanced ones - a tab-completing CLI for VPP that can call both the APIs and CLI,
-and also a small test utility which I use for automating some small tests using
-VPP.
-
diff --git a/vpp-api/lua/bench.lua b/vpp-api/lua/bench.lua
deleted file mode 100644
index 8e5a0b4b..00000000
--- a/vpp-api/lua/bench.lua
+++ /dev/null
@@ -1,70 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
-local vpp = require "vpp-lapi"
-
-local ffi = require "ffi"
-
-ffi.cdef([[
- struct timespec {
- long tv_sec; /* seconds */
- long tv_nsec; /* nanoseconds */
- };
-
- int clock_gettime(int clk_id, struct timespec *tp);
-]])
-
-
-local time_cache = ffi.new("struct timespec[1]")
-local time_cache_1 = time_cache[0]
-function get_ns()
- ffi.C.clock_gettime(0, time_cache)
- return time_cache_1.tv_nsec + 1000000000 * time_cache_1.tv_sec
-end
-
-function do_bench()
- local cycle_start = get_ns()
- local n_iterations = 10000
- local count = 1
- for i = 1,n_iterations do
- -- print(i)
- vpp:api_call("show_version")
- count = count + 1
- -- print(i, "done")
- end
- cycle_end = get_ns()
- local tps = n_iterations*1000000000LL/(cycle_end - cycle_start)
- print (tostring(count) .. " iterations, average speed " .. tostring(tps) .. " per second")
- return tps
-end
-
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_lite_debug-native/vpp-api/lib64/libpneum.so"
-vpp:init({ pneum_path = pneum_path })
-vpp:json_api(root_dir .. "/build-root/install-vpp_lite_debug-native/vpp/vpp-api/vpe.api.json")
-
-vpp:connect("lua-bench")
-local n_tests = 10
-local tps_acc = 0LL
-for i=1,n_tests do
- tps_acc = tps_acc + do_bench()
-end
-print("Average tps across the tests: " .. tostring(tps_acc/n_tests))
-
-vpp:disconnect()
-
-
diff --git a/vpp-api/lua/examples/cli/README.md b/vpp-api/lua/examples/cli/README.md
deleted file mode 100644
index 3a5f8ee9..00000000
--- a/vpp-api/lua/examples/cli/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a small experiment to have a wrapper CLI which can call both API functions as well as debug CLI.
-
-To facilitate tab completion and help, the API call names are broken up with spaces replacing the underscores.
-
-
diff --git a/vpp-api/lua/examples/cli/lua-cli.lua b/vpp-api/lua/examples/cli/lua-cli.lua
deleted file mode 100644
index b3a24d7d..00000000
--- a/vpp-api/lua/examples/cli/lua-cli.lua
+++ /dev/null
@@ -1,747 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
--- Experimental prototype CLI using API to VPP, with tab completion
---
--- Written by Andrew Yourtchenko (ayourtch@cisco.com) 2010,2016
---
-
-vpp = require "vpp-lapi"
-
-
-local dotdotdot = "..."
-
--- First the "readline" routine
-
-readln = {
-split = function(str, pat)
- local t = {} -- NOTE: use {n = 0} in Lua-5.0
- local fpat = "(.-)" .. pat
- local last_end = 1
- if str then
- local s, e, cap = str:find(fpat, 1)
- while s do
- if s ~= 1 or cap ~= "" then
- table.insert(t,cap)
- end
- last_end = e+1
- s, e, cap = str:find(fpat, last_end)
- end
- if last_end <= #str then
- cap = str:sub(last_end)
- table.insert(t, cap)
- end
- end
- return t
-end,
-
-reader = function()
- local rl = {}
-
- rl.init = function()
- os.execute("stty -icanon min 1 -echo")
- rl.rawmode = true
- end
-
- rl.done = function()
- os.execute("stty icanon echo")
- rl.rawmode = false
- end
-
- rl.prompt = ">"
- rl.history = { "" }
- rl.history_index = 1
- rl.history_length = 1
-
- rl.hide_cmd = function()
- local bs = string.char(8) .. " " .. string.char(8)
- for i = 1, #rl.command do
- io.stdout:write(bs)
- end
- end
-
- rl.show_cmd = function()
- if rl.command then
- io.stdout:write(rl.command)
- end
- end
-
- rl.store_history = function(cmd)
- if cmd == "" then
- return
- end
- rl.history[rl.history_length] = cmd
- rl.history_length = rl.history_length + 1
- rl.history_index = rl.history_length
- rl.history[rl.history_length] = ""
- end
-
- rl.readln = function()
- local done = false
- local need_prompt = true
- rl.command = ""
-
- if not rl.rawmode then
- rl.init()
- end
-
- while not done do
- if need_prompt then
- io.stdout:write(rl.prompt)
- io.stdout:write(rl.command)
- need_prompt = false
- end
-
- local ch = io.stdin:read(1)
- if ch:byte(1) == 27 then
- -- CONTROL
- local ch2 = io.stdin:read(1)
- -- arrows
- if ch2:byte(1) == 91 then
- local ch3 = io.stdin:read(1)
- local b = ch3:byte(1)
- if b == 65 then
- ch = "UP"
- elseif b == 66 then
- ch = "DOWN"
- elseif b == 67 then
- ch = "RIGHT"
- elseif b == 68 then
- ch = "LEFT"
- end
- -- print("Byte: " .. ch3:byte(1))
- -- if ch3:byte(1)
- end
- end
-
- if ch == "?" then
- io.stdout:write(ch)
- io.stdout:write("\n")
- if rl.help then
- rl.help(rl)
- end
- need_prompt = true
- elseif ch == "\t" then
- if rl.tab_complete then
- rl.tab_complete(rl)
- end
- io.stdout:write("\n")
- need_prompt = true
- elseif ch == "\n" then
- io.stdout:write(ch)
- done = true
- elseif ch == "\004" then
- io.stdout:write("\n")
- rl.command = nil
- done = true
- elseif ch == string.char(127) then
- if rl.command ~= "" then
- io.stdout:write(string.char(8) .. " " .. string.char(8))
- rl.command = string.sub(rl.command, 1, -2)
- end
- elseif #ch > 1 then
- -- control char
- if ch == "UP" then
- rl.hide_cmd()
- if rl.history_index == #rl.history then
- rl.history[rl.history_index] = rl.command
- end
- if rl.history_index > 1 then
- rl.history_index = rl.history_index - 1
- rl.command = rl.history[rl.history_index]
- end
- rl.show_cmd()
- elseif ch == "DOWN" then
- rl.hide_cmd()
- if rl.history_index < rl.history_length then
- rl.history_index = rl.history_index + 1
- rl.command = rl.history[rl.history_index]
- end
- rl.show_cmd()
- end
- else
- io.stdout:write(ch)
- rl.command = rl.command .. ch
- end
- end
- if rl.command then
- rl.store_history(rl.command)
- end
- return rl.command
- end
- return rl
-end
-
-}
-
---[[
-
-r = reader()
-
-local done = false
-
-while not done do
- local cmd = r.readln()
- print("Command: " .. tostring(cmd))
- if not cmd or cmd == "quit" then
- done = true
- end
-end
-
-r.done()
-
-]]
-
---------- MDS show tech parser
-
-local print_section = nil
-local list_sections = false
-
-local curr_section = "---"
-local curr_parser = nil
-
--- by default operate in batch mode
-local batch_mode = true
-
-local db = {}
-local device = {}
-device.output = {}
-local seen_section = {}
-
-function start_collection(name)
- device = {}
- seen_section = {}
-end
-
-function print_error(errmsg)
- print("@#$:" .. errmsg)
-end
-
-function keys(tbl)
- local t = {}
- for k, v in pairs(tbl) do
- table.insert(t, k)
- end
- return t
-end
-
-function tset (parent, ...)
-
- -- print ('set', ...)
-
- local len = select ('#', ...)
- local key, value = select (len-1, ...)
- local cutpoint, cutkey
-
- for i=1,len-2 do
-
- local key = select (i, ...)
- local child = parent[key]
-
- if value == nil then
- if child == nil then return
- elseif next (child, next (child)) then cutpoint = nil cutkey = nil
- elseif cutpoint == nil then cutpoint = parent cutkey = key end
-
- elseif child == nil then child = {} parent[key] = child end
-
- parent = child
- end
-
- if value == nil and cutpoint then cutpoint[cutkey] = nil
- else parent[key] = value return value end
- end
-
-
-function tget (parent, ...)
- local len = select ('#', ...)
- for i=1,len do
- parent = parent[select (i, ...)]
- if parent == nil then break end
- end
- return parent
- end
-
-
-local pager_lines = 23
-local pager_printed = 0
-local pager_skipping = false
-local pager_filter_pipe = nil
-
-function pager_reset()
- pager_printed = 0
- pager_skipping = false
- if pager_filter_pipe then
- pager_filter_pipe:close()
- pager_filter_pipe = nil
- end
-end
-
-
-function print_more()
- io.stdout:write(" --More-- ")
-end
-
-function print_nomore()
- local bs = string.char(8)
- local bs10 = bs .. bs .. bs .. bs .. bs .. bs .. bs .. bs .. bs .. bs
- io.stdout:write(bs10 .. " " .. bs10)
-end
-
-function print_line(txt)
- if pager_filter_pipe then
- pager_filter_pipe:write(txt .. "\n")
- return
- end
- if pager_printed >= pager_lines then
- print_more()
- local ch = io.stdin:read(1)
- if ch == " " then
- pager_printed = 0
- elseif ch == "\n" then
- pager_printed = pager_printed - 1
- elseif ch == "q" then
- pager_printed = 0
- pager_skipping = true
- end
- print_nomore()
- end
- if not pager_skipping then
- print(txt)
- pager_printed = pager_printed + 1
- else
- -- skip printing
- end
-end
-
-function paged_write(text)
- local t = readln.split(text, "[\n]")
- if string.sub(text, -1) == "\n" then
- table.insert(t, "")
- end
- for i, v in ipairs(t) do
- if i < #t then
- print_line(v)
- else
- if pager_filter_pipe then
- pager_filter_pipe:write(v)
- else
- io.stdout:write(v)
- end
- end
- end
-end
-
-
-
-
-
-function get_choices(tbl, key)
- local res = {}
- for k, v in pairs(tbl) do
- if string.sub(k, 1, #key) == key then
- table.insert(res, k)
- elseif 0 < #key and dotdotdot == k then
- table.insert(res, k)
- end
- end
- return res
-end
-
-function get_exact_choice(choices, val)
- local exact_idx = nil
- local substr_idx = nil
- local substr_seen = false
-
- if #choices == 1 then
- if choices[1] == dotdotdot then
- return 1
- elseif string.sub(choices[1], 1, #val) == val then
- return 1
- else
- return nil
- end
- else
- for i, v in ipairs(choices) do
- if v == val then
- exact_idx = i
- substr_seen = true
- elseif choices[i] ~= dotdotdot and string.sub(choices[i], 1, #val) == val then
- if substr_seen then
- substr_idx = nil
- else
- substr_idx = i
- substr_seen = true
- end
- elseif choices[i] == dotdotdot then
- if substr_seen then
- substr_idx = nil
- else
- substr_idx = i
- substr_seen = true
- end
- end
- end
- end
- return exact_idx or substr_idx
-end
-
-function device_cli_help(rl)
- local key = readln.split(rl.command, "[ ]+")
- local tree = rl.tree
- local keylen = #key
- local fullcmd = ""
- local error = false
- local terse = true
-
- if ((#rl.command >= 1) and (string.sub(rl.command, -1) == " ")) or (#rl.command == 0) then
- table.insert(key, "")
- terse = false
- end
-
- for i, v in ipairs(key) do
- local choices = get_choices(tree, v)
- local idx = get_exact_choice(choices, v)
- if idx then
- local choice = choices[idx]
- tree = tree[choice]
- fullcmd = fullcmd .. choice .. " "
- else
- if i < #key then
- error = true
- end
- end
-
- if i == #key and not error then
- for j, w in ipairs(choices) do
- if terse then
- paged_write(w .. "\t")
- else
- paged_write(" " .. w .. "\n")
- end
- end
- paged_write("\n")
- if terse then
- paged_write(" \n")
- end
- end
- end
- pager_reset()
-end
-
-function device_cli_tab_complete(rl)
- local key = readln.split(rl.command, "[ ]+")
- local tree = rl.tree
- local keylen = #key
- local fullcmd = ""
- local error = false
-
- for i, v in ipairs(key) do
- local choices = get_choices(tree, v)
- local idx = get_exact_choice(choices, v)
- if idx and choices[idx] ~= dotdotdot then
- local choice = choices[idx]
- tree = tree[choice]
- -- print("level " .. i .. " '" .. choice .. "'")
- fullcmd = fullcmd .. choice .. " "
- else
- -- print("level " .. i .. " : " .. table.concat(choices, " ") .. " ")
- error = true
- end
- end
- if not error then
- rl.command = fullcmd
- else
- -- print("\n\nerror\n")
- end
- pager_reset()
-end
-
-function device_cli_exec(rl)
-
- local cmd_nopipe = rl.command
- local cmd_pipe = nil
-
- local pipe1, pipe2 = string.find(rl.command, "[|]")
- if pipe1 then
- cmd_nopipe = string.sub(rl.command, 1, pipe1-1)
- cmd_pipe = string.sub(rl.command, pipe2+1, -1)
- end
-
- local key = readln.split(cmd_nopipe .. " <cr>", "[ ]+")
- local tree = rl.tree
- local keylen = #key
- local fullcmd = ""
- local error = false
- local func = nil
-
- if cmd_pipe then
- pager_filter_pipe = io.popen(cmd_pipe, "w")
- end
-
-
- rl.choices = {}
-
- for i, v in ipairs(key) do
- local choices = get_choices(tree, v)
- local idx = get_exact_choice(choices, v)
- if idx then
- local choice = choices[idx]
- if i == #key then
- func = tree[choice]
- else
- if choice == dotdotdot then
- -- keep the tree the same, update the choice value to match the input string
- choices[idx] = v
- choice = v
- else
- tree = tree[choice]
- end
- end
- -- print("level " .. i .. " '" .. choice .. "'")
- table.insert(rl.choices, choice)
- else
- -- print("level " .. i .. " : " .. table.concat(choices, " ") .. " ")
- error = true
- return nil
- end
- end
- return func
-end
-
-function populate_tree(commands)
- local tree = {}
-
- for k, v in pairs(commands) do
- local key = readln.split(k .. " <cr>", "[ ]+")
- local xtree = tree
- for i, kk in ipairs(key) do
- if i == 1 and kk == "sh" then
- kk = "show"
- end
- if i == #key then
- if type(v) == "function" then
- xtree[kk] = v
- else
- xtree[kk] = function(rl) paged_write(table.concat(v, "\n") .. "\n") end
- end
- else
- if not xtree[kk] then
- xtree[kk] = {}
- end
- xtree = xtree[kk]
- end
- end
- end
- return tree
-end
-
-function trim (s)
- return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
-end
-
-
-function init_vpp(vpp)
- local root_dir = "/home/ubuntu/vpp"
- local pneum_path = root_dir .. "/build-root/install-vpp_lite_debug-native/vpp-api/lib64/libpneum.so"
-
- vpp:init({ pneum_path = pneum_path })
-
- vpp:init({ pneum_path = pneum_path })
- vpp:json_api(root_dir .. "/build-root/install-vpp_lite_debug-native/vpp/vpp-api/vpe.api.json")
-
-
-
- vpp:connect("lua_cli")
-end
-
-function run_cli(vpp, cli)
- local reply = vpp:api_call("cli_inband", { cmd = cli })
- if reply and #reply == 1 then
- local rep = reply[1]
- if 0 == rep.retval then
- return rep.reply
- else
- return "XXXXXLUACLI: API RETVAL ERROR : " .. tostring(rep.retval)
- end
- else
- return "XXXXXLUACLI ERROR, RAW REPLY: " .. vpp.dump(reply)
- end
-end
-
-
-function toprintablestring(s)
- if type(s) == "string" then
- return "\n"..vpp.hex_dump(s)
- else
- return tostring(s)
- end
-end
-
-function interactive_cli(r)
- while not done do
- pager_reset()
- local cmd = r.readln()
- if not cmd then
- done = true
- elseif cmd == "quit" or cmd == "exit" then
- done = true
- else
- local func = device_cli_exec(r)
- if func then
- func(r)
- else
- if trim(cmd) == "" then
- else
- for i = 1, #r.prompt do
- paged_write(" ")
- end
- paged_write("^\n% Invalid input detected at '^' marker.\n\n")
- end
- end
- end
- end
-end
-
-device = {}
-device.output = {}
-
-init_vpp(vpp)
-cmds_str = run_cli(vpp, "?")
-vpp_cmds = readln.split(cmds_str, "\n")
-vpp_clis = {}
-
-for linenum, line in ipairs(vpp_cmds) do
- local m,h = string.match(line, "^ (.-) (.*)$")
- if m and #m > 0 then
- table.insert(vpp_clis, m)
- device.output["vpp debug cli " .. m] = function(rl)
- -- print("ARBITRARY CLI" .. vpp.dump(rl.choices))
- print("LUACLI command: " .. table.concat(rl.choices, " "))
- local sub = {}
- --
- for i=4, #rl.choices -1 do
- table.insert(sub, rl.choices[i])
- end
- local cli = table.concat(sub, " ")
- print("Running CLI: " .. tostring(cli))
- paged_write(run_cli(vpp, cli))
- end
- device.output["vpp debug cli " .. m .. " " .. dotdotdot] = function(rl)
- print("ARGH")
- end
-
- local ret = run_cli(vpp, "help " .. m)
- device.output["help vpp debug cli " .. m] = { ret }
- end
-end
-
-for linenum, line in ipairs(vpp_clis) do
- -- print(line, ret)
-end
-
-for msgnum, msgname in pairs(vpp.msg_number_to_name) do
- local cli, numspaces = string.gsub(msgname, "_", " ")
- device.output["call " .. cli .. " " .. dotdotdot] = function(rl)
- print("ARGH")
- end
- device.output["call " .. cli] = function(rl)
- print("LUACLI command: " .. table.concat(rl.choices, " "))
- print("Running API: " .. msgname) -- vpp.dump(rl.choices))
- local out = {}
- local args = {}
- local ntaken = 0
- local argname = ""
- for i=(1+1+numspaces+1), #rl.choices-1 do
- -- print(i, rl.choices[i])
- if ntaken > 0 then
- ntaken = ntaken -1
- else
- local fieldname = rl.choices[i]
- local field = vpp.msg_name_to_fields[msgname][fieldname]
- if field then
- local s = rl.choices[i+1]
- s=s:gsub("\\x(%x%x)",function (x) return string.char(tonumber(x,16)) end)
- args[fieldname] = s
- ntaken = 1
- end
- end
- end
- -- print("ARGS: ", vpp.dump(args))
- local ret = vpp:api_call(msgname, args)
- for i, reply in ipairs(ret) do
- table.insert(out, "=================== Entry #" .. tostring(i))
- for k, v in pairs(reply) do
- table.insert(out, " " .. tostring(k) .. " : " .. toprintablestring(v))
- end
- end
- -- paged_write(vpp.dump(ret) .. "\n\n")
- paged_write(table.concat(out, "\n").."\n\n")
- end
- device.output["call " .. cli .. " help"] = function(rl)
- local out = {}
- for k, v in pairs(vpp.msg_name_to_fields[msgname]) do
- table.insert(out, tostring(k) .. " : " .. v["ctype"] .. " ; " .. tostring(vpp.dump(v)) )
- end
- -- paged_write(vpp.dump(vpp.msg_name_to_fields[msgname]) .. "\n\n")
- paged_write(table.concat(out, "\n").."\n\n")
- end
--- vpp.msg_name_to_number = {}
-end
-
-
-
-local r = readln.reader()
-local done = false
-
-r.prompt = "VPP(luaCLI)#"
-
-r.help = device_cli_help
-r.tab_complete = device_cli_tab_complete
-print("===== CLI view, use ^D to end =====")
-
-r.tree = populate_tree(device.output)
--- readln.pretty("xxxx", r.tree)
-
-
-for idx, an_arg in ipairs(arg) do
- local fname = an_arg
- if fname == "-i" then
- pager_lines = 23
- interactive_cli(r)
- else
- pager_lines = 100000000
- for line in io.lines(fname) do
- r.command = line
- local func = device_cli_exec(r)
- if func then
- func(r)
- end
- end
- end
-end
-
-if #arg == 0 then
- print("You should specify '-i' as an argument for the interactive session,")
- print("but with no other sources of commands, we start interactive session now anyway")
- interactive_cli(r)
-end
-
-vpp:disconnect()
-r.done()
-
-
diff --git a/vpp-api/lua/examples/example-acl-plugin.lua b/vpp-api/lua/examples/example-acl-plugin.lua
deleted file mode 100644
index ca01f18d..00000000
--- a/vpp-api/lua/examples/example-acl-plugin.lua
+++ /dev/null
@@ -1,110 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
-
-vpp = require "vpp-lapi"
-
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_debug-native/vpp-api/lib64/libpneum.so"
-
-vpp:init({ pneum_path = pneum_path })
-
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vlib-api/vlibmemory/memclnt.api")
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vpp/vpp-api/vpe.api")
-vpp:connect("aytest")
-vpp:consume_api(root_dir .. "/plugins/acl-plugin/acl/acl.api", "acl")
-
--- api calls
-reply = vpp:api_call("show_version")
-print("Version: ", reply[1].version)
-print(vpp.hex_dump(reply[1].version))
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 230 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 8 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 15 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 2, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 0 })
-print(vpp.dump(reply))
-print("---")
-
-acl_index_to_delete = reply[1].acl_index
-print("Deleting " .. tostring(acl_index_to_delete))
-reply = vpp:api_call("acl_del", { context = 42, acl_index = acl_index_to_delete })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-for ri, rv in ipairs(reply) do
- print("Reply message #" .. tostring(ri))
- print(vpp.dump(rv))
- for ai, av in ipairs(rv.r) do
- print("ACL rule #" .. tostring(ai) .. " : " .. vpp.dump(av))
- end
-
-end
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-print(vpp.dump(reply))
-print("---")
-
-
-vpp:disconnect()
-
-
diff --git a/vpp-api/lua/examples/example-classifier.lua b/vpp-api/lua/examples/example-classifier.lua
deleted file mode 100644
index ec9c3d3e..00000000
--- a/vpp-api/lua/examples/example-classifier.lua
+++ /dev/null
@@ -1,51 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
-
-local vpp = require "vpp-lapi"
-local bit = require("bit")
-
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_lite_debug-native/vpp-api/lib64/libpneum.so"
-
-
-vpp:init({ pneum_path = pneum_path })
-
-vpp:json_api(root_dir .. "/build-root/install-vpp_lite_debug-native/vpp/vpp-api/vpe.api.json")
-
-vpp:connect("aytest")
-
--- api calls
-
-print("Calling API to add a new classifier table")
-reply = vpp:api_call("classify_add_del_table", {
- context = 43,
- memory_size = bit.lshift(2, 20),
- client_index = 42,
- is_add = 1,
- nbuckets = 32,
- skip_n_vectors = 0,
- match_n_vectors = 1,
- mask = "\255\255\255\255\255\255\255\255" .. "\255\255\255\255\255\255\255\255"
-})
-print(vpp.dump(reply))
-print("---")
-
-
-vpp:disconnect()
-
-
diff --git a/vpp-api/lua/examples/example-cli.lua b/vpp-api/lua/examples/example-cli.lua
deleted file mode 100644
index 8b84989f..00000000
--- a/vpp-api/lua/examples/example-cli.lua
+++ /dev/null
@@ -1,44 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
-vpp = require "vpp-lapi"
-
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_lite_debug-native/vpp-api/lib64/libpneum.so"
-
-vpp:init({ pneum_path = pneum_path })
-
-vpp:json_api(root_dir .. "/build-root/install-vpp_lite_debug-native/vpp/vpp-api/vpe.api.json")
-
-vpp:connect("aytest")
-
--- api calls
-reply = vpp:api_call("show_version")
-print("Version: ", reply[1].version)
-print(vpp.hex_dump(reply[1].version))
-print(vpp.dump(reply))
-print("---")
-
-
-reply = vpp:api_call("cli_inband", { cmd = "show vers" })
-print(vpp.dump(reply))
-print("---")
-
-
-vpp:disconnect()
-
-
diff --git a/vpp-api/lua/examples/lute/README.md b/vpp-api/lua/examples/lute/README.md
deleted file mode 100644
index 8d37250a..00000000
--- a/vpp-api/lua/examples/lute/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-LUTE: Lua Unit Test Environment
-
-This is a small helper utility to automate some simple tests
-that one might need to do.
-
-Think of it as a hybrid of a screen and expect who
-also took some habits from HTML inline code.
-
-It is quite probably useless for building anything serious,
-but practice shows it is quite efficient at allowing
-convenient temporary quick tests, and for something
-that was written over a course of a couple of evenings it
-is quite a nice little helper tool.
-
-It allows do launch and drive multiple shell sessions,
-and by virtue of having been written in Lua, it of course
-also allows to add the business logic using the Lua code.
-
-If you launch the lute without parameters, it gives you
-the interactive shell to execute the commands in.
-
-If you launch it with an argument, it will attempt to
-read and execute the commands from the file.
-
-Commands:
-
-shell FOO
-
- spawn a shell in a new PTY under the label FOO.
-
-run FOO bar
-
- Send "bar" keystrokes followed by "ENTER" to the session FOO
-
- Special case: "break" word on its own gets translated into ^C being sent.
-
-cd FOO
-
- "change domain" into session FOO. All subsequent inputs will go,
- line-buffered, into the session FOO. To jump back up, use ^D (Control-D),
- or within the file, use ^D^D^D (caret D caret D caret D on its own line)
-
-expect FOO blablabla
-
- Pause further interpretation of the batch mode until you see "blablabla"
- in the output of session FOO, or until timeout happens.
-
-sleep N
-
- Sleep an integer N seconds, if you are in batch mode.
-
-echo blabla
-
- Echo the remainder of the line to standard output.
-
-For Lua code, there is a pre-existing pseudo-session called "lua",
-which accepts "run lua" command which does what you would expect
-(evaluate the rest of the string in Lua context - being the same
-as lute itself). Also you can do "cd lua" and get into a
-multiline-enabled interpreter shell.
-
-This way for the VPP case you can automate some of the things in your routine
-that you would have to have done manually, and test drive API as well
-as use the realistic native OS components to create the environment around it.
-
-
diff --git a/vpp-api/lua/examples/lute/lute.lua b/vpp-api/lua/examples/lute/lute.lua
deleted file mode 100644
index 89b9924b..00000000
--- a/vpp-api/lua/examples/lute/lute.lua
+++ /dev/null
@@ -1,777 +0,0 @@
---[[
-version = 1
-/*
- * 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.
- */
-]]
-
--- LUTE: Lua Unit Test Environment
--- AKA what happens when screen tries to marry with lua and expect,
--- but escapes mid-ceremony.
---
--- comments: @ayourtch
-
-ffi = require("ffi")
-
-vpp = {}
-function vpp.dump(o)
- if type(o) == 'table' then
- local s = '{ '
- for k,v in pairs(o) do
- if type(k) ~= 'number' then k = '"'..k..'"' end
- s = s .. '['..k..'] = ' .. vpp.dump(v) .. ','
- end
- return s .. '} '
- else
- return tostring(o)
- end
-end
-
-
-ffi.cdef([[
-
-int posix_openpt(int flags);
-int grantpt(int fd);
-int unlockpt(int fd);
-char *ptsname(int fd);
-
-typedef long pid_t;
-typedef long ssize_t;
-typedef long size_t;
-typedef int nfds_t;
-typedef long time_t;
-typedef long suseconds_t;
-
-pid_t fork(void);
-pid_t setsid(void);
-
-int close(int fd);
-int open(char *pathname, int flags);
-
-int dup2(int oldfd, int newfd);
-
-ssize_t read(int fd, void *buf, size_t count);
-ssize_t write(int fd, const void *buf, size_t count);
-
-struct pollfd {
- int fd; /* file descriptor */
- short events; /* requested events */
- short revents; /* returned events */
- };
-
-int poll(struct pollfd *fds, nfds_t nfds, int timeout);
-
-struct timeval {
- time_t tv_sec; /* seconds */
- suseconds_t tv_usec; /* microseconds */
- };
-
-int gettimeofday(struct timeval *tv, struct timezone *tz);
-
-int inet_pton(int af, const char *src, void *dst);
-
-]])
-
-ffi.cdef([[
-void *memset(void *s, int c, size_t n);
-void *memcpy(void *dest, void *src, size_t n);
-void *memmove(void *dest, const void *src, size_t n);
-void *memmem(const void *haystack, size_t haystacklen,
- const void *needle, size_t needlelen);
-]])
-
-
-
-local O_RDWR = 2
-
-
-function os_time()
- local tv = ffi.new("struct timeval[1]")
- local ret = ffi.C.gettimeofday(tv, nil)
- return tonumber(tv[0].tv_sec) + (tonumber(tv[0].tv_usec)/1000000.0)
-end
-
-function sleep(n)
- local when_wakeup = os_time() + n
- while os_time() <= when_wakeup do
- ffi.C.poll(nil, 0, 10)
- end
-end
-
-
-function c_str(text_in)
- local text = text_in
- local c_str = ffi.new("char[?]", #text+1)
- ffi.copy(c_str, text)
- return c_str
-end
-
-function ip46(addr_text)
- local out = ffi.new("char [200]")
- local AF_INET6 = 10
- local AF_INET = 2
- local is_ip6 = ffi.C.inet_pton(AF_INET6, c_str(addr_text), out)
- if is_ip6 == 1 then
- return ffi.string(out, 16), true
- end
- local is_ip4 = ffi.C.inet_pton(AF_INET, c_str(addr_text), out)
- if is_ip4 then
- return (string.rep("4", 12).. ffi.string(out, 4)), false
- end
-end
-
-function pty_master_open()
- local fd = ffi.C.posix_openpt(O_RDWR)
- ffi.C.grantpt(fd)
- ffi.C.unlockpt(fd)
- local p = ffi.C.ptsname(fd)
- print("PTS:" .. ffi.string(p))
- return fd, ffi.string(p)
-end
-
-function pty_run(cmd)
- local master_fd, pts_name = pty_master_open()
- local child_pid = ffi.C.fork()
- if (child_pid == -1) then
- print("Error fork()ing")
- return -1
- end
-
- if child_pid ~= 0 then
- -- print("Parent")
- return master_fd, child_pid
- end
-
- -- print("Child")
- if (ffi.C.setsid() == -1) then
- print("Child error setsid")
- os.exit(-1)
- end
-
- ffi.C.close(master_fd)
-
- local slave_fd = ffi.C.open(c_str(pts_name), O_RDWR)
- if slave_fd == -1 then
- print("Child can not open slave fd")
- os.exit(-2)
- end
-
- ffi.C.dup2(slave_fd, 0)
- ffi.C.dup2(slave_fd, 1)
- ffi.C.dup2(slave_fd, 2)
- os.execute(cmd)
-end
-
-function readch()
- local buf = ffi.new("char[1]")
- local nread= ffi.C.read(0, buf, 1)
- -- print("\nREADCH : " .. string.char(buf[0]))
- return string.char(buf[0])
-end
-
-function stdout_write(str)
- ffi.C.write(1, c_str(str), #str)
-end
-
-
-readln = {
-split = function(str, pat)
- local t = {} -- NOTE: use {n = 0} in Lua-5.0
- local fpat = "(.-)" .. pat
- local last_end = 1
- if str then
- local s, e, cap = str:find(fpat, 1)
- while s do
- if s ~= 1 or cap ~= "" then
- table.insert(t,cap)
- end
- last_end = e+1
- s, e, cap = str:find(fpat, last_end)
- end
- if last_end <= #str then
- cap = str:sub(last_end)
- table.insert(t, cap)
- end
- end
- return t
-end,
-
-reader = function()
- local rl = {}
-
- rl.init = function()
- os.execute("stty -icanon min 1 -echo")
- rl.rawmode = true
- end
-
- rl.done = function()
- os.execute("stty icanon echo")
- rl.rawmode = false
- end
-
- rl.prompt = ">"
- rl.history = { "" }
- rl.history_index = 1
- rl.history_length = 1
-
- rl.hide_cmd = function()
- local bs = string.char(8) .. " " .. string.char(8)
- for i = 1, #rl.command do
- stdout_write(bs)
- end
- end
-
- rl.show_cmd = function()
- if rl.command then
- stdout_write(rl.command)
- end
- end
-
- rl.store_history = function(cmd)
- if cmd == "" then
- return
- end
- rl.history[rl.history_length] = cmd
- rl.history_length = rl.history_length + 1
- rl.history_index = rl.history_length
- rl.history[rl.history_length] = ""
- end
-
- rl.readln = function(stdin_select_fn, batch_cmd, batch_when, batch_expect)
- local done = false
- local need_prompt = true
- rl.command = ""
-
- if not rl.rawmode then
- rl.init()
- end
-
- while not done do
- local indent_value = #rl.prompt + #rl.command
- if need_prompt then
- stdout_write(rl.prompt)
- stdout_write(rl.command)
- need_prompt = false
- end
- if type(stdin_select_fn) == "function" then
- while not stdin_select_fn(indent_value, batch_cmd, batch_when, batch_expect) do
- stdout_write(rl.prompt)
- stdout_write(rl.command)
- indent_value = #rl.prompt + #rl.command
- end
- if batch_cmd and ((os_time() > batch_when) or (batch_expect and expect_success(batch_expect, buf, 0))) then
- stdout_write("\n" .. rl.prompt .. batch_cmd .. "\n")
- if batch_expect then
- expect_done(batch_expect)
- end
- return batch_cmd, batch_expect
- end
- end
- local ch = readch()
- if ch:byte(1) == 27 then
- -- CONTROL
- local ch2 = readch()
- -- arrows
- if ch2:byte(1) == 91 then
- local ch3 = readch()
- local b = ch3:byte(1)
- if b == 65 then
- ch = "UP"
- elseif b == 66 then
- ch = "DOWN"
- elseif b == 67 then
- ch = "RIGHT"
- elseif b == 68 then
- ch = "LEFT"
- end
- -- print("Byte: " .. ch3:byte(1))
- -- if ch3:byte(1)
- end
- end
-
- if ch == "?" then
- stdout_write(ch)
- stdout_write("\n")
- if rl.help then
- rl.help(rl)
- end
- need_prompt = true
- elseif ch == "\t" then
- if rl.tab_complete then
- rl.tab_complete(rl)
- end
- stdout_write("\n")
- need_prompt = true
- elseif ch == "\n" then
- stdout_write(ch)
- done = true
- elseif ch == "\004" then
- stdout_write("\n")
- rl.command = nil
- done = true
- elseif ch == string.char(127) then
- if rl.command ~= "" then
- stdout_write(string.char(8) .. " " .. string.char(8))
- rl.command = string.sub(rl.command, 1, -2)
- end
- elseif #ch > 1 then
- -- control char
- if ch == "UP" then
- rl.hide_cmd()
- if rl.history_index == #rl.history then
- rl.history[rl.history_index] = rl.command
- end
- if rl.history_index > 1 then
- rl.history_index = rl.history_index - 1
- rl.command = rl.history[rl.history_index]
- end
- rl.show_cmd()
- elseif ch == "DOWN" then
- rl.hide_cmd()
- if rl.history_index < rl.history_length then
- rl.history_index = rl.history_index + 1
- rl.command = rl.history[rl.history_index]
- end
- rl.show_cmd()
- end
- else
- stdout_write(ch)
- rl.command = rl.command .. ch
- end
- end
- if rl.command then
- rl.store_history(rl.command)
- end
- return rl.command
- end
- return rl
-end
-
-}
-
-local select_fds = {}
-local sessions = {}
-
-local line_erased = false
-
-function erase_line(indent)
- if not line_erased then
- line_erased = true
- stdout_write(string.rep(string.char(8), indent)..string.rep(" ", indent)..string.rep(string.char(8), indent))
- end
-end
-
-function do_select_stdin(indent, batch_cmd, batch_when, batch_expect)
- while true do
- local nfds = 1+#select_fds
- local pfds = ffi.new("struct pollfd[?]", nfds)
- pfds[0].fd = 0;
- pfds[0].events = 1;
- pfds[0].revents = 0;
- for i = 1,#select_fds do
- pfds[i].fd = select_fds[i].fd
- pfds[i].events = 1
- pfds[i].revents = 0
- end
- if batch_cmd and ((os_time() > batch_when) or (batch_expect and expect_success(batch_expect, buf, 0))) then
- return true
- end
- while ffi.C.poll(pfds, nfds, 10) == 0 do
- if batch_cmd and ((os_time() > batch_when) or (batch_expect and expect_success(batch_expect, buf, 0))) then
- return true
- end
- if line_erased then
- line_erased = false
- return false
- end
- end
- if pfds[0].revents == 1 then
- return true
- end
- for i = 1,#select_fds do
- if(pfds[i].revents > 0) then
- if pfds[i].fd ~= select_fds[i].fd then
- print("File descriptors unequal", pfds[i].fd, select_fds[i].fd)
- end
- select_fds[i].cb(select_fds[i], pfds[i].revents, indent)
- end
- end
- end
-end
-
-local buf = ffi.new("char [32768]")
-
-function session_stdout_write(prefix, data)
- data = prefix .. data:gsub("\n", "\n"..prefix):gsub("\n"..prefix.."$", "\n")
-
- stdout_write(data)
-end
-
-function expect_success(sok, buf, nread)
- local expect_buf_sz = ffi.sizeof(sok.expect_buf) - 128
- local expect_buf_avail = expect_buf_sz - sok.expect_buf_idx
- -- print("EXPECT_SUCCESS: nread ".. tostring(nread).. " expect_buf_idx: " .. tostring(sok.expect_buf_idx) .. " expect_buf_avail: " .. tostring(expect_buf_avail) )
- if expect_buf_avail < 0 then
- print "EXPECT BUFFER OVERRUN ALREADY"
- os.exit(1)
- end
- if expect_buf_avail < nread then
- if (nread >= ffi.sizeof(sok.expect_buf)) then
- print("Read too large of a chunk to fit into expect buffer")
- return nil
- end
- local delta = nread - expect_buf_avail
-
- ffi.C.memmove(sok.expect_buf, sok.expect_buf + delta, expect_buf_sz - delta)
- sok.expect_buf_idx = sok.expect_buf_idx - delta
- expect_buf_avail = nread
- end
- if sok.expect_buf_idx + nread > expect_buf_sz then
- print("ERROR, I have just overrun the buffer !")
- os.exit(1)
- end
- ffi.C.memcpy(sok.expect_buf + sok.expect_buf_idx, buf, nread)
- sok.expect_buf_idx = sok.expect_buf_idx + nread
- if sok.expect_str == nil then
- return true
- end
- local match_p = ffi.C.memmem(sok.expect_buf, sok.expect_buf_idx, sok.expect_str, sok.expect_str_len)
- if match_p ~= nil then
- return true
- end
- return false
-end
-
-function expect_done(sok)
- local expect_buf_sz = ffi.sizeof(sok.expect_buf) - 128
- if not sok.expect_str then
- return false
- end
- local match_p = ffi.C.memmem(sok.expect_buf, sok.expect_buf_idx, sok.expect_str, sok.expect_str_len)
- if match_p ~= nil then
- if sok.expect_cb then
- sok.expect_cb(sok)
- end
- local match_idx = ffi.cast("char *", match_p) - ffi.cast("char *", sok.expect_buf)
- ffi.C.memmove(sok.expect_buf, ffi.cast("char *", match_p) + sok.expect_str_len, expect_buf_sz - match_idx - sok.expect_str_len)
- sok.expect_buf_idx = match_idx + sok.expect_str_len
- sok.expect_success = true
-
- sok.expect_str = nil
- sok.expect_str_len = 0
- return true
- end
-end
-
-function slave_events(sok, revents, indent)
- local fd = sok.fd
- local nread = ffi.C.read(fd, buf, ffi.sizeof(buf)-128)
- local idx = nread - 1
- while idx >= 0 and buf[idx] ~= 10 do
- idx = idx - 1
- end
- if idx >= 0 then
- erase_line(indent)
- session_stdout_write(sok.prefix, sok.buf .. ffi.string(buf, idx+1))
- sok.buf = ""
- end
- sok.buf = sok.buf .. ffi.string(buf+idx+1, nread-idx-1)
- -- print("\nRead: " .. tostring(nread))
- -- stdout_write(ffi.string(buf, nread))
- if expect_success(sok, buf, nread) then
- return true
- end
- return false
-end
-
-
-function start_session(name)
- local mfd, cpid = pty_run("/bin/bash")
- local sok = { ["fd"] = mfd, ["cb"] = slave_events, ["buf"] = "", ["prefix"] = name .. ":", ["expect_buf"] = ffi.new("char [165536]"), ["expect_buf_idx"] = 0, ["expect_str"] = nil }
- table.insert(select_fds, sok)
- sessions[name] = sok
-end
-
-function command_transform(exe)
- if exe == "break" then
- exe = string.char(3)
- end
- return exe
-end
-
-function session_write(a_session, a_str)
- if has_session(a_session) then
- return tonumber(ffi.C.write(sessions[a_session].fd, c_str(a_str), #a_str))
- else
- return 0
- end
-end
-
-function session_exec(a_session, a_cmd)
- local exe = command_transform(a_cmd) .. "\n"
- session_write(a_session, exe)
-end
-
-function session_cmd(ui, a_session, a_cmd)
- if not has_session(a_session) then
- stdout_write("ERR: No such session '" .. tostring(a_session) .. "'\n")
- return nil
- end
- if a_session == "lua" then
- local func, msg = loadstring(ui.lua_acc .. a_cmd)
- -- stdout_write("LOADSTR: " .. vpp.dump({ ret, msg }) .. "\n")
- if not func and string.match(msg, "<eof>") then
- if a_session ~= ui.in_session then
- stdout_write("ERR LOADSTR: " .. tostring(msg) .. "\n")
- return nil
- end
- ui.lua_acc = ui.lua_acc .. a_cmd .. "\n"
- return true
- end
- ui.lua_acc = ""
- local ret, msg = pcall(func)
- if ret then
- return true
- else
- stdout_write("ERR: " .. msg .. "\n")
- return nil
- end
- else
- session_exec(a_session, a_cmd)
- if ui.session_cmd_delay then
- return { "delay", ui.session_cmd_delay }
- end
- return true
- end
-end
-
-function has_session(a_session)
- if a_session == "lua" then
- return true
- end
- return (sessions[a_session] ~= nil)
-end
-
-function command_match(list, input, output)
- for i, v in ipairs(list) do
- local m = {}
- m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9] = string.match(input, v[1])
- -- print("MATCH: ", vpp.dump(m))
- if m[1] then
- output["result"] = m
- output["result_index"] = i
- return m
- end
- end
- return nil
-end
-
-function cmd_spawn_shell(ui, a_arg)
- start_session(a_arg[1])
- return true
-end
-
-function cmd_run_cmd(ui, a_arg)
- local a_sess = a_arg[1]
- local a_cmd = a_arg[2]
- return session_cmd(ui, a_sess, a_cmd)
-end
-
-function cmd_cd(ui, a_arg)
- local a_sess = a_arg[1]
- if has_session(a_sess) then
- ui.in_session = a_sess
- return true
- else
- stdout_write("ERR: Unknown session '".. tostring(a_sess) .. "'\n")
- return nil
- end
-end
-
-function cmd_sleep(ui, a_arg)
- return { "delay", tonumber(a_arg[1]) }
-end
-
-function cmd_expect(ui, a_arg)
- local a_sess = a_arg[1]
- local a_expect = a_arg[2]
- local sok = sessions[a_sess]
- if not sok then
- stdout_write("ERR: unknown session '" .. tostring(a_sess) .. "'\n")
- return nil
- end
- sok.expect_str = c_str(a_expect)
- sok.expect_str_len = #a_expect
- return { "expect", a_sess }
-end
-
-function cmd_info(ui, a_arg)
- local a_sess = a_arg[1]
- local sok = sessions[a_sess]
- if not sok then
- stdout_write("ERR: unknown session '" .. tostring(a_sess) .. "'\n")
- return nil
- end
- print("Info for session " .. tostring(a_sess) .. "\n")
- print("Expect buffer index: " .. tostring(sok.expect_buf_idx))
- print("Expect buffer: '" .. tostring(ffi.string(sok.expect_buf, sok.expect_buf_idx)) .. "'\n")
- if sok.expect_str then
- print("Expect string: '" .. tostring(ffi.string(sok.expect_str, sok.expect_str_len)) .. "'\n")
- else
- print("Expect string not set\n")
- end
-end
-
-function cmd_echo(ui, a_arg)
- local a_data = a_arg[1]
- print("ECHO: " .. tostring(a_data))
-end
-
-main_command_table = {
- { "^shell ([a-zA-Z0-9_]+)$", cmd_spawn_shell },
- { "^run ([a-zA-Z0-9_]+) (.+)$", cmd_run_cmd },
- { "^cd ([a-zA-Z0-9_]+)$", cmd_cd },
- { "^sleep ([0-9]+)$", cmd_sleep },
- { "^expect ([a-zA-Z0-9_]+) (.-)$", cmd_expect },
- { "^info ([a-zA-Z0-9_]+)$", cmd_info },
- { "^echo (.-)$", cmd_echo }
-}
-
-
-
-function ui_set_prompt(ui)
- if ui.in_session then
- if ui.in_session == "lua" then
- if #ui.lua_acc > 0 then
- ui.r.prompt = ui.in_session .. ">>"
- else
- ui.r.prompt = ui.in_session .. ">"
- end
- else
- ui.r.prompt = ui.in_session .. "> "
- end
- else
- ui.r.prompt = "> "
- end
- return ui.r.prompt
-end
-
-function ui_run_command(ui, cmd)
- -- stdout_write("Command: " .. tostring(cmd) .. "\n")
- local ret = false
- if ui.in_session then
- if cmd then
- if cmd == "^D^D^D" then
- ui.in_session = nil
- ret = true
- else
- ret = session_cmd(ui, ui.in_session, cmd)
- end
- else
- ui.in_session = nil
- ret = true
- end
- else
- if cmd then
- local out = {}
- if cmd == "" then
- ret = true
- end
- if command_match(main_command_table, cmd, out) then
- local i = out.result_index
- local m = out.result
- if main_command_table[i][2] then
- ret = main_command_table[i][2](ui, m)
- end
- end
- end
- if not cmd or cmd == "quit" then
- return "quit"
- end
- end
- return ret
-end
-
-local ui = {}
-ui.in_session = nil
-ui.r = readln.reader()
-ui.lua_acc = ""
-ui.session_cmd_delay = 0.3
-
-local lines = ""
-
-local done = false
--- a helper function which always returns nil
-local no_next_line = function() return nil end
-
--- a function which returns the next batch line
-local next_line = no_next_line
-
-local batchfile = arg[1]
-
-if batchfile then
- local f = io.lines(batchfile)
- next_line = function()
- local line = f()
- if line then
- return line
- else
- next_line = no_next_line
- session_stdout_write(batchfile .. ":", "End of batch\n")
- return nil
- end
- end
-end
-
-
-local batch_when = 0
-local batch_expect = nil
-while not done do
- local prompt = ui_set_prompt(ui)
- local batch_cmd = next_line()
- local cmd, expect_sok = ui.r.readln(do_select_stdin, batch_cmd, batch_when, batch_expect)
- if expect_sok and not expect_success(expect_sok, buf, 0) then
- if not cmd_ret and next_line ~= no_next_line then
- print("ERR: expect timeout\n")
- next_line = no_next_line
- end
- else
- local cmd_ret = ui_run_command(ui, cmd)
- if not cmd_ret and next_line ~= no_next_line then
- print("ERR: Error during batch execution\n")
- next_line = no_next_line
- end
-
- if cmd_ret == "quit" then
- done = true
- end
- batch_expect = nil
- batch_when = 0
- if type(cmd_ret) == "table" then
- if cmd_ret[1] == "delay" then
- batch_when = os_time() + tonumber(cmd_ret[2])
- end
- if cmd_ret[1] == "expect" then
- batch_expect = sessions[cmd_ret[2]]
- batch_when = os_time() + 15
- end
- end
- end
-end
-ui.r.done()
-
-os.exit(1)
-
-
-
diff --git a/vpp-api/lua/examples/lute/script-inout-acl-noacl.lute b/vpp-api/lua/examples/lute/script-inout-acl-noacl.lute
deleted file mode 100644
index a24d04bf..00000000
--- a/vpp-api/lua/examples/lute/script-inout-acl-noacl.lute
+++ /dev/null
@@ -1,329 +0,0 @@
-shell vppbuild
-run vppbuild stty -echo
-run vppbuild sudo -u ubuntu -i bash -c "(cd vpp && make plugins && echo ALLGOOD)"
-expect vppbuild ALLGOOD
-
-shell s0
-shell s1
-shell s2
-
-
-cd s1
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-cd s2
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-
-cd lua
-
-function session_get_bash_pid(s)
- if not has_session(s) then
- return nil
- end
- local fname = "/tmp/lute-"..s.."-pid.txt"
-
- session_exec(s, "echo $$ >" .. fname)
- -- it's a dirty hack but it's quick
- sleep(0.5)
- local pid = io.lines(fname)()
- print("Got pid for " .. s .. " : " .. tostring(pid))
- return(tonumber(pid))
-end
-
-function session_connect_with(s0, s1)
- -- local pid0 = tostring(session_get_bash_pid(s0))
- local pid1 = tostring(session_get_bash_pid(s1))
- local eth_options = { "rx", "tx", "sg", "tso", "ufo", "gso", "gro", "lro", "rxvlan", "txvlan", "rxhash" }
- local this_end = s0 .. "_" .. s1
- local other_end = s1 .. "_" .. s0
- session_exec(s0, "ip link add name " .. this_end .. " type veth peer name " .. other_end)
- session_exec(s0, "ip link set dev " .. this_end .. " up promisc on")
- for i, option in ipairs(eth_options) do
- session_exec(s0, "/sbin/ethtool --offload " .. this_end .. " " .. option .. " off")
- session_exec(s0, "/sbin/ethtool --offload " .. other_end .. " " .. option .. " off")
- end
- session_exec(s0, "ip link set dev " .. other_end .. " up promisc on netns /proc/" .. pid1 .. "/ns/net")
- sleep(0.5)
-end
-
-^D^D^D
-run lua session_connect_with("s0", "s1")
-run lua session_connect_with("s0", "s2")
-
-cd s1
-ip -6 addr add dev s1_s0 2001:db8:1::1/64
-ip -4 addr add dev s1_s0 192.0.2.1/24
-ip link set dev s1_s0 up promisc on
-^D^D^D
-
-cd s2
-ip -6 addr add dev s2_s0 2001:db8:1::2/64
-ip -6 addr add dev s2_s0 2001:db8:1::3/64
-ip -6 addr add dev s2_s0 2001:db8:1::4/64
-ip -4 addr add dev s2_s0 192.0.2.2/24
-ip -4 addr add dev s2_s0:1 192.0.2.3/24
-ip -4 addr add dev s2_s0:2 192.0.2.4/24
-ip link set dev s2_s0 up promisc on
-^D^D^D
-
-run s1 ip addr
-run s2 ip addr
-shell VPP
-cd VPP
-cd /home/ubuntu/vpp
-make debug
-r
-^D^D^D
-expect VPP DBGvpp#
-
-cd lua
--- Initialization of the Lua environment for talking to VPP
-vpp = require("vpp-lapi")
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_debug-native/vpp-api/lib64/libpneum.so"
-vpp:init({ pneum_path = pneum_path })
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vlib-api/vlibmemory/memclnt.api")
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vpp/vpp-api/vpe.api")
-vpp:connect("aytest")
-vpp:consume_api(root_dir .. "/plugins/acl-plugin/acl/acl.api", "acl")
-
-^D^D^D
-
-cd lua
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s1", hw_addr = "AAAAAA" })
-vpp_if_to_s1 = reply[1].sw_if_index
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s2", hw_addr = "AAAAAA" })
-vpp_if_to_s2 = reply[1].sw_if_index
-
-ifaces = { vpp_if_to_s1, vpp_if_to_s2 }
-
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s1, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s2, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-
-bd_id = 42
-
-reply = vpp:api_call("bridge_domain_add_del", { bd_id = bd_id, flood = 1, uu_flood = 1, forward = 1, learn = 1, arp_term = 0, is_add = 1 })
-print(vpp.dump(reply))
-
-for i, v in ipairs(ifaces) do
- reply = vpp:api_call("sw_interface_set_l2_bridge", { rx_sw_if_index = v, bd_id = bd_id, shg = 0, bvi = 0, enable = 1 } )
- print(vpp.dump(reply))
-end
-
-^D^D^D
-
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.4
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-
-
-cd lua
---- ACL testing
-
---[[ temporary comment out
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 230 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 8 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 15 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 2, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 0 })
-print(vpp.dump(reply))
-print("---")
-
-acl_index_to_delete = reply[1].acl_index
-print("Deleting " .. tostring(acl_index_to_delete))
-reply = vpp:api_call("acl_del", { context = 42, acl_index = acl_index_to_delete })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-for ri, rv in ipairs(reply) do
- print("Reply message #" .. tostring(ri))
- print(vpp.dump(rv))
- for ai, av in ipairs(rv.r) do
- print("ACL rule #" .. tostring(ai) .. " : " .. vpp.dump(av))
- end
-
-end
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 4294967295 })
-print(vpp.dump(reply))
-print("---")
-
-
-]] -- end of comment out
-
----- Should be nothing ^^
-r = {
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::3"), dst_ip_prefix_len = 128 },
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8::"), dst_ip_prefix_len = 32 },
- { is_permit = 1, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.2"), dst_ip_prefix_len = 32},
- { is_permit = 0, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.3"), dst_ip_prefix_len = 32 },
-}
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 5, r = r })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_in
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s1, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
---reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
--- print(vpp.dump(reply))
---print("---")
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 2
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 3
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 4
-
-
-cd lua
-
---- TEST OUTBOUND ACL
-
-r1 = {
- { is_permit = 1, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::4"), dst_ip_prefix_len = 128 }
-}
-
-reply = vpp:api_call("acl_add_replace", { context = 42, count = 3, r = r1 })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 1
-
-run lua print("ALL GOOD!")
-
diff --git a/vpp-api/lua/examples/lute/script-inout-acl-old.lute b/vpp-api/lua/examples/lute/script-inout-acl-old.lute
deleted file mode 100644
index 9edebf02..00000000
--- a/vpp-api/lua/examples/lute/script-inout-acl-old.lute
+++ /dev/null
@@ -1,329 +0,0 @@
-shell vppbuild
-run vppbuild stty -echo
-run vppbuild sudo -u ubuntu -i bash -c "(cd vpp && make plugins && echo ALLGOOD)"
-expect vppbuild ALLGOOD
-
-shell s0
-shell s1
-shell s2
-
-
-cd s1
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-cd s2
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-
-cd lua
-
-function session_get_bash_pid(s)
- if not has_session(s) then
- return nil
- end
- local fname = "/tmp/lute-"..s.."-pid.txt"
-
- session_exec(s, "echo $$ >" .. fname)
- -- it's a dirty hack but it's quick
- sleep(0.5)
- local pid = io.lines(fname)()
- print("Got pid for " .. s .. " : " .. tostring(pid))
- return(tonumber(pid))
-end
-
-function session_connect_with(s0, s1)
- -- local pid0 = tostring(session_get_bash_pid(s0))
- local pid1 = tostring(session_get_bash_pid(s1))
- local eth_options = { "rx", "tx", "sg", "tso", "ufo", "gso", "gro", "lro", "rxvlan", "txvlan", "rxhash" }
- local this_end = s0 .. "_" .. s1
- local other_end = s1 .. "_" .. s0
- session_exec(s0, "ip link add name " .. this_end .. " type veth peer name " .. other_end)
- session_exec(s0, "ip link set dev " .. this_end .. " up promisc on")
- for i, option in ipairs(eth_options) do
- session_exec(s0, "/sbin/ethtool --offload " .. this_end .. " " .. option .. " off")
- session_exec(s0, "/sbin/ethtool --offload " .. other_end .. " " .. option .. " off")
- end
- session_exec(s0, "ip link set dev " .. other_end .. " up promisc on netns /proc/" .. pid1 .. "/ns/net")
- sleep(0.5)
-end
-
-^D^D^D
-run lua session_connect_with("s0", "s1")
-run lua session_connect_with("s0", "s2")
-
-cd s1
-ip -6 addr add dev s1_s0 2001:db8:1::1/64
-ip -4 addr add dev s1_s0 192.0.2.1/24
-ip link set dev s1_s0 up promisc on
-^D^D^D
-
-cd s2
-ip -6 addr add dev s2_s0 2001:db8:1::2/64
-ip -6 addr add dev s2_s0 2001:db8:1::3/64
-ip -6 addr add dev s2_s0 2001:db8:1::4/64
-ip -4 addr add dev s2_s0 192.0.2.2/24
-ip -4 addr add dev s2_s0:1 192.0.2.3/24
-ip -4 addr add dev s2_s0:2 192.0.2.4/24
-ip link set dev s2_s0 up promisc on
-^D^D^D
-
-run s1 ip addr
-run s2 ip addr
-shell VPP
-cd VPP
-cd /home/ubuntu/vpp
-make debug
-r
-^D^D^D
-expect VPP DBGvpp#
-
-cd lua
--- Initialization of the Lua environment for talking to VPP
-vpp = require("vpp-lapi")
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_debug-native/vpp-api/lib64/libpneum.so"
-vpp:init({ pneum_path = pneum_path })
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vlib-api/vlibmemory/memclnt.api")
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vpp/vpp-api/vpe.api")
-vpp:connect("aytest")
-vpp:consume_api(root_dir .. "/plugins/acl-plugin/acl/acl.api", "acl")
-
-^D^D^D
-
-cd lua
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s1", hw_addr = "AAAAAA" })
-vpp_if_to_s1 = reply[1].sw_if_index
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s2", hw_addr = "AAAAAA" })
-vpp_if_to_s2 = reply[1].sw_if_index
-
-ifaces = { vpp_if_to_s1, vpp_if_to_s2 }
-
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s1, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s2, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-
-bd_id = 42
-
-reply = vpp:api_call("bridge_domain_add_del", { bd_id = bd_id, flood = 1, uu_flood = 1, forward = 1, learn = 1, arp_term = 0, is_add = 1 })
-print(vpp.dump(reply))
-
-for i, v in ipairs(ifaces) do
- reply = vpp:api_call("sw_interface_set_l2_bridge", { rx_sw_if_index = v, bd_id = bd_id, shg = 0, bvi = 0, enable = 1 } )
- print(vpp.dump(reply))
-end
-
-^D^D^D
-
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.4
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-
-
-cd lua
---- ACL testing
-
---[[ temporary comment out
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 230 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 8 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 15 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 2, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 0 })
-print(vpp.dump(reply))
-print("---")
-
-acl_index_to_delete = reply[1].acl_index
-print("Deleting " .. tostring(acl_index_to_delete))
-reply = vpp:api_call("acl_del", { context = 42, acl_index = acl_index_to_delete })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-for ri, rv in ipairs(reply) do
- print("Reply message #" .. tostring(ri))
- print(vpp.dump(rv))
- for ai, av in ipairs(rv.r) do
- print("ACL rule #" .. tostring(ai) .. " : " .. vpp.dump(av))
- end
-
-end
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 4294967295 })
-print(vpp.dump(reply))
-print("---")
-
-
-]] -- end of comment out
-
----- Should be nothing ^^
-r = {
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::3"), dst_ip_prefix_len = 128 },
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8::"), dst_ip_prefix_len = 32 },
- { is_permit = 1, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.2"), dst_ip_prefix_len = 32},
- { is_permit = 0, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.3"), dst_ip_prefix_len = 32 },
-}
-
-reply = vpp:api_call("acl_add", { context = 42, count = 5, r = r })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_in
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s1, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
---reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
--- print(vpp.dump(reply))
---print("---")
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 2
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 3
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 4
-
-
-cd lua
-
---- TEST OUTBOUND ACL
-
-r1 = {
- { is_permit = 1, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::4"), dst_ip_prefix_len = 128 }
-}
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = r1 })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 1
-
-run lua print("ALL GOOD!")
-
diff --git a/vpp-api/lua/examples/lute/script-inout-acl.lute b/vpp-api/lua/examples/lute/script-inout-acl.lute
deleted file mode 100644
index d7e7423c..00000000
--- a/vpp-api/lua/examples/lute/script-inout-acl.lute
+++ /dev/null
@@ -1,329 +0,0 @@
-shell vppbuild
-run vppbuild stty -echo
-run vppbuild sudo -u ubuntu -i bash -c "(cd vpp && make plugins && echo ALLGOOD)"
-expect vppbuild ALLGOOD
-
-shell s0
-shell s1
-shell s2
-
-
-cd s1
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-cd s2
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-
-cd lua
-
-function session_get_bash_pid(s)
- if not has_session(s) then
- return nil
- end
- local fname = "/tmp/lute-"..s.."-pid.txt"
-
- session_exec(s, "echo $$ >" .. fname)
- -- it's a dirty hack but it's quick
- sleep(0.5)
- local pid = io.lines(fname)()
- print("Got pid for " .. s .. " : " .. tostring(pid))
- return(tonumber(pid))
-end
-
-function session_connect_with(s0, s1)
- -- local pid0 = tostring(session_get_bash_pid(s0))
- local pid1 = tostring(session_get_bash_pid(s1))
- local eth_options = { "rx", "tx", "sg", "tso", "ufo", "gso", "gro", "lro", "rxvlan", "txvlan", "rxhash" }
- local this_end = s0 .. "_" .. s1
- local other_end = s1 .. "_" .. s0
- session_exec(s0, "ip link add name " .. this_end .. " type veth peer name " .. other_end)
- session_exec(s0, "ip link set dev " .. this_end .. " up promisc on")
- for i, option in ipairs(eth_options) do
- session_exec(s0, "/sbin/ethtool --offload " .. this_end .. " " .. option .. " off")
- session_exec(s0, "/sbin/ethtool --offload " .. other_end .. " " .. option .. " off")
- end
- session_exec(s0, "ip link set dev " .. other_end .. " up promisc on netns /proc/" .. pid1 .. "/ns/net")
- sleep(0.5)
-end
-
-^D^D^D
-run lua session_connect_with("s0", "s1")
-run lua session_connect_with("s0", "s2")
-
-cd s1
-ip -6 addr add dev s1_s0 2001:db8:1::1/64
-ip -4 addr add dev s1_s0 192.0.2.1/24
-ip link set dev s1_s0 up promisc on
-^D^D^D
-
-cd s2
-ip -6 addr add dev s2_s0 2001:db8:1::2/64
-ip -6 addr add dev s2_s0 2001:db8:1::3/64
-ip -6 addr add dev s2_s0 2001:db8:1::4/64
-ip -4 addr add dev s2_s0 192.0.2.2/24
-ip -4 addr add dev s2_s0:1 192.0.2.3/24
-ip -4 addr add dev s2_s0:2 192.0.2.4/24
-ip link set dev s2_s0 up promisc on
-^D^D^D
-
-run s1 ip addr
-run s2 ip addr
-shell VPP
-cd VPP
-cd /home/ubuntu/vpp
-make debug
-r
-^D^D^D
-expect VPP DBGvpp#
-
-cd lua
--- Initialization of the Lua environment for talking to VPP
-vpp = require("vpp-lapi")
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_debug-native/vpp-api/lib64/libpneum.so"
-vpp:init({ pneum_path = pneum_path })
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vlib-api/vlibmemory/memclnt.api")
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vpp/vpp-api/vpe.api")
-vpp:connect("aytest")
-vpp:consume_api(root_dir .. "/plugins/acl-plugin/acl/acl.api", "acl")
-
-^D^D^D
-
-cd lua
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s1", hw_addr = "AAAAAA" })
-vpp_if_to_s1 = reply[1].sw_if_index
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s2", hw_addr = "AAAAAA" })
-vpp_if_to_s2 = reply[1].sw_if_index
-
-ifaces = { vpp_if_to_s1, vpp_if_to_s2 }
-
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s1, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s2, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-
-bd_id = 42
-
-reply = vpp:api_call("bridge_domain_add_del", { bd_id = bd_id, flood = 1, uu_flood = 1, forward = 1, learn = 1, arp_term = 0, is_add = 1 })
-print(vpp.dump(reply))
-
-for i, v in ipairs(ifaces) do
- reply = vpp:api_call("sw_interface_set_l2_bridge", { rx_sw_if_index = v, bd_id = bd_id, shg = 0, bvi = 0, enable = 1 } )
- print(vpp.dump(reply))
-end
-
-^D^D^D
-
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.4
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-
-
-cd lua
---- ACL testing
-
---[[ temporary comment out
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 230 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 8 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 15 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 2, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 0 })
-print(vpp.dump(reply))
-print("---")
-
-acl_index_to_delete = reply[1].acl_index
-print("Deleting " .. tostring(acl_index_to_delete))
-reply = vpp:api_call("acl_del", { context = 42, acl_index = acl_index_to_delete })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-for ri, rv in ipairs(reply) do
- print("Reply message #" .. tostring(ri))
- print(vpp.dump(rv))
- for ai, av in ipairs(rv.r) do
- print("ACL rule #" .. tostring(ai) .. " : " .. vpp.dump(av))
- end
-
-end
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 4294967295 })
-print(vpp.dump(reply))
-print("---")
-
-
-]] -- end of comment out
-
----- Should be nothing ^^
-r = {
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::3"), dst_ip_prefix_len = 128 },
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8::"), dst_ip_prefix_len = 32 },
- { is_permit = 1, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.2"), dst_ip_prefix_len = 32},
- { is_permit = 0, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.3"), dst_ip_prefix_len = 32 },
-}
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 5, r = r })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_in
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s1, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
---reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
--- print(vpp.dump(reply))
---print("---")
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 2
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 3
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 4
-
-
-cd lua
-
---- TEST OUTBOUND ACL
-
-r1 = {
- { is_permit = 1, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::4"), dst_ip_prefix_len = 128 }
-}
-
-reply = vpp:api_call("acl_add_replace", { context = 42, acl_index = -1, count = 3, r = r1 })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-
-^D^D^D
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 0
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run VPP show trace
-expect VPP match: inacl 0 rule 1
-
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-run VPP show trace
-expect VPP match: outacl 2 rule 1
-
-run lua print("ALL GOOD!")
-
diff --git a/vpp-api/lua/examples/lute/script.lute b/vpp-api/lua/examples/lute/script.lute
deleted file mode 100644
index c3dd90f2..00000000
--- a/vpp-api/lua/examples/lute/script.lute
+++ /dev/null
@@ -1,7 +0,0 @@
-shell s1
-expect s1 $
-run s1 echo testing123
-expect s1 $
-run s1 echo done
-quit
-
diff --git a/vpp-api/lua/examples/lute/sessions-acl.lute b/vpp-api/lua/examples/lute/sessions-acl.lute
deleted file mode 100644
index ac237ef9..00000000
--- a/vpp-api/lua/examples/lute/sessions-acl.lute
+++ /dev/null
@@ -1,308 +0,0 @@
-run lua -- collectgarbage("stop")
-
-shell vppbuild
-run vppbuild stty -echo
-run vppbuild sudo -u ubuntu -i bash -c "(cd vpp && make plugins && echo ALLGOOD)"
-expect vppbuild ALLGOOD
-
-shell s0
-shell s1
-shell s2
-
-
-cd s1
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-cd s2
-unshare -n /bin/bash
-/sbin/ifconfig -a
-^D^D^D
-
-
-cd lua
-
-function session_get_bash_pid(s)
- if not has_session(s) then
- return nil
- end
- local fname = "/tmp/lute-"..s.."-pid.txt"
-
- session_exec(s, "echo $$ >" .. fname)
- -- it's a dirty hack but it's quick
- sleep(0.5)
- local pid = io.lines(fname)()
- print("Got pid for " .. s .. " : " .. tostring(pid))
- return(tonumber(pid))
-end
-
-function session_connect_with(s0, s1)
- -- local pid0 = tostring(session_get_bash_pid(s0))
- local pid1 = tostring(session_get_bash_pid(s1))
- local eth_options = { "rx", "tx", "sg", "tso", "ufo", "gso", "gro", "lro", "rxvlan", "txvlan", "rxhash" }
- local this_end = s0 .. "_" .. s1
- local other_end = s1 .. "_" .. s0
- session_exec(s0, "ip link add name " .. this_end .. " type veth peer name " .. other_end)
- session_exec(s0, "ip link set dev " .. this_end .. " up promisc on")
- for i, option in ipairs(eth_options) do
- session_exec(s0, "/sbin/ethtool --offload " .. this_end .. " " .. option .. " off")
- session_exec(s0, "/sbin/ethtool --offload " .. other_end .. " " .. option .. " off")
- end
- session_exec(s0, "ip link set dev " .. other_end .. " up promisc on netns /proc/" .. pid1 .. "/ns/net")
- sleep(0.5)
-end
-
-^D^D^D
-run lua session_connect_with("s0", "s1")
-run lua session_connect_with("s0", "s2")
-
-cd s1
-ip -6 addr add dev s1_s0 2001:db8:1::1/64
-ip -4 addr add dev s1_s0 192.0.2.1/24
-ip link set dev s1_s0 up promisc on
-^D^D^D
-
-cd s2
-ip -6 addr add dev s2_s0 2001:db8:1::2/64
-ip -6 addr add dev s2_s0 2001:db8:1::3/64
-ip -6 addr add dev s2_s0 2001:db8:1::4/64
-ip -4 addr add dev s2_s0 192.0.2.2/24
-ip -4 addr add dev s2_s0:1 192.0.2.3/24
-ip -4 addr add dev s2_s0:2 192.0.2.4/24
-ip link set dev s2_s0 up promisc on
-^D^D^D
-
-run s1 ip addr
-run s2 ip addr
-shell VPP
-cd VPP
-cd /home/ubuntu/vpp
-make debug
-r
-^D^D^D
-expect VPP DBGvpp#
-
-cd lua
--- Initialization of the Lua environment for talking to VPP
-vpp = require("vpp-lapi")
-root_dir = "/home/ubuntu/vpp"
-pneum_path = root_dir .. "/build-root/install-vpp_debug-native/vpp-api/lib64/libpneum.so"
-vpp:init({ pneum_path = pneum_path })
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vlib-api/vlibmemory/memclnt.api")
-vpp:consume_api(root_dir .. "/build-root/install-vpp_debug-native/vpp/vpp-api/vpe.api")
-vpp:connect("aytest")
-vpp:consume_api(root_dir .. "/plugins/acl-plugin/acl/acl.api", "acl")
-
-^D^D^D
-
-cd lua
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s1", hw_addr = "AAAAAA" })
-vpp_if_to_s1 = reply[1].sw_if_index
-
-reply = vpp:api_call("af_packet_create", { host_if_name = "s0_s2", hw_addr = "AAAAAA" })
-vpp_if_to_s2 = reply[1].sw_if_index
-
-ifaces = { vpp_if_to_s1, vpp_if_to_s2 }
-
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s1, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-reply = vpp:api_call("sw_interface_set_flags", { sw_if_index = vpp_if_to_s2, admin_up_down = 1, link_up_down = 1 })
-print(vpp.dump(reply))
-
-bd_id = 42
-
-reply = vpp:api_call("bridge_domain_add_del", { bd_id = bd_id, flood = 1, uu_flood = 1, forward = 1, learn = 1, arp_term = 0, is_add = 1 })
-print(vpp.dump(reply))
-
-for i, v in ipairs(ifaces) do
- reply = vpp:api_call("sw_interface_set_l2_bridge", { rx_sw_if_index = v, bd_id = bd_id, shg = 0, bvi = 0, enable = 1 } )
- print(vpp.dump(reply))
-end
-
-^D^D^D
-
-run s1 ping -c 3 192.0.2.2
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.3
-expect s1 packet loss
-run s1 ping -c 3 192.0.2.4
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::2
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::3
-expect s1 packet loss
-run s1 ping6 -c 3 2001:db8:1::4
-expect s1 packet loss
-
-
-cd lua
---- ACL testing
-
---[[ temporary comment out
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 230 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 8 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = 15 })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 2, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = 0, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_add", { context = 42, count = 0 })
-print(vpp.dump(reply))
-print("---")
-
-acl_index_to_delete = reply[1].acl_index
-print("Deleting " .. tostring(acl_index_to_delete))
-reply = vpp:api_call("acl_del", { context = 42, acl_index = acl_index_to_delete })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-for ri, rv in ipairs(reply) do
- print("Reply message #" .. tostring(ri))
- print(vpp.dump(rv))
- for ai, av in ipairs(rv.r) do
- print("ACL rule #" .. tostring(ai) .. " : " .. vpp.dump(av))
- end
-
-end
-print("---")
-
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-reply = vpp:api_call("acl_del", { context = 42, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 0})
-print(vpp.dump(reply))
-print("---")
-
-reply = vpp:api_call("acl_dump", { context = 42, sw_if_index = 4294967295 })
-print(vpp.dump(reply))
-print("---")
-
-
-]] -- end of comment out
-
----- Should be nothing ^^
-r = {
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8:1::3"), dst_ip_prefix_len = 128 },
- { is_permit = 1, is_ipv6 = 1, dst_ip_addr = ip46("2001:db8::"), dst_ip_prefix_len = 32 },
- { is_permit = 1, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.2"), dst_ip_prefix_len = 32},
- { is_permit = 0, is_ipv6 = 0, dst_ip_addr = ip46("192.0.2.3"), dst_ip_prefix_len = 32 },
-}
-
-reply = vpp:api_call("acl_add", { context = 42, count = 5, r = r })
-print(vpp.dump(reply))
-print("---")
-interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = { { is_permit = 1, is_ipv6 = 1 }, { is_permit = 0, is_ipv6 = 1 }, { is_permit = 1, is_ipv6 = 0 } } })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_in
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s1, is_add = 1, is_input = 1, acl_index = interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
---- TEST OUTBOUND ACL
-
-r1 = {
- { is_permit = 1, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::2"), dst_ip_prefix_len = 128 },
- { is_permit = 0, is_ipv6 = 1, src_ip_addr = ip46("2001:db8:1::1"), src_ip_prefix_len = 128, dst_ip_addr = ip46("2001:db8:1::4"), dst_ip_prefix_len = 128 },
- { is_permit = 2, is_ipv6 = 0 }
-}
-
-reply = vpp:api_call("acl_add", { context = 42, count = 3, r = r1 })
-print(vpp.dump(reply))
-print("---")
-interface_acl_out = reply[1].acl_index
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 0, acl_index = interface_acl_out })
-print(vpp.dump(reply))
-print("---")
-
-r2 = {
- { is_permit = 1, is_ipv6 = 1 },
- { is_permit = 0, is_ipv6 = 0 }
-}
-
-reply = vpp:api_call("acl_add", { context = 42, count = 2, r = r2 })
-print(vpp.dump(reply))
-print("---")
-second_interface_acl_in = reply[1].acl_index
-
-reply = vpp:api_call("acl_interface_add_del", { context = 42, sw_if_index = vpp_if_to_s2, is_add = 1, is_input = 1, acl_index = second_interface_acl_in })
-print(vpp.dump(reply))
-print("---")
-
-^D^D^D
-
-run VPP show classify tables
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s2 nc -v -l -p 22
-run s1 nc 192.0.2.2 22
-run s1 echo
-sleep 1
-run s1 break
-sleep 1
-run VPP show trace
-expect VPP match: outacl 2 rule 2
-run VPP show classify tables
-
-
-run VPP show classify tables
-run VPP clear trace
-run VPP trace add af-packet-input 100
-run s2 nc -v -l -p 22
-run s1 nc 192.0.2.2 22
-run s1 echo
-sleep 1
-run s1 break
-sleep 1
-run VPP show trace
-expect VPP match: outacl 2 rule 2
-run VPP show classify tables
-
-
-run lua print("ALL GOOD!")
-
diff --git a/vpp-api/lua/vpp-lapi.lua b/vpp-api/lua/vpp-lapi.lua
deleted file mode 100644
index ebfd032b..00000000
--- a/vpp-api/lua/vpp-lapi.lua
+++ /dev/null
@@ -1,989 +0,0 @@
---[[
-/*
- * 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.
- */
-]]
-
--- json decode/encode from https://gist.github.com/tylerneylon/59f4bcf316be525b30ab
--- licensed by the author tylerneylon into public domain. Thanks!
-
-local json = {}
-
--- Internal functions.
-
-local function kind_of(obj)
- if type(obj) ~= 'table' then return type(obj) end
- local i = 1
- for _ in pairs(obj) do
- if obj[i] ~= nil then i = i + 1 else return 'table' end
- end
- if i == 1 then return 'table' else return 'array' end
-end
-
-local function escape_str(s)
- local in_char = {'\\', '"', '/', '\b', '\f', '\n', '\r', '\t'}
- local out_char = {'\\', '"', '/', 'b', 'f', 'n', 'r', 't'}
- for i, c in ipairs(in_char) do
- s = s:gsub(c, '\\' .. out_char[i])
- end
- return s
-end
-
--- Returns pos, did_find; there are two cases:
--- 1. Delimiter found: pos = pos after leading space + delim; did_find = true.
--- 2. Delimiter not found: pos = pos after leading space; did_find = false.
--- This throws an error if err_if_missing is true and the delim is not found.
-local function skip_delim(str, pos, delim, err_if_missing)
- pos = pos + #str:match('^%s*', pos)
- if str:sub(pos, pos) ~= delim then
- if err_if_missing then
- error('Expected ' .. delim .. ' near position ' .. pos)
- end
- return pos, false
- end
- return pos + 1, true
-end
-
--- Expects the given pos to be the first character after the opening quote.
--- Returns val, pos; the returned pos is after the closing quote character.
-local function parse_str_val(str, pos, val)
- val = val or ''
- local early_end_error = 'End of input found while parsing string.'
- if pos > #str then error(early_end_error) end
- local c = str:sub(pos, pos)
- if c == '"' then return val, pos + 1 end
- if c ~= '\\' then return parse_str_val(str, pos + 1, val .. c) end
- -- We must have a \ character.
- local esc_map = {b = '\b', f = '\f', n = '\n', r = '\r', t = '\t'}
- local nextc = str:sub(pos + 1, pos + 1)
- if not nextc then error(early_end_error) end
- return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc))
-end
-
--- Returns val, pos; the returned pos is after the number's final character.
-local function parse_num_val(str, pos)
- local num_str = str:match('^-?%d+%.?%d*[eE]?[+-]?%d*', pos)
- local val = tonumber(num_str)
- if not val then error('Error parsing number at position ' .. pos .. '.') end
- return val, pos + #num_str
-end
-
-
--- Public values and functions.
-
-function json.stringify(obj, as_key)
- local s = {} -- We'll build the string as an array of strings to be concatenated.
- local kind = kind_of(obj) -- This is 'array' if it's an array or type(obj) otherwise.
- if kind == 'array' then
- if as_key then error('Can\'t encode array as key.') end
- s[#s + 1] = '['
- for i, val in ipairs(obj) do
- if i > 1 then s[#s + 1] = ', ' end
- s[#s + 1] = json.stringify(val)
- end
- s[#s + 1] = ']'
- elseif kind == 'table' then
- if as_key then error('Can\'t encode table as key.') end
- s[#s + 1] = '{'
- for k, v in pairs(obj) do
- if #s > 1 then s[#s + 1] = ', ' end
- s[#s + 1] = json.stringify(k, true)
- s[#s + 1] = ':'
- s[#s + 1] = json.stringify(v)
- end
- s[#s + 1] = '}'
- elseif kind == 'string' then
- return '"' .. escape_str(obj) .. '"'
- elseif kind == 'number' then
- if as_key then return '"' .. tostring(obj) .. '"' end
- return tostring(obj)
- elseif kind == 'boolean' then
- return tostring(obj)
- elseif kind == 'nil' then
- return 'null'
- else
- error('Unjsonifiable type: ' .. kind .. '.')
- end
- return table.concat(s)
-end
-
-json.null = {} -- This is a one-off table to represent the null value.
-
-function json.parse(str, pos, end_delim)
- pos = pos or 1
- if pos > #str then error('Reached unexpected end of input.') end
- local pos = pos + #str:match('^%s*', pos) -- Skip whitespace.
- local first = str:sub(pos, pos)
- if first == '{' then -- Parse an object.
- local obj, key, delim_found = {}, true, true
- pos = pos + 1
- while true do
- key, pos = json.parse(str, pos, '}')
- if key == nil then return obj, pos end
- if not delim_found then error('Comma missing between object items.') end
- pos = skip_delim(str, pos, ':', true) -- true -> error if missing.
- obj[key], pos = json.parse(str, pos)
- pos, delim_found = skip_delim(str, pos, ',')
- end
- elseif first == '[' then -- Parse an array.
- local arr, val, delim_found = {}, true, true
- pos = pos + 1
- while true do
- val, pos = json.parse(str, pos, ']')
- if val == nil then return arr, pos end
- if not delim_found then error('Comma missing between array items.') end
- arr[#arr + 1] = val
- pos, delim_found = skip_delim(str, pos, ',')
- end
- elseif first == '"' then -- Parse a string.
- return parse_str_val(str, pos + 1)
- elseif first == '-' or first:match('%d') then -- Parse a number.
- return parse_num_val(str, pos)
- elseif first == end_delim then -- End of an object or array.
- return nil, pos + 1
- else -- Parse true, false, or null.
- local literals = {['true'] = true, ['false'] = false, ['null'] = json.null}
- for lit_str, lit_val in pairs(literals) do
- local lit_end = pos + #lit_str - 1
- if str:sub(pos, lit_end) == lit_str then return lit_val, lit_end + 1 end
- end
- local pos_info_str = 'position ' .. pos .. ': ' .. str:sub(pos, pos + 10)
- error('Invalid json syntax starting at ' .. pos_info_str)
- end
-end
-
-
-local vpp = {}
-
-local ffi = require("ffi")
-
---[[
-
-The basic type definitions. A bit of weird gymnastic with
-unionization of the hton* and ntoh* functions results
-is to make handling of signed and unsigned types a bit cleaner,
-essentially building typecasting into a C union.
-
-The vl_api_opaque_message_t is a synthetic type assumed to have
-enough storage to hold the entire API message regardless of the type.
-During the operation it is casted to the specific message struct types.
-
-]]
-
-
-ffi.cdef([[
-
-typedef uint8_t u8;
-typedef int8_t i8;
-typedef uint16_t u16;
-typedef int16_t i16;
-typedef uint32_t u32;
-typedef int32_t i32;
-typedef uint64_t u64;
-typedef int64_t i64;
-typedef double f64;
-typedef float f32;
-
-#pragma pack(1)
-typedef union {
- u16 u16;
- i16 i16;
-} lua_ui16t;
-
-#pragma pack(1)
-typedef union {
- u32 u32;
- i32 i32;
-} lua_ui32t;
-
-u16 ntohs(uint16_t hostshort);
-u16 htons(uint16_t hostshort);
-u32 htonl(uint32_t along);
-u32 ntohl(uint32_t along);
-void *memset(void *s, int c, size_t n);
-void *memcpy(void *dest, void *src, size_t n);
-
-#pragma pack(1)
-typedef struct _vl_api_opaque_message {
- u16 _vl_msg_id;
- u8 data[65536];
-} vl_api_opaque_message_t;
-]])
-
-
--- CRC-based version stuff
-
-local crc32c_table = ffi.new('const uint32_t[256]',
- { 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4,
- 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB,
- 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B,
- 0x4D43CFD0, 0xBF284CD3, 0xAC78BF27, 0x5E133C24,
- 0x105EC76F, 0xE235446C, 0xF165B798, 0x030E349B,
- 0xD7C45070, 0x25AFD373, 0x36FF2087, 0xC494A384,
- 0x9A879FA0, 0x68EC1CA3, 0x7BBCEF57, 0x89D76C54,
- 0x5D1D08BF, 0xAF768BBC, 0xBC267848, 0x4E4DFB4B,
- 0x20BD8EDE, 0xD2D60DDD, 0xC186FE29, 0x33ED7D2A,
- 0xE72719C1, 0x154C9AC2, 0x061C6936, 0xF477EA35,
- 0xAA64D611, 0x580F5512, 0x4B5FA6E6, 0xB93425E5,
- 0x6DFE410E, 0x9F95C20D, 0x8CC531F9, 0x7EAEB2FA,
- 0x30E349B1, 0xC288CAB2, 0xD1D83946, 0x23B3BA45,
- 0xF779DEAE, 0x05125DAD, 0x1642AE59, 0xE4292D5A,
- 0xBA3A117E, 0x4851927D, 0x5B016189, 0xA96AE28A,
- 0x7DA08661, 0x8FCB0562, 0x9C9BF696, 0x6EF07595,
- 0x417B1DBC, 0xB3109EBF, 0xA0406D4B, 0x522BEE48,
- 0x86E18AA3, 0x748A09A0, 0x67DAFA54, 0x95B17957,
- 0xCBA24573, 0x39C9C670, 0x2A993584, 0xD8F2B687,
- 0x0C38D26C, 0xFE53516F, 0xED03A29B, 0x1F682198,
- 0x5125DAD3, 0xA34E59D0, 0xB01EAA24, 0x42752927,
- 0x96BF4DCC, 0x64D4CECF, 0x77843D3B, 0x85EFBE38,
- 0xDBFC821C, 0x2997011F, 0x3AC7F2EB, 0xC8AC71E8,
- 0x1C661503, 0xEE0D9600, 0xFD5D65F4, 0x0F36E6F7,
- 0x61C69362, 0x93AD1061, 0x80FDE395, 0x72966096,
- 0xA65C047D, 0x5437877E, 0x4767748A, 0xB50CF789,
- 0xEB1FCBAD, 0x197448AE, 0x0A24BB5A, 0xF84F3859,
- 0x2C855CB2, 0xDEEEDFB1, 0xCDBE2C45, 0x3FD5AF46,
- 0x7198540D, 0x83F3D70E, 0x90A324FA, 0x62C8A7F9,
- 0xB602C312, 0x44694011, 0x5739B3E5, 0xA55230E6,
- 0xFB410CC2, 0x092A8FC1, 0x1A7A7C35, 0xE811FF36,
- 0x3CDB9BDD, 0xCEB018DE, 0xDDE0EB2A, 0x2F8B6829,
- 0x82F63B78, 0x709DB87B, 0x63CD4B8F, 0x91A6C88C,
- 0x456CAC67, 0xB7072F64, 0xA457DC90, 0x563C5F93,
- 0x082F63B7, 0xFA44E0B4, 0xE9141340, 0x1B7F9043,
- 0xCFB5F4A8, 0x3DDE77AB, 0x2E8E845F, 0xDCE5075C,
- 0x92A8FC17, 0x60C37F14, 0x73938CE0, 0x81F80FE3,
- 0x55326B08, 0xA759E80B, 0xB4091BFF, 0x466298FC,
- 0x1871A4D8, 0xEA1A27DB, 0xF94AD42F, 0x0B21572C,
- 0xDFEB33C7, 0x2D80B0C4, 0x3ED04330, 0xCCBBC033,
- 0xA24BB5A6, 0x502036A5, 0x4370C551, 0xB11B4652,
- 0x65D122B9, 0x97BAA1BA, 0x84EA524E, 0x7681D14D,
- 0x2892ED69, 0xDAF96E6A, 0xC9A99D9E, 0x3BC21E9D,
- 0xEF087A76, 0x1D63F975, 0x0E330A81, 0xFC588982,
- 0xB21572C9, 0x407EF1CA, 0x532E023E, 0xA145813D,
- 0x758FE5D6, 0x87E466D5, 0x94B49521, 0x66DF1622,
- 0x38CC2A06, 0xCAA7A905, 0xD9F75AF1, 0x2B9CD9F2,
- 0xFF56BD19, 0x0D3D3E1A, 0x1E6DCDEE, 0xEC064EED,
- 0xC38D26C4, 0x31E6A5C7, 0x22B65633, 0xD0DDD530,
- 0x0417B1DB, 0xF67C32D8, 0xE52CC12C, 0x1747422F,
- 0x49547E0B, 0xBB3FFD08, 0xA86F0EFC, 0x5A048DFF,
- 0x8ECEE914, 0x7CA56A17, 0x6FF599E3, 0x9D9E1AE0,
- 0xD3D3E1AB, 0x21B862A8, 0x32E8915C, 0xC083125F,
- 0x144976B4, 0xE622F5B7, 0xF5720643, 0x07198540,
- 0x590AB964, 0xAB613A67, 0xB831C993, 0x4A5A4A90,
- 0x9E902E7B, 0x6CFBAD78, 0x7FAB5E8C, 0x8DC0DD8F,
- 0xE330A81A, 0x115B2B19, 0x020BD8ED, 0xF0605BEE,
- 0x24AA3F05, 0xD6C1BC06, 0xC5914FF2, 0x37FACCF1,
- 0x69E9F0D5, 0x9B8273D6, 0x88D28022, 0x7AB90321,
- 0xAE7367CA, 0x5C18E4C9, 0x4F48173D, 0xBD23943E,
- 0xF36E6F75, 0x0105EC76, 0x12551F82, 0xE03E9C81,
- 0x34F4F86A, 0xC69F7B69, 0xD5CF889D, 0x27A40B9E,
- 0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
- 0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351 }
-);
-
-local function CRC8(crc, d)
- return bit.bxor(bit.rshift(crc, 8), crc32c_table[bit.band(0xff, bit.bxor(crc, d))])
-end
-
-local function CRC16(crc, d)
- crc = CRC8(crc, bit.band(d, 0xFF))
- d = bit.rshift(d, 8)
- crc = CRC8(crc, bit.band(d, 0xFF))
- return crc
-end
-
-local function string_crc(str, crc)
- for i=1,#str do
- -- print("S", i, string.byte(str, i), string.char(string.byte(str, i)))
- crc = CRC8(crc, string.byte(str, i))
- end
- return crc
-end
-
-local tokens = {
- { ["match"] =' ', ["act"] = { } },
- { ["match"] ='\n', ["act"] = { } },
- { ["match"] ="manual_endian", ["act"] = { "NODE_MANUAL_ENDIAN", "MANUAL_ENDIAN", 276 } },
- { ["match"] ="define", ["act"] = { "NODE_DEFINE", "DEFINE", 267 } },
- { ["match"] ="dont_trace", ["act"] = { "NODE_DONT_TRACE", "DONT_TRACE", 279 } },
- { ["match"] ="f64", ["act"] = { "NODE_F64", "PRIMTYPE", string_crc } },
- { ["match"] ="i16", ["act"] = { "NODE_I16", "PRIMTYPE", string_crc } },
- { ["match"] ="i32", ["act"] = { "NODE_I32", "PRIMTYPE", string_crc } },
- { ["match"] ="i64", ["act"] = { "NODE_I64", "PRIMTYPE", string_crc } },
- { ["match"] ="i8", ["act"] = { "NODE_I8", "PRIMTYPE", string_crc } },
- { ["match"] ="manual_print", ["act"] = { "NODE_MANUAL_PRINT", "MANUAL_PRINT", 275 } },
- { ["match"] ="noversion", ["act"] = { "NODE_NOVERSION", "NOVERSION", 274 } },
- { ["match"] ="packed", ["act"] = { "NODE_PACKED", "TPACKED", 266 } },
- { ["match"] ="typeonly", ["act"] = { "NODE_TYPEONLY", "TYPEONLY", 278 } },
- { ["match"] ="u16", ["act"] = { "NODE_U16", "PRIMTYPE", string_crc } },
- { ["match"] ="u32", ["act"] = { "NODE_U32", "PRIMTYPE", string_crc } },
- { ["match"] ="u64", ["act"] = { "NODE_U64", "PRIMTYPE", string_crc } },
- { ["match"] ="u8", ["act"] = { "NODE_U8", "PRIMTYPE", string_crc } },
- { ["match"] ="union", ["act"] = { "NODE_UNION", "UNION", 271 } },
- { ["match"] ="uword", ["act"] = { "NODE_UWORD", "PRIMTYPE", string_crc } },
- { ["match"] ="%(", ["act"] = { "NODE_LPAR", "LPAR", 259 } },
- { ["match"] ="%)", ["act"] = { "NODE_RPAR", "RPAR", 258 } },
- { ["match"] =";", ["act"] = { "NODE_SEMI", "SEMI", 260 } },
- { ["match"] ="%[", ["act"] = { "NODE_LBRACK", "LBRACK", 261 } },
- { ["match"] ="%]", ["act"] = { "NODE_RBRACK", "RBRACK", 262 } },
- { ["match"] ="%{", ["act"] = { "NODE_LCURLY", "LCURLY", 268 } },
- { ["match"] ="%}", ["act"] = { "NODE_RCURLY", "RCURLY", 269 } },
- { ["match"] ='%b""', ["act"] = { "NODE_STRING", "STRING", string_crc } },
- { ["match"] ='%b@@', ["act"] = { "NODE_HELPER", "HELPER_STRING", string_crc } },
- -- TODO: \ must be consumed
- { ["match"] ='[_a-zA-Z][_a-zA-Z0-9]*',
- ["act"] = { "NODE_NAME", "NAME", string_crc } },
- { ["match"] ='[0-9]+', ["act"] = { "NODE_NUMBER", "NUMBER", string_crc } },
- { ["match"] ='#[^\n]+', ["act"] = { "NODE_PRAGMA", "PRAGMA", nil } },
-}
-
-
-function vpp.crc_version_string(data)
- local input_crc = 0
- -- Get rid of comments
- data = data:gsub("/%*.-%*/", "")
- data = data:gsub("//[^\n]+", "")
- -- print(data)
- idx = 1
- while (true) do
- local matched = nil
- for k, v in ipairs(tokens) do
- if not matched then
- local x, y, cap = string.find(data, v["match"], idx)
- if x == idx then
- matched = { ["node"] = v["act"], ["x"] = x, ["y"] = y, ["cap"] = cap, ["chars"] = string.sub(data, x, y) }
- -- print(k, v, x, y, cap, matched.chars, matched.node[0] )
- end
- end
- end
- if matched then
- idx = idx + (matched.y - matched.x + 1)
- if matched.node[1] then
- local act = matched.node[3]
- if type(act) == "function" then
- input_crc = act(matched.chars, input_crc)
- elseif type(act) == "number" then
- input_crc = CRC16(input_crc, act)
- end
- -- print(vpp.dump(matched))
- end
- else
- -- print("NOT MATCHED!")
- local crc = CRC16(input_crc, 0xFFFFFFFF)
- return string.sub(string.format("%x", crc), -8)
- end
- end
-end
-
-
-function vpp.dump(o)
- if type(o) == 'table' then
- local s = '{ '
- for k,v in pairs(o) do
- if type(k) ~= 'number' then k = '"'..k..'"' end
- s = s .. '['..k..'] = ' .. vpp.dump(v) .. ','
- end
- return s .. '} '
- else
- return tostring(o)
- end
-end
-
-function vpp.hex_dump(buf)
- local ret = {}
- for i=1,math.ceil(#buf/16) * 16 do
- if (i-1) % 16 == 0 then table.insert(ret, string.format('%08X ', i-1)) end
- table.insert(ret, ( i > #buf and ' ' or string.format('%02X ', buf:byte(i)) ))
- if i % 8 == 0 then table.insert(ret, ' ') end
- if i % 16 == 0 then table.insert(ret, buf:sub(i-16+1, i):gsub('%c','.')..'\n' ) end
- end
- return table.concat(ret)
-end
-
-
-function vpp.c_str(text_in)
- local text = text_in -- \000 will be helpfully added by ffi.copy
- local c_str = ffi.new("char[?]", #text+1)
- ffi.copy(c_str, text)
- return c_str
-end
-
-
-function vpp.init(vpp, args)
- local pneum_api = args.pneum_api or [[
- int cough_pneum_attach(char *pneum_path, char *cough_path);
- int pneum_connect(char *name, char *chroot_prefix, void *cb);
- int pneum_disconnect(void);
- int pneum_read(char **data, int *l);
- int pneum_write(char *data, int len);
- void pneum_free(char *data);
- uint32_t pneum_get_msg_index(unsigned char * name);
-]]
-
- vpp.pneum_path = args.pneum_path
- ffi.cdef(pneum_api)
- local init_res = 0
- vpp.pneum = ffi.load(vpp.pneum_path)
- if (init_res < 0) then
- return nil
- end
-
- vpp.next_msg_num = 1
- vpp.msg_name_to_number = {}
- vpp.msg_name_to_fields = {}
- vpp.msg_number_to_name = {}
- vpp.msg_number_to_type = {}
- vpp.msg_number_to_pointer_type = {}
- vpp.msg_name_to_crc = {}
- vpp.c_type_to_fields = {}
- vpp.events = {}
- vpp.plugin_version = {}
- vpp.is_connected = false
-
-
- vpp.t_lua2c = {}
- vpp.t_c2lua = {}
- vpp.t_lua2c["u8"] = function(c_type, src, dst_c_ptr)
- if type(src) == "string" then
- -- ffi.copy adds a zero byte at the end. Grrr.
- -- ffi.copy(dst_c_ptr, src)
- ffi.C.memcpy(dst_c_ptr, vpp.c_str(src), #src)
- return(#src)
- elseif type(src) == "table" then
- for i,v in ipairs(src) do
- ffi.cast("u8 *", dst_c_ptr)[i-1] = v
- end
- return(#src)
- else
- return 1, src -- ffi.cast("u8", src)
- end
- end
- vpp.t_c2lua["u8"] = function(c_type, src_ptr, src_len)
- if src_len then
- return ffi.string(src_ptr, src_len)
- else
- return (tonumber(src_ptr))
- end
- end
-
- vpp.t_lua2c["u16"] = function(c_type, src, dst_c_ptr)
- if type(src) == "table" then
- for i,v in ipairs(src) do
- ffi.cast("u16 *", dst_c_ptr)[i-1] = ffi.C.htons(v)
- end
- return(2 * #src)
- else
- return 2, (ffi.C.htons(src))
- end
- end
- vpp.t_c2lua["u16"] = function(c_type, src_ptr, src_len)
- if src_len then
- local out = {}
- for i = 0,src_len-1 do
- out[i+1] = tonumber(ffi.C.ntohs(src_ptr[i]))
- end
- return out
- else
- return (tonumber(ffi.C.ntohs(src_ptr)))
- end
- end
-
- vpp.t_lua2c["u32"] = function(c_type, src, dst_c_ptr)
- if type(src) == "table" then
- for i,v in ipairs(src) do
- ffi.cast("u32 *", dst_c_ptr)[i-1] = ffi.C.htonl(v)
- end
- return(4 * #src)
- else
- return 4, (ffi.C.htonl(src))
- end
- end
- vpp.t_c2lua["u32"] = function(c_type, src_ptr, src_len)
- if src_len then
- local out = {}
- for i = 0,src_len-1 do
- out[i+1] = tonumber(ffi.C.ntohl(src_ptr[i]))
- end
- return out
- else
- return (tonumber(ffi.C.ntohl(src_ptr)))
- end
- end
- vpp.t_lua2c["i32"] = function(c_type, src, dst_c_ptr)
- if type(src) == "table" then
- for i,v in ipairs(src) do
- ffi.cast("i32 *", dst_c_ptr)[i-1] = ffi.C.htonl(v)
- end
- return(4 * #src)
- else
- return 4, (ffi.C.htonl(src))
- end
- end
- vpp.t_c2lua["i32"] = function(c_type, src_ptr, src_len)
- local ntohl = function(src)
- local u32val = ffi.cast("u32", src)
- local ntohlval = (ffi.C.ntohl(u32val))
- local out = tonumber(ffi.cast("i32", ntohlval + 0LL))
- return out
- end
- if src_len then
- local out = {}
- for i = 0,src_len-1 do
- out[i+1] = tonumber(ntohl(src_ptr[i]))
- end
- else
- return (tonumber(ntohl(src_ptr)))
- end
- end
-
- vpp.t_lua2c["u64"] = function(c_type, src, dst_c_ptr)
- if type(src) == "table" then
- for i,v in ipairs(src) do
- ffi.cast("u64 *", dst_c_ptr)[i-1] = v --- FIXME ENDIAN
- end
- return(8 * #src)
- else
- return 8, ffi.cast("u64", src) --- FIXME ENDIAN
- end
- end
- vpp.t_c2lua["u64"] = function(c_type, src_ptr, src_len)
- if src_len then
- local out = {}
- for i = 0,src_len-1 do
- out[i+1] = tonumber(src_ptr[i]) -- FIXME ENDIAN
- end
- return out
- else
- return (tonumber(src_ptr)) --FIXME ENDIAN
- end
- end
-
-
-
-
- vpp.t_lua2c["__MSG__"] = function(c_type, src, dst_c_ptr)
- local dst = ffi.cast(c_type .. " *", dst_c_ptr)
- local additional_len = 0
- local fields_info = vpp.c_type_to_fields[c_type]
- -- print("__MSG__ type: " .. tostring(c_type))
- ffi.C.memset(dst_c_ptr, 0, ffi.sizeof(dst[0]))
- -- print(vpp.dump(fields_info))
- -- print(vpp.dump(src))
- for k,v in pairs(src) do
- local field = fields_info[k]
- if not field then
- print("ERROR: field " .. tostring(k) .. " in message " .. tostring(c_type) .. " is unknown")
- end
- local lua2c = vpp.t_lua2c[field.c_type]
- -- print("__MSG__ field " .. tostring(k) .. " : " .. vpp.dump(field))
- -- if the field is not an array type, try to coerce the argument to a number
- if not field.array and type(v) == "string" then
- v = tonumber(v)
- end
- if not lua2c then
- print("__MSG__ " .. tostring(c_type) .. " t_lua2c: can not store field " .. field.name ..
- " type " .. field.c_type .. " dst " .. tostring(dst[k]))
- return 0
- end
- local len = 0
- local val = nil
- if field.array and (type(v) == "table") then
- -- print("NTFY: field " .. tostring(k) .. " in message " .. tostring(c_type) .. " is an array")
- for field_i, field_v in ipairs(v) do
- -- print("NTFY: setting member#" .. tostring(field_i) .. " to value " .. vpp.dump(field_v))
- local field_len, field_val = lua2c(field.c_type, field_v, dst[k][field_i-1])
- len = len + field_len
- end
- else
- len, val = lua2c(field.c_type, v, dst[k])
- end
- if not field.array then
- dst[k] = val
- else
- if 0 == field.array then
- additional_len = additional_len + len
- -- print("Adding " .. tostring(len) .. " bytes due to field " .. tostring(field.name))
- -- If there is a variable storing the length
- -- and the input table does not set it, do magic
- if field.array_size and not src[field.array_size] then
- local size_field = fields_info[field.array_size]
- if size_field then
- dst[field.array_size] = vpp.t_c2lua[size_field.c_type](size_field.c_type, len)
- end
- end
- end
- end
- -- print("Full message:\n" .. vpp.hex_dump(ffi.string(ffi.cast('void *', req_store_cache), 64)))
- end
- return (ffi.sizeof(dst[0])+additional_len)
- end
-
- vpp.t_c2lua["__MSG__"] = function(c_type, src_ptr, src_len)
- local out = {}
- local reply_typed_ptr = ffi.cast(c_type .. " *", src_ptr)
- local field_desc = vpp.c_type_to_fields[c_type]
- if src_len then
- for i = 0,src_len-1 do
- out[i+1] = vpp.t_c2lua[c_type](c_type, src_ptr[i])
- end
- return out
- end
-
- for k, v in pairs(field_desc) do
- local v_c2lua = vpp.t_c2lua[v.c_type]
- if v_c2lua then
- local len = v.array
- -- print(dump(v))
- if len then
- local len_field_name = k .. "_length"
- local len_field = field_desc[len_field_name]
- if (len_field) then
- local real_len = vpp.t_c2lua[len_field.c_type](len_field.c_type, reply_typed_ptr[len_field_name])
- out[k] = v_c2lua(v.c_type, reply_typed_ptr[k], real_len)
- elseif len == 0 then
- -- check if len = 0, then must be a field which contains the size
- len_field = field_desc[v.array_size]
- local real_len = vpp.t_c2lua[len_field.c_type](len_field.c_type, reply_typed_ptr[v.array_size])
- -- print("REAL length: " .. vpp.dump(v) .. " : " .. tostring(real_len))
- out[k] = v_c2lua(v.c_type, reply_typed_ptr[k], real_len)
- else
- -- alas, just stuff the entire array
- out[k] = v_c2lua(v.c_type, reply_typed_ptr[k], len)
- end
- else
- out[k] = v_c2lua(v.c_type, reply_typed_ptr[k])
- end
- else
- out[k] = "<no accessor function for type " .. tostring(v.c_type) .. ">"
- end
- -- print(k, out[k])
- end
- return out
- end
-
- return vpp
-end
-
-function vpp.resolve_message_number(msgname)
- local name = msgname .. "_" .. vpp.msg_name_to_crc[msgname]
- local idx = vpp.pneum.pneum_get_msg_index(vpp.c_str(name))
- if vpp.debug_dump then
- print("Index for " .. tostring(name) .. " is " .. tostring(idx))
- end
- vpp.msg_name_to_number[msgname] = idx
- vpp.msg_number_to_name[idx] = msgname
- vpp.msg_number_to_type[idx] = "vl_api_" .. msgname .. "_t"
- vpp.msg_number_to_pointer_type[idx] = vpp.msg_number_to_type[idx] .. " *"
- ffi.cdef("\n\n enum { vl_msg_" .. msgname .. " = " .. idx .. " };\n\n")
-end
-
-function vpp.connect(vpp, client_name)
- local name = "lua_client"
- if client_name then
- name = client_name
- end
- local ret = vpp.pneum.pneum_connect(vpp.c_str(client_name), nil, nil)
- if tonumber(ret) == 0 then
- vpp.is_connected = true
- end
- for k, v in pairs(vpp.msg_name_to_number) do
- vpp.resolve_message_number(k)
- end
- end
-
-function vpp.disconnect(vpp)
- vpp.pneum.pneum_disconnect()
- end
-
-function vpp.json_api(vpp, path, plugin_name)
- -- print("Consuming the VPP api from "..path)
- local ffii = {}
- local f = io.open(path, "r")
- if not f then
- print("Could not open " .. path)
- return nil
- end
- local data = f:read("*all")
- local json = json.parse(data)
- if not (json.types or json.messages) then
- print("Can not parse " .. path)
- return nil
- end
-
- local all_types = {}
-
- for i, v in ipairs(json.types) do
- table.insert(all_types, { typeonly = 1, desc = v })
- end
- for i, v in ipairs(json.messages) do
- table.insert(all_types, { typeonly = 0, desc = v })
- end
- for i, v in ipairs(all_types) do
- local typeonly = v.typeonly
- local name = v.desc[1]
- local c_type = "vl_api_" .. name .. "_t"
-
- local fields = {}
- -- vpp.msg_name_to_fields[name] = fields
- -- print("CTYPE " .. c_type)
- vpp.c_type_to_fields[c_type] = fields
- vpp.t_lua2c[c_type] = vpp.t_lua2c["__MSG__"]
- vpp.t_c2lua[c_type] = vpp.t_c2lua["__MSG__"]
-
- local cdef = { "\n\n#pragma pack(1)\ntypedef struct _vl_api_", name, " {\n" }
- for ii, vv in ipairs(v.desc) do
- if type(vv) == "table" then
- if vv.crc then
- vpp.msg_name_to_crc[name] = string.sub(vv.crc, 3) -- strip the leading 0x
- else
- local fieldtype = vv[1]
- local fieldname = vv[2]
- local fieldcount = vv[3]
- local fieldcountvar = vv[4]
- local fieldrec = { name = fieldname, c_type = fieldtype, array = fieldcount, array_size = fieldcountvar }
- if fieldcount then
- table.insert(cdef, " " .. fieldtype .. " " .. fieldname .. "[" .. fieldcount .. "];\n")
- if fieldtype == "u8" then
- -- any array of bytes is treated as a string
- elseif vpp.t_lua2c[fieldtype] then
- -- print("Array of " .. fieldtype .. " is ok!")
- else
- print("Unknown array type: ", name, " : " , fieldname, " : ", fieldtype, ":", fieldcount, ":", fieldcountvar)
- end
- else
- table.insert(cdef, " " .. fieldtype .. " " .. fieldname .. ";\n")
- end
- fields[fieldname] = fieldrec
- end
- end
- end
-
- table.insert(cdef, "} vl_api_" .. name .. "_t;")
- table.insert(ffii, table.concat(cdef))
-
- if typeonly == 0 then
- -- we will want to resolve this later
- if vpp.debug_dump then
- print("Remember to resolve " .. name)
- end
- vpp.msg_name_to_number[name] = -1
- if vpp.is_connected then
- vpp.resolve_message_number(name)
- end
- end
-
- end
- local cdef_full = table.concat(ffii)
- ffi.cdef(cdef_full)
-end
-
-function vpp.consume_api(vpp, path, plugin_name)
- -- print("Consuming the VPP api from "..path)
- local ffii = {}
- local f = io.open(path, "r")
- if not f then
- print("Could not open " .. path)
- return nil
- end
- local data = f:read("*all")
- -- Remove all C comments
- data = data:gsub("/%*.-%*/", "")
- if vpp.is_connected and not plugin_name then
- print(path .. ": must specify plugin name!")
- return
- end
- if plugin_name then
- vpp.plugin_version[plugin_name] = vpp.crc_version_string(data)
- local full_plugin_name = plugin_name .. "_" .. vpp.plugin_version[plugin_name]
- local reply = vpp:api_call("get_first_msg_id", { name = full_plugin_name } )
- vpp.next_msg_num = tonumber(reply[1].first_msg_id)
- print("Plugin " .. full_plugin_name .. " first message is " .. tostring(vpp.next_msg_num))
- end
- -- print ("data len: ", #data)
- data = data:gsub("\n(.-)(%S+)%s*{([^}]*)}", function (preamble, name, members)
- local _, typeonly = preamble:gsub("typeonly", "")
- local maybe_msg_id_field = { [0] = "u16 _vl_msg_id;", "" }
- local onedef = "\n\n#pragma pack(1)\ntypedef struct _vl_api_"..name.. " {\n" ..
- -- " u16 _vl_msg_id;" ..
- maybe_msg_id_field[typeonly] ..
- members:gsub("%[[a-zA-Z_]+]", "[0]") ..
- "} vl_api_" .. name .. "_t;"
-
- local c_type = "vl_api_" .. name .. "_t"
-
- local fields = {}
- -- vpp.msg_name_to_fields[name] = fields
- -- print("CTYPE " .. c_type)
- vpp.c_type_to_fields[c_type] = fields
- vpp.t_lua2c[c_type] = vpp.t_lua2c["__MSG__"]
- vpp.t_c2lua[c_type] = vpp.t_c2lua["__MSG__"]
- local mirec = { name = "_vl_msg_id", c_type = "u16", array = nil, array_size = nil }
- if typeonly == 0 then
- fields[mirec.name] = mirec
- end
-
- -- populate the field reflection table for the message
- -- sets the various type information as well as the accessors for lua<->C conversion
- members:gsub("(%S+)%s+(%S+);", function (fieldtype, fieldname)
- local fieldcount = nil
- local fieldcountvar = nil
- -- data = data:gsub("%[[a-zA-Z_]+]", "[0]")
- fieldname = fieldname:gsub("(%b[])", function(cnt)
- fieldcount = tonumber(cnt:sub(2, -2));
- if not fieldcount then
- fieldcount = 0
- fieldcountvar = cnt:sub(2, -2)
- end
- return ""
- end)
- local fieldrec = { name = fieldname, c_type = fieldtype, array = fieldcount, array_size = fieldcountvar }
- if fieldcount then
- if fieldtype == "u8" then
- -- any array of bytes is treated as a string
- elseif vpp.t_lua2c[fieldtype] then
- -- print("Array of " .. fieldtype .. " is ok!")
- else
- print("Unknown array type: ", name, " : " , fieldname, " : ", fieldtype, ":", fieldcount, ":", fieldcountvar)
- end
- end
- fields[fieldname] = fieldrec
- end)
-
- -- print(dump(fields))
-
- if typeonly == 0 then
- local this_message_number = vpp.next_msg_num
- vpp.next_msg_num = vpp.next_msg_num + 1
- vpp.msg_name_to_number[name] = this_message_number
- vpp.msg_number_to_name[this_message_number] = name
- vpp.msg_number_to_type[this_message_number] = "vl_api_" .. name .. "_t"
- vpp.msg_number_to_pointer_type[this_message_number] = vpp.msg_number_to_type[this_message_number] .. " *"
- onedef = onedef .. "\n\n enum { vl_msg_" .. name .. " = " .. this_message_number .. " };\n\n"
- end
- table.insert(ffii, onedef);
- return "";
- end)
- local cdef = table.concat(ffii)
- -- print(cdef)
- ffi.cdef(cdef)
- end
-
-
-function vpp.lua2c(vpp, c_type, src, dst_c_ptr)
- -- returns the number of bytes written to memory pointed by dst
- local lua2c = vpp.t_lua2c[c_type]
- if lua2c then
- return(lua2c(c_type, src, dst_c_ptr))
- else
- print("vpp.lua2c: do not know how to store type " .. tostring(c_type))
- local x = "a" .. nil
- return 0
- end
-end
-
-function vpp.c2lua(vpp, c_type, src_ptr, src_len)
- -- returns the lua data structure
- local c2lua = vpp.t_c2lua[c_type]
- if c2lua then
- return(c2lua(c_type, src_ptr, src_len))
- else
- print("vpp.c2lua: do not know how to load type " .. c_type)
- return nil
- end
-end
-
-local req_store_cache = ffi.new("vl_api_opaque_message_t[1]")
-
-function vpp.api_write(vpp, api_name, req_table)
- local msg_num = vpp.msg_name_to_number[api_name]
- if not msg_num then
- print ("API call "..api_name.." is not known")
- return nil
- end
-
- if not req_table then
- req_table = {}
- end
- req_table._vl_msg_id = msg_num
-
- local packed_len = vpp:lua2c(vpp.msg_number_to_type[msg_num], req_table, req_store_cache)
- if vpp.debug_dump then
- print("Write Message length: " .. tostring(packed_len) .. "\n" .. vpp.hex_dump(ffi.string(ffi.cast('void *', req_store_cache), packed_len)))
- end
-
- res = vpp.pneum.pneum_write(ffi.cast('void *', req_store_cache), packed_len)
- return res
- end
-
-local rep_store_cache = ffi.new("vl_api_opaque_message_t *[1]")
-local rep_len_cache = ffi.new("int[1]")
-
-function vpp.api_read(vpp)
- local rep_type = "vl_api_opaque_message_t"
- local rep = rep_store_cache
- local replen = rep_len_cache
- res = vpp.pneum.pneum_read(ffi.cast("void *", rep), replen)
- if vpp.debug_dump then
- print("Read Message length: " .. tostring(replen[0]) .. "\n" .. vpp.hex_dump(ffi.string(ffi.cast('void *', rep[0]), replen[0])))
- end
-
- local reply_msg_num = ffi.C.ntohs(rep[0]._vl_msg_id)
- local reply_msg_name = vpp.msg_number_to_name[reply_msg_num]
-
- local reply_typed_ptr = ffi.cast(vpp.msg_number_to_pointer_type[reply_msg_num], rep[0])
- local out = vpp:c2lua(vpp.msg_number_to_type[reply_msg_num], rep[0], nil, replen[0])
- if type(out) == "table" then
- out["luaapi_message_name"] = reply_msg_name
- end
-
- vpp.pneum.pneum_free(ffi.cast('void *',rep[0]))
-
- return reply_msg_name, out
- end
-
-function vpp.api_call(vpp, api_name, req_table, options_in)
- local msg_num = vpp.msg_name_to_number[api_name]
- local end_message_name = api_name .."_reply"
- local replies = {}
- local cstruct = ""
- local options = options_in or {}
- if msg_num then
- if vpp.debug_dump then
- print("Message #" .. tostring(msg_num) .. " for name " .. tostring(api_name))
- end
- vpp:api_write(api_name, req_table)
- if not vpp.msg_name_to_number[end_message_name] or options.force_ping then
- end_message_name = "control_ping_reply"
- vpp:api_write("control_ping")
- end
- repeat
- reply_message_name, reply = vpp:api_read()
- if reply and not reply.context then
- -- there may be async events inbetween
- table.insert(vpp.events, reply)
- else
- if reply_message_name ~= "control_ping_reply" then
- -- do not insert the control ping encapsulation
- table.insert(replies, reply)
- end
- end
- -- print(reply)
- until reply_message_name == end_message_name
- else
- print(api_name .. " is an unknown API call")
- return nil
- end
- return replies
- end
-
-return vpp