///|
extern "c" fn npcap_probe_implemented_ffi() -> Int = "lockwire_native_npcap_probe_implemented"

///|
extern "c" fn npcap_runtime_available_ffi() -> Int = "lockwire_native_npcap_runtime_available"

///|
extern "c" fn npcap_list_interfaces_text_ffi() -> Bytes = "lockwire_native_npcap_list_interfaces_text"

///|
extern "c" fn npcap_live_adapter_implemented_ffi() -> Int = "lockwire_native_npcap_live_adapter_implemented"

///|
#borrow(name)
extern "c" fn npcap_open_live_ffi(
  name : Bytes,
  snaplen : Int,
  promiscuous : Int,
  timeout_ms : Int,
) -> Int = "lockwire_native_npcap_open_live"

///|
#borrow(frame)
extern "c" fn npcap_send_packet_ffi(fd : Int, frame : Bytes) -> Int = "lockwire_native_npcap_send_packet"

///|
#borrow(expression)
extern "c" fn npcap_set_filter_ffi(
  fd : Int,
  expression : Bytes,
  optimize : Int,
  netmask : Int,
) -> Int = "lockwire_native_npcap_set_filter"

///|
extern "c" fn npcap_capture_one_ffi(fd : Int, timeout_ms : Int) -> Bytes = "lockwire_native_npcap_capture_one"

///|
extern "c" fn npcap_close_live_ffi(fd : Int) -> Int = "lockwire_native_npcap_close_live"

///|
fn ffi_npcap_probe_implemented() -> Int {
  npcap_probe_implemented_ffi()
}

///|
fn ffi_npcap_runtime_available() -> Int {
  npcap_runtime_available_ffi()
}

///|
fn ffi_npcap_list_interfaces_text() -> Bytes {
  npcap_list_interfaces_text_ffi()
}

///|
fn ffi_npcap_live_adapter_implemented() -> Int {
  npcap_live_adapter_implemented_ffi()
}

///|
fn ffi_npcap_open_live(
  name : Bytes,
  snaplen : Int,
  promiscuous : Int,
  timeout_ms : Int,
) -> Int {
  npcap_open_live_ffi(name, snaplen, promiscuous, timeout_ms)
}

///|
fn ffi_npcap_send_packet(fd : Int, frame : Bytes) -> Int {
  npcap_send_packet_ffi(fd, frame)
}

///|
fn ffi_npcap_set_filter(
  fd : Int,
  expression : Bytes,
  optimize : Int,
  netmask : Int,
) -> Int {
  npcap_set_filter_ffi(fd, expression, optimize, netmask)
}

///|
fn ffi_npcap_capture_one(fd : Int, timeout_ms : Int) -> Bytes {
  npcap_capture_one_ffi(fd, timeout_ms)
}

///|
fn ffi_npcap_close_live(fd : Int) -> Int {
  npcap_close_live_ffi(fd)
}

///|
#borrow(name)
extern "c" fn npcap_local_mac_ffi(name : Bytes) -> Bytes = "lockwire_native_npcap_local_mac"

///|
extern "c" fn npcap_last_capture_micros_ffi() -> Int64 = "lockwire_native_npcap_last_capture_micros"

///|
extern "c" fn npcap_set_nonblock_ffi(fd : Int, enable : Int) -> Int = "lockwire_native_npcap_set_nonblock"

///|
fn ffi_npcap_local_mac(name : Bytes) -> Bytes {
  npcap_local_mac_ffi(name)
}

///|
fn ffi_npcap_last_capture_micros() -> Int64 {
  npcap_last_capture_micros_ffi()
}

///|
fn ffi_npcap_set_nonblock(fd : Int, enable : Int) -> Int {
  npcap_set_nonblock_ffi(fd, enable)
}