blob: e80a3cdcb627e2c1bf9a760a8cddb375b15f28cd [file] [log] [blame]
Roshan Pius200a17d2017-11-01 13:03:35 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Roshan Pius2272ff82020-11-12 09:37:40 -080017#include <string>
18
19#include <android-base/logging.h>
20#include <cutils/properties.h>
21
Roshan Pius200a17d2017-11-01 13:03:35 -070022#include "wifi_feature_flags.h"
23
Roshan Pius200a17d2017-11-01 13:03:35 -070024namespace android {
25namespace hardware {
26namespace wifi {
Ahmed ElArabawy687ce132022-01-11 16:42:48 -080027namespace V1_6 {
Roshan Pius200a17d2017-11-01 13:03:35 -070028namespace implementation {
29namespace feature_flags {
30
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080031using V1_0::ChipModeId;
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080032using V1_0::IWifiChip;
Quang Luong5d8805e2022-01-28 15:46:40 -080033using V1_6::IfaceConcurrencyType;
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080034
35/* The chip may either have a single mode supporting any number of combinations,
36 * or a fixed dual-mode (so it involves firmware loading to switch between
37 * modes) setting. If there is a need to support more modes, it needs to be
38 * implemented manually in WiFi HAL (see changeFirmwareMode in
39 * WifiChip::handleChipConfiguration).
40 *
41 * Supported combinations are defined in device's makefile, for example:
42 * WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA, AP}, 1}, {{P2P, NAN}, 1}},
43 * WIFI_HAL_INTERFACE_COMBINATIONS += {{{STA}, 1}, {{AP}, 2}}
44 * What means:
Quang Luong5d8805e2022-01-28 15:46:40 -080045 * Interface concurrency combination 1: 1 STA or AP and 1 P2P or NAN concurrent iface
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080046 * operations.
Quang Luong5d8805e2022-01-28 15:46:40 -080047 * Interface concurrency combination 2: 1 STA and 2 AP concurrent iface operations.
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080048 *
49 * For backward compatibility, the following makefile flags can be used to
50 * generate combinations list:
51 * - WIFI_HIDL_FEATURE_DUAL_INTERFACE
52 * - WIFI_HIDL_FEATURE_DISABLE_AP
53 * - WIFI_HIDL_FEATURE_AWARE
54 * However, they are ignored if WIFI_HAL_INTERFACE_COMBINATIONS was provided.
55 * With WIFI_HIDL_FEATURE_DUAL_INTERFACE flag set, there is a single mode with
Quang Luong5d8805e2022-01-28 15:46:40 -080056 * two concurrency combinations:
57 * Interface Concurrency Combination 1: Will support 1 STA and 1 P2P or NAN (optional)
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080058 * concurrent iface operations.
Quang Luong5d8805e2022-01-28 15:46:40 -080059 * Interface Concurrency Combination 2: Will support 1 STA and 1 AP concurrent
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080060 * iface operations.
61 *
62 * The only dual-mode configuration supported is for alternating STA and AP
63 * mode, that may involve firmware reloading. In such case, there are 2 separate
Quang Luong5d8805e2022-01-28 15:46:40 -080064 * modes of operation with 1 concurrency combination each:
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080065 * Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN (optional)
66 * concurrent iface operations.
67 * Mode 2 (AP mode): Will support 1 AP iface operation.
68 *
Quang Luong5d8805e2022-01-28 15:46:40 -080069 * If Aware is enabled, the concurrency combination will be modified to support either
Tomasz Wasilczykb424da72018-11-15 11:52:57 -080070 * P2P or NAN in place of just P2P.
71 */
72// clang-format off
73#ifdef WIFI_HAL_INTERFACE_COMBINATIONS
74constexpr ChipModeId kMainModeId = chip_mode_ids::kV3;
75#elif defined(WIFI_HIDL_FEATURE_DUAL_INTERFACE)
76// former V2 (fixed dual interface) setup expressed as V3
77constexpr ChipModeId kMainModeId = chip_mode_ids::kV3;
78# ifdef WIFI_HIDL_FEATURE_DISABLE_AP
79# ifdef WIFI_HIDL_FEATURE_AWARE
80// 1 STA + 1 of (P2P or NAN)
81# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P, NAN}, 1}}
82# else
83// 1 STA + 1 P2P
84# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P}, 1}}
85# endif
86# else
87# ifdef WIFI_HIDL_FEATURE_AWARE
88// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN))
89# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\
90 {{{STA}, 1}, {{P2P, NAN}, 1}}
91# else
92// (1 STA + 1 AP) or (1 STA + 1 P2P)
93# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\
94 {{{STA}, 1}, {{P2P}, 1}}
95# endif
96# endif
97#else
98// V1 (fixed single interface, dual-mode chip)
99constexpr ChipModeId kMainModeId = chip_mode_ids::kV1Sta;
100# ifdef WIFI_HIDL_FEATURE_AWARE
101// 1 STA + 1 of (P2P or NAN)
102# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P, NAN}, 1}}
103# else
104// 1 STA + 1 P2P
105# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P}, 1}}
106# endif
107
108# ifndef WIFI_HIDL_FEATURE_DISABLE_AP
109# define WIFI_HAL_INTERFACE_COMBINATIONS_AP {{{AP}, 1}}
110# endif
111#endif
112// clang-format on
113
114/**
115 * Helper class to convert a collection of combination limits to a combination.
116 *
117 * The main point here is to simplify the syntax required by
118 * WIFI_HAL_INTERFACE_COMBINATIONS.
119 */
Quang Luong5d8805e2022-01-28 15:46:40 -0800120struct ChipConcurrencyCombination
121 : public hidl_vec<V1_6::IWifiChip::ChipConcurrencyCombinationLimit> {
122 ChipConcurrencyCombination(
123 const std::initializer_list<V1_6::IWifiChip::ChipConcurrencyCombinationLimit> list)
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800124 : hidl_vec(list) {}
125
Quang Luong5d8805e2022-01-28 15:46:40 -0800126 operator V1_6::IWifiChip::ChipConcurrencyCombination() const { return {*this}; }
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800127
Quang Luong5d8805e2022-01-28 15:46:40 -0800128 static hidl_vec<V1_6::IWifiChip::ChipConcurrencyCombination> make_vec(
129 const std::initializer_list<ChipConcurrencyCombination> list) {
130 return hidl_vec<V1_6::IWifiChip::ChipConcurrencyCombination>( //
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800131 std::begin(list), std::end(list));
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800132 }
133};
134
Quang Luong5d8805e2022-01-28 15:46:40 -0800135#define STA IfaceConcurrencyType::STA
136#define AP IfaceConcurrencyType::AP
137#define AP_BRIDGED IfaceConcurrencyType::AP_BRIDGED
138#define P2P IfaceConcurrencyType::P2P
139#define NAN IfaceConcurrencyType::NAN
140static const std::vector<V1_6::IWifiChip::ChipMode> kChipModesPrimary{
141 {kMainModeId, ChipConcurrencyCombination::make_vec({WIFI_HAL_INTERFACE_COMBINATIONS})},
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800142#ifdef WIFI_HAL_INTERFACE_COMBINATIONS_AP
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800143 {chip_mode_ids::kV1Ap,
Quang Luong5d8805e2022-01-28 15:46:40 -0800144 ChipConcurrencyCombination::make_vec({WIFI_HAL_INTERFACE_COMBINATIONS_AP})},
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800145#endif
146};
Jimmy Chen2dddd792019-12-23 17:50:39 +0200147
Quang Luong5d8805e2022-01-28 15:46:40 -0800148static const std::vector<V1_6::IWifiChip::ChipMode> kChipModesSecondary{
Jimmy Chen2dddd792019-12-23 17:50:39 +0200149#ifdef WIFI_HAL_INTERFACE_COMBINATIONS_SECONDARY_CHIP
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800150 {chip_mode_ids::kV3,
Quang Luong5d8805e2022-01-28 15:46:40 -0800151 ChipConcurrencyCombination::make_vec({WIFI_HAL_INTERFACE_COMBINATIONS_SECONDARY_CHIP})},
Jimmy Chen2dddd792019-12-23 17:50:39 +0200152#endif
153};
Roshan Pius2272ff82020-11-12 09:37:40 -0800154
155constexpr char kDebugPresetInterfaceCombinationIdxProperty[] =
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800156 "persist.vendor.debug.wifi.hal.preset_interface_combination_idx";
Quang Luong5d8805e2022-01-28 15:46:40 -0800157// List of pre-defined concurrency combinations that can be enabled at runtime via
Roshan Pius2272ff82020-11-12 09:37:40 -0800158// setting the property: "kDebugPresetInterfaceCombinationIdxProperty" to the
159// corresponding index value.
Quang Luong5d8805e2022-01-28 15:46:40 -0800160static const std::vector<std::pair<std::string, std::vector<V1_6::IWifiChip::ChipMode>>>
161 kDebugChipModes{// Legacy combination - No STA/AP concurrencies.
162 // 0 - (1 AP) or (1 STA + 1 of (P2P or NAN))
163 {"No STA/AP Concurrency",
164 {{kMainModeId, ChipConcurrencyCombination::make_vec(
165 {{{{AP}, 1}}, {{{STA}, 1}, {{P2P, NAN}, 1}}})}}},
Roshan Pius2272ff82020-11-12 09:37:40 -0800166
Quang Luong5d8805e2022-01-28 15:46:40 -0800167 // STA + AP concurrency
168 // 1 - (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN))
169 {"STA + AP Concurrency",
170 {{kMainModeId,
171 ChipConcurrencyCombination::make_vec(
172 {{{{STA}, 1}, {{AP}, 1}}, {{{STA}, 1}, {{P2P, NAN}, 1}}})}}},
Roshan Pius2272ff82020-11-12 09:37:40 -0800173
Quang Luong5d8805e2022-01-28 15:46:40 -0800174 // STA + STA concurrency
175 // 2 - (1 STA + 1 AP) or (2 STA + 1 of (P2P or NAN))
176 {"Dual STA Concurrency",
177 {{kMainModeId,
178 ChipConcurrencyCombination::make_vec(
179 {{{{STA}, 1}, {{AP}, 1}}, {{{STA}, 2}, {{P2P, NAN}, 1}}})}}},
Roshan Pius2272ff82020-11-12 09:37:40 -0800180
Quang Luong5d8805e2022-01-28 15:46:40 -0800181 // AP + AP + STA concurrency
182 // 3 - (1 STA + 2 AP) or (1 STA + 1 of (P2P or NAN))
183 {"Dual AP Concurrency",
184 {{kMainModeId,
185 ChipConcurrencyCombination::make_vec(
186 {{{{STA}, 1}, {{AP}, 2}}, {{{STA}, 1}, {{P2P, NAN}, 1}}})}}},
Roshan Pius2272ff82020-11-12 09:37:40 -0800187
Quang Luong5d8805e2022-01-28 15:46:40 -0800188 // STA + STA concurrency and AP + AP + STA concurrency
189 // 4 - (1 STA + 2 AP) or (2 STA + 1 of (P2P or NAN))
190 {"Dual STA & Dual AP Concurrency",
191 {{kMainModeId,
192 ChipConcurrencyCombination::make_vec(
193 {{{{STA}, 1}, {{AP}, 2}}, {{{STA}, 2}, {{P2P, NAN}, 1}}})}}},
Etan Cohenfcf07852021-12-26 07:13:20 +0000194
Quang Luong5d8805e2022-01-28 15:46:40 -0800195 // STA + STA concurrency
196 // 5 - (1 STA + 1 AP (bridged or single) | P2P | NAN), or (2 STA))
197 {"Dual STA or STA plus single other interface",
198 {{kMainModeId, ChipConcurrencyCombination::make_vec(
199 {{{{STA}, 1}, {{P2P, NAN, AP, AP_BRIDGED}, 1}},
200 {{{STA}, 2}}})}}}};
Roshan Pius2272ff82020-11-12 09:37:40 -0800201
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800202#undef STA
203#undef AP
204#undef P2P
205#undef NAN
206
Roshan Pius3b6705f2019-02-14 09:43:43 -0800207#ifdef WIFI_HIDL_FEATURE_DISABLE_AP_MAC_RANDOMIZATION
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800208#pragma message \
209 "WIFI_HIDL_FEATURE_DISABLE_AP_MAC_RANDOMIZATION is deprecated; override " \
210 "'config_wifi_ap_randomization_supported' in " \
211 "frameworks/base/core/res/res/values/config.xml in the device overlay " \
212 "instead"
Patrik Fimml6beae322019-10-09 17:34:01 +0200213#endif // WIFI_HIDL_FEATURE_DISABLE_AP_MAC_RANDOMIZATION
Roshan Pius3b6705f2019-02-14 09:43:43 -0800214
Roshan Pius200a17d2017-11-01 13:03:35 -0700215WifiFeatureFlags::WifiFeatureFlags() {}
Tomasz Wasilczykb424da72018-11-15 11:52:57 -0800216
Quang Luong5d8805e2022-01-28 15:46:40 -0800217std::vector<V1_6::IWifiChip::ChipMode> WifiFeatureFlags::getChipModesForPrimary() {
Roshan Pius2272ff82020-11-12 09:37:40 -0800218 std::array<char, PROPERTY_VALUE_MAX> buffer;
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800219 auto res = property_get(kDebugPresetInterfaceCombinationIdxProperty, buffer.data(), nullptr);
Quang Luong5d8805e2022-01-28 15:46:40 -0800220 // Debug property not set, use the device preset concurrency combination.
Roshan Pius2272ff82020-11-12 09:37:40 -0800221 if (res <= 0) return kChipModesPrimary;
222
Quang Luong5d8805e2022-01-28 15:46:40 -0800223 // Debug property set, use one of the debug preset concurrency combination.
Roshan Pius2272ff82020-11-12 09:37:40 -0800224 unsigned long idx = std::stoul(buffer.data());
225 if (idx >= kDebugChipModes.size()) {
226 LOG(ERROR) << "Invalid index set in property: "
227 << kDebugPresetInterfaceCombinationIdxProperty;
228 return kChipModesPrimary;
229 }
230 std::string name;
Quang Luong5d8805e2022-01-28 15:46:40 -0800231 std::vector<V1_6::IWifiChip::ChipMode> chip_modes;
Roshan Pius2272ff82020-11-12 09:37:40 -0800232 std::tie(name, chip_modes) = kDebugChipModes[idx];
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800233 LOG(INFO) << "Using debug chip mode: <" << name
234 << "> set via property: " << kDebugPresetInterfaceCombinationIdxProperty;
Roshan Pius2272ff82020-11-12 09:37:40 -0800235 return chip_modes;
236}
237
Quang Luong5d8805e2022-01-28 15:46:40 -0800238std::vector<V1_6::IWifiChip::ChipMode> WifiFeatureFlags::getChipModes(bool is_primary) {
Roshan Pius2272ff82020-11-12 09:37:40 -0800239 return (is_primary) ? getChipModesForPrimary() : kChipModesSecondary;
Roshan Piuscc338202017-11-02 13:54:09 -0700240}
Roshan Pius200a17d2017-11-01 13:03:35 -0700241
242} // namespace feature_flags
243} // namespace implementation
Ahmed ElArabawy687ce132022-01-11 16:42:48 -0800244} // namespace V1_6
Roshan Pius200a17d2017-11-01 13:03:35 -0700245} // namespace wifi
246} // namespace hardware
247} // namespace android