Android 12 で導入された Wi-Fi / セルラー共存チャネル回避機能は、セルラー チャネルとの間で干渉が発生する可能性がある安全でない 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、Licensed Assisted Access(LAA)などのセルラー テクノロジーを搭載したデバイスでは、使用中のセルラー チャネルが使用中の Wi-Fi チャネルに干渉する可能性があります。これは、セルラー チャネルと Wi-Fi チャネルが短い周波数分離(隣接チャネル)内にある場合、または高調波干渉 / 相互変調干渉がある場合に発生します。
この種の干渉は、あるアンテナが送信し、同時に別のアンテナが受信しているときに問題となります。この場合、送信中のアンテナが受信中のアンテナに干渉し、受信状況に影響を及ぼします。
このドキュメントでは、干渉する送信側を「侵害者」、干渉を受ける受信側を「被害者」と呼びます。侵害者または被害者となっている Wi-Fi チャネルを、「安全でないチャネル」と呼びます。
Wi-Fi / セルラー共存チャネル回避機能を使用すると、チャネル回避の一貫したアプローチが可能になり、Wi-Fi フレームワークから逸脱するプロプライエタリ コードの必要性が軽減されます。さらに、デバイス メーカーはこの機能を構成、有効化 / 無効化、オーバーライドできます。
この機能は、Wi-Fi チャネルを制御することにより、チャネル回避を実行します。Wi-Fi チャネル回避は、理論上、次の 4 つの連続するステップからなるスキームによって行われます。
- モデムがセルラー周波数の変化を報告する
- 共存回避アルゴリズムが安全でない Wi-Fi チャネルを計算する
- 共存回避アルゴリズムが Wi-Fi サービスに通知する
- フレームワークまたはドライバが適切な Wi-Fi アクションを実行する
図 1. チャネル回避スキーム
セルラー周波数の変化を報告する
テレフォニー サービスが、現在使用中のセルラー チャネルを報告します。動作中のセルラー周波数が変化すると、モデムは IRadio::PhysicalChannelConfig
を通じてこの情報をテレフォニー サービスに報告します。これには、Licensed Assisted Access(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 チャネルのセットを識別します。
干渉には複数の種類があり、「隣接」と「高調波 / 相互変調」という異なる式が必要になります。デバイスによってアンテナとレイアウトが物理的に異なるため、隣接干渉と高調波 / 相互変調干渉のパターンはデバイスごとに異なります。この点を考慮して、デバイス メーカーは 2 種類の干渉に対応する汎用の式にパラメータを挿入するためのルックアップ テーブルを提供する必要があります。これらのパラメータはセル帯域ごとに定義され、アクティブなセルチャネルの帯域によって参照されます。
ルックアップ テーブルでは、「消費電力上限」を定義できます。消費電力上限が定義されている場合、安全でないチャネルは指定された消費電力上限の枠内で送信します。消費電力上限が定義されていない場合は、電力をフルに使って送信します。
一般的に、チャネル回避機能は、Wi-Fi チャネルを回避してパフォーマンスを最適化するためにベスト エフォート アプローチを使用します。ただし、特定の場合(たとえば、携帯通信会社の要件がある場合)、特定のインターフェースでは、特定のセルラー帯域について安全でないチャネルを回避することが必須になります。そのような場合、「必須制限」は、Wi-Fi Direct(P2P)、SoftAp、Wi-Fi Aware(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 チャネル、それを含むすべての広い帯域幅チャネル(40 MHz、80 MHz など)、同じ帯域のすべての低周波チャネルを安全でないチャネルとしてマークします。
- セル アップリンクの最高周波数に
Wi-Fi 帯域の上方領域にリスクがある場合
- セル アップリンクの最低周波数から wifiVictimMhz を減算することにより、安全でないチャネルの下限を見つけます。
- 上端が上限とオーバーラップする最初の Wi-Fi チャネルを検出します。
- Wi-Fi チャネル、それを含むすべての広い帯域幅チャネル(40 MHz、80 MHz など)、同じ帯域のすべての高周波チャネルを安全でないチャネルとしてマークします。
cellVictimMhz
が存在し、セルチャネルにダウンリンクがある場合cellVictimMhz
をしきい値として使用してステップ 3 を実行し、セル アップリンクではなくセル ダウンリンクと比較します。
計算された安全でないチャネルにテーブル エントリの消費電力上限を適用します。
図 3. 隣接チャネル干渉における安全でないチャネルの計算
高調波歪みまたは相互変調歪み
高調波歪みまたは相互変調歪みについて、共存エンジンは高調波信号または相互変調信号の範囲を計算し、潜在的な被害者チャネルとのオーバーラップ率を判定します。オーバーラップがオーバーラップしきい値を超える場合、アルゴリズムはこれを安全でない状況と見なします。被害者チャネルの高調波歪みまたは相互変調歪みのオーバーラップ率の計算は、次の式で行われます。
高調波歪みの場合、アルゴリズムは Wi-Fi チャネルに被害を及ぼすセル アップリンク チャネルの高調波歪みを考慮します。次に、セル アップリンク周波数と高調波次数 $ N $ に基づく高調波値を、歪み最高値と歪み最低値に代入します。
図 4. 安全でないチャネルの高調波歪みの計算
相互変調の場合、アルゴリズムは、セル アップリンクと、セル ダウンリンク チャネルに被害を及ぼす Wi-Fi チャネルの相互変調歪みを考慮します。次に、セル アップリンク周波数、Wi-Fi 周波数、2 つの相互変調係数 $ M $ および $ N $ に基づく相互変調値を、歪み最高値と歪み最低値に代入します。
図 5. 安全でないチャネルの相互変調歪みの計算
ルックアップ テーブルで、干渉する側のセル帯域ごとに $ M $、$ N $、オーバーラップ値を指定できます。特定の帯域に干渉がない場合は、テーブルのその帯域エントリから値が取り除かれます。Wi-Fi の 2.4 GHz 帯域と 5 GHz 帯域で、これらの値の 2 つのセットを個別に定義できます。
このアルゴリズムは、隣接干渉アルゴリズムと同様に、干渉する側のセル帯域ごとに定義された同じ消費電力上限を再利用します。
アルゴリズムは、アクティブなセルチャネルごとに次のように動作します。
- セルチャネルの帯域について、ルックアップ テーブル エントリの検索を試みます。テーブル エントリが見つからなかった場合は、このチャネルに安全でないチャネルはないという結果を返します。
パラメータが定義されている場合は、高調波から安全でない 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 チャネルを検出します。
- 40 MHz、80 MHz、160 MHz でステップ 3a を繰り返します。
- 高調波エッジにあるチャネルのオーバーラップを計算する代わりに、より小さい構成チャネルから計算されたオーバーラップを再利用します(たとえば、2 つの 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)の場合、それぞれのアップリンクまたはダウンリンクに対応する高調波または相互変調の範囲が、個別では干渉を発生させるのに十分なオーバーラップを生み出さないが、組み合わせると十分なオーバーラップを生み出すことがあります。このアルゴリズムは、個々の高調波または相互変調の範囲を個別に考慮し、返される安全でないチャネルの和集合をとります。つまり、相互変調の場合は、すべての DL に対するすべての UL の相互変調範囲を評価します。
このアルゴリズムは、PCELL、PSCELL、SCELL を区別せず、同等のものとして扱います。
License Assisted Access
License Assist Access(LAA)は帯域 #46 として識別されます。アルゴリズムは、この帯域を他の帯域と同様に扱います。この場合、5 GHz チャネル全体をルックアップ テーブルでオーバーライド リストとして設定できます。
携帯通信会社の要件に応じて、チャネル回避アルゴリズムは、5 GHz Wi-Fi 帯域全体で SoftAP と Wi-Fi Direct(P2P)に必須制限を設定します。アルゴリズムがこのユースケースを処理するには、携帯通信会社の構成値 restrict_5g_softap_wifi_direct_for_laa
を定義する必要があります。セルチャネルが LAA 上にあり、restrict_5g_softap_wifi_direct_for_laa
が true
である場合、アルゴリズムは 5 GHz 帯域全体で安全でないチャネルのセットを返し、SoftAP と Wi-Fi Direct(P2P)に対して必須制限フラグを設定します。
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 Direct(P2P)
安全でないチャネルが存在し、Wi-Fi Direct(P2P)の制限がある場合
- フレームワークは
wpa_supplicant
をリクエストし、HAL メソッドISupplicantP2pIface::setDisallowedFrequencies()
を使用して安全でないチャネルを回避します。
- フレームワークは
安全でないチャネルが存在し、制限がない場合
- Wi-Fi Direct(P2P)の制限なしで安全でないチャネルが使用されている場合、ベンダーのドライバまたはファームウェアは消費電力上限を適用します。
Wi-Fi Aware(NAN)
フレームワークは Wi-Fi Aware(NAN)のチャネル選択に関与せず、フレームワーク アクションは行われません。ベンダーのドライバまたはファームウェアが Wi-Fi Aware(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)