wpa2 join... still nothing.

This commit is contained in:
Dario Nieuwenhuis 2022-07-12 04:17:07 +02:00
parent 18b11e7417
commit e1fd7dfc40
3 changed files with 66 additions and 7 deletions

View file

@ -47,6 +47,6 @@ async fn main(spawner: Spawner, p: Peripherals) {
control.init().await;
let ssid = "MikroTik-951589";
control.join(ssid).await;
//control.join_open("MikroTik-951589").await;
control.join_wpa2("MikroTik-951589", "fasdfasdfasdf").await;
}

View file

@ -250,8 +250,8 @@ impl<'a> Control<'a> {
info!("Configuring misc stuff...");
self.set_iovar_u32("bus:txglom", 0).await;
//self.set_iovar_u32("apsta", 1).await;
self.set_iovar("cur_etheraddr", &[02, 03, 04, 05, 06, 07]).await;
self.set_iovar_u32("apsta", 1).await;
//self.set_iovar("cur_etheraddr", &[02, 03, 04, 05, 06, 07]).await;
let country = countries::WORLD_WIDE_XX;
let country_info = CountryInfo {
@ -267,9 +267,13 @@ impl<'a> Control<'a> {
self.ioctl_set_u32(64, 0, 0).await; // WLC_SET_ANTDIV
self.set_iovar_u32("bus:txglom", 0).await;
//self.set_iovar_u32("apsta", 1).await;
Timer::after(Duration::from_millis(100)).await;
//self.set_iovar_u32("apsta", 1).await; // this crashes, also we already did it before...??
Timer::after(Duration::from_millis(100)).await;
self.set_iovar_u32("ampdu_ba_wsize", 8).await;
Timer::after(Duration::from_millis(100)).await;
self.set_iovar_u32("ampdu_mpdu", 4).await;
Timer::after(Duration::from_millis(100)).await;
//self.set_iovar_u32("ampdu_rx_factor", 0).await; // this crashes
Timer::after(Duration::from_millis(100)).await;
@ -281,12 +285,20 @@ impl<'a> Control<'a> {
};
self.set_iovar("bsscfg:event_msgs", &evts.to_bytes()).await;
Timer::after(Duration::from_millis(100)).await;
// set wifi up
self.ioctl(2, 2, 0, &mut []).await;
Timer::after(Duration::from_millis(100)).await;
self.ioctl_set_u32(86, 0, 0).await; // no power save
// power save mode 2
self.set_iovar_u32("pm2_sleep_ret", 0xc8).await;
self.set_iovar_u32("bcn_li_bcn", 1).await;
self.set_iovar_u32("bcn_li_dtim", 1).await;
self.set_iovar_u32("assoc_listen", 10).await;
self.ioctl_set_u32(0x86, 0, 2).await;
self.ioctl_set_u32(110, 0, 1).await; // SET_GMODE = auto
self.ioctl_set_u32(142, 0, 0).await; // SET_BAND = any
@ -295,7 +307,9 @@ impl<'a> Control<'a> {
info!("INIT DONE");
}
pub async fn join(&mut self, ssid: &str) {
pub async fn join_open(&mut self, ssid: &str) {
self.set_iovar_u32("ampdu_ba_wsize", 8).await;
self.ioctl_set_u32(134, 0, 0).await; // wsec = open
self.set_iovar_u32x2("bsscfg:sup_wpa", 0, 0).await;
self.ioctl_set_u32(20, 0, 1).await; // set_infra = 1
@ -311,6 +325,38 @@ impl<'a> Control<'a> {
info!("JOINED");
}
pub async fn join_wpa2(&mut self, ssid: &str, passphrase: &str) {
self.set_iovar_u32("ampdu_ba_wsize", 8).await;
self.ioctl_set_u32(134, 0, 4).await; // wsec = wpa2
self.set_iovar_u32x2("bsscfg:sup_wpa", 0, 1).await;
self.set_iovar_u32x2("bsscfg:sup_wpa2_eapver", 0, 0xFFFF_FFFF).await;
self.set_iovar_u32x2("bsscfg:sup_wpa_tmo", 0, 2500).await;
Timer::after(Duration::from_millis(100)).await;
let mut pfi = PassphraseInfo {
len: passphrase.len() as _,
flags: 1,
passphrase: [0; 64],
};
pfi.passphrase[..passphrase.len()].copy_from_slice(passphrase.as_bytes());
self.ioctl(2, 268, 0, &mut pfi.to_bytes()).await; // WLC_SET_WSEC_PMK
self.ioctl_set_u32(20, 0, 1).await; // set_infra = 1
self.ioctl_set_u32(22, 0, 0).await; // set_auth = 0 (open)
self.ioctl_set_u32(165, 0, 0x80).await; // set_wpa_auth
let mut i = SsidInfo {
len: ssid.len() as _,
ssid: [0; 32],
};
i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes());
self.ioctl(2, 26, 0, &mut i.to_bytes()).await; // set_ssid
info!("JOINED");
}
async fn set_iovar_u32x2(&mut self, name: &str, val1: u32, val2: u32) {
let mut buf = [0; 8];
buf[0..4].copy_from_slice(&val1.to_le_bytes());
@ -362,6 +408,9 @@ impl<'a> Control<'a> {
async fn ioctl(&mut self, kind: u32, cmd: u32, iface: u32, buf: &mut [u8]) -> usize {
// TODO cancel ioctl on future drop.
// snail mode 🐌
Timer::after(Duration::from_millis(100)).await;
while !matches!(self.state.ioctl_state.get(), IoctlState::Idle) {
yield_now().await;
}

View file

@ -139,6 +139,16 @@ pub struct SsidInfo {
}
impl_bytes!(SsidInfo);
#[derive(Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[repr(C)]
pub struct PassphraseInfo {
pub len: u16,
pub flags: u16,
pub passphrase: [u8; 64],
}
impl_bytes!(PassphraseInfo);
#[derive(Clone, Copy)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[repr(C)]