aboutsummaryrefslogtreecommitdiff
path: root/rust/daemon/src/wifi/medium.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/daemon/src/wifi/medium.rs')
-rw-r--r--rust/daemon/src/wifi/medium.rs75
1 files changed, 57 insertions, 18 deletions
diff --git a/rust/daemon/src/wifi/medium.rs b/rust/daemon/src/wifi/medium.rs
index 11454dfc..ddaa563d 100644
--- a/rust/daemon/src/wifi/medium.rs
+++ b/rust/daemon/src/wifi/medium.rs
@@ -14,15 +14,11 @@
use super::packets::mac80211_hwsim::{HwsimAttr, HwsimCmd, HwsimMsg, HwsimMsgHdr};
use super::packets::netlink::{NlAttrHdr, NlMsgHdr};
+use crate::devices::chip::ChipIdentifier;
use crate::wifi::frame::Frame;
+use crate::wifi::hwsim_attr_set::HwsimAttrSet;
use anyhow::{anyhow, Context};
-use log::{info, warn};
-
-const NLA_ALIGNTO: usize = 4;
-
-fn nla_align(len: usize) -> usize {
- len.wrapping_add(NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1)
-}
+use log::{debug, info, warn};
#[derive(Debug)]
pub enum HwsimCmdEnum {
@@ -37,16 +33,59 @@ pub enum HwsimCmdEnum {
DelMacAddr,
}
-pub fn parse_hwsim_cmd(packet: &[u8]) -> anyhow::Result<HwsimCmdEnum> {
- match HwsimMsg::parse(packet) {
- Ok(hwsim_msg) => match (hwsim_msg.hwsim_hdr.hwsim_cmd) {
- HwsimCmd::Frame => {
- let frame = Frame::new(&hwsim_msg.attributes)?;
- Ok(HwsimCmdEnum::Frame(Box::new(frame)))
+/// Process commands from the kernel's mac80211_hwsim subsystem.
+///
+/// This is the processing that will be implemented:
+///
+/// * The source MacAddress in 802.11 frames is re-mapped to a globally
+/// unique MacAddress because resumed Emulator AVDs appear with the
+/// same address.
+///
+/// * 802.11 multicast frames are re-broadcast to connected stations.
+///
+pub fn process(chip_id: ChipIdentifier, packet: &[u8]) -> anyhow::Result<()> {
+ let hwsim_msg = HwsimMsg::parse(packet)?;
+ match (hwsim_msg.hwsim_hdr.hwsim_cmd) {
+ HwsimCmd::Frame => {
+ let frame = Frame::parse(&hwsim_msg)?;
+ info!(
+ "Frame chip {}, addr {}, flags {}, cookie {:?}, ieee80211 {}",
+ chip_id, frame.transmitter, frame.flags, frame.cookie, frame.ieee80211
+ );
+ }
+ HwsimCmd::AddMacAddr => {
+ let attr_set = HwsimAttrSet::parse(&hwsim_msg.attributes)?;
+ if let (Some(addr), Some(hwaddr)) = (attr_set.transmitter, attr_set.receiver) {
+ info!("ADD_MAC_ADDR transmitter {:?} receiver {:?}", hwaddr, addr);
+ } else {
+ warn!("ADD_MAC_ADDR missing transmitter or receiver");
+ }
+ }
+ HwsimCmd::DelMacAddr => {
+ let attr_set = HwsimAttrSet::parse(&hwsim_msg.attributes)?;
+ if let (Some(addr), Some(hwaddr)) = (attr_set.transmitter, attr_set.receiver) {
+ info!("DEL_MAC_ADDR transmitter {:?} receiver {:?}", hwaddr, addr);
+ } else {
+ warn!("DEL_MAC_ADDR missing transmitter or receiver");
}
- _ => Err(anyhow!("Unknown HwsimkMsg cmd={:?}", hwsim_msg.hwsim_hdr.hwsim_cmd)),
- },
- Err(e) => Err(anyhow!("Unable to parse netlink message! {:?}", e)),
+ }
+ _ => {
+ info!("Another command found {:?}", hwsim_msg);
+ }
+ }
+ Ok(())
+}
+
+// TODO: move code below here into test module usable from CMake
+
+pub fn parse_hwsim_cmd(packet: &[u8]) -> anyhow::Result<HwsimCmdEnum> {
+ let hwsim_msg = HwsimMsg::parse(packet)?;
+ match (hwsim_msg.hwsim_hdr.hwsim_cmd) {
+ HwsimCmd::Frame => {
+ let frame = Frame::parse(&hwsim_msg)?;
+ Ok(HwsimCmdEnum::Frame(Box::new(frame)))
+ }
+ _ => Err(anyhow!("Unknown HwsimMsg cmd={:?}", hwsim_msg.hwsim_hdr.hwsim_cmd)),
}
}
@@ -72,7 +111,7 @@ pub fn test_parse_hwsim_cmd() {
16, 255, 255, 57, 216, 0, 0, 8, 0, 5, 0, 1, 0, 0, 0, 8, 0, 6, 0, 206, 255, 255, 255, 8, 0,
19, 0, 143, 9, 0, 0,
];
- assert!(parse_hwsim_cmd(&packet2).is_ok());
+ assert!(parse_hwsim_cmd(&packet2).is_err());
// missing cookie attribute
let packet3: Vec<u8> = vec![
@@ -93,7 +132,7 @@ pub fn test_parse_hwsim_cmd() {
0, 0, 2, 90, 3, 36, 1, 0, 0, 0, 0, 8, 0, 5, 0, 1, 0, 0, 0, 8, 0, 6, 0, 206, 255, 255, 255,
8, 0, 19, 0, 143, 9, 0, 0,
];
- assert!(parse_hwsim_cmd(&packet3).is_ok());
+ assert!(parse_hwsim_cmd(&packet3).is_err());
// HwsimkMsg cmd=TxInfoFrame packet
let packet3: Vec<u8> = vec![