获取每个 DMA 设备的名称
// 获取 DMA 设备数量
int dma_count = rte_dma_count();
if (dma_count <= 0) {
printf("No DMA devices found\n");
} else {
printf("Found %d DMA device(s)\n", dma_count);
// 获取每个 DMA 设备的名称
for (int i = 0; i < dma_count; i++) {
const char *dma_name = rte_dma_get_name_by_index(i);
if (dma_name) {
printf("DMA device %d: %s\n", i, dma_name);
} else {
printf("Failed to get name for DMA device %d\n", i);
}
}
}
配置 DMA 设备
static int configure_dma_device(void) {
uint16_t dma_dev_id;
struct rte_dma_conf dma_conf = {
.nb_vchans = 1,
.socket_id = rte_socket_id(),
};
dma_dev_id = rte_dma_get_dev_id("dma0");
if (dma_dev_id == -1)
return -1;
if (rte_dma_configure(dma_dev_id, &dma_conf) < 0)
return -1;
if (rte_dma_start(dma_dev_id) < 0)
return -1;
return dma_dev_id;
}
执行 DMA 传输
static int perform_dma_transfer(uint16_t dma_dev_id, struct rte_mbuf *src_mbuf, struct rte_mbuf *dst_mbuf) {
struct rte_dma_xfer_desc xfer_desc = {
.src = rte_pktmbuf_mtod(src_mbuf, void *),
.dst = rte_pktmbuf_mtod(dst_mbuf, void *),
.len = src_mbuf->data_len,
};
if (rte_dma_submit(dma_dev_id, &xfer_desc, 1) < 0)
return -1;
if (rte_dma_completed(dma_dev_id, 1, NULL) < 0)
return -1;
return 0;
}
main
int main(int argc, char **argv) {
// 初始化 DPDK 环境
int ret = rte_eal_init(argc, argv);
if (ret < 0)
rte_exit(EXIT_FAILURE, "Error with EAL initialization\n");
force_quit = false;
// 注册信号处理函数
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
// 创建内存池,用于存放数据包
mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS, MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
if (mbuf_pool == NULL)
rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n");
// 配置 DMA 设备
int dma_dev_id = configure_dma_device();
if (dma_dev_id < 0)
rte_exit(EXIT_FAILURE, "Cannot configure DMA device\n");
// 分配源和目标 mbuf
struct rte_mbuf *src_mbuf = rte_pktmbuf_alloc(mbuf_pool);
struct rte_mbuf *dst_mbuf = rte_pktmbuf_alloc(mbuf_pool);
if (!src_mbuf || !dst_mbuf)
rte_exit(EXIT_FAILURE, "Cannot allocate mbuf\n");
// 填充源 mbuf 数据
rte_memcpy(rte_pktmbuf_mtod(src_mbuf, void *), "Example data", 12);
src_mbuf->data_len = 12;
// 执行 DMA 传输
if (perform_dma_transfer(dma_dev_id, src_mbuf, dst_mbuf) < 0)
rte_exit(EXIT_FAILURE, "DMA transfer failed\n");
// 验证传输结果
if (memcmp(rte_pktmbuf_mtod(dst_mbuf, void *), "Example data", 12) != 0)
rte_exit(EXIT_FAILURE, "Data mismatch after DMA transfer\n");
printf("DMA transfer successful\n");
// 释放 mbuf
rte_pktmbuf_free(src_mbuf);
rte_pktmbuf_free(dst_mbuf);
// 停止并关闭 DMA 设备
rte_dma_stop(dma_dev_id);
rte_dma_close(dma_dev_id);
// 释放内存池
rte_mempool_free(mbuf_pool);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。