use anyhow::anyhow;
pub enum Direction {
Sent,
Received,
Unknown,
}
impl Direction {
pub fn to_hci_pseudo_header(&self) -> [u8; 4] {
match self {
Direction::Sent => 0_u32.to_be_bytes(),
Direction::Received => 1_u32.to_be_bytes(),
Direction::Unknown => 0xff_u32.to_be_bytes(),
}
}
pub fn parse_from_payload(payload: &[u8]) -> anyhow::Result<Direction> {
Ok(match payload[0] {
HCI_PACKET_TYPE_COMMAND => Direction::Sent,
HCI_PACKET_TYPE_SYNCHRONOUS_DATA | HCI_PACKET_TYPE_ASYNC_DATA => {
if payload[2] & 0x20 == 0 {
Direction::Sent
} else {
Direction::Received
}
}
HCI_PACKET_TYPE_EVENT => Direction::Received,
HCI_PACKET_TYPE_EXTENDED_COMMAND => {
Err(anyhow!("Extended Command (0x09) not supported"))?
}
_ => Err(anyhow!("Unknown payload header {}", payload[0]))?,
})
}
}
const HCI_PACKET_TYPE_COMMAND: u8 = 0x01;
const HCI_PACKET_TYPE_SYNCHRONOUS_DATA: u8 = 0x02;
const HCI_PACKET_TYPE_ASYNC_DATA: u8 = 0x03;
const HCI_PACKET_TYPE_EVENT: u8 = 0x04;
const HCI_PACKET_TYPE_EXTENDED_COMMAND: u8 = 0x09;