• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > linux tcp GSO和TSO实现

linux tcp GSO和TSO实现

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了影驰9600gso显卡,9600gso512显卡驱动,影驰 9600gso加强版,gso,9600gso等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

linux tcp GSO和TSO实现


linux tcp GSO和TSO实现

——lvyilong316

(注:kernel版本:linux 2.6.32)

概念

TSO(TCP Segmentation Offload):是一种利用网卡来对大数据包进行自动分段,降低CPU负载的技术。其主要是延迟分段。

GSO(Generic Segmentation Offload): GSO是协议栈是否推迟分段,在发送到网卡之前判断网卡是否支持TSO,如果网卡支持TSO则让网卡分段,否则协议栈分完段再交给驱动。如果TSO开启,GSO会自动开启。

以下是TSO和GSO的组合关系:

lGSO开启,TSO开启:协议栈推迟分段,并直接传递大数据包到网卡,让网卡自动分段

lGSO开启,TSO关闭:协议栈推迟分段,在最后发送到网卡前才执行分段

lGSO关闭,TSO开启:同GSO开启,TSO开启

lGSO关闭,TSO关闭:不推迟分段,在tcp_sendmsg中直接发送MSS大小的数据包

开启GSO/TSO

驱动程序在注册网卡设备的时候默认开启GSO: NETIF_F_GSO

驱动程序会根据网卡硬件是否支持来设置TSO: NETIF_F_TSO

可以通过ethtool -K来开关GSO/TSO


  1. #define NETIF_F_SOFT_FEATURES(NETIF_F_GSO|NETIF_F_GRO)
  2. intregister_netdevice(struct net_device*dev)
  3. {
  4. ...
  5. /*Transfer changeable featurestowanted_featuresandenable
  6. *software offloads(GSOandGRO).
  7. */
  8. dev->hw_features|=NETIF_F_SOFT_FEATURES;
  9. dev->features|=NETIF_F_SOFT_FEATURES;//默认开启GRO/GSO
  10. dev->wanted_features=dev->features&dev->hw_features;
  11. ...
  12. }
  13. staticintixgbe_probe(struct pci_dev*pdev,conststruct pci_device_id*ent)
  14. {
  15. ...
  16. netdev->features=NETIF_F_SG|
  17. NETIF_F_TSO|
  18. NETIF_F_TSO6|
  19. NETIF_F_RXHASH|
  20. NETIF_F_RXCSUM|
  21. NETIF_F_HW_CSUM;
  22. register_netdev(netdev);
  23. ...
  24. }


是否推迟分段

从上面我们知道GSO/TSO是否开启是保存在dev->features中,而设备和路由关联,当我们查询到路由后就可以把配置保存在sock中。

比如在tcp_v4_connect和tcp_v4_syn_recv_sock都会调用sk_setup_caps来设置GSO/TSO配置。

需要注意的是,只要开启了GSO,即使硬件不支持TSO,也会设置NETIF_F_TSO,使得sk_can_gso(sk)在GSO开启或者TSO开启的时候都返回true

lsk_setup_caps


  1. #define NETIF_F_GSO_SOFTWARE(NETIF_F_TSO|NETIF_F_TSO_ECN|NETIF_F_TSO6)
  2. #define NETIF_F_TSO(SKB_GSO_TCPV4<

  3. void sk_setup_caps(struct sock*sk,struct dst_entry*dst)
  4. {
  5. __sk_dst_set(sk,dst);
  6. sk->sk_route_caps=dst->dev->features;
  7. if(sk->sk_route_caps&NETIF_F_GSO)/*GSO默认都会开启*/
  8. sk->sk_route_caps|=NETIF_F_GSO_SOFTWARE;/*打开TSO*/
  9. if(sk_can_gso(sk)){/*对于tcp这里会成立*/
  10. if(dst->header_len){
  11. sk->sk_route_caps&=~NETIF_F_GSO_MASK;
  12. }else{
  13. sk->sk_route_caps|=NETIF_F_SG|NETIF_F_HW_CSUM;
  14. sk->sk_gso_max_size=dst->dev->gso_max_size;/*GSO_MAX_SIZE=65536*/
  15. }
  16. }
  17. }


从上面可以看出,如果设备开启了GSO,sock都会将TSO标志打开,但是注意这和硬件是否开启TSO无关,硬件的TSO取决于硬件自身特性的支持。下面看下sk_can_gso的逻辑。

lsk_can_gso


  1. static inlineintsk_can_gso(conststruct sock*sk)
  2. {
  3. /*对于tcp,在tcp_v4_connect中被设置:sk->sk_gso_type=SKB_GSO_TCPV4*/
  4. return net_gso_ok(sk->sk_route_caps,sk->sk_gso_type);
  5. }


lnet_gso_ok


  1. static inlineintnet_gso_ok(intfeatures,intgso_type)
  2. {
  3. intfeature=gso_type<
  4. return(features&feature)==feature;
  5. }


由于对于tcp在sk_setup_caps中sk->sk_route_caps也被设置有SKB_GSO_TCPV4,所以整个sk_can_gso成立。

GSO的数据包长度

对紧急数据包或GSO/TSO都不开启的情况,才不会推迟发送,默认使用当前MSS。开启GSO后,tcp_send_mss返回mss和单个skb的GSO大小,为mss的整数倍。

ltcp_send_mss


  1. staticinttcp_send_mss(struct sock*sk,int*size_goal,intflags)
  2. {
  3. intmss_now;

  4. mss_now=tcp_current_mss(sk);/*通过ip option,SACKs及pmtu确定当前的mss*/
  5. *size_goal=tcp_xmit_size_goal(sk,mss_now,!(flags&MSG_OOB));

  6. return mss_now;
  7. }


ltcp_xmit_size_goal


  1. static unsignedinttcp_xmit_size_goal(struct sock*sk,u32 mss_now,
  2. intlarge_allowed)
  3. {
  4. struct tcp_sock*tp=tcp_sk(sk);
  5. u32 xmit_size_goal,old_size_goal;

  6. xmit_size_goal=mss_now;
  7. /*这里large_allowed表示是否是紧急数据*/
  8. if(large_allowed&&sk_can_gso(sk)){/*如果不是紧急数据且支持GSO*/
  9. xmit_size_goal=((sk->sk_gso_max_size-1)-
  10. inet_csk(sk)->icsk_af_ops->net_header_len-
  11. inet_csk(sk)->icsk_ext_hdr_len-
  12. tp->tcp_header_len);/*xmit_size_goal为gso最大分段大小减去tcp和ip头部长度*/

  13. xmit_size_goal=tcp_bound_to_half_wnd(tp,xmit_size_goal);/*最多达到收到的最大rwnd窗口通告的一半*/

  14. /*We try hardtoavoid divides here*/
  15. old_size_goal=tp->xmit_size_goal_segs*mss_now;

  16. if(likely(old_size_goal<=xmit_size_goal&&
  17. old_size_goal+mss_now>xmit_size_goal)){
  18. xmit_size_goal=old_size_goal;/*使用老的xmit_size*/
  19. }else{
  20. tp->xmit_size_goal_segs=xmit_size_goal/mss_now;
  21. xmit_size_goal=tp->xmit_size_goal_segs*mss_now;/*使用新的xmit_size*/
  22. }
  23. }

  24. return max(xmit_size_goal,mss_now);
  25. }


ltcp

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux GSO逻辑分析
  • linux tcp GSO和TSO实现

相关文章

  • 2017-05-26Android框架设计模式(五)——Singleton Method
  • 2017-05-26【Android】以后改为在Win10下开发了,androidwin10
  • 2017-05-26Android ShareSDK快速实现分享功能,androidsharesdk
  • 2017-05-26手机安全卫士——在设置中心 自定义view和自定义属性,安全卫士view
  • 2017-05-26【1】Android 学习笔记 【第一个安卓程序】,android安卓
  • 2017-05-26滑动关闭activity,滑动activity
  • 2017-05-26安卓界面基本组件------计时器,安卓------计时器
  • 2017-05-26用Kotlin创建第一个Android项目(KAD 01),kotlinandroid
  • 2017-05-225.1 Fragment基本概述
  • 2017-05-26快速自动更新Android Studio版本

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 如何为APK签名?,APK签名?
    • Android中资源文件的Shape使用总结
    • Android 自定义控件之第三讲:obtainStyledAttributes 系列函数详解
    • 源码解析Android中AsyncTask的工作原理
    • 2.4.5 ListView简单实用
    • Android中通信协议,Android通信协议
    • Json解析工具的选择,Json解析工具选择
    • 安卓开源项目周报0411,安卓开源项目0411
    • android:eclipse看着很舒服的字体和启动速度很快android模拟器
    • 1.2 开发环境搭建

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有