ipfix-export: support creating multiple exporters
[vpp.git] / src / vnet / ipfix-export / flow_report.h
index f400158..65ddebc 100644 (file)
@@ -20,6 +20,7 @@
 #include <vnet/ethernet/ethernet.h>
 #include <vnet/ethernet/packet.h>
 #include <vnet/ip/ip_packet.h>
+#include <vnet/ip/ip_types.h>
 #include <vnet/ip/ip4_packet.h>
 #include <vnet/ip/ip6_packet.h>
 #include <vnet/udp/udp_packet.h>
@@ -47,25 +48,23 @@ typedef struct
 
 struct flow_report_main;
 struct flow_report;
+struct ipfix_exporter;
 
-typedef vlib_frame_t *(vnet_flow_data_callback_t) (struct flow_report_main *,
-                                                  struct flow_report *,
-                                                  vlib_frame_t *, u32 *,
-                                                  u32);
+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 flow_report_main *,
+typedef u8 *(vnet_flow_rewrite_callback_t) (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);
-
-u8 *vnet_flow_rewrite_generic_callback (struct flow_report_main *,
-                                       struct flow_report *,
-                                       ip4_address_t *,
+                                           ip4_address_t *, ip4_address_t *,
+                                           u16, ipfix_report_element_t *elts,
+                                           u32 n_elts, u32 *stream_index);
+
+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);
+                                       ipfix_report_element_t *elts,
+                                       u32 n_elts, u32 *stream_index);
 
 typedef union
 {
@@ -107,7 +106,16 @@ typedef struct flow_report
   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;
@@ -126,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;
@@ -142,8 +160,6 @@ 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;
@@ -157,19 +173,23 @@ typedef struct
   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 (flow_report_main_t * frm, u32 stream_index);
+void vnet_stream_reset (ipfix_exporter_t *exp, u32 stream_index);
 
-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);
+int vnet_stream_change (ipfix_exporter_t *exp, 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__ */