aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs80
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 @@
7pub(crate) mod fmt; 7pub(crate) mod fmt;
8 8
9mod countries; 9mod countries;
10mod events;
10mod structs; 11mod structs;
11 12
12use core::cell::Cell; 13use 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();