Android 12 中引入了 Wi-Fi/移动网络共存信道规避功能,可以识别并规避使用不安全的 Wi-Fi 信道,以免移动网络信道可能产生或遭到干扰。其中包括 STA、SoftAp、WLAN 直连(点对点)、Wi-Fi 感知 (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 信道规避方案可以描述为四个抽象步骤:
- 调制解调器报告移动网络频率的变化
- 共存规避算法计算不安全的 Wi-Fi 信道
- 共存规避算法通知 Wi-Fi 服务
- 框架或驱动程序执行适当的 Wi-Fi 操作
图 1. 信道规避方案
报告移动网络频率的变化
电话服务会报告当前正在使用的移动网络信道。当操作移动网络频率发生变化时,调制解调器会通过 IRadio::PhysicalChannelConfig
向电话服务报告此信息。
此信息包含授权频谱辅助接入 (LAA) 和载波聚合 (CA) 的指示。
从 Android 12 开始,1.6 IRadio::PhysicalChannelConfig
中的以下字段提供了调制解调器必须填充的共存公式的必需信息。
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 信道
当调制解调器报告移动网络频率的变化时,共存信道算法会计算移动网络和 Wi-Fi 信道之间的干扰,并确定哪组 Wi-Fi 信道是不安全的。
有多种需要不同公式的干扰:邻信道和谐波/互调干扰。由于各设备天线和布局的物理差异,对于每个设备,邻信道和谐波/互调干扰的模式不同。因此,设备制造商必须提供对照表,以便将参数插入到这两类干扰的通用公式中。这些参数由每种网络频段定义,并由有效移动网络信道的频段引用。
可在对照表中定义最大功率上限。如果定义了最大功率上限,不安全的信道会使用提供的功率上限进行传输。如果没有功率上限,则信道将以最高功率进行传输。
一般来说,信道规避功能会尽最大努力避开不安全的 Wi-Fi 信道,以优化性能。但在某些情况下(例如,由于运营商要求),某些接口必须避免某些移动网络频段产生不安全的信道。在这种情况下,以位掩码表示强制性限制,其中包含的值用于指定是否禁止某些信道,例如 WLAN 直连(点对点)、SoftAp 和 Wi-Fi 感知 (NAN)。虽然对于所有用例都建议不要使用不安全的信道,但强制性限制则规定对于特定用例必须强制规避某些信道。
如果 2.4 GHz 或 5 GHz 频段的每个信道均被标记为不安全的信道,则对照表可以为每个干扰移动网络频段将 2.4 GHz 默认信道或 5 GHz 默认信道定义为最安全的信道。当频段的其余信道被报告为不安全的信道时,这些默认信道不会被报告为不安全的信道。
替换列表
在干扰主要取决于带宽的情况下(因此带宽较大的信道可能不安全,但带宽较小的信道则不会如此),公式化方法作用有限。在某些情况下(例如使用 LAA),一种有益的做法是跳过计算并使用不安全的信道的指定列表。
为此,您可以在对照表中为特定条目指定不安全信道的替换列表。表条目中的替换列表表示跳过该特定移动网络信道的计算,并且由替换列表为匹配的移动网络信道指定不安全的 Wi-Fi 信道。
针对带宽敏感的情况,您可以通过在替换列表中指定具有特定带宽的特定信道,选择性地规避某些带宽。这是因为每个 Wi-Fi 信道号都对应指定的带宽。
替换列表由每个 Wi-Fi 频段的信道号或预定义类别关键字的列表表示:
2G 类别:
all
(整个 2.4 GHz 频段)
5G 类别:
all
(整个 5 GHz 频段)20mhz
(5 GHz 20 MHz 信道)40mhz
(5 GHz 40 MHz 信道)80mhz
(5 GHz 80 MHz 信道)160mhz
(5 GHz 160 MHz 信道)
邻信道干扰
为了确定邻信道干扰,共存规避算法确保攻击者和受害者信道之间的距离 ΔF 不低于指定的阈值。
图 2.攻击者和受害者信道之间的距离
阈值取决于设备的物理配置以及对照表条目中为每个干扰频段提供的阈值。被视为非干扰的频段没有表条目,因此无需计算不安全的信道(大多数情况下都是这样)。
邻信道干扰参数
wifiVictimMhz
:Wi-Fi 受害者(移动网络上行链路)的 MHz 距离阈值cellVictimMhz
:移动网络受害者(移动网络下行链路)的 MHz 距离阈值
对于每个有效移动网络信道,算法按以下方式运作:
- 对于信道的频段,请尝试查找对照表条目。如果未找到表条目,则指示该移动网络信道中没有不安全的信道。
- 根据移动网络频段,确定哪个 Wi-Fi 频段存在风险,以及干扰来自哪个频段(例如,较低的 2.4 GHz 信道、较高的 2.4 GHz 信道和较低的 5 GHz 信道)。
如果存在
wifiVictimMhz
,且移动网络信道有上行链路,如果 Wi-Fi 频段的较低部分存在风险,则:
- 通过将
wifiVictimMhz
添加到移动网络上行链路的最高频率,找出不安全的信道的上限。 - 查找下边缘与所述限制重叠的第一个 20 Mhz Wi-Fi 信道。
- 标记 Wi-Fi 信道、包含该 Wi-Fi 信道的每个较大带宽信道(例如 40 Mhz、80 Mhz),以及与不安全的信道频带相同的每个较低信道。
- 通过将
如果 Wi-Fi 频段的较高部分存在风险
- 通过将 wifiVictimMhz 减去移动网络上行链路的最低频率,找出不安全信道的下限。
- 查找第一个上边缘重叠限制的 Wi-Fi 信道。
- 标记 Wi-Fi 信道、包含该 Wi-Fi 信道的每个较大信道(例如 40 Mhz、80 Mhz),以及与不安全信道相同频带的每个较高信道。
如果存在
cellVictimMhz
,且移动网络信道有下行链路,则:- 使用
cellVictimMhz
作为阈值执行步骤 3,并与移动网络下行链路(而不是移动网络上行链路)进行比较。
- 使用
将表条目的功率上限应用于不安全的信道。
图 3. 不安全的信道的邻信道干扰计算
谐波失真或互调失真
对于谐波失真或互调失真,共存引擎会计算谐波信号或互调信号的范围,并评估其与潜在受害者信道之间的重叠百分比。如果重叠量超出重叠阈值,该算法会将此种情况视为不安全。受害者信道上谐波失真或互调失真重叠百分比的计算公式如下:
在谐波失真的情况下,该算法会考虑移动网络上行链路信道的谐波失真对 Wi-Fi 信道的损害。然后,它会根据移动网络上行链路频率和谐波度 $ N $,将高失真和低失真数据替换为谐波值。
图 4.不安全的信道的谐波失真计算
在互调的情况下,该算法会考虑移动网络上行链路信道和 Wi-Fi 信道的互调失真对移动网络下行链路信道的损害。然后,它会根据移动网络上行链路频率、Wi-Fi 频率和两个互调系数 $ M $, $ N $,将高失真和低失真数据替换为谐波值。
图 5.不安全的信道的互调失真计算
您可以在对照表中为每个干扰的移动网络频段指定 $ M $、$ N $ 和重叠值。如果频段没有干扰,该频段条目的表中会忽略该值。可以独立定义用于 Wi-Fi 2.4 GHz 和 5 GHz 频段的两组值。
与邻信道干扰算法类似,该算法重复使用为每个干扰移动网络频段定义的相同功率上限值。
对于每个有效移动网络信道,算法按以下方式运作:
- 对于移动网络信道的频段,它会尝试查找对照表条目。 如果未找到表条目,则表示此信道中没有不安全的信道。
如果已定义参数,则从谐波中查找不安全的 2.4 GHz 信道。
- 计算 2.4 GHz 的谐波度 N。
- 根据 N 和移动网络上行链路计算谐波高频和谐波低频。
- 查找下方谐波下限中的第一个 20 MHz Wi-Fi 信道。
- 计算 Wi-Fi 信道的谐波重叠率,如果重叠率超过 2.4 GHz Wi-Fi 重叠阈值,则将信道标记为不安全的信道。
- 查找上述谐波上限中的第一个 20 MHz Wi-Fi 信道。
- 计算 Wi-Fi 信道的谐波重叠率,如果重叠率超过 2.4 GHz Wi-Fi 重叠阈值,则将信道标记为不安全的信道。
- 将中间的每 20 MHz 信道标记为不安全的信道。
如果已定义参数,则从谐波中查找不安全的 5 GHz 信道。
- 计算 5 GHz 的谐波度 N。如果 N 为 0,则跳到步骤 5。
- 根据 N 和移动网络上行链路计算谐波高频和谐波低频。
查找不安全的 20 Mhz 信道。
- 查找下方谐波下限中的第一个 20 MHz Wi-Fi 信道。
- 计算 Wi-Fi 信道的谐波重叠率,如果重叠率超过 2.4 GHz Wi-Fi 重叠阈值,则将信道标记为不安全的信道。
- 查找上述谐波上限中的第一个 20 MHz Wi-Fi 信道。
- 计算 Wi-Fi 信道的谐波重叠率,如果重叠率超过 2.4 GHz Wi-Fi 重叠阈值,则将信道标记为不安全的信道。
- 将中间的每 20 MHz 信道标记为具有指定功率上限的不安全信道。
查找不安全的 40 MHz、80 MHz 和 160 MHz 信道
- 重复第 3a 步,但使用 40 MHz、80 MHz、160 MHz。
- 不要计算谐波边缘上的信道重叠,而是重复使用从较小的合成信道计算得出的重叠(例如,如果两个 20 Mhz 信道组成 40 Mhz 信道,且有 30% 和 90% 的重叠,那么 40 Mhz 信道的平均重叠率为 60%)。
如果已定义参数,则从互调中查找不安全的 2.4 GHz 信道。
- 计算 2.4 GHz 的互调系数 N、M。
对于每个 2.4 GHz Wi-Fi 信道:
- 根据 N、M、移动网络上行链路和 Wi-Fi 信道,计算互调低频和互调高频。
- 计算移动网络下行链路的重叠率,如果重叠率超过 2.4 GHz 移动网络重叠阈值,则将信道标记为不安全的信道。
如果已定义参数,则从互调中查找不安全的 5 GHz 信道。
- 使用 5 GHz Wi-Fi 信道和 5 GHz 移动网络重叠阈值重复第 4 步。
将表条目的功率上限应用于不安全的信道。
最终结果
根据邻信道和谐波干扰计算出两组不安全信道后,最终结果通过以下方式得出:将这两组合并(如果有冲突,请选择较低的功率上限)并在没有强制限制的情况下从集合中删除默认信道。
算法的运作方式如下:
- 如果每个 2.4 GHz Wi-Fi 信道均被标记为不安全的信道,请从组中移除默认的 2.4 GHz Wi-Fi 信道。
- 如果每个 5 GHz Wi-Fi 信道均被标记为不安全的信道,请从组中移除默认的 5 GHz Wi-Fi 信道。
- 返回最后一组不安全的信道。
对照表格式
对照表以位于可叠加配置字符串 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。该算法对此频段的处理方式与其他频段类似。在此情况下,可以将整个 5 GHz 信道设置为对照表中的替换列表。
根据运营商的要求,信道规避算法会针对整个 5 GHz Wi-Fi 频段设置对 SoftAP 和 Wi-Fi 直连(点对点)的强制性限制。对于处理此用例的算法,必须定义运营商配置值 restrict_5g_softap_wifi_direct_for_laa
。如果移动网络信道位于 LAA 上且 restrict_5g_softap_wifi_direct_for_laa
为 true
,则该算法会返回整个 5 GHz 频段的不安全信道集,并为 SoftAP 和 Wi-Fi 直连(点对点)设置强制性限制标记。
告知 Wi-Fi 服务
在共存信道算法计算出不安全的信道后,如需为您的系统应用提供不安全的信道及其限制,请使用 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 服务在不同场景中的行为。
告知驱动程序
由于驱动程序在执行信道规避方面发挥着重要作用,因此请务必将不安全的信道传达给驱动程序和固件。为此,请使用以下 IWifiChip
HAL API。
对于 AIDL:
void setCoexUnsafeChannels(in CoexUnsafeChannel[] unsafeChannels,
in int restrictions)
对于 HIDL(1.5 或更高版本):
setCoexUnsafeChannels(vec<CoexUnsafeChannel> unsafeChannels,
bitfield<IfaceType> restrictions);
SoftAP
SoftAP 是不安全信道规避的主要用例。以下部分概述了可以使用 ACS 应用信道规避功能的主要 SoftAp 场景。这些场景描述了信道规避算法以及驱动程序或固件的行为。
在启用 ACS 的情况下启动 SoftAP(SoftAP 还未启动)
如果信道不安全并且存在 SoftAP 限制
- 该框架会从 ACS 列表中移除不安全的信道。
- 如果列表为空,框架会停止 SoftAP。
如果信道不安全且没有任何限制
- 供应商驱动程序或固件优先考虑安全信道,而不是不安全的信道。
在启用 ACS 的情况下已启动 SoftAP,且更新了不安全的信道
如果 SoftAP 信道不安全,并且存在 SoftAP 限制
- 该框架会移除不安全的信道,以更新 ACS 列表。
- 如果列表为空,框架会关闭 SoftAP。
如果 SoftAP 信道不安全且没有限制
- 框架不会采取任何操作。供应商驱动程序或固件负责处理规避不安全的信道或在无法规避时应用功率上限。
Wi-Fi 直连(点对点)
如果存在受 WLAN 直连(点对点)限制的不安全的通道,则:
- 框架使用 HAL 方法
ISupplicantP2pIface::setDisallowedFrequencies()
请求wpa_supplicant
以规避不安全信道。
- 框架使用 HAL 方法
如果存在无限制的不安全的信道,则:
- 如果使用的是不受 WLAN 直连(点对点)限制的不安全的信道,供应商驱动程序或固件会应用功率上限。
Wi-Fi 感知 (NAN)
框架不涉及 Wi-Fi 感知 (NAN) 的信道选择,也不会执行任何框架操作。供应商驱动程序或固件负责 Wi-Fi 感知 (NAN) 信道规避。
停用算法
如果您希望停用默认算法实现,并传递您自己的不安全的信道规避列表,请配置叠加 config_wifiDefaultCoexAlgorithmEnabled
。如果叠加层设置为 false,则系统会停用默认算法。然后,您可以使用自己的带外专有算法生成不安全的信道列表,以便使用以下系统 API 连接到该框架。
public void setCoexUnsafeChannels(Set<CoexUnsafeChannel> coexUnsafeChannels,
int coexRestrictions);
验证实现
如需验证 Wi-Fi/移动网络共存信道规避功能的实现,请使用以下测试。
CTS 测试
WifiManagerTest.java
testCoexMethodsShouldFailNoPermission()
testListenOnCoexUnsafeChannels()
ACTS 测试
WifiManagerTest.py
test_set_get_coex_unsafe_channels()
VTS 测试
如果实现 AIDL:
wifi_chip_aidl_test.cpp
TEST_P(WifiChipAidlTest, SetCoexUnsafeChannels)
如果实现 HIDL:
wifi_chip_hidl_test.cpp
TEST_P(WifiChipHidlTest, setCoexUnsafeChannels)