驱动版本i40e-2.10.19.82,在ifconfig将网口down的时候,发现链路并没有断开,网卡的指示灯还是亮的。如下为控制网卡shutdown的函数:
/**
* i40e_down - Shutdown the connection processing
* @vsi: the VSI being stopped
**/
void i40e_down(struct i40e_vsi *vsi)
{
int i;
/* It is assumed that the caller of this function
* sets the vsi->state __I40E_VSI_DOWN bit.
*/
if (vsi->netdev) {
netif_carrier_off(vsi->netdev);
netif_tx_disable(vsi->netdev);
}
i40e_vsi_disable_irq(vsi);
i40e_vsi_stop_rings(vsi);
if ((vsi->type == I40E_VSI_MAIN) &&
(vsi->back->flags & I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED))
i40e_force_link_state(vsi->back, false);
以上可见,如果没有设置标志位I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED,链路操作函数i40e_force_link_state不会执行。相应的在函数i40e_up中,也是根据此标志位,决定是否将链路启用。
/**
* i40e_up - Bring the connection back up after being down
* @vsi: the VSI being configured
**/
int i40e_up(struct i40e_vsi *vsi)
{
int err;
if (vsi->type == I40E_VSI_MAIN &&
(vsi->back->flags & I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED))
i40e_force_link_state(vsi->back, true);
err = i40e_vsi_configure(vsi);
if (!err)
err = i40e_up_complete(vsi);
return err;
链路不关闭将导致对端设备感知不到,影响路由协议的切换。在初始化函数i40e_sw_init中(其在i40e_probe函数中调用),增加标志I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED即可。不太清楚INTEL为什么没有默认设置此标志位。
static int i40e_sw_init(struct i40e_pf *pf)
{
...
/* Set default capability flags */
pf->flags = I40E_FLAG_RX_CSUM_ENABLED |
I40E_FLAG_MSI_ENABLED |
I40E_FLAG_MSIX_ENABLED;
pf->flags |= I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED;