Linux 网卡如何支持TSO GSO指南

来源链接:http://gavin1992.gotoip2.com/papperdetails_tech.php?pid=11
 

1.什么是TSO GSO

  TSO是tcp segment offload的缩写,GSO是 generic segmentation offload 的缩写

  详细解释参看http://en.wikipedia.org/wiki/Large_segment_offload

  对TSO的简单理解就是:

   比如:我们要用汽车把3000本书送到另一个城市,每趟车只能装下1000本书,

那么我们就要书分成3次来发。如何把3000本书分成3份的事情是我们做的,汽车司机只负责运输。

  TSO的概念就是:我们把3000本书一起给司机,由他去负责拆分的事情,这样我们就有更多的时间处理其他事情。

  对应到计算机系统中,“我们”就是CPU,“司机”就是网卡。

  在网络系统中,发送tcp数据之前,CPU需要根据MTU(一般为1500)来将数据放到多个包中发送,对每个数据包都要添加ip头,tcp头,分别计算IP校验和,TCP校验和。如果有了支持TSO的网卡,CPU可以直接将要发送的大数据发送到网卡上,由网卡硬件去负责分片和计算校验和。

 

2. TSO GSO网卡驱动与系统的接口:

 

步骤1.       设置支持TSO support flag 同时需要支持SG

     netdev->features |= NETIF_F_TSO;

     netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;

 

 

步骤2       设置GSO最大值

netdev ->gso_max_size = 8*1024;  //网卡支持的gso size,通知系统每个tcp数据块的最大长度。

                                                    //TCP的窗口大小最大为64K,

 

步骤3:  发送函数需要处理skb数据

 支持tso的skb数据存储格式如下:

第一块数据存储在skb的data->tail之间,其他分块存储在skb_shinfo(skb)->frags中。

代码示例如下:

 

View Code
复制代码
int  xmit_support_sg_tso( struct  sk_buff  * skb)
{
    size 
=  (skb -> tail  -  skb -> data);   //  the first fragment is stored in the skb.
     for  (f  =   0 ; f  <  skb_shinfo(skb) -> nr_frags; f ++ )    {
            size 
+=  skb_shinfo(skb) -> frags[f].size;  /// /other frags .
    }

    memcpy(dbg_send_queue, skb
-> data,   skb -> tail  -  skb -> data);    // real first frag
     for  (f  =   0 ; f  <  skb_shinfo(skb) -> nr_frags; f ++ )   // process frags.
    {
            
struct  skb_frag_struct  * frag;
            
int  f_offset  =   0 ;
            
int  f_len  =   0 ;
            
char   * addr;
            
            frag 
=   & skb_shinfo(skb) -> frags[f];
            f_len 
=  frag -> size;
            f_offset 
=  frag -> page_offset;

            addr 
=  ( char   * )page_address(frag -> page) ;   // change page addr to virt addr.
            
           memcpy(dbg_send_queue, addr 
+  f_offset,         f_len);             
           offset 
+=  f_len;
    }
}
复制代码

 

步骤4: 支持    ethtool

static struct ethtool_ops comNIC_ethtool_ops = {

    .get_settings           = netdev_get_settings,

    .set_settings           = netdev_set_settings,

    .get_drvinfo            = netdev_get_drvinfo,

    .get_link               = netdev_get_link,

    .get_rx_csum            = cmb_ethtool_op_get_rx_csum,

    .set_rx_csum            = cmb_ethtool_op_set_rx_csum,

    .get_tx_csum            = cmb_ethtool_op_get_tx_csum,

    .set_tx_csum            = cmb_ethtool_op_set_tx_csum,

    //.set_sg                 = ethtool_op_set_sg,

#ifdef NETIF_F_TSO

    .get_tso                = cmb_ethtool_op_get_tso,

    .set_tso                = cmb_ethtool_op_set_tso,

#endif

}

 

命令行检验:

 

查看是否支持tso gso等:

ethtool -k comnic0

 

  设置tso gso打开和关闭

ethtool -K comnic0 tso off

ethtool -K comnic0 gso off

 

-----------------------------------驱动对tso gso的支持完成-----------------------------------------------

ps:1.支持tso需要同时声明支持scattle / gather, 因为skb的分片数据不是存储在一个连续的地址上。当然:网卡硬件可以不支持scattle/gather这种DMA方式。

2. 需要同时支持硬件校验和。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
概述 TSO系列角度传感器(又名:角位移)是我公司生产的用于检测角度变化的高性能产品,它利用最新角度传感技术将变化的角度转换成线性的模拟电压信号。本产品具有无使用寿命限制、造型美观、内部采用电子限位、安全可靠、成本低、功耗低等特点。采用轴套安装设计。本产品紧跟当今世界先进的角度传感技术。与其它角度传感器比较有着不可比拟的优点,本产品无任何机械转动装置,具有无触点、无磨损、无转动惯性,实现了真正意义上的永久性使用。 TSO系列角度传感器适用于检测设备的角度和位置变化,从而实现设备的自动控制。用户可直接用锁紧螺丝固定安装在需要检测角度的位置或松紧架出轴上,安装结构极其简便美观,为用户降低成本。具有防水能力,免维护,可广泛应用于拉丝机、纺织、染整、无纺布、造纸、皮革、线缆等有收放卷、角度检测和多单元同步控制要求的场合。 产品规格和技术指标 型号 技术指标 TSO-B5 TSO-B24 TSO-C24 TSO-D24 电源电压(DC) ±5V±10% 24V±2V 24V±2V 24V±2V 额定功率、电流 0.5W 35mA 1W 42mA 1W 42mA 0.6W 25mA 有效测量角度 ±90° ±90° ±90° 0-90° 信号输出 ±45°对应±3V ±45°对应±5V 给定信号叠加角度信号 0-90°对应0-10V 输出线性度 0.5% 1% 1% 1% 输出稳定度 0.5% 0.5% 0.5% 0.5% 输出驱动能力 5mA 5mA 5mA 5mA 越位继电器输出 1A 1A 1A 1A 增益调节 有 有 有 有 极性转换功能 有 有 有 有 工作环境温度 -10~60° -10~60° -10~60° -10~60° 使用寿命 无限 无限 无限 无限 注:具体使用详见各型号使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值