From 892842c61b562cb7b8fb5fa8a136ff5c938e5d39 Mon Sep 17 00:00:00 2001 From: luwenpeng Date: Wed, 17 Apr 2024 18:22:31 +0800 Subject: [PATCH] bugfix: ip_reassembly_expire busy loop --- src/ip_reassembly/ip_reassembly.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/ip_reassembly/ip_reassembly.cpp b/src/ip_reassembly/ip_reassembly.cpp index 4c93dcc..a1378e2 100644 --- a/src/ip_reassembly/ip_reassembly.cpp +++ b/src/ip_reassembly/ip_reassembly.cpp @@ -816,14 +816,19 @@ void ip_reassembly_expire(struct ip_reassembly *assy, uint64_t now) { struct ip_flow *flow = NULL; uint64_t timeout = assy->timeout; - TAILQ_FOREACH(flow, &assy->lru, lru) - if (timeout + flow->create_time <= now) { - IP_REASSEMBLE_DEBUG1("expire ip flow: discarding old fragmented packets", &flow->key); - ip_reassembly_del_flow(assy, flow); - ip_reassembly_stat_inc(assy, timeout, &flow->key); - ip_flow_free(flow); + if (timeout + flow->create_time <= now) + { + IP_REASSEMBLE_DEBUG1("expire ip flow: discarding old fragmented packets", &flow->key); + ip_reassembly_del_flow(assy, flow); + ip_reassembly_stat_inc(assy, timeout, &flow->key); + ip_flow_free(flow); + } + else + { + break; + } } }