Skip to content

Commit 8b6cf0c

Browse files
committed
feat(network): detect IWD connection state in known_connections
1 parent 0542211 commit 8b6cf0c

1 file changed

Lines changed: 33 additions & 2 deletions

File tree

  • src/services/network/iwd_dbus

src/services/network/iwd_dbus/mod.rs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ impl super::NetworkBackend for IwdDbus<'_> {
145145
/// List known (provisioned) SSIDs.
146146
async fn known_connections(&self) -> anyhow::Result<Vec<KnownConnection>> {
147147
let nets = self.reachable_networks().await?;
148+
let stations: HashMap<_, _> = self
149+
.stations()
150+
.await?
151+
.into_iter()
152+
.map(|s| (s.inner().path().clone(), s))
153+
.collect();
148154
let mut networks = HashMap::<String, AccessPointData>::new();
149155
for (n, signal_strength) in nets {
150156
if n.known_network().await.is_err() {
@@ -153,16 +159,41 @@ impl super::NetworkBackend for IwdDbus<'_> {
153159
let ssid = n.name().await?;
154160
let path = n.inner().path().clone().into();
155161
let device_path = n.device().await?.clone();
162+
163+
let (state, working) = if let Some(station) = stations.get(&device_path) {
164+
let station_state = station.state().await.unwrap_or_default();
165+
let connected_network = station.connected_network().await.ok();
166+
167+
let is_connected = connected_network
168+
.map(|net_path| net_path == path)
169+
.unwrap_or(false);
170+
171+
let state = if is_connected {
172+
match station_state.as_str() {
173+
"connected" => DeviceState::Activated,
174+
"connecting" => DeviceState::Config,
175+
_ => DeviceState::Unknown,
176+
}
177+
} else {
178+
DeviceState::Disconnected
179+
};
180+
181+
let working = is_connected && station_state == "connected";
182+
(state, working)
183+
} else {
184+
(DeviceState::Unknown, false)
185+
};
186+
156187
let access_point = AccessPointData {
157188
ssid: ssid.clone(),
158189
path,
159190
device_path,
160191
strength: map_iwd_rssi_to_percent(signal_strength),
161192
max_bitrate: 0,
162193
frequency: 0,
163-
state: DeviceState::Unknown, // TODO:
194+
state,
164195
public: n.type_().await? == "open",
165-
working: false, // TODO:
196+
working,
166197
};
167198

168199
// maybe IWD will provide frequency and bitrate in the future

0 commit comments

Comments
 (0)