VCL-LDPRELOAD: statically link vppcom into libvcl-ldpreload.so

- Move VCL & VCL-LDPRELOAD source into src/vcl
- Statically link vppcom into libvcl-ldpreload.so

Change-Id: I778300b37e8b06640d9dbc01caf297edf7a6edb7
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
This commit is contained in:
Dave Wallace
2017-10-24 04:12:18 -04:00
committed by Keith Burns
parent 4c151b5fa1
commit 5c7cf1cc53
29 changed files with 157 additions and 424 deletions

View File

@ -1,52 +1,27 @@
# vcl-ldpreload a LD_PRELOAD library that uses the VPP Communications Library (VCL).
User can LD_PRELOAD any application that uses POSIX socket API.
This library internally uses libvppcom.so library from VPP project.
NOTE: The sources have been moved to .../vpp/src/vcl and libvcl_ldpreload.so
libvcl-ldpreload.so is built with VPP and can be found in
.../vpp/build-root/install-vpp[_debug]-native/vpp/lib64
## HowTo
If VPP is not installed, but rather built in a separate directory, you can use the VPP_DIR 'configure' argument.
```bash
# 1. Set environment variables for source
cd vpp/extras/vcl-ldpreload
source ./env.sh
# 2. Change to VPP source directory and build
- Change director and modify uri.am to enable socket_test program
cd $VPP_DIR
perl -pi -e 's/noinst_PROGRAMS/bin_PROGRAMS/g' $VPP_DIR/src/uri.am
- Build VPP release
make install-dep wipe-release bootstrap dpdk-install-dev build-release
# 2. Build LD_PRELOAD library against VPP build above
## This does not install the LD_PRELOAD library in your system.
## Instead it will be referenced from the build directory set in VCL_LDPRELOAD_LIB
cd $LDP_DIR/vcl-ldpreload/src
autoreconf -i -f
./configure VPP_DIR=$VPP_DIR
make
```bash
# 3. Running the demo
# 1. Running the demo
## Run test script without parameters to see help menu:
cd $VPP_DIR/test/scripts
./socket_test.sh
export WS_ROOT=<top level vpp git repo dir> (e.g. /scratch/my_name/vpp)
$WS_ROOT/test/scripts/socket_test.sh
# 4. Docker iPerf examples.
# 2. Docker iPerf examples.
## These launch xterms. To quit, close xterms and run following docker kill cmd (WARNING: This will kill all docker containers!) 'docker kill $(docker ps -q)'
## Docker iPerf using default Linux Bridge
./socket_test.sh -bi docker-kernel
$WS_ROOT/test/scripts/socket_test.sh -bi docker-kernel
## Docker iPerf using VPP
./socket_test.sh -bi docker-preload
$WS_ROOT/test/scripts/socket_test.sh -bi docker-preload

View File

@ -1,4 +0,0 @@
export VPP_DIR=$WS_ROOT
export LDP_DIR=$WS_ROOT/extras/vcl-ldpreload
export LDP_TEST_DIR=$LDP_DIR/test
export VCL_LDPRELOAD_LIB_DIR=$LDP_DIR/src/.libs

View File

@ -1,17 +0,0 @@
*.m4
autom4te.cache
compile
config.*
configure
depcomp
install-sh
ltmain.sh
missing
Makefile.in
Makefile
*.o
*.l[oa]*
*.Plo
*.dirstamp
*.so*
libtool

View File

@ -1,62 +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.
###############################################################################
# Global Defines
###############################################################################
AUTOMAKE_OPTIONS = foreign subdir-objects
ACLOCAL_AMFLAGS = -I m4
AM_LIBTOOLFLAGS = --quiet
AM_CFLAGS = -Wall -fstack-protector -fPIC -Werror -g -DFORTIFY_SOURCE=2
AM_LDFLAGS = -shared
if VPP_DEBUG
AM_CFLAGS += -O0 -DCLIB_DEBUG
vpp_build = vpp_debug-native
else
AM_CFLAGS += -O2
vpp_build = vpp-native
endif
if VCL_LDPRELOAD_DEBUG
AM_CFLAGS += -ggdb '-DVCOM_DEBUG=1'
else
AM_CFLAGS += -Wall '-DVCOM_DEBUG=0'
endif
if VPP_DIR_SET
vpp_install_dir = @VPP_DIR@/build-root/install-$(vpp_build)/vpp
AM_CFLAGS += -I$(vpp_install_dir)/include/
AM_LDFLAGS += -L$(vpp_install_dir)/lib64/
endif
AM_LDFLAGS += -lvppcom -lvppinfra
SUBDIRS = .
noinst_HEADERS =
dist_bin_SCRIPTS =
lib_LTLIBRARIES =
BUILT_SOURCES =
CLEANFILES =
###############################################################################
# Components
###############################################################################
include libvcl-ldpreload.am

View File

@ -1,151 +0,0 @@
AC_INIT([vcl-ldpreload], [1.0], [vpp-dev@fd.io])
LT_INIT
AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE([subdir-objects])
AM_SILENT_RULES([yes])
AC_CONFIG_FILES([Makefile])
AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
AM_PROG_AS
AM_PROG_LIBTOOL
AC_PROG_YACC
AM_PATH_PYTHON
AC_ARG_VAR(VPP_DIR,[ vpp build directory ])
AM_CONDITIONAL([VPP_DIR_SET], [test ! -z "$VPP_DIR"])
###############################################################################
# Macros
###############################################################################
AC_DEFUN([ENABLE_ARG],
[
AC_ARG_ENABLE($1,
AC_HELP_STRING(patsubst([--enable-$1],[_],[-]), $2),
[enable_$1=yes n_enable_$1=1],
[enable_$1=no n_enable_$1=0])
AM_CONDITIONAL(m4_toupper(ENABLE_$1), test "$enable_$1" = "yes")
m4_append([list_of_enabled], [$1], [, ])
])
AC_DEFUN([DISABLE_ARG],
[
AC_ARG_ENABLE($1,
AC_HELP_STRING(patsubst([--disable-$1],[_],[-]), $2),
[enable_$1=no n_enable_$1=0],
[enable_$1=yes n_enable_$1=1])
AM_CONDITIONAL(m4_toupper(ENABLE_$1), test "$enable_$1" = "yes")
m4_append([list_of_enabled], [$1], [, ])
])
AC_DEFUN([WITH_ARG],
[
AC_ARG_WITH($1,
AC_HELP_STRING(patsubst([--with-$1],[_],[-]), $2),
[with_$1=yes n_with_$1=1],
[with_$1=no n_with_$1=0])
AM_CONDITIONAL(m4_toupper(WITH_$1), test "$with_$1" = "yes")
m4_append([list_of_with], [$1], [, ])
])
AC_DEFUN([WITHOUT_ARG],
[
AC_ARG_WITH($1,
AC_HELP_STRING(patsubst([--without-$1],[_],[-]), $2),
[with_$1=no n_with_$1=0],
[with_$1=yes n_with_$1=1])
AM_CONDITIONAL(m4_toupper(WITH_$1), test "$with_$1" = "yes")
m4_append([list_of_with], [$1], [, ])
])
AC_DEFUN([PRINT_VAL], [ AC_MSG_RESULT(AC_HELP_STRING($1,$2)) ])
###############################################################################
# configure arguments
###############################################################################
# --enable-X
AC_ARG_ENABLE([vpp-debug],
[ --enable-vpp-debug Use vpp debug native build libraries],
[if test x$enableval = xyes; then
AC_DEFINE(VPP_DEBUG, 1, [Define this to use vpp debug native build libraries.])
vpp_debug=true
fi], [vpp_debug=false])
AM_CONDITIONAL([VPP_DEBUG], [test x$vpp_debug = xtrue])
AC_ARG_ENABLE([vcl-ldpreload-debug],
[ --enable-vcl-ldpreload-debug Turn on vcl-ldpreload debugging],
[if test x$enableval = xyes; then
AC_DEFINE(VCL_LDPRELOAD_DEBUG, 1, [Define this to enable vcl-ldpreload debug.])
vcl_ldpreload_debug=true
fi], [vcl_ldpreload_debug=false])
AM_CONDITIONAL([VCL_LDPRELOAD_DEBUG], [test x$vcl_ldpreload_debug = xtrue])
# --disable-X
# --with-X
# --without-X
AC_ARG_WITH(unix,
AC_HELP_STRING([--with-unix],[Compile unix version of clib]),
[],
[case $host_os in
darwin* | linux*) with_unix=yes;;
*) with_unix=no;;
esac])
AM_CONDITIONAL(WITH_UNIX, test "$with_unix" = "yes")
###############################################################################
# Substitutions and defines
###############################################################################
# Silence following noise:
# ar: `u' modifier ignored since `D' is the default (see `U')
AR_FLAGS=cr
AC_SUBST(AR_FLAGS)
###############################################################################
# Dependency checks
###############################################################################
###############################################################################
# Output
###############################################################################
AC_OUTPUT
AC_MSG_RESULT([==============================================================================])
PRINT_VAL([version], $PACKAGE $VERSION)
PRINT_VAL([prefix], ${prefix})
PRINT_VAL([exec_prefix], ${exec_prefix})
PRINT_VAL([libdir], ${libdir})
PRINT_VAL([includedir], ${includedir})
PRINT_VAL([CFLAGS], ${CFLAGS})
PRINT_VAL([CPPFLAGS], ${CPPFLAGS})
PRINT_VAL([LDFLAGS], ${LDFLAGS})
AC_MSG_RESULT([])
AC_MSG_RESULT([with:])
m4_foreach([x], m4_dquote(list_of_with), [
AC_MSG_RESULT(AC_HELP_STRING(x, m4_join([], [${with_], x, [}])))
])
AC_MSG_RESULT([])
AC_MSG_RESULT([enabled:])
m4_foreach([x], m4_dquote(list_of_enabled), [
AC_MSG_RESULT(AC_HELP_STRING(x, m4_join([], [${enable_], x, [}])))
])
AC_MSG_RESULT([])
AC_MSG_RESULT([==============================================================================])

View File

@ -1,31 +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.
lib_LTLIBRARIES += libvcl_ldpreload.la
libvcl_ldpreload_la_SOURCES =
nobase_include_HEADERS =
libvcl_ldpreload_la_LIBADD = -lvppinfra -lvppcom -lpthread
libvcl_ldpreload_la_SOURCES += \
libvcl-ldpreload/vcom_socket_wrapper.c \
libvcl-ldpreload/vcom.c \
libvcl-ldpreload/vcom_socket.c
nobase_include_HEADERS += \
libvcl-ldpreload/vcom_socket_wrapper.h \
libvcl-ldpreload/vcom_glibc_socket.h \
libvcl-ldpreload/vcom.h \
libvcl-ldpreload/vcom_socket.h

View File

@ -1,9 +0,0 @@
vcl_ldpreload_configure_depend = vpp-install
vcl_ldpreload_CPPFLAGS = $(call installed_includes_fn, \
vppinfra \
uri)
vcl_ldpreload_LDFLAGS = $(call installed_libs_fn, \
vppinfra \
uri)

View File

@ -29,19 +29,22 @@ if [ -z "$WS_ROOT" ] ; then
echo " Please set WS_ROOT to VPP workspace root directory." >&2
exit 1
fi
if [ -z "$LDP_DIR" ] ; then
echo "WARNING: LDP_DIR environment variable is not set!"
echo " Sourcing $WS_ROOT/extras/vcl-ldpreload/env.sh"
source $WS_ROOT/extras/vcl-ldpreload/env.sh
if [ -z "$VCL_LDPRELOAD_LIB_DIR" ] ; then
echo "ERROR: VCL_LDPRELOAD_LIB_DIR environment variable not set!" >&2
echo " Please set VCL_LDPRELOAD_LIB_DIR to " >&2
echo " $WS_ROOT/build-root/install-vpp[_debug]-native/vpp/lib64." >&2
exit 1
fi
TEST_APP="${TEST_APP:-curl}"
LDP_DIR="${WS_ROOT}/extras/vcl-ldpreload"
LDP_TEST_DIR="${LDP_TEST_DIR:-${LDP_DIR}/test}"
LDP_LIB="${LDP_LIB:-${VCL_LDPRELOAD_LIB_DIR}/libvcl_ldpreload.so.0.0.0}"
if [ ! -f "$LDP_LIB" ] ; then
echo "ERROR: Missing VCL-LDPRELOAD Library: $LDP_LIB"
echo " See $LDP_DIR/README.md for build instructions!"
echo " Run 'cd $WS_ROOT; make build[-release] ' !"
exit 1
fi

View File

@ -13,12 +13,10 @@ if [ -z "$WS_ROOT" ] ; then
echo " Please set WS_ROOT to VPP workspace root directory." >&2
exit 1
fi
if [ -z "$LDP_DIR" ] ; then
echo "WARNING: LDP_DIR environment variable is not set!"
echo " Sourcing $WS_ROOT/extras/vcl-ldpreload/env.sh"
source $WS_ROOT/extras/vcl-ldpreload/env.sh
fi
LDP_DIR="${WS_ROOT}/extras/vcl-ldpreload"
LDP_TEST_DIR="${LDP_TEST_DIR:-${LDP_DIR}/test}"
VCL_LDPRELOAD_LIB_DIR="${VCL_LDPRELOAD_LIB_DIR:-${WS_ROOT}/build-root/install-vpp_debug-native/vpp/lib64}"
TEST_APP="${TEST_APP:-curl}"
LDP_TEST_DIR="${LDP_TEST_DIR:-${LDP_DIR}/test}"
source $LDP_TEST_DIR/common/nginx_test.sh

View File

@ -13,12 +13,10 @@ if [ -z "$WS_ROOT" ] ; then
echo " Please set WS_ROOT to VPP workspace root directory." >&2
exit 1
fi
if [ -z "$LDP_DIR" ] ; then
echo "WARNING: LDP_DIR environment variable is not set!"
echo " Sourcing $WS_ROOT/extras/vcl-ldpreload/env.sh"
source $WS_ROOT/extras/vcl-ldpreload/env.sh
fi
LDP_DIR="${WS_ROOT}/extras/vcl-ldpreload"
LDP_TEST_DIR="${LDP_TEST_DIR:-${LDP_DIR}/test}"
VCL_LDPRELOAD_LIB_DIR="${VCL_LDPRELOAD_LIB_DIR:-$WS_ROOT/build-root/install-vpp_debug-native/vpp/lib64}"
TEST_APP="${TEST_APP:-wget}"
LDP_TEST_DIR="${LDP_TEST_DIR:-${LDP_DIR}/test}"
source $LDP_TEST_DIR/common/nginx_test.sh

View File

@ -68,6 +68,7 @@ include vnet.am
include vpp.am
include vpp-api-test.am
include uri.am
include vcl.am
SUBDIRS += plugins

View File

@ -11,34 +11,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
lib_LTLIBRARIES += libvppcom.la
libvppcom_la_SOURCES =
libvppcom_la_DEPENDENCIES = \
libvppinfra.la \
libvlib.la \
libsvmdb.la \
libsvm.la \
libvlibmemory.la \
libvlibmemoryclient.la
libvppcom_la_LIBADD = $(libvppcom_la_DEPENDENCIES) -lpthread
libvppcom_la_SOURCES += \
uri/vppcom.c
nobase_include_HEADERS += \
uri/vppcom.h
noinst_PROGRAMS += \
uri_udp_test \
uri_tcp_test \
uri_socket_test \
uri_socket_server \
vcl_test_server \
vcl_test_client \
sock_test_server \
sock_test_client
uri_socket_server
uri_udp_test_SOURCES = uri/uri_udp_test.c
uri_udp_test_LDADD = libvlibmemoryclient.la libsvm.la \
@ -49,19 +26,8 @@ uri_tcp_test_LDADD = libvlibmemoryclient.la libsvm.la \
libvppinfra.la -lpthread -lm -lrt
uri_socket_test_SOURCES = uri/uri_socket_test.c
uri_socket_test_LDADD = libvppinfra.la -lpthread -lm -lrt
uri_socket_test_LDADD = libvppinfra.la libvcl_ldpreload.la -lpthread -lm -lrt
uri_socket_server_SOURCES = uri/uri_socket_server.c
uri_socket_server_LDADD = libvppinfra.la -lpthread -lm -lrt
uri_socket_server_LDADD = libvppinfra.la libvcl_ldpreload.la -lpthread -lm -lrt
vcl_test_server_SOURCES = uri/vcl_test_server.c
vcl_test_server_LDADD = libvppcom.la
vcl_test_client_SOURCES = uri/vcl_test_client.c
vcl_test_client_LDADD = libvppcom.la
sock_test_server_SOURCES = uri/sock_test_server.c
sock_test_client_SOURCES = uri/sock_test_client.c
nobase_include_HEADERS += \
uri/sock_test.h

65
src/vcl.am Normal file
View File

@ -0,0 +1,65 @@
# Copyright (c) 2017 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.
lib_LTLIBRARIES += libvppcom.la libvcl_ldpreload.la
libvppcom_la_SOURCES =
libvcl_ldpreload_la_SOURCES =
libvppcom_la_DEPENDENCIES = \
libvppinfra.la \
libvlib.la \
libsvmdb.la \
libsvm.la \
libvlibmemory.la \
libvlibmemoryclient.la
libvcl_ldpreload_la_DEPENDENCIES = $(libvppcom_la_DEPENDENCIES)
libvppcom_la_LIBADD = $(libvppcom_la_DEPENDENCIES) -lpthread
libvcl_ldpreload_la_LIBADD = $(libvcl_ldpreload_la_DEPENDENCIES) -lpthread
libvppcom_la_SOURCES += \
vcl/vppcom.c
nobase_include_HEADERS += \
vcl/vppcom.h
libvcl_ldpreload_la_SOURCES += \
vcl/vcom_socket_wrapper.c \
vcl/vcom.c \
vcl/vcom_socket.c \
vcl/vppcom.c
nobase_include_HEADERS += \
vcl/vcom_socket_wrapper.h \
vcl/vcom_glibc_socket.h \
vcl/vcom.h \
vcl/vcom_socket.h
noinst_PROGRAMS += \
vcl_test_server \
vcl_test_client \
sock_test_server \
sock_test_client
vcl_test_server_SOURCES = vcl/vcl_test_server.c
vcl_test_server_LDADD = libvppcom.la
vcl_test_client_SOURCES = vcl/vcl_test_client.c
vcl_test_client_LDADD = libvppcom.la
sock_test_server_SOURCES = vcl/sock_test_server.c
sock_test_client_SOURCES = vcl/sock_test_client.c
nobase_include_HEADERS += \
vcl/sock_test.h

View File

@ -22,7 +22,7 @@
#include <stdio.h>
#include <time.h>
#include <arpa/inet.h>
#include <uri/sock_test.h>
#include <vcl/sock_test.h>
typedef struct
{

View File

@ -21,7 +21,7 @@
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <uri/sock_test.h>
#include <vcl/sock_test.h>
#include <sys/stat.h>
#include <fcntl.h>

View File

@ -15,8 +15,8 @@
#define VCL_TEST
#include <uri/vppcom.h>
#include <uri/sock_test_client.c>
#include <vcl/vppcom.h>
#include <vcl/sock_test_client.c>
/*
* fd.io coding-style-patch-verification: ON

View File

@ -15,8 +15,8 @@
#define VCL_TEST
#include <uri/vppcom.h>
#include <uri/sock_test_server.c>
#include <vcl/vppcom.h>
#include <vcl/sock_test_server.c>
/*
* fd.io coding-style-patch-verification: ON

View File

@ -21,12 +21,12 @@
#include <stdarg.h>
#include <sys/resource.h>
#include <libvcl-ldpreload/vcom_socket_wrapper.h>
#include <libvcl-ldpreload/vcom.h>
#include <vcl/vcom_socket_wrapper.h>
#include <vcl/vcom.h>
#include <sys/time.h>
#include <uri/vppcom.h>
#include <libvcl-ldpreload/vcom_socket.h>
#include <vcl/vppcom.h>
#include <vcl/vcom_socket.h>
/* GCC have printf type attribute check. */
#ifdef HAVE_FUNCTION_ATTRIBUTE_FORMAT
@ -889,11 +889,13 @@ typedef __u64 timeu64_t;
#define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
#ifdef VCOM_USE_TIMESPEC_EQUAL
static inline int
timespec_equal (const struct timespec *a, const struct timespec *b)
{
return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec);
}
#endif
/*
* lhs < rhs: return <0
@ -910,6 +912,7 @@ timespec_compare (const struct timespec *lhs, const struct timespec *rhs)
return lhs->tv_nsec - rhs->tv_nsec;
}
#ifdef VCOM_USE_TIMEVAL_COMPARE
static inline int
timeval_compare (const struct timeval *lhs, const struct timeval *rhs)
{
@ -919,11 +922,11 @@ timeval_compare (const struct timeval *lhs, const struct timeval *rhs)
return 1;
return lhs->tv_usec - rhs->tv_usec;
}
#endif
extern void set_normalized_timespec (struct timespec *ts, time_t sec,
s64 nsec);
static inline struct timespec
timespec_add (struct timespec lhs, struct timespec rhs)
{
@ -3020,7 +3023,7 @@ vcom_poll (struct pollfd *__fds, nfds_t __nfds, int __timeout)
rv = -errno;
goto poll_done;
}
if (__nfds >= nofile_limit.rlim_cur || __nfds < 0)
if (__nfds >= nofile_limit.rlim_cur)
{
rv = -EINVAL;
goto poll_done;

View File

@ -22,7 +22,7 @@
#define VCOM_DEBUG 0
#endif
#include <libvcl-ldpreload/vcom_glibc_socket.h>
#include <vcl/vcom_glibc_socket.h>
#define MAX_VCOM_APP_NAME 256

View File

@ -24,11 +24,11 @@
#include <vppinfra/hash.h>
#include <vppinfra/pool.h>
#include <libvcl-ldpreload/vcom_socket.h>
#include <libvcl-ldpreload/vcom_socket_wrapper.h>
#include <libvcl-ldpreload/vcom.h>
#include <vcl/vcom_socket.h>
#include <vcl/vcom_socket_wrapper.h>
#include <vcl/vcom.h>
#include <uri/vppcom.h>
#include <vcl/vppcom.h>
/*
@ -446,7 +446,7 @@ vcom_socket_read (int __fd, void *__buf, size_t __nbytes)
if (vsock->type != SOCKET_TYPE_VPPCOM_BOUND)
return -EINVAL;
if (!__buf || __nbytes < 0)
if (!__buf)
{
return -EINVAL;
}
@ -485,6 +485,7 @@ vcom_socket_readv (int __fd, const struct iovec * __iov, int __iovcnt)
uword *p;
vcom_socket_t *vsock;
ssize_t total = 0, len = 0;
int i;
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
@ -501,7 +502,7 @@ vcom_socket_readv (int __fd, const struct iovec * __iov, int __iovcnt)
return -EINVAL;
/* Sanity check */
for (int i = 0; i < __iovcnt; ++i)
for (i = 0; i < __iovcnt; ++i)
{
if (SSIZE_MAX - len < __iov[i].iov_len)
return -EINVAL;
@ -519,7 +520,7 @@ vcom_socket_readv (int __fd, const struct iovec * __iov, int __iovcnt)
{
do
{
for (int i = 0; i < __iovcnt; ++i)
for (i = 0; i < __iovcnt; ++i)
{
rv = vppcom_session_read (vsock->sid, __iov[i].iov_base,
__iov[i].iov_len);
@ -539,7 +540,7 @@ vcom_socket_readv (int __fd, const struct iovec * __iov, int __iovcnt)
}
/* is non blocking */
for (int i = 0; i < __iovcnt; ++i)
for (i = 0; i < __iovcnt; ++i)
{
rv = vppcom_session_read (vsock->sid, __iov[i].iov_base,
__iov[i].iov_len);
@ -572,6 +573,11 @@ vcom_socket_write (int __fd, const void *__buf, size_t __n)
uword *p;
vcom_socket_t *vsock;
if (!__buf)
{
return -EINVAL;
}
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
return -EBADF;
@ -583,11 +589,6 @@ vcom_socket_write (int __fd, const void *__buf, size_t __n)
if (vsock->type != SOCKET_TYPE_VPPCOM_BOUND)
return -EINVAL;
if (!__buf || __n < 0)
{
return -EINVAL;
}
rv = vppcom_session_write (vsock->sid, (void *) __buf, __n);
return rv;
}
@ -600,6 +601,7 @@ vcom_socket_writev (int __fd, const struct iovec * __iov, int __iovcnt)
vcom_socket_main_t *vsm = &vcom_socket_main;
uword *p;
vcom_socket_t *vsock;
int i;
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
@ -615,7 +617,7 @@ vcom_socket_writev (int __fd, const struct iovec * __iov, int __iovcnt)
if (__iov == 0 || __iovcnt == 0 || __iovcnt > IOV_MAX)
return -EINVAL;
for (int i = 0; i < __iovcnt; ++i)
for (i = 0; i < __iovcnt; ++i)
{
rv = vppcom_session_write (vsock->sid, __iov[i].iov_base,
__iov[i].iov_len);
@ -1108,10 +1110,6 @@ vcom_socket_select (int vcom_nfds, fd_set * __restrict vcom_readfds,
{
return vcom_nsid;
}
if (vcom_nsid_fds < 0)
{
return -EINVAL;
}
rv = vppcom_select (vcom_nsid_fds,
vcom_readfds ? (unsigned long *) &vcom_rd_sid_fds :
@ -1311,11 +1309,6 @@ vcom_socket_getsockname (int __fd, __SOCKADDR_ARG __addr,
if (!__addr || !__len)
return -EFAULT;
if (*__len < 0)
{
return -EINVAL;
}
vppcom_endpt_t ep;
ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
rv = vcom_session_getsockname (vsock->sid, &ep);
@ -1423,11 +1416,6 @@ vcom_socket_getpeername (int __fd, __SOCKADDR_ARG __addr,
if (!__addr || !__len)
return -EFAULT;
if (*__len < 0)
{
return -EINVAL;
}
vppcom_endpt_t ep;
ep.ip = (u8 *) & ((const struct sockaddr_in *) __addr)->sin_addr;
rv = vcom_session_getpeername (vsock->sid, &ep);
@ -1539,6 +1527,11 @@ vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
uword *p;
vcom_socket_t *vsock;
if (!__buf)
{
return -EINVAL;
}
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
return -EBADF;
@ -1547,7 +1540,7 @@ vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
if (!vsock)
return -ENOTSOCK;
if ((vsock->type != SOCKET_TYPE_VPPCOM_BOUND) || !__buf || __n < 0)
if (vsock->type != SOCKET_TYPE_VPPCOM_BOUND)
{
return -EINVAL;
}
@ -1563,7 +1556,7 @@ vcom_socket_sendto (int __fd, const void *__buf, size_t __n,
}
else
{
if (!__addr || __addr_len < 0)
if (!__addr)
{
return -EDESTADDRREQ;
}
@ -1601,6 +1594,11 @@ vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
uword *p;
vcom_socket_t *vsock;
if (!__buf || !__addr || !__addr_len)
{
return -EINVAL;
}
p = hash_get (vsm->sockidx_by_fd, __fd);
if (!p)
return -EBADF;
@ -1609,8 +1607,7 @@ vcom_socket_recvfrom (int __fd, void *__restrict __buf, size_t __n,
if (!vsock)
return -ENOTSOCK;
if ((vsock->type != SOCKET_TYPE_VPPCOM_BOUND) ||
!__buf || __n < 0 || !__addr || !__addr_len || (__addr_len < 0))
if (vsock->type != SOCKET_TYPE_VPPCOM_BOUND)
{
return -EINVAL;
}
@ -1766,11 +1763,6 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
if (!__optval && !__optlen)
return -EFAULT;
if (*__optlen < 0)
{
return -EINVAL;
}
switch (__level)
{
/* handle options at socket level */
@ -1829,7 +1821,9 @@ vcom_socket_getsockopt (int __fd, int __level, int __optname,
case SO_BUSY_POLL:
#endif
case SO_MAX_PACING_RATE:
#ifdef SO_INCOMING_CPU
case SO_INCOMING_CPU:
#endif
rv = libc_getsockopt (__fd, __level, __optname, __optval, __optlen);
if (rv != 0)
{
@ -1952,7 +1946,7 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
if (!__optval)
return -EFAULT;
if ((__optlen < 0) || (__optlen < sizeof (int)))
if (__optlen < sizeof (int))
return -EINVAL;
switch (__level)
@ -2045,7 +2039,9 @@ vcom_socket_setsockopt (int __fd, int __level, int __optname,
case SO_BUSY_POLL:
#endif
case SO_MAX_PACING_RATE:
#ifdef SO_INCOMING_CPU
case SO_INCOMING_CPU:
#endif
rv = libc_setsockopt (__fd, __level, __optname, __optval, __optlen);
if (rv != 0)
{
@ -3000,7 +2996,7 @@ vcom_socket_poll_select_impl (struct pollfd *__fds, nfds_t __nfds,
struct timeval tv = {.tv_sec = 0,.tv_usec = 0 };
/* validate __nfds from select perspective */
if (__nfds < 0 || __nfds > FD_SETSIZE)
if (__nfds > FD_SETSIZE)
{
rv = -EINVAL;
goto poll_done;

View File

@ -18,8 +18,9 @@
#include <string.h>
#include <libvcl-ldpreload/vcom_glibc_socket.h>
#include <vcl/vcom_glibc_socket.h>
#include <vppinfra/types.h>
#include <sys/socket.h>
#define INVALID_SESSION_ID (~0)
#define INVALID_FD (~0)

View File

@ -63,7 +63,7 @@
#include <unistd.h>
#include <pthread.h>
#include <libvcl-ldpreload/vcom_socket_wrapper.h>
#include <vcl/vcom_socket_wrapper.h>
enum swrap_dbglvl_e

View File

@ -20,7 +20,7 @@
#include <vlibmemory/api.h>
#include <vpp/api/vpe_msg_enum.h>
#include <vnet/session/application_interface.h>
#include <uri/vppcom.h>
#include <vcl/vppcom.h>
#include <vlib/unix/unix.h>
#include <vppinfra/vec_bootstrap.h>

View File

@ -49,7 +49,6 @@ trap_signals="SIGINT SIGTERM EXIT"
VPP_GDB_CMDFILE="${VPP_GDB_CMDFILE:-${def_gdb_cmdfile_prefix}.vpp}"
VPPCOM_CLIENT_GDB_CMDFILE="${VPPCOM_CLIENT_GDB_CMDFILE:-${def_gdb_cmdfile_prefix}.vppcom_client}"
VPPCOM_SERVER_GDB_CMDFILE="${VPPCOM_SERVER_GDB_CMDFILE:-${def_gdb_cmdfile_prefix}.vppcom_server}"
VCL_LDPRELOAD_LIB_DIR="${VCL_LDPRELOAD_LIB_DIR:-$WS_ROOT/extras/vcl-ldpreload/src/.libs}"
usage() {
cat <<EOF
@ -136,7 +135,6 @@ while getopts ":hitlbcd6n:m:e:g:p:E:I:N:P:R:S:T:UBVX" opt; do
c) VPPCOM_CONF="${vppcom_conf_dir}vppcom_test.conf"
;;
d) title_dbg="-DEBUG"
_debug="_debug"
vpp_dir=$vpp_debug_dir
lib64_dir=$lib64_debug_dir
;;
@ -248,6 +246,8 @@ while ! [[ $run_test ]] && (( $# > 0 )) ; do
shift
done
VCL_LDPRELOAD_LIB_DIR="${VCL_LDPRELOAD_LIB_DIR:-$lib64_dir}"
if [ -z "$WS_ROOT" ] ; then
echo "ERROR: WS_ROOT environment variable not set!" >&2
echo " Please set WS_ROOT to VPP workspace root directory." >&2
@ -260,14 +260,14 @@ if [[ "$(grep bin_PROGRAMS $WS_ROOT/src/uri.am)" = "" ]] ; then
fi
if [ ! -d $vpp_dir ] ; then
echo "ERROR: Missing VPP$DEBUG bin directory!" >&2
echo "ERROR: Missing VPP$title_dbg bin directory!" >&2
echo " $vpp_dir" >&2
env_test_failed="true"
fi
if [[ $run_test =~ .*"_preload" ]] ; then
if [ ! -d $lib64_dir ] ; then
echo "ERROR: Missing VPP$DEBUG lib64 directory!" >&2
echo "ERROR: Missing VPP$title_dbg lib64 directory!" >&2
echo " $lib64_dir" >&2
elif [ ! -d $VCL_LDPRELOAD_LIB_DIR ] ; then
echo "ERROR: Missing VCL LD_PRELOAD Library directory!" >&2
@ -281,19 +281,19 @@ if [[ $run_test =~ .*"_preload" ]] ; then
fi
if [ ! -f $vpp_dir$vpp_app ] ; then
echo "ERROR: Missing VPP$DEBUG Application!" >&2
echo "ERROR: Missing VPP$title_dbg Application!" >&2
echo " $vpp_dir$vpp_app" >&2
env_test_failed="true"
fi
if [ ! -f $vpp_dir$sock_srvr_app ] && [ ! $iperf3 -eq 1 ] ; then
echo "ERROR: Missing$DEBUG Socket Server Application!" >&2
echo "ERROR: Missing$title_dbg Socket Server Application!" >&2
echo " $vpp_dir$sock_srvr_app" >&2
env_test_failed="true"
fi
if [ ! -f $vpp_dir$sock_clnt_app ] && [ ! $iperf3 -eq 1 ] ; then
echo "ERROR: Missing$DEBUG Socket Client Application!" >&2
echo "ERROR: Missing$title_dbg Socket Client Application!" >&2
echo " $vpp_dir$sock_clnt_app" >&2
env_test_failed="true"
fi
@ -361,6 +361,7 @@ else
clnt_app="$sock_clnt_app${sock_clnt_options} \$srvr_addr $sock_srvr_port"
fi
verify_no_vpp() {
local grep_for_vpp="ps -eaf|grep -v grep|grep \"bin/vpp\""