| <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> |