use alloc::string::String;
use core::net::Ipv4Addr;
use crate::ast::Protocol;
use crate::reverse::{ProtocolDissection, be_u16, be_u32, ipv4_at, push_if, sd};
pub(crate) fn dissect_rip(b: &[u8]) -> Option<ProtocolDissection> {
if b.len() < 24 || !matches!(b[0], 1 | 2) {
return None;
}
let mut t = String::from(if b[0] == 1 {
"rip request"
} else {
"rip reply"
});
push_if(&mut t, "prefix", ipv4_at(b, 8), Ipv4Addr::new(10, 0, 0, 0));
push_if(&mut t, "nexthop", ipv4_at(b, 16), Ipv4Addr::UNSPECIFIED);
push_if(&mut t, "tag", be_u16(b, 6), 0);
push_if(&mut t, "metric", be_u32(b, 20), 1);
Some(sd(Protocol::Rip, t, b[24..].to_vec()))
}