Introduce IoctlType enum for IOCTL types
This commit introduces an enum to represent the IOCTL command types available, the direction of the data transfer (Get and Set).
This commit is contained in:
parent
e7d30194e3
commit
483edf694b
33
src/lib.rs
33
src/lib.rs
@ -139,6 +139,12 @@ const CHANNEL_TYPE_CONTROL: u8 = 0;
|
|||||||
const CHANNEL_TYPE_EVENT: u8 = 1;
|
const CHANNEL_TYPE_EVENT: u8 = 1;
|
||||||
const CHANNEL_TYPE_DATA: u8 = 2;
|
const CHANNEL_TYPE_DATA: u8 = 2;
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub enum IoctlType {
|
||||||
|
Get = 0,
|
||||||
|
Set = 2,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, PartialEq, Eq)]
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
||||||
enum Core {
|
enum Core {
|
||||||
WLAN = 0,
|
WLAN = 0,
|
||||||
@ -212,7 +218,7 @@ enum IoctlState {
|
|||||||
Idle,
|
Idle,
|
||||||
|
|
||||||
Pending {
|
Pending {
|
||||||
kind: u32,
|
kind: IoctlType,
|
||||||
cmd: u32,
|
cmd: u32,
|
||||||
iface: u32,
|
iface: u32,
|
||||||
buf: *mut [u8],
|
buf: *mut [u8],
|
||||||
@ -276,7 +282,7 @@ impl<'a> Control<'a> {
|
|||||||
buf[0..8].copy_from_slice(b"clmload\x00");
|
buf[0..8].copy_from_slice(b"clmload\x00");
|
||||||
buf[8..20].copy_from_slice(&header.to_bytes());
|
buf[8..20].copy_from_slice(&header.to_bytes());
|
||||||
buf[20..][..chunk.len()].copy_from_slice(&chunk);
|
buf[20..][..chunk.len()].copy_from_slice(&chunk);
|
||||||
self.ioctl(2, IOCTL_CMD_SET_VAR, 0, &mut buf[..8 + 12 + chunk.len()])
|
self.ioctl(IoctlType::Set, IOCTL_CMD_SET_VAR, 0, &mut buf[..8 + 12 + chunk.len()])
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,7 +343,7 @@ impl<'a> Control<'a> {
|
|||||||
Timer::after(Duration::from_millis(100)).await;
|
Timer::after(Duration::from_millis(100)).await;
|
||||||
|
|
||||||
// set wifi up
|
// set wifi up
|
||||||
self.ioctl(2, IOCTL_CMD_UP, 0, &mut []).await;
|
self.ioctl(IoctlType::Set, IOCTL_CMD_UP, 0, &mut []).await;
|
||||||
|
|
||||||
Timer::after(Duration::from_millis(100)).await;
|
Timer::after(Duration::from_millis(100)).await;
|
||||||
|
|
||||||
@ -374,7 +380,8 @@ impl<'a> Control<'a> {
|
|||||||
ssid: [0; 32],
|
ssid: [0; 32],
|
||||||
};
|
};
|
||||||
i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes());
|
i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes());
|
||||||
self.ioctl(2, IOCTL_CMD_SET_SSID, 0, &mut i.to_bytes()).await; // set_ssid
|
self.ioctl(IoctlType::Set, IOCTL_CMD_SET_SSID, 0, &mut i.to_bytes())
|
||||||
|
.await; // set_ssid
|
||||||
|
|
||||||
info!("JOINED");
|
info!("JOINED");
|
||||||
}
|
}
|
||||||
@ -395,7 +402,8 @@ impl<'a> Control<'a> {
|
|||||||
passphrase: [0; 64],
|
passphrase: [0; 64],
|
||||||
};
|
};
|
||||||
pfi.passphrase[..passphrase.len()].copy_from_slice(passphrase.as_bytes());
|
pfi.passphrase[..passphrase.len()].copy_from_slice(passphrase.as_bytes());
|
||||||
self.ioctl(2, IOCTL_CMD_SET_PASSPHRASE, 0, &mut pfi.to_bytes()).await; // WLC_SET_WSEC_PMK
|
self.ioctl(IoctlType::Set, IOCTL_CMD_SET_PASSPHRASE, 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(20, 0, 1).await; // set_infra = 1
|
||||||
self.ioctl_set_u32(22, 0, 0).await; // set_auth = 0 (open)
|
self.ioctl_set_u32(22, 0, 0).await; // set_auth = 0 (open)
|
||||||
@ -406,7 +414,7 @@ impl<'a> Control<'a> {
|
|||||||
ssid: [0; 32],
|
ssid: [0; 32],
|
||||||
};
|
};
|
||||||
i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes());
|
i.ssid[..ssid.len()].copy_from_slice(ssid.as_bytes());
|
||||||
self.ioctl(2, 26, 0, &mut i.to_bytes()).await; // set_ssid
|
self.ioctl(IoctlType::Set, 26, 0, &mut i.to_bytes()).await; // set_ssid
|
||||||
|
|
||||||
info!("JOINED");
|
info!("JOINED");
|
||||||
}
|
}
|
||||||
@ -444,7 +452,8 @@ impl<'a> Control<'a> {
|
|||||||
buf[name.len() + 1..][..val.len()].copy_from_slice(val);
|
buf[name.len() + 1..][..val.len()].copy_from_slice(val);
|
||||||
|
|
||||||
let total_len = name.len() + 1 + val.len();
|
let total_len = name.len() + 1 + val.len();
|
||||||
self.ioctl(2, IOCTL_CMD_SET_VAR, 0, &mut buf[..total_len]).await;
|
self.ioctl(IoctlType::Set, IOCTL_CMD_SET_VAR, 0, &mut buf[..total_len])
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO this is not really working, it always returns all zeros.
|
// TODO this is not really working, it always returns all zeros.
|
||||||
@ -456,7 +465,9 @@ impl<'a> Control<'a> {
|
|||||||
buf[name.len()] = 0;
|
buf[name.len()] = 0;
|
||||||
|
|
||||||
let total_len = max(name.len() + 1, res.len());
|
let total_len = max(name.len() + 1, res.len());
|
||||||
let res_len = self.ioctl(0, IOCTL_CMD_GET_VAR, 0, &mut buf[..total_len]).await;
|
let res_len = self
|
||||||
|
.ioctl(IoctlType::Get, IOCTL_CMD_GET_VAR, 0, &mut buf[..total_len])
|
||||||
|
.await;
|
||||||
|
|
||||||
let out_len = min(res.len(), res_len);
|
let out_len = min(res.len(), res_len);
|
||||||
res[..out_len].copy_from_slice(&buf[..out_len]);
|
res[..out_len].copy_from_slice(&buf[..out_len]);
|
||||||
@ -465,10 +476,10 @@ impl<'a> Control<'a> {
|
|||||||
|
|
||||||
async fn ioctl_set_u32(&mut self, cmd: u32, iface: u32, val: u32) {
|
async fn ioctl_set_u32(&mut self, cmd: u32, iface: u32, val: u32) {
|
||||||
let mut buf = val.to_le_bytes();
|
let mut buf = val.to_le_bytes();
|
||||||
self.ioctl(2, cmd, 0, &mut buf).await;
|
self.ioctl(IoctlType::Set, cmd, 0, &mut buf).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn ioctl(&mut self, kind: u32, cmd: u32, iface: u32, buf: &mut [u8]) -> usize {
|
async fn ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, buf: &mut [u8]) -> usize {
|
||||||
// TODO cancel ioctl on future drop.
|
// TODO cancel ioctl on future drop.
|
||||||
|
|
||||||
while !matches!(self.state.ioctl_state.get(), IoctlState::Idle) {
|
while !matches!(self.state.ioctl_state.get(), IoctlState::Idle) {
|
||||||
@ -942,7 +953,7 @@ where
|
|||||||
self.sdpcm_seq != self.sdpcm_seq_max && self.sdpcm_seq_max.wrapping_sub(self.sdpcm_seq) & 0x80 == 0
|
self.sdpcm_seq != self.sdpcm_seq_max && self.sdpcm_seq_max.wrapping_sub(self.sdpcm_seq) & 0x80 == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn send_ioctl(&mut self, kind: u32, cmd: u32, iface: u32, data: &[u8]) {
|
async fn send_ioctl(&mut self, kind: IoctlType, cmd: u32, iface: u32, data: &[u8]) {
|
||||||
let mut buf = [0; 512];
|
let mut buf = [0; 512];
|
||||||
let buf8 = slice8_mut(&mut buf);
|
let buf8 = slice8_mut(&mut buf);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user