use alloc::string::String;
use crate::ast::Protocol;
use crate::reverse::{ProtocolDissection, be_u32, push_if, sd};
pub(crate) fn dissect_bfd(b: &[u8]) -> Option<ProtocolDissection> {
if b.len() < 24 || (b[0] >> 5) != 1 {
return None;
}
let mut t = String::from("bfd");
push_if(&mut t, "state", (b[1] >> 6) & 0x03, 3);
push_if(&mut t, "diag", b[0] & 0x1F, 0);
push_if(&mut t, "mult", b[2], 3);
push_if(&mut t, "my_disc", be_u32(b, 4), 1);
push_if(&mut t, "your_disc", be_u32(b, 8), 0);
push_if(&mut t, "min_tx", be_u32(b, 12), 1_000_000);
push_if(&mut t, "min_rx", be_u32(b, 16), 1_000_000);
Some(sd(Protocol::Bfd, t, b[24..].to_vec()))
}