wlancfg_lib/client/
types.rs1use crate::config_management::{self};
6use fidl_fuchsia_wlan_policy as fidl_policy;
7use fidl_fuchsia_wlan_sme as fidl_sme;
8use fuchsia_async::MonotonicInstant;
9use wlan_common::bss::BssDescription;
10use wlan_common::channel::Channel;
11use wlan_common::historical_list::Timestamped;
12use wlan_common::security::SecurityAuthenticator;
13use wlan_common::sequestered::Sequestered;
14use wlan_metrics_registry::{
15 PolicyConnectionAttemptMigratedMetricDimensionReason,
16 PolicyDisconnectionMigratedMetricDimensionReason,
17};
18
19pub(crate) use crate::regulatory_manager::CountryCode;
20
21pub type NetworkIdentifier = config_management::network_config::NetworkIdentifier;
22pub type SecurityTypeDetailed = fidl_sme::Protection;
23pub type SecurityType = config_management::network_config::SecurityType;
24pub type ConnectionState = fidl_policy::ConnectionState;
25pub type ClientState = fidl_policy::WlanClientState;
26pub type DisconnectStatus = fidl_policy::DisconnectStatus;
27pub type Compatibility = fidl_policy::Compatibility;
28pub type WlanChan = wlan_common::channel::Channel;
29pub type Bandwidth = wlan_common::channel::Bandwidth;
30pub use ieee80211::{Bssid, Ssid};
31pub type DisconnectReason = PolicyDisconnectionMigratedMetricDimensionReason;
32pub type ConnectReason = PolicyConnectionAttemptMigratedMetricDimensionReason;
33pub type ScanError = fidl_policy::ScanErrorCode;
34
35pub fn convert_to_sme_disconnect_reason(
36 disconnect_reason: PolicyDisconnectionMigratedMetricDimensionReason,
37) -> fidl_sme::UserDisconnectReason {
38 match disconnect_reason {
39 PolicyDisconnectionMigratedMetricDimensionReason::Unknown => {
40 fidl_sme::UserDisconnectReason::Unknown
41 }
42 PolicyDisconnectionMigratedMetricDimensionReason::FailedToConnect => {
43 fidl_sme::UserDisconnectReason::FailedToConnect
44 }
45 PolicyDisconnectionMigratedMetricDimensionReason::FidlConnectRequest => {
46 fidl_sme::UserDisconnectReason::FidlConnectRequest
47 }
48 PolicyDisconnectionMigratedMetricDimensionReason::FidlStopClientConnectionsRequest => {
49 fidl_sme::UserDisconnectReason::FidlStopClientConnectionsRequest
50 }
51 PolicyDisconnectionMigratedMetricDimensionReason::ProactiveNetworkSwitch => {
52 fidl_sme::UserDisconnectReason::ProactiveNetworkSwitch
53 }
54 PolicyDisconnectionMigratedMetricDimensionReason::DisconnectDetectedFromSme => {
55 fidl_sme::UserDisconnectReason::DisconnectDetectedFromSme
56 }
57 PolicyDisconnectionMigratedMetricDimensionReason::RegulatoryRegionChange => {
58 fidl_sme::UserDisconnectReason::RegulatoryRegionChange
59 }
60 PolicyDisconnectionMigratedMetricDimensionReason::Startup => {
61 fidl_sme::UserDisconnectReason::Startup
62 }
63 PolicyDisconnectionMigratedMetricDimensionReason::NetworkUnsaved => {
64 fidl_sme::UserDisconnectReason::NetworkUnsaved
65 }
66 PolicyDisconnectionMigratedMetricDimensionReason::NetworkConfigUpdated => {
67 fidl_sme::UserDisconnectReason::NetworkConfigUpdated
68 }
69 }
70}
71
72#[cfg_attr(test, derive(Debug))]
75#[derive(Clone, PartialEq)]
76pub struct ScanResult {
77 pub ssid: Ssid,
80 pub security_type_detailed: SecurityTypeDetailed,
81 pub entries: Vec<Bss>,
83 pub compatibility: Compatibility,
85}
86
87#[cfg_attr(test, derive(Debug, PartialOrd, Ord, Clone))]
89#[derive(Hash, PartialEq, Eq)]
90pub struct NetworkIdentifierDetailed {
91 pub ssid: Ssid,
92 pub security_type: SecurityTypeDetailed,
93}
94
95#[derive(Clone, Copy, Debug, PartialEq)]
96pub enum ScanObservation {
97 Passive,
98 Active,
99 Unknown,
100}
101
102#[cfg_attr(test, derive(Debug))]
105#[derive(Clone, PartialEq)]
106pub struct Bss {
107 pub bssid: Bssid,
109 pub signal: Signal,
111 pub channel: WlanChan,
113 pub timestamp: zx::MonotonicInstant,
115 pub observation: ScanObservation,
117 pub compatibility: wlan_common::scan::Compatibility,
119 pub bss_description: Sequestered<fidl_fuchsia_wlan_ieee80211::BssDescription>,
121}
122
123impl Bss {
124 pub fn is_compatible(&self) -> bool {
125 self.compatibility.is_ok()
126 }
127
128 pub fn is_same_bssid_and_security(&self, other: &Bss) -> bool {
129 self.bssid == other.bssid && self.compatibility == other.compatibility
130 }
131}
132
133#[derive(Clone, Copy, Debug, Eq, PartialEq)]
136pub struct Signal {
137 pub rssi_dbm: i8,
139 pub snr_db: i8,
141}
142
143#[derive(Clone, Debug, PartialEq)]
145pub struct TimestampedSignal {
146 pub signal: Signal,
147 pub time: MonotonicInstant,
148}
149impl Timestamped for TimestampedSignal {
150 fn time(&self) -> fuchsia_async::MonotonicInstant {
151 self.time
152 }
153}
154
155#[derive(Clone, Copy, Debug, Eq, PartialEq)]
161pub struct TrackedBss {
162 pub signal: Signal,
163 pub channel: Channel,
164}
165
166impl TrackedBss {
167 pub fn snapshot(original: &BssDescription) -> Self {
171 TrackedBss {
172 signal: Signal { rssi_dbm: original.rssi_dbm, snr_db: original.snr_db },
173 channel: original.channel,
174 }
175 }
176}
177
178impl PartialEq<BssDescription> for TrackedBss {
179 fn eq(&self, bss: &BssDescription) -> bool {
180 *self == TrackedBss::snapshot(bss)
185 }
186}
187
188impl PartialEq<TrackedBss> for BssDescription {
189 fn eq(&self, tracked: &TrackedBss) -> bool {
190 tracked == self
191 }
192}
193
194#[derive(Debug, Clone)]
196#[cfg_attr(test, derive(PartialEq))]
197pub struct InternalSavedNetworkData {
198 pub has_ever_connected: bool,
199 pub recent_failures: Vec<config_management::ConnectFailure>,
200 pub past_connections: std::collections::HashMap<Bssid, config_management::PastConnectionList>,
201}
202#[derive(Clone)]
203#[cfg_attr(test, derive(Debug, PartialEq))]
205pub struct ScannedCandidate {
206 pub network: NetworkIdentifier,
207 pub security_type_detailed: SecurityTypeDetailed,
208 pub credential: config_management::Credential,
209 pub bss: Bss,
210 pub network_has_multiple_bss: bool,
211 pub authenticator: SecurityAuthenticator,
212 pub saved_network_info: InternalSavedNetworkData,
213}
214
215impl ScannedCandidate {
216 pub fn is_same_bss_security_and_credential(&self, other: &ScannedCandidate) -> bool {
218 self.network == other.network
219 && self.security_type_detailed == other.security_type_detailed
220 && self.credential == other.credential
221 && self.bss.is_same_bssid_and_security(&other.bss)
222 }
223}
224
225#[derive(Clone)]
230#[cfg_attr(test, derive(Debug))]
232#[cfg_attr(test, derive(PartialEq))]
233pub struct ConnectSelection {
234 pub target: ScannedCandidate,
235 pub reason: ConnectReason,
236}
237
238#[derive(Clone, Debug, PartialEq)]
247pub struct ApState {
248 original: BssDescription,
250 pub tracked: TrackedBss,
255}
256
257impl ApState {
258 pub fn original(&self) -> &BssDescription {
260 &self.original
261 }
262
263 pub fn has_changes(&self) -> bool {
265 self.original != self.tracked
266 }
267}
268
269impl From<BssDescription> for ApState {
270 fn from(original: BssDescription) -> Self {
271 let tracked = TrackedBss::snapshot(&original);
272 ApState { original, tracked }
273 }
274}