///|
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
  }
}