summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-12-06 11:12:29 +0800
committerQiuwen Lu <[email protected]>2016-12-06 11:12:29 +0800
commitad5279a1b6024e64545bf51200bd1e74c0907474 (patch)
treec601cabf5c7634bfdb96a399a45ef48a7c1f2c01
parent30f8b8f39815dcfbd50eb62d6f04df5eba909945 (diff)
许多改动,修正了很多问题。
-rw-r--r--CMakeLists.txt8
-rw-r--r--cmake/Version.cmake17
-rw-r--r--core/CMakeLists.txt7
-rw-r--r--core/include/mr_buffer.h5
-rw-r--r--core/src/buffer.c43
-rw-r--r--include/CMakeLists.txt5
-rw-r--r--include/external/marsio.h24
-rw-r--r--include/external/marsio_buffer_user_api.h (renamed from include/marsio_buffer_user_api.h)0
-rw-r--r--include/external/marsio_rawio_user_api.h27
-rw-r--r--include/external/marsio_udp_user_api.h34
-rw-r--r--include/internal/mr_common.h (renamed from include/mr_common.h)0
-rw-r--r--include/internal/mr_config.h.in (renamed from include/mr_config.h.in)0
-rw-r--r--include/internal/mr_mask.h (renamed from include/mr_mask.h)0
-rw-r--r--include/internal/mr_version.h.in (renamed from include/mr_version.h.in)0
-rw-r--r--include/mr_rawio.h34
-rw-r--r--pag/CMakeLists.txt4
-rw-r--r--pag/libpag.c127
-rw-r--r--runtime/src/app.c15
-rw-r--r--service/CMakeLists.txt5
-rw-r--r--service/include/sc_common.h8
-rw-r--r--service/src/config.c17
-rw-r--r--service/src/register.c31
-rw-r--r--slave/CMakeLists.txt15
-rw-r--r--slave/include/mrlib.h2
-rw-r--r--slave/include/mrlib_common.h2
-rw-r--r--slave/src/marsio.c61
-rw-r--r--slave/src/rawio.c298
-rw-r--r--slave/src/version.map46
-rw-r--r--stack/CMakeLists.txt9
-rw-r--r--stack/include/sk_stack.h5
-rw-r--r--stack/include/sk_udp.h20
-rw-r--r--stack/src/device.c1
-rw-r--r--stack/src/interface.c2
-rw-r--r--stack/src/ucb.c3
-rw-r--r--stack/src/udp.c23
-rw-r--r--tools/CMakeLists.txt15
-rw-r--r--tools/stat/dev_stat.c8
37 files changed, 558 insertions, 363 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ff4d660..7c37436 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -19,7 +19,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
# set(CMAKE_INSTALL_PREFIX /opt/iiesoft/marsio)
add_definitions(-fPIC -Wall)
add_definitions(-D_GNU_SOURCE -D__STDC_LIMIT_MACROS)
-include_directories(include)
+
+include_directories(include/external)
+include_directories(include/internal)
# Install Dirs
set(MR_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
@@ -42,8 +44,8 @@ add_subdirectory(${CMAKE_SOURCE_DIR}/service)
add_subdirectory(${CMAKE_SOURCE_DIR}/slave)
add_subdirectory(${CMAKE_SOURCE_DIR}/pag)
#add_subdirectory(${CMAKE_SOURCE_DIR}/examples)
-add_subdirectory(${CMAKE_SOURCE_DIR}/tools)
-add_subdirectory(${CMAKE_SOURCE_DIR}/test)
+#add_subdirectory(${CMAKE_SOURCE_DIR}/tools)
+#add_subdirectory(${CMAKE_SOURCE_DIR}/test)
add_subdirectory(${CMAKE_SOURCE_DIR}/conf)
if(BUILD_TESTS)
diff --git a/cmake/Version.cmake b/cmake/Version.cmake
index 895fdb6..cf4452d 100644
--- a/cmake/Version.cmake
+++ b/cmake/Version.cmake
@@ -5,8 +5,8 @@ set(__SOURCE_AUTORESIVISION ${CMAKE_SOURCE_DIR}/autorevision.sh)
set(__AUTORESIVISION ${CMAKE_BINARY_DIR}/autorevision.sh)
set(__VERSION_CACHE ${CMAKE_SOURCE_DIR}/version.txt)
set(__VERSION_CONFIG ${CMAKE_BINARY_DIR}/version.cmake)
-set(__VERSION_CONFIG_C_IN ${CMAKE_SOURCE_DIR}/include/mr_version.h.in)
-set(__VERSION_CONFIG_C_OUT ${CMAKE_BINARY_DIR}/include/mr_version.h)
+set(__VERSION_CONFIG_C_IN ${CMAKE_SOURCE_DIR}/include/internal/mr_version.h.in)
+set(__VERSION_CONFIG_C_OUT ${CMAKE_BINARY_DIR}/include/internal/mr_version.h)
file(COPY ${__SOURCE_AUTORESIVISION} DESTINATION ${CMAKE_BINARY_DIR}
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE
@@ -25,6 +25,19 @@ add_definitions(-include ${__VERSION_CONFIG_C_OUT})
string(REGEX REPLACE "^v([0-9]+)\\..*" "\\1" MARSIO_VERSION_MAJOR "${VCS_TAG}")
string(REGEX REPLACE "^v[0-9]+\\.([0-9]+).*" "\\1" MARSIO_VERSION_MINOR "${VCS_TAG}")
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" MARSIO_VERSION_PATCH "${VCS_TAG}")
+
+if(NOT MARSIO_VERSION_MAJOR)
+ set(MARSIO_VERSION_MAJOR 4)
+endif()
+
+if(NOT MARSIO_VERSION_MINOR)
+ set(MARSIO_VERSION_MINOR 0)
+endif()
+
+if(NOT MARSIO_VERSION_PATCH)
+ set(MARSIO_VERSION_PATCH 0)
+endif()
+
set(MARSIO_VERSION "${MARSIO_VERSION_MAJOR}.${MARSIO_VERSION_MINOR}.${MARSIO_VERSION_PATCH}")
set(MARSIO_VERSION_BUILD "${VCS_SHORT_HASH}")
diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt
index 249f3bb..6c099bd 100644
--- a/core/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -1,12 +1,9 @@
find_package(DPDK REQUIRED)
-include_directories(${CMAKE_SOURCE_DIR}/include)
-include_directories(${CMAKE_SOURCE_DIR}/include/extern)
-include_directories(${CMAKE_SOURCE_DIR}/include/internal)
include_directories(${DPDK_INCLUDE_DIR})
-
add_definitions(${DPDK_C_PREDEFINED})
+
include_directories(include)
add_library(core src/core.c src/buffer.c src/device.c src/vnode.c src/stat.c src/rtdev.c)
-target_link_libraries(core MESA_prof_load_static mruntime)
+target_link_libraries(core mruntime)
target_link_libraries(core rt pthread dl)
target_include_directories(core INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
diff --git a/core/include/mr_buffer.h b/core/include/mr_buffer.h
index 0747bc3..3e136cc 100644
--- a/core/include/mr_buffer.h
+++ b/core/include/mr_buffer.h
@@ -8,6 +8,7 @@ extern "C" {
#include <rte_mempool.h>
#include <rte_mbuf.h>
#include <mr_core.h>
+#include <mr_common.h>
#ifndef MRB_MAX_CTRLZONE_NUM
#define MRB_MAX_CTRLZONE_NUM 16
@@ -26,6 +27,10 @@ struct mrb_pool_t * MRB_pool_handle_create();
int mr_buffer_user_pool_produce(struct mr_core_instance* instance, unsigned int socket_id, unsigned int data_size,
unsigned int pool_size, unsigned int cache_size);
+struct rte_mempool * mr_buffer_user_direct_pool_get(struct mr_core_instance* instance, socket_id_t socket);
+
+struct rte_mempool * mr_buffer_user_indirect_pool_get(struct mr_core_instance* instance, socket_id_t socket);
+
int mr_buffer_pool_produce(struct mr_core_instance* instance, unsigned int socket_id, unsigned int data_size,
unsigned int pool_size, unsigned int cache_size);
diff --git a/core/src/buffer.c b/core/src/buffer.c
index 2caebc1..3038e6c 100644
--- a/core/src/buffer.c
+++ b/core/src/buffer.c
@@ -43,7 +43,7 @@ struct mrb_zone_info_t
struct whole_mrb_pool_t
{
struct mrb_pool_t external; //"external" must be the first member of this struct
- struct rte_mempool * user_pkt_pool;
+ struct rte_mempool * user_direct_pool;
struct rte_mempool * user_indirect_pool;
unsigned int total_ctrl_zone_size;
@@ -64,6 +64,8 @@ static void set_element_ctrlzone(__attribute__((unused))struct rte_mempool *mp,
struct mrb_priv_zone_t* private = mrbuf_priv(obj);
private->cz_num = _handle->ctrlzone_num;
private->next = NULL;
+
+ assert(mp->private_data_size >= sizeof(struct mrb_zone_idx_t)*_handle->ctrlzone_num);
memcpy(private->idx, _handle->ctrlzone, sizeof(struct mrb_zone_idx_t)*_handle->ctrlzone_num);
return;
}
@@ -78,6 +80,18 @@ struct mrb_pool_t * MRB_pool_handle_create()
return (struct mrb_pool_t *)handle;
}
+struct rte_mempool * mr_buffer_user_direct_pool_get(struct mr_core_instance* instance, socket_id_t socket)
+{
+ struct whole_mrb_pool_t *_handle = (struct whole_mrb_pool_t *)instance->mrb_pool_handle;
+ return _handle->user_direct_pool;
+}
+
+struct rte_mempool * mr_buffer_user_indirect_pool_get(struct mr_core_instance* instance, socket_id_t socket)
+{
+ struct whole_mrb_pool_t *_handle = (struct whole_mrb_pool_t *)instance->mrb_pool_handle;
+ return _handle->user_indirect_pool;
+}
+
int mr_buffer_user_pool_produce(struct mr_core_instance* instance, unsigned int socket_id, unsigned int data_size,
unsigned int pool_size, unsigned int cache_size)
{
@@ -87,17 +101,17 @@ int mr_buffer_user_pool_produce(struct mr_core_instance* instance, unsigned int
unsigned int priv_size = RTE_ALIGN(_handle->total_ctrl_zone_size, RTE_MBUF_PRIV_ALIGN);
- if (_handle->user_pkt_pool == NULL)
+ if (_handle->user_direct_pool == NULL)
{
snprintf(str_pool_sym, sizeof(str_pool_sym), "mrb_usr_pkt_pool_%d", socket_id);
- _handle->user_pkt_pool = rte_pktmbuf_pool_create(str_pool_sym, pool_size, cache_size,
+ _handle->user_direct_pool = rte_pktmbuf_pool_create(str_pool_sym, pool_size, cache_size,
priv_size, data_size, socket_id);
}
- if (_handle->user_pkt_pool == NULL)
+ if (_handle->user_direct_pool == NULL)
{
MR_LOG(WARNING, BASE, "Creating user direct pktmbuf pool(symbol=%s, size=%d, cache=%d, "
- "ctrlzone=%d, datasize=%d) : failed - %s)", str_pool_sym, pool_size, cache_size,
+ "ctrlzone=%d, datasize=%d) : failed - %s)\n", str_pool_sym, pool_size, cache_size,
priv_size, data_size, __str_errno());
ret = -1; goto errout;
@@ -105,21 +119,21 @@ int mr_buffer_user_pool_produce(struct mr_core_instance* instance, unsigned int
if (_handle->user_indirect_pool == NULL)
{
- snprintf(str_pool_sym, sizeof(str_pool_sym), "mrb_usr_indirect_pool");
- _handle->user_pkt_pool = rte_pktmbuf_pool_create(str_pool_sym, pool_size, cache_size,
- priv_size, data_size, socket_id);
+ snprintf(str_pool_sym, sizeof(str_pool_sym), "mrb_usr_indirect_pool_%d", socket_id);
+ _handle->user_indirect_pool = rte_pktmbuf_pool_create(str_pool_sym, pool_size, cache_size,
+ priv_size, 0, socket_id);
}
if (_handle->user_indirect_pool == NULL)
{
- MR_LOG(WARNING, BASE, "Creating user indrect pktmbuf pool(symbol=%s, size=%d, cache=%d, "
- "ctrlzone=%d, datasize=%d) : failed - %s)", str_pool_sym, pool_size, cache_size,
- priv_size, data_size, __str_errno());
+ MR_LOG(WARNING, BASE, "Creating user indirect pktmbuf pool(symbol=%s, size=%d, cache=%d, "
+ "ctrlzone=%d, datasize=%d) : failed - %s)\n", str_pool_sym, pool_size, cache_size,
+ priv_size, 0, __str_errno());
ret = -2; goto errout;
}
- ret = rte_mempool_obj_iter(_handle->user_pkt_pool, set_element_ctrlzone, _handle);
+ ret = rte_mempool_obj_iter(_handle->user_direct_pool, set_element_ctrlzone, _handle);
assert(ret == pool_size);
ret = rte_mempool_obj_iter(_handle->user_indirect_pool, set_element_ctrlzone, _handle);
@@ -128,7 +142,7 @@ int mr_buffer_user_pool_produce(struct mr_core_instance* instance, unsigned int
return 0;
errout:
- if (_handle->user_pkt_pool != NULL) rte_mempool_free(_handle->user_pkt_pool);
+ if (_handle->user_direct_pool != NULL) rte_mempool_free(_handle->user_direct_pool);
if (_handle->user_indirect_pool != NULL) rte_mempool_free(_handle->user_indirect_pool);
return ret;
}
@@ -289,7 +303,7 @@ int marsio_buff_malloc(marsio_buff_t *marsio_buff[], unsigned int nb_buff,
for (int i = 0; i < nb_buff; i++)
{
- marsio_buff[i] = rte_pktmbuf_alloc(_handle->user_pkt_pool);
+ marsio_buff[i] = rte_pktmbuf_alloc(_handle->user_direct_pool);
if (marsio_buff[i] == NULL) return i;
}
@@ -316,6 +330,7 @@ void marsio_buff_append_pkt(marsio_buff_t *head, marsio_buff_t *next)
}
mrbuf_priv(p)->next = next;
}
+
void marsio_buff_append_seg(marsio_buff_t *head, marsio_buff_t *next)
{
rte_pktmbuf_chain((struct rte_mbuf *)head, (struct rte_mbuf *)next);
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index 9271b1b..84626d0 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -1,2 +1,3 @@
-#install(FILES extern/mr_rawio.h DESTINATION include COMPONENT Program)
-#install(FILES extern/mr_buf.h DESTINATION include COMPONENT Program) \ No newline at end of file
+install(FILES external/marsio.h DESTINATION include COMPONENT Program)
+install(FILES external/marsio_buffer_user_api.h DESTINATION include COMPONENT Program)
+install(FILES external/marsio_rawio_user_api.h DESTINATION include COMPONENT Program) \ No newline at end of file
diff --git a/include/external/marsio.h b/include/external/marsio.h
new file mode 100644
index 0000000..7b1ed8a
--- /dev/null
+++ b/include/external/marsio.h
@@ -0,0 +1,24 @@
+/*
+ * \brief MARSIO Userspace ZeroCopy Driver Version 4
+ *
+ * This is the user api header file of MARSIOv4 ZeroCopy Driver
+ *
+ * \author Qiuwen Lu<[email protected]>
+ * Institute of Information Engineering, Chinese Academy of Sciences
+ *
+ * \date 2016-12-01
+ */
+
+#pragma once
+
+#include "marsio_buffer_user_api.h"
+#include "marsio_rawio_user_api.h"
+
+void marsio_on_exit_register(void(*exit_fn)(void * arg), void * arg);
+
+int marsio_init(const char * appsym, uint64_t coremask,
+ unsigned autoexit, FILE * logstream);
+
+int marsio_thread_init();
+
+int marsio_destory(); \ No newline at end of file
diff --git a/include/marsio_buffer_user_api.h b/include/external/marsio_buffer_user_api.h
index 1aabae1..1aabae1 100644
--- a/include/marsio_buffer_user_api.h
+++ b/include/external/marsio_buffer_user_api.h
diff --git a/include/external/marsio_rawio_user_api.h b/include/external/marsio_rawio_user_api.h
new file mode 100644
index 0000000..865c2b2
--- /dev/null
+++ b/include/external/marsio_rawio_user_api.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "marsio_buffer_user_api.h"
+
+typedef void * raw_socket_t;
+typedef uint32_t thread_id_t;
+
+/* Basic Raw Packet I/O Interface */
+int marsio_raw_close(raw_socket_t * socket);
+
+raw_socket_t * marsio_raw_socket(const char * devsym, unsigned int nr_rx_stream,
+ unsigned int nr_tx_stream, unsigned int flags);
+
+int marsio_raw_recv_burst(raw_socket_t * socket, thread_id_t sid,
+ marsio_buff_t * mbufs[], int nr_max_mbufs);
+
+int marsio_raw_send_burst(raw_socket_t * socket, thread_id_t sid,
+ marsio_buff_t * mbufs[], int nr_mbufs);
+
+
+#ifdef __cplusplus
+}
+#endif \ No newline at end of file
diff --git a/include/external/marsio_udp_user_api.h b/include/external/marsio_udp_user_api.h
new file mode 100644
index 0000000..1c564f6
--- /dev/null
+++ b/include/external/marsio_udp_user_api.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <sys/socket.h>
+#include <errno.h>
+#include <rte_common.h>
+#include <unistd.h>
+
+int marsio_socket(int family, int type, int protocol);
+
+int marsio_connect(int fd, const struct sockaddr * addr, socklen_t addrlen);
+
+int marsio_bind(int fd, const struct sockaddr * addr, socklen_t addrlen);
+
+/* UDP���Ļ�������ͬһ�����ϵĻ�������ʾͬһ��UDP���� */
+/* ����MARSIO-3�汾���¹��ܲ�Ҫʹ�� */
+struct marsio_udp_buff
+{
+ /* ��������ʼ��ַ */
+ void * start;
+ /* ���������� */
+ unsigned int len;
+ /* ��һ�黺������ַ */
+ struct marsio_udp_buff * next;
+ /* ��һ������ʼ��ַ */
+ struct marsio_udp_buff * next_pkt;
+};
+
+struct marsio_udp_buff * marsio_udp_alloc() __attribute__((__deprecated__));
+
+void marsio_udp_free(struct marsio_udp_buff * udp_buff) __attribute__((__deprecated__));
+
+ssize_t marsio_udp_sendto_chain(int marsio_fd, struct marsio_udp_buff * chain_head,
+ int nb_buff, int flags, struct sockaddr * to[], socklen_t addrlen[], int nb_sockaddrs)
+ __attribute__((__deprecated__)); \ No newline at end of file
diff --git a/include/mr_common.h b/include/internal/mr_common.h
index 3911a26..3911a26 100644
--- a/include/mr_common.h
+++ b/include/internal/mr_common.h
diff --git a/include/mr_config.h.in b/include/internal/mr_config.h.in
index 009cf7b..009cf7b 100644
--- a/include/mr_config.h.in
+++ b/include/internal/mr_config.h.in
diff --git a/include/mr_mask.h b/include/internal/mr_mask.h
index f3b85ec..f3b85ec 100644
--- a/include/mr_mask.h
+++ b/include/internal/mr_mask.h
diff --git a/include/mr_version.h.in b/include/internal/mr_version.h.in
index f721e88..f721e88 100644
--- a/include/mr_version.h.in
+++ b/include/internal/mr_version.h.in
diff --git a/include/mr_rawio.h b/include/mr_rawio.h
deleted file mode 100644
index 27ebaad..0000000
--- a/include/mr_rawio.h
+++ /dev/null
@@ -1,34 +0,0 @@
-
-/* Packet I/O Middleware for START/SAPP/PAPP
- * Autuor : Lu Qiuwen
- * Date : 2014-03-04
- */
-
-
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <rte_mbuf.h>
-
-/* Basic Raw Packet I/O Interface */
-typedef void * raw_socket_t;
-typedef uint32_t thread_id_t;
-
-int marsio_raw_close(raw_socket_t * socket);
-
-raw_socket_t * marsio_raw_socket(const char * devsym, unsigned int nr_rx_stream,
- unsigned int nr_tx_stream, unsigned int flags __rte_unused);
-
-int marsio_raw_recv(raw_socket_t * socket, thread_id_t sid,
- struct rte_mbuf * mbufs[], int nr_max_mbufs);
-
-int marsio_raw_send(raw_socket_t * socket, thread_id_t sid,
- struct rte_mbuf * mbufs[], int nr_mbufs);
-
-
-#ifdef __cplusplus
-}
-#endif \ No newline at end of file
diff --git a/pag/CMakeLists.txt b/pag/CMakeLists.txt
index 5911903..46e1bc8 100644
--- a/pag/CMakeLists.txt
+++ b/pag/CMakeLists.txt
@@ -6,8 +6,8 @@ include_directories(${DPDK_INCLUDE_DIR})
add_definitions(${DPDK_C_PREDEFINED})
add_library(pag SHARED libpag.c)
-target_link_libraries(pag MESA_prof_load_static marsio core)
-target_link_libraries(pag rt pthread dl core)
+target_link_libraries(pag MESA_prof_load_static marsio)
+target_link_libraries(pag rt pthread dl)
set_target_properties(pag PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/version.map")
target_include_directories(pag INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
diff --git a/pag/libpag.c b/pag/libpag.c
index 0a13912..d660c0c 100644
--- a/pag/libpag.c
+++ b/pag/libpag.c
@@ -4,24 +4,30 @@
* Date : 2016-09-12
*/
+#include <stdio.h>
#include <unistd.h>
+#include <stdlib.h>
#include <assert.h>
#include <netinet/in.h>
-#include <rte_string_fns.h>
-#include <rte_ether.h>
#include <MESA_prof_load.h>
+
+#include <rte_ether.h>
#include <mr_common.h>
-#include <mr_rawio.h>
-#include <mr_stat.h>
-#include <mrlib.h>
-#include <mr_mask.h>
+#include <marsio.h>
+
#include "libpag.h"
+#define PAG_SYMBOL_MAX 64
+#define PAG_STRING_MAX 1024
+#define PAG_BURST_MAX 64
+#define PAG_DEVICE_MAX 16
+#define PAG_CPU_ID_MAX 64
+
struct pag_instance
{
- char app_name[MR_SYMBOL_MAX];
- char dev_name[MR_STRING_MAX];
- raw_socket_t * raw_sockets[MR_DEVICE_MAX];
+ char app_name[PAG_SYMBOL_MAX];
+ char dev_name[PAG_STRING_MAX];
+ raw_socket_t * raw_sockets[PAG_DEVICE_MAX];
unsigned int nr_raw_sockets;
unsigned int nr_rx_stream;
unsigned int nr_tx_stream;
@@ -34,8 +40,8 @@ struct pag_instance
struct pag_thread_instance
{
int thread_inited;
- struct rte_mbuf * rxmbuf[MR_BURST_MAX];
- struct rte_mbuf * txmbuf[MR_BURST_MAX];
+ marsio_buff_t * rxmbuf[PAG_BURST_MAX];
+ marsio_buff_t * txmbuf[PAG_BURST_MAX];
unsigned int rxmbuf_max;
unsigned int txmbuf_max;
unsigned int rxmbuf_used;
@@ -45,7 +51,7 @@ struct pag_thread_instance
unsigned int cur_socket;
// ���������
- struct rte_mbuf * rxmbuf_ctx;
+ marsio_buff_t * rxmbuf_ctx;
};
static int __pag_inited = 0;
@@ -63,6 +69,33 @@ do { \
#define PAG_DEFAULT_TX_BURST 32
#define PAG_DEFAULT_AUTOEXIT 0
+int __strsplit(char *string, int stringlen, char **tokens, int maxtokens, char delim)
+{
+ int i, tok = 0;
+ int tokstart = 1; /* first token is right at start of string */
+
+ if (string == NULL || tokens == NULL)
+ goto einval_error;
+
+ for (i = 0; i < stringlen; i++) {
+ if (string[i] == '\0' || tok >= maxtokens)
+ break;
+ if (tokstart) {
+ tokstart = 0;
+ tokens[tok++] = &string[i];
+ }
+ if (string[i] == delim) {
+ string[i] = '\0';
+ tokstart = 1;
+ }
+ }
+ return tok;
+
+einval_error:
+ errno = EINVAL;
+ return -1;
+}
+
static int pag_config_load_app_info(struct pag_instance * instance)
{
int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "app_name",
@@ -79,31 +112,28 @@ static int pag_config_load_app_info(struct pag_instance * instance)
static int pag_config_load_stream_info(struct pag_instance * instance)
{
- uint64_t coremask = 0;
- char * str_coremask_ptr = NULL;
- char str_coremask[MR_STRING_MAX];
-
- // ��CPU��������
- int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "coremask",
- str_coremask, sizeof(str_coremask));
-
- if(ret < 0)
+ unsigned int cpu_id_range[PAG_CPU_ID_MAX] = { 0 };
+
+ // ��CPU�����
+ int cpu_id_count = MESA_load_profile_uint_range(PAG_CFGFILE, "pag", "cpu_id",
+ PAG_CPU_ID_MAX, cpu_id_range);
+
+ if (cpu_id_count < 0)
{
- PAG_LOG("coremask is missing, please recheck %s", PAG_CFGFILE);
+ PAG_LOG("cpu_id is missing, please recheck %s", PAG_CFGFILE);
return -1;
}
-
- coremask = strtoull(str_coremask, &str_coremask_ptr, 0);
- if(coremask == 0 && str_coremask_ptr == NULL)
+
+ uint64_t coremask = 0;
+ for(int i = 0; i < cpu_id_count; i++)
{
- PAG_LOG("coremask is invalid, please recheck %s", PAG_CFGFILE);
- return -2;
+ coremask |= 1ULL << cpu_id_range[i];
}
-
+
// ��Ĭ���豸������û��ָ��ʹ���߳���
unsigned int nr_rx_stream;
unsigned int nr_tx_stream;
- unsigned int nr_stream_default = mask_popcnt(coremask);
+ unsigned int nr_stream_default = cpu_id_count;
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "rxstream",
&nr_rx_stream, nr_stream_default);
@@ -117,8 +147,8 @@ static int pag_config_load_stream_info(struct pag_instance * instance)
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "autoexit",
&instance->autoexit, PAG_DEFAULT_AUTOEXIT);
- PAG_LOG("coremask=%"PRIx64", rxstream=%u, txstream=%u, autoexit=%d",
- instance->coremask, instance->nr_rx_stream, instance->nr_tx_stream,
+ PAG_LOG("coremask=%"PRIx64", rxstream=%u, txstream=%u, autoexit=%d",
+ instance->coremask, instance->nr_rx_stream, instance->nr_tx_stream,
instance->autoexit);
return 0;
@@ -131,17 +161,17 @@ static int pag_config_load_burst_info(struct pag_instance * instance)
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "burst_tx", &instance->burst_tx,
PAG_DEFAULT_TX_BURST);
- if(instance->burst_rx > MR_BURST_MAX)
+ if(instance->burst_rx > PAG_BURST_MAX)
{
PAG_LOG("burst_rx=%d is larger than limit(limit=%d), please recheck %s",
- instance->burst_rx, MR_BURST_MAX, PAG_CFGFILE);
+ instance->burst_rx, PAG_BURST_MAX, PAG_CFGFILE);
return -1;
}
- if(instance->burst_tx > MR_BURST_MAX)
+ if(instance->burst_tx > PAG_BURST_MAX)
{
PAG_LOG("burst_tx=%d is larger than limit(limit=%d), please recheck %s",
- instance->burst_tx, MR_BURST_MAX, PAG_CFGFILE);
+ instance->burst_tx, PAG_BURST_MAX, PAG_CFGFILE);
return -2;
}
@@ -160,11 +190,11 @@ static int __open_all_device(struct pag_instance * instance)
return -1;
}
- char * str_devices[MR_DEVICE_MAX];
+ char * str_devices[PAG_DEVICE_MAX];
int nr_devices;
- nr_devices = rte_strsplit(instance->dev_name, sizeof(instance->dev_name),
- str_devices, MR_DEVICE_MAX, ',');
+ nr_devices = __strsplit(instance->dev_name, sizeof(instance->dev_name),
+ str_devices, PAG_DEVICE_MAX, ',');
if (nr_devices <= 0)
{
@@ -258,7 +288,7 @@ int pag_open()
}
if (instance->autoexit)
- mr_on_exit_register(__on_exit_pag_close, NULL);
+ marsio_on_exit_register(__on_exit_pag_close, NULL);
__pag_inited = 1;
return 0;
@@ -266,10 +296,7 @@ int pag_open()
static void inline __free_frames(struct pag_thread_instance * tinstance)
{
- for (int i = 0; i < tinstance->rxmbuf_used; i++)
- {
- rte_pktmbuf_free(tinstance->rxmbuf[i]);
- }
+ marsio_buff_free(tinstance->rxmbuf, tinstance->rxmbuf_used);
return;
}
@@ -282,18 +309,13 @@ static int inline __get_frames_from_rtdevice(struct pag_instance * instance,
// һ����rxmbuf_max����������һ��������
unsigned int cur_socket = tinstance->cur_socket;
- int ret = marsio_raw_recv(instance->raw_sockets[cur_socket], sid,
+ int ret = marsio_raw_recv_burst(instance->raw_sockets[cur_socket], sid,
tinstance->rxmbuf, tinstance->rxmbuf_max);
// ���û��������л��ձ��豸
tinstance->cur_socket = (cur_socket + 1) % instance->nr_raw_sockets;
tinstance->rxmbuf_cur = 0;
tinstance->rxmbuf_used = ret;
-
-#ifndef NDEBUG
- for (int i = 0; i < tinstance->rxmbuf_used; i++)
- rte_mbuf_sanity_check(tinstance->rxmbuf[i], 1);
-#endif
assert(tinstance->rxmbuf_used <= tinstance->rxmbuf_max);
return ret;
@@ -304,8 +326,6 @@ void * pag_get_frame(int sid)
struct pag_thread_instance * tinstance = &thread_instance_;
struct pag_instance * instance = &pag_config_;
pag_thread_init(instance, tinstance);
-
- PERF_BEGIN(pag_get_frame);
// �����������ݰ������꣬���ͷţ�Ȼ���ٴ�����ȡ
if (unlikely((tinstance->rxmbuf_cur >= tinstance->rxmbuf_used)))
@@ -319,15 +339,14 @@ void * pag_get_frame(int sid)
return NULL;
tinstance->rxmbuf_ctx = tinstance->rxmbuf[tinstance->rxmbuf_cur++];
- PERF_END(pag_get_frame);
- return rte_pktmbuf_mtod(tinstance->rxmbuf_ctx, void *);
+ return (void *)marsio_buff_mtod(tinstance->rxmbuf_ctx);
}
int pag_get_frame_length(int sid)
{
struct pag_thread_instance * tinstance = &thread_instance_;
if (unlikely(tinstance->rxmbuf_ctx == NULL)) return 0;
- return rte_pktmbuf_pkt_len(tinstance->rxmbuf_ctx);
+ return marsio_buff_datalen(tinstance->rxmbuf_ctx);
}
void * pag_get_frame_with_len(int sid, unsigned int * len)
diff --git a/runtime/src/app.c b/runtime/src/app.c
index 84570b4..e598966 100644
--- a/runtime/src/app.c
+++ b/runtime/src/app.c
@@ -336,14 +336,12 @@ int __thread_register_unsafe(struct appinfo * pinfo, thread_id_t suppose_sid)
// 没有注册过,注册一个新的线程
if (tinfo != NULL)
{
- MR_LOG(INFO, BASE, "AppInfo, ThreadRegister"
- "Thread %d in Process %s existed, recover it.\n",
+ MR_LOG(INFO, BASE, "Thread %d in Application %s existed, recoverd.\n",
suppose_sid, pinfo->symbol);
}
else
{
- MR_LOG(INFO, BASE, "AppInfo, ThreadRegister, "
- "Thread %d in Process %s, create new thread.\n",
+ MR_LOG(INFO, BASE, "Thread %d in Application %s registed as a new thread. \n",
suppose_sid, pinfo->symbol);
tinfo = __thread_new_unsafe(pinfo);
}
@@ -351,8 +349,7 @@ int __thread_register_unsafe(struct appinfo * pinfo, thread_id_t suppose_sid)
// 检测tinfo是否为空,此时为空就是异常情况了
if(unlikely(tinfo == NULL))
{
- MR_LOG(WARNING, BASE, "AppInfo, ThreadRegister, "
- "Thread %d in Process %s Info Structure is NULL, failed.\n",
+ MR_LOG(WARNING, BASE, "Thread %d in Application %s Info Structure is NULL, failed.\n",
suppose_sid, pinfo->symbol);
return -1;
}
@@ -363,14 +360,12 @@ int __thread_register_unsafe(struct appinfo * pinfo, thread_id_t suppose_sid)
if(__thread_set_affinity(pinfo, tinfo) < 0)
{
- MR_LOG(WARNING, BASE, "AppInfo, ThreadRegister, "
- "Thread %d in Process %s, SetThreadAffinity failed.\n",
+ MR_LOG(WARNING, BASE, "Thread %d in Application %s, SetThreadAffinity failed.\n",
tinfo->sid, pinfo->symbol);
return -2;
}
- MR_LOG(DEBUG, BASE, "AppInfo, ThreadRegister, "
- "ThreadID=%d, GThreadID=%d, App=%s, thread registered. \n",
+ MR_LOG(DEBUG, BASE, "Thread Registered (ThreadID=%d, GThreadID=%d, App=%s). \n",
tinfo->sid, tinfo->gsid, pinfo->symbol);
return 0;
diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt
index b71dd11..dafd1da 100644
--- a/service/CMakeLists.txt
+++ b/service/CMakeLists.txt
@@ -1,14 +1,11 @@
find_package(DPDK REQUIRED)
-include_directories(${CMAKE_SOURCE_DIR}/include)
-include_directories(${CMAKE_SOURCE_DIR}/include/extern)
-include_directories(${CMAKE_SOURCE_DIR}/include/internal)
include_directories(${DPDK_INCLUDE_DIR})
include_directories(include)
add_definitions(${DPDK_C_PREDEFINED})
add_executable(zcpd src/cJSON.c src/core.c src/config.c src/register.c src/rxtx.c src/ldbc.c src/monit.c)
-target_link_libraries(zcpd ${DPDK_LIBRARY} MESA_prof_load_static)
+target_link_libraries(zcpd MESA_prof_load_static ${DPDK_LIBRARY})
target_link_libraries(zcpd rt pthread dl core stack)
target_include_directories(zcpd INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
diff --git a/service/include/sc_common.h b/service/include/sc_common.h
index 84963c7..d2254f3 100644
--- a/service/include/sc_common.h
+++ b/service/include/sc_common.h
@@ -71,6 +71,14 @@ struct sc_param
unsigned int sz_buffer;
/* �������Ĵ������� */
unsigned int sz_burst;
+ /* �û����ijش�С */
+ unsigned int nr_user_direct_pktmbuf;
+ /* �û����ijش�С */
+ unsigned int nr_user_indirect_pktmbuf;
+ /* �û����ij�Cache��С */
+ unsigned int sz_user_pktmbuf_cache;
+ /* �û����ij����ݴ�С */
+ unsigned int sz_user_pktmbuf;
/* ���طֵ���ʽ */
unsigned int distmode;
/* Ӳ��RSS��ʽ */
diff --git a/service/src/config.c b/service/src/config.c
index 2324f46..6ae17fe 100644
--- a/service/src/config.c
+++ b/service/src/config.c
@@ -185,6 +185,21 @@ static int sc_config_stack_info(const char * cfg, struct sc_instance * instance)
return 0;
}
+static int sc_config_user_pool_info(const char * cfg, struct sc_instance * instance)
+{
+ MESA_load_profile_uint_def(cfg, "userpool", "nr_direct_pktmbuf",
+ &instance->sc_param.nr_user_direct_pktmbuf, MR_DEVICE_DEFAULT_NR_PKTMBUF);
+ MESA_load_profile_uint_def(cfg, "userpool", "nr_indirect_pktmbuf",
+ &instance->sc_param.nr_user_indirect_pktmbuf, MR_DEVICE_DEFAULT_NR_PKTMBUF);
+ MESA_load_profile_uint_def(cfg, "userpool", "sz_pktmbuf",
+ &instance->sc_param.sz_user_pktmbuf, MR_DEVICE_DEFAULT_SZ_PKTMBUF);
+ MESA_load_profile_uint_def(cfg, "userpool", "nr_pktmbuf_cache",
+ &instance->sc_param.sz_user_pktmbuf_cache, MR_DEVICE_DEFAULT_NR_PKTMBUF_CACHE);
+
+ return 0;
+}
+
+
static int __load_device_runtime_info(const char * cfg, struct sc_instance * instance,
struct sc_device * sc_dev)
{
@@ -380,6 +395,8 @@ void sc_stage_config(struct sc_instance * instance)
"Please check configure file %s, Failed", cfgfile);
MR_CHECK(sc_config_thread_info(cfgfile, instance) >= 0,
"Please check configure file %s, Failed. ", cfgfile);
+ MR_CHECK(sc_config_user_pool_info(cfgfile, instance) >= 0,
+ "Please check configure file %s, Failed. ", cfgfile);
MR_CHECK(sc_config_device_info(cfgfile, instance) >= 0,
"Please check configure file %s, Failed. ", cfgfile);
MR_CHECK(sc_config_burst_info(cfgfile, instance) >= 0,
diff --git a/service/src/register.c b/service/src/register.c
index abb82e6..c0d48b9 100644
--- a/service/src/register.c
+++ b/service/src/register.c
@@ -64,12 +64,41 @@ static int sc_core_ctrlzone_register(struct sc_instance * instance)
return 0;
}
+static int sc_core_user_pktmbuf_pool_register(struct sc_instance * instance)
+{
+ int ret = mr_buffer_user_pool_produce(instance->core_instance, SOCKET_ID_ANY,
+ instance->sc_param.sz_user_pktmbuf, instance->sc_param.nr_user_direct_pktmbuf,
+ instance->sc_param.sz_user_pktmbuf_cache);
+
+ if(ret < 0)
+ {
+ MR_LOG(ERR, SERVICE, "Produce user pktmbuf pool(nr_pktmbuf=%d, sz_pktmbuf=%d, sz_cache=%d) failed. \n",
+ instance->sc_param.sz_user_pktmbuf, instance->sc_param.nr_user_direct_pktmbuf,
+ instance->sc_param.sz_user_pktmbuf_cache);
+ }
+ else
+ {
+ MR_LOG(ERR, SERVICE, "User pktmbuf pool(nr_pktmbuf=%d, sz_pktmbuf=%d, sz_cache=%d) created. \n",
+ instance->sc_param.sz_user_pktmbuf, instance->sc_param.nr_user_direct_pktmbuf,
+ instance->sc_param.sz_user_pktmbuf_cache);
+ }
+
+ return ret;
+}
+
static int sc_stack_instance_register(struct sc_instance * instance)
{
// 获取全局配置句柄和全局运行时句柄
struct mr_global_ctx * g_ctx = mr_global_ctx_get();
assert(g_ctx != NULL);
+ // 取默认内存池地址
+ instance->sk_param.def_direct_pktmbuf_pool = mr_buffer_user_direct_pool_get(
+ instance->core_instance, SOCKET_ID_ANY);
+
+ instance->sk_param.def_indirect_pktmbuf_pool = mr_buffer_user_indirect_pool_get(
+ instance->core_instance, SOCKET_ID_ANY);
+
// 初始化协议栈全局句柄
instance->sk_instance = sk_instance_create(instance->core_instance, &instance->sk_param);
g_ctx->ctx_stack = instance->sk_instance;
@@ -257,6 +286,8 @@ void sc_stage_register(struct sc_instance * instance)
"Cannot register core instance, Failed. Please recheck runtime log. ");
MR_CHECK(sc_core_ctrlzone_register(instance) >= 0,
"Cannot register control zone, Failed. Please recheck runtime log.");
+ MR_CHECK(sc_core_user_pktmbuf_pool_register(instance) >= 0,
+ "Cannot register control zone, Failed. Please recheck runtime log.");
MR_CHECK(sc_stack_instance_register(instance) >= 0,
"Cannot register stack instance, Failed. Please recheck runtime log. ");
MR_CHECK(sc_app_register(instance) >= 0,
diff --git a/slave/CMakeLists.txt b/slave/CMakeLists.txt
index 3684199..ab00f78 100644
--- a/slave/CMakeLists.txt
+++ b/slave/CMakeLists.txt
@@ -6,7 +6,14 @@ include_directories(${DPDK_INCLUDE_DIR})
include_directories(include)
add_definitions(${DPDK_C_PREDEFINED})
-add_library(marsio src/marsio.c src/rawio.c)
-target_link_libraries(marsio ${DPDK_LIBRARY} MESA_prof_load_static)
-target_link_libraries(marsio rt pthread dl core)
-target_include_directories(marsio INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
+add_library(marsio SHARED src/marsio.c src/rawio.c)
+
+set_target_properties(marsio PROPERTIES VERSION ${MARSIO_VERSION_MAJOR}.${MARSIO_VERSION_MINOR})
+set_target_properties(marsio PROPERTIES SOVERSION ${MARSIO_VERSION_MAJOR})
+set_target_properties(marsio PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_LIST_DIR}/src/version.map")
+target_link_libraries(marsio PRIVATE -Wl,--whole-archive mruntime core stack -Wl,--no-whole-archive)
+target_link_libraries(marsio PRIVATE ${DPDK_LIBRARY} rt pthread dl)
+target_include_directories(marsio INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/")
+
+install(TARGETS marsio LIBRARY DESTINATION lib COMPONENT Program)
+#install(FILES libpag.h DESTINATION include COMPONENT Program) \ No newline at end of file
diff --git a/slave/include/mrlib.h b/slave/include/mrlib.h
index 105f25b..dfc2e32 100644
--- a/slave/include/mrlib.h
+++ b/slave/include/mrlib.h
@@ -10,7 +10,7 @@ int marsio_init(const char * appsym, uint64_t coremask, unsigned autoexit, FILE
int marsio_thread_init();
int marsio_destory();
-extern struct mrlib_instance * instance;
+extern struct mrapp_instance * instance;
#ifdef __cplusplus
}
diff --git a/slave/include/mrlib_common.h b/slave/include/mrlib_common.h
index 0bc8a7a..d7f1daa 100644
--- a/slave/include/mrlib_common.h
+++ b/slave/include/mrlib_common.h
@@ -6,7 +6,7 @@
struct __raw_socket;
TAILQ_HEAD(raw_socket_list, __raw_socket);
-struct mrlib_instance
+struct mrapp_instance
{
/* Ӧ������ */
char appsym[MR_SYMBOL_MAX];
diff --git a/slave/src/marsio.c b/slave/src/marsio.c
index 6fd019e..eb8ab49 100644
--- a/slave/src/marsio.c
+++ b/slave/src/marsio.c
@@ -9,12 +9,14 @@
#include <rte_malloc.h>
#include <mr_runtime.h>
+#include <sk_stack.h>
+
/* ��־λ���Ƿ��Ѿ������˳�ʼ��*/
int __mrlib_inited = 0;
/* ��־λ�����߳��Ƿ��Ѿ������˳�ʼ�� */
int __thread __mrlib_thread_inited = 0;
/* ���������Ľṹ */
-struct mrlib_instance * instance = NULL;
+struct mrapp_instance * instance = NULL;
#define MR_LIB_MAX_EAL_ARGC 128
@@ -36,7 +38,7 @@ static void __write_arg(char * eal_argv[], unsigned int * eal_argc,
while(0)
/* EAL������ʼ�� */
-static void mrlib_stage_eal_init()
+static void mrapp_stage_eal_init()
{
char * eal_argv[MR_LIB_MAX_EAL_ARGC];
unsigned int eal_argc = 0;
@@ -49,34 +51,28 @@ static void mrlib_stage_eal_init()
return;
}
-static void mrlib_slave_log_ready(FILE * logstream)
+static void mrapp_slave_log_ready(FILE * logstream)
{
if (logstream == NULL) logstream = stderr;
rte_openlog_stream(logstream);
}
-static int mrlib_slave_appinfo_register(const char * progsym,
+static int mrapp_appinfo_register(const char * progsym,
uint64_t coremask, unsigned autoexit)
{
// ע��Ӧ��
int ret = mr_app_register(progsym, coremask, autoexit);
if(ret < 0)
{
- MR_LOG(ERR, MRLIB, "Mrlib, SlaveProcInfoReady, "
- "Cannot register local process %s. \n", progsym);
+ MR_LOG(ERR, MRLIB, "Cannot register application %s. \n", progsym);
return -1;
}
- MR_LOG(INFO, MRLIB, "Mrlib, SlaveProcInfoReady, "
- "Process %s register success. \n", progsym);
-
- // ע����Ŀ��Slave���
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- mr_core_default_instance_set(g_ctx->ctx_core);
+ MR_LOG(INFO, MRLIB, "Application %s register success. \n", progsym);
return 0;
}
-static int mrlib_slave_instance_init(const char * progsym)
+static int mrapp_instance_init(const char * progsym)
{
// ������̵�Privָ�벻Ϊ�գ�˵����ǰ���й����ָ�������
if (mr_app_priv_get() != NULL)
@@ -86,8 +82,8 @@ static int mrlib_slave_instance_init(const char * progsym)
}
// ����û���й������������Ŀռ�
- struct mrlib_instance * _instance;
- _instance = rte_zmalloc(NULL, sizeof(struct mrlib_instance), 0);
+ struct mrapp_instance * _instance;
+ _instance = rte_zmalloc(NULL, sizeof(struct mrapp_instance), 0);
MR_CHECK(_instance != NULL, "Cannot alloc memory for mrlib instance");
snprintf(_instance->appsym, sizeof(instance->appsym), "%s", progsym);
@@ -97,18 +93,38 @@ static int mrlib_slave_instance_init(const char * progsym)
return 0;
}
+static int mrapp_register(struct mrapp_instance * instance)
+{
+ struct mr_global_ctx * g_ctx = mr_global_ctx_get();
+ mr_core_default_instance_set(g_ctx->ctx_core);
+
+ struct sk_app_instance * sk_app_instance = sk_app_instance_create(
+ g_ctx->ctx_stack, instance->appsym);
+
+ if(sk_app_instance == NULL)
+ {
+ MR_LOG(ERR, MRLIB, "Cannot create stack app instance for app %s. \n",
+ instance->appsym);
+ return -1;
+ }
+
+ sk_default_instance_set(g_ctx->ctx_stack, sk_app_instance);
+ return 0;
+}
+
int marsio_init(const char * appsym, uint64_t coremask,
unsigned autoexit, FILE * logstream)
{
int ret = 0;
- mrlib_stage_eal_init();
- mrlib_slave_log_ready(logstream);
+ mrapp_stage_eal_init();
+ mrapp_slave_log_ready(logstream);
- ret = mrlib_slave_appinfo_register(appsym, coremask, autoexit);
+ ret = mrapp_appinfo_register(appsym, coremask, autoexit);
if (ret < 0) return ret;
- ret = mrlib_slave_instance_init(appsym);
+ ret = mrapp_instance_init(appsym);
if (ret < 0) return ret;
-
+ ret = mrapp_register(instance);
+
__mrlib_inited = 1;
return 0;
}
@@ -122,4 +138,9 @@ int marsio_thread_init()
int marsio_destory()
{
return 0;
+}
+
+void marsio_on_exit_register(void(*exit_fn)(void * arg), void * arg)
+{
+ mr_on_exit_register(exit_fn, arg);
} \ No newline at end of file
diff --git a/slave/src/rawio.c b/slave/src/rawio.c
index 9aadb5f..6b1fa61 100644
--- a/slave/src/rawio.c
+++ b/slave/src/rawio.c
@@ -1,149 +1,151 @@
-#include <rte_mbuf.h>
-#include <mr_rawio.h>
-#include <mr_vnode.h>
-#include <mr_vman.h>
-#include <mr_stat.h>
-#include <mr_rtdev.h>
-#include <rte_malloc.h>
-#include <mrlib_common.h>
-#include <mr_runtime.h>
-#include <mr_rtdev.h>
-
-extern struct mrlib_instance * instance;
-
-struct __raw_socket
-{
- // ������
- TAILQ_ENTRY(__raw_socket) next;
- // �豸������
- char devsym[MR_SYMBOL_MAX];
- // Raw�ӿڶ������߳���
- unsigned int nr_rxstream;
- // Raw�ӿ�д�����߳���
- unsigned int nr_txstream;
- // Raw�ӿھ��
- struct rtdev_app_desc * rtdev_desc;
-};
-
-// �򿪵�Socket��¼����ɾ����������Ѿ��򿪵�Socket��¼�����������û��ظ�����ɴ���
-static struct __raw_socket * raw_socket_list_query(struct mrlib_instance * instance,
- const char * devsym)
-{
- struct __raw_socket * raw_socket_iter;
- TAILQ_FOREACH(raw_socket_iter, &instance->raw_socket_list, next)
- {
- if (strncmp(raw_socket_iter->devsym, devsym, sizeof(raw_socket_iter->devsym)) == 0)
- return raw_socket_iter;
- }
- return NULL;
-}
-
-static void raw_socket_list_join(struct mrlib_instance * instance, struct __raw_socket * socket)
-{
- TAILQ_INSERT_TAIL(&instance->raw_socket_list, socket, next);
- return;
-}
-
-static void raw_socket_list_remove(struct mrlib_instance * instance, struct __raw_socket * socket)
-{
- TAILQ_REMOVE(&instance->raw_socket_list, socket, next);
- return;
-}
-
-int marsio_raw_close(raw_socket_t * socket)
-{
- struct __raw_socket * _socket = (struct __raw_socket *)socket;
- raw_socket_list_remove(instance, (struct __raw_socket *)socket);
- mr_rt_device_close(_socket->rtdev_desc);
- return 0;
-}
-
-raw_socket_t * marsio_raw_socket(const char * devsym, unsigned int nr_rx_stream,
- unsigned int nr_tx_stream, unsigned int flags __rte_unused)
-{
- struct mr_global_ctx * g_ctx = mr_global_ctx_get();
- struct __raw_socket * socket_before;
- struct __raw_socket * socket;
-
- // �����ǰ�Ƿ��Ѿ���Socket
- socket_before = raw_socket_list_query(instance, devsym);
-
- // ���Socket�Ѿ���
- if (socket_before != NULL)
- {
- // �����ǰ�򿪵IJ��������ڵ��Ƿ�һ��
- if (socket_before->nr_rxstream != nr_rx_stream)
- goto release_before_socket;
- if (socket_before->nr_txstream != nr_tx_stream)
- goto release_before_socket;
-
- // ���ͨ���������Ѿ��򿪵�Socket���
- return (raw_socket_t *)socket_before;
- }
- else
- {
- goto new_socket;
- }
-
- // �ͷ��Ѿ��򿪵�Socket
-release_before_socket:
- marsio_raw_close((raw_socket_t *)socket_before);
-
-new_socket:
- socket = rte_zmalloc(NULL, sizeof(struct __raw_socket), 0);
- if(unlikely(socket == NULL))
- {
- MR_LOG(ERR, MRLIB, "Cannot alloc memory for RawSocket"
- "(devsym=%s, nr_rx_stream=%d, nr_tx_stream=%d, flags=%x)\n",
- devsym, nr_rx_stream, nr_tx_stream, flags);
- goto errout;
- }
-
- snprintf(socket->devsym, sizeof(socket->devsym), "%s", devsym);
- socket->nr_rxstream = nr_rx_stream;
- socket->nr_txstream = nr_tx_stream;
-
- // ������ʱ�豸
- struct rtdev_app_desc * _rtdev_desc = NULL;
- _rtdev_desc = mr_rt_device_open(g_ctx->ctx_core, devsym, instance->appsym,
- nr_rx_stream, nr_tx_stream);
-
- if(unlikely(_rtdev_desc == NULL))
- {
- MR_LOG(ERR, MRLIB, "MarsioRawSocket: Open rt-device %s"
- "(nr_rx_stream=%d, nr_tx_stream=%d, flags=%x) failed. \n",
- devsym, nr_rx_stream, nr_tx_stream, flags);
- goto errout;
- }
-
- socket->rtdev_desc = _rtdev_desc;
- raw_socket_list_join(instance, socket);
- return (raw_socket_t *)socket;
-
-errout:
- if (socket != NULL) rte_free(socket);
- return NULL;
-}
-
-int marsio_raw_recv(raw_socket_t * socket, thread_id_t sid,
- struct rte_mbuf * mbufs[], int nr_max_mbufs)
-{
- struct __raw_socket * _socket = (struct __raw_socket *)socket;
- mr_thread_hook();
-
- int ret = vnode_dequeue_burst(_socket->rtdev_desc->vnode_cons_rx,
- &_socket->rtdev_desc->ops, sid, (void **)mbufs, nr_max_mbufs);
-
- return ret;
-}
-
-static inline hash_t __raw_send_pkt_hash(struct rte_mbuf * mbuf)
-{
- return mbuf->hash.rss;
-}
-
-int marsio_raw_send(raw_socket_t * socket, thread_id_t sid,
- struct rte_mbuf * mbufs[], int nr_mbufs)
-{
- return 0;
+#include <rte_mbuf.h>
+#include <rte_malloc.h>
+
+#include <mr_vnode.h>
+#include <mr_vman.h>
+#include <mr_stat.h>
+#include <mr_rtdev.h>
+#include <mr_runtime.h>
+#include <mrlib_common.h>
+
+#include <marsio_buffer_user_api.h>
+#include <marsio_rawio_user_api.h>
+
+extern struct mrapp_instance * instance;
+
+struct __raw_socket
+{
+ // ������
+ TAILQ_ENTRY(__raw_socket) next;
+ // �豸������
+ char devsym[MR_SYMBOL_MAX];
+ // Raw�ӿڶ������߳���
+ unsigned int nr_rxstream;
+ // Raw�ӿ�д�����߳���
+ unsigned int nr_txstream;
+ // Raw�ӿھ��
+ struct rtdev_app_desc * rtdev_desc;
+};
+
+// �򿪵�Socket��¼����ɾ����������Ѿ��򿪵�Socket��¼�����������û��ظ�����ɴ���
+static struct __raw_socket * raw_socket_list_query(struct mrapp_instance * instance,
+ const char * devsym)
+{
+ struct __raw_socket * raw_socket_iter;
+ TAILQ_FOREACH(raw_socket_iter, &instance->raw_socket_list, next)
+ {
+ if (strncmp(raw_socket_iter->devsym, devsym, sizeof(raw_socket_iter->devsym)) == 0)
+ return raw_socket_iter;
+ }
+ return NULL;
+}
+
+static void raw_socket_list_join(struct mrapp_instance * instance, struct __raw_socket * socket)
+{
+ TAILQ_INSERT_TAIL(&instance->raw_socket_list, socket, next);
+ return;
+}
+
+static void raw_socket_list_remove(struct mrapp_instance * instance, struct __raw_socket * socket)
+{
+ TAILQ_REMOVE(&instance->raw_socket_list, socket, next);
+ return;
+}
+
+int marsio_raw_close(raw_socket_t * socket)
+{
+ struct __raw_socket * _socket = (struct __raw_socket *)socket;
+ raw_socket_list_remove(instance, (struct __raw_socket *)socket);
+ mr_rt_device_close(_socket->rtdev_desc);
+ return 0;
+}
+
+raw_socket_t * marsio_raw_socket(const char * devsym, unsigned int nr_rx_stream,
+ unsigned int nr_tx_stream, unsigned int flags)
+{
+ struct mr_global_ctx * g_ctx = mr_global_ctx_get();
+ struct __raw_socket * socket_before;
+ struct __raw_socket * socket;
+
+ // �����ǰ�Ƿ��Ѿ���Socket
+ socket_before = raw_socket_list_query(instance, devsym);
+
+ // ���Socket�Ѿ���
+ if (socket_before != NULL)
+ {
+ // �����ǰ�򿪵IJ��������ڵ��Ƿ�һ��
+ if (socket_before->nr_rxstream != nr_rx_stream)
+ goto release_before_socket;
+ if (socket_before->nr_txstream != nr_tx_stream)
+ goto release_before_socket;
+
+ // ���ͨ���������Ѿ��򿪵�Socket���
+ return (raw_socket_t *)socket_before;
+ }
+ else
+ {
+ goto new_socket;
+ }
+
+ // �ͷ��Ѿ��򿪵�Socket
+release_before_socket:
+ marsio_raw_close((raw_socket_t *)socket_before);
+
+new_socket:
+ socket = rte_zmalloc(NULL, sizeof(struct __raw_socket), 0);
+ if(unlikely(socket == NULL))
+ {
+ MR_LOG(ERR, MRLIB, "Cannot alloc memory for RawSocket"
+ "(devsym=%s, nr_rx_stream=%d, nr_tx_stream=%d, flags=%x)\n",
+ devsym, nr_rx_stream, nr_tx_stream, flags);
+ goto errout;
+ }
+
+ snprintf(socket->devsym, sizeof(socket->devsym), "%s", devsym);
+ socket->nr_rxstream = nr_rx_stream;
+ socket->nr_txstream = nr_tx_stream;
+
+ // ������ʱ�豸
+ struct rtdev_app_desc * _rtdev_desc = NULL;
+ _rtdev_desc = mr_rt_device_open(g_ctx->ctx_core, devsym, instance->appsym,
+ nr_rx_stream, nr_tx_stream);
+
+ if(unlikely(_rtdev_desc == NULL))
+ {
+ MR_LOG(ERR, MRLIB, "MarsioRawSocket: Open rt-device %s"
+ "(nr_rx_stream=%d, nr_tx_stream=%d, flags=%x) failed. \n",
+ devsym, nr_rx_stream, nr_tx_stream, flags);
+ goto errout;
+ }
+
+ socket->rtdev_desc = _rtdev_desc;
+ raw_socket_list_join(instance, socket);
+ return (raw_socket_t *)socket;
+
+errout:
+ if (socket != NULL) rte_free(socket);
+ return NULL;
+}
+
+int marsio_raw_recv_burst(raw_socket_t * socket, thread_id_t sid,
+ marsio_buff_t * mbufs[], int nr_max_mbufs)
+{
+ struct __raw_socket * _socket = (struct __raw_socket *)socket;
+ mr_thread_hook();
+
+ int ret = vnode_dequeue_burst(_socket->rtdev_desc->vnode_cons_rx,
+ &_socket->rtdev_desc->ops, sid, (void **)mbufs, nr_max_mbufs);
+
+ return ret;
+}
+
+static inline hash_t __raw_send_pkt_hash(struct rte_mbuf * mbuf)
+{
+ return mbuf->hash.rss;
+}
+
+int marsio_raw_send_burst(raw_socket_t * socket, thread_id_t sid,
+ marsio_buff_t * mbufs[], int nr_mbufs)
+{
+ return 0;
} \ No newline at end of file
diff --git a/slave/src/version.map b/slave/src/version.map
new file mode 100644
index 0000000..1e82a59
--- /dev/null
+++ b/slave/src/version.map
@@ -0,0 +1,46 @@
+LIBPAG {
+global:
+ marsio_init;
+ marsio_thread_init;
+ marsio_destory;
+ marsio_on_exit_register;
+ marsio_raw_close;
+ marsio_raw_socket;
+ marsio_raw_recv_burst;
+ marsio_raw_send_burst;
+
+ marsio_buff_malloc;
+ marsio_buff_free;
+ marsio_buff_ctrlzone;
+ marsio_buff_ctrlzone_data;
+ marsio_buff_ctrlzone_set;
+ marsio_buff_reset;
+ marsio_buff_getnext_seg;
+ marsio_buff_getnext_pkt;
+ marsio_buff_append_pkt;
+ marsio_buff_append_seg;
+ marsio_buff_headroom;
+ marsio_buff_tailroom;
+ marsio_buff_getnext_seg;
+ marsio_buff_getnext_pkt;
+ marsio_buff_mtod;
+ marsio_buff_buflen;
+ marsio_buff_datalen;
+ marsio_buff_prepend;
+ marsio_buff_append;
+ marsio_buff_adj;
+ marsio_buff_trim;
+ marsio_buff_headroom;
+ marsio_buff_tailroom;
+ marsio_get_pkt_type;
+ marsio_buff_dup;
+
+ marsio_socket;
+ marsio_connect;
+ marsio_bind;
+ marsio_udp_alloc;
+ marsio_udp_free;
+ marsio_udp_sendto_chain;
+
+local: *;
+}; \ No newline at end of file
diff --git a/stack/CMakeLists.txt b/stack/CMakeLists.txt
index c7d14cf..29c38b4 100644
--- a/stack/CMakeLists.txt
+++ b/stack/CMakeLists.txt
@@ -1,13 +1,10 @@
find_package(DPDK REQUIRED)
-include_directories(${CMAKE_SOURCE_DIR}/include)
-include_directories(${CMAKE_SOURCE_DIR}/include/extern)
-include_directories(${CMAKE_SOURCE_DIR}/include/internal)
include_directories(${DPDK_INCLUDE_DIR})
-
add_definitions(${DPDK_C_PREDEFINED})
+
include_directories(include)
add_library(stack src/stack.c src/device.c src/neigh.c src/rxtx.c src/route.c src/ip.c
- src/pcom.c src/arp.c src/icmp.c src/tcp.c src/udp.c)
-target_link_libraries(stack MESA_prof_load_static mruntime core)
+ src/pcom.c src/arp.c src/icmp.c src/tcp.c src/udp.c src/interface.c src/ucb.c)
+target_link_libraries(stack mruntime core)
target_link_libraries(stack rt pthread dl)
target_include_directories(stack INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
diff --git a/stack/include/sk_stack.h b/stack/include/sk_stack.h
index eaf0e73..e60ec19 100644
--- a/stack/include/sk_stack.h
+++ b/stack/include/sk_stack.h
@@ -119,4 +119,7 @@ int sk_serv_device_rx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
struct rte_mbuf * mbufs_in[], int nr_mbufs_in);
int sk_serv_device_tx_bulk(struct sk_dev_desc * dev_desc, thread_id_t sid,
- struct rte_mbuf * mbufs_out[], int nr_mbufs_max); \ No newline at end of file
+ struct rte_mbuf * mbufs_out[], int nr_mbufs_max);
+
+void sk_default_instance_set(struct sk_instance * instance,
+ struct sk_app_instance * app_instance); \ No newline at end of file
diff --git a/stack/include/sk_udp.h b/stack/include/sk_udp.h
index fcf7bf5..61690f3 100644
--- a/stack/include/sk_udp.h
+++ b/stack/include/sk_udp.h
@@ -1,14 +1,14 @@
-#pragma once
-
-#include <rte_mbuf.h>
-#include <sk_device.h>
-
-int protocol_serv_udp_entry(struct sk_dev_desc* dev_desc,
- thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in);
-
+#pragma once
+
+#include <rte_mbuf.h>
+#include <sk_device.h>
+
+int protocol_serv_udp_entry(struct sk_dev_desc* dev_desc,
+ thread_id_t sid, struct rte_mbuf* mbufs_in[], int nr_mbufs_in);
+
int protocol_serv_udp_drain(struct sk_dev_desc * dev_desc,
- thread_id_t sid, struct rte_mbuf * mbuf_out[], int nr_mbufs_max);
-
+ thread_id_t sid, struct rte_mbuf * mbuf_out[], int nr_mbufs_max);
+
int sk_udp_send_burst(struct sk_app_instance * app_instance, thread_id_t sid,
struct sk_destinfo * destinfo, struct rte_mbuf * mbuf[], unsigned int nr_mbuf,
unsigned char is_fast); \ No newline at end of file
diff --git a/stack/src/device.c b/stack/src/device.c
index 7626e91..e219b0c 100644
--- a/stack/src/device.c
+++ b/stack/src/device.c
@@ -13,7 +13,6 @@
#include <netinet/in.h>
#include <rte_ether.h>
#include <mr_rtdev.h>
-#include <mr_rawio.h>
#include <rte_malloc.h>
#include <sk_stack.h>
diff --git a/stack/src/interface.c b/stack/src/interface.c
index 422c684..d0a2334 100644
--- a/stack/src/interface.c
+++ b/stack/src/interface.c
@@ -206,5 +206,5 @@ ssize_t marsio_udp_sendto_chain(int marsio_fd, struct marsio_udp_buff * chain_he
// ��֧�ִ���1��Ŀ���ַ
if (nb_sockaddrs > 1) return -EINVAL;
- return __marsio_udp_sendto_chain(marsio_fd, )
+ return __udp_sendto_burst(marsio_fd, buff_array, nb_chain_pkts, flags, to[0], addrlen[0]);
} \ No newline at end of file
diff --git a/stack/src/ucb.c b/stack/src/ucb.c
index 26ef508..86e323e 100644
--- a/stack/src/ucb.c
+++ b/stack/src/ucb.c
@@ -88,13 +88,12 @@ struct sk_destinfo * sk_ucb_destinfo_get(struct sk_ucb * ucb)
int sk_ucb_connect(struct sk_ucb * ucb, struct sockaddr_in * addr)
{
- struct sk_stack_udp_ctx * udp_ctx = ucb->udp_ctx;
ucb->in_addr.remote_in_addr = addr->sin_addr;
ucb->in_mask.remote_in_addr.s_addr = 0xffffffff;
ucb->port.remote_in_port = addr->sin_port;
ucb->pmask.remote_in_port = 0xffff;
-
sk_ucb_destinfo_get(ucb);
+
return 0;
}
diff --git a/stack/src/udp.c b/stack/src/udp.c
index 5b5e93f..07c6a4b 100644
--- a/stack/src/udp.c
+++ b/stack/src/udp.c
@@ -69,21 +69,14 @@ int sk_udp_send_burst(struct sk_app_instance * app_instance, thread_id_t sid,
unsigned char is_fast)
{
struct sk_dev_desc * dev_desc = destinfo->d_dev_desc;
- struct rte_mbuf * header[MR_BURST_MAX];
hash_t hash[MR_BURST_MAX];
assert(nr_mbuf <= MR_BURST_MAX);
for (int i = 0; i < nr_mbuf; i++)
{
- header[i] = rte_pktmbuf_alloc(dev_desc->direct_pool);
- if (unlikely(header[i] == NULL)) goto errout;
-
- int ret = rte_pktmbuf_chain(header[i], mbuf[i]);
- assert(ret >= 0);
-
- sk_udp_segment_construct(destinfo, header[i]);
- sk_ip_packet_construct(app_instance, header[i], destinfo, IPPROTO_UDP);
+ sk_udp_segment_construct(destinfo, mbuf[i]);
+ sk_ip_packet_construct(app_instance, mbuf[i], destinfo, IPPROTO_UDP);
}
struct vnode_prod * prod;
@@ -94,14 +87,6 @@ int sk_udp_send_burst(struct sk_app_instance * app_instance, thread_id_t sid,
hash_t _hash = destinfo->s_trans_port ^ destinfo->d_trans_port;
for (int i = 0; i < nr_mbuf; i++) hash[i] = _hash;
- vnode_enqueue_burst_with_hash(prod, &dev_desc->udp_app_device->ops, sid,
- (void **)&header, hash, nr_mbuf);
-
-errout: // TODO: �������
- for(int i = 0; i < nr_mbuf; i++)
- {
- if (header[i] != NULL) rte_pktmbuf_free(header[i]);
- }
-
- return -1;
+ return vnode_enqueue_burst_with_hash(prod, &dev_desc->udp_app_device->ops, sid,
+ (void **)mbuf, hash, nr_mbuf);
} \ No newline at end of file
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index 3afd427..b64a3fe 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -8,24 +8,9 @@ include_directories(${DPDK_INCLUDE_DIR})
include_directories(include)
add_definitions(${DPDK_C_PREDEFINED})
-# add_executable(dev_stat stat/dev_stat_log.c)
-# target_link_libraries(dev_stat ${DPDK_LIBRARY} MESA_prof_load_static MESA_fs2)
-# target_link_libraries(dev_stat rt pthread dl core)
-
-add_executable(zcp_app_stat stat/libstat.c stat/app_stat.c)
-target_link_libraries(zcp_app_stat ${DPDK_LIBRARY} MESA_prof_load_static MESA_fs2)
-target_link_libraries(zcp_app_stat rt pthread dl core)
-
-add_executable(zcp_event_stat stat/libstat.c stat/event_stat.c)
-target_link_libraries(zcp_event_stat ${DPDK_LIBRARY} MESA_prof_load_static MESA_fs2)
-target_link_libraries(zcp_event_stat rt pthread dl core)
-
add_executable(zcp_rx_tcpdump tcpdump/rx_tcpdump.c)
target_include_directories(zcp_rx_tcpdump PRIVATE ${PCAP_INCLUDE_DIR})
target_link_libraries(zcp_rx_tcpdump pag ${PCAP_LIBRARY})
-
-install(TARGETS zcp_app_stat RUNTIME DESTINATION bin COMPONENT Program)
-install(TARGETS zcp_event_stat RUNTIME DESTINATION bin COMPONENT Program)
install(TARGETS zcp_rx_tcpdump RUNTIME DESTINATION bin COMPONENT Program)
#install(FILES script/mrstart DESTINATION bin PERMISSIONS WORLD_EXECUTE COMPONENT Program)
diff --git a/tools/stat/dev_stat.c b/tools/stat/dev_stat.c
index e55b369..2d4fc36 100644
--- a/tools/stat/dev_stat.c
+++ b/tools/stat/dev_stat.c
@@ -147,7 +147,7 @@ void dev_stat_output(struct dev_stat_statics* g_dev_stat_statics,mr_dev_t * devi
}
-static void mrlib_stage_eal_init()
+static void mrapp_stage_eal_init()
{
char * eal_argv[8];
unsigned int eal_argc = 0;
@@ -161,7 +161,7 @@ static void mrlib_stage_eal_init()
MR_CHECK(ret >= 0, "Cannot init EAL Enviorment, Failed");
return;
}
-static void mrlib_slave_log_ready(FILE * logstream)
+static void mrapp_slave_log_ready(FILE * logstream)
{
if (logstream == NULL) logstream = stderr;
rte_openlog_stream(stderr);
@@ -170,8 +170,8 @@ static void mrlib_slave_log_ready(FILE * logstream)
int mr_lib_init()
{
int ret = 0;
- mrlib_stage_eal_init();
- mrlib_slave_log_ready(NULL);
+ mrapp_stage_eal_init();
+ mrapp_slave_log_ready(NULL);
mr_global_ctx_slave_init();
mr_global_cfg_slave_init();