Wi-Fi/蜂窝 Coex 信道避免

Android 12 中引入的 Wi-Fi/蜂窝 coex 通道避免功能可识别并避免在蜂窝通道可能受到干扰的情况下使用不安全的 Wi-Fi 通道。这包括 STA、SoftAp、Wi-Fi Direct (P2P)、Wi-Fi Aware (NAN) 等接口。

本页讨论以下内容:

  • 蜂窝调制解调器必须向 Android 框架报告的信息
  • Wi-Fi 框架用于计算要避免的 Wi-Fi 信道的算法
  • 设备制造商必须为 Wi-Fi 框架提供的配置表
  • 与通道避免功能相关的系统 API、配置和 HAL API
  • 处理通道回避的框架行为
  • 处理通道规避的芯片供应商行为
  • 通道规避的实现细节
  • 验证通道回避行为的测试

背景

对于采用 LTE、5G NR 和许可辅助接入 (LAA) 等蜂窝技术的设备,使用的蜂窝信道可能会干扰使用的 Wi-Fi 信道。当蜂窝和 Wi-Fi 信道处于短频率间隔内(相邻信道)或存在谐波和互调干扰时,就会发生这种情况。

当一个天线正在发射而另一个天线同时接收时,这种类型的干扰就会成为一个问题。在这种情况下,发射天线会淹没接收天线,影响其接收质量。

本文档将干扰发射机称为攻击者,将遭受干扰的接收机称为受害者。作为攻击者或受害者的 Wi-Fi 通道被称为不安全通道

Wi-Fi/蜂窝共存通道避免功能提供了一种一致的通道避免方法,减少了对偏离 Wi-Fi 框架的专有代码的需求。此外,该功能允许设备制造商配置、启用和禁用以及覆盖该功能。

该功能通过控制 Wi-Fi 通道来执行通道规避。 Wi-Fi 信道规避方案可以描述为一系列四个抽象步骤:

  1. 调制解调器报告蜂窝频率的变化
  2. Coex 避免算法计算不安全的 Wi-Fi 信道
  3. Coex 回避算法通知 Wi-Fi 服务
  4. 框架或驱动程序执行适当的 Wi-Fi 操作

通道规避方案

图 1.通道规避方案

报告蜂窝频率的变化

电话服务报告当前使用的蜂窝信道。当工作蜂窝频率改变时,调制解调器通过IRadio::PhysicalChannelConfig将此信息报告给电话服务。该信息包括许可辅助接入 (LAA) 和载波聚合 (CA) 的指示。

从 Android 12 开始, 1.6 IRadio::PhysicalChannelConfig中的以下字段为调制解调器必须填充的 coex 公式提供所需的信息。

struct PhysicalChannelConfig {
    /** Connection status for cell. Valid values are PRIMARY_SERVING and SECONDARY_SERVING */
    CellConnectionStatus status;

    /** The radio technology for this physical channel */
    RadioTechnology rat;

    /** Downlink Absolute Radio Frequency Channel Number */
    int32_t channelNumberDownlink;

    /** Uplink Absolute Radio Frequency Channel Number */
    int32_t channelNumberUplink;

    /** Downlink cell bandwidth, in kHz */
    int32_t cellBandwidthDownlink;hte

    /** Uplink cell bandwidth, in kHz */
    int32_t cellBandwidthUplink;
}

计算不安全的 Wi-Fi 信道

当调制解调器报告蜂窝频率发生变化时,coex 信道算法会计算蜂窝和 Wi-Fi 信道之间的干扰,并确定哪组 Wi-Fi 信道不安全。

有多种类型的干扰需要不同的公式:相邻谐波/互调。由于设备之间天线和布局的物理差异,每个设备的相邻和谐波/互调干扰的模式是不同的。考虑到这一点,设备制造商必须提供一个查找表,以便将参数插入到这两种干扰的通用公式中。这些参数是按小区频带定义的,并由活动小区信道的频带引用。

可以在查找表中定义最大功率上限。如果定义了最大功率上限,则不安全的通道会使用提供的功率上限进行传输。如果没有功率上限,则通道以全功率传输。

通常,通道回避功能使用尽力而为的方法来避免不安全的 Wi-Fi 通道以优化性能。但在某些情况下(例如,由于运营商的要求),某些接口必须避免某些蜂窝频段的不安全通道。在这种情况下,强制限制表示为一个位掩码,其中包含是否禁止某些通道的值,例如 Wi-Fi Direct (P2P)、SoftAp 和 Wi-Fi Aware (NAN)。虽然一个不安全的通道作为建议反对在所有用例中使用该通道,但强制限制标记了强制避免的特定用例。

如果 2.4GHz 或 5GHz 频段的每个信道都标记为不安全,则查找表可以将每个干扰小区频段的默认 2.4GHz 信道或默认 5GHz 信道定义为最安全的选择。当频带的其余部分被报告为不安全时,这些默认频道不会被报告为不安全的频道。

覆盖列表

在干扰严重依赖带宽的情况下,公式化方法受到限制(因此带宽较大的通道可能不安全,但带宽较小的通道则不安全)。在诸如 LAA 的情况下,跳过计算并使用指定的不安全通道列表是有益的。

为此,您可以在查找表中为某些条目指定不安全通道的覆盖列表。表条目中的覆盖列表表示跳过该特定小区信道的计算,并且匹配小区信道的不安全 Wi-Fi 信道由覆盖列表指定。

对于带宽敏感的情况,您可以通过在覆盖列表中指定具有某些带宽的某些通道来选择性地避开某些带宽。这是因为每个 Wi-Fi 通道号对应一个指定的带宽。

覆盖列表由每个 Wi-Fi 频段的频道号或预定义类别关键字列表表示:

2g类:

  • all (整个 2.4GHz 频段)

5g类:

  • all (整个 5GHz 频段)
  • 20mhz (5GHz 20MHz 频道)
  • 40mhz (5GHz 40MHz 频道)
  • 80mhz (5GHz 80MHz 频道)
  • 160mhz (5GHz 160MHz 频道)

邻道干扰

为了确定相邻信道干扰,共轭避免算法确保攻击者和受害信道之间的距离ΔF不低于指定的阈值

信道干扰

图 2.攻击者和受害者通道之间的距离

阈值由设备的物理配置和查找表条目中提供的每个干扰频带的阈值确定。被认为是无干扰的频段没有表条目,并且不需要计算不安全的信道(这是大多数时间)。

相邻干扰参数

  • wifiVictimMhz :Wi-Fi 受害者的 MHz 距离阈值(小区上行链路)
  • cellVictimMhz :小区受害者的 MHz 距离阈值(小区下行链路)

该算法对每个活动单元通道的行为如下:

  1. 对于频道的波段,尝试查找查找表条目。如果没有找到表条目,则返回该单元通道没有不安全的通道。
  2. 根据蜂窝频段,确定存在风险的 Wi-Fi 频段以及干扰来自频段的哪一侧(例如,较低的 2.4GHz 信道、较高的 2.4GHz 信道、较低的 5GHz 信道)。
  3. 如果存在wifiVictimMhz并且小区信道具有上行链路和

    1. 如果 Wi-Fi 频段的下部存在风险

      1. 通过将 wifiVictimMhz 添加到小区上行链路的最高频率来查找不安全信道的上限。
      2. 查找下边缘与限制重叠的第一个 20Mhz Wi-Fi 信道。
      3. 将 Wi-Fi 通道、包含它的每个较大带宽通道(例如,40Mhz、80Mhz)以及同一频段的每个较低通道标记为不安全通道。
    2. 如果 Wi-Fi 频段的上部有风险

      1. 通过将 wifiVictimMhz 减去小区上行链路的最低频率来找到不安全信道的下限。
      2. 查找上边缘与限制重叠的第一个 Wi-Fi 通道。
      3. 将 Wi-Fi 频道、包含它的每个较大频道(例如,40Mhz、80Mhz)以及同一频段的每个较高频道标记为不安全频道。
  4. 如果存在cellVictimMhz并且小区信道具有下行链路。

    1. 使用cellVictimMhz作为阈值执行步骤 3,并与小区下行链路而不是小区上行链路进行比较。
  5. 将表格条目的功率上限应用于计算的不安全通道。

不安全通道计算

图 3相邻信道干扰的不安全信道计算

谐波/互调失真

对于谐波/互调失真,coex 引擎计算谐波/互调信号的范围,并评估它与潜在受害通道的重叠百分比。如果重叠超过重叠阈值,则算法认为这是不安全的情况。受害通道上谐波/互调失真的重叠百分比的计算通过以下等式执行:

$$ overlap = \frac{min(distortion_{high}, victim_{high}) - max(distortion_{low}, victim_{low})}{victim_{bandwidth}} $$

在谐波失真情况下,该算法考虑了受 Wi-Fi 信道影响的小区上行链路信道的谐波失真。然后它用基于小区上行链路频率和谐波度$N$的谐波值代替高失真和低失真。

$$ harmonic_{high} = N * uplink_{high} $$
$$ harmonic_{low} = N * uplink_{low} $$

不安全通道计算谐波失真

图 4.谐波失真的不安全通道计算

在互调情况下,该算法考虑小区上行链路的互调失真和受害小区下行链路信道的Wi-Fi信道。然后,它将高失真和低失真替换为基于小区上行链路频率、Wi-Fi 频率和两个互调系数 $M$、$N$ 的互调值。

$$ intermod_{high} = |M*wifi_{high} + N*uplink_{high}| $$
$$ intermod_{low} = |M*wifi_{low} + N*uplink_{low}| $$

不安全信道计算互调失真

图 5.互调失真的不安全信道计算

您可以在查找表中为每个干扰单元带指定 $M$、$N$ 和重叠值。如果某个频段没有干扰,则从该频段条目的表中省略这些值。可以独立定义 Wi-Fi 2.4GHz 和 5GHz 频段的两组这些值。

与相邻干扰算法类似,该算法重用每个干扰小区频带定义的相同功率上限值。

该算法对每个活动单元通道的行为如下:

  1. 对于信元通道的波段,它会尝试查找查找表条目。如果没有找到表条目,则返回该通道没有不安全的通道。
  2. 如果定义了参数,则从谐波中查找不安全的 2.4GHz 通道。

    1. 求出 2.4GHz 的谐波度 N。
    2. 根据N和小区上行计算谐波高频和谐波低频。
    3. 查找位于下方谐波下限内的第一个 20MHz Wi-Fi 信道。
    4. 计算 Wi-Fi 通道上的谐波重叠,如果重叠超过 2.4GHz Wi-Fi 重叠阈值,则将该通道标记为不安全。
    5. 查找第一个 20MHz Wi-Fi 信道,该信道位于来自上方的谐波上限内。
    6. 计算 Wi-Fi 通道上的谐波重叠,如果重叠超过 2.4GHz Wi-Fi 重叠阈值,则将该通道标记为不安全。
    7. 将其间的每个 20MHz 频道标记为不安全频道。
  3. 如果定义了参数,则从谐波中查找不安全的 5GHz 通道。

    1. 找到 5GHz 的谐波次数 N。如果 N 为 0,则跳到步骤 5。
    2. 根据N和小区上行计算谐波高频和谐波低频。
    3. 发现不安全的 20Mhz 频道。

      1. 查找位于下方谐波下限内的第一个 20MHz Wi-Fi 信道。
      2. 计算 Wi-Fi 通道上的谐波重叠,如果重叠超过 2.4GHz Wi-Fi 重叠阈值,则将该通道标记为不安全。
      3. 查找第一个 20MHz Wi-Fi 信道,该信道位于来自上方的谐波上限内。
      4. 计算 Wi-Fi 通道上的谐波重叠,如果重叠超过 2.4GHz Wi-Fi 重叠阈值,则将该通道标记为不安全。
      5. 将其间的每个 20MHz 频道标记为具有指定功率上限的不安全频道。
    4. 发现不安全的 40MHz、80MHz、160MHz 频道

      1. 重复步骤 3a,但频率为 40MHz、80MHz、160MHz。
      2. 不是计算谐波边缘上通道的重叠,而是重用从较小的组成通道计算的重叠(例如,如果两个 20Mhz 通道组成一个 40Mhz 通道并且有 30% 和 90% 的重叠,则平均值为 60%对于 40Mhz 频道)。
  4. 如果定义了参数,则从互调中查找不安全的 2.4GHz 信道。

    1. 求出 2.4GHz 的互调系数 N、M。
    2. 对于每个 2.4GHz Wi-Fi 信道:

      1. 根据N、M、小区上行、Wi-Fi信道计算互调低频和互调高频。
      2. 计算小区下行链路上的互调重叠,如果重叠超过 2.4GHz 小区重叠阈值,则将信道标记为不安全。
  5. 如果定义了参数,则从互调中查找不安全的 5GHz 信道。

    1. 使用 5GHz Wi-Fi 通道和 5GHz 小区重叠阈值重复步骤 4。
  6. 将表格条目的功率上限应用于计算的不安全通道。

最后结果

在计算了来自相邻和谐波干扰的两组不安全信道后,通过取两组的并集来计算最终的一组(如果有冲突,则选择较低的功率上限),如果有,则从集合中删除默认信道没有施加强制性限制。

该算法的行为如下:

  1. 如果每个 2.4GHz Wi-Fi 信道都被标记为不安全信道,则从集合中删除默认的 2.4GHz Wi-Fi 信道。
  2. 如果每个 5GHz Wi-Fi 信道都被标记为不安全信道,则从集合中删除默认的 5GHz Wi-Fi 信道。
  3. 返回最后一组不安全通道。

查找表格式

查找表在位于可覆盖配置字符串config_wifiCoexTableFilepath中的 XML 文件中表示,并由以下 XSD 定义。


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            version="1.0">

  <xsd:element name="table">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="entry" minOccurs="1" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="entry">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="rat" type="ratType"/>
        <xsd:element name="band" type="xsd:int"/>
        <xsd:element name="powerCapDbm" type="xsd:int" minOccurs="0"/>
        <xsd:choice>
          <xsd:element ref="params"/>
          <xsd:element ref="override"/>
        </xsd:choice>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:simpleType name="ratType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="LTE"/>
      <xsd:enumeration value="NR"/>
    </xsd:restriction>
  </xsd:simpleType>

  <!-- Define coex algorithm parameters -->
  <xsd:element name="params">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="neighborThresholds" minOccurs="0"/>
        <xsd:element name="harmonicParams2g" type="harmonicParams" minOccurs="0"/>
        <xsd:element name="harmonicParams5g" type="harmonicParams" minOccurs="0"/>
        <xsd:element name="intermodParams2g" type="intermodParams" minOccurs="0"/>
        <xsd:element name="intermodParams5g" type="intermodParams" minOccurs="0"/>
        <xsd:element ref="defaultChannels" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="neighborThresholds">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="wifiVictimMhz" type="xsd:int" minOccurs="0"/>
        <xsd:element name="cellVictimMhz" type="xsd:int" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name="harmonicParams">
    <xsd:sequence>
      <xsd:element name="N" type="xsd:int"/>
      <xsd:element name="overlap" type="xsd:int"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="intermodParams">
    <xsd:sequence>
      <xsd:element name="N" type="xsd:int"/>
      <xsd:element name="M" type="xsd:int"/>
      <xsd:element name="overlap" type="xsd:int"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="defaultChannels">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="default2g" type="xsd:int" minOccurs="0"/>
        <xsd:element name="default5g" type="xsd:int" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <!-- Define algorithm override lists -->
  <xsd:element name="override">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="override2g" minOccurs="0"/>
        <xsd:element ref="override5g" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="override2g">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="category" type="overrideCategory2g" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="channel" type="xsd:int" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="override5g">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="category" type="overrideCategory5g" minOccurs="0" maxOccurs="unbounded"/>
        <xsd:element name="channel" type="xsd:int" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:simpleType name="overrideCategory2g">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="all"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:simpleType name="overrideCategory5g">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="all"/>
      <xsd:enumeration value="20Mhz"/>
      <xsd:enumeration value="40Mhz"/>
      <xsd:enumeration value="80Mhz"/>
      <xsd:enumeration value="160Mhz"/>
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

示例 XML 表

以下是一个示例 XML 查找表:


<table>
  <!-- Entry using algorithm parameters -->
  <entry>
    <rat>LTE</rat>
    <band>40</band>
    <powerCapDbm>50</powerCapDbm>
    <params>
      <neighborThresholds>
        <wifiVictimMhz>25</wifiVictimMhz>
        <cellVictimMhz>40</cellVictimMhz>
      </neighborThresholds>

      <harmonicParams2g>
        <N>3</N>
        <overlap>50</overlap>
      </harmonicParams2g>

      <harmonicParams5g>
        <N>3</N>
        <overlap>50</overlap>
      </harmonicParams5g>

      <intermodParams2g>
        <N>-2</N>
        <M>1</M>
        <overlap>75</overlap>
      </intermodParams2g>

      <intermodParams5g>
        <N>-2</N>
        <M>1</M>
        <overlap>75</overlap>
      </intermodParams5g>

      <defaultChannels>
        <default2g>6</default2g>
        <default5g>36</default5g>
      </defaultChannels>
    </params>
  </entry>
  <!-- Entry using the override list -->
  <entry>
    <rat>LTE</rat>
    <band>41</band>
    <powerCapDbm>50</powerCapDbm>
    <override>
      <override2g>
        <channel>6</channel>
        <channel>11</channel>
        ...
      </override2g>
      <override5g>
        <category>40Mhz</category>
        <channel>34</channel>
        ...
      </override5g>
    </override>
  </entry>
</table>

载波聚合

对于载波聚合 (CA),每个上行链路/下行链路的谐波/互调范围可能不会产生足够的重叠以独立造成干扰,但在组合时可能会产生足够的重叠。该算法独立考虑每个谐波/互调范围,并采用返回的不安全通道的并集。对于互调情况,这意味着评估每个 UL 到每个 DL 的互调范围。

该算法不区分 PCELL/PSCELL/SCELL 并将它们视为平等。

许可辅助访问

许可辅助访问 (LAA) 被标识为波段 #46。该算法将此频段视为与其他频段类似。在这种情况下,可以将完整的 5Ghz 频道设置为查找表中的覆盖列表。

根据运营商的要求,信道规避算法对整个 5GHz Wi-Fi 频段的 SoftAP 和 Wi-Fi Direct (P2P) 设置强制限制。对于处理此用例的算法,必须定义运营商配置值restrict_5g_softap_wifi_direct_for_laa 。如果小区信道在 LAA 上并且restrict_5g_softap_wifi_direct_for_laatrue ,则算法返回整个 5Ghz 频段的不安全信道集,并为 SoftAP 和 Wi-Fi Direct (P2P) 设置强制限制标志。

通知 Wi-Fi 服务

在 coex 通道算法计算出不安全通道后,为了向您的系统应用程序提供不安全通道及其限制,请使用 Android 框架中定义的以下@SystemApi 数据结构。

public final class CoexUnsafeChannel {
  public static final int POWER_CAP_NONE
  public @WifiAnnotations.WifiBandBasic int getBand();
  public int getChannel();
  // Returns the specified power cap in dBm, or POWER_CAP_NONE if not specified.
  public int getPowerCapDbm();
}

使用以下WifiManager @SystemApi 方法和回调使应用程序能够在不安全通道发生更改时获取更新的值。

public static final int COEX_RESTRICTION_WIFI_DIRECT;
public static final int COEX_RESTRICTION_SOFTAP;
public static final int COEX_RESTRICTION_WIFI_AWARE;

// Register a CoexCallback to listen on onCoexUnsafeChannelsChanged callbacks. The callback will be called whenever the unsafe channels change, as well as immediately after registering to get the current values.
public void registerCoexCallback(Executor executor, CoexCallback callback);
public void unregisterCoexCallback(CoexCallback callback);

public abstract static class CoexCallback {
  //Gets called whenever getCoexUnsafeChannels()/getCoexRestrictions() have updated values
  public void onCoexUnsafeChannelsChanged(List<CoexUnsafeChannels> unsafeChannels, int restrictions);
}

执行 Wi-Fi 操作

当 Wi-Fi 服务收到有关一组不安全通道的信息时,它会执行适当的操作以确保避开这些通道。本节介绍不同场景下 Wi-Fi 服务的行为。

通知司机

由于驱动程序在执行通道规避方面发挥着重要作用,因此必须将不安全的通道传送给驱动程序和固件。为此,请使用1.5::IWifiChip HAL API。

setCoexUnsafeChannels(vec<CoexUnsafeChannel> unsafeChannels,
  bitfield<IfaceType> restrictions);

软AP

SoftAP 是避免不安全通道的主要用例。以下部分概述了可通过 ACS 应用通道避免的关键 SoftAp 场景。这些场景描述了通道回避算法和驱动程序或固件的行为。

在启用 ACS 的情况下启动 SoftAP(尚未启动 SoftAP)

  1. 如果通道不安全并且存在 SoftAP 限制

    1. 该框架从 ACS 列表中删除不安全的通道。
    2. 如果列表为空,则框架停止 SoftAP。
  2. 如果渠道不安全且没有限制

    1. 供应商驱动程序/固件将安全通道优先于不安全通道。

SoftAP 已启用 ACS,并且更新了不安全通道

  1. 如果 SoftAP 通道不安全并且存在 SoftAP 限制

    1. 该框架通过删除不安全的通道来更新 ACS 列表。
    2. 如果列表为空,则框架关闭 SoftAP。
  2. 如果 SoftAP 通道不安全且没有限制

    1. 框架不采取任何行动。如果避免不可行,供应商驱动程序/固件会处理避免不安全的通道或应用功率上限。

Wi-Fi 直连 (P2P)

  1. 如果存在受 Wi-Fi Direct (P2P) 限制的不安全通道。

    1. 框架请求wpa_supplicant使用 HAL 方法ISupplicantP2pIface::setDisallowedFrequencies()来避免不安全的通道。
  2. 如果有不安全的渠道不受限制。

    1. 如果使用没有 Wi-Fi Direct (P2P) 限制的不安全通道,供应商驱动程序/固件会应用功率上限。

Wi-Fi 感知 (NAN)

该框架不参与 Wi-Fi Aware (NAN) 的频道选择,也不采取任何框架操作。供应商驱动程序/固件负责避免 Wi-Fi 感知 (NAN) 通道。

禁用算法

如果您想禁用默认算法实现并传递您自己的不安全通道列表以避免,请配置覆盖config_wifiDefaultCoexAlgorithmEnabled 。如果覆盖设置为 false,则禁用默认算法。然后,您可以使用自己的带外专有算法生成不安全通道列表,以使用以下系统 API 连接到框架。

public void setCoexUnsafeChannels(Set<CoexUnsafeChannel> coexUnsafeChannels,
  int coexRestrictions);

验证实施

要验证您对 Wi-Fi/蜂窝 coex 信道避免功能的实施,请使用以下测试。

CTS 测试

  • WifiManagerTest.java

    • testCoexMethodsShouldFailNoPermission()
    • testListenOnCoexUnsafeChannels()

行为测试

  • WifiManagerTest.py

    • test_set_get_coex_unsafe_channels()

VTS 测试

  • wifi_chip_hidl_test.cpp

    • TEST_P(WifiChipHidlTest, setCoexUnsafeChannels)