(dpdk f-stack)-通过kni与kernel上服务通信
Posted ygmdream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(dpdk f-stack)-通过kni与kernel上服务通信相关的知识,希望对你有一定的参考价值。
fstack利用dpdk读取物理网卡通过kni虚拟网卡将数据包发给kernel协议栈:
dpdk从物理网卡读取数据包--》将此数据包入ring--》kni_process_tx读取ring中数据包--》将数据包发给 kni虚拟网卡--》kernel协议栈将包给应用程序。fstack从kni虚拟网卡读取kernel协议栈发来的数据包再利用dpdk从物理网卡发出去:
应用程序发包给kernel协议栈--》将数据包发给 kni虚拟网卡--》ff_eth_tx_burst从kni虚拟网卡读取数据包--》调用dpdk api将数据包从物理端口发出去。
kni代码分析:
ff_kni_init--判断当前是 RTE_PROC_PRIMARY worker 才初始化kni网卡 rte_kni_init(nb_ports)即dpdk接管的每个物理网卡对应一个虚拟网卡;
/*每个nginx worker将需要给kernel的数据包放到当前虚拟网卡的ring队列中: kni_rp[port_id]*/
每个worker执行 main_loop-->process_packets--ff_kni_enqueue(port_id, rtem);
int
ff_kni_enqueue(uint16_t port_id, struct rte_mbuf *pkt)
int ret = rte_ring_enqueue(kni_rp[port_id], pkt);
if (ret < 0)
rte_pktmbuf_free(pkt);
return 0;
ff_dpdk_if.c--worker的main_loop
以上是关于(dpdk f-stack)-通过kni与kernel上服务通信的主要内容,如果未能解决你的问题,请参考以下文章