rscamper 0.2.2

Rust interface to scamper network measurement tool
Documentation
// rscamper - Rust FFI bindings for scamper_tracelb.h
//
// Copyright (C) 2026 Dimitrios Giakatos
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 3.

use libc::{c_char, c_int, size_t, timeval};
use super::scamper_addr::ScamperAddrT;
use super::scamper_list::{ScamperListT, ScamperCycleT};
use super::scamper_icmpext::ScamperIcmpextsT;

#[repr(C)]
pub struct ScamperTracelbT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbNodeT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbLinkT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbProbeT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbReplyT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbProbesetT {
    _opaque: [u8; 0],
}

#[repr(C)]
pub struct ScamperTracelbProbesetSummaryT {
    _opaque: [u8; 0],
}

unsafe extern "C" {
    pub fn scamper_tracelb_tojson(
        tracelb: *const ScamperTracelbT,
        l: *mut size_t,
    ) -> *mut c_char;
    pub fn scamper_tracelb_totext(
        tracelb: *const ScamperTracelbT,
        l: *mut size_t,
    ) -> *mut c_char;
    pub fn scamper_tracelb_free(tracelb: *mut ScamperTracelbT);
    pub fn scamper_tracelb_type_tostr(
        trace: *const ScamperTracelbT,
        buf: *mut c_char,
        len: size_t,
    ) -> *mut c_char;
    pub fn scamper_tracelb_list_get(trace: *const ScamperTracelbT) -> *mut ScamperListT;
    pub fn scamper_tracelb_cycle_get(trace: *const ScamperTracelbT) -> *mut ScamperCycleT;
    pub fn scamper_tracelb_userid_get(trace: *const ScamperTracelbT) -> u32;
    pub fn scamper_tracelb_src_get(trace: *const ScamperTracelbT) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_dst_get(trace: *const ScamperTracelbT) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_rtr_get(trace: *const ScamperTracelbT) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_start_get(trace: *const ScamperTracelbT) -> *const timeval;
    pub fn scamper_tracelb_sport_get(trace: *const ScamperTracelbT) -> u16;
    pub fn scamper_tracelb_dport_get(trace: *const ScamperTracelbT) -> u16;
    pub fn scamper_tracelb_probe_size_get(trace: *const ScamperTracelbT) -> u16;
    pub fn scamper_tracelb_type_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_firsthop_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_wait_timeout_get(trace: *const ScamperTracelbT) -> *const timeval;
    pub fn scamper_tracelb_wait_probe_get(trace: *const ScamperTracelbT) -> *const timeval;
    pub fn scamper_tracelb_attempts_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_confidence_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_tos_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_gaplimit_get(trace: *const ScamperTracelbT) -> u8;
    pub fn scamper_tracelb_flags_get(trace: *const ScamperTracelbT) -> u32;
    pub fn scamper_tracelb_errmsg_get(trace: *const ScamperTracelbT) -> *const c_char;
    pub fn scamper_tracelb_probec_max_get(trace: *const ScamperTracelbT) -> u32;
    pub fn scamper_tracelb_nodec_get(trace: *const ScamperTracelbT) -> u16;
    pub fn scamper_tracelb_node_get(
        trace: *const ScamperTracelbT,
        i: u16,
    ) -> *mut ScamperTracelbNodeT;
    pub fn scamper_tracelb_linkc_get(trace: *const ScamperTracelbT) -> u16;
    pub fn scamper_tracelb_link_get(
        trace: *const ScamperTracelbT,
        i: u16,
    ) -> *mut ScamperTracelbLinkT;
    pub fn scamper_tracelb_probec_get(trace: *const ScamperTracelbT) -> u32;
    pub fn scamper_tracelb_error_get(trace: *const ScamperTracelbT) -> u32;
    pub fn scamper_tracelb_type_is_udp(trace: *const ScamperTracelbT) -> c_int;
    pub fn scamper_tracelb_type_is_tcp(trace: *const ScamperTracelbT) -> c_int;
    pub fn scamper_tracelb_type_is_icmp(trace: *const ScamperTracelbT) -> c_int;
    pub fn scamper_tracelb_type_is_vary_sport(trace: *const ScamperTracelbT) -> c_int;

    pub fn scamper_tracelb_node_use(node: *mut ScamperTracelbNodeT) -> *mut ScamperTracelbNodeT;
    pub fn scamper_tracelb_node_free(node: *mut ScamperTracelbNodeT);
    pub fn scamper_tracelb_node_addr_get(node: *const ScamperTracelbNodeT) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_node_name_get(node: *const ScamperTracelbNodeT) -> *const c_char;
    pub fn scamper_tracelb_node_flags_get(node: *const ScamperTracelbNodeT) -> u32;
    pub fn scamper_tracelb_node_q_ttl_get(node: *const ScamperTracelbNodeT) -> u8;
    pub fn scamper_tracelb_node_link_get(
        node: *const ScamperTracelbNodeT,
        i: u16,
    ) -> *mut ScamperTracelbLinkT;
    pub fn scamper_tracelb_node_linkc_get(node: *const ScamperTracelbNodeT) -> u16;
    pub fn scamper_tracelb_node_is_q_ttl(node: *const ScamperTracelbNodeT) -> c_int;

    pub fn scamper_tracelb_link_use(link: *mut ScamperTracelbLinkT) -> *mut ScamperTracelbLinkT;
    pub fn scamper_tracelb_link_free(link: *mut ScamperTracelbLinkT);
    pub fn scamper_tracelb_link_from_get(
        link: *const ScamperTracelbLinkT,
    ) -> *mut ScamperTracelbNodeT;
    pub fn scamper_tracelb_link_to_get(
        link: *const ScamperTracelbLinkT,
    ) -> *mut ScamperTracelbNodeT;
    pub fn scamper_tracelb_link_hopc_get(link: *const ScamperTracelbLinkT) -> u8;
    pub fn scamper_tracelb_link_probeset_get(
        link: *const ScamperTracelbLinkT,
        hop: u8,
    ) -> *mut ScamperTracelbProbesetT;

    pub fn scamper_tracelb_probeset_use(
        pset: *mut ScamperTracelbProbesetT,
    ) -> *mut ScamperTracelbProbesetT;
    pub fn scamper_tracelb_probeset_free(pset: *mut ScamperTracelbProbesetT);
    pub fn scamper_tracelb_probeset_probe_get(
        pset: *const ScamperTracelbProbesetT,
        i: u16,
    ) -> *mut ScamperTracelbProbeT;
    pub fn scamper_tracelb_probeset_probec_get(pset: *const ScamperTracelbProbesetT) -> u16;

    pub fn scamper_tracelb_probe_use(
        probe: *mut ScamperTracelbProbeT,
    ) -> *mut ScamperTracelbProbeT;
    pub fn scamper_tracelb_probe_free(probe: *mut ScamperTracelbProbeT);
    pub fn scamper_tracelb_probe_tx_get(probe: *const ScamperTracelbProbeT) -> *const timeval;
    pub fn scamper_tracelb_probe_flowid_get(probe: *const ScamperTracelbProbeT) -> u16;
    pub fn scamper_tracelb_probe_ttl_get(probe: *const ScamperTracelbProbeT) -> u8;
    pub fn scamper_tracelb_probe_attempt_get(probe: *const ScamperTracelbProbeT) -> u8;
    pub fn scamper_tracelb_probe_rx_get(
        probe: *const ScamperTracelbProbeT,
        i: u16,
    ) -> *mut ScamperTracelbReplyT;
    pub fn scamper_tracelb_probe_rxc_get(probe: *const ScamperTracelbProbeT) -> u16;

    pub fn scamper_tracelb_reply_use(
        reply: *mut ScamperTracelbReplyT,
    ) -> *mut ScamperTracelbReplyT;
    pub fn scamper_tracelb_reply_free(reply: *mut ScamperTracelbReplyT);
    pub fn scamper_tracelb_reply_from_get(
        reply: *const ScamperTracelbReplyT,
    ) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_reply_rx_get(reply: *const ScamperTracelbReplyT) -> *const timeval;
    pub fn scamper_tracelb_reply_ipid_get(reply: *const ScamperTracelbReplyT) -> u16;
    pub fn scamper_tracelb_reply_ttl_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_flags_get(reply: *const ScamperTracelbReplyT) -> u32;
    pub fn scamper_tracelb_reply_icmp_type_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_icmp_code_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_icmp_q_tos_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_icmp_q_ttl_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_tcp_flags_get(reply: *const ScamperTracelbReplyT) -> u8;
    pub fn scamper_tracelb_reply_is_icmp(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_is_icmp_q(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_is_icmp_ttl_exp(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_is_icmp_unreach(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_is_tcp(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_is_reply_ttl(reply: *const ScamperTracelbReplyT) -> c_int;
    pub fn scamper_tracelb_reply_icmp_exts_get(
        reply: *const ScamperTracelbReplyT,
    ) -> *mut ScamperIcmpextsT;

    pub fn scamper_tracelb_probeset_summary_alloc(
        set: *const ScamperTracelbProbesetT,
    ) -> *mut ScamperTracelbProbesetSummaryT;
    pub fn scamper_tracelb_probeset_summary_free(sum: *mut ScamperTracelbProbesetSummaryT);
    pub fn scamper_tracelb_probeset_summary_addrc_get(
        sum: *const ScamperTracelbProbesetSummaryT,
    ) -> u16;
    pub fn scamper_tracelb_probeset_summary_addr_get(
        sum: *const ScamperTracelbProbesetSummaryT,
        i: u16,
    ) -> *mut ScamperAddrT;
    pub fn scamper_tracelb_probeset_summary_nullc_get(
        sum: *const ScamperTracelbProbesetSummaryT,
    ) -> u16;
}