aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Chernavin <achernavin@netgate.com>2023-10-26 11:48:06 +0000
committerMatthew Smith <mgsmith@netgate.com>2023-11-07 14:01:13 +0000
commitdab1dfeea9fec04a9a90a82dc5d770fbff344540 (patch)
treee0766ed33428f6c5e03575b44a8bc08b42525a3f
parent92ab407a5960d2e269b39826cac05f8133cb277b (diff)
flowprobe: fix clearing interface state on feature disabling
As a result of recent fixes, all currently stored flows of an interface are deleted when the feature is being disabled for the interface. This includes stopping the timer and freeing the flow entries for further reuse. The problem is that meta information is not cleared in the flow entries being deleted. For example, packet delta count will keep its value. The next flow that gets one of these pool entries will already have a non-zero packet count. So the counting of packets will start from a non-zero value. And incorrect packet delta count will be exported for that flow. With this fix, clear meta information too when clearing interface state. Also, update the corresponding test to cover this case. Type: fix Change-Id: I9a73b3958adfd1676e66b0ed50f1478920671cca Signed-off-by: Alexander Chernavin <achernavin@netgate.com>
-rw-r--r--src/plugins/flowprobe/flowprobe.c3
-rw-r--r--test/test_flowprobe.py21
2 files changed, 23 insertions, 1 deletions
diff --git a/src/plugins/flowprobe/flowprobe.c b/src/plugins/flowprobe/flowprobe.c
index af8b8ce5218..30521b5a0ca 100644
--- a/src/plugins/flowprobe/flowprobe.c
+++ b/src/plugins/flowprobe/flowprobe.c
@@ -527,6 +527,9 @@ flowprobe_clear_state_if_index (u32 sw_if_index)
if (e->key.rx_sw_if_index == sw_if_index ||
e->key.tx_sw_if_index == sw_if_index)
{
+ e->packetcount = 0;
+ e->octetcount = 0;
+ e->prot.tcp.flags = 0;
if (fm->passive_timer > 0)
{
tw_timer_stop_2t_1w_2048sl (
diff --git a/test/test_flowprobe.py b/test/test_flowprobe.py
index f1f8597219d..28ddff8a65e 100644
--- a/test/test_flowprobe.py
+++ b/test/test_flowprobe.py
@@ -1441,8 +1441,27 @@ class DisableFP(MethodHolder):
self.sleep(12, "wait for leftover ip4 flows during three passive intervals")
self.collector.assert_nothing_captured()
+ # re-enable feature for the interface
+ ipfix.enable_flowprobe_feature()
+
+ # template packet should arrive immediately
+ ipfix_decoder = IPFIXDecoder()
+ self.vapi.ipfix_flush()
+ templates = ipfix.verify_templates(ipfix_decoder, count=1)
+
+ # send some ip4 packets
+ self.create_stream(src_if=self.pg3, dst_if=self.pg4, packets=5)
+ capture = self.send_packets(src_if=self.pg3, dst_if=self.pg4)
+
+ # verify meta info - packet/octet delta
+ self.vapi.ipfix_flush()
+ cflow = self.wait_for_cflow_packet(self.collector, templates[0], timeout=8)
+ self.verify_cflow_data(ipfix_decoder, capture, cflow)
+
+ self.collector.get_capture(2)
+
# cleanup
- ipfix.disable_exporter()
+ ipfix.remove_vpp_config()
@unittest.skipUnless(config.extended, "part of extended tests")