diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-07-11 05:19:31 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-07-11 05:19:31 +0200 |
| commit | 30b7800f9ae0a7f26e292dbe55cc67fbe2d1b131 (patch) | |
| tree | c12af936e5c919405deb09623fd9a02929c112df /src/lib.rs | |
| parent | 7ddcacac7bbfaed303dcda7d14ab29cad94fd570 (diff) | |
add event printing, add join but not working yet.
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 80 |
1 files changed, 76 insertions, 4 deletions
diff --git a/src/lib.rs b/src/lib.rs index 698c52f49..040caed86 100644 --- a/src/lib.rs +++ b/src/lib.rs | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | pub(crate) mod fmt; | 7 | pub(crate) mod fmt; |
| 8 | 8 | ||
| 9 | mod countries; | 9 | mod countries; |
| 10 | mod events; | ||
| 10 | mod structs; | 11 | mod structs; |
| 11 | 12 | ||
| 12 | use core::cell::Cell; | 13 | use core::cell::Cell; |
| @@ -253,9 +254,52 @@ impl<'a> Control<'a> { | |||
| 253 | }; | 254 | }; |
| 254 | self.set_iovar("country", &country_info.to_bytes()).await; | 255 | self.set_iovar("country", &country_info.to_bytes()).await; |
| 255 | 256 | ||
| 257 | // set country takes some time, next ioctls fail if we don't wait. | ||
| 258 | Timer::after(Duration::from_millis(100)).await; | ||
| 259 | |||
| 260 | // self.set_iovar_u32("ampdu_ba_wsize", 8).await; | ||
| 261 | // self.set_iovar_u32("ampdu_mpdu", 4).await; | ||
| 262 | // self.set_iovar_u32("ampdu_rx_factor", 0).await; // this crashes | ||
| 263 | |||
| 264 | Timer::after(Duration::from_millis(100)).await; | ||
| 265 | |||
| 266 | // evts | ||
| 267 | let mut evts = EventMask { | ||
| 268 | iface: 0, | ||
| 269 | events: [0xFF; 24], | ||
| 270 | }; | ||
| 271 | self.set_iovar("bsscfg:event_msgs", &evts.to_bytes()).await; | ||
| 272 | |||
| 273 | // set wifi up | ||
| 274 | self.ioctl(2, 2, 0, &[]).await; | ||
| 275 | |||
| 276 | Timer::after(Duration::from_millis(100)).await; | ||
| 277 | |||
| 256 | info!("INIT DONE"); | 278 | info!("INIT DONE"); |
| 257 | } | 279 | } |
| 258 | 280 | ||
| 281 | pub async fn join(&mut self, ssid: &str) { | ||
| 282 | self.ioctl_set_u32(134, 0, 0).await; // wsec = open | ||
| 283 | self.set_iovar_u32x2("bsscfg:sup_wpa", 0, 0).await; | ||
| 284 | self.ioctl_set_u32(20, 0, 1).await; // set_infra = 1 | ||
| 285 | self.ioctl_set_u32(22, 0, 0).await; // set_auth = open (0) | ||
| 286 | |||
| 287 | let mut i = SsidInfo { | ||
| 288 | len: ssid.len() as _, | ||
| 289 | ssid: [0; 32], | ||
| 290 | }; | ||
| 291 | i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes()); | ||
| 292 | self.ioctl(2, 26, 0, &i.to_bytes()).await; // set_ssid | ||
| 293 | |||
| 294 | info!("JOINED"); | ||
| 295 | } | ||
| 296 | |||
| 297 | async fn set_iovar_u32x2(&mut self, name: &str, val1: u32, val2: u32) { | ||
| 298 | let mut buf = [0; 8]; | ||
| 299 | buf[0..4].copy_from_slice(&val1.to_le_bytes()); | ||
| 300 | buf[4..8].copy_from_slice(&val2.to_le_bytes()); | ||
| 301 | self.set_iovar(name, &buf).await | ||
| 302 | } | ||
| 259 | async fn set_iovar_u32(&mut self, name: &str, val: u32) { | 303 | async fn set_iovar_u32(&mut self, name: &str, val: u32) { |
| 260 | self.set_iovar(name, &val.to_le_bytes()).await | 304 | self.set_iovar(name, &val.to_le_bytes()).await |
| 261 | } | 305 | } |
| @@ -272,6 +316,10 @@ impl<'a> Control<'a> { | |||
| 272 | self.ioctl(2, 263, 0, &buf[..total_len]).await; | 316 | self.ioctl(2, 263, 0, &buf[..total_len]).await; |
| 273 | } | 317 | } |
| 274 | 318 | ||
| 319 | async fn ioctl_set_u32(&mut self, cmd: u32, iface: u32, val: u32) { | ||
| 320 | self.ioctl(2, cmd, 0, &val.to_le_bytes()).await | ||
| 321 | } | ||
| 322 | |||
| 275 | async fn ioctl(&mut self, kind: u32, cmd: u32, iface: u32, buf: &[u8]) { | 323 | async fn ioctl(&mut self, kind: u32, cmd: u32, iface: u32, buf: &[u8]) { |
| 276 | // TODO cancel ioctl on future drop. | 324 | // TODO cancel ioctl on future drop. |
| 277 | 325 | ||
| @@ -488,7 +536,7 @@ impl<'a, PWR: Pin, CS: Pin, CLK: Pin, DIO: Pin> Runner<'a, PWR, CS, CLK, DIO> { | |||
| 488 | } | 536 | } |
| 489 | self.cs.set_high(); | 537 | self.cs.set_high(); |
| 490 | 538 | ||
| 491 | info!("rx {:02x}", &buf[..(len as usize).min(48)]); | 539 | //info!("rx {:02x}", &buf[..(len as usize).min(36)]); |
| 492 | 540 | ||
| 493 | self.rx(&buf[..len as usize]); | 541 | self.rx(&buf[..len as usize]); |
| 494 | } | 542 | } |
| @@ -528,14 +576,38 @@ impl<'a, PWR: Pin, CS: Pin, CLK: Pin, DIO: Pin> Runner<'a, PWR, CS, CLK, DIO> { | |||
| 528 | return; | 576 | return; |
| 529 | } | 577 | } |
| 530 | 578 | ||
| 531 | let cdc_header = | 579 | let cdc_header = CdcHeader::from_bytes(payload[..CdcHeader::SIZE].try_into().unwrap()); |
| 532 | CdcHeader::from_bytes(payload[..CdcHeader::SIZE].try_into().unwrap()); | ||
| 533 | 580 | ||
| 534 | if cdc_header.id == self.state.ioctl_id.get() { | 581 | if cdc_header.id == self.state.ioctl_id.get() { |
| 535 | assert_eq!(cdc_header.status, 0); // todo propagate error | 582 | assert_eq!(cdc_header.status, 0); // todo propagate error |
| 536 | self.state.ioctl_state.set(IoctlState::Done); | 583 | self.state.ioctl_state.set(IoctlState::Done); |
| 537 | } | 584 | } |
| 538 | } | 585 | } |
| 586 | 1 => { | ||
| 587 | let bcd_header = BcdHeader::from_bytes(&payload[..BcdHeader::SIZE].try_into().unwrap()); | ||
| 588 | //info!("{}", bcd_header); | ||
| 589 | |||
| 590 | let packet_start = BcdHeader::SIZE + 4 * bcd_header.data_offset as usize; | ||
| 591 | if packet_start > payload.len() { | ||
| 592 | warn!("packet start out of range."); | ||
| 593 | return; | ||
| 594 | } | ||
| 595 | let packet = &payload[packet_start..]; | ||
| 596 | //info!("rx {:02x}", &packet[..(packet.len() as usize).min(36)]); | ||
| 597 | |||
| 598 | let evt = EventHeader::from_bytes(&packet[24..][..EventHeader::SIZE].try_into().unwrap()); | ||
| 599 | let evt_num = evt.event_type.to_be() as u8; | ||
| 600 | let evt_data_len = evt.datalen.to_be() as u8; | ||
| 601 | let evt_data = &packet[24 + EventHeader::SIZE..][..evt_data_len as usize]; | ||
| 602 | info!( | ||
| 603 | "=== EVENT {} ({}) {} {:02x}", | ||
| 604 | events::Event::from(evt_num), | ||
| 605 | evt_num, | ||
| 606 | evt, | ||
| 607 | evt_data | ||
| 608 | ); | ||
| 609 | } | ||
| 610 | |||
| 539 | _ => {} | 611 | _ => {} |
| 540 | } | 612 | } |
| 541 | } | 613 | } |
| @@ -575,7 +647,7 @@ impl<'a, PWR: Pin, CS: Pin, CLK: Pin, DIO: Pin> Runner<'a, PWR, CS, CLK, DIO> { | |||
| 575 | 647 | ||
| 576 | let total_len = (total_len + 3) & !3; // round up to 4byte | 648 | let total_len = (total_len + 3) & !3; // round up to 4byte |
| 577 | 649 | ||
| 578 | info!("tx {:02x}", &buf[..total_len.min(48)]); | 650 | //info!("tx {:02x}", &buf[..total_len.min(48)]); |
| 579 | 651 | ||
| 580 | let cmd = cmd_word(true, true, FUNC_WLAN, 0, total_len as _); | 652 | let cmd = cmd_word(true, true, FUNC_WLAN, 0, total_len as _); |
| 581 | self.cs.set_low(); | 653 | self.cs.set_low(); |
