summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2020-10-29 11:34:03 +0800
committerQiuwen Lu <[email protected]>2020-10-29 11:34:03 +0800
commit7c7332220eadbb1ec434ffa119e5de975f094ce6 (patch)
tree0fb049187194ab3ec71202a0a9bf83c3f2633104
parent75539b61da9bf85a24234d2b34c01175aecd6d49 (diff)
增加读取、设置报文METADATA的接口及对应的实现。v4.3.29-20201029
-rw-r--r--.clang-format2
-rw-r--r--app/src/marsio.c8
-rw-r--r--app/src/mrb.c708
-rw-r--r--app/src/version.map4
-rw-r--r--include/external/marsio.h180
-rw-r--r--service/src/core.c8
6 files changed, 478 insertions, 432 deletions
diff --git a/.clang-format b/.clang-format
index c66fefb..b62acb3 100644
--- a/.clang-format
+++ b/.clang-format
@@ -9,7 +9,7 @@ AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
-AllowShortFunctionsOnASingleLine: All
+AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: Always
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: true
diff --git a/app/src/marsio.c b/app/src/marsio.c
index 32d9a74..a01ddf5 100644
--- a/app/src/marsio.c
+++ b/app/src/marsio.c
@@ -137,6 +137,14 @@ static void mrapp_eal_init(struct mr_instance * instance)
WRITE_ARG(str_virtaddr);
}
+ unsigned int en_no_huge = 0;
+ MESA_load_profile_uint_def(instance->g_cfgfile_path, "eal", "nohuge", &en_no_huge, 0);
+
+ if (en_no_huge > 0)
+ {
+ WRITE_ARG("--no-huge");
+ }
+
// DPDK和SYSTEMD的日志级别差1
unsigned int loglevel = g_logger_level + 1;
MESA_load_profile_uint_def(instance->g_cfgfile_path, "eal", "loglevel",
diff --git a/app/src/mrb.c b/app/src/mrb.c
index f990e3f..f60127f 100644
--- a/app/src/mrb.c
+++ b/app/src/mrb.c
@@ -1,62 +1,61 @@
-#include <rte_common.h>
-#include <rte_mbuf.h>
-#include <rte_malloc.h>
#include <assert.h>
#include <marsio.h>
#include <mrapp.h>
#include <mrb_define.h>
#include <protect.h>
+#include <rte_common.h>
+#include <rte_malloc.h>
+#include <rte_mbuf.h>
-void * marsio_buff_ctrlzone(marsio_buff_t *mr_buff, uint8_t id)
+void *marsio_buff_ctrlzone(marsio_buff_t *mr_buff, uint8_t id)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)mr_buff);
- struct mrb_zone_idx* cz = mrbuf_cz(mr_buff, id);
- assert(id < mrbuf_cz_num(mr_buff));
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) mr_buff);
+ struct mrb_zone_idx *cz = mrbuf_cz(mr_buff, id);
+ assert(id < mrbuf_cz_num(mr_buff));
- void * ctrl_addr = mrbuf_cz_data(mr_buff, id);
- unsigned int ctrl_len = cz->size;
+ void *ctrl_addr = mrbuf_cz_data(mr_buff, id);
+ unsigned int ctrl_len = cz->size;
- MR_ASAN_UNPOISON_MEMORY_REGION(ctrl_addr, ctrl_len);
- return ctrl_addr;
+ MR_ASAN_UNPOISON_MEMORY_REGION(ctrl_addr, ctrl_len);
+ return ctrl_addr;
}
-void * marsio_buff_ctrlzone_data(marsio_buff_t *mr_buff, uint8_t id, uint8_t *size)
+void *marsio_buff_ctrlzone_data(marsio_buff_t *mr_buff, uint8_t id, uint8_t *size)
{
- struct mrb_zone_idx* cz = mrbuf_cz(mr_buff, id);
- assert(id < mrbuf_cz_num(mr_buff));
- *size = cz->size;
- return mrbuf_cz_data(mr_buff, id);
+ struct mrb_zone_idx *cz = mrbuf_cz(mr_buff, id);
+ assert(id < mrbuf_cz_num(mr_buff));
+ *size = cz->size;
+ return mrbuf_cz_data(mr_buff, id);
}
-void marsio_buff_ctrlzone_set(marsio_buff_t *mr_buff, uint8_t id, void* ptr_data, uint8_t size)
+void marsio_buff_ctrlzone_set(marsio_buff_t *mr_buff, uint8_t id, void *ptr_data, uint8_t size)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)mr_buff);
- struct mrb_zone_idx* cz = mrbuf_cz(mr_buff, id);
- RTE_SET_USED(cz);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) mr_buff);
+ struct mrb_zone_idx *cz = mrbuf_cz(mr_buff, id);
+ RTE_SET_USED(cz);
- assert(id < mrbuf_cz_num(mr_buff));
- assert(size <= cz->size);
+ assert(id < mrbuf_cz_num(mr_buff));
+ assert(size <= cz->size);
- MR_ASAN_UNPOISON_MEMORY_REGION(mrbuf_cz_data(mr_buff, id), cz->size);
- memcpy(mrbuf_cz_data(mr_buff, id), ptr_data, size);
+ MR_ASAN_UNPOISON_MEMORY_REGION(mrbuf_cz_data(mr_buff, id), cz->size);
+ memcpy(mrbuf_cz_data(mr_buff, id), ptr_data, size);
}
-void * mr_buffer_ctrlzone(struct rte_mbuf * mr_buff, uint8_t id)
+void *mr_buffer_ctrlzone(struct rte_mbuf *mr_buff, uint8_t id)
{
assert(id < mrbuf_cz_num(mr_buff));
- struct mrb_zone_idx* cz = mrbuf_cz(mr_buff, id);
+ struct mrb_zone_idx *cz = mrbuf_cz(mr_buff, id);
- MR_ASAN_UNPOISON_MEMORY_REGION(mrbuf_cz_data(mr_buff, id), cz->size);
+ MR_ASAN_UNPOISON_MEMORY_REGION(mrbuf_cz_data(mr_buff, id), cz->size);
return mrbuf_cz_data(mr_buff, id);
}
-int marsio_buff_malloc_device(struct mr_vdev * vdev, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id)
+int marsio_buff_malloc_device(
+ struct mr_vdev *vdev, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
{
- int ret = PROTECT_rte_pktmbuf_alloc_bulk(vdev->vdi->direct_pool,
- (struct rte_mbuf **)marsio_buff, nr_mbufs);
+ int ret = PROTECT_rte_pktmbuf_alloc_bulk(vdev->vdi->direct_pool, (struct rte_mbuf **) marsio_buff, nr_mbufs);
#ifndef NDEBUG
@@ -72,501 +71,486 @@ int marsio_buff_malloc_device(struct mr_vdev * vdev, marsio_buff_t *marsio_buff[
}
#endif
-
- if(unlikely(ret < 0)) return ret;
- for(int i = 0; i < nr_mbufs; i++)
- marsio_buff_reset(marsio_buff[i]);
+ if (unlikely(ret < 0)) return ret;
+
+ for (int i = 0; i < nr_mbufs; i++) marsio_buff_reset(marsio_buff[i]);
thread_id = thread_info.thread_id;
vdev->instance->stat[thread_id].mbuf_alloc_count += nr_mbufs;
return ret;
}
-int marsio_buff_malloc_global(struct mr_instance * instance, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id)
+int marsio_buff_malloc_global(
+ struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
{
- struct mr_vdev * vdev = &instance->vdevs[thread_id % instance->nr_vdevs];
+ struct mr_vdev *vdev = &instance->vdevs[thread_id % instance->nr_vdevs];
return marsio_buff_malloc_device(vdev, marsio_buff, nr_mbufs, socket_id, thread_id);
}
-void marsio_buff_free(struct mr_instance * instance, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id)
+void marsio_buff_free(
+ struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id)
{
- for (int i = 0; i < nr_mbufs; i++)
- {
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)marsio_buff[i]);
- mrbuf_priv(marsio_buff[i])->next = NULL;
- PROTECT_rte_pktmbuf_free((struct rte_mbuf *)marsio_buff[i]);
- }
+ for (int i = 0; i < nr_mbufs; i++)
+ {
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) marsio_buff[i]);
+ mrbuf_priv(marsio_buff[i])->next = NULL;
+ PROTECT_rte_pktmbuf_free((struct rte_mbuf *) marsio_buff[i]);
+ }
thread_id = thread_info.thread_id;
instance->stat[thread_id].mbuf_free_count += nr_mbufs;
- return;
+ return;
}
void marsio_buff_append_pkt(marsio_buff_t *head, marsio_buff_t *next)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)head);
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) head);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) next);
- marsio_buff_t *p = head;
- while (mrbuf_priv(p)->next != NULL)
- {
- p = mrbuf_priv(p)->next;
- }
- mrbuf_priv(p)->next = next;
+ marsio_buff_t *p = head;
+ while (mrbuf_priv(p)->next != NULL)
+ {
+ p = mrbuf_priv(p)->next;
+ }
+ mrbuf_priv(p)->next = next;
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)head);
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) head);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) next);
}
void marsio_buff_append_seg(marsio_buff_t *head, marsio_buff_t *next)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)head);
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) head);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) next);
- rte_pktmbuf_chain((struct rte_mbuf *)head, (struct rte_mbuf *)next);
+ rte_pktmbuf_chain((struct rte_mbuf *) head, (struct rte_mbuf *) next);
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)head);
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) head);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) next);
}
marsio_buff_t *marsio_buff_getnext_seg(marsio_buff_t *m)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)m);
- return (marsio_buff_t *)(((struct rte_mbuf*)m)->next);
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)m);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) m);
+ return (marsio_buff_t *) (((struct rte_mbuf *) m)->next);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) m);
}
marsio_buff_t *marsio_buff_getnext_pkt(marsio_buff_t *m)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)m);
- return mrbuf_priv(m)->next;
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)m);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) m);
+ return mrbuf_priv(m)->next;
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) m);
}
-void marsio_buff_chain_pkt(marsio_buff_t * pkt, marsio_buff_t * next)
+void marsio_buff_chain_pkt(marsio_buff_t *pkt, marsio_buff_t *next)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)pkt);
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) pkt);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) next);
mrbuf_priv(pkt)->next = next;
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)pkt);
- PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *)next);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) pkt);
+ PROTECT_rte_mbuf_poison_meta((struct rte_mbuf *) next);
}
void marsio_buff_reset(marsio_buff_t *m)
{
- PROTECT_rte_mbuf_unpoison_meta(m);
- struct mrb_priv_zone* priv_zone = mrbuf_priv(m);
- struct mrb_zone_idx* cz_first = NULL, *cz_last = NULL;
-
+ PROTECT_rte_mbuf_unpoison_meta(m);
+ struct mrb_priv_zone *priv_zone = mrbuf_priv(m);
+ struct mrb_zone_idx *cz_first = NULL, *cz_last = NULL;
+
/* 引用计数检查,修改报文时,不应该被其他的地方引用 */
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
-
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+
/* 断言,调试模式直接抛出异常,非调试模式返回 */
assert(rte_mbuf_refcnt_read(__mbuf) == 1);
if (unlikely(rte_mbuf_refcnt_read(__mbuf) != 1)) return;
- rte_pktmbuf_reset((struct rte_mbuf *)m);
- priv_zone->next = NULL;
- if (mrbuf_cz_num(m) > 0)
- {
- cz_first = mrbuf_cz(m, 0);
- cz_last = mrbuf_cz(m, mrbuf_cz_num(m) - 1);
- memset(mrbuf_cz_data(m, 0), 0, cz_last->offset + cz_last->size - cz_first->offset);
- }
+ rte_pktmbuf_reset((struct rte_mbuf *) m);
+ priv_zone->next = NULL;
+ if (mrbuf_cz_num(m) > 0)
+ {
+ cz_first = mrbuf_cz(m, 0);
+ cz_last = mrbuf_cz(m, mrbuf_cz_num(m) - 1);
+ memset(mrbuf_cz_data(m, 0), 0, cz_last->offset + cz_last->size - cz_first->offset);
+ }
- PROTECT_rte_mbuf_poison_meta(m);
+ PROTECT_rte_mbuf_poison_meta(m);
}
char *marsio_buff_mtod(marsio_buff_t *m)
{
- PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *)m);
- PROTECT_rte_mbuf_unpoison_data((struct rte_mbuf *)m);
- return rte_pktmbuf_mtod((struct rte_mbuf *)m, char *);
+ PROTECT_rte_mbuf_unpoison_meta((struct rte_mbuf *) m);
+ PROTECT_rte_mbuf_unpoison_data((struct rte_mbuf *) m);
+ return rte_pktmbuf_mtod((struct rte_mbuf *) m, char *);
}
uint32_t marsio_buff_buflen(marsio_buff_t *m)
{
- return PROTECT_rte_pktmbuf_pkt_len((struct rte_mbuf *)m);
+ return PROTECT_rte_pktmbuf_pkt_len((struct rte_mbuf *) m);
}
uint32_t marsio_buff_datalen(marsio_buff_t *m)
{
- return PROTECT_rte_pktmbuf_data_len((struct rte_mbuf *)m);
+ return PROTECT_rte_pktmbuf_data_len((struct rte_mbuf *) m);
}
-struct rte_mbuf * __pktmbuf_alloc(struct mr_instance * instance, int socket_id, int thread_id)
+struct rte_mbuf *__pktmbuf_alloc(struct mr_instance *instance, int socket_id, int thread_id)
{
- struct rte_mbuf * __mbuf = NULL;
- marsio_buff_malloc_global(instance, (marsio_buff_t **)&__mbuf, 1, socket_id, thread_id);
+ struct rte_mbuf *__mbuf = NULL;
+ marsio_buff_malloc_global(instance, (marsio_buff_t **) &__mbuf, 1, socket_id, thread_id);
return __mbuf;
}
-marsio_buff_t * marsio_buff_clone_deep(struct mr_instance * instance,
- marsio_buff_t * md, int socket_id, int thread_id)
+marsio_buff_t *marsio_buff_clone_deep(struct mr_instance *instance, marsio_buff_t *md, int socket_id, int thread_id)
{
- struct rte_mbuf *__mc, *__mi, **__prev;
- struct rte_mbuf * __md = (struct rte_mbuf *)md;
-
- uint32_t pktlen;
- uint8_t nseg;
+ struct rte_mbuf *__mc, *__mi, **__prev;
+ struct rte_mbuf *__md = (struct rte_mbuf *) md;
- if (unlikely((__mc = __pktmbuf_alloc(instance, socket_id, thread_id)) == NULL))
- return NULL;
+ uint32_t pktlen;
+ uint8_t nseg;
- __mi = __mc;
- __prev = &__mi->next;
- pktlen = __md->pkt_len;
- nseg = 0;
+ if (unlikely((__mc = __pktmbuf_alloc(instance, socket_id, thread_id)) == NULL)) return NULL;
- do {
- nseg++;
+ __mi = __mc;
+ __prev = &__mi->next;
+ pktlen = __md->pkt_len;
+ nseg = 0;
- uint16_t __md_datalen = rte_pktmbuf_data_len(__md);
- void * __md_data = rte_pktmbuf_mtod(__md, void *);
- void * __mi_data = rte_pktmbuf_append(__mi, __md_datalen);
- rte_memcpy(__mi_data, __md_data, __md_datalen);
+ do
+ {
+ nseg++;
- *__prev = __mi;
- __prev = &__mi->next;
+ uint16_t __md_datalen = rte_pktmbuf_data_len(__md);
+ void *__md_data = rte_pktmbuf_mtod(__md, void *);
+ void *__mi_data = rte_pktmbuf_append(__mi, __md_datalen);
+ rte_memcpy(__mi_data, __md_data, __md_datalen);
- } while ((__md = __md->next) != NULL &&
- (__mi = __pktmbuf_alloc(instance, socket_id, thread_id)) != NULL);
+ *__prev = __mi;
+ __prev = &__mi->next;
+ } while ((__md = __md->next) != NULL && (__mi = __pktmbuf_alloc(instance, socket_id, thread_id)) != NULL);
- *__prev = NULL;
- __mc->nb_segs = nseg;
- __mc->pkt_len = pktlen;
+ *__prev = NULL;
+ __mc->nb_segs = nseg;
+ __mc->pkt_len = pktlen;
- /* Allocation of new indirect segment failed */
- if (unlikely(__mi == NULL)) {
- rte_pktmbuf_free(__mc);
- return NULL;
- }
+ /* Allocation of new indirect segment failed */
+ if (unlikely(__mi == NULL))
+ {
+ rte_pktmbuf_free(__mc);
+ return NULL;
+ }
- __rte_mbuf_sanity_check(__mc, 1);
- return (marsio_buff_t *)__mc;
+ __rte_mbuf_sanity_check(__mc, 1);
+ return (marsio_buff_t *) __mc;
}
-static void __buff_clone_ctrlzone(marsio_buff_t * mc, marsio_buff_t * md)
+static void __buff_clone_ctrlzone(marsio_buff_t *mc, marsio_buff_t *md)
{
- struct rte_mbuf * __mc = (struct rte_mbuf *)mc;
- struct rte_mbuf * __md = (struct rte_mbuf *)md;
+ struct rte_mbuf *__mc = (struct rte_mbuf *) mc;
+ struct rte_mbuf *__md = (struct rte_mbuf *) md;
- /* 复制Priv部分的数据 */
- while (__mc != NULL && __md != NULL)
- {
- struct mrb_priv_zone * __mc_priv_zone = mrbuf_priv(__mc);
- struct mrb_priv_zone * __mi_priv_zone = mrbuf_priv(__md);
+ /* 复制Priv部分的数据 */
+ while (__mc != NULL && __md != NULL)
+ {
+ struct mrb_priv_zone *__mc_priv_zone = mrbuf_priv(__mc);
+ struct mrb_priv_zone *__mi_priv_zone = mrbuf_priv(__md);
- /* 断言,MBUF的私有区域一定大于控制域的大小 */
- assert(rte_pktmbuf_priv_size(__mc->pool) >= sizeof(struct mrb_priv_zone));
- rte_memcpy(__mc_priv_zone, __mi_priv_zone, rte_pktmbuf_priv_size(__mc->pool));
+ /* 断言,MBUF的私有区域一定大于控制域的大小 */
+ assert(rte_pktmbuf_priv_size(__mc->pool) >= sizeof(struct mrb_priv_zone));
+ rte_memcpy(__mc_priv_zone, __mi_priv_zone, rte_pktmbuf_priv_size(__mc->pool));
- /* 拆除控制域中的next指针?*/
- __mc_priv_zone->next = NULL;
+ /* 拆除控制域中的next指针?*/
+ __mc_priv_zone->next = NULL;
- /* 下一个链表项 */
- __mc = __mc->next;
- __md = __md->next;
- }
+ /* 下一个链表项 */
+ __mc = __mc->next;
+ __md = __md->next;
+ }
- /* 断言,__mc和__mi同时到达链表的终点,否则说明链表克隆时出现了问题。 */
- assert(__mc == NULL && __md == NULL);
- return;
+ /* 断言,__mc和__mi同时到达链表的终点,否则说明链表克隆时出现了问题。 */
+ assert(__mc == NULL && __md == NULL);
+ return;
}
-static void __memcpy_operator_buff(struct rte_mbuf *__mi, struct rte_mbuf * __md)
+static void __memcpy_operator_buff(struct rte_mbuf *__mi, struct rte_mbuf *__md)
{
- void * __md_buff = rte_mbuf_to_baddr(__md);
- void * __mi_buff = rte_mbuf_to_baddr(__mi);
-
- assert(__md->buf_len == __mi->buf_len);
- size_t bufflen = RTE_MIN(__md->buf_len, __mi->buf_len);
+ void *__md_buff = rte_mbuf_to_baddr(__md);
+ void *__mi_buff = rte_mbuf_to_baddr(__mi);
- rte_memcpy(__mi_buff, __md_buff, bufflen);
- __mi->data_len = __md->data_len;
- __mi->data_off = __md->data_off;
- return;
+ assert(__md->buf_len == __mi->buf_len);
+ size_t bufflen = RTE_MIN(__md->buf_len, __mi->buf_len);
+
+ rte_memcpy(__mi_buff, __md_buff, bufflen);
+ __mi->data_len = __md->data_len;
+ __mi->data_off = __md->data_off;
+ return;
}
-static void __memcpy_operator_data(struct rte_mbuf *__mi, struct rte_mbuf * __md)
+static void __memcpy_operator_data(struct rte_mbuf *__mi, struct rte_mbuf *__md)
{
- uint16_t __md_datalen = rte_pktmbuf_data_len(__md);
- void * __md_data = rte_pktmbuf_mtod(__md, void *);
- void * __mi_data = rte_pktmbuf_append(__mi, __md_datalen);
- rte_memcpy(__mi_data, __md_data, __md_datalen);
- return;
+ uint16_t __md_datalen = rte_pktmbuf_data_len(__md);
+ void *__md_data = rte_pktmbuf_mtod(__md, void *);
+ void *__mi_data = rte_pktmbuf_append(__mi, __md_datalen);
+ rte_memcpy(__mi_data, __md_data, __md_datalen);
+ return;
}
-static marsio_buff_t * __buff_clone_memcpy(struct mr_instance * instance,
- marsio_buff_t * md, int socket_id, int thread_id,
- void (*memcpy_operator)(struct rte_mbuf *__mi, struct rte_mbuf * __md))
+static marsio_buff_t *__buff_clone_memcpy(struct mr_instance *instance, marsio_buff_t *md, int socket_id, int thread_id,
+ void (*memcpy_operator)(struct rte_mbuf *__mi, struct rte_mbuf *__md))
{
- struct rte_mbuf *__mc, *__mi, **__prev;
- struct rte_mbuf * __md = (struct rte_mbuf *)md;
-
- uint32_t pktlen;
- uint8_t nseg;
+ struct rte_mbuf *__mc, *__mi, **__prev;
+ struct rte_mbuf *__md = (struct rte_mbuf *) md;
- if (unlikely((__mc = __pktmbuf_alloc(instance, socket_id, thread_id)) == NULL))
- return NULL;
+ uint32_t pktlen;
+ uint8_t nseg;
- __mi = __mc;
- __prev = &__mi->next;
- pktlen = __md->pkt_len;
- nseg = 0;
+ if (unlikely((__mc = __pktmbuf_alloc(instance, socket_id, thread_id)) == NULL)) return NULL;
- do {
- nseg++;
- memcpy_operator(__mi, __md);
+ __mi = __mc;
+ __prev = &__mi->next;
+ pktlen = __md->pkt_len;
+ nseg = 0;
- *__prev = __mi;
- __prev = &__mi->next;
+ do
+ {
+ nseg++;
+ memcpy_operator(__mi, __md);
- } while ((__md = __md->next) != NULL &&
- (__mi = __pktmbuf_alloc(instance, socket_id, thread_id)) != NULL);
+ *__prev = __mi;
+ __prev = &__mi->next;
+ } while ((__md = __md->next) != NULL && (__mi = __pktmbuf_alloc(instance, socket_id, thread_id)) != NULL);
- *__prev = NULL;
- __mc->nb_segs = nseg;
- __mc->pkt_len = pktlen;
+ *__prev = NULL;
+ __mc->nb_segs = nseg;
+ __mc->pkt_len = pktlen;
- /* Allocation of new indirect segment failed */
- if (unlikely(__mi == NULL)) {
- rte_pktmbuf_free(__mc);
- return NULL;
- }
+ /* Allocation of new indirect segment failed */
+ if (unlikely(__mi == NULL))
+ {
+ rte_pktmbuf_free(__mc);
+ return NULL;
+ }
- __rte_mbuf_sanity_check(__mc, 1);
- return (marsio_buff_t *)__mc;
+ __rte_mbuf_sanity_check(__mc, 1);
+ return (marsio_buff_t *) __mc;
}
-marsio_buff_t * marsio_buff_clone_with_options(struct mr_instance * instance,
- marsio_buff_t * md, int socket_id, int thread_id, uint16_t options)
+marsio_buff_t *marsio_buff_clone_with_options(
+ struct mr_instance *instance, marsio_buff_t *md, int socket_id, int thread_id, uint16_t options)
{
- marsio_buff_t * mi = NULL;
+ marsio_buff_t *mi = NULL;
- if (options & MR_BUFF_CLONE_BUFF)
- {
- mi = __buff_clone_memcpy(instance, md, socket_id, thread_id,
- __memcpy_operator_buff);
- }
- else if (options & MR_BUFF_CLONE_DATA)
- {
- mi = __buff_clone_memcpy(instance, md, socket_id, thread_id,
- __memcpy_operator_data);
- }
+ if (options & MR_BUFF_CLONE_BUFF)
+ {
+ mi = __buff_clone_memcpy(instance, md, socket_id, thread_id, __memcpy_operator_buff);
+ }
+ else if (options & MR_BUFF_CLONE_DATA)
+ {
+ mi = __buff_clone_memcpy(instance, md, socket_id, thread_id, __memcpy_operator_data);
+ }
- if (unlikely(mi == NULL)) return mi;
- if (options & MR_BUFF_CLONE_CTRLZONE)
- {
- __buff_clone_ctrlzone(mi, md);
- }
+ if (unlikely(mi == NULL)) return mi;
+ if (options & MR_BUFF_CLONE_CTRLZONE)
+ {
+ __buff_clone_ctrlzone(mi, md);
+ }
- return mi;
+ return mi;
}
char *marsio_buff_prepend(marsio_buff_t *m, uint16_t len)
{
- /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
+ /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
- return PROTECT_rte_pktmbuf_prepend((struct rte_mbuf *)m, len);
+ return PROTECT_rte_pktmbuf_prepend((struct rte_mbuf *) m, len);
}
char *marsio_buff_append(marsio_buff_t *m, uint16_t len)
{
- /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
+ /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
- return PROTECT_rte_pktmbuf_append((struct rte_mbuf *)m, len);
+ return PROTECT_rte_pktmbuf_append((struct rte_mbuf *) m, len);
}
char *marsio_buff_adj(marsio_buff_t *m, uint16_t len)
{
- /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
+ /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return NULL;
- return PROTECT_rte_pktmbuf_adj((struct rte_mbuf *)m, len);
+ return PROTECT_rte_pktmbuf_adj((struct rte_mbuf *) m, len);
}
int marsio_buff_trim(marsio_buff_t *m, uint16_t len)
{
- /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return -1;
+ /* 引用计数检查,修改报文时,不应该被其他的地方引用 */
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ if (unlikely(PROTECT_rte_mbuf_refcnt_read(__mbuf) != 1)) return -1;
- return PROTECT_rte_pktmbuf_trim((struct rte_mbuf *)m, len);
+ return PROTECT_rte_pktmbuf_trim((struct rte_mbuf *) m, len);
}
-char * marsio_buff_offset_set(marsio_buff_t *m, off_t offset,
- int is_relative)
+char *marsio_buff_offset_set(marsio_buff_t *m, off_t offset, int is_relative)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- if (unlikely(rte_mbuf_refcnt_read(__mbuf) != 1)) goto errout;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ if (unlikely(rte_mbuf_refcnt_read(__mbuf) != 1)) goto errout;
- int __offset = is_relative ? __mbuf->data_off + offset : offset;
- if (unlikely(__offset < 0 || __offset > __mbuf->buf_len)) goto errout;
-
- __mbuf->data_off = (unsigned int)__offset;
- return rte_pktmbuf_mtod(__mbuf, char *);
+ int __offset = is_relative ? __mbuf->data_off + offset : offset;
+ if (unlikely(__offset < 0 || __offset > __mbuf->buf_len)) goto errout;
+
+ __mbuf->data_off = (unsigned int) __offset;
+ return rte_pktmbuf_mtod(__mbuf, char *);
errout:
- return NULL;
+ return NULL;
}
off_t marsio_buff_offset_get(marsio_buff_t *m)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
- return __mbuf->data_off;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
+ return __mbuf->data_off;
}
-static inline struct rte_mbuf * __copy_on_write_common(
- struct mr_instance * instance, struct rte_mbuf * __mbuf)
+static inline struct rte_mbuf *__copy_on_write_common(struct mr_instance *instance, struct rte_mbuf *__mbuf)
{
- if (likely(rte_mbuf_refcnt_read(__mbuf) == 1)) return __mbuf;
+ if (likely(rte_mbuf_refcnt_read(__mbuf) == 1)) return __mbuf;
- /* 深拷贝,此时报文有其他人引用 */
- /* TODO: 根据当前的上下文确定SOCKET-ID和LCORE-ID */
- struct rte_mbuf * __cloned_mbuf = marsio_buff_clone_with_options(instance,
- __mbuf, MARSIO_SOCKET_ID_ANY, MARSIO_LCORE_ID_ANY,
- MR_BUFF_CLONE_BUFF | MR_BUFF_CLONE_CTRLZONE);
+ /* 深拷贝,此时报文有其他人引用 */
+ /* TODO: 根据当前的上下文确定SOCKET-ID和LCORE-ID */
+ struct rte_mbuf *__cloned_mbuf = marsio_buff_clone_with_options(
+ instance, __mbuf, MARSIO_SOCKET_ID_ANY, MARSIO_LCORE_ID_ANY, MR_BUFF_CLONE_BUFF | MR_BUFF_CLONE_CTRLZONE);
- assert(__cloned_mbuf != NULL);
+ assert(__cloned_mbuf != NULL);
- /* 对于传入的报文,释放所有权,外面用户不应该再使用传入的MBUF */
+ /* 对于传入的报文,释放所有权,外面用户不应该再使用传入的MBUF */
unsigned int thread_id = thread_info.thread_id;
instance->stat[thread_id].mbuf_free_count += 1;
-
+
rte_pktmbuf_free(__mbuf);
- return __cloned_mbuf;
+ return __cloned_mbuf;
}
/* 支持写时复制的报文修改裁剪函数 */
-marsio_buff_t * marsio_buff_prepend_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out)
+marsio_buff_t *marsio_buff_prepend_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
- /* 写时复制检测 */
- struct rte_mbuf * __op_mbuf = __copy_on_write_common(instance, __mbuf);
- if (unlikely(__op_mbuf == NULL)) return NULL;
+ /* 写时复制检测 */
+ struct rte_mbuf *__op_mbuf = __copy_on_write_common(instance, __mbuf);
+ if (unlikely(__op_mbuf == NULL)) return NULL;
- /* 执行操作 */
- void * __ptr_out = rte_pktmbuf_prepend(__op_mbuf, len);
+ /* 执行操作 */
+ void *__ptr_out = rte_pktmbuf_prepend(__op_mbuf, len);
- /* 检测,如果等于空,操作失败 */
- assert(__ptr_out != NULL);
- if (ptr_out != NULL) *ptr_out = __ptr_out;
- return __op_mbuf;
+ /* 检测,如果等于空,操作失败 */
+ assert(__ptr_out != NULL);
+ if (ptr_out != NULL) *ptr_out = __ptr_out;
+ return __op_mbuf;
}
-marsio_buff_t * marsio_buff_append_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out)
+marsio_buff_t *marsio_buff_append_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
- /* 写时复制检测 */
- struct rte_mbuf * __op_mbuf = __copy_on_write_common(instance, __mbuf);
- if (unlikely(__op_mbuf == NULL)) return NULL;
+ /* 写时复制检测 */
+ struct rte_mbuf *__op_mbuf = __copy_on_write_common(instance, __mbuf);
+ if (unlikely(__op_mbuf == NULL)) return NULL;
- /* 执行操作 */
- void * __ptr_out = rte_pktmbuf_append(__op_mbuf, len);
+ /* 执行操作 */
+ void *__ptr_out = rte_pktmbuf_append(__op_mbuf, len);
- /* 检测,如果等于空,操作失败 */
- assert(__ptr_out != NULL);
- if (ptr_out != NULL) *ptr_out = __ptr_out;
- return __op_mbuf;
+ /* 检测,如果等于空,操作失败 */
+ assert(__ptr_out != NULL);
+ if (ptr_out != NULL) *ptr_out = __ptr_out;
+ return __op_mbuf;
}
-marsio_buff_t * marsio_buff_adj_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out)
+marsio_buff_t *marsio_buff_adj_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
- /* 写时复制检测 */
- struct rte_mbuf * __op_mbuf = __copy_on_write_common(instance, __mbuf);
- if (unlikely(__op_mbuf == NULL)) return NULL;
+ /* 写时复制检测 */
+ struct rte_mbuf *__op_mbuf = __copy_on_write_common(instance, __mbuf);
+ if (unlikely(__op_mbuf == NULL)) return NULL;
- /* 执行操作 */
- void * __ptr_out = rte_pktmbuf_adj(__op_mbuf, len);
+ /* 执行操作 */
+ void *__ptr_out = rte_pktmbuf_adj(__op_mbuf, len);
- /* 检测,如果等于空,操作失败 */
- assert(__ptr_out != NULL);
- if (ptr_out != NULL) *ptr_out = __ptr_out;
- return __op_mbuf;
+ /* 检测,如果等于空,操作失败 */
+ assert(__ptr_out != NULL);
+ if (ptr_out != NULL) *ptr_out = __ptr_out;
+ return __op_mbuf;
}
-marsio_buff_t * marsio_buff_trim_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out)
+marsio_buff_t *marsio_buff_trim_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out)
{
- struct rte_mbuf * __mbuf = (struct rte_mbuf *)m;
+ struct rte_mbuf *__mbuf = (struct rte_mbuf *) m;
- /* 写时复制检测 */
- struct rte_mbuf * __op_mbuf = __copy_on_write_common(instance, __mbuf);
- if (unlikely(__op_mbuf == NULL)) return NULL;
+ /* 写时复制检测 */
+ struct rte_mbuf *__op_mbuf = __copy_on_write_common(instance, __mbuf);
+ if (unlikely(__op_mbuf == NULL)) return NULL;
- /* 执行操作 */
- int ret = rte_pktmbuf_trim(__op_mbuf, len);
- assert(ret == 0);
+ /* 执行操作 */
+ int ret = rte_pktmbuf_trim(__op_mbuf, len);
+ assert(ret == 0);
- /* 成功,返回报文头部,否则ptr_out返回的是空 */
- if (ptr_out != NULL && ret == 0)
- {
- *ptr_out = rte_pktmbuf_mtod(__op_mbuf, void *);
- }
- else if(ptr_out != NULL && ret != 0)
- {
- *ptr_out = NULL;
- }
+ /* 成功,返回报文头部,否则ptr_out返回的是空 */
+ if (ptr_out != NULL && ret == 0)
+ {
+ *ptr_out = rte_pktmbuf_mtod(__op_mbuf, void *);
+ }
+ else if (ptr_out != NULL && ret != 0)
+ {
+ *ptr_out = NULL;
+ }
- return __op_mbuf;
+ return __op_mbuf;
}
-
uint16_t marsio_buff_headroom(const marsio_buff_t *m)
{
- return rte_pktmbuf_headroom((const struct rte_mbuf *)m);
+ return rte_pktmbuf_headroom((const struct rte_mbuf *) m);
}
uint16_t marsio_buff_tailroom(const marsio_buff_t *m)
{
- return rte_pktmbuf_tailroom((const struct rte_mbuf *)m);
+ return rte_pktmbuf_tailroom((const struct rte_mbuf *) m);
}
uint32_t marsio_get_pkt_type(marsio_buff_t *m)
{
- return ((struct rte_mbuf *)m)->packet_type;
+ return ((struct rte_mbuf *) m)->packet_type;
}
-int marsio_buff_is_ctrlbuf(marsio_buff_t * m)
+int marsio_buff_is_ctrlbuf(marsio_buff_t *m)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- return rte_is_ctrlmbuf(__m);
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ return rte_is_ctrlmbuf(__m);
}
void marsio_buff_set_ctrlbuf(marsio_buff_t *m)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- __m->ol_flags = __m->ol_flags & CTRL_MBUF_FLAG;
- return;
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ __m->ol_flags = __m->ol_flags & CTRL_MBUF_FLAG;
+ return;
}
void marsio_pktmbuf_dump(FILE *f, const marsio_buff_t *m, unsigned dump_len)
{
- rte_pktmbuf_dump(f, (const struct rte_mbuf *)m, dump_len);
+ rte_pktmbuf_dump(f, (const struct rte_mbuf *) m, dump_len);
}
uint64_t marsio_buff_get_timestamp(marsio_buff_t *m)
{
- if(g_in_protect_mode) return 0;
- struct mrb_priv_zone * priv_zone = mrbuf_priv(m);
- return (uint64_t)priv_zone->ts.ts_app_rx_or_alloc.tv_nsec;
+ if (g_in_protect_mode) return 0;
+ struct mrb_priv_zone *priv_zone = mrbuf_priv(m);
+ return (uint64_t) priv_zone->ts.ts_app_rx_or_alloc.tv_nsec;
}
void marsio_buff_set_timestamp(marsio_buff_t *m, uint64_t timestamp)
@@ -575,38 +559,78 @@ void marsio_buff_set_timestamp(marsio_buff_t *m, uint64_t timestamp)
}
-int marsio_buff_get_timestamp_ex(marsio_buff_t * m, enum mr_timestamp_type ts_type,
- struct timespec * ts)
+int marsio_buff_get_timestamp_ex(marsio_buff_t *m, enum mr_timestamp_type ts_type, struct timespec *ts)
{
- struct mrb_priv_zone * priv_zone = mrbuf_priv(m);
+ struct mrb_priv_zone *priv_zone = mrbuf_priv(m);
switch (ts_type)
{
- case MR_TIMESTAMP_RX_OR_ALLOC:
- *ts = priv_zone->ts.ts_srv_rx_or_alloc;
- break;
+ case MR_TIMESTAMP_RX_OR_ALLOC:
+ *ts = priv_zone->ts.ts_srv_rx_or_alloc;
+ break;
- default:
- assert(0);
- return -EINVAL;
+ default:
+ assert(0);
+ return -EINVAL;
}
-
+
return RT_SUCCESS;
}
void marsio_buff_set_rehash_index(marsio_buff_t *m, uint32_t hash)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- __m->hash.usr = hash;
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ __m->hash.usr = hash;
}
-uint32_t marsio_buff_get_rehash_index(marsio_buff_t * m)
+uint32_t marsio_buff_get_rehash_index(marsio_buff_t *m)
{
- struct rte_mbuf * __m = (struct rte_mbuf *)m;
- return __m->hash.usr;
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ return __m->hash.usr;
}
-void * marsio_shared_mem_alloc(struct mr_instance * instance, size_t len)
+int marsio_buff_get_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ switch (type)
+ {
+ case MR_BUFF_METADATA_VLAN_TCI:
+ if (__m->ol_flags & PKT_RX_VLAN) *(unsigned int *) (data) = __m->vlan_tci;
+ else
+ return -1;
+ break;
+ };
+
+ return 0;
+}
+
+int marsio_buff_set_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data)
+{
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ switch (type)
+ {
+ case MR_BUFF_METADATA_VLAN_TCI:
+ __m->ol_flags = PKT_TX_VLAN_PKT;
+ __m->vlan_tci = *(unsigned int *) data;
+ break;
+ }
+
+ return 0;
+}
+
+int marsio_buff_unset_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type)
+{
+ struct rte_mbuf *__m = (struct rte_mbuf *) m;
+ switch (type)
+ {
+ case MR_BUFF_METADATA_VLAN_TCI:
+ __m->ol_flags &= ~PKT_TX_VLAN_PKT;
+ __m->vlan_tci = 0;
+ break;
+ }
+}
+
+void *marsio_shared_mem_alloc(struct mr_instance *instance, size_t len)
{
unsigned int thread_id = thread_info.thread_id;
instance->stat[thread_id].shared_mem_alloc += len;
@@ -614,7 +638,7 @@ void * marsio_shared_mem_alloc(struct mr_instance * instance, size_t len)
return rte_malloc(NULL, len, 0);
}
-void marsio_shared_mem_free(struct mr_instance * instance, void * mem)
+void marsio_shared_mem_free(struct mr_instance *instance, void *mem)
{
size_t sz_shared_mem;
rte_malloc_validate(mem, &sz_shared_mem);
@@ -624,4 +648,4 @@ void marsio_shared_mem_free(struct mr_instance * instance, void * mem)
instance->stat[thread_id].shared_men_free += sz_shared_mem;
return;
-} \ No newline at end of file
+}
diff --git a/app/src/version.map b/app/src/version.map
index aa965ac..63e80cf 100644
--- a/app/src/version.map
+++ b/app/src/version.map
@@ -71,6 +71,10 @@ global:
marsio_buff_get_timestamp_ex;
marsio_buff_set_rehash_index;
+
+ marsio_buff_get_metadata;
+ marsio_buff_set_metadata;
+ marsio_buff_unset_metadata;
local: *;
};
diff --git a/include/external/marsio.h b/include/external/marsio.h
index a4d6d15..737573d 100644
--- a/include/external/marsio.h
+++ b/include/external/marsio.h
@@ -13,22 +13,19 @@
typedef enum
{
- /* 数据面线程数,没有缺省值 */
- MARSIO_OPT_THREAD_NUM,
- /* 数据面线程绑定掩码,没有缺省值
- * 设置该掩码后,数据面线程数选项将被忽略。
- */
- MARSIO_OPT_THREAD_MASK,
- /* 线程绑定模式,类型:uint32_t
- */
+ /* 数据面线程数,没有缺省值 */
+ MARSIO_OPT_THREAD_NUM,
+ /* 数据面线程绑定掩码,没有缺省值,设置该掩码后,数据面线程数选项将被忽略。*/
+ MARSIO_OPT_THREAD_MASK,
+ /* 线程绑定模式,类型:uint32_t */
MARSIO_OPT_THREAD_AFFINITY_MODE,
/* 处理SIG信号,缺省值:类型:uint32_t,关闭(0)
* 启用该选项后,将自动处理SIGINT、SIGTERM信号
*/
- MARSIO_OPT_EXIT_WHEN_ERR,
+ MARSIO_OPT_EXIT_WHEN_ERR,
- /* 拓展数据面线程绑定掩码,适应大于64个核处理器的硬件平台
+ /* 拓展数据面线程绑定掩码,适应大于64个核处理器的硬件平台
* 设置该掩码后,数据面线程数选项将被忽略
*/
MARSIO_OPT_THREAD_MASK_IN_CPUSET,
@@ -37,16 +34,16 @@ typedef enum
typedef enum
{
- /* 发送后不释放数据包,由应用自行释放数据包 */
- MARSIO_SEND_OPT_NO_FREE = 1 << 0,
- /* 发送时计算发包哈希值,用于分流 */
- MARSIO_SEND_OPT_REHASH = 1 << 1,
- /* 快速报文路径 */
- MARSIO_SEND_OPT_FAST = 1 << 2,
- /* 报文追踪标记 */
- MARSIO_SEND_OPT_TRACE = 1 << 3,
- /* 控制报文标记 */
- MARSIO_SEND_OPT_CTRL = 1 << 4
+ /* 发送后不释放数据包,由应用自行释放数据包 */
+ MARSIO_SEND_OPT_NO_FREE = 1 << 0,
+ /* 发送时计算发包哈希值,用于分流 */
+ MARSIO_SEND_OPT_REHASH = 1 << 1,
+ /* 快速报文路径 */
+ MARSIO_SEND_OPT_FAST = 1 << 2,
+ /* 报文追踪标记 */
+ MARSIO_SEND_OPT_TRACE = 1 << 3,
+ /* 控制报文标记 */
+ MARSIO_SEND_OPT_CTRL = 1 << 4
} marsio_opt_send_t;
@@ -70,18 +67,18 @@ enum mr_sendpath_option
MR_SENDPATH_OPT_BUILD_L3 = 1,
/* 构建二层报文头 */
MR_SENDPATH_OPT_BUILD_L2 = 2,
- /* 构建前Hook点回调 */
- MR_SENDPATH_OPT_HOOK_PREBUILD = 50,
- /* 构建后Hook点回调 */
- MR_SENDPATH_OPT_HOOK_POSTBUILD = 51,
+ /* 构建前Hook点回调 */
+ MR_SENDPATH_OPT_HOOK_PREBUILD = 50,
+ /* 构建后Hook点回调 */
+ MR_SENDPATH_OPT_HOOK_POSTBUILD = 51,
};
enum mr_clone_options
{
- /* 拷贝区域 */
- MR_BUFF_CLONE_DATA = 1 << 0,
- MR_BUFF_CLONE_BUFF = 1 << 1,
- MR_BUFF_CLONE_CTRLZONE = 1 << 2,
+ /* 拷贝区域 */
+ MR_BUFF_CLONE_DATA = 1 << 0,
+ MR_BUFF_CLONE_BUFF = 1 << 1,
+ MR_BUFF_CLONE_CTRLZONE = 1 << 2,
};
enum mr_thread_affinity_mode
@@ -100,23 +97,31 @@ enum mr_timestamp_type
MR_TIMESTAMP_RX_OR_ALLOC = 0,
};
+enum mr_buff_metadata_type
+{
+ /* 分流哈希值,会根据该值计算分流队列 */
+ MR_BUFF_REHASH_INDEX = 0,
+ /* 网卡剥离的VLAN标签 */
+ MR_BUFF_METADATA_VLAN_TCI = 1,
+};
+
#ifdef __cplusplus
extern "C" {
#endif
-#include <stdio.h>
-#include <stdint.h>
-#include <stddef.h>
#include <netinet/in.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdio.h>
#ifndef MARSIO_SOCKET_ID_ANY
-#define MARSIO_SOCKET_ID_ANY -1
+#define MARSIO_SOCKET_ID_ANY -1
#endif
#ifndef MARSIO_LCORE_ID_ANY
-#define MARSIO_LCORE_ID_ANY -1
+#define MARSIO_LCORE_ID_ANY -1
#endif
-
+
typedef uint32_t device_id_t;
typedef uint32_t port_id_t;
typedef uint32_t queue_id_t;
@@ -127,43 +132,42 @@ struct mr_sendpath;
struct mr_instance;
struct mr_vdev;
-struct mr_instance * marsio_create();
-struct mr_instance * marsio_current();
+struct mr_instance *marsio_create();
+struct mr_instance *marsio_current();
-typedef int(*fn_sendpath_hook_t)(struct mr_sendpath * sendpath,
- marsio_buff_t * mbuf[], unsigned int nr_mbuf, void * arg);
+typedef int (*fn_sendpath_hook_t)(struct mr_sendpath *sendpath, marsio_buff_t *mbuf[], unsigned int nr_mbuf, void *arg);
-int marsio_option_get(struct mr_instance * instance, int opt_type, void * out_opt, size_t out_opt_buffer);
-int marsio_option_set(struct mr_instance * instance, marsio_opt_type_t opt_type, void * opt, size_t sz_opt);
-int marsio_init(struct mr_instance * instance, const char * appsym);
-int marsio_thread_init(struct mr_instance * instance);
-int marsio_destory(struct mr_instance * instance);
+int marsio_option_get(struct mr_instance *instance, int opt_type, void *out_opt, size_t out_opt_buffer);
+int marsio_option_set(struct mr_instance *instance, marsio_opt_type_t opt_type, void *opt, size_t sz_opt);
+int marsio_init(struct mr_instance *instance, const char *appsym);
+int marsio_thread_init(struct mr_instance *instance);
+int marsio_destory(struct mr_instance *instance);
-struct mr_vdev * marsio_open_device(struct mr_instance * instance,
- const char * devsym, unsigned int nr_rxstream, unsigned int nr_txstream);
+struct mr_vdev *marsio_open_device(
+ struct mr_instance *instance, const char *devsym, unsigned int nr_rxstream, unsigned int nr_txstream);
-void marsio_close_device(struct mr_vdev * vdev);
+void marsio_close_device(struct mr_vdev *vdev);
-struct mr_vdev * marsio_device_lookup(struct mr_instance * instance, const char * devsym);
+struct mr_vdev *marsio_device_lookup(struct mr_instance *instance, const char *devsym);
-int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs);
-int marsio_recv_all_burst(struct mr_instance * instance, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs);
-int marsio_send_burst(struct mr_sendpath * sendpath, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs);
-int marsio_send_burst_with_options(struct mr_sendpath * sendpath, queue_id_t sid, marsio_buff_t * mbufs[],
- int nr_mbufs, uint16_t options);
-void marsio_send_burst_flush(struct mr_sendpath * sendpath, queue_id_t sid);
+int marsio_recv_burst(struct mr_vdev *vdev, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs);
+int marsio_recv_all_burst(struct mr_instance *instance, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs);
+int marsio_send_burst(struct mr_sendpath *sendpath, queue_id_t qid, marsio_buff_t *mbufs[], int nr_mbufs);
+int marsio_send_burst_with_options(
+ struct mr_sendpath *sendpath, queue_id_t sid, marsio_buff_t *mbufs[], int nr_mbufs, uint16_t options);
+void marsio_send_burst_flush(struct mr_sendpath *sendpath, queue_id_t sid);
-int marsio_udp_header_construct(marsio_buff_t * buff, uint16_t s_port, uint16_t d_port);
-int marsio_ipv4_header_construct(marsio_buff_t * buff, uint32_t s_ip, uint32_t d_ip, uint8_t proto);
+int marsio_udp_header_construct(marsio_buff_t *buff, uint16_t s_port, uint16_t d_port);
+int marsio_ipv4_header_construct(marsio_buff_t *buff, uint32_t s_ip, uint32_t d_ip, uint8_t proto);
-struct mr_sendpath * marsio_sendpath_create_by_droute(struct mr_vdev * dest_device, struct in_addr addr);
-struct mr_sendpath * marsio_sendpath_create_by_route(struct mr_instance * instance, struct in_addr addr);
-struct mr_sendpath * marsio_sendpath_create_by_vdev(struct mr_vdev * dest_device);
+struct mr_sendpath *marsio_sendpath_create_by_droute(struct mr_vdev *dest_device, struct in_addr addr);
+struct mr_sendpath *marsio_sendpath_create_by_route(struct mr_instance *instance, struct in_addr addr);
+struct mr_sendpath *marsio_sendpath_create_by_vdev(struct mr_vdev *dest_device);
-struct mr_sendpath * marsio_sendpath_create(struct mr_instance * instance, int type, ...);
-int marsio_sendpath_option_set(struct mr_instance * instance, struct mr_sendpath * sendpath, int opt, ...);
-int marsio_sendpath_option_get(struct mr_instance * instance, struct mr_sendpath * sendpath, int opt, ...);
-void marsio_sendpath_destory(struct mr_sendpath * sendpath);
+struct mr_sendpath *marsio_sendpath_create(struct mr_instance *instance, int type, ...);
+int marsio_sendpath_option_set(struct mr_instance *instance, struct mr_sendpath *sendpath, int opt, ...);
+int marsio_sendpath_option_get(struct mr_instance *instance, struct mr_sendpath *sendpath, int opt, ...);
+void marsio_sendpath_destory(struct mr_sendpath *sendpath);
//simply get control zone data ptr.
void *marsio_buff_ctrlzone(marsio_buff_t *m, uint8_t id);
@@ -172,7 +176,7 @@ void *marsio_buff_ctrlzone(marsio_buff_t *m, uint8_t id);
void *marsio_buff_ctrlzone_data(marsio_buff_t *m, uint8_t id, uint8_t *size);
//a safe way to set control zone data.
-void marsio_buff_ctrlzone_set(marsio_buff_t *m, uint8_t id, void* ptr_data, uint8_t size);
+void marsio_buff_ctrlzone_set(marsio_buff_t *m, uint8_t id, void *ptr_data, uint8_t size);
void marsio_buff_reset(marsio_buff_t *m);
@@ -181,7 +185,7 @@ marsio_buff_t *marsio_buff_getnext_pkt(marsio_buff_t *m);
void marsio_buff_append_pkt(marsio_buff_t *head, marsio_buff_t *next);
void marsio_buff_append_seg(marsio_buff_t *head, marsio_buff_t *next);
-void marsio_buff_chain_pkt(marsio_buff_t * pkt, marsio_buff_t * next);
+void marsio_buff_chain_pkt(marsio_buff_t *pkt, marsio_buff_t *next);
uint16_t marsio_buff_headroom(const marsio_buff_t *m);
uint16_t marsio_buff_tailroom(const marsio_buff_t *m);
@@ -203,23 +207,18 @@ char *marsio_buff_adj(marsio_buff_t *m, uint16_t len);
int marsio_buff_trim(marsio_buff_t *m, uint16_t len);
-char * marsio_buff_offset_set(marsio_buff_t *m, off_t offset,
- int is_relative);
+char *marsio_buff_offset_set(marsio_buff_t *m, off_t offset, int is_relative);
off_t marsio_buff_offset_get(marsio_buff_t *m);
/* 支持写时复制的报文修改裁剪函数 */
-marsio_buff_t * marsio_buff_prepend_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out);
+marsio_buff_t *marsio_buff_prepend_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out);
-marsio_buff_t * marsio_buff_append_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out);
+marsio_buff_t *marsio_buff_append_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out);
-marsio_buff_t * marsio_buff_adj_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out);
+marsio_buff_t *marsio_buff_adj_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out);
-marsio_buff_t * marsio_buff_trim_cw(struct mr_instance * instance,
- marsio_buff_t *m, uint16_t len, void ** ptr_out);
+marsio_buff_t *marsio_buff_trim_cw(struct mr_instance *instance, marsio_buff_t *m, uint16_t len, void **ptr_out);
uint16_t marsio_buff_headroom(const marsio_buff_t *m);
@@ -229,34 +228,37 @@ uint32_t marsio_get_pkt_type(marsio_buff_t *m);
void marsio_pktmbuf_dump(FILE *f, const marsio_buff_t *m, unsigned dump_len);
-marsio_buff_t * marsio_buff_clone_deep(struct mr_instance * instance,
- marsio_buff_t * md, int socket_id, int thread_id);
+marsio_buff_t *marsio_buff_clone_deep(struct mr_instance *instance, marsio_buff_t *md, int socket_id, int thread_id);
-marsio_buff_t * marsio_buff_clone_with_options(struct mr_instance * instance,
- marsio_buff_t * md, int socket_id, int thread_id, uint16_t options);
+marsio_buff_t *marsio_buff_clone_with_options(
+ struct mr_instance *instance, marsio_buff_t *md, int socket_id, int thread_id, uint16_t options);
-int marsio_buff_malloc_device(struct mr_vdev * vdev, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id);
+int marsio_buff_malloc_device(
+ struct mr_vdev *vdev, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id, int thread_id);
-int marsio_buff_malloc_global(struct mr_instance * instance, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id);
+int marsio_buff_malloc_global(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs,
+ int socket_id, int thread_id);
-void marsio_buff_free(struct mr_instance * instance, marsio_buff_t *marsio_buff[],
- unsigned int nr_mbufs, int socket_id, int thread_id);
+void marsio_buff_free(struct mr_instance *instance, marsio_buff_t *marsio_buff[], unsigned int nr_mbufs, int socket_id,
+ int thread_id);
-int marsio_buff_is_ctrlbuf(marsio_buff_t * m);
+int marsio_buff_is_ctrlbuf(marsio_buff_t *m);
void marsio_buff_set_ctrlbuf(marsio_buff_t *m);
uint64_t marsio_buff_get_timestamp(marsio_buff_t *m);
void marsio_buff_set_timestamp(marsio_buff_t *m, uint64_t timestamp);
-int marsio_buff_get_timestamp_ex(marsio_buff_t * m, enum mr_timestamp_type ts_type, struct timespec * ts);
+int marsio_buff_get_timestamp_ex(marsio_buff_t *m, enum mr_timestamp_type ts_type, struct timespec *ts);
void marsio_buff_set_rehash_index(marsio_buff_t *m, uint32_t hash);
-uint32_t marsio_buff_get_rehash_index(marsio_buff_t * m);
+uint32_t marsio_buff_get_rehash_index(marsio_buff_t *m);
+
+int marsio_buff_get_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data);
+int marsio_buff_set_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data);
+int marsio_buff_unset_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type);
-void * marsio_shared_mem_alloc(struct mr_instance * instance, size_t len);
-void marsio_shared_mem_free(struct mr_instance * instance, void * mem);
+void *marsio_shared_mem_alloc(struct mr_instance *instance, size_t len);
+void marsio_shared_mem_free(struct mr_instance *instance, void *mem);
#ifdef __cplusplus
}
diff --git a/service/src/core.c b/service/src/core.c
index 76225a3..620e0d1 100644
--- a/service/src/core.c
+++ b/service/src/core.c
@@ -320,6 +320,14 @@ static void sc_eal_init(struct sc_main * sc, const char * cmd)
WRITE_ARG(str_virtaddr);
}
+ unsigned int en_no_huge = 0;
+ MESA_load_profile_uint_def(sc->local_cfgfile, "eal", "nohuge", &en_no_huge, 0);
+
+ if (en_no_huge > 0)
+ {
+ WRITE_ARG("--no-huge");
+ }
+
// DPDK和SYSTEMD的日志级别差1
unsigned int loglevel = g_logger_level + 1;
MESA_load_profile_uint_def(sc->local_cfgfile, "eal", "loglevel", &loglevel, loglevel);