diff options
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | core/include/mr_rtdev.h | 14 | ||||
| -rw-r--r-- | core/src/rtdev.c | 80 | ||||
| -rw-r--r-- | include/mr_rawio.h | 3 | ||||
| -rw-r--r-- | pag/libpag.c | 104 | ||||
| -rw-r--r-- | slave/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | slave/include/mrlib.h | 8 | ||||
| -rw-r--r-- | slave/include/mrlib_common.h | 17 | ||||
| -rw-r--r-- | slave/src/mrlib.c | 28 | ||||
| -rw-r--r-- | slave/src/rawio.c | 104 | ||||
| -rw-r--r-- | slave/src/rtdev.c | 100 |
11 files changed, 233 insertions, 229 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a6446ad..21f4e76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ add_subdirectory(${CMAKE_SOURCE_DIR}/core) 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}/examples) #add_subdirectory(${CMAKE_SOURCE_DIR}/tools) #add_subdirectory(${CMAKE_SOURCE_DIR}/test) add_subdirectory(${CMAKE_SOURCE_DIR}/conf) diff --git a/core/include/mr_rtdev.h b/core/include/mr_rtdev.h index 209f7c5..4752e33 100644 --- a/core/include/mr_rtdev.h +++ b/core/include/mr_rtdev.h @@ -1,5 +1,5 @@ -#pragma once
-
+#pragma once + /* \brief ����ʱ�����豸������ * * ����ʱ�����豸������Ϊ����ʱӦ�õ��豸��VNode�ڵ㽨����Ӧ��ϵ�� @@ -21,7 +21,7 @@ struct mr_rtdev_stream // ����һ������ʱ�����豸 int rt_device_serv_create(const char * devsym, const char * servsym, unsigned int nr_serv_thread, - unsigned int sz_tunnel, unsigned int sz_buffer);
+ unsigned int sz_tunnel, unsigned int sz_buffer); // ����һ������ʱ�����豸 int rt_device_serv_destory(const char * devsym); @@ -29,11 +29,15 @@ int rt_device_serv_destory(const char * devsym); // ���豸��ͨ����Slave������ʹ�� int rt_device_open(const char * devsym, const char * appsym, unsigned int nr_rxstream, unsigned int nr_txstream); -
+ // ���豸����ÿ���̵߳���һ�Σ���ȡ��ǰ�̵߳������������������ʹ�ã� struct mr_rtdev_stream * rt_dev_serv_open_stream(const char * devsym, const char * servsym); +#define RTDEV_FLAGS_OPEN_STREAM_RX ( 1UL << 0 ) +#define RTDEV_FLAGS_OPEN_STREAM_TX ( 1UL << 1 ) +#define RTDEV_FLAGS_OPEN_STREAM_ALL ( RTDEV_FLAGS_OPEN_STREAM_RX | RTDEV_FLAGS_OPEN_STREAM_TX ) + // ���豸����ÿ���̵߳���һ�Σ���ȡ��ǰ�̵߳��������� struct mr_rtdev_stream * rt_dev_open_stream(const char * devsym, - const char * appsym);
\ No newline at end of file + const char * appsym, flags_t flags);
\ No newline at end of file diff --git a/core/src/rtdev.c b/core/src/rtdev.c index b60d910..b9802a2 100644 --- a/core/src/rtdev.c +++ b/core/src/rtdev.c @@ -318,15 +318,17 @@ errout: // ���豸����ÿ���̵߳���һ�Σ���ȡ��ǰ�̵߳��������� -struct mr_rtdev_stream * rt_dev_open_stream(const char * devsym, - const char * appsym) +struct mr_rtdev_stream * rt_dev_open_stream(const char * devsym, + const char * appsym, flags_t flags) { char vnodesym[MR_STRING_MAX]; char prod_or_cons_sym[MR_STRING_MAX]; - - snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_RX, devsym); - snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_CONS_APP, appsym); + struct vnodeman_attach_desc * attach_rxd = NULL; + struct vnodeman_attach_desc * attach_txd = NULL; + struct vnodeman_attach_desc * attach_ftxd = NULL; + + // �����������ռ� struct mr_rtdev_stream * rtdev_stream; rtdev_stream = rte_zmalloc(NULL, sizeof(struct mr_rtdev_stream), 0); if(unlikely(rtdev_stream == NULL)) @@ -336,40 +338,48 @@ struct mr_rtdev_stream * rt_dev_open_stream(const char * devsym, goto errout; } - struct vnodeman_attach_desc * attach_rxd; - attach_rxd = mr_vnodeman_consumer_attach(vnodesym, prod_or_cons_sym); - if (unlikely(attach_rxd == NULL)) + // ���������ձ��� + if (flags & RTDEV_FLAGS_OPEN_STREAM_RX) { - MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " - "Cannot attach vnode(sym=%s) consumer=(%s). \n", - vnodesym, prod_or_cons_sym); - goto errout; + snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_RX, devsym); + snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_CONS_APP, appsym); + + attach_rxd = mr_vnodeman_consumer_attach(vnodesym, prod_or_cons_sym); + if (unlikely(attach_rxd == NULL)) + { + MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " + "Cannot attach vnode(sym=%s) consumer=(%s). \n", + vnodesym, prod_or_cons_sym); + goto errout; + } } - snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_TX, devsym); - snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_PROD_APP, appsym); - - struct vnodeman_attach_desc * attach_txd; - attach_txd = mr_vnodeman_producer_attach(vnodesym, prod_or_cons_sym); - if(unlikely(attach_txd == NULL)) + // �������������� + if (flags & RTDEV_FLAGS_OPEN_STREAM_TX) { - MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " - "Cannot attach vnode(sym=%s) producer=(%s). \n", - vnodesym, prod_or_cons_sym); - goto errout; - } - - snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_FTX, devsym); - snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_PROD_APP, appsym); - - struct vnodeman_attach_desc * attach_ftxd; - attach_ftxd = mr_vnodeman_producer_attach(vnodesym, prod_or_cons_sym); - if (unlikely(attach_ftxd == NULL)) - { - MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " - "Cannot attach vnode(sym=%s) producer=(%s). \n", - vnodesym, prod_or_cons_sym); - goto errout; + snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_TX, devsym); + snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_PROD_APP, appsym); + + attach_txd = mr_vnodeman_producer_attach(vnodesym, prod_or_cons_sym); + if (unlikely(attach_txd == NULL)) + { + MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " + "Cannot attach vnode(sym=%s) producer=(%s). \n", + vnodesym, prod_or_cons_sym); + goto errout; + } + + snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_FTX, devsym); + snprintf(prod_or_cons_sym, sizeof(prod_or_cons_sym), __PATTERN_PROD_APP, appsym); + + attach_ftxd = mr_vnodeman_producer_attach(vnodesym, prod_or_cons_sym); + if (unlikely(attach_ftxd == NULL)) + { + MR_LOG(WARNING, BASE, "Rtdevice, RtdeviceOpen, " + "Cannot attach vnode(sym=%s) producer=(%s). \n", + vnodesym, prod_or_cons_sym); + goto errout; + } } rtdev_stream->rxd = attach_rxd; diff --git a/include/mr_rawio.h b/include/mr_rawio.h index 0679d1b..390fbe7 100644 --- a/include/mr_rawio.h +++ b/include/mr_rawio.h @@ -15,7 +15,8 @@ extern "C" { /* Basic Raw Packet I/O Interface */ typedef void * raw_socket_t; -raw_socket_t * marsio_raw_socket(const char * dev); +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(raw_socket_t * socket, struct rte_mbuf * mbufs[], int nr_max_mbufs); int marsio_raw_send(raw_socket_t * socket, struct rte_mbuf * mbufs[], int nr_mbufs); diff --git a/pag/libpag.c b/pag/libpag.c index 200a8d8..1af1902 100644 --- a/pag/libpag.c +++ b/pag/libpag.c @@ -14,6 +14,7 @@ #include <mr_rawio.h>
#include <mr_stat.h>
#include <mrlib.h>
+#include <mr_mask.h>
#include "libpag.h"
struct pag_instance
@@ -22,8 +23,11 @@ struct pag_instance char dev_name[MR_STRING_MAX];
raw_socket_t * raw_sockets[MR_DEVICE_MAX];
unsigned int nr_raw_sockets;
+ unsigned int nr_rx_stream;
+ unsigned int nr_tx_stream;
unsigned int burst_rx;
unsigned int burst_tx;
+ uint64_t coremask;
};
struct pag_thread_instance
@@ -57,7 +61,63 @@ do { \ #define PAG_DEFAULT_RX_BURST 32
#define PAG_DEFAULT_TX_BURST 32
-static int __read_burst_info(struct pag_instance * instance)
+static int pag_config_load_app_info(struct pag_instance * instance)
+{
+ int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "app_name",
+ instance->app_name, sizeof(instance->app_name));
+
+ if (ret < 0)
+ {
+ PAG_LOG("load pag.conf failed(section=pag, key=app_name).");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int pag_config_load_stream_info(struct pag_instance * instance)
+{
+ uint64_t coremask = 0;
+ char str_coremask[MR_STRING_MAX];
+ char * str_coremask_ptr;
+
+ // ��CPU��������
+ int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "coremask",
+ str_coremask, sizeof(str_coremask));
+
+ if(ret < 0)
+ {
+ PAG_LOG("coremask is missing, please recheck %s", PAG_CFGFILE);
+ return -1;
+ }
+
+ ret = strtoull(str_coremask, &str_coremask_ptr, 0);
+ if(ret == 0 && str_coremask_ptr == NULL)
+ {
+ PAG_LOG("coremask is invalid, please recheck %s", PAG_CFGFILE);
+ return -2;
+ }
+
+ // ��Ĭ���豸������û��ָ��ʹ���߳���
+ unsigned int nr_rx_stream;
+ unsigned int nr_tx_stream;
+ unsigned int nr_stream_default = mask_popcnt(coremask);
+
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "rxstream",
+ &nr_rx_stream, nr_stream_default);
+ MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "txstream",
+ &nr_tx_stream, nr_stream_default);
+
+ instance->coremask = coremask;
+ instance->nr_rx_stream = nr_rx_stream;
+ instance->nr_tx_stream = nr_tx_stream;
+
+ PAG_LOG("coremask=%"PRIx64", rxstream=%u, txstream=%u", instance->coremask,
+ instance->nr_rx_stream, instance->nr_tx_stream);
+ return 0;
+}
+
+static int pag_config_load_burst_info(struct pag_instance * instance)
{
MESA_load_profile_uint_def(PAG_CFGFILE, "pag", "burst_rx", &instance->burst_rx,
PAG_DEFAULT_RX_BURST);
@@ -108,7 +168,9 @@ static int __open_all_device(struct pag_instance * instance) for (int i = 0; i < nr_devices; i++)
{
- raw_socket_t * socket = marsio_raw_socket(str_devices[i]);
+ raw_socket_t * socket = marsio_raw_socket(str_devices[i],
+ instance->nr_rx_stream, instance->nr_tx_stream, 0);
+
if (socket == NULL)
{
PAG_LOG("cannot open device %s.\n", str_devices[i]);
@@ -130,35 +192,44 @@ static int pag_thread_init(struct pag_instance * instance, if (likely(tinstance->thread_inited != 0))
return 0;
- mrlib_thread_init();
+ marsio_thread_init();
tinstance->rxmbuf_max = instance->burst_rx;
tinstance->txmbuf_max = instance->burst_tx;
tinstance->thread_inited = 1;
return 0;
}
-int pag_open()
+static int pag_config(struct pag_instance * instance)
{
- if (__pag_inited != 0) return 0;
-
- struct pag_instance * instance = &pag_config_;
-
if (access(PAG_CFGFILE, R_OK) != 0)
{
PAG_LOG("load pag.conf failed, pag.conf doesnot existed.");
return -1;
}
+
+ int ret = pag_config_load_app_info(instance);
+ if (ret < 0) return ret;
+ ret = pag_config_load_burst_info(instance);
+ if (ret < 0) return ret;
+ ret = pag_config_load_stream_info(instance);
+ if (ret < 0) return ret;
+ return 0;
+}
- int ret = MESA_load_profile_string_nodef(PAG_CFGFILE, "pag", "app_name",
- instance->app_name, sizeof(instance->app_name));
+int pag_open()
+{
+ if (__pag_inited != 0) return 0;
+ struct pag_instance * instance = &pag_config_;
+
+ int ret = pag_config(instance);
if(ret < 0)
{
- PAG_LOG("load pag.conf failed(section=pag, key=app_name).");
- return -2;
+ PAG_LOG("load configure failed.");
+ return -1;
}
- ret = mrlib_init(instance->app_name, stderr);
+ ret = marsio_init(instance->app_name, instance->coremask, stderr);
if(ret < 0)
{
PAG_LOG("marsio library init failed(ret=%d).", ret);
@@ -172,13 +243,6 @@ int pag_open() return -4;
}
- ret = __read_burst_info(instance);
- if(ret < 0)
- {
- PAG_LOG("burst info load failed(ret=%d)", ret);
- return -5;
- }
-
__pag_inited = 1;
return 0;
}
diff --git a/slave/CMakeLists.txt b/slave/CMakeLists.txt index 1ff394b..4a1a000 100644 --- a/slave/CMakeLists.txt +++ b/slave/CMakeLists.txt @@ -6,7 +6,7 @@ include_directories(${DPDK_INCLUDE_DIR}) include_directories(include)
add_definitions(${DPDK_C_PREDEFINED})
-add_library(marsio src/mrlib.c src/rawio.c src/rtdev.c)
+add_library(marsio src/mrlib.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 diff --git a/slave/include/mrlib.h b/slave/include/mrlib.h index 03d41de..e8b0a4d 100644 --- a/slave/include/mrlib.h +++ b/slave/include/mrlib.h @@ -5,9 +5,11 @@ extern "C" { #endif
#include <stdio.h>
-int mrlib_init(const char * progsym, FILE * logstream);
-int mrlib_destory();
-int mrlib_thread_init();
+
+int marsio_init(const char * appsym, uint64_t coremask, FILE * logstream);
+int marsio_thread_init();
+int marsio_destory();
+
extern struct mrlib_instance * instance;
#ifdef __cplusplus
diff --git a/slave/include/mrlib_common.h b/slave/include/mrlib_common.h index c1a74d6..cf40e55 100644 --- a/slave/include/mrlib_common.h +++ b/slave/include/mrlib_common.h @@ -3,13 +3,6 @@ #include <mr_common.h> #include <mr_device.h> -struct mrlib_rt_device -{ - mr_dev_t * dev; - struct vnodeman_attach_desc * rxvnode_desc[MR_SID_MAX]; - struct vnodeman_attach_desc * txvnode_desc[MR_SID_MAX]; -}; - struct mrlib_instance { char progsym[MR_SYMBOL_MAX]; @@ -17,16 +10,6 @@ struct mrlib_instance struct mrlib_rt_device * rt_device; }; -/* ȡVNode�ڵ㣬RXVnode�ڵ�attach���� */ -struct vnodeman_attach_desc * rtdev_attach_rxvnode( - const char * appsym, const char * devsym); - -/* ȡVNode�ڵ㣬TXVnode�ڵ�attach���� */ -struct vnodeman_attach_desc * rtdev_attach_txvnode( - const char * appsym, const char * devsym); - -struct mrlib_rt_device * rtdev_lookup(struct mrlib_instance * instance, const char * devsym); - /* ��־λ���Ƿ��Ѿ������˳�ʼ��*/ extern int __mrlib_inited; /* ��־λ�����߳��Ƿ��Ѿ������˳�ʼ�� */ diff --git a/slave/src/mrlib.c b/slave/src/mrlib.c index df39a79..dc850b6 100644 --- a/slave/src/mrlib.c +++ b/slave/src/mrlib.c @@ -6,8 +6,8 @@ #include <mr_core.h> #include <mrlib.h> #include <mrlib_common.h> -#include <rte_ip_frag.h> -#include "mr_runtime.h" +#include <rte_malloc.h> +#include <mr_runtime.h> /* ��־λ���Ƿ��Ѿ������˳�ʼ��*/ int __mrlib_inited = 0; @@ -57,12 +57,12 @@ static void mrlib_slave_log_ready(FILE * logstream) rte_openlog_stream(stderr); } -static int mrlib_slave_procinfo_ready(const char * progsym) +static int mrlib_slave_appinfo_register(const char * progsym, uint64_t coremask) { - int ret = 0; - + // ��������ʱ���� + mr_runtime_slave_init(); // ע�ᵱǰ������Ϣ - ret = mr_app_manager_appinfo_register(progsym, 0); + int ret = mr_app_manager_appinfo_register(progsym, 0); if(ret < 0) { MR_LOG(ERR, MRLIB, "Mrlib, SlaveProcInfoReady, " @@ -73,17 +73,13 @@ static int mrlib_slave_procinfo_ready(const char * progsym) MR_LOG(INFO, MRLIB, "Mrlib, SlaveProcInfoReady, " "Process %s register success. \n", progsym); - // ע�����˽��ʵ�� - mr_app_priv_set(instance); - // ע����Ŀ��Slave��� struct mr_global_ctx * g_ctx = mr_global_ctx_get(); mr_core_default_instance_set(g_ctx->ctx_core); - return 0; } -static int mrlib_slave_instance_ready(const char * progsym) +static int mrlib_slave_instance_init(const char * progsym) { // ������̵�Privָ�벻Ϊ�գ�˵����ǰ���й����ָ������� if (mr_app_priv_get() != NULL) @@ -101,19 +97,19 @@ static int mrlib_slave_instance_ready(const char * progsym) "%s", progsym); instance = _instance; + mr_app_priv_set(instance); return 0; } -int mrlib_init(const char * progsym, FILE * logstream) +int marsio_init(const char * appsym, uint64_t coremask, FILE * logstream) { int ret = 0; mrlib_stage_eal_init(); mrlib_slave_log_ready(logstream); - mr_runtime_slave_init(); - - ret = mrlib_slave_procinfo_ready(progsym); + + ret = mrlib_slave_appinfo_register(appsym, coremask); if (ret < 0) return ret; - ret = mrlib_slave_instance_ready(progsym); + ret = mrlib_slave_instance_init(appsym); if (ret < 0) return ret; ret = rtdev_slave_init(instance); if (ret < 0) return ret; diff --git a/slave/src/rawio.c b/slave/src/rawio.c index cfb4d46..86d58f7 100644 --- a/slave/src/rawio.c +++ b/slave/src/rawio.c @@ -2,54 +2,98 @@ #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 <mrlib.h>
-#include "mr_stat.h"
+#include <mr_rtdev.h>
-raw_socket_t * marsio_raw_socket(const char * dev)
+extern struct mrlib_instance * instance;
+
+struct __raw_socket
+{
+ // �豸������
+ char devsym[MR_SYMBOL_MAX];
+ // Raw�ӿڶ������߳���
+ unsigned int nr_rxstream;
+ // Raw�ӿ�д�����߳���
+ unsigned int nr_txstream;
+ // ����ʱ�豸�����������ձ��IJࣩ
+ struct mr_rtdev_stream * rx_rt_streams[MR_SID_MAX];
+ // ����ʱ�豸���������������IJࣩ
+ struct mr_rtdev_stream * tx_rt_streams[MR_SID_MAX];
+};
+
+raw_socket_t * marsio_raw_socket(const char * devsym, unsigned int nr_rx_stream,
+ unsigned int nr_tx_stream, unsigned int flags __rte_unused)
{
- if (instance == NULL || instance->rt_device == NULL) return NULL;
- return (raw_socket_t *)rtdev_lookup(instance, dev);
+ // ����Socket�Ŀռ�
+ // TODO: ����Ŀռ��Ƿ���Ҫ��¼��Ŀǰ��ʵ�������û����Ծ��ͷ�
+ struct __raw_socket * socket = rte_zmalloc(NULL, sizeof(struct __raw_socket), 0);
+ if(unlikely(socket == NULL))
+ {
+ MR_LOG(ERR, MRLIB, "MarsioRawSocket, Cannot alloc memory for socket"
+ "(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;
+
+ // ������ʱ�豸
+ int ret = rt_device_open(devsym, instance->progsym, nr_rx_stream, nr_tx_stream);
+ if(unlikely(ret < 0))
+ {
+ 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;
+ }
+
+ return (raw_socket_t *)socket;
+
+errout:
+ if (socket != NULL) rte_free(socket);
+ return NULL;
+}
+
+int marsio_raw_close(raw_socket_t * socket)
+{
+ return 0;
}
int marsio_raw_recv(raw_socket_t * socket, struct rte_mbuf * mbufs[], int nr_max_mbufs)
{
unsigned int sid = mr_thread_id();
- struct mrlib_rt_device * rt_device = (struct mrlib_rt_device *)socket;
+ struct __raw_socket * _socket = (struct __raw_socket *)socket;
- // �鿴��ǰ��Rxdesc�Ƿ����
- if (unlikely(rt_device->rxvnode_desc[sid] == NULL))
- {
- rt_device->rxvnode_desc[sid] = rtdev_attach_rxvnode(
- instance->progsym, rt_device->dev->symbol);
+ // �жϵ�ǰ�̶߳�Ӧ���ձ����豸���Ƿ�����û����Ҫ��
+ if(unlikely(_socket->rx_rt_streams[sid] == NULL))
+ {
+ // ������ʱ�豸���ձ�����
+ struct mr_rtdev_stream * stream = rt_dev_open_stream(_socket->devsym,
+ instance->progsym, RTDEV_FLAGS_OPEN_STREAM_RX);
+
+ // ��ʧ��
+ if(unlikely(stream == NULL))
+ {
+ MR_LOG(ERR, MRLIB, "MarsioRawRecv, Cannot open rt-device %s rxstream. \n",
+ _socket->devsym);
+ return -1;
+ }
}
- // ����֮���ټ�飬������ǿ�˵�������߳����ձ�
- if(unlikely(rt_device->rxvnode_desc[sid] == NULL))
- {
- MR_LOG(ERR, MRLIB, "Mrlib, MarsioRawRecv, "
- "Attach currect device %s failed, check rxstream in configure file\n",
- rt_device->dev->symbol);
- return -2;
- }
-
- // ��Vnode����ȡ����
struct vnodeman_attach_desc * attach_desc;
- attach_desc = rt_device->rxvnode_desc[sid];
+ attach_desc = _socket->rx_rt_streams[sid]->rxd;
+ // ��Vnode����ȡ����
int ret = vnode_dequeue_burst(attach_desc->cons, &vnodeman_ops,
attach_desc->queue_id, (void **)mbufs, nr_max_mbufs);
UPDATE_APP_STAT(rx_frame, ret);
UPDATE_APP_STAT(rx_byte, pktslen(mbufs, ret));
-
- // ���Ϸ���
-#ifndef NDEBUG
- for (int i = 0; i < ret; i++)
- {
- rte_mbuf_sanity_check(mbufs[i], 1);
- }
-#endif
return ret;
}
diff --git a/slave/src/rtdev.c b/slave/src/rtdev.c deleted file mode 100644 index 6424062..0000000 --- a/slave/src/rtdev.c +++ /dev/null @@ -1,100 +0,0 @@ - -/* ����ʱ�豸����������Slave�ϻ���VNode�������豸������ - * Author : Qiuwen Lu - * Date : 2016-09-09 - */ - -#include <rte_malloc.h> -#include <mr_device.h> -#include <mr_vman.h> -#include <mrlib.h> -#include <mrlib_common.h> -#include <assert.h> - - -#define MRLIB_MAX_RTDEVICE RTE_MAX_ETHPORTS - -#define __PATTERN_DEV_RX "%s-RX" -#define __PATTERN_DEV_TX "%s-TX" -#define __PATTERN_PROC_SERVICE "%s" -#define __PATTERN_CONS_SERVICE "%s" -#define __PATTERN_PROD_APP "%s" -#define __PATTERN_CONS_APP "%s" - -/* ȡVNode�ڵ㣬RXVnode�ڵ�attach���� */ -struct vnodeman_attach_desc * rtdev_attach_rxvnode( - const char * appsym, const char * devsym) -{ - struct vnodeman_attach_desc * desc; - char vnodesym[MR_SYMBOL_MAX]; - char conssym[MR_SYMBOL_MAX]; - - snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_RX, devsym); - snprintf(conssym, sizeof(conssym), __PATTERN_CONS_APP, appsym); - desc = mr_vnodeman_consumer_attach(vnodesym, conssym); - return desc; -} - -/* ȡVNode�ڵ㣬TXVnode�ڵ�attach���� */ -struct vnodeman_attach_desc * rtdev_attach_txvnode( - const char * appsym, const char * devsym) -{ - struct vnodeman_attach_desc * desc; - char vnodesym[MR_SYMBOL_MAX]; - char prodsym[MR_SYMBOL_MAX]; - - snprintf(vnodesym, sizeof(vnodesym), __PATTERN_DEV_TX, devsym); - snprintf(prodsym, sizeof(prodsym), __PATTERN_PROD_APP, appsym); - desc = mr_vnodeman_producer_attach(vnodesym, prodsym); - return desc; -} - -int rtdev_slave_init(struct mrlib_instance * instance) -{ - if (instance->rt_device != NULL) return 0; - - // ���ȫ�����õ��豸���� - mr_dev_t * devlist[MRLIB_MAX_RTDEVICE]; - int nr_devlist = mr_device_list(devlist, MRLIB_MAX_RTDEVICE, 0); - assert(nr_devlist >= 0); - - // ����RTDevice�ڴ�Ŀռ� - instance->rt_device = rte_zmalloc(NULL, sizeof(struct mrlib_rt_device) * - nr_devlist, 0); - instance->nr_rt_device = nr_devlist; - - for (int i = 0; i < nr_devlist; i++) - { - instance->rt_device[i].dev = devlist[i]; - } - - return 0; -} - -int rtdev_lookup_id(struct mrlib_instance * instance, const char * devsym) -{ - if (unlikely(instance->rt_device == NULL)) - { - MR_LOG(WARNING, MRLIB, "MrLib, RtDevLookup, " - "RtDevice handle is null, failed.\n"); - return -1; - } - - for (int i = 0; i < instance->nr_rt_device; i++) - { - struct mrlib_rt_device * rt_dev; - rt_dev = &instance->rt_device[i]; - - if (strncmp(rt_dev->dev->symbol, devsym, sizeof(rt_dev->dev->symbol)) == 0) - return i; - } - - return -2; -} - -struct mrlib_rt_device * rtdev_lookup(struct mrlib_instance * instance, const char * devsym) -{ - int rtdev_id = rtdev_lookup_id(instance, devsym); - if (rtdev_id < 0) return NULL; - return &instance->rt_device[rtdev_id]; -}
\ No newline at end of file |
