aboutgitcodebugslistschat
path: root/tcp_conn.h
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2022-11-17 16:58:44 +1100
committerStefano Brivio <sbrivio@redhat.com>2022-11-25 01:34:46 +0100
commitff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b (patch)
treed31dd7d923497ec221773f92515403abf7348bde /tcp_conn.h
parent3cf027bd590d1a42dacc0d52dbbc298994902c9b (diff)
downloadpasst-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar.gz
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar.bz2
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar.lz
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar.xz
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.tar.zst
passt-ff27fd63cdd95490e2f9f4e67dbf70324ed6ed9b.zip
tcp: Add connection union type
Currently, the tables for spliced and non-spliced connections are entirely separate, with different types in different arrays. We want to unify them. As a first step, create a union type which can represent either a spliced or non-spliced connection. For them to be distinguishable, the individual types need to have a common header added, with a bit indicating which type this structure is. This comes at the cost of increasing the size of tcp_tap_conn to over one (64 byte) cacheline. This isn't ideal, but it makes things simpler for now and we'll re-optimize this later. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp_conn.h')
-rw-r--r--tcp_conn.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/tcp_conn.h b/tcp_conn.h
index db4c2d9..39d104a 100644
--- a/tcp_conn.h
+++ b/tcp_conn.h
@@ -12,7 +12,18 @@
#define TCP_HASH_BUCKET_BITS (TCP_CONN_INDEX_BITS + 1)
/**
+ * struct tcp_conn_common - Common fields for spliced and non-spliced
+ * @spliced: Is this a spliced connection?
+ */
+struct tcp_conn_common {
+ bool spliced :1;
+};
+
+extern const char *tcp_common_flag_str[];
+
+/**
* struct tcp_tap_conn - Descriptor for a TCP connection (not spliced)
+ * @c: Fields common with tcp_splice_conn
* @next_index: Connection index of next item in hash chain, -1 for none
* @tap_mss: MSS advertised by tap/guest, rounded to 2 ^ TCP_MSS_BITS
* @sock: Socket descriptor number
@@ -40,6 +51,9 @@
* @seq_init_from_tap: Initial sequence number from tap
*/
struct tcp_tap_conn {
+ /* Must be first element to match tcp_splice_conn */
+ struct tcp_conn_common c;
+
int next_index :TCP_CONN_INDEX_BITS + 2;
#define TCP_RETRANS_BITS 3
@@ -122,6 +136,7 @@ struct tcp_tap_conn {
/**
* struct tcp_splice_conn - Descriptor for a spliced TCP connection
+ * @c: Fields common with tcp_tap_conn
* @a: File descriptor number of socket for accepted connection
* @pipe_a_b: Pipe ends for splice() from @a to @b
* @b: File descriptor number of peer connected socket
@@ -134,6 +149,9 @@ struct tcp_tap_conn {
* @b_written: Bytes written to @b (not fully written from one @a read)
*/
struct tcp_splice_conn {
+ /* Must be first element to match tcp_tap_conn */
+ struct tcp_conn_common c;
+
int a;
int pipe_a_b[2];
int b;
@@ -165,4 +183,16 @@ struct tcp_splice_conn {
uint32_t b_written;
};
+/**
+ * union tcp_conn - Descriptor for a TCP connection (spliced or non-spliced)
+ * @c: Fields common between all variants
+ * @tap: Fields specific to non-spliced connections
+ * @splice: Fields specific to spliced connections
+*/
+union tcp_conn {
+ struct tcp_conn_common c;
+ struct tcp_tap_conn tap;
+ struct tcp_splice_conn splice;
+};
+
#endif /* TCP_CONN_H */