背景

最近在做将基于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. gradle多工程打包冲突问题
  2. php disable classes,PHP安全配置基础教程(3)
  3. how to add one row in the dataframe?
  4. linux ntfs 用户权限,Linux在NTFS中创建的文件的权限
  5. J2EE中的各种工程的介绍
  6. innerXml,outerXml,innerText的不同
  7. HDOJ--1106排序
  8. 2015高教杯全国大学生数学建模竞赛论文
  9. openpyxl实现表头隔行插入及合并单元格
  10. ddns的搭建(动态域名解析DDNS)
  11. 项目管理过程 工作绩效数据,信息和报告
  12. 【天工Godwork精品教程】任务二:导入控制点、POS权重设置、连接点分布检查、自由空三
  13. 部署Tomcat服务器
  14. 京东移动端首页-流式布局
  15. 判断通过微信、支付宝扫一扫进入的页面
  16. c语言输出形式tap间隔,C语言输出格式总结.doc
  17. 二次型如何快速转化为矩阵?
  18. 第41章 RS-485通讯实验—零死角玩转STM32-F429系列
  19. 中国现代书画家——张士高、崔世年、姚子华等
  20. 流行编曲宿主DAW的新版本FL Studio 21“即将到来”

热门文章

  1. 光子计算机科学家,科学家从真空中创造出光子
  2. 企业找代理记账公司后是否就不用管了?
  3. vite下,修改node_modules源码后,在浏览器源码中看不到改动的内容
  4. android studio文件内部存储,Android Studio使用内部存储上的文件创建diconary
  5. ChromeDriver资源下载
  6. 利用selenium爬取携程旅游网的景区评论
  7. ies4linux+打包下载,安装ies4linux
  8. windows下gitkraken以及GitHub desktop的详细介绍
  9. 媳妇儿让我给她找一个PDF转word免费工具,找了半天我决定给她写一个出来^-^
  10. centos7.6配置网络并固定ip地址