aboutgitcodebugslistschat
path: root/flow.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-09-06 15:17:06 +1000
committerStefano Brivio <sbrivio@redhat.com>2024-09-06 12:53:24 +0200
commit1166401c2f2b97961bdc285b336eed912b4f8bb1 (patch)
tree095cb89dbc43bcbb9680ec7a7fd85bfff0dffc32 /flow.c
parent7ad9f9bd2bbda8d705e0c6faf5acf2792fce063c (diff)
downloadpasst-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar.gz
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar.bz2
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar.lz
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar.xz
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.tar.zst
passt-1166401c2f2b97961bdc285b336eed912b4f8bb1.zip
udp: Allow UDP flows to be prematurely closed
Unlike TCP, UDP has no in-band signalling for the end of a flow. So the only way we remove flows is on a timer if they have no activity for 180s. However, we've started to investigate some error conditions in which we want to prematurely abort / abandon a UDP flow. We can call udp_flow_close(), which will make the flow inert (sockets closed, no epoll events, can't be looked up in hash). However it will still wait 3 minutes to clear away the stale entry. Clean this up by adding an explicit 'closed' flag which will cause a flow to be more promptly cleaned up. We also publish udp_flow_close() so it can be called from other places to abort UDP flows(). Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'flow.c')
-rw-r--r--flow.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/flow.c b/flow.c
index a00e01d..f2de041 100644
--- a/flow.c
+++ b/flow.c
@@ -832,7 +832,8 @@ void flow_defer_handler(const struct ctx *c, const struct timespec *now)
closed = icmp_ping_timer(c, &flow->ping, now);
break;
case FLOW_UDP:
- if (timer)
+ closed = udp_flow_defer(&flow->udp);
+ if (!closed && timer)
closed = udp_flow_timer(c, &flow->udp, now);
break;
default: