diff --git a/tcp.c b/tcp.c index b11ce6e..e9803aa 100644 --- a/tcp.c +++ b/tcp.c @@ -1243,6 +1243,24 @@ static unsigned int tcp_hash(const struct ctx *c, int af, const void *addr, return (unsigned int)(b % TCP_HASH_TABLE_SIZE); } +/** + * tcp_conn_hash() - Calculate hash bucket of an existing connection + * @c: Execution context + * @conn: Connection + * + * Return: hash value, already modulo size of the hash table + */ +static unsigned int tcp_conn_hash(const struct ctx *c, + const struct tcp_tap_conn *conn) +{ + if (CONN_V6(conn)) + return tcp_hash(c, AF_INET6, &conn->a.a6, + conn->tap_port, conn->sock_port); + else + return tcp_hash(c, AF_INET, &conn->a.a4.a, + conn->tap_port, conn->sock_port); +} + /** * tcp_hash_insert() - Insert connection into hash table, chain link * @c: Execution context @@ -1258,7 +1276,6 @@ static void tcp_hash_insert(const struct ctx *c, struct tcp_tap_conn *conn, b = tcp_hash(c, af, addr, conn->tap_port, conn->sock_port); conn->next_index = tc_hash[b] ? CONN_IDX(tc_hash[b]) : -1; tc_hash[b] = conn; - conn->hash_bucket = b; debug("TCP: hash table insert: index %li, sock %i, bucket: %i, next: " "%p", CONN_IDX(conn), conn->sock, b, conn_at_idx(conn->next_index)); @@ -1266,12 +1283,14 @@ static void tcp_hash_insert(const struct ctx *c, struct tcp_tap_conn *conn, /** * tcp_hash_remove() - Drop connection from hash table, chain unlink + * @c: Execution context * @conn: Connection pointer */ -static void tcp_hash_remove(const struct tcp_tap_conn *conn) +static void tcp_hash_remove(const struct ctx *c, + const struct tcp_tap_conn *conn) { struct tcp_tap_conn *entry, *prev = NULL; - int b = conn->hash_bucket; + int b = tcp_conn_hash(c, conn); for (entry = tc_hash[b]; entry; prev = entry, entry = conn_at_idx(entry->next_index)) { @@ -1299,7 +1318,7 @@ static void tcp_tap_conn_update(struct ctx *c, struct tcp_tap_conn *old, struct tcp_tap_conn *new) { struct tcp_tap_conn *entry, *prev = NULL; - int b = old->hash_bucket; + int b = tcp_conn_hash(c, old); for (entry = tc_hash[b]; entry; prev = entry, entry = conn_at_idx(entry->next_index)) { @@ -1387,7 +1406,7 @@ static void tcp_conn_destroy(struct ctx *c, struct tcp_tap_conn *conn) if (conn->timer != -1) close(conn->timer); - tcp_hash_remove(conn); + tcp_hash_remove(c, conn); tcp_table_compact(c, (union tcp_conn *)conn); } diff --git a/tcp_conn.h b/tcp_conn.h index faa63dc..4bffe9a 100644 --- a/tcp_conn.h +++ b/tcp_conn.h @@ -9,8 +9,6 @@ #ifndef TCP_CONN_H #define TCP_CONN_H -#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? @@ -32,7 +30,6 @@ extern const char *tcp_common_flag_str[]; * @events: Connection events, implying connection states * @timer: timerfd descriptor for timeout events * @flags: Connection flags representing internal attributes - * @hash_bucket: Bucket index in connection lookup hash table * @retrans: Number of retransmissions occurred due to ACK_TIMEOUT * @ws_from_tap: Window scaling factor advertised from tap/guest * @ws_to_tap: Window scaling factor advertised to tap/guest @@ -97,8 +94,6 @@ struct tcp_tap_conn { #define ACK_FROM_TAP_DUE BIT(5) - unsigned int hash_bucket :TCP_HASH_BUCKET_BITS; - #define TCP_MSS_BITS 14 unsigned int tap_mss :TCP_MSS_BITS; #define MSS_SET(conn, mss) (conn->tap_mss = (mss >> (16 - TCP_MSS_BITS)))