DPDK版本:19.02
关于kni的接口,rte_kni.h的注释比较详细了,用法参考demo就行
这里分析一下kni接口配置的结构体
创建kni接口的API原型:
struct rte_kni *rte_kni_alloc(struct rte_mempool *pktmbuf_pool,
const struct rte_kni_conf *conf, struct rte_kni_ops *ops);
核心结构:
struct rte_kni_conf {
/*
* KNI name which will be used in relevant network device.
* Let the name as short as possible, as it will be part of
* memzone name.
*/
char name[RTE_KNI_NAMESIZE];
uint32_t core_id; /* Core ID to bind kernel thread on */
uint16_t group_id; /* Group ID */
unsigned mbuf_size; /* mbuf size */
struct rte_pci_addr addr;
struct rte_pci_id id;
__extension__
uint8_t force_bind : 1; /* Flag to bind kernel thread */
char mac_addr[ETHER_ADDR_LEN]; /* MAC address assigned to KNI */
uint16_t mtu;
};
根据rte_kni.c和驱动,详细说明一下这些成员的作用
name
顾名思义,创建的kni接口的名字。驱动内有一个链表维护所有创建的kni接口,通过名字定位
core_id, force_bind
这两个放在一起解释。kni接口创建后,驱动会创建一个内核线程负责io,这个线程可以绑定到指定的core上。
如果force_bind有效,那么驱动会把创建的内核线程绑定到core_id指定的core上。force_bind为0的话,实际上core_id也没什么用
group_id
kni接口在内核会注册为一个netdev设备,自然也继承了netdev的一些公共操作接口,比如ioctl(ndo_do_ioctl)
group_id在ioctl里面会用到,但是当前版本也仅仅是debug打印以下,功能上没有用到。可能后续可以用来组管理kni接口吧。
mbuf_size
内核收发数据时的内存都是从rte_kni_alloc的pktmbuf_pool分配的
发送的时候会判断skb的长度是否超过mbuf_size,超过的话会drop掉
这个内存是从mempool申请的,自然每次发送的长度不能超过mempool每个成员的长度。
所以这个成员值应该不大于rte_kni_alloc里面pktmbuf_pool的buffer_size
addr, id
这些都是pci相关的东西,一般不通过手工指定吧,可以先通过rte_eth_dev_info_get把这些信息取出来
mac_addr
配置接口的mac地址,应该也可以沿用rte_eth_dev_info_get取出来的值吧
mtu
配置接口的mtu值,应该也可以沿用rte_eth_dev_info_get取出来的值吧