VPP-166 Documentation changes for ip4_forward.c
[vpp.git] / vnet / vnet / flow / flow_report_sample.c
index 122bd9d..69f0491 100644 (file)
@@ -25,7 +25,8 @@ flow_report_sample_main_t flow_report_sample_main;
 static u8 * template_rewrite (flow_report_main_t * frm,
                               flow_report_t * fr,
                               ip4_address_t * collector_address,
-                              ip4_address_t * src_address)
+                              ip4_address_t * src_address,
+                              u16 collector_port)
 {
   vnet_classify_table_t * tblp;
   vnet_classify_main_t * vcm = &vnet_classify_main;
@@ -91,8 +92,8 @@ static u8 * template_rewrite (flow_report_main_t * frm,
   ip->protocol = IP_PROTOCOL_UDP;
   ip->src_address.as_u32 = src_address->as_u32;
   ip->dst_address.as_u32 = collector_address->as_u32;
-  udp->src_port = clib_host_to_net_u16 (4739 /* $$FIXME */);
-  udp->dst_port = clib_host_to_net_u16 (UDP_DST_PORT_ipfix);
+  udp->src_port = clib_host_to_net_u16 (fr->src_port);
+  udp->dst_port = clib_host_to_net_u16 (collector_port);
   udp->length = clib_host_to_net_u16 (vec_len(rewrite) - sizeof (*ip));
 
   /* FIXUP: message header export_time */ 
@@ -150,6 +151,7 @@ static vlib_frame_t * send_flows (flow_report_main_t * frm,
   vnet_classify_entry_t * v, * save_v;
   vlib_buffer_t *b0 = 0;
   u32 next_offset = 0;
+  u32 record_offset = 0;
   u32 bi0 = ~0;
   int i, j, k;
   ip4_ipfix_template_packet_t * tp;
@@ -218,6 +220,7 @@ static vlib_frame_t * send_flows (flow_report_main_t * frm,
                   h->sequence_number = clib_host_to_net_u32 (h->sequence_number);
 
                   next_offset = (u32) (((u8 *)(s+1)) - (u8 *)tp);
+                  record_offset = next_offset;
                   records_this_buffer = 0;
                 }
               
@@ -246,7 +249,11 @@ static vlib_frame_t * send_flows (flow_report_main_t * frm,
               records_this_buffer++;
               fr->sequence_number++;
               
-              if (next_offset > 1450)
+              /* Next record will have the same size as this record */
+              u32 next_record_size = next_offset - record_offset;
+              record_offset = next_offset;
+
+              if (next_offset + next_record_size > frm->path_mtu)
                 {
                   s->set_id_length = ipfix_set_id_length (256 /* template ID*/, 
                                                           next_offset - 
@@ -346,6 +353,7 @@ flow_sample_command_fn (vlib_main_t * vm,
   int rv;
   int is_add = 1;
   u32 domain_id = 0;
+  u32 src_port = UDP_DST_PORT_ipfix;
 
   domain_id = 0;
   fsm->classify_table_index = ~0;
@@ -356,6 +364,8 @@ flow_sample_command_fn (vlib_main_t * vm,
       ;
     else if (unformat (input, "domain %d", &domain_id))
       ;
+    else if (unformat (input, "src-port %d", &src_port))
+      ;
     else if (unformat (input, "del"))
       is_add = 0;
     else
@@ -371,6 +381,7 @@ flow_sample_command_fn (vlib_main_t * vm,
   args.flow_data_callback = send_flows;
   args.is_add = is_add;
   args.domain_id = domain_id;
+  args.src_port = (u16)src_port;
 
   rv = vnet_flow_report_add_del (frm, &args);