Merge pull request #15 from danbev/ioctl-header-type
Introduce IoctlType enum for IOCTL types
This commit is contained in:
commit
9db9333d05
1 changed files with 22 additions and 11 deletions
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 a new issue