背景

最近在做将基于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函数声明

intrte_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源码中打印错误信息的位置,前后代码如下:

intrte_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中的源码

intrte_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)

rss对称网卡linux,dpdk-18.11网卡多队列RSS设置相关推荐

  1. linux下如何重启网卡,linux系统如何重启网卡

    大家在实际工作中,经常会遇到Linux系统进行重启网卡的操作,那么具体如何进行重启呢?下面就由学习啦小编跟大家分享一下操作步骤吧,希望对大家有所帮助~ linux系统重启网卡的方法 一.service ...

  2. Linux拔掉网卡,linux系统怎么重启网卡?linux重启网卡的三种教程

    在实际工作中,经常会遇到Linux系统进行重启网卡的操作.在这里整理一下,进行多种方法的网卡重启. 一.service network restart 1.首先用CRT工具连接到Linux命令行界面. ...

  3. linux安装8168网卡,Fedora 配置 RTL8168/8111 网卡 Linux下 RTL8168/8111 网卡配置

    方法一. 官方下载Linux下驱动 r1000_r1.05.tgz 开始安装网卡驱动模块:进入存放rpm包的文件夹,这里我放在了/usr/src下面 #cd /usr/src #tar -zxvf r ...

  4. inteli211网卡linux驱动,Intel i211网卡在server2016中无驱动的解决方案

    Intel为增加其服务器版本的主板销量,对一些非服务器的网卡,不提供驱动支持,所以在一些PC机.工控机.嵌入式系统上,你会为装了server2012R2或SERVER2016,却找不到网卡驱动而抓狂. ...

  5. F2FS nat entry涉及的数据结构(linux 5.18.11)

    nat entry(简称ne)在代码中涉及多个数据结构,先上图. 图1 ne涉及的数据结构关系图 大的原则 1)红色部分是disk layout中的(持久化存储):蓝色部分是内存数据结构. 2)系统中 ...

  6. Linux Mint 18.2安装WPS之优化设置

    1.WPS安装 首先去官网下载:WPS 安装: sudo dpkg -i wps-office_10.1.0.5672~a21_amd64.deb 或者,右键–使用GDebi安装 2.优化设置 1)因 ...

  7. DPDK 20.11 Dynamic mbuf

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

  8. linux pci 网卡驱动,linux网络设备驱动_pci网卡

    <linux网络设备驱动_pci网卡>由会员分享,可在线阅读,更多相关<linux网络设备驱动_pci网卡(12页珍藏版)>请在技术文库上搜索. 1. LinuxLinux 网 ...

  9. Linux RHEL 7.9网卡配置bond0(主备模式)

    Linux RHEL 7.9网卡配置bond0(主备模式) 一.实验环境准备及规划 系统:RHEL 7.9 网卡bond0(主备模式):ens33ens37bond0:192.168.100.40 v ...

  10. linux 3g拨号,嵌入式Linux系统实现3G网卡拨号

    嵌入式Linux系统实现3G网卡拨号 本文介绍在嵌入式Linux中,实现3G联网的基本方法.包括驱动配置,和联网的过程.也对在PC上实现3G的过程进行了介绍. 硬件:3g usb模块(华为ce189的 ...

最新文章

  1. 分布式链路追踪zipkin
  2. kuka机器人股票代码_【内幕】溢价收购KUKA机器人 美的钱从哪来?
  3. vue 项目引用static目录资源_vuejs-templates静态资源目录src/assets、和static/区别
  4. MySQL运行一段时间后自动停止问题的排查
  5. 想在研发群里装?先学会这几个排查K8s问题的办法
  6. (Command Pattern)命令模式
  7. mysql 字符串截取_MySQL|SUBSTR() 函数用法
  8. vCenter如何逃离Windows的坑(转)
  9. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件
  10. SQLServer性能优化之活用临时表
  11. 计算机考研839,2018年北京语言大学计算机软件与理论839计算机系统与设计之计算机操作系统考研基础五套测试题...
  12. WEB前端性能优化及应用服务器性能优化和存储性能优化
  13. CentOS配置postgresql+postsql
  14. 设置新版谷歌浏览器自动启用flash
  15. 如何制定人生目标和实现目标
  16. 一次做数据报表的踩坑经历,让我领略了数据同步增量和全量的区别
  17. Javascript_备忘录1
  18. 32位计算机支持word系统,Office 32位与64位版本有什么区别?
  19. css实现3D动画效果——正方体变六边形
  20. Stimulsoft Reports如何进行数据连接

热门文章

  1. 欧洲计算机专业排名,最新!2021年QS世界大学学科排名发布!欧洲各国各学科专业排名表现抢眼!...
  2. pdf关键字高亮 java_Java 查找、高亮PDF文本
  3. 微信小程序-005-投票功能-设置投票
  4. 选拔人才要关注的七个方面
  5. Google seo图片优化技巧
  6. OpenGL纹理叠加基础知识
  7. 进入Tokio的异步世界
  8. audacity音轨加伴奏_如何在Audacity中使用Crossfade进行音轨之间的无缝过渡
  9. 进制转化——2022蓝桥杯(E题)
  10. wps忘保存关闭,数据恢复步骤