summary history branches tags files
examples/mon_ctap_get_info.rs
use menomonmon::{
    monitor,
    CliArgs,
    UsbmonFilter,
};
use nix::libc;


fn main() {
    // get optional device filter from command-line args
    let dev_filter = CliArgs::dev_filter();

    // Start outputting packets when a ctap init cmd is sent
    let start_filter = UsbmonFilter {
        epnum: Some(|x: u8| x == 0x04),              // EP 4 (FIDO)
        dir_out: Some(|x: bool| x),                  // out packet (command)
        data: Some(|x: &[u8]| {
            if x[0..5] == [
                0xff, 0xff, 0xff, 0xff, // CTAP broadcast ID
                0x86 // init cmd
            ] {
                return true;
            }
            false
        }),
        ..Default::default()
    };

    // Stop outputting packets when a bus error is reported, which
    // seems to always happen right after the last get_info packet.
    let end_filter = UsbmonFilter {
        epnum: Some(|x: u8| x == 0x04),              // EP 4 (FIDO)
        dir_out: Some(|x: bool| !x),                 // in packet (response)
        status: Some(|x: libc::c_int| x != 0),       // error code
        ..Default::default()
    };

    // output all packets for the selected device between the two
    // filter events.
    let usec = monitor(Some(&dev_filter), Some(&start_filter), None, Some(&end_filter));

    println!("CTAP get_info in: {usec} µs")
}