dpdk 16.11.2 upgrade to 19.11.5

刚开始开发时使用的是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
    3
    app中不需要定义了,因为已经在rte.vars.mk中增加了定义
    # always define _GNU_SOURCE
    CFLAGS += -D_GNU_SOURCE
    
  • 网卡初始化参数
    1
    2
    struct 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
    4
    struct rte_kni_ops->port_id参数设置注意事项:
    当由bond口收包时,需要设置成bond口id;
    当由bond口的物理口收包时,需要设置成bond口的primary物理口;
    否则当调用ip link set dev vEth0 up时,会报 port already stopped错误,导致kni启动失败。