diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-01-16 11:50:35 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-01-22 23:35:17 +0100 |
commit | b43e4483ed4888e1ab0c5195fa3f61bb24bde904 (patch) | |
tree | aa2e5bef99488b8d089f6db5c9642cf3caa527fa /flow.c | |
parent | c97bb527d6894a66f19584c1e300854c3110da64 (diff) | |
download | passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar.gz passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar.bz2 passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar.lz passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar.xz passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.tar.zst passt-b43e4483ed4888e1ab0c5195fa3f61bb24bde904.zip |
flow, tcp: Add flow-centric dispatch for deferred flow handling
tcp_defer_handler(), amongst other things, scans the flow table and does
some processing for each TCP connection. When we add other protocols to
the flow table, they're likely to want some similar scanning. It makes
more sense for cache friendliness to perform a single scan of the flow
table and dispatch to the protocol specific handlers, rather than having
each protocol separately scan the table.
To that end, add a new flow_defer_handler() handling all flow-linked
deferred operations.
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.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -84,3 +84,26 @@ void flow_log_(const struct flow_common *f, int pri, const char *fmt, ...) logmsg(pri, "Flow %u (%s): %s", flow_idx(f), FLOW_TYPE(f), msg); } + +/** + * flow_defer_handler() - Handler for per-flow deferred tasks + * @c: Execution context + */ +void flow_defer_handler(struct ctx *c) +{ + union flow *flow; + + for (flow = flowtab + c->flow_count - 1; flow >= flowtab; flow--) { + switch (flow->f.type) { + case FLOW_TCP: + tcp_flow_defer(c, flow); + break; + case FLOW_TCP_SPLICE: + tcp_splice_flow_defer(c, flow); + break; + default: + /* Assume other flow types don't need any handling */ + ; + } + } +} |