正常情况下接收应用层报文的接口为kni_net_rx_normal。首先会从rx接收队列中获取应用层传进来的报文,然后将报文转为内核协议栈支持的sk_buff节后,最后调用netif_rx内核接口将sk_buff发往内核。 对于已经发往内核的报文,将mbuf放回到释放队列,由应用层统一进行释放,保证驱动代码的简洁,使得驱动只做最小的事情。 应用...
rte_kni 创建的虚拟网络接口支持多个收包函数,下面我以 kni_net_rx_normal 这个普通的函数为例,探讨这里的过程。 128 static void 129 kni_net_rx_normal(struct kni_dev *kni) 130 { 131 unsigned ret; 132 uint32_t len; 133 unsigned i, num_rx, num_fq; 134 struct rte_kni_mbuf *kva; 135 st...
循环处理收到的kni数据,将数据复制到申请的skb中。 图15. kni_net_rx_normal(3) 设置skb相关参数,调用netif_rx_ni将skb传给内核协议栈处理。最后把读取的数据追加到释放队列中。 这是DPDK app向KNI设备写入数据,也就是发给内核的情况。当内核从KNI设备发送数据时,按照内核的流程处理,最终会调用到net_device_op...
从kni->rx_q读取数据到kni->pa中。没有任何报文,则直接返回。 图14. kni_net_rx_normal(2) 循环处理收到的kni数据,将数据复制到申请的skb中。 图15. kni_net_rx_normal(3) 设置skb相关参数,调用netif_rx_ni将skb传给内核协议栈处理。最后把读取的数据追加到释放队列中。 这是DPDK app向KNI设备写入数据...
在持有读锁的情况下,遍历所有的kni设备,执行接收动作,根据rte_kni.ko加载时的模块参数lo_mode的值不同,执行不同的动作。看rx_normal_mode: 循环处理收到的kni 数据,将内容复制到申请的skb中 再通过netif_rx_ni将skb传给内核协议栈处理,对于KNI驱动来说,即kni_net_tx。
For the test you performed from vEth to remote server, have you tried to add kernel debug information in kni_net_tx() to see whether it is invoked by TCP/IP stack? Can you ping from another server to the IP of KNI vEth? When KNI works in normal mode, "netif_rx(skb);" in kni_...
RX方向: PMD分配mbuf, 收包线程收到后把mbuf放入rx_q FIFO, kni线程从rx_q取出mbuf然后转换为skb调用netif_rx把报文发送到协议栈中; 最后rx_q中取出来的mbuf放入free_q中, 由用户空间的收包线程释放; TX方向: 从协议栈发到kni设备上的报文,kni的发包函数kni_net_tx从alloc_q中取可用的mbuf, 把skb转换为...
For the test you performed from vEth to remote server, have you tried to add kernel debug information in kni_net_tx() to see whether it is invoked by TCP/IP stack? Can you ping from another server to the IP of KNI vEth? When KNI works in normal mode, "netif_rx(skb);" in kni_...
kni_net_rx_normal(2) 循环处理收到的 kni 数据,将数据复制到申请的 skb 中。 kni_net_rx_normal(3) 设置skb 相关参数,调用 netif_rx_ni 将 skb 传给内核协议栈处理。最后把读取的数据追加到释放队列中。 这是DPDK app 向 KNI 设备写入数据,也就是发给内核的情况。当内核从 KNI 设备发送数据时,按照内...
如果lcore负责rx,则死循环调用接口kni_ingress进行报文的收取。 如果lcore负责tx,则死循环调用接口kni_egress进行报文的发送。 因为一个lcore只能负责一个死循环,所以最好给rx和tx都分配一个lcore去执行,不然容易出问题 kni的功能也是分为用户态KNI和内核态KNI两部分的 ...