use crate::ast::*;
use alloc::vec::Vec;
pub fn build_vxlan_payload(spec: &VxlanSpec, payload: &[u8]) -> (Vec<u8>, u16) {
let vni = spec.vni.unwrap_or(4096) & 0x00FF_FFFF;
let mut vxlan = Vec::with_capacity(8 + payload.len());
vxlan.push(0x08); vxlan.extend_from_slice(&[0, 0, 0]); vxlan.push((vni >> 16) as u8);
vxlan.push((vni >> 8) as u8);
vxlan.push(vni as u8);
vxlan.push(0);
if payload.is_empty() {
let mut inner_ip = [
0x45, 0x00, 0x00, 28, 0x00, 0x01, 0x00, 0x00, 64, 17, 0x00, 0x00, 10, 0, 0, 1, 10, 0,
0, 2,
];
let ip_cksum = crate::packet::internet_checksum(&[&inner_ip]);
inner_ip[10..12].copy_from_slice(&ip_cksum.to_be_bytes());
vxlan.extend_from_slice(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x02]);
vxlan.extend_from_slice(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
vxlan.extend_from_slice(&0x0800_u16.to_be_bytes());
vxlan.extend_from_slice(&inner_ip);
vxlan.extend_from_slice(&[0x30, 0x39, 0x00, 0x50, 0x00, 0x08, 0x00, 0x00]);
} else {
vxlan.extend_from_slice(payload);
}
(vxlan, 4789)
}