tethering 硬件卸载

tethering 卸载让设备能够通过将网络共享流量(通过 USB、Wi-Fi)卸载到硬件来节省电量并提升性能。网络共享流量通过在调制解调器和外围设备之间提供直接路径(绕过应用处理器)来进行卸载。

规格

从 Android 8.1 开始,设备可以使用 tethering 卸载功能将 IPv4、IPv6 或 IPv4+IPv6 转发卸载到硬件。

卸载功能不需要卸载所有数据包。该框架能够以软件方式处理任何数据包。控制数据包通常以软件方式处理。由于 IPv4 端口在网络共享流量和设备流量之间共享,因此 IPv4 会话设置/拆除数据包(例如,SYN/SYN+ACK、FIN)必须以软件方式处理,以便内核可以构建流状态。该框架提供控制层面和状态机。它还向硬件提供有关上游和下游接口/前缀的信息。

对于 IPv4,硬件允许 IPv4 网络地址转换 (NAT) 会话设置数据包到达 CPU。内核创建 NAT 条目,HAL 实现从框架提供的文件描述符观察这些条目,并在硬件中处理这些流。这意味着 HAL 实现不需要 CAP_NET_*,因为 HAL 从框架获取打开的 NF_NETLINK_CONNTRACK 套接字。硬件会定期将当前活动流的 NAT 状态更新发送到框架,框架会刷新相应的内核连接跟踪状态条目。

对于 IPv6,框架会编程一个 IPv6 目标前缀列表,流量不得卸载到这些前缀。所有其他网络共享数据包都可以卸载。

对于数据用量统计,NetworkStatsService 数据用量轮询会导致框架从硬件请求流量统计信息。该框架还通过 HAL 将数据用量限制传达给硬件。

硬件要求

要实现 tethering 卸载,您的硬件必须能够转发调制解调器和 Wi-Fi/USB 之间的 IP 数据包,而无需通过主处理器发送流量。

实现

要启用网络共享卸载功能,您必须实现以下两个 HAL:配置 HAL (IOffloadConfig) 和控制 HAL (IOffloadControl)。

配置 HAL:IOffloadConfig

IOffloadConfig HAL 启动网络共享卸载实现。该框架为 HAL 实现提供预连接的 NF_NETLINK_CONNTRACK 套接字,该实现可以使用这些套接字来观察 IPv4 流。只有转发的流必须被加速。

控制 HAL:IOffloadControl

IOffloadControl HAL 控制卸载实现。必须实现以下方法:

  • 启动/停止卸载硬件:使用 initOffload/stopOffload,并通过 setLocalPrefixes 将本地 IP 地址或其他网络从卸载中排除。
  • 设置上游接口、IPv4 地址和 IPv6 网关:使用 setUpstreamParameters,并通过 addDownstream/removeDownstream 配置下游 IP 地址范围。
  • 数据用量统计:使用 getForwardedStats/setDataLimit

您的供应商 HAL 还必须通过 ITetheringOffloadCallback 接口发送回调,以将以下信息通知框架:

  • 异步事件,例如卸载启动和停止 (OffloadCallbackEvent)
  • NAT 超时更新,必须定期发送这些更新,以指示特定的 IPv4 流包含流量,并且不得由内核关闭

验证

要验证您的网络共享卸载实现,请使用手动或自动测试来验证网络共享和 Wi-Fi 热点是否按预期工作。《供应商测试套件》(VTS) 包含针对网络共享卸载 HAL 的测试。