#if SELF_TEST static struct rte_mempool * g_pktmbuf_pool = NULL; #endif #if SELF_TEST static void marsio_mbuf_test(void) { #define BATCH_TEST_NUM (32) marsio_buff_t *mbuf, *mnext; struct rte_mbuf *rbuf; char *data; char *pri_data = (char *)"test ctrlzone"; uint32_t pkt_len; int ctrl_id = -1, i; marsio_buff_t *batch_mbuf[BATCH_TEST_NUM]; ctrl_id = marsio_buf_ctrlzone_alloc_id(); while (1) { printf("ctrl_id = %u\n", ctrl_id); mbuf = marsio_buff_alloc(); rbuf = (struct rte_mbuf *)mbuf; marsio_buf_batch_alloc(batch_mbuf, BATCH_TEST_NUM); printf("headroom = %u\n", marsio_buf_headroom(mbuf)); printf("tailroom = %u\n", marsio_buf_tailroom(mbuf)); printf("bufaddr-buf = %ld\n", (char *)rbuf->buf_addr - (char *)rbuf); data = marsio_buff_mtod(mbuf); pkt_len = marsio_buff_pkt_len(mbuf); printf("init pkt_len = %u\n", pkt_len); marsio_buff_prepend(mbuf, 20); pkt_len = marsio_buff_pkt_len(mbuf); printf("after prepend, pkt_len = %u\n", pkt_len); marsio_buf_append(mbuf, 100); pkt_len = marsio_buff_pkt_len(mbuf); printf("after append, pkt_len = %u\n", pkt_len); marsio_buf_trim(mbuf, 60); pkt_len = marsio_buff_pkt_len(mbuf); printf("after trim, pkt_len = %u\n", pkt_len); printf("tailroom = %u\n", marsio_buf_tailroom(mbuf)); mnext = marsio_buff_alloc(); marsio_buf_append_pkt(mbuf, mnext); printf("next is :%p\n", marsio_buf_get_nextpkt(mbuf)); marsio_buf_set_ctrlzone(mbuf, ctrl_id, (void *)pri_data); pri_data = marsio_buf_get_ctrlzone(mbuf, ctrl_id); printf("ctrlzone pri data : %s\n", pri_data); #if MEM_RECORD for (i = 0; i < lcore_num; i += 8) { printf("%ld %ld %ld %ld %ld %ld %ld %ld\n", marsio_buf_record[i].alloc_mbuf_num, marsio_buf_record[i + 1].alloc_mbuf_num, marsio_buf_record[i + 2].alloc_mbuf_num, marsio_buf_record[i + 3].alloc_mbuf_num, marsio_buf_record[i + 4].alloc_mbuf_num, marsio_buf_record[i + 5].alloc_mbuf_num, marsio_buf_record[i + 6].alloc_mbuf_num, marsio_buf_record[i + 7].alloc_mbuf_num); } #endif marsio_buf_batch_free(batch_mbuf, BATCH_TEST_NUM); marsio_buff_free(mnext); marsio_buf_dup(mbuf); marsio_buff_free(mbuf); marsio_buff_free(mbuf); sleep(1); printf("\n ---------------------------------------------------- \n"); } } static void *marsio_mbuf_test_thread(void *arg) { marsio_mbuf_test(); return NULL; } static int dpdk_common_init(int argc, char *argv[]) { int ret; /* init EAL */ ret = rte_eal_init(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); /* 初始化时怎么给每个socket分配一个mpool, 或者每个core分配一个? */ g_pktmbuf_pool = rte_pktmbuf_pool_create("mbuf_pool", 1024, 256, 128, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); if (g_pktmbuf_pool == NULL) rte_exit(EXIT_FAILURE, "Cannot init mbuf pool\n"); rte_eal_mp_wait_lcore(); return 0; } /* 获取全局上下文. */ static inline void *marsio_get_global_self_ctx(void) { #if SELF_TEST static char global_tmp[1024]; #endif return global_tmp; } /* 获取当前进程相关上下文. */ static inline void *marsio_get_process_self_ctx(void) { return MODULE_CTX(mr_proc_ctx_get(), MR_MID_MRBUF_MGR); } /* 获取当前线程相关上下文. */ static inline void *marsio_get_thread_self_ctx(void) { #if SELF_TEST static char thread_tmp[1024]; #endif return thread_tmp; } int main(int argc, char *argv[]) { pthread_t pid; marsio_buf_init(); if (dpdk_common_init(argc, argv) < 0) { return -1; } while (1) { marsio_mbuf_test(); } return 0; } #endif