以太网流量控制XON/XOFF

网卡驱动 专栏收录该内容
14 篇文章 0 订阅

当以太网卡不能处理对端发送的数据帧时,将发送‘PAUSE’帧到对端,请求暂停发送。当本端以太网卡可处理更多数据时,或者‘PAUSE’请求的暂停时间超时,对端可继续发送数据。可使用以下的ethtool命令查看网卡的流控设置。

$ ethtool --show-pause eth0     
Pause parameters for eth0:
Autonegotiate:  on
RX:             on
TX:             on

$ 

如下命令可对网卡的‘PAUSE’功能进行设置:

$ ethtool --pause eth0 autoneg off
$ ethtool --pause eth0 rx off
$ ethtool --pause eth0 tx off 
$
$ ethtool --show-pause eth0  
Pause parameters for eth0:
Autonegotiate:  off
RX:             off
TX:             off

$ 

如下命令可查看网卡接收发送PAUSE帧的统计信息:

$ ethtool --statistics eth0  | grep flow_control
     rx_flow_control_xon: 0
     rx_flow_control_xoff: 0
     tx_flow_control_xon: 0
     tx_flow_control_xoff: 0
$ 

PAUSE时长

每个PAUSE/Xoff帧包含一个时间值’Quanta’,其长度为16bit,即取值范围[0, 65535]。其单位为512bit的传输时间,即1个quanta等于传输512bit的时间。对于1Gbps的网络接口,其传输1个bit的时间为:1/1,000,000,000bps,一个quanta的时长为:512*1/1,000,000,000bps。所以PAUSE帧请求的暂停时间最长为:

   65535*512*1/1,000,000,000 = 0.03355392秒 ~= 33.55ms

对于10Gbps速率的网络接口,最长的PAUSE时长为:

   65535*512*1/1,000,000,000 / 10 = 0.03355392 / 10 秒 ~= 3.355ms

对于100Mbps速率的网络接口,最长的PAUSE时长为大约335.5毫秒。

内核PAUSE统计

以intel的82599网卡,驱动ixgbe为例,在内核中使用ixgbe_hw_stats结构的成员lxontxc和lxofftxc分别表示发送的XON帧和XOFF帧,使用成员lxonrxc和lxoffrxc分别表示接收到的XON帧和XOFF帧。

static const struct ixgbe_stats ixgbe_gstrings_stats[] = {
    {"tx_flow_control_xon", IXGBE_STAT(stats.lxontxc)},
    {"rx_flow_control_xon", IXGBE_STAT(stats.lxonrxc)},
    {"tx_flow_control_xoff", IXGBE_STAT(stats.lxofftxc)},
    {"rx_flow_control_xoff", IXGBE_STAT(stats.lxoffrxc)},
}
/* Statistics counters collected by the MAC */
struct ixgbe_hw_stats {
    u64 lxontxc;
    u64 lxonrxc;
    u64 lxofftxc;
    u64 lxoffrxc;
    u64 pxontxc[8];
    u64 pxonrxc[8];
    u64 pxofftxc[8]; 
    u64 pxoffrxc[8];
}

文件ixgbe_main.c中的函数ixgbe_update_stats负责读取网卡相关寄存器更新统计数据,包括IXGBE_LXONRXCNT寄存器中的XON帧接收数量;寄存器IXGBE_LXONTXC中的XON发送的数量;以及IXGBE_LXOFFTXC寄存器中XOFF帧的发送数量。

void ixgbe_update_stats(struct ixgbe_adapter *adapter)
{
    struct net_device *netdev = adapter->netdev;
    struct ixgbe_hw *hw = &adapter->hw;
    struct ixgbe_hw_stats *hwstats = &adapter->stats;

    switch (hw->mac.type) {
    case ixgbe_mac_82599EB:
        hwstats->lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);

    lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
    hwstats->lxontxc += lxon;
    lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
    hwstats->lxofftxc += lxoff;
}

在函数ixgbe_update_xoff_rx_lfc中,由寄存器IXGBE_LXOFFRXCNT中获取统计数据,更新接收的XOFF的数量信息。

static void ixgbe_update_xoff_rx_lfc(struct ixgbe_adapter *adapter)
{
    struct ixgbe_hw *hw = &adapter->hw;
    struct ixgbe_hw_stats *hwstats = &adapter->stats;

    switch (hw->mac.type) {
    default:
        data = IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
    }
    hwstats->lxoffrxc += data;

内核版本 4.15

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值