刚开始开发时使用的是dpdk16.11.2,后面开发过程中需要用到新版本的特性,比如flow director、新版本Mellanox驱动、更好的性能(无锁hash表)等,所以需要升级dpdk,选择比较新的版本dpdk19.11.5。
源码安装19.11.5
参考《dpdk-19.11.5安装》https://zhaotao19860.github.io/dpdk/2021/02/16/dpdk-19.11.5-install.html.
修改dpdk-app
- rte_ring_dequeue_bulk(doc/guides/rel_notes/release_17_05.rst)
1
2
3
4增加参数:available,用于返回ring中剩余元素个数(可设置为NULL) rte_ring_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned n) 改为: rte_ring_dequeue_bulk(struct rte_ring *r, void **obj_table, unsigned int n,unsigned int *available) - rte_ring_dequeue_burst(doc/guides/rel_notes/release_17_05.rst)
1
2
3
4增加参数:available,用于返回ring中剩余元素个数(可设置为NULL) rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned n) 改为: rte_ring_dequeue_burst(struct rte_ring *r, void **obj_table, unsigned int n,unsigned int *available) - rte_eth_dev_count(doc/guides/rel_notes/release_18_05.rst)
1
2
3
4函数名变化 uint8_t rte_eth_dev_count(void) 改为: uint16_t rte_eth_dev_count_avail(void) - rte_set_log_level(doc/guides/rel_notes/release_17_11.rst)
1
2
3
4函数名变化 void rte_set_log_level(uint32_t level) 改为: void rte_log_set_global_level(uint32_t level) - rte_get_log_level(doc/guides/rel_notes/release_17_11.rst)
1
2
3
4函数名变化 void rte_get_log_level(uint32_t level) 改为: void rte_log_get_global_level(uint32_t level) - 报文头结构体
1
2
3
4
5
6
7
8
9
10
11由linux结构体改为dpdk自定义结构体(内容不变) struct ether_hdr 改为 struct rte_ether_hdr struct ipv4_hdr 改为 struct rte_ipv4_hdr struct ipv6_hdr 改为 struct rte_ipv6_hdr struct udp_hdr 改为 struct rte_udp_hdr struct tcp_hdr 改为 struct rte_tcp_hdr ETHER_TYPE_IPv4 改为 RTE_ETHER_TYPE_IPV4 ETHER_TYPE_IPv6 改为 RTE_ETHER_TYPE_IPV6 ETHER_TYPE_ARP 改为 RTE_ETHER_TYPE_ARP ETHER_TYPE_RARP 改为 RTE_ETHER_TYPE_RARP ETHER_TYPE_VLAN 改为 RTE_ETHER_TYPE_VLAN - _GNU_SOURCE
1
2
3app中不需要定义了,因为已经在rte.vars.mk中增加了定义 # always define _GNU_SOURCE CFLAGS += -D_GNU_SOURCE - 网卡初始化参数
1
2struct rte_eth_conf->rxmode将offloads参数改为使用.offloads配置 struct rte_kni_conf->addr/id删除 - bond网卡名称(link_bonding_poll_mode_drv_lib.rst)
1
改为必选已"net_bonding"开头 - kni内核模块(doc/guides/rel_notes/release_18_11.rst)
1
2
3
4
5内核模块初始化参数: carrier状态默认改为off,若不启用会导致kni网卡启动失败。 insmod ./rte_kni 改为 insmod ./rte_kni carrier=on - bond-kni配置参数(原因未知)
1
2
3
4struct rte_kni_ops->port_id参数设置注意事项: 当由bond口收包时,需要设置成bond口id; 当由bond口的物理口收包时,需要设置成bond口的primary物理口; 否则当调用ip link set dev vEth0 up时,会报 port already stopped错误,导致kni启动失败。