1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use super::{PFRing, PFRingPacketHeader, PFRingInterface, PFRingStat, PacketDirection, PacketSlicingLevel, SocketMode, ClusterType, PFRingProcessPacket, PFRingChunkInfo, PFRingBpfProgram, ThirdpartyFunc};
use libc::{c_char, c_uint, c_int, c_ushort, timespec, c_uchar, c_double};
use dlopen::wrapper::WrapperApi;
use super::constants::MAX_NUM_RX_CHANNELS;

///Dynamic link library interface of pfring.so
#[derive(WrapperApi)]
pub struct PFRingDll{
    //startup/shutdown
    pfring_open: unsafe extern "C" fn (device_name: * const c_char, caplen: u32, flags: u32) -> * mut PFRing,
    pfring_open_multichannel: unsafe extern "C" fn (device_name: * const c_char, caplen: u32, flags: u32,  output: * mut [* mut PFRing; MAX_NUM_RX_CHANNELS]) -> u8,
    pfring_enable_ring: unsafe extern "C" fn (ring: * const PFRing) -> c_int,
    pfring_disable_ring: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,
    pfring_shutdown: unsafe extern "C" fn(ring: * mut PFRing),
    pfring_close: unsafe extern "C" fn (ring: * mut PFRing),
    pfring_bind: unsafe extern "C" fn (ring: * mut PFRing, device_name: * const c_char) -> c_int,

    //configuration
    pfring_config: unsafe extern "C" fn(cpu_percentage: c_ushort),
    pfring_set_application_name: unsafe extern "C" fn(ring: * mut PFRing, name: * const c_char) -> c_int,
    pfring_set_channel_id: unsafe extern "C" fn (ring: * mut PFRing,  channel_id: u32) -> c_int,
    pfring_set_channel_mask: unsafe extern "C" fn (ring: * mut PFRing, channel_mask: u64) -> c_int,
    pfring_set_vlan_id: unsafe extern "C" fn (ring: * mut PFRing, vlan_id: u16) -> c_int,
    pfring_set_sampling_rate: unsafe extern "C" fn (ring: * mut PFRing, rate: u32) -> c_int,
    pfring_set_filtering_sampling_rate: unsafe extern "C" fn (ring: * mut PFRing, rate : u32) -> c_int,
    pfring_set_direction: unsafe extern "C" fn (ring: * mut PFRing, direction: PacketDirection) -> c_int,
    pfring_set_promisc: unsafe extern "C" fn (ring: * mut PFRing, set_promisc: c_int)-> c_int,
    pfring_set_poll_watermark: unsafe extern "C" fn(ring: * mut PFRing, watermark: u16) -> c_int,
    pfring_set_poll_watermark_timeout: unsafe extern "C" fn (ring: * mut PFRing, poll_watermark_timeout: u16) -> c_int,
    pfring_set_poll_duration: unsafe extern "C" fn (ring: * mut PFRing, duration: c_uint) -> c_int,
    pfring_set_tx_watermark: unsafe extern "C" fn (ring: * mut PFRing, watermark: u16) -> c_int,
    pfring_get_appl_stats_file_name: unsafe extern "C" fn (ring: PFRing, path: * mut c_char, path_len: c_uint) -> c_int,
    pfring_set_packet_slicing: unsafe extern "C" fn(ring: * mut PFRing, packet_level: PacketSlicingLevel, additional_bytes: u32) -> c_int,
    pfring_set_socket_mode: unsafe extern "C" fn (ring: * mut PFRing, mode: SocketMode) -> c_int,
    pfring_set_cluster: unsafe extern "C" fn (ring: * mut PFRing, cluster_idd: c_uint, the_type: ClusterType) -> c_int,
    pfring_remove_from_cluster: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,
    pfring_set_master_id: unsafe extern "C" fn (ring: * mut PFRing, master_id: u32) -> c_int,
    pfring_set_master: unsafe extern "C" fn (ring: * mut PFRing, master: * mut PFRing) -> c_int,
    pfring_remove_hw_rule: unsafe extern "C" fn (ring: * mut PFRing, rule_id: u16) -> c_int,
    pfring_set_reflector_device: unsafe extern "C" fn (ring: * mut PFRing, device_name: * mut c_char) -> c_int,
    pfring_set_bound_dev_name: unsafe extern "C" fn (ring: * mut PFRing, custom_dev_name: * mut c_char) -> c_int,

    // rules
    pfring_remove_filtering_rule: unsafe extern "C" fn (ring: * mut PFRing, rule_id: u16) -> c_int,
    pfring_set_application_stats: unsafe extern "C" fn (ring: * mut PFRing, stats: * mut c_char) -> c_int,
    pfring_purge_idle_hash_rules: unsafe extern "C" fn(ring: * mut PFRing, inactivity_sec: u16)-> c_int,
    pfring_purge_idle_rules: unsafe extern "C" fn (ring: PFRing, inactivity_sec: u16) -> c_int,
    pfring_get_filtering_rule_stats: unsafe extern "C" fn(ring: * mut PFRing, rule_id: u16, stats: * mut char, stats_len: * mut c_uint) -> c_int,
    pfring_toggle_filtering_policy: unsafe extern "C" fn (ring: * mut PFRing, rules_default_accept_policy: u8)-> c_int,
    pfring_remove_bpf_filter: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,

    // the following functions require making pfring-sys compilable
    //int pfring_add_hw_rule(pfring *ring, hw_filtering_rule *rule);
    //int pfring_handle_hash_filtering_rule(pfring *ring, hash_filtering_rule* rule_to_add, u_char add_rule);
    //int pfring_add_filtering_rule(pfring *ring, filtering_rule* rule_to_add);
    //int pfring_get_hash_filtering_rule_stats(pfring *ring, hash_filtering_rule* rule, char *stats, u_int *stats_len);
    //int pfring_set_virtual_device(pfring *ring, virtual_filtering_device_info *info);
    //int pfring_set_filtering_mode(pfring *ring, filtering_mode mode);
    //int pfring_get_card_settings(pfring *ring, pfring_card_settings *settings);



    pfring_stats: unsafe extern "C" fn(ring: * mut PFRing, stats: * mut PFRingStat) -> c_int,
    pfring_get_metadata: unsafe extern "C" fn (ring: * mut PFRing, metadata: * mut * mut u8, metadata_len: * mut u32) -> c_int,

    pfring_get_num_rx_channels: unsafe extern "C" fn(ring: * mut PFRing) -> c_int,
    pfring_get_ring_id: unsafe extern "C" fn (ring: * mut PFRing) -> u32,
    pfring_get_num_queued_pkts: unsafe extern "C" fn (ring: * mut PFRing) -> u32,
    pfring_get_bound_device_address: unsafe extern "C" fn (ring: * mut PFRing, mac_address: * mut c_uchar) -> c_int,
    pfring_get_bound_device_ifindex: unsafe extern "C" fn (ring: * mut PFRing, if_index: * mut c_int) -> c_int,
    pfring_get_device_clock: unsafe extern "C" fn (ring: * mut PFRing, ts: * mut timespec) -> c_int,
    pfring_set_device_clock: unsafe extern "C" fn (ring: * mut PFRing, ts: * mut timespec) -> c_int,
    pfring_adjust_device_clock: unsafe extern "C" fn (ring: * mut PFRing, offset: * mut timespec, sign: i8) -> c_int,
    pfring_get_link_status: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,

    pfring_enable_rss_rehash: unsafe extern "C" fn(ring: * mut PFRing) -> c_int,
    pfring_poll: unsafe extern "C" fn (ring: * mut PFRing, wait_duration: c_uint) -> c_int,
    pfring_is_pkt_available: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,
    pfring_next_pkt_time: unsafe extern "C" fn (ring: * mut PFRing, ts: * mut timespec) -> c_int,
    pfring_get_slot_header_len: unsafe extern "C" fn (ring: * mut PFRing) -> u16,
    pfring_get_device_ifindex: unsafe extern "C" fn (ring: * mut PFRing, device_name: * const c_char, if_index: * mut c_int) -> c_int,
    pfring_get_selectable_fd: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,
    pfring_next_pkt_raw_timestamp: unsafe extern "C" fn (ring: * mut PFRing, timestamp_ns: * mut u64) -> c_int,

    pfring_loopback_test: unsafe extern "C" fn (ring: * mut PFRing, buffer: * mut c_char, buffer_len: c_uint, test_len: c_uint) -> c_int,

    //sending/receiving
    pfring_recv: unsafe extern "C" fn (ring: * const PFRing, buffer: * mut * mut u8, buffer_len: c_uint, hdr: * mut PFRingPacketHeader, wait_for_incoming_packet: u8) -> c_int,
    pfring_recv_parsed: unsafe extern "C" fn (ring: * const PFRing, buffer: * mut * mut u8, buffer_len: c_uint, hdr: * mut PFRingPacketHeader, wait_for_incoming_packet: u8, level: u8 /* 1..4 */, add_timestamp: u8, add_hash: u8) -> c_int,
    pfring_send: unsafe extern "C" fn (ring: * const PFRing, pkt: * const u8, pkt_len: c_uint, flush_packet: u8) -> c_int,
    pfring_send_get_time: unsafe extern "C" fn (ring: * const PFRing, pkt: * const u8, pkt_len: c_uint, ts: * mut timespec) -> c_int,
    pfring_flush_tx_packets: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,
    pfring_loop: unsafe extern "C" fn (ring: * mut PFRing, looper: PFRingProcessPacket, user_bytes: * const c_uchar, wait_for_packet: u8) -> c_int,
    pfring_breakloop: unsafe extern "C" fn (ring: * mut PFRing),
    pfring_send_last_rx_packet: unsafe extern "C" fn(ring: * mut PFRing, tx_interface_id: c_int) -> c_int,
    pfring_recv_chunk: unsafe extern "C" fn (ring: * mut PFRing, chunk: * mut * mut (), chunk_info: * mut PFRingChunkInfo, wait_for_incoming_chunk: u8) -> c_int,




    pfring_version_noring: unsafe extern "C" fn (version: * mut u32),
    pfring_version: unsafe extern "C" fn (ring: * mut PFRing, version: * mut u32) -> c_int,

    pfring_findalldevs: unsafe extern "C" fn() -> * const PFRingInterface,
    pfring_freealldevs: unsafe extern "C" fn(list: * const PFRingInterface),

    pfring_sync_indexes_with_kernel: unsafe extern "C" fn (ring: * mut PFRing),
    pfring_search_payload: unsafe extern "C" fn (ring: * mut PFRing, string_to_search: * mut c_char) -> c_int,

    pfring_parse_pkt: unsafe extern "C" fn (pkt: * mut c_uchar, hdr: * mut PFRingPacketHeader, level : u8, add_timestamp: u8, add_hash: u8) -> c_int,

    pfring_set_if_promisc: unsafe extern "C" fn (device: * const c_char, set_promisc: c_int) -> c_int,

    pfring_format_numbers: unsafe extern "C" fn (val: c_double, buf: * mut c_char, buf_len: c_uint, add_decimals: u8) -> * mut c_char,
    pfring_enable_hw_timestamp: unsafe extern "C" fn (ring: * mut PFRing, device_name: * mut c_char, enable_rx: u8, enable_tx: u8) -> c_int,
    pfring_get_mtu_size: unsafe extern "C" fn (ring: * mut PFRing) -> c_int,

    pfring_print_parsed_pkt: unsafe extern "C" fn (buff: * mut c_char, buff_len: c_uint, p: * const c_uchar, h: * const PFRingPacketHeader) -> c_int,
    pfring_print_pkt: unsafe extern "C" fn (buff: * mut c_char, buff_len: c_uint, p: * const c_uchar, len: c_uint, caplen: c_uint) -> c_int,

    pfring_read_ixia_hw_timestamp: unsafe extern "C" fn (buffer: * mut c_uchar, buffer_len: u32, ts: * mut timespec) -> c_int,
    pfring_handle_ixia_hw_timestamp: unsafe extern "C" fn (buffer: * mut c_uchar, hdr: * mut PFRingPacketHeader),
    pfring_read_vss_apcon_hw_timestamp: unsafe extern "C" fn (buffer: * mut c_uchar, buffer_len: u32, ts: * mut timespec) -> c_int,
    pfring_handle_vss_apcon_hw_timestamp: unsafe extern "C" fn (buffer: * mut c_uchar, hdr: * mut PFRingPacketHeader),
    pfring_get_interface_speed: unsafe extern "C" fn (ring: * mut PFRing) -> u32,
    pfring_parse_bpf_filter: unsafe extern "C" fn (filter_buffer: * mut c_char, caplen: c_uint, filter: * mut PFRingBpfProgram) -> c_int,
    pfring_free_bpf_filter: unsafe extern "C" fn(filter: * mut PFRingBpfProgram),
    pfring_bpf_filter: unsafe extern "C" fn (bpf_insn: * mut (), buffer: * mut c_uchar, caplen: u32, len: u32)-> u32,
    pfring_thirdparty_lib_init: unsafe extern "C" fn (thirdparty_lib_name: * const c_char, thirdparty_function_ptr: * mut ThirdpartyFunc)


}