背景

最近在做将基于dpdk-16.11.1开发的程序,转移到基于dpdk-18.11版本下开发。遇到了网卡RSS配置的问题,在这里纪录一下。

问题

dpdk-16.11.1

在dpdk-16.11.1上的程序如下:

static uint8_t rss_intel_key[40] = { 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A};static const struct rte_eth_conf port_conf = {.rxmode = {.mq_mode = ETH_MQ_RX_RSS,.split_hdr_size = 0,.header_split   = 0, /**< Header Split disabled */.hw_ip_checksum = 0, /**< IP checksum offload disabled */.hw_vlan_filter = 0, /**< VLAN filtering disabled */.jumbo_frame    = 0, /**< Jumbo Frame Support disabled */.hw_strip_crc   = 0, /**< CRC stripped by hardware */},.rx_adv_conf = {.rss_conf = {.rss_key = rss_intel_key,.rss_hf = ETH_RSS_PROTO_MASK,},},.txmode = {.mq_mode = ETH_MQ_TX_NONE,},
};

rte_eth_dev_configure函数声明

int rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_queue,uint16_t nb_tx_queue, const struct rte_eth_conf *eth_conf);

无论是千兆网卡还是万兆网卡,在调用  rte_eth_dev_configure(port_id, nb_rx_queue, nb_tx_queue, &port_conf)  函数时都可以正常启动。

dpdk-18.11

dpdk-18.11中对 struct rte_eth_conf 结构体进行了修改,使用offloads代替了之前的几个变量标志位,不过这都影响不大。

static uint8_t rss_intel_key[40] = { 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A};static const struct rte_eth_conf port_conf = {.rxmode = {.mq_mode = ETH_MQ_RX_RSS,.max_rx_pkt_len = 0,.split_hdr_size = 0,.offloads = 0,},.rx_adv_conf = {.rss_conf = {.rss_key = rss_intel_key,.rss_key_len = 40,.rss_hf = ETH_RSS_PROTO_MASK,},},.txmode = {.mq_mode = ETH_MQ_TX_NONE,},
};

在调用  rte_eth_dev_configure(port_id, nb_rx_queue, nb_tx_queue, &port_conf)  函数是和16.11.1上是一致的。

在编译完成后,进行运行时发现,报错无法运行。报错如下:

Ethdev port_id=0 invalid rss_hf: 0x3ffffc, valid value: 0x38d34

port_id 0是一个igb驱动的网卡,型号为I350。

报错的意思是在调用 rte_eth_dev_configure 函数时,传入的最后一个函数参数(也就是网卡配置)中的 rx_adv_conf.rss_conf.rss_hf 参数值有问题,这个值是无效的。有效值是 0x38d34。

找到dpdk源码中打印错误信息的位置,前后代码如下:

int
rte_eth_dev_rss_hash_update(uint16_t port_id,struct rte_eth_rss_conf *rss_conf)
{struct rte_eth_dev *dev;struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, };RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);dev = &rte_eth_devices[port_id];rte_eth_dev_info_get(port_id, &dev_info);if ((dev_info.flow_type_rss_offloads | rss_conf->rss_hf) !=dev_info.flow_type_rss_offloads) {RTE_ETHDEV_LOG(ERR,"Ethdev port_id=%u invalid rss_hf: 0x%"PRIx64", valid value: 0x%"PRIx64"\n",port_id, rss_conf->rss_hf,dev_info.flow_type_rss_offloads);return -EINVAL;}RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);return eth_err(port_id, (*dev->dev_ops->rss_hash_update)(dev,rss_conf));
}

dev_info.flow_type_rss_offloads 就是网卡支持的flow类型, rss_conf->rss_hf 就是我们调用 rte_eth_dev_configure 函数的最后一个参考中的  rx_adv_conf.rss_conf.rss_hf 的值,

这里的if判断意思是配置的flow类型必须是网卡支持的flow类型,如果配置了网卡不支持的类型,就会报错。

经过计算器算出 0x38d34的二进制是111000110100110100,再配合在 rte_ethdev.h 中 ETH_RSS_开头的宏定义,得出111000110100110100就是下面所有宏定义的 或 值:

ETH_RSS_IPV4 | \
ETH_RSS_NONFRAG_IPV4_TCP| \
ETH_RSS_NONFRAG_IPV4_UDP| \
ETH_RSS_IPV6 | \
ETH_RSS_NONFRAG_IPV6_TCP | \
ETH_RSS_NONFRAG_IPV6_UDP | \
ETH_RSS_IPV6_EX | \
ETH_RSS_IPV6_TCP_EX | \
ETH_RSS_IPV6_UDP_EX

而我们配置中的参数  ETH_RSS_PROTO_MASK 显然比上面的类型要多,也就是 ETH_RSS_PROTO_MASK 定义的一些类型,网卡不支持,故而报错。

我们再看16.11.1中的源码

int
rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
{struct rte_eth_dev *dev;uint16_t rss_hash_protos;RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);rss_hash_protos = rss_conf->rss_hf;if ((rss_hash_protos != 0) &&((rss_hash_protos & ETH_RSS_PROTO_MASK) == 0)) {RTE_PMD_DEBUG_TRACE("Invalid rss_hash_protos=0x%x\n",rss_hash_protos);return -EINVAL;}dev = &rte_eth_devices[port_id];RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);return (*dev->dev_ops->rss_hash_update)(dev, rss_conf);
}

显然判断逻辑不同的。这里的判断意思是,只要有配置,并且配置中的flow类型至少有1项是在  ETH_RSS_PROTO_MASK  中的就可以,除非你配置的类型都不在  ETH_RSS_PROTO_MASK 中才会报错,这里就可以看出,即使你配置了网卡不支持的特性,也不会报错。

至此问题已解决。

总结

在dpdk-18.11中,配置网卡rss,必须网卡支持这种特性才行,否则会报错。

下面是整理的 igb , ixgbe ,  i40e 驱动网卡所支持的flow类型。

igb支持的特性

测试使用I350及I211网卡,有效值为0x38d34,二进制为111000110100110100,对应宏定义为

#define ETH_RSS_E1000_IGB (\ETH_RSS_IPV4 | \ETH_RSS_NONFRAG_IPV4_TCP| \ETH_RSS_NONFRAG_IPV4_UDP| \ETH_RSS_IPV6 | \ETH_RSS_NONFRAG_IPV6_TCP | \ETH_RSS_NONFRAG_IPV6_UDP | \ETH_RSS_IPV6_EX | \ETH_RSS_IPV6_TCP_EX | \ETH_RSS_IPV6_UDP_EX)

ixgbe支持的特性

测试使用82599ES网卡,有效值和igb相同

#define ETH_RSS_IXGBE ETH_RSS_E1000_IGB

i40e支持的特性

测试使用X710网卡,有效值为0x7ef8,二进制为111111011111000,对应宏定义为

#define ETH_RSS_I40E (\ETH_RSS_FRAG_IPV4 | \ETH_RSS_NONFRAG_IPV4_TCP | \ETH_RSS_NONFRAG_IPV4_UDP | \ETH_RSS_NONFRAG_IPV4_SCTP | \ETH_RSS_NONFRAG_IPV4_OTHER | \ETH_RSS_FRAG_IPV6 | \ETH_RSS_NONFRAG_IPV6_TCP | \ETH_RSS_NONFRAG_IPV6_UDP | \ETH_RSS_NONFRAG_IPV6_SCTP | \ETH_RSS_NONFRAG_IPV6_OTHER | \ETH_RSS_L2_PAYLOAD)

转载于:https://www.cnblogs.com/yanhai307/p/10608323.html

dpdk-18.11网卡多队列RSS设置相关推荐

  1. DPDK 应用层对网卡进行配置(二十四)

    dpdk用户态驱动初始化完成后,应用层就可以来对网卡进行设置操作.对于每一个网卡,应用层都需要调用相应接口进行配置.可以对网卡进行哪些设置操作呢? 例如应用层将对网卡进行配置下发,将配置信息下发给网卡 ...

  2. Linux网卡多队列学习笔记

    Linux网卡多队列的原理 Linux kernel在2.6.21之前不支持网卡多队列的特性,也就是一个网卡只能申请一个中断号. 在2.6.21开始支持网卡多队列,当网卡驱动加载的时候,通过获取网卡型 ...

  3. DPDK 20.11 Dynamic mbuf

    目录 背景 解决方法 申请外部结构 增大mbuf的空间 多种布局 Dynamic mbuf 原理 使用/API 更大的额外空间的需求怎么办? 参考 背景 需要metadata的场景 通用的metada ...

  4. 网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)

    Table of Contents 多队列简介 RPS介绍(Receive Packet Steering) RFS介绍(Receive flow steering) RSS介绍(receive si ...

  5. 网卡多队列、RSS、RPS、RFS

    1.网卡多队列 网卡升级换代之后,变成了多队列网卡,这个队列指的是供网卡DMA读取的ring buffer,即此时网卡会有多个ring buffer. 当有多个数据包到达网卡时,网卡的微处理器,根据数 ...

  6. linux 网卡多队列设置,网卡多队列

    REF 简单命令 推荐使用较新的 Linux 发行版(如 CentOS 7.2)配置网卡多队列. 这里以 CentOS 7.2 为例介绍如何配置网卡多队列,假设是 2 个队列,网卡 interface ...

  7. linux网卡多队列技术

    本篇文章主要是通过阅读了其他人的文章,后续进行了东拼西凑成自己可以理解的样子.但某些细节方面可以再进行深入研究和学习. 参考: https://www.cnblogs.com/lsgxeva/p/11 ...

  8. 网卡多队列,中断配置

    1. 查看每一个cpu的负载以及中断指标:(参考:https://www.cnblogs.com/tcicy/p/10197136.html) 业务方在使用KVM虚拟机进行性能压测时,发现某一个核的s ...

  9. ​十六周一次课(4月11日) 学习完成 18.11 LVS DR模式搭建 18.12 keepalived + LVS

    2019独角兽企业重金招聘Python工程师标准>>> 18.11 LVS DR模式搭建 准备工作:三台机器 分发器,也叫调度器(简写为dir) 192.134 rs1 192.13 ...

最新文章

  1. “五心”知“五感”,平安打造有温度的智慧城市
  2. 如何测试大端存储和小端存储
  3. SAP Spartacus cxOutlet里的元数据存储,outlet名称和待渲染Component的映射关系
  4. k8s dashboard_k8s集群部署Dashboard
  5. 数据中异常值的鉴定和处理(1)
  6. 用python的pandas打开csv文件_使用CSV模块和Pandas在Python中读取和写入CSV文件
  7. SQL SERVER游标浅析
  8. “互联网+”从业务本质重构业务形态
  9. 邮件服务器篇:杀毒引擎选择论据
  10. Java编程:普里姆算法(已知起点求最小生成树)
  11. 项目总结报告(联东U谷)
  12. 华为设备无线环境中的Portal认证
  13. [JZOJ6080]【GDOI2019模拟2019.3.23】IOer【生成函数】【数学】
  14. 自适应遗传算法(AGA)《Adaptive Probabilities of Crossover》的剖析
  15. Caused by: org.elasticsearch.action.search.SearchPhaseExecutionException报错解决
  16. Kubeadm创建集群
  17. 《信息学奥赛一本通》宠物小精灵之收服
  18. RocketMQ的消费者消息重试和生产者消息重投
  19. ecshop小京东模板切换到smarty3.13之模板函数,用模板函数替换楼层
  20. python n维向量向任意方向旋转,求旋转矩阵

热门文章

  1. CTF-安恒19年二月月赛部分writeup
  2. go语言基础语法篇-变量
  3. docker版MySQL5.7容器管理
  4. Jupyter notebook的安装及使用
  5. 哪里有c语言教学视频,C语言教学视频(共32课更新完毕)(献给所有的爱好计算机的同学)(更新c+)...
  6. python打印汉字报错_python中文输出报错解决方案(实例教程)
  7. 锂电池储能系统建模发展现状及其数据驱动建模初步探讨
  8. 深度学习算法训练和部署流程介绍--让初学者一篇文章理解算法训练和部署流程
  9. 网页导出pdf不完整_试用:福昕PDF在线编辑器
  10. 【Linux】循序渐进学运维-服务篇-rysnc安装及使用