当前位置: 首页 > news >正文

windows网络适配器驱动开发-泛型分段卸载(上)

泛型分段卸载(GSO)共同表示大型发送卸载(LSO)和 UDP 发送卸载(USO)。

客户端驱动程序可以卸载大于网络介质最大传输单元(MTU)的 TCP/UDP 数据包分段。 驱动程序必须使用 GSO API 向 NetAdapterCx 指示此功能。

卸载大型 TCP 数据包的段

网络驱动程序接口规格 (NDIS) 微型端口驱动程序可以卸载大于网络介质最大传输单元 (MTU) 的大型 TCP 数据包的分段。 支持对大型 TCP 数据包进行分段的 NIC 还必须能够:

  • 为包含 IP 选项的发送数据包计算 IP 校验和。
  • 为包含 TCP 选项的发送数据包计算 TCP 校验和。

NDIS 版本 6.0 及更高版本支持大型发送卸载版本 1 (LSOv1),它与 NDIS 5.x 中的大型发送卸载 (LSO) 类似。 NDIS 版本 6.0 及更高版本还支持大型发送卸载版本 2 (LSOv2),该版本提供增强的大型数据包分段服务,包括支持 IPv6。

支持 LSOv2 和 LSOv1 的微型端口驱动程序必须从 NET_BUFFER_LIST 结构带外 (OOB) 信息中确定卸载类型。 驱动程序可以使用 NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO 结构中的 Type 成员来确定驱动程序栈使用的是 LSOv2 还是 LSOv1,并执行相应的卸载服务。 任何包含 LSOv1 或 LSOv2 OOB 数据的 NET_BUFFER_LIST 结构也包含一个 NET_BUFFER 结构。

USO 的要求

NDIS 轻型筛选器驱动程序(LWFs)在修改或发送数据包时必须遵循协议驱动程序的要求,并且可以假设提供给其 FilterSendNetBufferLists 处理程序的任何数据包都满足协议驱动程序的要求。NetAdapterCx在这里也是一样的。

NetAdapterCx和之前的微型端口驱动程序可以卸载大于网络介质 MTU 的大型 UDP 数据包的分段。 支持大型 UDP 数据包分段的 NIC 还必须能够执行以下操作:

  • 为包含 IPv4 选项的发送数据包计算 IP 校验和
  • 计算已发送数据包的 UDP 校验和

支持 USO 的微型端口驱动程序必须根据 NET_BUFFER_LIST 结构的带外 (OOB) 信息确定卸载类型。 如果 NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO 结构的值非零,则微型端口驱动程序必须执行 USO。 任何包含 USO OOB 数据的 NET_BUFFER_LIST 也包含一个 NET_BUFFER 结构。 但是,如果微型端口驱动程序收到了关闭 USO 的 OID_TCP_OFFLOAD_PARAMETERS 文件,微型端口驱动程序在成功完成 OID 后,应拒绝并返回任何设置了 USO OOB 字段的 NET_BUFFER_LIST。

TCP/IP 传输卸载的限制

TCP/IP 传输仅卸载满足以下条件的 UDP 数据包:

  • 数据包是 UDP 数据包。
  • 数据包长度必须大于最大段大小 (MSS) * (MinSegmentCount - 1)。
  • 如果微型端口驱动程序未设置 SubMssFinalSegmentSupported 功能,则传输层卸载的每个大型 UDP 数据包必须具有 Length % MSS == 0。 也就是说,大型数据包可以分成 N 个数据包,每个数据包段完全包含 MSS 用户字节。 如果微型端口驱动程序设置 SubMssFinalSegmentSupported 功能,则传输上的此数据包长度可除性条件不适用。 换句话说,最终段可以小于 MSS。
  • 数据包不是环回数据包。
  • UDP/IP 传输卸载的大型 TCP 数据包的 IP 标头中的 MF 位将不会被设置,IP 标头中的碎片偏移将为零。
  • 应用程序已指定 UDP_SEND_MSG_SIZE/WSASetUdpSendMessageSize。

在卸载大型 UDP 数据包进行分段之前,TCP/IP 传输执行以下操作:

  • 更新与 NET_BUFFER_LIST 结构关联的大型数据包分段信息。 此信息是一种 NDIS_UDP_SEGMENTATION_OFFLOAD_NET_BUFFER_LIST_INFO 结构,而该结构是 NET_BUFFER_LIST 结构的 OOB 信息的一部分。 TCP/IP 传输将 MSS 值设置为所需的 MSS。
  • 计算 UDP 伪标头的补数和,并将此和写入 UDP 标头的 Checksum 字段。 TCP/IP 传输会计算伪首部中以下字段的补数和:源 IP 地址、目标 IP 地址和协议。

TCP/IP 传输所提供的伪首部的补数和使 NIC 可以提前开始计算每个数据包的真正 UDP 校验和,NIC 可以从大型 UDP 数据包中推导出这些数据包,而无需检查 IP 标头。

请注意,RFC 768 和 RFC 2460 规定,伪头是通过源 IP 地址、目标 IP 地址、协议和 UDP 长度(UDP 标头的长度加上 UDP 有效负载的长度(不包括伪头的长度)计算的。 但是,由于基础微型端口驱动程序和 NIC 从 TCP/IP 传输所传递的大数据包中生成 UDP 数据报,传输不知道每个 UDP 数据报的 UDP 有效负载的大小,因此无法在伪标头文件计算中包含 UDP 长度。 相反,如下部分所述,NIC 会扩展 TCP/IP 传输提供的伪标头文件校验和,以覆盖每个生成的 UDP 数据报的 UDP 长度。

http://www.jsqmd.com/news/1123904/

相关文章:

  • 2026中小企业ERP选型指南:6大主流系统深度对比测评
  • 【关注可白嫖源码】--课程设计+毕业设计+django大学生健康信息可视化管理系统[编号:project35522](案例分析)
  • TPA3128D2与dsPIC33EP音频系统设计与优化
  • postgresql
  • windows网络适配器驱动开发-泛型分段卸载(下)
  • Ventoy启动界面个性化:3步打造专属启动盘视觉盛宴
  • 三步搞定E-Hentai漫画收藏:免费批量下载终极指南
  • openeuler/riscv-kernel:RISC-V架构在openEuler的统一内核解决方案
  • openEuler-lsb故障排除:常见LSB兼容性问题解决方案
  • Enigma Virtual Box解包终极指南:3分钟掌握专业脱壳技巧
  • AI赋能Selenium IDE:智能自动化测试从入门到实战
  • 如何快速掌握RenameIt:Sketch设计师必备的批量重命名终极指南
  • 终极AMD Ryzen调试工具SMUDebugTool:5步成为硬件掌控大师
  • 机器学习与模式识别 第八章 MAP与偏方差 考点压缩
  • 华硕笔记本性能控制终极秘籍:从官方软件到开源工具的蜕变之路
  • Codex 实战 Skills:发生 Bug 时,用 Skill 自动捕获堆栈并格式化推送到群聊的预警技能
  • TVA在具身智能商业化部署中的技术突破(13)
  • ICM-42605与STM32F437ZG在运动追踪中的硬件与算法实现
  • 加密货币合规工具横向评测:6 款主流产品技术分析与选型建议
  • 嵌入式精确计时系统:CS2200-CP与PIC18F2455的硬件设计与优化
  • Hetzner创建云服务器SSH Keys配置介绍(公钥、私钥、密钥配置、SSH配置)
  • 终极B站视频下载指南:用BilibiliDown实现高效离线观看
  • CI/CD是什么?使用GitHub Actions快速体验
  • 日前公司 server-side 有组件,疑似因撰写时 exception-handling 做得不周全
  • 震惊!原来毕业论文还能这样写?2026降AI率工具推荐合集
  • 好用的区域教育一体化管理平台源头厂家
  • 文心一言内测实录:中文长文本理解与企业文档处理深度评测
  • GPT-4与GPT-4 Turbo核心差异:上下文、知识、稳定性与成本的工程真相
  • 从CVE-2020-27986看SonarQube安全加固:构建纵深防御的代码审计平台
  • 一次 GitLab 大仓库 Clone 中断排查