X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fipfix-export%2Fflow_report.c;h=38c2454faefdf1063d69d17d3ded3d83a3470e2a;hb=d747dd950;hp=a28f783130d6006fa9d5735b25d0902bc75be110;hpb=9ec6449e298ed10695c4afbba951ac46daa52e43;p=vpp.git diff --git a/src/vnet/ipfix-export/flow_report.c b/src/vnet/ipfix-export/flow_report.c index a28f783130d..38c2454faef 100644 --- a/src/vnet/ipfix-export/flow_report.c +++ b/src/vnet/ipfix-export/flow_report.c @@ -22,21 +22,17 @@ flow_report_main_t flow_report_main; static_always_inline u8 -stream_index_valid (u32 index) +stream_index_valid (ipfix_exporter_t *exp, u32 index) { - ipfix_exporter_t *exp = pool_elt_at_index (flow_report_main.exporters, 0); - return index < vec_len (exp->streams) && exp->streams[index].domain_id != ~0; } static_always_inline flow_report_stream_t * -add_stream (void) +add_stream (ipfix_exporter_t *exp) { - ipfix_exporter_t *exp = pool_elt_at_index (flow_report_main.exporters, 0); - u32 i; for (i = 0; i < vec_len (exp->streams); i++) - if (!stream_index_valid (i)) + if (!stream_index_valid (exp, i)) return &exp->streams[i]; u32 index = vec_len (exp->streams); vec_validate (exp->streams, index); @@ -44,23 +40,20 @@ add_stream (void) } static_always_inline void -delete_stream (u32 index) +delete_stream (ipfix_exporter_t *exp, u32 index) { - ipfix_exporter_t *exp = pool_elt_at_index (flow_report_main.exporters, 0); - ASSERT (index < vec_len (exp->streams)); ASSERT (exp->streams[index].domain_id != ~0); exp->streams[index].domain_id = ~0; } static i32 -find_stream (u32 domain_id, u16 src_port) +find_stream (ipfix_exporter_t *exp, u32 domain_id, u16 src_port) { - ipfix_exporter_t *exp = pool_elt_at_index (flow_report_main.exporters, 0); flow_report_stream_t *stream; u32 i; for (i = 0; i < vec_len (exp->streams); i++) - if (stream_index_valid (i)) + if (stream_index_valid (exp, i)) { stream = &exp->streams[i]; if (domain_id == stream->domain_id) @@ -78,8 +71,8 @@ find_stream (u32 domain_id, u16 src_port) } int -send_template_packet (flow_report_main_t * frm, - flow_report_t * fr, u32 * buffer_indexp) +send_template_packet (flow_report_main_t *frm, ipfix_exporter_t *exp, + flow_report_t *fr, u32 *buffer_indexp) { u32 bi0; vlib_buffer_t *b0; @@ -89,7 +82,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; - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); ASSERT (buffer_indexp); @@ -108,7 +100,7 @@ send_template_packet (flow_report_main_t * frm, if (fr->update_rewrite) { fr->rewrite = fr->rewrite_callback ( - frm, fr, &exp->ipfix_collector, &exp->src_address, exp->collector_port, + exp, fr, &exp->ipfix_collector, &exp->src_address, exp->collector_port, fr->report_elements, fr->n_report_elements, fr->stream_indexp); fr->update_rewrite = 0; } @@ -162,13 +154,12 @@ send_template_packet (flow_report_main_t * frm, } u8 * -vnet_flow_rewrite_generic_callback (flow_report_main_t * frm, - flow_report_t * fr, - ip4_address_t * collector_address, - ip4_address_t * src_address, +vnet_flow_rewrite_generic_callback (ipfix_exporter_t *exp, flow_report_t *fr, + ip4_address_t *collector_address, + ip4_address_t *src_address, u16 collector_port, - ipfix_report_element_t * report_elts, - u32 n_elts, u32 * stream_indexp) + ipfix_report_element_t *report_elts, + u32 n_elts, u32 *stream_indexp) { ip4_header_t *ip; udp_header_t *udp; @@ -182,7 +173,6 @@ vnet_flow_rewrite_generic_callback (flow_report_main_t * frm, flow_report_stream_t *stream; int i; ipfix_report_element_t *ep; - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); ASSERT (stream_indexp); ASSERT (n_elts); @@ -284,49 +274,55 @@ flow_report_process (vlib_main_t * vm, vlib_process_wait_for_event_or_clock (vm, wait_time); event_type = vlib_process_get_events (vm, &event_data); vec_reset_length (event_data); - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); - - /* 5s delay by default, possibly reduced by template intervals */ - wait_time = def_wait_time; - - vec_foreach (fr, exp->reports) + ipfix_exporter_t *exp; + pool_foreach (exp, frm->exporters) { - f64 next_template; - now = vlib_time_now (vm); - - /* Need to send a template packet? */ - send_template = - now > (fr->last_template_sent + exp->template_interval); - send_template += fr->last_template_sent == 0; - template_bi = ~0; - rv = 0; - if (send_template) - rv = send_template_packet (frm, fr, &template_bi); + /* 5s delay by default, possibly reduced by template intervals */ + wait_time = def_wait_time; - if (rv < 0) - continue; - - /* decide if template should be sent sooner than current wait time */ - next_template = - (fr->last_template_sent + exp->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); - - if (template_bi != ~0) + vec_foreach (fr, exp->reports) { - to_next[0] = template_bi; - to_next++; - nf->n_vectors++; + f64 next_template; + now = vlib_time_now (vm); + + /* Need to send a template packet? */ + send_template = + now > (fr->last_template_sent + exp->template_interval); + send_template += fr->last_template_sent == 0; + template_bi = ~0; + rv = 0; + + if (send_template) + rv = send_template_packet (frm, exp, fr, &template_bi); + + if (rv < 0) + continue; + + /* + * decide if template should be sent sooner than current wait + * time + */ + next_template = + (fr->last_template_sent + exp->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); + + if (template_bi != ~0) + { + to_next[0] = template_bi; + to_next++; + nf->n_vectors++; + } + + nf = fr->flow_data_callback (frm, exp, fr, nf, to_next, + ip4_lookup_node_index); + if (nf) + vlib_put_frame_to_node (vm, ip4_lookup_node_index, nf); } - - nf = fr->flow_data_callback (frm, fr, nf, to_next, - ip4_lookup_node_index); - if (nf) - vlib_put_frame_to_node (vm, ip4_lookup_node_index, nf); } } @@ -342,18 +338,16 @@ VLIB_REGISTER_NODE (flow_report_process_node) = { /* *INDENT-ON* */ int -vnet_flow_report_add_del (flow_report_main_t * frm, - vnet_flow_report_add_del_args_t * a, - u16 * template_id) +vnet_flow_report_add_del (ipfix_exporter_t *exp, + vnet_flow_report_add_del_args_t *a, u16 *template_id) { int i; int found_index = ~0; flow_report_t *fr; flow_report_stream_t *stream; u32 si; - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); - si = find_stream (a->domain_id, a->src_port); + si = find_stream (exp, a->domain_id, a->src_port); if (si == -2) return VNET_API_ERROR_INVALID_VALUE; if (si == -1 && a->is_add == 0) @@ -381,7 +375,7 @@ vnet_flow_report_add_del (flow_report_main_t * frm, stream = &exp->streams[si]; stream->n_reports--; if (stream->n_reports == 0) - delete_stream (si); + delete_stream (exp, si); return 0; } return VNET_API_ERROR_NO_SUCH_ENTRY; @@ -392,7 +386,7 @@ vnet_flow_report_add_del (flow_report_main_t * frm, if (si == -1) { - stream = add_stream (); + stream = add_stream (exp); stream->domain_id = a->domain_id; stream->src_port = a->src_port; stream->sequence_number = 0; @@ -444,14 +438,13 @@ flow_report_add_del_error_to_clib_error (int error) } void -vnet_flow_reports_reset (flow_report_main_t * frm) +vnet_flow_reports_reset (ipfix_exporter_t *exp) { flow_report_t *fr; u32 i; - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); for (i = 0; i < vec_len (exp->streams); i++) - if (stream_index_valid (i)) + if (stream_index_valid (exp, i)) exp->streams[i].sequence_number = 0; vec_foreach (fr, exp->reports) @@ -462,10 +455,9 @@ vnet_flow_reports_reset (flow_report_main_t * frm) } void -vnet_stream_reset (flow_report_main_t * frm, u32 stream_index) +vnet_stream_reset (ipfix_exporter_t *exp, u32 stream_index) { flow_report_t *fr; - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); exp->streams[stream_index].sequence_number = 0; @@ -478,20 +470,18 @@ vnet_stream_reset (flow_report_main_t * frm, u32 stream_index) } int -vnet_stream_change (flow_report_main_t * frm, - u32 old_domain_id, u16 old_src_port, +vnet_stream_change (ipfix_exporter_t *exp, u32 old_domain_id, u16 old_src_port, u32 new_domain_id, u16 new_src_port) { - ipfix_exporter_t *exp = pool_elt_at_index (frm->exporters, 0); + i32 stream_index = find_stream (exp, old_domain_id, old_src_port); - i32 stream_index = find_stream (old_domain_id, old_src_port); if (stream_index < 0) return 1; flow_report_stream_t *stream = &exp->streams[stream_index]; stream->domain_id = new_domain_id; stream->src_port = new_src_port; if (old_domain_id != new_domain_id || old_src_port != new_src_port) - vnet_stream_reset (frm, stream_index); + vnet_stream_reset (exp, stream_index); return 0; } @@ -553,7 +543,7 @@ set_ipfix_exporter_command_fn (vlib_main_t * vm, if (exp->ipfix_collector.as_u32 != collector.as_u32 || exp->src_address.as_u32 != src.as_u32 || exp->collector_port != collector_port) - vnet_flow_reports_reset (frm); + vnet_flow_reports_reset (exp); exp->ipfix_collector.as_u32 = collector.as_u32; exp->collector_port = collector_port;