diff options
author | 2018-08-13 19:40:39 +0800 | |
---|---|---|
committer | 2018-08-13 19:49:49 +0800 | |
commit | 93969905e561d0924e162978f32c8831d5837818 (patch) | |
tree | ebad7dfdcd6347ed7f14a36cf602b8e26dc8205b /stacks/vpp | |
parent | bd6e75c243db1b384ba0882ecaf9063ec4cd70bd (diff) |
Feat: integrate vpp hoststack into dmm
Change-Id: Ibf47129a1a3eec0195a7bd8e5beb411285da739f
Signed-off-by: Qing Chang <qing.chang1@huawei.com>
Signed-off-by: Yalei Wang <william.wangyalei@huawei.com>
Signed-off-by: rainbow_0206 <jiangwenjiang@huawei.com>
Diffstat (limited to 'stacks/vpp')
-rw-r--r-- | stacks/vpp/adapt/dmm_vcl.h | 36 | ||||
-rw-r--r-- | stacks/vpp/adapt/dmm_vcl_adpt.c | 184 | ||||
-rw-r--r-- | stacks/vpp/configure/module_config.json | 30 | ||||
-rw-r--r-- | stacks/vpp/configure/rd_config.json | 26 | ||||
-rw-r--r-- | stacks/vpp/patch/0001-Fix-modify-makefile-to-adapt-dmm.patch | 72 |
5 files changed, 348 insertions, 0 deletions
diff --git a/stacks/vpp/adapt/dmm_vcl.h b/stacks/vpp/adapt/dmm_vcl.h new file mode 100644 index 0000000..f0d8c85 --- /dev/null +++ b/stacks/vpp/adapt/dmm_vcl.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 Huawei Technologies Co.,Ltd. + * 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_dmm_vcl_h +#define included_dmm_vcl_h + +#include "nstack_dmm_api.h" + +#define DMM_VCL_ENV_DEBUG "DMM_VCL_DEBUG" + +typedef struct dmm_vcl +{ + int epfd; + long unsigned int epoll_threadid; + nstack_event_cb regVal; + int (*p_epoll_create) (int size); + unsigned int (*p_epoll_ctl) (int epFD, int proFD, int ctl_ops, + struct epoll_event * events); + unsigned int (*p_epoll_wait) (int epfd, struct epoll_event * events, + int maxevents, int timeout); + int (*p_close) (int fd); +} dmm_vcl_t; + +#endif /* included_dmm_vcl_h */ diff --git a/stacks/vpp/adapt/dmm_vcl_adpt.c b/stacks/vpp/adapt/dmm_vcl_adpt.c new file mode 100644 index 0000000..ca737fa --- /dev/null +++ b/stacks/vpp/adapt/dmm_vcl_adpt.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2018 Huawei Technologies Co.,Ltd. + * 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 +#include <pthread.h> +#include <dlfcn.h> +#include <sys/epoll.h> +#include "dmm_vcl.h" +#include "nstack_dmm_api.h" // nstack_socket_ops* +#include <vppinfra/error.h> // clib_warning() + +#define DMM_VCL_ADPT_DEBUG dmm_vcl_debug +static unsigned int dmm_vcl_debug; +dmm_vcl_t g_dmm_vcl; + +unsigned int +vpphs_ep_ctl_ops (int epFD, int proFD, int ctl_ops, + struct epoll_event *events, void *pdata) +{ + struct epoll_event tmpEvt; + int ret = 0; + int dmm_epfd; + + tmpEvt.data.ptr = pdata; + tmpEvt.events = events->events; + + if (DMM_VCL_ADPT_DEBUG > 0) + clib_warning ("DMM VCL ADPT<%d>: epfd=%d,fd=%d,ops=%d, events=%u", + getpid (), epFD, proFD, ctl_ops, events->events); + + dmm_epfd = g_dmm_vcl.epfd; + switch (ctl_ops) + { + case nstack_ep_triggle_add: + ret = g_dmm_vcl.p_epoll_ctl (dmm_epfd, EPOLL_CTL_ADD, proFD, &tmpEvt); + break; + case nstack_ep_triggle_mod: + ret = g_dmm_vcl.p_epoll_ctl (dmm_epfd, EPOLL_CTL_MOD, proFD, &tmpEvt); + break; + case nstack_ep_triggle_del: + ret = g_dmm_vcl.p_epoll_ctl (dmm_epfd, EPOLL_CTL_DEL, proFD, &tmpEvt); + break; + default: + ret = -1; + break; + } + return ret; +} + +/*check whether some events exist really */ +unsigned int +vpphs_ep_getEvt (int epFD, int profd, unsigned int events) +{ +#if 0 + uint32_t revent = rr_rs_poll (proFD, epi->revents); + epi->revents = revent & epi->event.events; +#endif + return 0; +} + +#define DMM_VCL_MAX_EP_EVENT 1024 + +static void * +dmm_vcl_epoll_thread (void *arg) +{ + int num, i; + + struct epoll_event events[DMM_VCL_MAX_EP_EVENT]; + + while (1) + { + num = + g_dmm_vcl.p_epoll_wait (g_dmm_vcl.epfd, events, DMM_VCL_MAX_EP_EVENT, + 100); + + for (i = 0; i < num; ++i) + { + if (DMM_VCL_ADPT_DEBUG > 0) + clib_warning + ("DMM_VCL_ADPT<%d>: dmm_vcl_epoll i[%d] events=%u, epfd=%d, ptr=%d", + getpid (), i, events[i].events, events[i].data.fd, + events[i].data.ptr); + + g_dmm_vcl.regVal.event_cb (events[i].data.ptr, events[i].events); + + } + } + + return NULL; +} + +int +dmm_vpphs_init () +{ + char *env_var_str; + int rv = 0; + + env_var_str = getenv (DMM_VCL_ENV_DEBUG); + if (env_var_str) + { + u32 tmp; + if (sscanf (env_var_str, "%u", &tmp) != 1) + clib_warning + ("DMM_VCL_ADPT<%d>: WARNING: Invalid debug level specified " + "in the environment variable " DMM_VCL_ENV_DEBUG " (%s)!\n", + getpid (), env_var_str); + else + { + dmm_vcl_debug = tmp; + if (DMM_VCL_ADPT_DEBUG > 0) + clib_warning + ("DMM_VCL_ADPT<%d>: configured DMM VCL ADPT debug (%u) from " + "DMM_VCL_ENV_DEBUG ", getpid (), dmm_vcl_debug); + } + } + + g_dmm_vcl.epfd = g_dmm_vcl.p_epoll_create (1000); + if (g_dmm_vcl.epfd < 0) + return g_dmm_vcl.epfd; + + rv = + pthread_create (&g_dmm_vcl.epoll_threadid, NULL, dmm_vcl_epoll_thread, + NULL); + if (rv != 0) + { + clib_warning ("dmm vcl epoll thread create fail, errno:%d!", errno); + g_dmm_vcl.p_close (g_dmm_vcl.epfd); + g_dmm_vcl.epfd = -1; + return rv; + } + + rv = pthread_setname_np (g_dmm_vcl.epoll_threadid, "dmm_vcl_epoll"); + if (rv != 0) + { + clib_warning + ("pthread_setname_np failed for dmm_vcl_epoll, rv=%d, errno:%d", + rv, errno); + } + + return rv; +} + +int +vpphs_stack_register (nstack_proc_cb * ops, nstack_event_cb * val) +{ + +#undef NSTACK_MK_DECL +#define NSTACK_MK_DECL(ret, fn, args) \ + (ops->socket_ops).pf ## fn = (typeof(((nstack_socket_ops*)0)->pf ## fn))dlsym(val->handle, # fn); +#include "declare_syscalls.h" + (ops->socket_ops).pfepoll_create = NULL; + + g_dmm_vcl.p_epoll_ctl = dlsym (val->handle, "epoll_ctl"); + g_dmm_vcl.p_epoll_create = dlsym (val->handle, "epoll_create1"); + g_dmm_vcl.p_epoll_wait = dlsym (val->handle, "epoll_wait"); + g_dmm_vcl.p_close = dlsym (val->handle, "close"); + g_dmm_vcl.regVal = *val; + + ops->extern_ops.module_init = dmm_vpphs_init; + ops->extern_ops.fork_init_child = NULL; + ops->extern_ops.fork_parent_fd = NULL; + ops->extern_ops.fork_child_fd = NULL; + ops->extern_ops.fork_free_fd = NULL; + ops->extern_ops.ep_ctl = vpphs_ep_ctl_ops; + ops->extern_ops.ep_getevt = vpphs_ep_getEvt; + ops->extern_ops.ep_prewait_proc = NULL; + ops->extern_ops.stack_fd_check = NULL; + ops->extern_ops.stack_alloc_fd = NULL; + ops->extern_ops.peak = NULL; + + return 0; +} diff --git a/stacks/vpp/configure/module_config.json b/stacks/vpp/configure/module_config.json new file mode 100644 index 0000000..fa4d5ff --- /dev/null +++ b/stacks/vpp/configure/module_config.json @@ -0,0 +1,30 @@ +{ + "default_stack_name": "kernel", /*when rd can't be find maybe choose the defualt one*/ + "module_list": [ + { + "stack_name": "kernel", /*stack name*/ + "function_name": "kernel_stack_register", /*function name*/ + "libname": "./", /*library name, if loadtype is static, this maybe + null, else must give a library name*/ + "loadtype": "static", /*library load type: static or dynamic*/ + "deploytype": "1", /*deploy model type:model type1, model type2, + model type3. Indicating single or multi process + deployment. Used during shared memory initialization.*/ + "maxfd": "1024", /*the max fd supported*/ + "minfd": "0", /*the min fd supported*/ + "priorty": "1", /*priorty when executing, reserv*/ + "stackid": "0", /*stack id, this must be ordered and not be repeated*/ + }, + { + "stack_name": "stackx", + "function_name": "vpphs_stack_register", + "libname": "../lib64/libdmm_vcl.so", + "loadtype": "dynmic", + "deploytype": "1", + "maxfd": "1024", + "minfd": "0", + "priorty": "1", + "stackid": "1", + }, + ] +} diff --git a/stacks/vpp/configure/rd_config.json b/stacks/vpp/configure/rd_config.json new file mode 100644 index 0000000..ab57d25 --- /dev/null +++ b/stacks/vpp/configure/rd_config.json @@ -0,0 +1,26 @@ +{ + "ip_route": [ + { + "subnet": "192.168.122.1/24", + "type": "nstack-dpdk", + }, + { + "subnet": "10.145.240.1/24", + "type": "nstack-kernel", + }, + { + "subnet": "192.166.1.1/24", + "type": "nstack-kernel", + } + ], + "prot_route": [ + { + "proto_type": "1", + "type": "nstack-dpdk", + }, + { + "proto_type": "2", + "type": "nstack-kernel", + } + ], +} diff --git a/stacks/vpp/patch/0001-Fix-modify-makefile-to-adapt-dmm.patch b/stacks/vpp/patch/0001-Fix-modify-makefile-to-adapt-dmm.patch new file mode 100644 index 0000000..bb3eca7 --- /dev/null +++ b/stacks/vpp/patch/0001-Fix-modify-makefile-to-adapt-dmm.patch @@ -0,0 +1,72 @@ +From deb61897f0505a82bd26e7fa35b6923c1455732d Mon Sep 17 00:00:00 2001 +From: Jiang Wenjiang <jiangwenjiang@huawei.com> +Date: Thu, 9 Aug 2018 08:22:24 +0800 +Subject: [PATCH] Fix: modify makefile to adapt dmm + +--- + src/vcl.am | 17 +++++++++++++++-- + src/vcl/ldp.c | 2 +- + 2 files changed, 16 insertions(+), 3 deletions(-) + +diff --git a/src/vcl.am b/src/vcl.am +index 89e1841..b09cacb 100644 +--- a/src/vcl.am ++++ b/src/vcl.am +@@ -11,13 +11,18 @@ + # See the License for the specific language governing permissions and + # limitations under the License. + +-lib_LTLIBRARIES += libvppcom.la libvcl_ldpreload.la ++lib_LTLIBRARIES += libvppcom.la libvcl_ldpreload.la libdmm_vcl.la + + libvppcom_la_SOURCES = + libvcl_ldpreload_la_SOURCES = ++libdmm_vcl_la_SOURCES = + libvppcom_la_DEPENDENCIES = \ + libsvm.la \ + libvlibmemoryclient.la ++libdmm_vcl_la_DEPENDENCIES = \ ++ libsvm.la \ ++ libvlibmemoryclient.la \ ++ libvcl_ldpreload.la + + libvppcom_la_LIBADD = $(libvppcom_la_DEPENDENCIES) -lpthread -lrt -ldl + +@@ -40,12 +45,20 @@ libvcl_ldpreload_la_SOURCES += \ + vcl/ldp.c \ + $(libvppcom_la_SOURCES) + ++libdmm_vcl_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/../../../../release/include ++ ++libdmm_vcl_la_LIBADD = $(libdmm_vcl_la_DEPENDENCIES) -lpthread -lrt -ldl ++ ++libdmm_vcl_la_SOURCES += \ ++ vcl/dmm_vcl_adpt.c \ ++ $(libvcl_ldpreload_la_SOURCES) ++ + nobase_include_HEADERS += \ + vcl/ldp_socket_wrapper.h \ + vcl/ldp_glibc_socket.h \ + vcl/ldp.h + +-noinst_PROGRAMS += \ ++bin_PROGRAMS += \ + vcl_test_server \ + vcl_test_client \ + sock_test_server \ +diff --git a/src/vcl/ldp.c b/src/vcl/ldp.c +index d31cd2c..e386855 100644 +--- a/src/vcl/ldp.c ++++ b/src/vcl/ldp.c +@@ -1669,7 +1669,7 @@ send (int fd, const void *buf, size_t n, int flags) + getpid (), fd, fd, func_str, sid, sid, buf, n, flags); + + size = vppcom_session_sendto (sid, (void *) buf, n, flags, NULL); +- if (size != VPPCOM_OK) ++ if (size <= VPPCOM_OK) + { + errno = -size; + size = -1; +-- +1.8.3.1 + |