aboutsummaryrefslogtreecommitdiffstats
path: root/src/vnet/ipfix-export/flow_report.h
diff options
context:
space:
mode:
authorDave Barach <dave@barachs.net>2018-05-13 08:50:25 -0400
committerFlorin Coras <florin.coras@gmail.com>2018-05-13 17:55:24 +0000
commit2be45813c757137000878dc711dd169fc2d414af (patch)
treea695bbb512468c9abff710a1542a75bc3cb95e9d /src/vnet/ipfix-export/flow_report.h
parent078371e32c41c6c63d8e49964d2046a5dd90de48 (diff)
Improve ipfix template packet rewrite construction
Instead of repeatedly cutting, pasting, and hacking to create a new callback, use vnet_flow_rewrite_generic_callback(). Add three arguments to the flow rewrite callback: (in) pointer to an array of report elements, (in) length of array, (out) pointer to the stream index Change existing code prototypes. Code owners encouraged to evaluate whether they can use the generic callback or not, at leisure. /* ipfix field definitions for a particular report */ typedef struct { u32 info_element; u32 size; } ipfix_report_element_t; Best generated like so: _(sourceIPv4Address, 4) \ _(destinationIPv4Address, 4) \ _(sourceTransportPort, 2) \ _(destinationTransportPort, 2) \ _(protocolIdentifier, 1) \ _(flowStartMicroseconds, 8) \ _(flowEndMicroseconds, 8) static ipfix_report_element_t simple_report_elements[] = { foreach_simple_report_ipfix_element }; ... /* Set up the ipfix report */ memset (&a, 0, sizeof (a)); a.is_add = 1 /* to enable the report */ ; a.domain_id = 1 /* pick a domain ID */ ; a.src_port = UDP_DST_PORT_ipfix /* src port for reports */ ; a.rewrite_callback = vnet_flow_rewrite_generic_callback; a.report_elements = simple_report_elements; a.n_report_elements = ARRAY_LEN (simple_report_elements); a.stream_indexp = &jim->stream_index; a.flow_data_callback = simple_flow_data_callback; /* Create the report */ rv = vnet_flow_report_add_del (frm, &a, &template_id); if (rv) return rv; ... Change-Id: If6131e6821d3a37a29269c0d58040cdf18ff05e4 Signed-off-by: Dave Barach <dave@barachs.net>
Diffstat (limited to 'src/vnet/ipfix-export/flow_report.h')
-rw-r--r--src/vnet/ipfix-export/flow_report.h34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/vnet/ipfix-export/flow_report.h b/src/vnet/ipfix-export/flow_report.h
index b45ce06a880..a26232d5919 100644
--- a/src/vnet/ipfix-export/flow_report.h
+++ b/src/vnet/ipfix-export/flow_report.h
@@ -31,6 +31,13 @@
#include <vnet/ipfix-export/ipfix_packet.h>
+/* 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
{
@@ -42,16 +49,25 @@ typedef struct
struct flow_report_main;
struct flow_report;
-typedef u8 *(vnet_flow_rewrite_callback_t) (struct flow_report_main *,
- struct flow_report *,
- ip4_address_t *,
- ip4_address_t *, u16);
-
typedef vlib_frame_t *(vnet_flow_data_callback_t) (struct flow_report_main *,
struct flow_report *,
vlib_frame_t *, u32 *,
u32);
+typedef u8 *(vnet_flow_rewrite_callback_t) (struct flow_report_main *,
+ 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 *, u16,
+ ipfix_report_element_t * elts,
+ u32 n_elts, u32 * stream_index);
+
typedef union
{
void *as_ptr;
@@ -82,8 +98,11 @@ 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;
@@ -128,10 +147,13 @@ 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,