summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2016-08-25 13:32:26 +0800
committerQiuwen Lu <[email protected]>2016-08-25 13:32:26 +0800
commitaf0460d2307c8325db5f5ef381f098a60899728d (patch)
tree75a7d07bcbfc7845c0b254fa2277f3b6762d5183
parent52c59a2373b4eea518b659c76a8cb643123db726 (diff)
改名,libbase为libcore4.0.0
-rw-r--r--.gitignore1
-rw-r--r--CMakeLists.txt3
-rw-r--r--base/src/thread.c0
-rw-r--r--core/CMakeLists.txt (renamed from base/CMakeLists.txt)8
-rw-r--r--core/include/mr_common.h (renamed from include/internal/mr_common.h)17
-rw-r--r--core/include/mr_ctx.h (renamed from include/internal/mr_ctx.h)9
-rw-r--r--core/include/mr_hwinfo.h (renamed from base/include/mr_hwinfo.h)12
-rw-r--r--core/include/mr_vnode.h (renamed from base/include/mr_vnode.h)0
-rw-r--r--core/src/ctx.c152
-rw-r--r--core/src/device.c (renamed from base/src/device.c)92
-rw-r--r--core/src/hwinfo.c (renamed from base/src/hwinfo.c)10
-rw-r--r--core/src/mempool.c (renamed from base/src/mempool.c)55
-rw-r--r--core/src/proc.c244
-rw-r--r--core/src/vnode.c (renamed from base/src/vnode.c)0
-rw-r--r--include/extern/mr_udp.h2
-rw-r--r--include/internal/common.h6
-rw-r--r--test/CMakeLists.txt10
17 files changed, 547 insertions, 74 deletions
diff --git a/.gitignore b/.gitignore
index a129b0a..8830258 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,4 @@ test/test
/.vs/marsio1/v14/.suo
/x64/Debug/marsio1.tlog
/x64
+/marsio1.VC.db
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 28da525..3bd6a14 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -65,7 +65,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXX_FLAGS}")
#set(CMAKE_INSTALL_PREFIX /opt/iiesoft/marsio)
add_subdirectory(${CMAKE_SOURCE_DIR}/support ${CMAKE_BINARY_DIR}/support)
-add_subdirectory(${CMAKE_SOURCE_DIR}/base)
+add_subdirectory(${CMAKE_SOURCE_DIR}/core)
+add_subdirectory(${CMAKE_SOURCE_DIR}/service)
#add_subdirectory(${CMAKE_SOURCE_DIR}/driver)
#add_subdirectory(${CMAKE_SOURCE_DIR}/logreader)
#add_subdirectory(${CMAKE_SOURCE_DIR}/conf)
diff --git a/base/src/thread.c b/base/src/thread.c
deleted file mode 100644
index e69de29..0000000
--- a/base/src/thread.c
+++ /dev/null
diff --git a/base/CMakeLists.txt b/core/CMakeLists.txt
index ac9140e..65b4ae0 100644
--- a/base/CMakeLists.txt
+++ b/core/CMakeLists.txt
@@ -6,7 +6,7 @@ include_directories(${DPDK_INCLUDE_DIR})
add_definitions(${DPDK_C_PREDEFINED})
include_directories(include)
-add_library(base src/device.c src/hwinfo.c src/mempool.c src/vnode.c)
-target_link_libraries(base ${DPDK_LIBRARY} MESA_prof_load_static)
-target_link_libraries(base rt pthread dl)
-target_include_directories(base INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/") \ No newline at end of file
+add_library(core src/device.c src/hwinfo.c src/mempool.c src/vnode.c)
+target_link_libraries(core ${DPDK_LIBRARY} MESA_prof_load_static)
+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/include/internal/mr_common.h b/core/include/mr_common.h
index 2bb504a..4989842 100644
--- a/include/internal/mr_common.h
+++ b/core/include/mr_common.h
@@ -4,6 +4,7 @@ extern "C" {
#endif
#include <stdint.h>
+#include <rte_rwlock.h>
#ifndef MR_STRING_MAX
#define MR_STRING_MAX 2048
@@ -40,6 +41,22 @@ typedef uint32_t flags_t;
#define MR_LOG(level, module, ...) \
RTE_LOG(level, module, ##__VA_ARGS__)
+/* TODO: support pthread read/write lock */
+typedef rte_rwlock_t mr_spin_rwlock_t;
+#define mr_spin_rwlock_read_lock(x) rte_rwlock_read_lock(x)
+#define mr_spin_rwlock_read_unlock(x) rte_rwlock_read_unlock(x)
+#define mr_spin_rwlock_write_lock(x) rte_rwlock_write_lock(x)
+#define mr_spin_rwlock_write_unlock(x) rte_rwlock_write_unlock(x)
+
+/* Only use in Visual Studio, to avoid IDE errors */
+#ifdef _MSC_VER
+#define rte_cpu_to_be_16(x) htons(x)
+#define rte_be_to_cpu_32(x) ntohl(x)
+#define likely(x) x
+#define unlikely(x) x
+#define __thread __declspec(thread)
+#endif
+
#ifdef __cplusplus
}
#endif \ No newline at end of file
diff --git a/include/internal/mr_ctx.h b/core/include/mr_ctx.h
index 5fac7ce..b000dde 100644
--- a/include/internal/mr_ctx.h
+++ b/core/include/mr_ctx.h
@@ -19,15 +19,16 @@ enum _mr_mid_enum
MR_MID_DEVICE_MGR = 2,
MR_MID_FIB_MGR = 3,
MR_MID_HWINFO = 4,
+ MR_MID_PROCMAN = 5,
MR_MID_MAX
};
// Global MARSIO Runtime Context
struct mr_global_ctx
{
+ void * process_ctxs;
+ void * thread_ctxs;
void * module_ctxs[MR_MAX_MODULES_NR];
- struct rte_mempool * rx_mempool[RTE_MAX_NUMA_NODES];
- struct rte_mempool * tx_mempool[RTE_MAX_NUMA_NODES];
};
// Process MARSIO Runtime Context
@@ -35,6 +36,7 @@ struct mr_proc_ctx
{
process_id_t process_id;
struct mr_global_ctx * global_ctx;
+ void * modules_ctxs[MR_MAX_MODULES_NR];
};
// Thread MARSIO Runtime Context
@@ -43,6 +45,7 @@ struct mr_thread_ctx
thread_id_t thread_id;
struct mr_global_ctx * global_ctx;
struct mr_proc_ctx * proc_ctx;
+ void * modules_ctxs[MR_MAX_MODULES_NR];
};
// Gloabl Marsio Configure Information
@@ -65,6 +68,8 @@ struct mr_module
mr_module_entry_t destory;
};
+typedef uint32_t mid_t;
+
#define MODULE_CTX(g_ctx, mid) (g_ctx->module_ctxs[mid])
#define MODULE_CFG(g_cfg, mid) (g_cfg->module_cfgs[mid])
diff --git a/base/include/mr_hwinfo.h b/core/include/mr_hwinfo.h
index dab5fb1..fe816f6 100644
--- a/base/include/mr_hwinfo.h
+++ b/core/include/mr_hwinfo.h
@@ -1,9 +1,9 @@
-#pragma once
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
int mr_hwinfo_nr_sockets();
int mr_hwinfo_nr_cpus();
int mr_hwinfo_physical_cpu_id(int cpu_id);
diff --git a/base/include/mr_vnode.h b/core/include/mr_vnode.h
index a37d330..a37d330 100644
--- a/base/include/mr_vnode.h
+++ b/core/include/mr_vnode.h
diff --git a/core/src/ctx.c b/core/src/ctx.c
new file mode 100644
index 0000000..00a799f
--- /dev/null
+++ b/core/src/ctx.c
@@ -0,0 +1,152 @@
+/* Core Functions of framework
+ * Provides basic functions and envoirment.
+ *
+ * Author : Qiuwen Lu<[email protected]>
+ * Date : 2016-08-23
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <rte_ip_frag.h>
+#include <rte_eal.h>
+#include <rte_version.h>
+
+#include "mr_ctx.h"
+
+static struct mr_global_ctx * __global_ctx;
+static struct mr_config * __global_cfg;
+static struct mr_proc_ctx * __proc_ctx;
+static __thread struct mr_thread_ctx * __thread_ctx;
+
+#define __SHM_FILEMODE 00777
+#define __SHM_SYM_GLOBAL_CTX "MR_CORE_GLOBAL_CTX_SHM"
+#define __SHM_SYM_GLOBAL_CFG "MR_CORE_GLOBAL_CFG_SHM"
+
+static void * shared_memory_create(const char * sym, size_t size)
+{
+ int shm_fd = shm_open(sym, O_RDWR | O_CREAT, __SHM_FILEMODE);
+ if(shm_fd < 0)
+ {
+ MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, "
+ "Call shm_open failed: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ ftruncate(shm_fd, size);
+
+ void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, shm_fd, 0);
+
+ if (shm_ptr == NULL)
+ {
+ MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryCreate, "
+ "Call mmap failed: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ memset(shm_ptr, 0, size);
+ return shm_ptr;
+}
+
+static void * shared_memory_lookup(const char * sym, size_t size)
+{
+ int shm_fd = shm_open(sym, O_RDWR, __SHM_FILEMODE);
+ if (shm_fd < 0)
+ {
+ MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, "
+ "Call shm_open failed: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ ftruncate(shm_fd, size);
+
+ void * shm_ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, shm_fd, 0);
+
+ if (shm_ptr == NULL)
+ {
+ MR_LOG(INFO, BASE, "CoreCtxMan, SharedMemoryLookup, "
+ "Call mmap failed: %s\n", strerror(errno));
+ return NULL;
+ }
+
+ return shm_ptr;
+}
+
+int mr_global_ctx_init()
+{
+ __global_ctx = (struct mr_global_ctx *)shared_memory_create(
+ __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx));
+
+ MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxInit, "
+ "Cannot create shared memory for global ctx");
+ return 0;
+}
+
+int mr_global_ctx_lookup()
+{
+ __global_ctx = (struct mr_global_ctx *)shared_memory_lookup(
+ __SHM_SYM_GLOBAL_CTX, sizeof(struct mr_global_ctx));
+
+ MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalCtxLookup, "
+ "Cannot lookup shared memory for global ctx");
+ return 0;
+}
+
+int mr_global_cfg_init()
+{
+ __global_cfg = (struct mr_config *)shared_memory_create(
+ __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_config));
+
+ MR_CHECK(__global_ctx != NULL, "CoreCtxMan, GlobalConfigInit, "
+ "Cannot create shared memory for global config");
+
+ return 0;
+}
+
+int mr_global_cfg_lookup()
+{
+ __global_cfg = (struct mr_config *)shared_memory_lookup(
+ __SHM_SYM_GLOBAL_CFG, sizeof(struct mr_config));
+
+ MR_CHECK(__global_cfg != NULL, "CoreCtxMan, GlobalConfigLookup, "
+ "Cannot lookup shared memory for global config");
+ return 0;
+}
+
+int mr_proc_ctx_init()
+{
+ __proc_ctx = (struct mr_proc_ctx *)rte_zmalloc(NULL, sizeof(struct mr_proc_ctx), 0);
+ MR_CHECK(__proc_ctx != NULL, "CoreCtxMan, ProcessCtxInit, "
+ "Cannot alloc memory for proc ctx");
+
+ __proc_ctx->global_ctx = __global_ctx;
+ assert(__proc_ctx->global_ctx != NULL);
+
+ //TODO: __proc_ctx->process_id is empty.
+ return 0;
+}
+
+struct mr_global_ctx * mr_global_ctx_get()
+{
+ assert(__global_ctx != NULL);
+ return __global_ctx;
+}
+
+struct mr_config * mr_global_config_get()
+{
+ assert(__global_cfg != NULL);
+ return __global_cfg;
+}
+
+struct mr_proc_ctx * mr_proc_ctx_get()
+{
+ assert(__proc_ctx != NULL);
+ return __proc_ctx;
+} \ No newline at end of file
diff --git a/base/src/device.c b/core/src/device.c
index fe8d3e2..c5061be 100644
--- a/base/src/device.c
+++ b/core/src/device.c
@@ -69,22 +69,22 @@ typedef void * mr_devq_t;
TAILQ_HEAD(mr_deivce_list, mr_dev);
-struct device_manager_ctx
+struct devman_ctx
{
struct mr_deivce_list device_list;
struct mr_dev * rte_device[RTE_MAX_ETHPORTS];
};
-struct device_manager_config
+struct devman_config
{
unsigned int nr_rx_desc;
unsigned int nr_tx_desc;
};
// Module Global Ctx
-static struct device_manager_ctx * module_ctx;
+static struct devman_ctx * module_ctx;
// Module Global Config
-static struct device_manager_config * module_config;
+static struct devman_config * module_config;
int mr_device_open(mr_devq_t * devq, flags_t flags)
{
@@ -107,21 +107,21 @@ struct mr_devq * __device_open_devq(struct mr_dev * dev, flags_t flags)
// 检查队列数量,超过队列数申请即失败
if(dev->nr_devq >= RTE_DIM(dev->devq))
{
- RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s,"
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, "
"Too many open request\n", dev->symbol);
return NULL;
}
if(dev->nr_rxq >= dev->nr_rxq_max)
{
- RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s,"
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, "
"Too many recieve queues\n", dev->symbol);
return NULL;
}
if(dev->nr_txq >= dev->nr_txq_max)
{
- RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s",
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, Device %s, "
"Too many xmit queues\n", dev->symbol);
return NULL;
}
@@ -147,7 +147,8 @@ struct mr_devq * __device_open_devq(struct mr_dev * dev, flags_t flags)
return devq;
}
-static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * devsym, flags_t flags)
+static mr_devq_t * device_open(struct devman_ctx * ctx, const char * devsym,
+ flags_t flags)
{
struct mr_dev * dev = NULL;
struct mr_devq * retq = NULL;
@@ -159,7 +160,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev
if (strncmp(dev->symbol, devsym, sizeof(dev->symbol)) != 0)
continue;
- RTE_LOG(DEBUG, BASE, "DeviceManager, DeviceOpen,"
+ MR_LOG(DEBUG, BASE, "DeviceManager, DeviceOpen, "
"Found Device %s\n", devsym);
retq = __device_open_devq(dev, flags);
found = 1;
@@ -168,7 +169,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev
// 没找到
if(!found)
{
- RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen,"
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, "
"Cannot found device %s\n", devsym);
return NULL;
}
@@ -176,7 +177,7 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev
// 找到了但是句柄是NULL,打开失败
if(retq == NULL)
{
- RTE_LOG(INFO, BASE, "DeviceManager, DeviceOpen,"
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceOpen, "
"Cannot open device %s\n", devsym);
return NULL;
}
@@ -184,13 +185,13 @@ static mr_devq_t * device_open(struct device_manager_ctx * ctx, const char * dev
return (mr_devq_t *)retq;
}
-static int device_close(struct device_manager_ctx * ctx, mr_devq_t * devq)
+static int device_close(struct devman_ctx * ctx, mr_devq_t * devq)
{
return 0;
}
// 扫描DPDK加载的网卡,初始化描述符空间,以便收集配置信息
-static int device_scan(struct device_manager_ctx * ctx)
+static int device_scan(struct devman_ctx * ctx)
{
unsigned int eth_dev_counts = rte_eth_dev_count();
char devsym_buffer[MR_SYMBOL_MAX];
@@ -221,7 +222,7 @@ static int device_scan(struct device_manager_ctx * ctx)
}
static int device_init(struct mr_global_ctx * g_ctx,
- struct device_manager_ctx * ctx, struct device_manager_config * cfg)
+ struct devman_ctx * ctx, struct devman_config * cfg)
{
// 对设备链上的所有设备初始化,计算队列数量。
@@ -230,7 +231,8 @@ static int device_init(struct mr_global_ctx * g_ctx,
{
if (dev->enable == 0)
{
- RTE_LOG(INFO, BASE, "DeviceManager, Device %s is disable, skip\n", dev->symbol);
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceInit, "
+ "Device %s is disable, skip\n", dev->symbol);
continue;
}
@@ -241,7 +243,9 @@ static int device_init(struct mr_global_ctx * g_ctx,
retval = rte_eth_dev_configure(dev->port_id, nr_rxq_use, nr_txq_use, NULL);
if (retval != 0)
{
- RTE_LOG(ERR, BASE, "DeviceManager, Device %s Configure Error, Errno = %d\n", dev->symbol, retval);
+ MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, "
+ "Device %s Configure Error, Errno = %d\n",
+ dev->symbol, retval);
return retval;
}
@@ -249,11 +253,12 @@ static int device_init(struct mr_global_ctx * g_ctx,
{
retval = rte_eth_rx_queue_setup(dev->port_id, rxq, cfg->nr_rx_desc,
rte_eth_dev_socket_id(dev->port_id), NULL,
- g_ctx->rx_mempool[rte_eth_dev_socket_id(dev->port_id)]);
+ NULL);
if (retval < 0)
{
- RTE_LOG(ERR, BASE, "DeviceManager, Device %s RXQ %d Setup Error, Errno = %d\n",
+ MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, "
+ "Device %s RXQ %d Setup Error, Errno = %d\n",
dev->symbol, rxq, retval);
return retval;
}
@@ -266,7 +271,8 @@ static int device_init(struct mr_global_ctx * g_ctx,
if (retval < 0)
{
- RTE_LOG(ERR, BASE, "DeviceManager, Device %s TXQ %d Setup Error, Errno = %d\n",
+ MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, "
+ "Device %s TXQ %d Setup Error, Errno = %d\n",
dev->symbol, txq, retval);
return retval;
}
@@ -275,7 +281,8 @@ static int device_init(struct mr_global_ctx * g_ctx,
retval = rte_eth_dev_start(dev->port_id);
if (retval < 0)
{
- RTE_LOG(ERR, BASE, "DeviceManager, Device %s Start Error, Errno = %d\n",
+ MR_LOG(ERR, BASE, "DeviceManager, DeviceInit, "
+ "Device %s Start Error, Errno = %d\n",
dev->symbol, retval);
return retval;
}
@@ -288,52 +295,59 @@ static int device_init(struct mr_global_ctx * g_ctx,
char str_mac_addr[MR_SYMBOL_MAX];
ether_format_addr(str_mac_addr, sizeof(str_mac_addr), &dev->ether_addr);
- RTE_LOG(INFO, BASE, "DeviceManager, Device %s Information: PortID=%d, NR RXQ=%d, NR TXQ=%d, MAC=%s",
+ MR_LOG(INFO, BASE, "DeviceManager, DeviceInit, "
+ "Device %s Information: PortID=%d, NR RXQ=%d, NR TXQ=%d, MAC=%s",
dev->port_id, dev->nr_rxq, dev->nr_txq, str_mac_addr);
}
return 0;
}
-int device_manager_preconfig(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
+int devman_preinit(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
{
/* 初始化设备管理各句柄 */
- MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR) = rte_zmalloc("DEVICE_MANAGER_CTX", sizeof(struct device_manager_ctx), 0);
- MR_CHECK(MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR) != NULL, "Device Manager Preinit Error, cannot alloc memory for devmgr context");
+ MODULE_CTX(g_ctx, m_desc->mid) = rte_zmalloc("DEVICE_MANAGER_CTX",
+ sizeof(struct devman_ctx), 0);
+ MR_CHECK(MODULE_CTX(g_ctx, m_desc->mid) != NULL,
+ "Device Manager Preinit Error, cannot alloc memory for devmgr context");
- MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR) = rte_zmalloc("DEVICE_MANAGER_CONFIG", sizeof(struct device_manager_config), 0);
- MR_CHECK(MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR) != NULL, "Device Manager Preinit Error, cannot alloc memory for devmgr config");
+ MODULE_CFG(g_cfg, m_desc->mid) = rte_zmalloc("DEVICE_MANAGER_CONFIG",
+ sizeof(struct devman_config), 0);
+ MR_CHECK(MODULE_CFG(g_cfg, m_desc->mid) != NULL,
+ "Device Manager Preinit Error, cannot alloc memory for devmgr config");
- module_ctx = (struct device_manager_ctx *)MODULE_CTX(g_ctx, MR_MID_DEVICE_MGR);
- module_config = (struct device_manager_config *)MODULE_CFG(g_cfg, MR_MID_DEVICE_MGR);
+ module_ctx = (struct devman_ctx *)MODULE_CTX(g_ctx, m_desc->mid);
+ module_config = (struct devman_config *)MODULE_CFG(g_cfg, m_desc->mid);
TAILQ_INIT(&module_ctx->device_list);
return device_scan(module_ctx);
}
-int device_manager_config(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
+int devman_config(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
{
- struct device_manager_config * cfg = module_config;
- struct device_manager_ctx * ctx = module_ctx;
+ struct devman_config * cfg = module_config;
+ struct devman_ctx * ctx = module_ctx;
/* 加载网卡描述符数量配置 */
- MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_rx_desc", &cfg->nr_rx_desc, MR_DEVICE_DEFAULT_NR_RX_DESC);
- MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_tx_desc", &cfg->nr_tx_desc, MR_DEVICE_DEFAULT_NR_TX_DESC);
+ MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_rx_desc",
+ &cfg->nr_rx_desc, MR_DEVICE_DEFAULT_NR_RX_DESC);
+ MESA_load_profile_uint_def(g_cfg->glob_cfg_file, "device", "nr_tx_desc",
+ &cfg->nr_tx_desc, MR_DEVICE_DEFAULT_NR_TX_DESC);
/* 加载各网卡配置 */
return 0;
}
-int device_manager_init(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
+int devman_init(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
{
- struct device_manager_config * cfg = module_config;
- struct device_manager_ctx * ctx = module_ctx;
+ struct devman_config * cfg = module_config;
+ struct devman_ctx * ctx = module_ctx;
return device_init(g_ctx, ctx, cfg);
}
-int device_manager_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
+int devman_destory(struct mr_module * m_desc, struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
{
- struct device_manager_config * cfg = module_config;
- struct device_manager_ctx * ctx = module_ctx;
+ struct devman_config * cfg = module_config;
+ struct devman_ctx * ctx = module_ctx;
return 0;
} \ No newline at end of file
diff --git a/base/src/hwinfo.c b/core/src/hwinfo.c
index 1aeb765..c47a846 100644
--- a/base/src/hwinfo.c
+++ b/core/src/hwinfo.c
@@ -116,7 +116,7 @@ static int hwinfo_cpu_scan(struct hwinfo_ctx * ctx)
int nr_cpus = linux_get_nr_total_cpus();
if (nr_cpus < 0)
{
- RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, cannot get count of total cpus");
+ MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, Cannot get count of total cpus\n");
return nr_cpus;
}
@@ -132,15 +132,15 @@ static int hwinfo_cpu_scan(struct hwinfo_ctx * ctx)
if(pcpu_id < 0)
{
- RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan"
- "cannot get physical id of cpu %d", cpu_id);
+ MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, "
+ "Cannot get physical id of cpu %d\n", cpu_id);
continue;
}
if(socket_id < 0)
{
- RTE_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan",
- "cannot get socket id for cpu %d", cpu_id);
+ MR_LOG(INFO, BASE, "HwCPUInfo, HwCPUInfoScan, "
+ "Cannot get socket id for cpu %d\n", cpu_id);
continue;
}
diff --git a/base/src/mempool.c b/core/src/mempool.c
index 15353fe..82e9532 100644
--- a/base/src/mempool.c
+++ b/core/src/mempool.c
@@ -1,17 +1,18 @@
-#include <mr_common.h>
-#include <mr_ctx.h>
-#include <mr_config.h>
#include <MESA_prof_load.h>
-
#include <rte_mempool.h>
#include <rte_config.h>
#include <rte_malloc.h>
#include <rte_mbuf.h>
#include <assert.h>
+#include <mr_common.h>
+#include <mr_ctx.h>
+#include <mr_hwinfo.h>
+#include <mr_config.h>
+
#ifndef MR_MEMPOOL_DEFAULT_NR_MBUF
-#define MR_MEMPOOL_DEFAULT_NR_MBUF (1024 * 1024)
+#define MR_MEMPOOL_DEFAULT_NR_MBUF 8192
#endif
#ifndef MR_MEMPOOL_DEFAULT_NR_MBUF_CACHE
@@ -60,9 +61,45 @@ int mempool_config(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
int mempool_init(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
{
- // Ŀǰ��ʵ�ְ�Socket����MEMPOOL������ÿ��Socket������һ��Mempool
- // TODO: Ŀǰʵ�ֲ���DPDK�ṩ��Socket-ID�������ƣ���Ҫ�����Լ��ġ�
+ struct mempool_ctx * ctx = (struct mempool_ctx *)MODULE_CTX(g_ctx, MR_MID_MEMPOOL_MGR);
+ struct mempool_config * cfg = (struct mempool_config *)MODULE_CFG(g_cfg, MR_MID_MEMPOOL_MGR);
+
+ assert(ctx != NULL);
+
+ // Ϊÿ��Socket����mbufpool
+ for (int socket_id = 0; socket_id < mr_hwinfo_nr_sockets(); socket_id++)
+ {
+ char symbol[MR_SYMBOL_MAX];
+ snprintf(symbol, sizeof(symbol), "mbuf_pool_socket_%d", socket_id);
+
+ struct rte_mempool * mbufpool = rte_pktmbuf_pool_create(symbol,
+ cfg->nr_mbuf, cfg->nr_mbuf_cache, 0, cfg->sz_mbuf, socket_id);
+
+ MR_CHECK(mbufpool != NULL, "Mempool, cannot create mempool for socket %d, "
+ "nr_mbuf=%d, nr_mbuf_cache=%d, sz_mbuf=%d", socket_id,
+ cfg->nr_mbuf, cfg->nr_mbuf_cache, cfg->sz_mbuf);
+
+ MR_LOG(INFO, BASE, "Mempool, Create mbufs pool successfully, "
+ "socket_id=%d, nr_mbuf=%d, nr_mbuf_cache=%d, sz_mbuf=%d",
+ socket_id, cfg->nr_mbuf, cfg->nr_mbuf_cache, cfg->sz_mbuf);
+
+ ctx->rx_mbufs[socket_id] = mbufpool;
+ ctx->tx_mbufs[socket_id] = mbufpool;
+ }
+
+ return 0;
+}
+
+int mempool_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
+{
+ return 0;
}
-int device_manager_destory(struct mr_config * g_cfg, struct mr_global_ctx * g_ctx)
-{} \ No newline at end of file
+struct mr_module module_desc_mempool =
+{
+ .mid = MR_MID_MEMPOOL_MGR,
+ .preconfig = mempool_preconfig,
+ .config = mempool_config,
+ .init = mempool_init,
+ .destory = mempool_destory
+}; \ No newline at end of file
diff --git a/core/src/proc.c b/core/src/proc.c
new file mode 100644
index 0000000..e08ea94
--- /dev/null
+++ b/core/src/proc.c
@@ -0,0 +1,244 @@
+/* Application, Process and Dataplane Manager
+ *
+ * This manager is used to manage application, process and thread.
+ * It gives one unique id for each application, process and dataplane thread.
+ *
+ * Author : Lu Qiuwen<[email protected]>
+ * Date : 2016-08-19
+ */
+
+#include <sys/queue.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <mr_common.h>
+#include <mr_ctx.h>
+
+#include <rte_ip_frag.h>
+#include <rte_rwlock.h>
+#include <mr_ctx.h>
+#include <assert.h>
+#include <string.h>
+
+enum proc_state
+{
+ MR_PROC_STATE_READY,
+ MR_PROC_STATE_RUN,
+ MR_PROC_STATE_SUSPEND
+};
+
+struct proc_info
+{
+ /* ��һ�� */
+ TAILQ_ENTRY(proc_info) next;
+ /* ���̱�ʶ�� */
+ char symbol[MR_SYMBOL_MAX];
+ /* ����߳��������������߳� */
+ process_id_t proc_id;
+ /* ȫ���߳���ţ���ʼ��ţ�����ҿ� */
+ thread_id_t gsid_start;
+ /* ȫ���߳���ţ���ֹ��ţ�����ҿ� */
+ thread_id_t gsid_end;
+ /* ����״̬ */
+ unsigned int state;
+ /* ����˽��Ctx */
+ void * proc_ctx;
+};
+
+TAILQ_HEAD(proc_info_list, proc_info);
+
+struct thread_info
+{
+ /* �߳������������ */
+ process_id_t prod_id;
+ /* �߳���� */
+ thread_id_t sid;
+ /* ȫ���߳���� */
+ thread_id_t gsid;
+};
+
+struct process_ctxs
+{
+ /* ��д�������Ʋ������� */
+ mr_spin_rwlock_t rwlock;
+ /* �����б� */
+ struct proc_info_list proc_info_list;
+ /* �ڲ�������� */
+ unsigned int nr_process;
+ /* ������ŷ��䣬��0��ʼ���� */
+ process_id_t pid_index;
+ /* ȫ���߳���ŷ��䣬��0��ʼ���� */
+ thread_id_t gsid_index;
+};
+
+static struct process_ctxs * __procman_module_ctx;
+
+int procman_init(struct mr_global_ctx * g_ctx, struct mr_config * g_cfg)
+{
+ g_ctx->process_ctxs = rte_zmalloc("PROCESS_CTXS",
+ sizeof(struct process_ctxs), 0);
+ MR_CHECK(g_ctx->process_ctxs != NULL, "Procman, PreConfig,"
+ "Cannot alloc memory for process ctxs in global ctx");
+
+ struct process_ctxs * pctxs = (struct process_ctxs *)g_ctx->process_ctxs;
+ assert(pctxs != NULL);
+
+ pctxs->pid_index = 0;
+ pctxs->nr_process = 0;
+ rte_rwlock_init(&pctxs->rwlock);
+
+ __procman_module_ctx = pctxs;
+ return 0;
+}
+
+int procman_attach(struct mr_global_ctx * g_ctx, struct mr_config * g_cfg)
+{
+ assert(g_ctx->process_ctxs != NULL);
+ __procman_module_ctx = g_ctx->process_ctxs;
+ return 0;
+}
+
+static int pinfo_list_insert(struct proc_info_list * plist,
+ struct proc_info * pinfo)
+{
+ TAILQ_INSERT_TAIL(plist, pinfo, next);
+ return 0;
+}
+
+static struct proc_info * pinfo_list_lookup(struct proc_info_list * plist,
+ const char * sym)
+{
+ struct proc_info * pinfo = NULL;
+ TAILQ_FOREACH(pinfo, plist, next)
+ {
+ if (strncmp(pinfo->symbol, sym, sizeof(pinfo->symbol)) == 0)
+ break;
+ }
+ return pinfo;
+}
+
+/* ����һ���µĽ��� */
+static int __process_new(struct process_ctxs * pctxs, const char * sym,
+ unsigned int nr_max_thread)
+{
+ struct proc_info * pinfo;
+ int ret = 0;
+ assert(__procman_module_ctx != NULL);
+
+ // ����
+ mr_spin_rwlock_write_lock(&__procman_module_ctx->rwlock);
+
+ // �������Ƿ��Ѿ�����
+ pinfo = pinfo_list_lookup(&pctxs->proc_info_list, sym);
+ if (pinfo != NULL)
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Process %s is already exists, failed. \n", sym);
+ ret = -1; goto errout;
+ }
+
+ // ���̲����ڣ������µ�������
+ pinfo = (struct proc_info *)rte_zmalloc(NULL, sizeof(struct proc_info), 0);
+ if(unlikely(pinfo == NULL))
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Cannot alloc memory for Process %s info.\n", sym);
+ ret = -2; goto errout;
+ }
+
+ // ������������Ŀռ�
+ struct mr_proc_ctx * proc_ctx;
+ proc_ctx = (struct mr_proc_ctx *)rte_zmalloc(NULL, sizeof(struct mr_proc_ctx), 0);
+ if(unlikely(proc_ctx == NULL))
+ {
+ MR_LOG(INFO, BASE, "Procman, ProcessNew, "
+ "Cannot alloc memory for Process %s Ctx Space.\n", sym);
+ ret = -3; goto errout;
+ }
+
+ // ��������Ϣ
+ snprintf(pinfo->symbol, sizeof(pinfo->symbol), "%s", sym);
+ pinfo->proc_id = pctxs->pid_index;
+ pinfo->gsid_start = pctxs->gsid_index;
+ pinfo->gsid_end = pctxs->gsid_index + nr_max_thread;
+ pinfo->proc_ctx = proc_ctx;
+ pinfo->state = MR_PROC_STATE_READY;
+
+ // �����������Ľṹ
+ proc_ctx->process_id = pinfo->proc_id;
+
+ // ���ӽ��̡��߳����
+ pctxs->pid_index++;
+ pctxs->gsid_index += nr_max_thread;
+
+ // �����������
+ TAILQ_INSERT_TAIL(&pctxs->proc_info_list, pinfo, next);
+ ret = 0; goto out;
+
+errout:
+ if (pinfo != NULL) rte_free(pinfo);
+ if (proc_ctx != NULL) rte_free(proc_ctx);
+ goto out;
+
+out:
+ mr_spin_rwlock_write_unlock(&__procman_module_ctx->rwlock);
+ return ret;
+}
+
+/* �������� */
+static int __process_run(struct process_ctxs * pctxs, struct proc_info * pinfo)
+{
+ return 0;
+}
+
+/* �����˳������������� */
+static int __process_suspend(struct process_ctxs * pctxs, struct proc_info * pinfo)
+{
+ return 0;
+}
+
+/* �����˳������������� */
+static int __process_exit(struct process_ctxs * pctxs)
+{
+ return 0;
+}
+
+static struct proc_info * __process_lookup_unsafe(struct process_ctxs * pctxs,
+ const char * sym)
+{
+ struct proc_info * pinfo_iter = NULL;
+ struct proc_info * pinfo_ret = NULL;
+ TAILQ_FOREACH(pinfo_iter, &pctxs->proc_info_list, next)
+ {
+ if(strncmp(pinfo_iter->symbol, sym, sizeof(pinfo_iter->symbol)) == 0)
+ {
+ pinfo_ret = pinfo_iter;
+ break;
+ }
+ }
+ return pinfo_ret;
+}
+
+
+/* �ڹ��������������� */
+int procman_process_create(const char * sym, unsigned int nr_wk_thread)
+{
+ struct process_ctxs * pctxs = __procman_module_ctx;
+ assert(pctxs != NULL);
+ return __process_new(pctxs, sym, nr_wk_thread);
+}
+
+int procman_process_lookup(const char * sym)
+{
+ return 0;
+}
+
+/* �ڽ��������������� */
+int procman_register_myself()
+{
+ return 0;
+}
+
+int procman_unregister_myself()
+{
+ return 0;
+} \ No newline at end of file
diff --git a/base/src/vnode.c b/core/src/vnode.c
index fbc6527..fbc6527 100644
--- a/base/src/vnode.c
+++ b/core/src/vnode.c
diff --git a/include/extern/mr_udp.h b/include/extern/mr_udp.h
index 057b510..c0bf858 100644
--- a/include/extern/mr_udp.h
+++ b/include/extern/mr_udp.h
@@ -1,4 +1,4 @@
-#pragma once
+#pragma once
#ifdef __cplusplus
extern "C" {
diff --git a/include/internal/common.h b/include/internal/common.h
index 03c427c..8419077 100644
--- a/include/internal/common.h
+++ b/include/internal/common.h
@@ -24,9 +24,3 @@
#define RTE_LOG_LEVEL RTE_LOG_INFO
#endif
-#ifdef _MSC_VER
-#define rte_cpu_to_be_16(x) htons(x)
-#define rte_be_to_cpu_32(x) ntohl(x)
-#define likely(x) x
-#define unlikely(x) x
-#endif \ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 96fd10b..9caa6dc 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -16,4 +16,12 @@ set(TEST_LINK_LIBRARIES ${DPDK_LIBRARY} gtest)
# TestCase 2
add_executable(TestHwInfo TestHwInfo.cc Unittest.cc)
-target_link_libraries(TestHwInfo ${TEST_LINK_LIBRARIES} base) \ No newline at end of file
+target_link_libraries(TestHwInfo ${TEST_LINK_LIBRARIES} base)
+
+# TestCase 3
+add_executable(TestMempool TestMempool.cc Unittest.cc)
+target_link_libraries(TestMempool ${TEST_LINK_LIBRARIES} base)
+
+# TestCase 4
+add_executable(TestVNode TestVNode.cc Unittest.cc)
+target_link_libraries(TestVNode ${TEST_LINK_LIBRARIES} base) \ No newline at end of file