免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3003 | 回复: 6
打印 上一主题 下一主题

[网络子系统] 请问tcp报文发送过程中 sk_buff 中frags 及 frag_list问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-03-31 14:57 |只看该作者 |倒序浏览
本帖最后由 zaley 于 2017-03-31 19:33 编辑

frags 及 frag_list 分别是何时填充的?  
到了网络设备层(net_device) 时  frag_list 中的skb 是不是单独 调用 hard_start_xmit  ?
SG类型的聚合分散I/OFRAGLIST类型的聚合分散I/O  对于 底层driver 有何区别?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2017-04-06 17:21 |只看该作者
如果硬件支持的话,应该都是call一次dev_queue_xmit,否则的话,在更早的地方拆分成N个skb。

硬件driver的动作不外乎是根据skb的内容准备描述符,
* 理解SG的driver,从skb->shinfo->frags[]的page上映射报文的数据部分;
* 理解FRAG-LIST的driver,需要变量skb->shinfo->fraglist,对每个片段分别映射。
可以理解成是某种形式的API/ABI约定。

典型的既支持SG又支持SG-LIST的driver是loopback

一般的硬件,比如Intel系列的,支持SG。
SG通常跟某种形式的offload联系在一起,比如checksum offload, TCP segment offload等。
说白了就是软件的工作由硬件完成。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
3 [报告]
发表于 2017-04-20 10:46 |只看该作者
nswcfd 发表于 2017-04-06 17:21
如果硬件支持的话,应该都是call一次dev_queue_xmit,否则的话,在更早的地方拆分成N个skb。

硬件driver ...

netdev声称自己支持NETIF_F_FRAGLIST,到底是什么语义?
a) 是说上层 有一个ip fragment好了的skb(它有shinfo->frag_list),只要把第一个skb递交给netdev,netdev就会把frag_list里的skb全都发送出去?


b) 还是说,上层直接给一个skb下来,如果需要分片,网卡会自行fragmentation?

c) 还是说, netdev仅仅是声称自己支持 处理作为ip frag的skb?

反正kernel的注释肯定是错的:

            NETIF_F_FRAGLIST_BIT,           /* Scatter/gather IO. */

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2017-04-25 17:58 |只看该作者
本帖最后由 nswcfd 于 2017-04-25 18:00 编辑

感觉是c,声明驱动“可以处理” shinfo->fraglist,但是实际上像loopback/tun这种soft nic的策略是“不处理”,它假设上层接收者支持shinfo->fraglist。(以上纯属个人理解……)

如果不声明,那么在调用driver->xmit之前,dev_queue_xmit负责把shinfo->fraglist拆分成N个报文,分别送给driver->xmit

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
5 [报告]
发表于 2017-04-28 14:39 |只看该作者
借楼问个问题,
1. 一个skb的gso segments 包含在skb->len里头吗
比如一个skb,TCP_SKB_CB(skb)->tcp_gso_segs == 3, TCP_SKB_CB(skb)->tcp_gso_size == 100,那么这300B会包含在skb->len里头吗?

2. 一个skb的skb_shinfo(skb)->frags_list里头的skb 是不是到了TCP 层的时候就已经被重组了(是到了frags[]了吗)?

3. skb有这么几个地方可以存数据,skb的线性区,skb_shinfo(skb)->frags[], skb_shinfo(skb)->frag_list, skb->next,这些数据跟skb->len是什么关系,数据的sequence是怎么排的? 是skb 线性数据 -> skb_shinfo(skb)->frags[] -> .....?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
6 [报告]
发表于 2017-04-28 22:03 |只看该作者
自己顶。。。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
7 [报告]
发表于 2017-05-02 19:01 |只看该作者
1. 应该是的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP