PF_RING API
API documentation for PF_RING: high-speed packet capture, filtering and analysis framework.
pfring_zc.h
Go to the documentation of this file.
1 /*
2  * PF_RING ZC API
3  *
4  * (C) 2013-2018 - ntop.org
5  *
6  */
7 
8 #ifndef _PF_RING_ZC_H_
9 #define _PF_RING_ZC_H_
10 
18 #include <sys/types.h>
19 #include <linux/pf_ring.h> /* needed for hw_filtering_rule */
20 
21 #define PF_RING_ZC_DEVICE_ASYMMETRIC_RSS (1 << 0)
22 #define PF_RING_ZC_DEVICE_FIXED_RSS_Q_0 (1 << 1)
23 #define PF_RING_ZC_DEVICE_SW_TIMESTAMP (1 << 2)
24 #define PF_RING_ZC_DEVICE_HW_TIMESTAMP (1 << 3)
25 #define PF_RING_ZC_DEVICE_STRIP_HW_TIMESTAMP (1 << 4)
26 #define PF_RING_ZC_DEVICE_IXIA_TIMESTAMP (1 << 5)
27 #define PF_RING_ZC_DEVICE_NOT_REPROGRAM_RSS (1 << 6)
28 #define PF_RING_ZC_DEVICE_CAPTURE_TX (1 << 7)
29 #define PF_RING_ZC_DEVICE_IPONLY_RSS (1 << 8)
30 #define PF_RING_ZC_DEVICE_NOT_PROMISC (1 << 9)
32 #define UNDEFINED_QUEUEID 0xFFFFFFFF
33 #define QUEUE_IS_DEVICE(i) (i > 0xFFFF)
34 #define QUEUEID_TO_IFINDEX(i) (i >> 16)
35 #define IFINDEX_TO_QUEUEID(i) (i << 16)
37 #define PF_RING_ZC_PKT_FLAGS_GOOD_IP_CS (1 << 0)
38 #define PF_RING_ZC_PKT_FLAGS_BAD_IP_CS (1 << 1)
39 #define PF_RING_ZC_PKT_FLAGS_GOOD_L4_CS (1 << 2)
40 #define PF_RING_ZC_PKT_FLAGS_BAD_L4_CS (1 << 3)
41 //#define PF_RING_ZC_PKT_FLAGS_TX_IP_CS (1 << 4)
42 //#define PF_RING_ZC_PKT_FLAGS_TX_L4_CS (1 << 5)
43 #define PF_RING_ZC_PKT_FLAGS_FLOW_OFFLOAD_UPDATE (1 << 6)
44 #define PF_RING_ZC_PKT_FLAGS_FLOW_OFFLOAD_PACKET (1 << 7)
45 #define PF_RING_ZC_PKT_FLAGS_FLOW_OFFLOAD_MARKER (1 << 8)
47 #ifdef __cplusplus
48 extern "C" {
49 #endif
50 
51 typedef void pfring_zc_cluster;
52 typedef void pfring_zc_queue;
53 typedef void pfring_zc_buffer_pool;
54 typedef void pfring_zc_worker;
55 typedef void pfring_zc_multi_queue;
56 
60 typedef enum {
64 
68 typedef struct {
69  u_int64_t recv;
70  u_int64_t sent;
71  u_int64_t drop;
73 
77 typedef struct {
78  u_int32_t tv_sec;
79  u_int32_t tv_nsec;
81 
85 typedef struct {
86  u_int16_t len;
87  u_int16_t flags;
88  u_int32_t hash;
90  u_char user[];
92 
96 typedef struct {
97  u_int32_t buffer_len;
98  u_int32_t metadata_len;
100 
107 u_char *
109  pfring_zc_pkt_buff *pkt_handle,
110  pfring_zc_queue *queue
111 );
112 
113 /* **************************************************************************************** */
114 
125 pfring_zc_cluster *
127  u_int32_t cluster_id,
128  u_int32_t buffer_len,
129  u_int32_t metadata_len,
130  u_int32_t tot_num_buffers,
131  int32_t numa_node_id,
132  const char *hugepages_mountpoint
133 );
134 
139 void
141  pfring_zc_cluster *cluster
142 );
143 
144 /* **************************************************************************************** */
145 
154 pfring_zc_queue *
156  pfring_zc_cluster *cluster,
157  const char *device_name,
158  pfring_zc_queue_mode queue_mode,
159  u_int32_t flags
160 );
161 
168 pfring_zc_queue *
170  pfring_zc_cluster *cluster,
171  u_int32_t queue_len
172 );
173 
174 /* **************************************************************************************** */
175 
183 int
185  pfring_zc_queue *queue,
186  pfring_zc_pkt_buff **pkt_handle,
187  u_int8_t wait_for_incoming_packet
188 );
189 
198 int
200  pfring_zc_queue *queue,
201  pfring_zc_pkt_buff **pkt_handles,
202  u_int32_t max_num_packets,
203  u_int8_t wait_for_incoming_packet
204 );
205 
211 int
213  pfring_zc_queue *queue
214 );
215 
220 void
222  pfring_zc_queue *queue
223 );
224 
225 /* **************************************************************************************** */
226 
234 int
236  pfring_zc_queue *queue,
237  pfring_zc_pkt_buff **pkt_handle,
238  u_int8_t flush_packet
239 );
240 
249 int
251  pfring_zc_queue *queue,
252  pfring_zc_pkt_buff **pkt_handles,
253  u_int32_t num_packets,
254  u_int8_t flush_packets
255 );
256 
262 int
264  pfring_zc_queue *queue
265 );
266 
267 /* **************************************************************************************** */
268 
274 void
276  pfring_zc_queue *queue,
277  pfring_zc_queue_mode direction
278 );
279 
280 /* **************************************************************************************** */
281 
288 int
290  pfring_zc_queue *queue,
291  char *filter
292 );
293 
299 int
301  pfring_zc_queue *queue
302 );
303 
304 /* **************************************************************************************** */
305 
312 int
314  pfring_zc_queue *queue,
315  hw_filtering_rule *rule
316 );
317 
324 int
326  pfring_zc_queue *queue,
327  u_int16_t rule_id
328 );
329 
330 /* **************************************************************************************** */
331 
337 void
339  pfring_zc_queue *queue,
340  u_int8_t *indir_table
341 );
342 
343 /* **************************************************************************************** */
344 
350 u_int32_t
352  pfring_zc_cluster *cluster
353 );
354 
355 
361 u_int32_t
363  pfring_zc_queue *queue
364 );
365 
371 void
373  pfring_zc_queue *queue,
375 );
376 
382 u_int32_t
384  pfring_zc_queue *queue
385 );
386 
393 int
395  pfring_zc_queue *queue,
396  pfring_zc_stat *stats
397 );
398 
399 /* **************************************************************************************** */
400 
408  pfring_zc_cluster *cluster
409 );
410 
416 void
418  pfring_zc_cluster *cluster,
419  pfring_zc_pkt_buff *pkt_handle
420 );
421 
422 /* **************************************************************************************** */
423 
433 pfring_zc_multi_queue *
435  pfring_zc_queue *queues[],
436  u_int32_t num_queues
437 );
438 
447 int
449  pfring_zc_multi_queue *multi_queue,
450  pfring_zc_pkt_buff **pkt_handle,
451  u_int64_t queues_mask,
452  u_int8_t flush_packet
453 );
454 
455 /* **************************************************************************************** */
456 
460 typedef enum {
464 
472 typedef int64_t
474  pfring_zc_pkt_buff *pkt_handle,
475  pfring_zc_queue *in_queue,
476  void *user
477 );
478 
482 typedef void
484 );
485 
486 
502 pfring_zc_worker *
504  pfring_zc_queue *in_queues[],
505  pfring_zc_queue *out_queues[],
506  u_int32_t num_in_queues,
507  u_int32_t num_out_queues,
508  pfring_zc_buffer_pool *working_set_pool,
509  pfring_zc_recv_policy recv_policy,
510  pfring_zc_idle_callback callback,
512  void *user_data,
513  u_int32_t active_wait,
514  int32_t core_id_affinity
515 );
516 
531 pfring_zc_worker *
533  pfring_zc_queue *in_queues[],
534  pfring_zc_multi_queue *out_multi_queue,
535  u_int32_t num_in_queues,
536  pfring_zc_buffer_pool *working_set_pool,
537  pfring_zc_recv_policy recv_policy,
538  pfring_zc_idle_callback callback,
540  void *user_data,
541  u_int32_t active_wait,
542  int32_t core_id_affinity
543 );
544 
559 pfring_zc_worker *
561  pfring_zc_queue *in_queues[],
562  pfring_zc_queue *out_queue,
563  u_int32_t num_in_queues,
564  pfring_zc_buffer_pool *working_set_pool,
565  pfring_zc_idle_callback callback,
567  void *user_data,
568  u_int32_t active_wait,
569  int32_t core_id_affinity_sorter,
570  int32_t core_id_affinity_timer
571 );
572 
577 void
579  pfring_zc_worker *worker
580 );
581 
582 /* **************************************************************************************** */
583 
590 pfring_zc_buffer_pool *
592  pfring_zc_cluster *cluster,
593  u_int32_t pool_len
594 );
595 
603  pfring_zc_buffer_pool *pool
604 );
605 
611 void
613  pfring_zc_buffer_pool *pool,
614  pfring_zc_pkt_buff *pkt_handle
615 );
616 
617 /* **************************************************************************************** */
618 
623 void
625  const char *hugepages_mountpoint
626 );
627 
634 pfring_zc_buffer_pool *
636  u_int32_t cluster_id,
637  u_int32_t pool_id
638 );
639 
644 void
646  pfring_zc_buffer_pool *pool
647 );
648 
656 pfring_zc_queue *
658  u_int32_t cluster_id,
659  u_int32_t queue_id,
660  pfring_zc_queue_mode queue_mode
661 );
662 
667 void
669  pfring_zc_queue *queue
670 );
671 
672 /* **************************************************************************************** */
673 
680 int
682  pfring_zc_cluster *cluster,
683  const char *vm_monitor_socket_path
684 );
685 
691 int
693  pfring_zc_cluster *cluster
694 );
695 
696 /* **************************************************************************************** */
697 
702 void
704  const char *uio_device
705 );
706 
707 /* **************************************************************************************** */
708 
715 u_int32_t
717  pfring_zc_pkt_buff *pkt_handle,
718  pfring_zc_queue *queue
719 );
720 
727 u_int32_t
729  pfring_zc_pkt_buff *pkt_handle,
730  pfring_zc_queue *queue
731 );
732 
739 u_int32_t
741  pfring_zc_pkt_buff *pkt_handle,
742  pfring_zc_queue *queue
743 );
744 
745 /* **************************************************************************************** */
746 
753 int
755  pfring_zc_cluster *cluster,
756  char *stats
757 );
758 
764 int
766  pfring_zc_cluster *cluster,
767  const char *name
768 );
769 
770 /* **************************************************************************************** */
771 
778 int
780  pfring_zc_queue *queue,
781  const char *stats
782 );
783 
790 int
792  pfring_zc_queue *queue,
793  const char *name
794 );
795 
796 /* **************************************************************************************** */
797 
802 char *
804 
805 /* **************************************************************************************** */
806 
811 int
813 
814 /* **************************************************************************************** */
815 
822 int
824  pfring_zc_queue *queue,
825  u_int32_t *expiration_epoch
826 );
827 
834 int
836  char *device_name,
837  u_int32_t *expiration_epoch
838 );
839 
840 /* **************************************************************************************** */
841 
847 int
848 pfring_zc_numa_get_cpu_node(int core_id);
849 
850 /* **************************************************************************************** */
851 
857 int
859 
860 /* **************************************************************************************** */
861 
865 void
867 
868 /* **************************************************************************************** */
869 
870 #ifdef __cplusplus
871 }
872 #endif
873 
874 #endif /* _PF_RING_ZC_H_ */
875 
u_int32_t pfring_zc_get_queue_speed(pfring_zc_queue *queue)
u_int32_t pfring_zc_get_queue_id(pfring_zc_queue *queue)
int pfring_zc_check_device_license(pfring_zc_queue *queue, u_int32_t *expiration_epoch)
u_int16_t flags
Definition: pfring_zc.h:87
void pfring_zc_kill_worker(pfring_zc_worker *worker)
Definition: pfring_zc.h:77
pfring_zc_multi_queue * pfring_zc_create_multi_queue(pfring_zc_queue *queues[], u_int32_t num_queues)
int pfring_zc_recv_pkt_burst(pfring_zc_queue *queue, pfring_zc_pkt_buff **pkt_handles, u_int32_t max_num_packets, u_int8_t wait_for_incoming_packet)
int pfring_zc_vm_register(pfring_zc_cluster *cluster, const char *vm_monitor_socket_path)
u_int32_t pfring_zc_builtin_gtp_hash(pfring_zc_pkt_buff *pkt_handle, pfring_zc_queue *queue)
int pfring_zc_send_pkt_burst(pfring_zc_queue *queue, pfring_zc_pkt_buff **pkt_handles, u_int32_t num_packets, u_int8_t flush_packets)
char * pfring_zc_version()
int pfring_zc_set_device_app_name(pfring_zc_queue *queue, const char *name)
pfring_zc_worker * pfring_zc_run_fanout(pfring_zc_queue *in_queues[], pfring_zc_multi_queue *out_multi_queue, u_int32_t num_in_queues, pfring_zc_buffer_pool *working_set_pool, pfring_zc_recv_policy recv_policy, pfring_zc_idle_callback callback, pfring_zc_distribution_func func, void *user_data, u_int32_t active_wait, int32_t core_id_affinity)
void pfring_zc_debug()
u_int16_t len
Definition: pfring_zc.h:86
Definition: pfring_zc.h:462
pfring_zc_worker * pfring_zc_run_balancer(pfring_zc_queue *in_queues[], pfring_zc_queue *out_queues[], u_int32_t num_in_queues, u_int32_t num_out_queues, pfring_zc_buffer_pool *working_set_pool, pfring_zc_recv_policy recv_policy, pfring_zc_idle_callback callback, pfring_zc_distribution_func func, void *user_data, u_int32_t active_wait, int32_t core_id_affinity)
int pfring_zc_recv_pkt(pfring_zc_queue *queue, pfring_zc_pkt_buff **pkt_handle, u_int8_t wait_for_incoming_packet)
u_int32_t pfring_zc_builtin_gre_hash(pfring_zc_pkt_buff *pkt_handle, pfring_zc_queue *queue)
int pfring_zc_remove_bpf_filter(pfring_zc_queue *queue)
int pfring_zc_stats(pfring_zc_queue *queue, pfring_zc_stat *stats)
void pfring_zc_ipc_init(const char *hugepages_mountpoint)
int pfring_zc_set_app_name(pfring_zc_cluster *cluster, const char *name)
PF_RING kernel module header file.
int pfring_zc_remove_hw_rule(pfring_zc_queue *queue, u_int16_t rule_id)
pfring_zc_queue * pfring_zc_ipc_attach_queue(u_int32_t cluster_id, u_int32_t queue_id, pfring_zc_queue_mode queue_mode)
void pfring_zc_ipc_detach_buffer_pool(pfring_zc_buffer_pool *pool)
int pfring_zc_queue_is_full(pfring_zc_queue *queue)
void pfring_zc_ipc_detach_queue(pfring_zc_queue *queue)
Definition: pfring_zc.h:62
int pfring_zc_send_pkt(pfring_zc_queue *queue, pfring_zc_pkt_buff **pkt_handle, u_int8_t flush_packet)
Definition: pfring_zc.h:96
void(* pfring_zc_idle_callback)()
Definition: pfring_zc.h:483
int pfring_zc_check_license()
int pfring_zc_numa_set_numa_affinity(int node_id)
int pfring_zc_numa_get_cpu_node(int core_id)
Definition: pfring_zc.h:68
Definition: pfring_zc.h:461
Definition: pfring_zc.h:61
pfring_zc_worker * pfring_zc_run_fifo(pfring_zc_queue *in_queues[], pfring_zc_queue *out_queue, u_int32_t num_in_queues, pfring_zc_buffer_pool *working_set_pool, pfring_zc_idle_callback callback, pfring_zc_distribution_func func, void *user_data, u_int32_t active_wait, int32_t core_id_affinity_sorter, int32_t core_id_affinity_timer)
int pfring_zc_add_hw_rule(pfring_zc_queue *queue, hw_filtering_rule *rule)
pfring_zc_queue * pfring_zc_open_device(pfring_zc_cluster *cluster, const char *device_name, pfring_zc_queue_mode queue_mode, u_int32_t flags)
u_int32_t hash
Definition: pfring_zc.h:88
u_int32_t pfring_zc_builtin_ip_hash(pfring_zc_pkt_buff *pkt_handle, pfring_zc_queue *queue)
u_int32_t buffer_len
Definition: pfring_zc.h:97
int pfring_zc_set_device_proc_stats(pfring_zc_queue *queue, const char *stats)
void pfring_zc_destroy_cluster(pfring_zc_cluster *cluster)
pfring_zc_recv_policy
Definition: pfring_zc.h:460
int64_t(* pfring_zc_distribution_func)(pfring_zc_pkt_buff *pkt_handle, pfring_zc_queue *in_queue, void *user)
Definition: pfring_zc.h:473
pfring_zc_cluster * pfring_zc_create_cluster(u_int32_t cluster_id, u_int32_t buffer_len, u_int32_t metadata_len, u_int32_t tot_num_buffers, int32_t numa_node_id, const char *hugepages_mountpoint)
void pfring_zc_vm_guest_init(const char *uio_device)
int pfring_zc_set_proc_stats(pfring_zc_cluster *cluster, char *stats)
pfring_zc_pkt_buff * pfring_zc_get_packet_handle_from_pool(pfring_zc_buffer_pool *pool)
void pfring_zc_set_rxfh_indir(pfring_zc_queue *queue, u_int8_t *indir_table)
pfring_zc_pkt_buff * pfring_zc_get_packet_handle(pfring_zc_cluster *cluster)
pfring_zc_timespec ts
Definition: pfring_zc.h:89
int pfring_zc_set_bpf_filter(pfring_zc_queue *queue, char *filter)
void pfring_zc_queue_breakloop(pfring_zc_queue *queue)
int pfring_zc_check_device_license_by_name(char *device_name, u_int32_t *expiration_epoch)
void pfring_zc_release_packet_handle_to_pool(pfring_zc_buffer_pool *pool, pfring_zc_pkt_buff *pkt_handle)
void pfring_zc_get_queue_settings(pfring_zc_queue *queue, pfring_zc_queue_info *info)
void pfring_zc_sync_queue(pfring_zc_queue *queue, pfring_zc_queue_mode direction)
u_int32_t metadata_len
Definition: pfring_zc.h:98
pfring_zc_queue * pfring_zc_create_queue(pfring_zc_cluster *cluster, u_int32_t queue_len)
u_int32_t pfring_zc_get_cluster_id(pfring_zc_cluster *cluster)
pfring_zc_buffer_pool * pfring_zc_ipc_attach_buffer_pool(u_int32_t cluster_id, u_int32_t pool_id)
int pfring_zc_queue_is_empty(pfring_zc_queue *queue)
void pfring_zc_release_packet_handle(pfring_zc_cluster *cluster, pfring_zc_pkt_buff *pkt_handle)
int pfring_zc_vm_backend_enable(pfring_zc_cluster *cluster)
int pfring_zc_send_pkt_multi(pfring_zc_multi_queue *multi_queue, pfring_zc_pkt_buff **pkt_handle, u_int64_t queues_mask, u_int8_t flush_packet)
u_char * pfring_zc_pkt_buff_data(pfring_zc_pkt_buff *pkt_handle, pfring_zc_queue *queue)
pfring_zc_queue_mode
Definition: pfring_zc.h:60
Definition: pfring_zc.h:85
pfring_zc_buffer_pool * pfring_zc_create_buffer_pool(pfring_zc_cluster *cluster, u_int32_t pool_len)