声明:此文档只做学习交流使用,请勿用作其他商业用途
author:朝阳_tony转载请注明出处:http://blog.csdn.net/linzhaolove
此文请结合intel dpdk源码去阅读,源码可以去http://dpdk.org/dev 网页中下载;更多官方文档请访问http://dpdk.org
nb_ports = (portid_t) rte_eth_dev_count()
获取你当前有效网卡,网口的个数;
set_def_fwd_config();
这个程序主要测试dpdk的数据包转发性能,调用set_def_fwd_config()函数,是去分配cpu core 和port ;同时设置端口的缺省的mac信息;
launch_args_parse(argc, argv);
调用launch_args_parse去分析testpmd自身的参数,通常我们会传递一个 -i 参数,就是interactive单词,意思是进行交互模式测试,等程序启动起来,你就需要一个一个的敲命令进行测试,当然你也可采用非交互的模式进行测试;
fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
sizeof(struct fwd_lcore *) * nb_lcores,
CACHE_LINE_SIZE);
fwd_lcores[lc_id] = rte_zmalloc("testpmd: struct fwd_lcore",
sizeof(struct fwd_lcore),
CACHE_LINE_SIZE);
初始化一级指针,在一个for循环中实现,先单个结构体分配,然后将单个结构体的指针赋值给了fwd_lcores[lc_id];
mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0);
根据你才用的是hugepage的NUMA模式还是non-NUMA模式来分配内存池;
mbp = mbuf_pool_find(rte_lcore_to_socket_id(lc_id));
根据core id 来分配每个单独的core应该拥有那个内存池;fwd_lcores[lc_id]->mbp = mbp; 然后赋值给fwd_lcores结构体中;
/* Configuration of Ethernet ports. */
ports = rte_zmalloc("testpmd: ports",
sizeof(struct rte_port) * nb_ports,
CACHE_LINE_SIZE);
rte_eth_dev_info_get(pt_id, &port->dev_info);
调用rte_eth_dev_info_get会将一些设备信息和端口设定信息赋值给dev_info ,在接下来会用获取到的信息,判断其发送和接收队列值是否符合;
fwd_streams = rte_zmalloc("testpmd: fwd_streams",
sizeof(struct fwd_stream *) * nb_fwd_streams,
CACHE_LINE_SIZE);
最后分配fwd_streams转发信息结构体空间;
port = &ports[pi];
ports结构体数组,就是在上面init_config()函数中分配到的端口结构体内存空间;
diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq, &port_conf);
rte_eth_macaddr_get(pi, &port->eth_addr);
获取有效网卡的mac地址信息;
diag = rte_eth_tx_queue_setup(pi, qi, nb_txd,
sock_id,
&tx_conf);
初始发送队列,
diag = rte_eth_rx_queue_setup(pi, qi, nb_rxd, sock_id,
&rx_conf,
mbuf_pool_find(sock_id));
初始接收队列;
diag = rte_eth_dev_start(pi);
启动端口;
rte_eth_link_get(pi, &link);
rte_eth_promiscuous_enable(pi);
最后判断你的网卡设置的是否混咋模式接收信息,如果是混杂模式,说明你任何网络信息都接收,否则只接收你上面设置的mac地址,为目的地址的网络信息;
cl = cmdline_stdin_new(main_ctx, "testpmd> ");
在prompt()函数中,调用cmdline_stdin_new()初始化dpdk提供的命令行交互模块,其实主要是将main_ctx个结构体初始化进模块,
cmdline_interact(cl);
cmdline_stdin_exit(cl);
等你退出命令行交互模式是,就可以调用cmdline_stdin_exit() 函数退出了;
make -C app/test-pmd/
编译程序;
./app/test-pmd/testpmd -c 1f -n 4 -- -i
-c 1f 是指,最多可以分配 5个core给dpdk程序, 1f = 00011111 ;