use crate::ast::*;
use crate::builders::WireContext;
use crate::error::CompilerError;
use crate::packet::build_ethernet_and_l2;
use alloc::vec::Vec;
pub fn build_mpls_frame(
ctx: &WireContext,
spec: &MplsSpec,
payload: &[u8],
) -> Result<Vec<u8>, CompilerError> {
let mut l2 = ctx.l2.clone();
if l2.mpls.is_none() {
l2.mpls = Some(MplsSpec {
label: spec.label,
exp: spec.exp,
bos: spec.bos,
ttl: spec.ttl,
});
}
if !payload.is_empty() || ctx.src_ip.is_unspecified() || ctx.dst_ip.is_unspecified() {
Ok(build_ethernet_and_l2(
ctx.src_mac,
ctx.dst_mac,
&l2,
0x8847,
payload,
))
} else {
let udp = crate::packet::build_udp_datagram(ctx.src_ip, ctx.dst_ip, ctx.src_port, ctx.dst_port, b"")?;
let ip = crate::packet::build_ip_packet(ctx.src_ip, ctx.dst_ip, 17, ctx.l3, &udp)?;
Ok(build_ethernet_and_l2(ctx.src_mac, ctx.dst_mac, &l2, 0x8847, &ip))
}
}