41#include <sys/socket.h>
42#include <linux/sockios.h>
50#include <linux/if_packet.h>
53#include <sys/socket.h>
61#include <linux/if_ether.h>
67#define MAX_CAPLEN 65600
70#define DEFAULT_POLL_DURATION 500
72#define POLL_SLEEP_STEP 10
73#define POLL_SLEEP_MIN POLL_SLEEP_STEP
74#define POLL_SLEEP_MAX 1000
75#define POLL_QUEUE_MIN_LEN 500
77#define pfring_rwlock_t pthread_rwlock_t
78#define pfring_rwlock_init pthread_rwlock_init
79#define pfring_rwlock_rdlock pthread_rwlock_rdlock
80#define pfring_rwlock_wrlock pthread_rwlock_wrlock
81#define pfring_rwlock_unlock pthread_rwlock_unlock
82#define pfring_rwlock_destroy pthread_rwlock_destroy
84#define timespec_is_before(a, b) \
85 ((((a)->tv_sec<(b)->tv_sec)||(((a)->tv_sec==(b)->tv_sec)&&((a)->tv_nsec<(b)->tv_nsec)))?1:0)
94static char staticBucket[2048];
97typedef void (*pfringProcesssPacket)(
const struct pfring_pkthdr *h,
const u_char *p,
const u_char *user_bytes);
106 u_int32_t max_packet_size;
107 u_int32_t rx_ring_slots;
108 u_int32_t tx_ring_slots;
122 hardware_and_software = 0,
130 FULL_PACKET_SLICING = 0,
134} packet_slicing_level;
147 pfring_chunk_type type;
176 char *module_version;
188 time_t license_expiration;
195 u_int8_t initialized;
197 u_int8_t long_header;
198 u_int8_t force_timestamp;
200 u_int8_t strip_hw_timestamp;
201 u_int8_t disable_parsing;
202 u_int8_t disable_timestamp;
203 u_int8_t ixia_timestamp_enabled;
205 u_int8_t __padding_0;
206 u_int8_t chunk_mode_enabled;
207 u_int8_t userspace_bpf;
208 u_int8_t force_userspace_bpf;
211 u_int8_t is_shutting_down;
212 u_int8_t socket_default_accept_policy;
213 u_int8_t break_recv_loop_ext;
216 packet_direction direction;
224 userspace_bpf_filter;
228 u_int8_t force_timestamp;
229 u_int8_t is_silicom_hw_timestamp_card;
230 u_int8_t enable_hw_timestamp;
231 u_int8_t last_hw_timestamp_head_offset;
233 struct timespec last_hw_timestamp;
237 u_int8_t enabled_rx_packet_send;
246 int (*set_poll_watermark) (
pfring *, u_int16_t);
247 int (*set_poll_watermark_timeout) (
pfring *, u_int16_t);
248 int (*set_poll_duration) (
pfring *, u_int);
249 int (*set_tx_watermark) (
pfring *, u_int16_t);
250 int (*set_channel_id) (
pfring *, u_int32_t);
251 int (*set_channel_mask) (
pfring *, u_int64_t);
252 int (*set_application_name) (
pfring *,
char *);
253 int (*set_application_stats) (
pfring *,
char *);
254 char* (*get_appl_stats_file_name) (
pfring *ring,
char *path, u_int path_len);
255 int (*set_vlan_id) (
pfring *, u_int16_t);
256 int (*bind) (
pfring *,
char *);
257 int (*send) (
pfring *,
char *, u_int, u_int8_t);
258 int (*send_get_time) (
pfring *,
char *, u_int,
struct timespec *);
259 u_int8_t (*get_num_rx_channels) (
pfring *);
261 int (*set_sampling_rate) (
pfring *, u_int32_t);
262 int (*set_filtering_sampling_rate) (
pfring *, u_int32_t);
263 int (*set_packet_slicing) (
pfring *, packet_slicing_level, u_int32_t);
264 int (*get_selectable_fd) (
pfring *);
265 int (*set_direction) (
pfring *, packet_direction);
266 int (*set_socket_mode) (
pfring *, socket_mode);
267 int (*set_cluster_consumer) (
pfring *, u_int16_t, u_int16_t, cluster_type, u_int32_t);
268 int (*remove_from_cluster) (
pfring *);
269 int (*set_master_id) (
pfring *, u_int32_t);
271 u_int32_t (*get_ring_id) (
pfring *);
272 u_int32_t (*get_num_queued_pkts) (
pfring *);
273 int (*get_hash_filtering_rule_stats)(
pfring *, hash_filtering_rule *,
char *, u_int *);
274 int (*handle_hash_filtering_rule) (
pfring *, hash_filtering_rule *, u_char);
275 int (*purge_idle_hash_rules) (
pfring *, u_int16_t);
276 int (*add_filtering_rule) (
pfring *, filtering_rule *);
277 int (*remove_filtering_rule) (
pfring *, u_int16_t);
278 int (*purge_idle_rules) (
pfring *, u_int16_t);
279 int (*get_filtering_rule_stats) (
pfring *, u_int16_t,
char *, u_int *);
280 int (*toggle_filtering_policy) (
pfring *, u_int8_t);
281 int (*enable_rss_rehash) (
pfring *);
282 int (*poll) (
pfring *, u_int);
283 int (*is_pkt_available) (
pfring *);
284 int (*next_pkt_time) (
pfring *,
struct timespec *);
285 int (*next_pkt_raw_timestamp) (
pfring *, u_int64_t *ts);
286 int (*version) (
pfring *, u_int32_t *);
287 int (*get_bound_device_address) (
pfring *, u_char [6]);
288 int (*get_bound_device_ifindex) (
pfring *,
int *);
289 int (*get_device_ifindex) (
pfring *,
char *,
int *);
290 u_int16_t (*get_slot_header_len) (
pfring *);
291 int (*set_virtual_device) (
pfring *, virtual_filtering_device_info *);
292 int (*set_default_hw_action) (
pfring *, generic_default_action_type);
293 int (*add_hw_rule) (
pfring *, hw_filtering_rule *);
294 int (*remove_hw_rule) (
pfring *, u_int16_t);
295 int (*loopback_test) (
pfring *,
char *, u_int, u_int);
296 int (*enable_ring) (
pfring *);
297 int (*disable_ring) (
pfring *);
298 void (*shutdown) (
pfring *);
299 int (*set_bpf_filter) (
pfring *,
const char *);
300 int (*remove_bpf_filter) (
pfring *);
301 int (*get_device_clock) (
pfring *,
struct timespec *);
302 int (*set_device_clock) (
pfring *,
struct timespec *);
303 int (*adjust_device_clock) (
pfring *,
struct timespec *, int8_t);
304 void (*sync_indexes_with_kernel) (
pfring *);
305 int (*send_last_rx_packet) (
pfring *, int);
306 void (*flush_tx_packets) (
pfring *);
310 int (*recv_flow) (
pfring *, pfring_flow_update *, u_int8_t);
311 int (*get_metadata) (
pfring *, u_char **, u_int32_t *);
312 u_int32_t (*get_interface_speed) (
pfring *);
313 int (*get_link_type) (
pfring *);
321 filtering_mode filter_mode;
322 pfring_device_type ft_device_type;
332 u_int16_t slot_header_len;
334 u_int32_t sampling_rate;
336 u_int32_t sampling_counter;
337 u_int32_t sampling_rnd_shift;
339 packet_slicing_level slicing_level;
340 u_int32_t slicing_additional_bytes;
345 FlowSlotInfo *slots_info;
347 u_int32_t poll_sleep;
348 u_int16_t poll_duration;
353 u_int8_t break_recv_loop;
354 u_int16_t __padding_1;
355 u_int32_t num_poll_calls;
357 pfring_rwlock_t rx_lock;
358 pfring_rwlock_t tx_lock;
362 struct sockaddr_ll sock_tx;
368 pfring *one_copy_rx_pfring;
370 pthread_t runtime_manager_thread;
375#define PF_RING_ZC_SYMMETRIC_RSS (1 << 0)
376#define PF_RING_REENTRANT (1 << 1)
377#define PF_RING_LONG_HEADER (1 << 2)
378#define PF_RING_PROMISC (1 << 3)
379#define PF_RING_TIMESTAMP (1 << 4)
380#define PF_RING_HW_TIMESTAMP (1 << 5)
381#define PF_RING_RX_PACKET_BOUNCE (1 << 6)
382#define PF_RING_ZC_FIXED_RSS_Q_0 (1 << 7)
383#define PF_RING_STRIP_HW_TIMESTAMP (1 << 8)
384#define PF_RING_DO_NOT_PARSE (1 << 9)
385#define PF_RING_DO_NOT_TIMESTAMP (1 << 10)
386#define PF_RING_CHUNK_MODE (1 << 11)
387#define PF_RING_IXIA_TIMESTAMP (1 << 12)
388#define PF_RING_USERSPACE_BPF (1 << 13)
389#define PF_RING_ZC_NOT_REPROGRAM_RSS (1 << 14)
390#define PF_RING_VSS_APCON_TIMESTAMP (1 << 15)
391#define PF_RING_ZC_IPONLY_RSS (1 << 16)
392#define PF_RING_FLOW_OFFLOAD (1 << 17)
393#define PF_RING_FLOW_OFFLOAD_NOUPDATES (1 << 18)
394#define PF_RING_KEEP_CRC (1 << 19)
395#define PF_RING_L7_FILTERING (1 << 20)
396#define PF_RING_DO_NOT_STRIP_FCS (1 << 21)
397#define PF_RING_TX_BPF (1 << 22)
398#define PF_RING_FLOW_OFFLOAD_RESET (1 << 23)
399#define PF_RING_DISCARD_INJECTED_PKTS (1 << 24)
400#define PF_RING_ARISTA_TIMESTAMP (1 << 25)
401#define PF_RING_METAWATCH_TIMESTAMP (1 << 26)
402#define PF_RING_HW_TIMESTAMP_UNSYNC (1 << 27)
407#define PF_RING_DNA_SYMMETRIC_RSS PF_RING_ZC_SYMMETRIC_RSS
408#define PF_RING_DNA_FIXED_RSS_Q_0 PF_RING_ZC_FIXED_RSS_Q_0
413#define PF_RING_API_RECV_BURST
452 u_int32_t flags,
pfring *ring[MAX_NUM_RX_CHANNELS]);
475 const u_char *user_bytes, u_int8_t wait_for_packet);
512 struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet);
541 struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet,
542 u_int8_t level , u_int8_t add_timestamp, u_int8_t add_hash);
848 hash_filtering_rule* rule_to_add,
911 hash_filtering_rule* rule,
912 char *stats, u_int *stats_len);
925 char* stats, u_int *stats_len);
1177 u_int8_t add_timestamp , u_int8_t add_hash );
1374int pfring_parse_bpf_filter(
const char *filter_buffer, u_int caplen,
1382void pfring_free_bpf_filter(
1390u_int32_t pfring_bpf_filter(
void *bpf_insn, u_char *buffer, u_int32_t caplen, u_int32_t len);
1395int32_t gmt_to_local(time_t t);
1412void pfring_thirdparty_lib_init(
const char* thirdparty_lib_name,
PF_RING kernel module header file.
int pfring_add_hw_rule(pfring *ring, hw_filtering_rule *rule)
int pfring_get_mtu_size(pfring *ring)
int pfring_set_default_hw_action(pfring *ring, generic_default_action_type action)
int pfring_enable_rss_rehash(pfring *ring)
int pfring_handle_ixia_hw_timestamp(u_char *buffer, struct pfring_pkthdr *hdr)
int pfring_remove_hw_rule(pfring *ring, u_int16_t rule_id)
void pfring_freealldevs(pfring_if_t *list)
int pfring_remove_from_cluster(pfring *ring)
int pfring_loop(pfring *ring, pfringProcesssPacket looper, const u_char *user_bytes, u_int8_t wait_for_packet)
int pfring_recv_parsed(pfring *ring, u_char **buffer, u_int buffer_len, struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet, u_int8_t level, u_int8_t add_timestamp, u_int8_t add_hash)
int pfring_enable_ring(pfring *ring)
int pfring_set_master(pfring *ring, pfring *master)
int pfring_send(pfring *ring, char *pkt, u_int pkt_len, u_int8_t flush_packet)
int pfring_get_link_status(pfring *ring)
int pfring_get_hash_filtering_rule_stats(pfring *ring, hash_filtering_rule *rule, char *stats, u_int *stats_len)
void pfring_breakloop(pfring *ring)
int pfring_handle_hash_filtering_rule(pfring *ring, hash_filtering_rule *rule_to_add, u_char add_rule)
int pfring_set_poll_watermark_timeout(pfring *ring, u_int16_t poll_watermark_timeout)
int pfring_adjust_device_clock(pfring *ring, struct timespec *offset, int8_t sign)
int pfring_print_pkt(char *buff, u_int buff_len, const u_char *p, u_int len, u_int caplen)
int pfring_set_application_name(pfring *ring, char *name)
int pfring_set_bound_dev_name(pfring *ring, char *custom_dev_name)
int pfring_version(pfring *ring, u_int32_t *version)
int pfring_set_reflector_device(pfring *ring, char *device_name)
int pfring_get_link_type(pfring *ring)
int pfring_get_metadata(pfring *ring, u_char **metadata, u_int32_t *metadata_len)
int pfring_set_packet_slicing(pfring *ring, packet_slicing_level level, u_int32_t additional_bytes)
int pfring_set_poll_watermark(pfring *ring, u_int16_t watermark)
int pfring_next_pkt_raw_timestamp(pfring *ring, u_int64_t *timestamp_ns)
int pfring_set_device_clock(pfring *ring, struct timespec *ts)
int pfring_is_pkt_available(pfring *ring)
int pfring_search_payload(pfring *ring, char *string_to_search)
int pfring_set_filtering_mode(pfring *ring, filtering_mode mode)
int pfring_set_master_id(pfring *ring, u_int32_t master_id)
int pfring_toggle_filtering_policy(pfring *ring, u_int8_t rules_default_accept_policy)
int pfring_get_caplen(pfring *ring)
int pfring_get_bound_device_ifindex(pfring *ring, int *if_index)
int pfring_recv_chunk(pfring *ring, void **chunk, pfring_chunk_info *chunk_info, u_int8_t wait_for_incoming_chunk)
int pfring_poll(pfring *ring, u_int wait_duration)
int pfring_stats(pfring *ring, pfring_stat *stats)
int pfring_next_pkt_time(pfring *ring, struct timespec *ts)
int pfring_set_tx_watermark(pfring *ring, u_int16_t watermark)
void pfring_version_noring(u_int32_t *version)
int pfring_set_sampling_rate(pfring *ring, u_int32_t rate)
int pfring_set_if_promisc(const char *device, int set_promisc)
int pfring_get_card_settings(pfring *ring, pfring_card_settings *settings)
u_int8_t pfring_open_multichannel(const char *device_name, u_int32_t caplen, u_int32_t flags, pfring *ring[MAX_NUM_RX_CHANNELS])
int pfring_handle_metawatch_hw_timestamp(u_char *buffer, struct pfring_pkthdr *hdr)
int pfring_set_virtual_device(pfring *ring, virtual_filtering_device_info *info)
pfring * pfring_open(const char *device_name, u_int32_t caplen, u_int32_t flags)
char * pfring_get_appl_stats_file_name(pfring *ring, char *path, u_int path_len)
int pfring_remove_filtering_rule(pfring *ring, u_int16_t rule_id)
int pfring_recv(pfring *ring, u_char **buffer, u_int buffer_len, struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet)
int pfring_parse_pkt(u_char *pkt, struct pfring_pkthdr *hdr, u_int8_t level, u_int8_t add_timestamp, u_int8_t add_hash)
int pfring_read_metawatch_hw_timestamp(u_char *buffer, u_int32_t buffer_len, struct timespec *ts)
u_int32_t pfring_get_ring_id(pfring *ring)
int pfring_set_channel_id(pfring *ring, u_int32_t channel_id)
void pfring_shutdown(pfring *ring)
int pfring_loopback_test(pfring *ring, char *buffer, u_int buffer_len, u_int test_len)
int pfring_set_cluster(pfring *ring, u_int clusterId, cluster_type the_type)
int pfring_recv_burst(pfring *ring, pfring_packet_info *packets, u_int8_t num_packets, u_int8_t wait_for_packets)
int pfring_add_filtering_rule(pfring *ring, filtering_rule *rule_to_add)
void pfring_close(pfring *ring)
int pfring_purge_idle_hash_rules(pfring *ring, u_int16_t inactivity_sec)
int pfring_set_application_stats(pfring *ring, char *stats)
char * pfring_format_numbers(double val, char *buf, u_int buf_len, u_int8_t add_decimals)
int pfring_set_direction(pfring *ring, packet_direction direction)
pfring_if_t * pfring_findalldevs(void)
int pfring_recv_flow(pfring *ring, pfring_flow_update *flow, u_int8_t wait_for_flows)
int pfring_set_filtering_sampling_rate(pfring *ring, u_int32_t rate)
int pfring_get_selectable_fd(pfring *ring)
int pfring_get_device_clock(pfring *ring, struct timespec *ts)
int pfring_print_parsed_pkt(char *buff, u_int buff_len, const u_char *p, const struct pfring_pkthdr *h)
int pfring_remove_bpf_filter(pfring *ring)
u_int32_t pfring_get_ethtool_link_speed(const char *ifname)
int pfring_enable_hw_timestamp(pfring *ring, char *device_name, u_int8_t enable_rx, u_int8_t enable_tx)
int pfring_get_device_ifindex(pfring *ring, char *device_name, int *if_index)
int pfring_purge_idle_rules(pfring *ring, u_int16_t inactivity_sec)
int pfring_set_channel_mask(pfring *ring, u_int64_t channel_mask)
u_int32_t pfring_get_num_queued_pkts(pfring *ring)
void pfring_sync_indexes_with_kernel(pfring *ring)
int pfring_flush_tx_packets(pfring *ring)
int pfring_set_poll_duration(pfring *ring, u_int duration)
u_int16_t pfring_get_slot_header_len(pfring *ring)
int pfring_get_bound_device_address(pfring *ring, u_char mac_address[6])
u_int8_t pfring_get_num_rx_channels(pfring *ring)
int pfring_set_bpf_filter(pfring *ring, const char *filter_buffer)
int pfring_set_cluster_consumer(pfring *ring, u_int16_t cluster_id, u_int16_t queue_id, cluster_type the_type, u_int32_t options)
int pfring_get_filtering_rule_stats(pfring *ring, u_int16_t rule_id, char *stats, u_int *stats_len)
int pfring_bind(pfring *ring, char *device_name)
int pfring_send_get_time(pfring *ring, char *pkt, u_int pkt_len, struct timespec *ts)
int pfring_set_socket_mode(pfring *ring, socket_mode mode)
int pfring_read_ixia_hw_timestamp(u_char *buffer, u_int32_t buffer_len, struct timespec *ts)
void pfring_enable_hw_timestamp_debug()
u_int32_t pfring_get_interface_speed(pfring *ring)
int pfring_set_promisc(pfring *ring, int set_promisc)
void pfring_config(u_short cpu_percentage)
int pfring_read_arista_7150_hw_timestamp(u_char *buffer, u_int32_t buffer_len, u_int64_t *ns_ts)
int pfring_set_vlan_id(pfring *ring, u_int16_t vlan_id)
int pfring_disable_ring(pfring *ring)
int pfring_handle_arista_hw_timestamp(u_char *buffer, struct pfring_pkthdr *hdr)
int pfring_read_arista_7150_keyframe(u_char *buffer, u_int32_t buffer_len, u_int64_t *ns_ts, u_int32_t *ticks_ts)
int pfring_send_last_rx_packet(pfring *ring, int tx_interface_id)
int pfring_read_metawatch_device_info(u_char *buffer, u_int32_t buffer_len, u_int16_t *device_id, u_int8_t *port_id)
u_int32_t flags
Definition pfring.h:157
u_int16_t caplen
Definition pfring.h:155
u_int16_t len
Definition pfring.h:156
u_int32_t hash
Definition pfring.h:158