blob: f47dae81ba18db6e7538c6b291555e1c294065a0 [file] [log] [blame]
/*
* Copyright (C) 2016 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.
*/
#include "wifi_feature_flags.h"
namespace android {
namespace hardware {
namespace wifi {
namespace V1_3 {
namespace implementation {
namespace feature_flags {
using V1_0::ChipModeId;
using V1_0::IfaceType;
using V1_0::IWifiChip;
/* The chip may either have a single mode supporting any number of combinations,
* or a fixed dual-mode (so it involves firmware loading to switch between
* modes) setting. If there is a need to support more modes, it needs to be
* implemented manually in WiFi HAL (see changeFirmwareMode in
* WifiChip::handleChipConfiguration).
*
* Supported combinations are defined in device's makefile, for example:
* WIFI_HAL_INTERFACE_COMBINATIONS := {{{STA, AP}, 1}, {{P2P, NAN}, 1}},
* WIFI_HAL_INTERFACE_COMBINATIONS += {{{STA}, 1}, {{AP}, 2}}
* What means:
* Interface combination 1: 1 STA or AP and 1 P2P or NAN concurrent iface
* operations.
* Interface combination 2: 1 STA and 2 AP concurrent iface operations.
*
* For backward compatibility, the following makefile flags can be used to
* generate combinations list:
* - WIFI_HIDL_FEATURE_DUAL_INTERFACE
* - WIFI_HIDL_FEATURE_DISABLE_AP
* - WIFI_HIDL_FEATURE_AWARE
* However, they are ignored if WIFI_HAL_INTERFACE_COMBINATIONS was provided.
* With WIFI_HIDL_FEATURE_DUAL_INTERFACE flag set, there is a single mode with
* two interface combinations:
* Interface Combination 1: Will support 1 STA and 1 P2P or NAN (optional)
* concurrent iface operations.
* Interface Combination 2: Will support 1 STA and 1 AP concurrent
* iface operations.
*
* The only dual-mode configuration supported is for alternating STA and AP
* mode, that may involve firmware reloading. In such case, there are 2 separate
* modes of operation with 1 interface combination each:
* Mode 1 (STA mode): Will support 1 STA and 1 P2P or NAN (optional)
* concurrent iface operations.
* Mode 2 (AP mode): Will support 1 AP iface operation.
*
* If Aware is enabled, the iface combination will be modified to support either
* P2P or NAN in place of just P2P.
*/
// clang-format off
#ifdef WIFI_HAL_INTERFACE_COMBINATIONS
constexpr ChipModeId kMainModeId = chip_mode_ids::kV3;
#elif defined(WIFI_HIDL_FEATURE_DUAL_INTERFACE)
// former V2 (fixed dual interface) setup expressed as V3
constexpr ChipModeId kMainModeId = chip_mode_ids::kV3;
# ifdef WIFI_HIDL_FEATURE_DISABLE_AP
# ifdef WIFI_HIDL_FEATURE_AWARE
// 1 STA + 1 of (P2P or NAN)
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P, NAN}, 1}}
# else
// 1 STA + 1 P2P
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P}, 1}}
# endif
# else
# ifdef WIFI_HIDL_FEATURE_AWARE
// (1 STA + 1 AP) or (1 STA + 1 of (P2P or NAN))
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\
{{{STA}, 1}, {{P2P, NAN}, 1}}
# else
// (1 STA + 1 AP) or (1 STA + 1 P2P)
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{AP}, 1}},\
{{{STA}, 1}, {{P2P}, 1}}
# endif
# endif
#else
// V1 (fixed single interface, dual-mode chip)
constexpr ChipModeId kMainModeId = chip_mode_ids::kV1Sta;
# ifdef WIFI_HIDL_FEATURE_AWARE
// 1 STA + 1 of (P2P or NAN)
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P, NAN}, 1}}
# else
// 1 STA + 1 P2P
# define WIFI_HAL_INTERFACE_COMBINATIONS {{{STA}, 1}, {{P2P}, 1}}
# endif
# ifndef WIFI_HIDL_FEATURE_DISABLE_AP
# define WIFI_HAL_INTERFACE_COMBINATIONS_AP {{{AP}, 1}}
# endif
#endif
// clang-format on
/**
* Helper class to convert a collection of combination limits to a combination.
*
* The main point here is to simplify the syntax required by
* WIFI_HAL_INTERFACE_COMBINATIONS.
*/
struct ChipIfaceCombination
: public hidl_vec<IWifiChip::ChipIfaceCombinationLimit> {
ChipIfaceCombination(
const std::initializer_list<IWifiChip::ChipIfaceCombinationLimit> list)
: hidl_vec(list) {}
operator IWifiChip::ChipIfaceCombination() const { return {*this}; }
static hidl_vec<IWifiChip::ChipIfaceCombination> make_vec(
const std::initializer_list<ChipIfaceCombination> list) {
return hidl_vec<IWifiChip::ChipIfaceCombination>( //
std::begin(list), std::end(list));
}
};
#define STA IfaceType::STA
#define AP IfaceType::AP
#define P2P IfaceType::P2P
#define NAN IfaceType::NAN
static const std::vector<IWifiChip::ChipMode> kChipModes{
{kMainModeId,
ChipIfaceCombination::make_vec({WIFI_HAL_INTERFACE_COMBINATIONS})},
#ifdef WIFI_HAL_INTERFACE_COMBINATIONS_AP
{chip_mode_ids::kV1Ap,
ChipIfaceCombination::make_vec({WIFI_HAL_INTERFACE_COMBINATIONS_AP})},
#endif
};
#undef STA
#undef AP
#undef P2P
#undef NAN
#ifndef WIFI_HIDL_FEATURE_AP_MAC_RANDOMIZATION
static const bool wifiHidlFeatureDisableApMacRandomization = true;
#else
static const bool wifiHidlFeatureDisableApMacRandomization = false;
#endif // WIFI_HIDL_FEATURE_AP_MAC_RANDOMIZATION
WifiFeatureFlags::WifiFeatureFlags() {}
std::vector<IWifiChip::ChipMode> WifiFeatureFlags::getChipModes() {
return kChipModes;
}
bool WifiFeatureFlags::isApMacRandomizationDisabled() {
return wifiHidlFeatureDisableApMacRandomization;
}
} // namespace feature_flags
} // namespace implementation
} // namespace V1_3
} // namespace wifi
} // namespace hardware
} // namespace android