blob: 9db85c758512e844460bfb7a2bdbcaa1f825e94e [file] [log] [blame]
<html devsite><head>
<meta name="book_path" value="/_book.yaml"/>
<meta name="project_path" value="/_project.yaml"/>
</head>
<body>
<!--
Copyright 2018 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<h1 id="tethering_hardware_offload" class="page-title">网络共享硬件分流</h1>
<p>通过将网络共享流量(借助 USB、WLAN)分流到硬件,网络共享分流可让设备节省电量并提高性能。通过在调制解调器和外围设备之间提供直接路径,并绕过应用处理器,可以分流网络共享流量。</p>
<h2 id="specifications">规范</h2>
<p>从 Android 8.1 开始,设备可以使用网络共享分流将 IPv4、IPv6 或 IPv4+IPv6 转发分流到硬件。</p>
<p>分流功能不需要分流所有数据包。框架能够处理软件中的任何数据包。控制数据包通常是在软件中处理。由于 IPv4 端口在网络共享流量和设备流量之间共享,因此必须在软件中处理 IPv4 会话设置/拆解数据包(例如,SYN/SYN+ACK、FIN),以便内核可以构建流程状态。框架提供了控制平面和状态机,还为硬件提供了有关上游和下游接口/前缀的信息。</p>
<p>对于 IPv4,硬件允许 IPv4 网络地址转换 (NAT) 会话设置数据包到达 CPU。内核会创建 NAT 条目,HAL 实现会观察框架提供的文件描述符中的条目,并在硬件中处理这些流程。这意味着 HAL 实现不需要 <code>CAP_NET_*</code>,因为 HAL 会从框架中获取打开的 <code>NF_NETLINK_CONNTRACK</code> 套接字。硬件会定期将当前活动流程的 NAT 状态更新发送给框架,框架会刷新相应的内核连接跟踪状态条目。</p>
<p>对于 IPv6,框架会编制一个不得将流量分流到的 IPv6 目标前缀的列表。所有其他网络共享数据包都可以分流。</p>
<p><code>NetworkStatsService</code> 数据流量使用情况轮询会使框架向硬件请求流量统计信息,以便计算数据流量使用量。框架还会通过 HAL 向硬件传达数据流量使用限制。</p>
<h2 id="hardware_requirements">硬件要求</h2>
<p>要实现网络共享分流,您的硬件必须能够在调制解调器和 WLAN/USB 之间转发 IP 数据包,而无需通过主处理器发送流量。</p>
<h2 id="implementation">实现</h2>
<p>要启用网络共享分流功能,您必须同时实现配置 HAL (<code>IOffloadConfig</code>) 和控制 HAL (<code>IOffloadControl</code>)。</p>
<h3 id="config_hal_ioffloadconfig">配置 HAL:<code>IOffloadConfig</code></h3>
<p><a href="/reference/hidl/android/hardware/tetheroffload/config/1.0/IOffloadConfig"><code>IOffloadConfig</code></a> HAL 会启动网络共享分流实现。框架会为 HAL 实现提供预先连接的 <code>NF_NETLINK_CONNTRACK</code> 套接字,以供该实现观察 IPv4 流程。只有转发的流程必须加速。</p>
<h3 id="control_hal_ioffloadcontrol">控制 HAL:<code>IOffloadControl</code></h3>
<p><a href="/reference/hidl/android/hardware/tetheroffload/control/1.0/IOffloadControl"><code>IOffloadControl</code></a> HAL 会控制分流实现。必须实现以下方法:</p>
<ul>
<li>启动/停止分流硬件:使用 <code>initOffload/stopOffload</code>,并使用 <code>setLocalPrefixes</code> 让本地 IP 地址或其他网络免予分流。</li>
<li>设置上游接口、IPv4 地址和 IPv6 网关:使用 <code>setUpstreamParameters</code>,并使用 <code>addDownstream/removeDownstream</code> 配置下游 IP 地址范围。</li>
<li>计算数据流量使用量:使用 <code>getForwardedStats/setDataLimit</code></li>
</ul>
<p>您的供应商 HAL 还必须通过 <code>ITetheringOffloadCallback</code> 接口发送回调,该接口会通知框架:</p>
<ul>
<li>分流等异步事件被启动和停止 (OffloadCallbackEvent)</li>
<li>NAT 超时更新,必须定期发送这些更新以表明特定 IPv4 流程包含流量且不得由内核关闭</li>
</ul>
<h2 id="validation">验证</h2>
<p>要验证网络共享分流的实现,请使用手动或自动测试验证网络共享和 WLAN 热点是否按预期方式工作。<a href="/compatibility/vts/">供应商测试套件 (VTS)</a> 包含针对网络共享分流 HAL 的测试。</p>
</body></html>