dpdk-19.11 支持接口配置速率双工的方法

前言

常见的 igb 电口网卡有支持速率双工配置的需求,在 dpdk-19.11 中却没有配置网卡速率双工的接口,为此需要进行开发,实现方法需要通过研究不同网卡的驱动代码来确定。

本文中以 igb 网卡驱动为例进行描述。

研究 igb 网卡驱动

dpdk-19.11 中的 igb 网卡驱动在执行 eth_igb_start up 接口的时候会配置速率双工。

相关的代码如下:

1349     /* Setup link speed and duplex */
1350     speeds = &dev->data->dev_conf.link_speeds;
1351     if (*speeds == ETH_LINK_SPEED_AUTONEG) {
1352         hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX;
1353         hw->mac.autoneg = 1;
1354     } else {
1355         num_speeds = 0;
1356         autoneg = (*speeds & ETH_LINK_SPEED_FIXED) == 0;
1357     
1358         /* Reset */
1359         hw->phy.autoneg_advertised = 0;
1360         
1361         if (*speeds & ~(ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M |
1362                 ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M |
1363                 ETH_LINK_SPEED_1G | ETH_LINK_SPEED_FIXED)) {
1364             num_speeds = -1;
1365             goto error_invalid_config;
1366         }
1367         if (*speeds & ETH_LINK_SPEED_10M_HD) {
1368             hw->phy.autoneg_advertised |= ADVERTISE_10_HALF;
1369             num_speeds++;
1370         }   
...............
1387         if (num_speeds == 0 || (!autoneg && (num_speeds > 1)))
1388             goto error_invalid_config;
1389 
1390         /* Set/reset the mac.autoneg based on the link speed,
1391          * fixed or not
1392          */
1393         if (!autoneg) {
1394             hw->mac.autoneg = 0;
1395             hw->mac.forced_speed_duplex =
1396                     hw->phy.autoneg_advertised;
1397         } else {
1398             hw->mac.autoneg = 1;
1399         }

1402     e1000_setup_link(hw);

上述代码的主要逻辑如下:

  1. 获取 dev->data->dev_conf.link_speeds 变量中设置的 link_speeds,获取速率双工配置状态
  2. 根据 link_speeds 变量的值设置驱动内部变量如 hw->phy.autoneg_advertised、hw->mac.autoneg、hw->mac.forced_speed_duplex 的值
  3. 调用 e1000_setup_link 配置设置的速率双工

按照上面的流程,我们只需要设置 dev->data->dev_conf.link_speeds 的值,然后重新将接口 up 起来就能够实现速率双工配置了。

测试验证过程

经过上文的分析,已经确定了 igb 网卡速率双工配置的方法,需要验证可行性。
可以在 e1000_setup_link 函数调用前执行如下代码:

 hw->mac.autoneg = 0;
 hw->mac.forced_speed_duplex = ADVERTISE_100_FULL;

这两行代码配置接口速率双工为强制 100M 全双工,修改代码后使用 kni 程序测试,对端接口绑定到内核驱动上,测试有效!

igb 网卡默认的速率双工配置

设置方案确定后,不能忘了 igb 网卡默认的速率双工配置项目。一般来说,在 rte_eth_dev_configure 未通过 dev_conf 设定 link_speeds 的值则默认为 0。

eth_igb_dev_init 函数中的如下代码配置接口使用自协商模式,并指定协商速率为所有支持的速率与双工模式。

 793     hw->mac.autoneg = 1;
 794     hw->phy.autoneg_wait_to_complete = 0;
 795     hw->phy.autoneg_advertised = E1000_ALL_SPEED_DUPLEX;

dpdk-19.11 获取接口支持的速率双工配置

在设置速率双工前,可以添加一些检查,检查待设置的模式当前网卡是否支持。可以通过调用 rte_eth_dev_info_get 函数来获取 dev_info 结构来实现,dev_info 结构中的 speed_capa 字段代表了当前网卡支持的速率双工配置。

对 igb 网卡来说,speed_capa 字段通过 eth_igb_infos_get 函数的如下代码来填充:

2286     dev_info->speed_capa = ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M |
2287             ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M |
2288             ETH_LINK_SPEED_1G;

获取到了之后就可以进行检查!

总结

本文以 igb 驱动为例描述了 dpdk-19.11 支持接口配置速率双工的方法,这一方法适用于多个驱动,是一个相对通用的方法。速率双工配置也是网卡驱动应当对外提供的常见功能,不过这里 dpdk 的处理过程有些特别,它将配置集中到对 dev->data->dev_conf.link_speeds 变量的设定上了!

你可能感兴趣的:(dpdk,dpdk-19.11,igb,网卡,速率双工配置,dpdk,速率双工配置接口)