Skip to content

Commit 61996fe

Browse files
committed
IAccessPointController::GetCapabilities return AccessPointOperationStatus.
1 parent 6b11928 commit 61996fe

File tree

9 files changed

+126
-52
lines changed

9 files changed

+126
-52
lines changed

src/common/service/NetRemoteService.cxx

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,17 @@ IAccessPointToNetRemoteAccessPointResultItem(IAccessPoint& accessPoint)
188188
return MakeInvalidAccessPointResultItem();
189189
}
190190

191-
Dot11AccessPointCapabilities dot11AccessPointCapabilities{};
192-
try {
193-
auto ieee80211AccessPointCapabilities = accessPointController->GetCapabilities();
194-
dot11AccessPointCapabilities = ToDot11AccessPointCapabilities(ieee80211AccessPointCapabilities);
195-
} catch (const AccessPointControllerException& apce) {
196-
LOGE << std::format("Failed to get capabilities for access point {} ({})", interfaceName, apce.what());
191+
// Obtain capabilities of the access point.
192+
Ieee80211AccessPointCapabilities ieee80211AccessPointCapabilities{};
193+
operationStatus = accessPointController->GetCapabilities(ieee80211AccessPointCapabilities);
194+
if (!operationStatus) {
195+
LOGE << std::format("Failed to get capabilities for access point {}", interfaceName);
197196
return MakeInvalidAccessPointResultItem();
198197
}
199198

199+
Dot11AccessPointCapabilities dot11AccessPointCapabilities{};
200+
dot11AccessPointCapabilities = ToDot11AccessPointCapabilities(ieee80211AccessPointCapabilities);
201+
200202
const bool isEnabled{ operationalState == AccessPointOperationalState::Enabled };
201203

202204
// Populate the result item.
@@ -346,14 +348,15 @@ NetRemoteService::WifiAccessPointSetPhyType([[maybe_unused]] grpc::ServerContext
346348
auto ieee80211Protocol = FromDot11PhyType(request->phytype());
347349

348350
// Check if Ieee80211 protocol is supported by AP.
349-
try {
350-
auto accessPointCapabilities = accessPointController->GetCapabilities();
351-
const auto& supportedIeee80211Protocols = accessPointCapabilities.Protocols;
352-
if (std::ranges::find(supportedIeee80211Protocols, ieee80211Protocol) == std::cend(supportedIeee80211Protocols)) {
353-
return HandleFailure(request, result, WifiAccessPointOperationStatusCode::WifiAccessPointOperationStatusCodeOperationNotSupported, std::format("PHY type not supported by access point {}", request->accesspointid()));
354-
}
355-
} catch (const AccessPointControllerException& apce) {
356-
return HandleFailure(request, result, WifiAccessPointOperationStatusCode::WifiAccessPointOperationStatusCodeInternalError, std::format("Failed to get capabilities for access point {} ({})", request->accesspointid(), apce.what()));
351+
Ieee80211AccessPointCapabilities accessPointCapabilities{};
352+
auto operationStatus = accessPointController->GetCapabilities(accessPointCapabilities);
353+
if (!operationStatus) {
354+
return HandleFailure(request, result, operationStatus.Code, std::format("Failed to get capabilities for access point {}", request->accesspointid()));
355+
}
356+
357+
const auto& supportedIeee80211Protocols = accessPointCapabilities.Protocols;
358+
if (std::ranges::find(supportedIeee80211Protocols, ieee80211Protocol) == std::cend(supportedIeee80211Protocols)) {
359+
return HandleFailure(request, result, WifiAccessPointOperationStatusCode::WifiAccessPointOperationStatusCodeOperationNotSupported, std::format("PHY type not supported by access point {}", request->accesspointid()));
357360
}
358361

359362
// Set the Ieee80211 protocol.
@@ -409,10 +412,9 @@ NetRemoteService::WifiAccessPointSetFrequencyBands([[maybe_unused]] grpc::Server
409412

410413
// Obtain capabilities of the access point.
411414
Ieee80211AccessPointCapabilities accessPointCapabilities{};
412-
try {
413-
accessPointCapabilities = accessPointController->GetCapabilities();
414-
} catch (const AccessPointControllerException& apce) {
415-
return HandleFailure(request, result, WifiAccessPointOperationStatusCode::WifiAccessPointOperationStatusCodeInternalError, std::format("Failed to get capabilities for access point {} ({})", request->accesspointid(), apce.what()));
415+
auto operationStatus = accessPointController->GetCapabilities(accessPointCapabilities);
416+
if (!operationStatus) {
417+
return HandleFailure(request, result, operationStatus.Code, std::format("Failed to get capabilities for access point {}", request->accesspointid()));
416418
}
417419

418420
// Check if requested bands are supported by the AP.

src/common/wifi/core/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ target_sources(wifi-core
1111
AccessPointController.cxx
1212
AccessPointControllerException.cxx
1313
AccessPointOperationStatus.cxx
14+
Ieee80211AccessPointCapabilities.cxx
1415
PUBLIC
1516
FILE_SET HEADERS
1617
BASE_DIRS ${WIFI_CORE_PUBLIC_INCLUDE}
@@ -25,6 +26,8 @@ target_sources(wifi-core
2526
)
2627

2728
target_link_libraries(wifi-core
29+
PRIVATE
30+
magic_enum::magic_enum
2831
PUBLIC
2932
notstd
3033
)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
#include <sstream>
3+
#include <string>
4+
5+
#include <magic_enum.hpp>
6+
#include <microsoft/net/wifi/Ieee80211AccessPointCapabilities.hxx>
7+
8+
using namespace Microsoft::Net::Wifi;
9+
10+
std::string
11+
Ieee80211AccessPointCapabilities::ToString() const
12+
{
13+
std::ostringstream result{};
14+
15+
result << "Protocols: ";
16+
for (const auto& protocol : Protocols) {
17+
result << magic_enum::enum_name(protocol);
18+
result << ' ';
19+
}
20+
21+
result << '\n'
22+
<< "Frequency Bands: ";
23+
for (const auto& frequencyBand : FrequencyBands) {
24+
result << magic_enum::enum_name(frequencyBand);
25+
result << ' ';
26+
}
27+
28+
result << '\n'
29+
<< "Akm Suites: ";
30+
for (const auto& akmSuite : AkmSuites) {
31+
result << magic_enum::enum_name(akmSuite);
32+
result << ' ';
33+
}
34+
35+
result << '\n'
36+
<< "Cipher Suites: ";
37+
for (const auto& cipherSuite : CipherSuites) {
38+
result << magic_enum::enum_name(cipherSuite);
39+
result << ' ';
40+
}
41+
result << '\n';
42+
43+
return result.str();
44+
}

src/common/wifi/core/include/microsoft/net/wifi/IAccessPointController.hxx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,11 @@ struct IAccessPointController
7474
/**
7575
* @brief Get the capabilities of the access point.
7676
*
77-
* @return Ieee80211AccessPointCapabilities
77+
* @param ieee80211AccessPointCapabilities The value to store the capabilities.
78+
* @return AccessPointOperationStatus
7879
*/
79-
virtual Ieee80211AccessPointCapabilities
80-
GetCapabilities() = 0;
80+
virtual AccessPointOperationStatus
81+
GetCapabilities(Ieee80211AccessPointCapabilities& ieee80211AccessPointCapabilities) = 0;
8182

8283
/**
8384
* @brief Set the operational state of the access point.
@@ -92,7 +93,7 @@ struct IAccessPointController
9293
* @brief Set the Ieee80211 protocol of the access point.
9394
*
9495
* @param ieeeProtocol The Ieee80211 protocol to be set.
95-
* @return AccessPointOperationStatus
96+
* @return AccessPointOperationStatus
9697
*/
9798
virtual AccessPointOperationStatus
9899
SetProtocol(Ieee80211Protocol ieeeProtocol) = 0;

src/common/wifi/core/include/microsoft/net/wifi/Ieee80211AccessPointCapabilities.hxx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#ifndef IEEE_80211_ACCESS_POINT_CAPABILITIES_HXX
33
#define IEEE_80211_ACCESS_POINT_CAPABILITIES_HXX
44

5+
#include <string>
56
#include <vector>
67

78
#include <microsoft/net/wifi/Ieee80211.hxx>
@@ -17,6 +18,14 @@ struct Ieee80211AccessPointCapabilities
1718
std::vector<Ieee80211FrequencyBand> FrequencyBands;
1819
std::vector<Ieee80211AkmSuite> AkmSuites;
1920
std::vector<Ieee80211CipherSuite> CipherSuites;
21+
22+
/**
23+
* @brief Get a string representation of the capabilities.
24+
*
25+
* @return std::string
26+
*/
27+
std::string
28+
ToString() const;
2029
};
2130
} // namespace Microsoft::Net::Wifi
2231

src/linux/wifi/core/AccessPointControllerLinux.cxx

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -150,32 +150,44 @@ IeeeFrequencyBandToHostapdBand(Ieee80211FrequencyBand ieeeFrequencyBand)
150150
}
151151
} // namespace detail
152152

153-
Ieee80211AccessPointCapabilities
154-
AccessPointControllerLinux::GetCapabilities()
153+
AccessPointOperationStatus
154+
AccessPointControllerLinux::GetCapabilities(Ieee80211AccessPointCapabilities& ieee80211AccessPointCapabilities)
155155
{
156-
auto wiphy = Nl80211Wiphy::FromInterfaceName(GetInterfaceName());
156+
AccessPointOperationStatus status{};
157+
158+
const auto wiphy = Nl80211Wiphy::FromInterfaceName(GetInterfaceName());
157159
if (!wiphy.has_value()) {
158-
throw AccessPointControllerException(std::format("Failed to get wiphy for interface {}", GetInterfaceName()));
159-
}
160+
status.Code = AccessPointOperationStatusCode::AccessPointInvalid;
161+
status.Message = std::format("Failed to get wiphy for interface {}", GetInterfaceName());
162+
} else {
163+
Ieee80211AccessPointCapabilities capabilities;
160164

161-
Ieee80211AccessPointCapabilities capabilities;
165+
// Convert protocols.
166+
capabilities.Protocols = detail::Nl80211WiphyToIeee80211Protocols(wiphy.value());
162167

163-
// Convert protocols.
164-
capabilities.Protocols = detail::Nl80211WiphyToIeee80211Protocols(wiphy.value());
168+
// Convert frequency bands.
169+
capabilities.FrequencyBands = std::vector<Ieee80211FrequencyBand>(std::size(wiphy->Bands));
170+
std::ranges::transform(std::views::keys(wiphy->Bands), std::begin(capabilities.FrequencyBands), detail::Nl80211BandToIeee80211FrequencyBand);
165171

166-
// Convert frequency bands.
167-
capabilities.FrequencyBands = std::vector<Ieee80211FrequencyBand>(std::size(wiphy->Bands));
168-
std::ranges::transform(std::views::keys(wiphy->Bands), std::begin(capabilities.FrequencyBands), detail::Nl80211BandToIeee80211FrequencyBand);
172+
// Convert AKM suites.
173+
capabilities.AkmSuites = std::vector<Ieee80211AkmSuite>(std::size(wiphy->AkmSuites));
174+
std::ranges::transform(wiphy->AkmSuites, std::begin(capabilities.AkmSuites), detail::Nl80211AkmSuiteToIeee80211AkmSuite);
169175

170-
// Convert AKM suites.
171-
capabilities.AkmSuites = std::vector<Ieee80211AkmSuite>(std::size(wiphy->AkmSuites));
172-
std::ranges::transform(wiphy->AkmSuites, std::begin(capabilities.AkmSuites), detail::Nl80211AkmSuiteToIeee80211AkmSuite);
176+
// Convert cipher suites.
177+
capabilities.CipherSuites = std::vector<Ieee80211CipherSuite>(std::size(wiphy->CipherSuites));
178+
std::ranges::transform(wiphy->CipherSuites, std::begin(capabilities.CipherSuites), detail::Nl80211CipherSuiteToIeee80211CipherSuite);
173179

174-
// Convert cipher suites.
175-
capabilities.CipherSuites = std::vector<Ieee80211CipherSuite>(std::size(wiphy->CipherSuites));
176-
std::ranges::transform(wiphy->CipherSuites, std::begin(capabilities.CipherSuites), detail::Nl80211CipherSuiteToIeee80211CipherSuite);
180+
ieee80211AccessPointCapabilities = std::move(capabilities);
181+
status = AccessPointOperationStatus::MakeSucceeded();
182+
}
177183

178-
return capabilities;
184+
if (status.Succeeded()) {
185+
LOGD << std::format("Got capabilities for interface {}", GetInterfaceName());
186+
} else {
187+
LOGE << std::format("Failed to get capabilities for interface {} ({} - {})", GetInterfaceName(), magic_enum::enum_name(status.Code), status.Message);
188+
}
189+
190+
return status;
179191
}
180192

181193
AccessPointOperationStatus

src/linux/wifi/core/include/microsoft/net/wifi/AccessPointControllerLinux.hxx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ struct AccessPointControllerLinux :
5252
GetOperationalState(AccessPointOperationalState& operationalState) override;
5353

5454
/**
55-
* @brief Get the Capabilities object
55+
* @brief Get the capabilities of the access point.
5656
*
57-
* @return Ieee80211AccessPointCapabilities
57+
* @param ieee80211AccessPointCapabilities The value to store the capabilities.
58+
* @return AccessPointOperationStatus
5859
*/
59-
Ieee80211AccessPointCapabilities
60-
GetCapabilities() override;
60+
AccessPointOperationStatus
61+
GetCapabilities(Ieee80211AccessPointCapabilities& ieee80211AccessPointCapabilities) override;
6162

6263
/**
6364
* @brief Set the operational state of the access point.

tests/unit/wifi/helpers/AccessPointControllerTest.cxx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,15 @@ AccessPointControllerTest::GetOperationalState(AccessPointOperationalState &oper
4545
return AccessPointOperationStatus::MakeSucceeded();
4646
}
4747

48-
Ieee80211AccessPointCapabilities
49-
AccessPointControllerTest::GetCapabilities()
48+
AccessPointOperationStatus
49+
AccessPointControllerTest::GetCapabilities(Ieee80211AccessPointCapabilities &ieee80211AccessPointCapabilities)
5050
{
5151
if (AccessPoint == nullptr) {
5252
throw std::runtime_error("AccessPointControllerTest::GetCapabilities called with null AccessPoint");
5353
}
5454

55-
return AccessPoint->Capabilities;
55+
ieee80211AccessPointCapabilities = AccessPoint->Capabilities;
56+
return AccessPointOperationStatus::MakeSucceeded();
5657
}
5758

5859
AccessPointOperationStatus

tests/unit/wifi/helpers/include/microsoft/net/wifi/test/AccessPointControllerTest.hxx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,19 @@ struct AccessPointControllerTest final :
5959
* @brief Get the access point operational state.
6060
*
6161
* @param operationalState The value to store the operational state.
62-
* @return AccessPointOperationStatus
62+
* @return AccessPointOperationStatus
6363
*/
6464
AccessPointOperationStatus
65-
GetOperationalState(AccessPointOperationalState& operationalState) override;
65+
GetOperationalState(AccessPointOperationalState &operationalState) override;
6666

6767
/**
6868
* @brief Get the capabilities of the access point.
6969
*
70-
* @return Ieee80211AccessPointCapabilities
70+
* @param ieee80211AccessPointCapabilities The value to store the capabilities.
71+
* @return AccessPointOperationStatus
7172
*/
72-
Ieee80211AccessPointCapabilities
73-
GetCapabilities() override;
73+
AccessPointOperationStatus
74+
GetCapabilities(Ieee80211AccessPointCapabilities &ieee80211AccessPointCapabilities) override;
7475

7576
/**
7677
* @brief Set the operational state of the access point.

0 commit comments

Comments
 (0)