diff options
| author | Qiuwen Lu <[email protected]> | 2016-12-06 11:12:29 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2016-12-06 11:12:29 +0800 |
| commit | ad5279a1b6024e64545bf51200bd1e74c0907474 (patch) | |
| tree | c601cabf5c7634bfdb96a399a45ef48a7c1f2c01 | |
| parent | 30f8b8f39815dcfbd50eb62d6f04df5eba909945 (diff) | |
许多改动,修正了很多问题。
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(); |
