29 #include <sys/types.h> 41 #include <sys/socket.h> 42 #include <linux/sockios.h> 46 #include <pcap/pcap.h> 50 #include <linux/if_packet.h> 51 #include <arpa/inet.h> 52 #include <sys/ioctl.h> 53 #include <sys/socket.h> 61 #include <linux/if_ether.h> 63 #ifdef HAVE_REDIRECTOR 67 #define MAX_CAPLEN 65535 68 #define PAGE_SIZE 4096 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) 90 #define likely(x) __builtin_expect((x),1) 94 #define unlikely(x) __builtin_expect((x),0) 101 #define prefetch(x) __asm volatile("prefetcht0 %0" :: "m" (*(const unsigned long *)x)); 109 #ifdef SAFE_RING_MODE 110 static char staticBucket[2048];
113 typedef void (*pfringProcesssPacket)(
const struct pfring_pkthdr *h,
const u_char *p,
const u_char *user_bytes);
122 u_int32_t max_packet_size;
123 u_int32_t rx_ring_slots;
124 u_int32_t tx_ring_slots;
138 hardware_and_software = 0,
146 FULL_PACKET_SLICING = 0,
150 } packet_slicing_level;
162 pfring_chunk_type type;
196 u_int8_t initialized;
198 u_int8_t long_header;
200 u_int8_t force_timestamp;
201 u_int8_t strip_hw_timestamp;
203 u_int8_t disable_parsing;
205 u_int8_t disable_timestamp;
206 u_int8_t ixia_timestamp_enabled;
207 u_int8_t vss_apcon_timestamp_enabled;
209 u_int8_t chunk_mode_enabled;
211 u_int8_t userspace_bpf;
212 u_int8_t force_userspace_bpf;
215 packet_direction direction;
221 struct pfring_bpf_program
223 userspace_bpf_filter;
227 u_int8_t force_timestamp;
228 u_int8_t is_silicom_hw_timestamp_card;
229 u_int8_t enable_hw_timestamp;
230 u_int8_t last_hw_timestamp_head_offset;
231 struct timespec last_hw_timestamp;
235 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_packet_slicing) (pfring *, packet_slicing_level, u_int32_t);
263 int (*get_selectable_fd) (pfring *);
264 int (*set_direction) (pfring *, packet_direction);
265 int (*set_socket_mode) (pfring *, socket_mode);
266 int (*set_cluster) (pfring *, u_int, cluster_type);
267 int (*remove_from_cluster) (pfring *);
268 int (*set_master_id) (pfring *, u_int32_t);
269 int (*set_master) (pfring *, pfring *);
270 u_int32_t (*get_ring_id) (pfring *);
271 u_int32_t (*get_num_queued_pkts) (pfring *);
272 int (*get_hash_filtering_rule_stats)(pfring *, hash_filtering_rule *,
char *, u_int *);
273 int (*handle_hash_filtering_rule) (pfring *, hash_filtering_rule *, u_char);
274 int (*purge_idle_hash_rules) (pfring *, u_int16_t);
275 int (*add_filtering_rule) (pfring *, filtering_rule *);
276 int (*remove_filtering_rule) (pfring *, u_int16_t);
277 int (*purge_idle_rules) (pfring *, u_int16_t);
278 int (*get_filtering_rule_stats) (pfring *, u_int16_t,
char *, u_int *);
279 int (*toggle_filtering_policy) (pfring *, u_int8_t);
280 int (*enable_rss_rehash) (pfring *);
281 int (*poll) (pfring *, u_int);
282 int (*is_pkt_available) (pfring *);
283 int (*next_pkt_time) (pfring *,
struct timespec *);
284 int (*next_pkt_raw_timestamp) (pfring *, u_int64_t *ts);
285 int (*version) (pfring *, u_int32_t *);
286 int (*get_bound_device_address) (pfring *, u_char [6]);
287 int (*get_bound_device_ifindex) (pfring *,
int *);
288 int (*get_device_ifindex) (pfring *,
char *,
int *);
289 u_int16_t (*get_slot_header_len) (pfring *);
290 int (*set_virtual_device) (pfring *, virtual_filtering_device_info *);
291 int (*add_hw_rule) (pfring *, hw_filtering_rule *);
292 int (*remove_hw_rule) (pfring *, u_int16_t);
293 int (*loopback_test) (pfring *,
char *, u_int, u_int);
294 int (*enable_ring) (pfring *);
295 int (*disable_ring) (pfring *);
296 void (*shutdown) (pfring *);
297 int (*set_bpf_filter) (pfring *,
char *);
298 int (*remove_bpf_filter) (pfring *);
299 int (*get_device_clock) (pfring *,
struct timespec *);
300 int (*set_device_clock) (pfring *,
struct timespec *);
301 int (*adjust_device_clock) (pfring *,
struct timespec *, int8_t);
302 void (*sync_indexes_with_kernel) (pfring *);
303 int (*send_last_rx_packet) (pfring *, int);
304 void (*flush_tx_packets) (pfring *);
305 int (*register_zerocopy_tx_ring) (pfring *, pfring *);
307 int (*set_bound_dev_name) (pfring *,
char *);
308 int (*get_metadata) (pfring *, u_char **, u_int32_t *);
309 u_int32_t (*get_interface_speed) (pfring *);
317 filtering_mode ft_mode;
318 pfring_device_type ft_device_type;
326 u_int16_t slot_header_len;
329 u_int32_t sampling_rate;
330 u_int32_t sampling_counter;
332 packet_slicing_level slicing_level;
334 u_int32_t slicing_additional_bytes;
336 u_int8_t is_shutting_down;
337 u_int8_t socket_default_accept_policy;
342 FlowSlotInfo *slots_info;
344 u_int32_t poll_sleep;
345 u_int16_t poll_duration;
350 u_int8_t break_recv_loop;
351 u_long num_poll_calls;
353 pfring_rwlock_t rx_lock;
354 pfring_rwlock_t tx_lock;
360 struct sockaddr_ll sock_tx;
363 pfring *reflector_socket;
366 pfring *one_copy_rx_pfring;
371 #define PF_RING_ZC_SYMMETRIC_RSS (1 << 0) 372 #define PF_RING_REENTRANT (1 << 1) 373 #define PF_RING_LONG_HEADER (1 << 2) 374 #define PF_RING_PROMISC (1 << 3) 375 #define PF_RING_TIMESTAMP (1 << 4) 376 #define PF_RING_HW_TIMESTAMP (1 << 5) 377 #define PF_RING_RX_PACKET_BOUNCE (1 << 6) 378 #define PF_RING_ZC_FIXED_RSS_Q_0 (1 << 7) 379 #define PF_RING_STRIP_HW_TIMESTAMP (1 << 8) 380 #define PF_RING_DO_NOT_PARSE (1 << 9) 381 #define PF_RING_DO_NOT_TIMESTAMP (1 << 10) 382 #define PF_RING_CHUNK_MODE (1 << 11) 383 #define PF_RING_IXIA_TIMESTAMP (1 << 12) 384 #define PF_RING_USERSPACE_BPF (1 << 13) 385 #define PF_RING_ZC_NOT_REPROGRAM_RSS (1 << 14) 386 #define PF_RING_VSS_APCON_TIMESTAMP (1 << 15) 387 #define PF_RING_ZC_IPONLY_RSS (1 << 16) 388 #define PF_RING_FLOW_OFFLOAD (1 << 17) 389 #define PF_RING_FLOW_OFFLOAD_NOUPDATES (1 << 18) 390 #define PF_RING_FLOW_OFFLOAD_NORAWDATA (1 << 19) 391 #define PF_RING_L7_FILTERING (1 << 20) 396 #define PF_RING_DNA_SYMMETRIC_RSS PF_RING_ZC_SYMMETRIC_RSS 397 #define PF_RING_DNA_FIXED_RSS_Q_0 PF_RING_ZC_FIXED_RSS_Q_0 425 u_int32_t flags,
pfring *ring[MAX_NUM_RX_CHANNELS]);
448 const u_char *user_bytes, u_int8_t wait_for_packet);
485 struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet);
500 struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet,
501 u_int8_t level , u_int8_t add_timestamp, u_int8_t add_hash);
774 hash_filtering_rule* rule_to_add,
837 hash_filtering_rule* rule,
838 char *stats, u_int *stats_len);
851 char* stats, u_int *stats_len);
1091 u_int8_t add_timestamp , u_int8_t add_hash );
1161 int pfring_print_pkt(
char *buff, u_int buff_len,
const u_char *p, u_int len, u_int caplen);
1238 int pfring_parse_bpf_filter(
char *filter_buffer, u_int caplen,
1246 void pfring_free_bpf_filter(
1254 u_int32_t pfring_bpf_filter(
void *bpf_insn, u_char *buffer, u_int32_t caplen, u_int32_t len);
1259 int32_t gmt_to_local(time_t t);
1276 void pfring_thirdparty_lib_init(
const char* thirdparty_lib_name,
int pfring_set_packet_slicing(pfring *ring, packet_slicing_level level, u_int32_t additional_bytes)
int pfring_set_application_name(pfring *ring, char *name)
int pfring_print_parsed_pkt(char *buff, u_int buff_len, const u_char *p, const struct pfring_pkthdr *h)
int pfring_send_get_time(pfring *ring, char *pkt, u_int pkt_len, struct timespec *ts)
void pfring_freealldevs(pfring_if_t *list)
int pfring_set_poll_watermark(pfring *ring, u_int16_t watermark)
int pfring_is_pkt_available(pfring *ring)
int pfring_get_device_ifindex(pfring *ring, char *device_name, int *if_index)
void pfring_close(pfring *ring)
int pfring_set_bound_dev_name(pfring *ring, char *custom_dev_name)
Definition: pfring.h:1263
void pfring_sync_indexes_with_kernel(pfring *ring)
int pfring_set_direction(pfring *ring, packet_direction direction)
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_set_virtual_device(pfring *ring, virtual_filtering_device_info *info)
int pfring_purge_idle_rules(pfring *ring, u_int16_t inactivity_sec)
int pfring_remove_from_cluster(pfring *ring)
int pfring_set_application_stats(pfring *ring, char *stats)
Definition: pf_ring.h:338
void pfring_version_noring(u_int32_t *version)
int pfring_set_poll_watermark_timeout(pfring *ring, u_int16_t poll_watermark_timeout)
int pfring_flush_tx_packets(pfring *ring)
pfring_if_t * pfring_findalldevs(void)
int pfring_set_if_promisc(const char *device, int set_promisc)
int pfring_version(pfring *ring, u_int32_t *version)
int pfring_read_vss_apcon_hw_timestamp(u_char *buffer, u_int32_t buffer_len, struct timespec *ts)
void pfring_shutdown(pfring *ring)
int pfring_get_device_clock(pfring *ring, struct timespec *ts)
u_int32_t pfring_get_ring_id(pfring *ring)
u_int32_t pfring_get_interface_speed(pfring *ring)
int pfring_remove_filtering_rule(pfring *ring, u_int16_t rule_id)
int pfring_set_sampling_rate(pfring *ring, u_int32_t rate)
int pfring_read_ixia_hw_timestamp(u_char *buffer, u_int32_t buffer_len, struct timespec *ts)
PF_RING kernel module header file.
int pfring_toggle_filtering_policy(pfring *ring, u_int8_t rules_default_accept_policy)
int pfring_adjust_device_clock(pfring *ring, struct timespec *offset, int8_t sign)
int pfring_bind(pfring *ring, char *device_name)
int pfring_set_tx_watermark(pfring *ring, u_int16_t watermark)
int pfring_set_channel_id(pfring *ring, u_int32_t channel_id)
int pfring_purge_idle_hash_rules(pfring *ring, u_int16_t inactivity_sec)
int pfring_get_card_settings(pfring *ring, pfring_card_settings *settings)
int pfring_get_hash_filtering_rule_stats(pfring *ring, hash_filtering_rule *rule, char *stats, u_int *stats_len)
void pfring_breakloop(pfring *)
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)
void pfring_handle_ixia_hw_timestamp(u_char *buffer, struct pfring_pkthdr *hdr)
int pfring_enable_hw_timestamp(pfring *ring, char *device_name, u_int8_t enable_rx, u_int8_t enable_tx)
pfring * pfring_open(const char *device_name, u_int32_t caplen, u_int32_t flags)
int pfring_set_reflector_device(pfring *ring, char *device_name)
int pfring_set_vlan_id(pfring *ring, u_int16_t vlan_id)
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_rss_rehash(pfring *ring)
int pfring_loop(pfring *ring, pfringProcesssPacket looper, const u_char *user_bytes, u_int8_t wait_for_packet)
int pfring_stats(pfring *ring, pfring_stat *stats)
int pfring_get_bound_device_address(pfring *ring, u_char mac_address[6])
int pfring_set_channel_mask(pfring *ring, u_int64_t channel_mask)
int pfring_recv_chunk(pfring *ring, void **chunk, pfring_chunk_info *chunk_info, u_int8_t wait_for_incoming_chunk)
int pfring_set_master(pfring *ring, pfring *master)
int pfring_get_bound_device_ifindex(pfring *ring, int *if_index)
int pfring_set_filtering_mode(pfring *ring, filtering_mode mode)
int pfring_handle_hash_filtering_rule(pfring *ring, hash_filtering_rule *rule_to_add, u_char add_rule)
int pfring_send_last_rx_packet(pfring *ring, int tx_interface_id)
int pfring_set_cluster(pfring *ring, u_int clusterId, cluster_type the_type)
int pfring_get_selectable_fd(pfring *ring)
int pfring_get_metadata(pfring *ring, u_char **metadata, u_int32_t *metadata_len)
int pfring_set_bpf_filter(pfring *ring, char *filter_buffer)
int pfring_remove_hw_rule(pfring *ring, u_int16_t rule_id)
int pfring_get_filtering_rule_stats(pfring *ring, u_int16_t rule_id, char *stats, u_int *stats_len)
char * pfring_get_appl_stats_file_name(pfring *ring, char *path, u_int path_len)
int pfring_get_link_status(pfring *ring)
int pfring_remove_bpf_filter(pfring *ring)
int pfring_recv(pfring *ring, u_char **buffer, u_int buffer_len, struct pfring_pkthdr *hdr, u_int8_t wait_for_incoming_packet)
u_int32_t pfring_get_num_queued_pkts(pfring *ring)
u_int8_t pfring_get_num_rx_channels(pfring *ring)
char * pfring_format_numbers(double val, char *buf, u_int buf_len, u_int8_t add_decimals)
int pfring_loopback_test(pfring *ring, char *buffer, u_int buffer_len, u_int test_len)
void pfring_handle_vss_apcon_hw_timestamp(u_char *buffer, struct pfring_pkthdr *hdr)
int pfring_print_pkt(char *buff, u_int buff_len, const u_char *p, u_int len, u_int caplen)
int pfring_set_poll_duration(pfring *ring, u_int duration)
int pfring_poll(pfring *ring, u_int wait_duration)
int pfring_next_pkt_time(pfring *ring, struct timespec *ts)
int pfring_set_device_clock(pfring *ring, struct timespec *ts)
u_int16_t pfring_get_slot_header_len(pfring *ring)
int pfring_disable_ring(pfring *ring)
int pfring_next_pkt_raw_timestamp(pfring *ring, u_int64_t *timestamp_ns)
Definition: pfring.h:1269
int pfring_search_payload(pfring *ring, char *string_to_search)
void pfring_config(u_short cpu_percentage)
int pfring_add_hw_rule(pfring *ring, hw_filtering_rule *rule)
int pfring_set_master_id(pfring *ring, u_int32_t master_id)
int pfring_get_mtu_size(pfring *ring)
int pfring_set_socket_mode(pfring *ring, socket_mode mode)
int pfring_set_promisc(pfring *ring, int set_promisc)
int pfring_add_filtering_rule(pfring *ring, filtering_rule *rule_to_add)
int pfring_send(pfring *ring, char *pkt, u_int pkt_len, u_int8_t flush_packet)
int pfring_enable_ring(pfring *ring)