前言:在DPDK报文处理中,有些报文需要发送到内核协议栈进行处理,如GTP-C控制报文,如果报文数量较少,可以使用内核提供的TAP/TUN设备,但是鉴于这种设备使用的系统调用的方式,还涉及到copy_to_user()
和copy_from_user()
的开销,因此,提供了KNI接口用于改善用户态和内核态间报文的处理效率。
KNI实现组成
KNI的实现由两部分组成,内核态的模块和用户态的模块。通过创建kni接口上下文,在内核态和用户态之间使用队列的方式,传递数据包的指针,从而避免了拷贝。
对于每个接口,要创建4个队列,实际的代码实现中,由于要支持一些工具的操作,如ifconfig的配置等,又创建了两个队列---m_req_q
和m_resp_q
;请求队列和回应队列用于配置。
使用KNI接口上下文的方式,大概是因为内核态和用户态的地址空间不一致。所以要进行地址的转换。
KNI的使用解析
在使用解析这节,以例子中的代码进行说明:整体上,main.c仍旧遵循着DPDK的使用格局
- 1.进行EAL层的初始化
- 2.解析DPDK和应用层的参数
- 3.分配报文的mempool,为接收报文做准备
- 4.初始