summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--core/include/mr_rtdev.h14
-rw-r--r--core/src/rtdev.c80
-rw-r--r--include/mr_rawio.h3
-rw-r--r--pag/libpag.c104
-rw-r--r--slave/CMakeLists.txt2
-rw-r--r--slave/include/mrlib.h8
-rw-r--r--slave/include/mrlib_common.h17
-rw-r--r--slave/src/mrlib.c28
-rw-r--r--slave/src/rawio.c104
-rw-r--r--slave/src/rtdev.c100
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