rscamper 0.2.2

Rust interface to scamper network measurement tool
Documentation
// rscamper - Rust FFI bindings for scamper_trace.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 ScamperTraceT {
    _opaque: [u8; 0],
}

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

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

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

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

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

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

pub const SCAMPER_TRACE_TYPE_ICMP_ECHO_PARIS: u8  = 4;
pub const SCAMPER_TRACE_FLAG_RXERR:           u32 = 0x0100;
pub const SCAMPER_TRACE_REPLY_FLAG_REPLY_TTL: u8  = 0x01;

pub const SCAMPER_TRACE_STOP_NONE:       u8 = 0;
pub const SCAMPER_TRACE_STOP_COMPLETED:  u8 = 1;
pub const SCAMPER_TRACE_STOP_UNREACH:    u8 = 2;
pub const SCAMPER_TRACE_STOP_ICMP:       u8 = 3;
pub const SCAMPER_TRACE_STOP_LOOP:       u8 = 4;
pub const SCAMPER_TRACE_STOP_GAPLIMIT:   u8 = 5;
pub const SCAMPER_TRACE_STOP_ERROR:      u8 = 6;
pub const SCAMPER_TRACE_STOP_HOPLIMIT:   u8 = 7;
pub const SCAMPER_TRACE_STOP_GSS:        u8 = 8;
pub const SCAMPER_TRACE_STOP_HALTED:     u8 = 9;
pub const SCAMPER_TRACE_STOP_INPROGRESS: u8 = 10;

unsafe extern "C" {
    pub fn scamper_trace_tojson(trace: *const ScamperTraceT, l: *mut size_t) -> *mut c_char;
    pub fn scamper_trace_totext(trace: *const ScamperTraceT, l: *mut size_t) -> *mut c_char;
    pub fn scamper_trace_free(trace: *mut ScamperTraceT);

    pub fn scamper_trace_list_get(trace: *const ScamperTraceT) -> *mut ScamperListT;
    pub fn scamper_trace_cycle_get(trace: *const ScamperTraceT) -> *mut ScamperCycleT;
    pub fn scamper_trace_src_get(trace: *const ScamperTraceT) -> *mut ScamperAddrT;
    pub fn scamper_trace_dst_get(trace: *const ScamperTraceT) -> *mut ScamperAddrT;
    pub fn scamper_trace_rtr_get(trace: *const ScamperTraceT) -> *mut ScamperAddrT;
    pub fn scamper_trace_userid_get(trace: *const ScamperTraceT) -> u32;
    pub fn scamper_trace_start_get(trace: *const ScamperTraceT) -> *const timeval;
    pub fn scamper_trace_stop_reason_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_stop_data_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_errmsg_get(trace: *const ScamperTraceT) -> *const c_char;
    pub fn scamper_trace_stop_tostr(
        trace: *const ScamperTraceT,
        buf: *mut c_char,
        len: size_t,
    ) -> *mut c_char;
    pub fn scamper_trace_hop_count_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_stop_hop_get(trace: *const ScamperTraceT) -> u8;

    pub fn scamper_trace_type_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_attempts_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_hoplimit_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_squeries_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_gaplimit_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_gapaction_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_firsthop_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_tos_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_wait_timeout_get(trace: *const ScamperTraceT) -> *const timeval;
    pub fn scamper_trace_wait_probe_get(trace: *const ScamperTraceT) -> *const timeval;
    pub fn scamper_trace_loops_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_loopaction_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_confidence_get(trace: *const ScamperTraceT) -> u8;
    pub fn scamper_trace_size_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_sport_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_dport_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_offset_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_flags_get(trace: *const ScamperTraceT) -> u32;
    pub fn scamper_trace_payload_len_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_payload_get(trace: *const ScamperTraceT) -> *const u8;
    pub fn scamper_trace_probec_get(trace: *const ScamperTraceT) -> u16;
    pub fn scamper_trace_type_is_udp(trace: *const ScamperTraceT) -> c_int;
    pub fn scamper_trace_type_is_tcp(trace: *const ScamperTraceT) -> c_int;
    pub fn scamper_trace_type_is_icmp(trace: *const ScamperTraceT) -> c_int;
    pub fn scamper_trace_flag_is_icmpcsumdp(trace: *const ScamperTraceT) -> c_int;

    pub fn scamper_trace_hopiter_alloc() -> *mut ScamperTraceHopiterT;
    pub fn scamper_trace_hopiter_free(hi: *mut ScamperTraceHopiterT);
    pub fn scamper_trace_hopiter_reset(hi: *mut ScamperTraceHopiterT);
    pub fn scamper_trace_hopiter_ttl_set(
        hi: *mut ScamperTraceHopiterT,
        ttl: u8,
        max: u8,
    ) -> c_int;
    pub fn scamper_trace_hopiter_probe_get(
        hi: *const ScamperTraceHopiterT,
    ) -> *mut ScamperTraceProbeT;
    pub fn scamper_trace_hopiter_next(
        trace: *const ScamperTraceT,
        hi: *mut ScamperTraceHopiterT,
    ) -> *mut ScamperTraceReplyT;

    pub fn scamper_trace_probe_use(probe: *mut ScamperTraceProbeT) -> *mut ScamperTraceProbeT;
    pub fn scamper_trace_probe_free(probe: *mut ScamperTraceProbeT);
    pub fn scamper_trace_probe_id_get(probe: *const ScamperTraceProbeT) -> u8;
    pub fn scamper_trace_probe_ttl_get(probe: *const ScamperTraceProbeT) -> u8;
    pub fn scamper_trace_probe_size_get(probe: *const ScamperTraceProbeT) -> u16;
    pub fn scamper_trace_probe_tx_get(probe: *const ScamperTraceProbeT) -> *const timeval;

    pub fn scamper_trace_reply_use(reply: *mut ScamperTraceReplyT) -> *mut ScamperTraceReplyT;
    pub fn scamper_trace_reply_free(reply: *mut ScamperTraceReplyT);
    pub fn scamper_trace_reply_addr_get(reply: *const ScamperTraceReplyT) -> *mut ScamperAddrT;
    pub fn scamper_trace_reply_name_get(reply: *const ScamperTraceReplyT) -> *const c_char;
    pub fn scamper_trace_reply_flags_get(reply: *const ScamperTraceReplyT) -> u32;
    pub fn scamper_trace_reply_rtt_get(reply: *const ScamperTraceReplyT) -> *const timeval;
    pub fn scamper_trace_reply_ttl_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_tos_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_size_get(reply: *const ScamperTraceReplyT) -> u16;
    pub fn scamper_trace_reply_ipid_get(reply: *const ScamperTraceReplyT) -> u16;
    pub fn scamper_trace_reply_icmp_type_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_icmp_code_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_is_tcp(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_is_icmp(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_is_icmp_q(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_is_icmp_unreach_port(
        reply: *const ScamperTraceReplyT,
    ) -> c_int;
    pub fn scamper_trace_reply_is_icmp_echo_reply(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_is_icmp_ttl_exp(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_is_icmp_ptb(reply: *const ScamperTraceReplyT) -> c_int;
    pub fn scamper_trace_reply_icmp_nhmtu_get(reply: *const ScamperTraceReplyT) -> u16;
    pub fn scamper_trace_reply_icmp_q_ttl_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_icmp_q_tos_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_icmp_q_ipl_get(reply: *const ScamperTraceReplyT) -> u16;
    pub fn scamper_trace_reply_tcp_flags_get(reply: *const ScamperTraceReplyT) -> u8;
    pub fn scamper_trace_reply_icmp_exts_get(
        reply: *const ScamperTraceReplyT,
    ) -> *mut ScamperIcmpextsT;

    pub fn scamper_trace_pmtud_get(trace: *const ScamperTraceT) -> *mut ScamperTracePmtudT;
    pub fn scamper_trace_pmtud_free(pmtud: *mut ScamperTracePmtudT);
    pub fn scamper_trace_pmtud_use(pmtud: *mut ScamperTracePmtudT) -> *mut ScamperTracePmtudT;
    pub fn scamper_trace_pmtud_ver_get(pmtud: *const ScamperTracePmtudT) -> u8;
    pub fn scamper_trace_pmtud_pmtu_get(pmtud: *const ScamperTracePmtudT) -> u16;
    pub fn scamper_trace_pmtud_ifmtu_get(pmtud: *const ScamperTracePmtudT) -> u16;
    pub fn scamper_trace_pmtud_outmtu_get(pmtud: *const ScamperTracePmtudT) -> u16;

    pub fn scamper_trace_pmtud_note_use(
        n: *mut ScamperTracePmtudNoteT,
    ) -> *mut ScamperTracePmtudNoteT;
    pub fn scamper_trace_pmtud_note_free(n: *mut ScamperTracePmtudNoteT);
    pub fn scamper_trace_pmtud_note_probe_get(
        n: *const ScamperTracePmtudNoteT,
    ) -> *mut ScamperTraceProbeT;
    pub fn scamper_trace_pmtud_note_reply_get(
        n: *const ScamperTracePmtudNoteT,
    ) -> *mut ScamperTraceReplyT;
    pub fn scamper_trace_pmtud_note_nhmtu_get(n: *const ScamperTracePmtudNoteT) -> u16;
    pub fn scamper_trace_pmtud_note_type_get(n: *const ScamperTracePmtudNoteT) -> u8;
    pub fn scamper_trace_pmtud_note_type_tostr(
        n: *const ScamperTracePmtudNoteT,
        buf: *mut c_char,
        len: size_t,
    ) -> *mut c_char;

    pub fn scamper_trace_pmtud_noteiter_alloc() -> *mut ScamperTracePmtudNoteiterT;
    pub fn scamper_trace_pmtud_noteiter_free(ni: *mut ScamperTracePmtudNoteiterT);
    pub fn scamper_trace_pmtud_noteiter_next(
        trace: *const ScamperTraceT,
        ni: *mut ScamperTracePmtudNoteiterT,
    ) -> *mut ScamperTracePmtudNoteT;
    pub fn scamper_trace_pmtud_noteiter_dist_get(
        trace: *const ScamperTraceT,
        ni: *mut ScamperTracePmtudNoteiterT,
    ) -> u8;
}