esp_radio/wifi/sta/
mod.rs1use alloc::string::String;
4use core::fmt;
5
6use procmacros::BuilderLite;
7
8use super::{AuthenticationMethod, Protocols, Ssid};
9use crate::WifiError;
10
11unstable_module!(
12 #[cfg(feature = "wifi-eap")]
13 #[cfg_attr(docsrs, doc(cfg(feature = "wifi-eap")))]
14 pub mod eap;
15);
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19#[cfg_attr(feature = "defmt", derive(defmt::Format))]
20#[non_exhaustive]
21#[repr(u8)]
22#[instability::unstable]
23pub enum ScanMethod {
24 Fast,
26 AllChannels,
28}
29
30#[derive(BuilderLite, Clone, Eq, PartialEq, Hash)]
32pub struct StationConfig {
33 #[builder_lite(skip_setter)]
35 pub(crate) ssid: Ssid,
36 pub(crate) bssid: Option<[u8; 6]>,
38 pub(crate) auth_method: AuthenticationMethod,
40 #[builder_lite(reference)]
42 pub(crate) password: String,
43 pub(crate) channel: Option<u8>,
45 pub(crate) protocols: Protocols,
47 #[builder_lite(unstable)]
53 pub(crate) listen_interval: u16,
54 #[builder_lite(unstable)]
58 pub(crate) beacon_timeout: u16,
59 #[builder_lite(unstable)]
66 pub(crate) failure_retry_cnt: u8,
67 #[builder_lite(unstable)]
69 pub(crate) scan_method: ScanMethod,
70}
71
72impl StationConfig {
73 pub fn with_ssid(mut self, ssid: impl Into<Ssid>) -> Self {
75 self.ssid = ssid.into();
76 self
77 }
78
79 pub(crate) fn validate(&self) -> Result<(), WifiError> {
80 if self.ssid.len() > 32 {
81 return Err(WifiError::InvalidArguments);
82 }
83
84 if self.password.len() > 64 {
85 return Err(WifiError::InvalidArguments);
86 }
87
88 if !(6..=31).contains(&self.beacon_timeout) {
89 return Err(WifiError::InvalidArguments);
90 }
91
92 Ok(())
93 }
94}
95
96impl Default for StationConfig {
97 fn default() -> Self {
98 StationConfig {
99 ssid: Ssid::default(),
100 bssid: None,
101 auth_method: AuthenticationMethod::Wpa2Personal,
102 password: String::new(),
103 channel: None,
104 protocols: Protocols::default(),
105 listen_interval: 3,
106 beacon_timeout: 6,
107 failure_retry_cnt: 1,
108 scan_method: ScanMethod::Fast,
109 }
110 }
111}
112
113impl fmt::Debug for StationConfig {
114 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
115 f.debug_struct("StationConfig")
116 .field("ssid", &self.ssid)
117 .field("bssid", &self.bssid)
118 .field("auth_method", &self.auth_method)
119 .field("password", &"**REDACTED**")
120 .field("channel", &self.channel)
121 .field("protocols", &self.protocols)
122 .field("listen_interval", &self.listen_interval)
123 .field("beacon_timeout", &self.beacon_timeout)
124 .field("failure_retry_cnt", &self.failure_retry_cnt)
125 .field("scan_method", &self.scan_method)
126 .finish()
127 }
128}
129
130#[cfg(feature = "defmt")]
131impl defmt::Format for StationConfig {
132 fn format(&self, fmt: defmt::Formatter<'_>) {
133 defmt::write!(
134 fmt,
135 "StationConfig {{\
136 ssid: {}, \
137 bssid: {:?}, \
138 auth_method: {:?}, \
139 password: **REDACTED**, \
140 channel: {:?}, \
141 protocols: {}, \
142 listen_interval: {}, \
143 beacon_timeout: {}, \
144 failure_retry_cnt: {}, \
145 scan_method: {} \
146 }}",
147 self.ssid.as_str(),
148 self.bssid,
149 self.auth_method,
150 self.channel,
151 self.protocols,
152 self.listen_interval,
153 self.beacon_timeout,
154 self.failure_retry_cnt,
155 self.scan_method
156 )
157 }
158}