aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-05-21 15:57:05 +1000
committerStefano Brivio <sbrivio@redhat.com>2024-05-22 23:20:58 +0200
commit0060acd11b191e0699e2c588a565c4929523db06 (patch)
treef5b7818c7292c2d7641261a200a98feceb93d4dd /tcp.c
parenta63199832a737dde45500e4037608727701c782f (diff)
downloadpasst-0060acd11b191e0699e2c588a565c4929523db06.tar
passt-0060acd11b191e0699e2c588a565c4929523db06.tar.gz
passt-0060acd11b191e0699e2c588a565c4929523db06.tar.bz2
passt-0060acd11b191e0699e2c588a565c4929523db06.tar.lz
passt-0060acd11b191e0699e2c588a565c4929523db06.tar.xz
passt-0060acd11b191e0699e2c588a565c4929523db06.tar.zst
passt-0060acd11b191e0699e2c588a565c4929523db06.zip
flow: Clarify and enforce flow state transitions
Flows move over several different states in their lifetime. The rules for these are documented in comments, but they're pretty complex and a number of the transitions are implicit, which makes this pretty fragile and error prone. Change the code to explicitly track the states in a field. Make all transitions explicit and logged. To the extent that it's practical in C, enforce what can and can't be done in various states with ASSERT()s. While we're at it, tweak the docs to clarify the restrictions on each state a bit. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r--tcp.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/tcp.c b/tcp.c
index d0ce202..398bda7 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2004,7 +2004,7 @@ static void tcp_conn_from_tap(struct ctx *c, sa_family_t af,
goto cancel;
}
- conn = FLOW_START(flow, FLOW_TCP, tcp, TAPSIDE);
+ conn = FLOW_SET_TYPE(flow, FLOW_TCP, tcp, TAPSIDE);
conn->sock = s;
conn->timer = -1;
conn_event(c, conn, TAP_SYN_RCVD);
@@ -2075,6 +2075,7 @@ static void tcp_conn_from_tap(struct ctx *c, sa_family_t af,
}
tcp_epoll_ctl(c, conn);
+ FLOW_ACTIVATE(conn);
return;
cancel:
@@ -2715,7 +2716,8 @@ static void tcp_tap_conn_from_sock(struct ctx *c, in_port_t dstport,
const union sockaddr_inany *sa,
const struct timespec *now)
{
- struct tcp_tap_conn *conn = FLOW_START(flow, FLOW_TCP, tcp, SOCKSIDE);
+ struct tcp_tap_conn *conn = FLOW_SET_TYPE(flow, FLOW_TCP, tcp,
+ SOCKSIDE);
conn->sock = s;
conn->timer = -1;
@@ -2738,6 +2740,8 @@ static void tcp_tap_conn_from_sock(struct ctx *c, in_port_t dstport,
conn_flag(c, conn, ACK_FROM_TAP_DUE);
tcp_get_sndbuf(conn);
+
+ FLOW_ACTIVATE(conn);
}
/**