use crate::ast::*;
use crate::builders::WireContext;
use alloc::vec::Vec;
use core::net::IpAddr;
pub fn build_netflow_payload(
ctx: &WireContext,
spec: &NetflowSpec,
payload_bytes: &[u8],
) -> Vec<u8> {
let mut pkt = Vec::with_capacity(72);
pkt.extend_from_slice(&5u16.to_be_bytes()); pkt.extend_from_slice(&1u16.to_be_bytes()); pkt.extend_from_slice(&1000u32.to_be_bytes()); pkt.extend_from_slice(&1700000000u32.to_be_bytes()); pkt.extend_from_slice(&0u32.to_be_bytes()); pkt.extend_from_slice(&1u32.to_be_bytes()); pkt.push(0); pkt.push(0); pkt.extend_from_slice(&0u16.to_be_bytes());
let src_ip = spec.srcip.unwrap_or(ctx.src_ip);
let dst_ip = spec.dstip.unwrap_or(ctx.dst_ip);
let src_octets = match src_ip {
IpAddr::V4(v4) => v4.octets(),
IpAddr::V6(_) => [192, 168, 1, 100],
};
let dst_octets = match dst_ip {
IpAddr::V4(v4) => v4.octets(),
IpAddr::V6(_) => [8, 8, 8, 8],
};
pkt.extend_from_slice(&src_octets); pkt.extend_from_slice(&dst_octets); pkt.extend_from_slice(&[0, 0, 0, 0]); pkt.extend_from_slice(&1u16.to_be_bytes()); pkt.extend_from_slice(&2u16.to_be_bytes()); pkt.extend_from_slice(&spec.packets.unwrap_or(1).to_be_bytes()); pkt.extend_from_slice(&spec.octets.unwrap_or(64).to_be_bytes()); pkt.extend_from_slice(&900u32.to_be_bytes()); pkt.extend_from_slice(&1000u32.to_be_bytes()); pkt.extend_from_slice(&spec.srcport.unwrap_or(ctx.src_port).to_be_bytes()); pkt.extend_from_slice(&spec.dstport.unwrap_or(ctx.dst_port).to_be_bytes()); pkt.push(0); pkt.push(0x10); pkt.push(spec.proto.unwrap_or(6)); pkt.push(0); pkt.extend_from_slice(&0u16.to_be_bytes()); pkt.extend_from_slice(&0u16.to_be_bytes()); pkt.push(24); pkt.push(24); pkt.extend_from_slice(&0u16.to_be_bytes());
if !payload_bytes.is_empty() {
pkt.extend_from_slice(payload_bytes);
}
pkt
}