diff options
| author | Qiuwen Lu <[email protected]> | 2020-10-29 11:34:03 +0800 |
|---|---|---|
| committer | Qiuwen Lu <[email protected]> | 2020-10-29 11:34:03 +0800 |
| commit | 7c7332220eadbb1ec434ffa119e5de975f094ce6 (patch) | |
| tree | 0fb049187194ab3ec71202a0a9bf83c3f2633104 | |
| parent | 75539b61da9bf85a24234d2b34c01175aecd6d49 (diff) | |
增加读取、设置报文METADATA的接口及对应的实现。v4.3.29-20201029
| -rw-r--r-- | .clang-format | 2 | ||||
| -rw-r--r-- | app/src/marsio.c | 8 | ||||
| -rw-r--r-- | app/src/mrb.c | 708 | ||||
| -rw-r--r-- | app/src/version.map | 4 | ||||
| -rw-r--r-- | include/external/marsio.h | 180 | ||||
| -rw-r--r-- | service/src/core.c | 8 |
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); |
