///|
const ETH_HDR : Int = 14 // Ethernet 头长
///|
/// 大端读取两字节(网络字节序)
fn u16(data : Bytes, off : Int) -> Int {
(data[off].to_int() << 8) | data[off + 1].to_int()
}
///|
/// 从包数据切 len 字节为新 Bytes(视图切片 → 拷贝)
fn read_bytes(data : Bytes, off : Int, len : Int) -> Bytes {
data[off:off + len].to_owned()
}
///|
/// 两字节 EtherType 匹配(plan 6.4:用 pattern match 不用 if-else 链)
priv enum EtherType {
Ipv4
Ipv6
Arp
Other
}
///|
fn classify_ether(hi : Byte, lo : Byte) -> EtherType {
match (hi, lo) {
(b'\x08', b'\x00') => Ipv4
(b'\x86', b'\xDD') => Ipv6
(b'\x08', b'\x06') => Arp
_ => Other
}
}
///|
/// IP 协议号匹配
fn classify_proto(n : Byte) -> Proto {
match n {
b'\x06' => Tcp
b'\x11' => Udp
b'\x01' => Icmp
b'\x3A' => Icmpv6
_ => Other
}
}
///|
/// 解析入口:Ethernet 帧 → 按 EtherType 分派;截断/未知协议返回 None
pub fn parse(
data : Bytes,
ts_sec : Int64,
ts_usec : Int,
local_ips : FixedArray[IpAddr],
) -> ParsedPacket? {
guard data.length() >= ETH_HDR else { return None }
match classify_ether(data[12], data[13]) {
Ipv4 => parse_ipv4(data, ts_sec, ts_usec, local_ips)
Ipv6 => parse_ipv6(data, ts_sec, ts_usec, local_ips)
Arp => None // ARP 仅识别不解析
Other => None
}
}