X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipfix-export%2Fflow_report.h;h=65ddebcac3e296cb351e91a95447b3882c97ef6d;hb=d747dd950;hp=b45ce06a880b55d3a6e8589fcc24ab86b2b81ed1;hpb=a9855ef839ab99d7e66b9dd8d706b14cc8cd77dd;p=vpp.git diff --git a/src/vnet/ipfix-export/flow_report.h b/src/vnet/ipfix-export/flow_report.h index b45ce06a880..65ddebcac3e 100644 --- a/src/vnet/ipfix-export/flow_report.h +++ b/src/vnet/ipfix-export/flow_report.h @@ -17,13 +17,13 @@ #include #include -#include #include #include #include +#include #include #include -#include +#include #include #include #include @@ -31,6 +31,13 @@ #include +/* ipfix field definitions for a particular report */ +typedef struct +{ + u32 info_element; + u32 size; +} ipfix_report_element_t; + /* Used to build the rewrite */ typedef struct { @@ -41,16 +48,23 @@ typedef struct struct flow_report_main; struct flow_report; +struct ipfix_exporter; -typedef u8 *(vnet_flow_rewrite_callback_t) (struct flow_report_main *, +typedef vlib_frame_t *(vnet_flow_data_callback_t) ( + struct flow_report_main *frm, struct ipfix_exporter *exp, + struct flow_report *, vlib_frame_t *, u32 *, u32); + +typedef u8 *(vnet_flow_rewrite_callback_t) (struct ipfix_exporter *exp, struct flow_report *, - ip4_address_t *, - ip4_address_t *, u16); + ip4_address_t *, ip4_address_t *, + u16, ipfix_report_element_t *elts, + u32 n_elts, u32 *stream_index); -typedef vlib_frame_t *(vnet_flow_data_callback_t) (struct flow_report_main *, - struct flow_report *, - vlib_frame_t *, u32 *, - u32); +u8 *vnet_flow_rewrite_generic_callback (struct ipfix_exporter *exp, + struct flow_report *, ip4_address_t *, + ip4_address_t *, u16, + ipfix_report_element_t *elts, + u32 n_elts, u32 *stream_index); typedef union { @@ -82,14 +96,26 @@ typedef struct flow_report /* Opaque data */ opaque_t opaque; - /* build-the-rewrite callback */ + /* build-the-template-packet rewrite callback */ vnet_flow_rewrite_callback_t *rewrite_callback; + ipfix_report_element_t *report_elements; + u32 n_report_elements; + u32 *stream_indexp; /* Send-flow-data callback */ vnet_flow_data_callback_t *flow_data_callback; } flow_report_t; -typedef struct flow_report_main +/* + * The maximum number of ipfix exporters we can have at once + */ +#define IPFIX_EXPORTERS_MAX 5 + +/* + * We support multiple exporters. Each one has its own configured + * destination, and its own set of reports and streams. + */ +typedef struct ipfix_exporter { flow_report_t *reports; flow_report_stream_t *streams; @@ -108,6 +134,16 @@ typedef struct flow_report_main /* UDP checksum calculation enable flag */ u8 udp_checksum; +} ipfix_exporter_t; + +typedef struct flow_report_main +{ + /* + * A pool of the exporters. Entry 0 is always there for backwards + * compatability reasons. Entries 1 and above have to be created by + * the users. + */ + ipfix_exporter_t *exporters; /* time scale transform. Joy. */ u32 unix_time_0; @@ -116,37 +152,44 @@ typedef struct flow_report_main /* convenience variables */ vlib_main_t *vlib_main; vnet_main_t *vnet_main; + + u16 msg_id_base; } flow_report_main_t; extern flow_report_main_t flow_report_main; extern vlib_node_registration_t flow_report_process_node; -int vnet_flow_report_enable_disable (u32 sw_if_index, u32 table_index, - int enable_disable); typedef struct { vnet_flow_data_callback_t *flow_data_callback; vnet_flow_rewrite_callback_t *rewrite_callback; + ipfix_report_element_t *report_elements; + u32 n_report_elements; opaque_t opaque; int is_add; u32 domain_id; u16 src_port; + u32 *stream_indexp; } vnet_flow_report_add_del_args_t; -int vnet_flow_report_add_del (flow_report_main_t * frm, - vnet_flow_report_add_del_args_t * a, - u16 * template_id); +int vnet_flow_report_add_del (ipfix_exporter_t *exp, + vnet_flow_report_add_del_args_t *a, + u16 *template_id); clib_error_t *flow_report_add_del_error_to_clib_error (int error); -void vnet_flow_reports_reset (flow_report_main_t * frm); +void vnet_flow_reports_reset (ipfix_exporter_t *exp); + +void vnet_stream_reset (ipfix_exporter_t *exp, u32 stream_index); -void vnet_stream_reset (flow_report_main_t * frm, u32 stream_index); +int vnet_stream_change (ipfix_exporter_t *exp, u32 old_domain_id, + u16 old_src_port, u32 new_domain_id, u16 new_src_port); -int vnet_stream_change (flow_report_main_t * frm, - u32 old_domain_id, u16 old_src_port, - u32 new_domain_id, u16 new_src_port); +/* + * Search all the exporters for one that has a matching destination address. + */ +ipfix_exporter_t *vnet_ipfix_exporter_lookup (ip4_address_t *ipfix_collector); #endif /* __included_vnet_flow_report_h__ */