X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipfix-export%2Fflow_report.c;h=760de5f8c66eb35ccf2d892b7249568ff554f860;hb=baa18701b9d54d8924771c25b96bd5d99472b7ad;hp=c9370a748cf42a3be66ab33afc12b03d8092a72e;hpb=178cf493d009995b28fdf220f04c98860ff79a9b;p=vpp.git diff --git a/src/vnet/ipfix-export/flow_report.c b/src/vnet/ipfix-export/flow_report.c index c9370a748cf..760de5f8c66 100644 --- a/src/vnet/ipfix-export/flow_report.c +++ b/src/vnet/ipfix-export/flow_report.c @@ -17,6 +17,7 @@ */ #include #include +#include flow_report_main_t flow_report_main; @@ -86,7 +87,6 @@ send_template_packet (flow_report_main_t * frm, udp_header_t *udp; vlib_main_t *vm = frm->vlib_main; flow_report_stream_t *stream; - vlib_buffer_free_list_t *fl; ASSERT (buffer_indexp); @@ -119,12 +119,7 @@ send_template_packet (flow_report_main_t * frm, b0 = vlib_get_buffer (vm, bi0); - /* Initialize the buffer */ - fl = vlib_buffer_get_free_list (vm, VLIB_BUFFER_DEFAULT_FREE_LIST_INDEX); - vlib_buffer_init_for_free_list (b0, fl); - VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b0); - - ASSERT (vec_len (fr->rewrite) < VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES); + ASSERT (vec_len (fr->rewrite) < vlib_buffer_get_default_data_size (vm)); clib_memcpy_fast (b0->data, fr->rewrite, vec_len (fr->rewrite)); b0->current_data = 0; @@ -265,7 +260,8 @@ flow_report_process (vlib_main_t * vm, u32 template_bi; u32 *to_next; int send_template; - f64 now; + f64 now, wait_time; + f64 def_wait_time = 5.0; int rv; uword event_type; uword *event_data = 0; @@ -281,14 +277,20 @@ flow_report_process (vlib_main_t * vm, ip4_lookup_node = vlib_get_node_by_name (vm, (u8 *) "ip4-lookup"); ip4_lookup_node_index = ip4_lookup_node->index; + wait_time = def_wait_time; + while (1) { - vlib_process_wait_for_event_or_clock (vm, 5.0); + vlib_process_wait_for_event_or_clock (vm, wait_time); event_type = vlib_process_get_events (vm, &event_data); vec_reset_length (event_data); + /* 5s delay by default, possibly reduced by template intervals */ + wait_time = def_wait_time; + vec_foreach (fr, frm->reports) { + f64 next_template; now = vlib_time_now (vm); /* Need to send a template packet? */ @@ -304,6 +306,11 @@ flow_report_process (vlib_main_t * vm, if (rv < 0) continue; + /* decide if template should be sent sooner than current wait time */ + next_template = + (fr->last_template_sent + frm->template_interval) - now; + wait_time = clib_min (wait_time, next_template); + nf = vlib_get_frame_to_node (vm, ip4_lookup_node_index); nf->n_vectors = 0; to_next = vlib_frame_vector_args (nf); @@ -503,7 +510,8 @@ set_ipfix_exporter_command_fn (vlib_main_t * vm, { if (unformat (input, "collector %U", unformat_ip4_address, &collector)) ; - else if (unformat (input, "port %u", &collector_port)) + else if (unformat (input, "port %U", unformat_udp_port, + &collector_port)) ; else if (unformat (input, "src %U", unformat_ip4_address, &src)) ; @@ -572,7 +580,7 @@ VLIB_CLI_COMMAND (set_ipfix_exporter_command, static) = { "collector [port ] " "src [fib-id ] " "[path-mtu ] " - "[template-interval ]", + "[template-interval ] " "[udp-checksum]", .function = set_ipfix_exporter_command_fn, }; @@ -610,7 +618,7 @@ flow_report_init (vlib_main_t * vm) return 0; } -VLIB_INIT_FUNCTION (flow_report_init) +VLIB_INIT_FUNCTION (flow_report_init); /* * fd.io coding-style-patch-verification: ON *