From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 9C6E85A0082 for ; Fri, 4 Nov 2022 09:43:41 +0100 (CET) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4N3Z0W2HR5z4xwq; Fri, 4 Nov 2022 19:43:39 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1667551419; bh=HNpRLm2LAo6GzTaZQO1ylTxTGyjQWAG18Wuyv3R+GLo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VDapAJOBL0pKTP4iYsGJIcfSE/m8vdkaELcfEtics/J/zcuaYtByQvTqhIGeZLQNX CcXMjZuI9Uvm2XMYskR+ryNeYOp8I1O9AjezaXr7rawt3gJ6Jv6yW/TGs+mk6XzkZ6 o9fLwIFkaJdHlTmS9iV8NdDC1jLLr/1NoUTkHHdg= From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 03/10] tcp: Partially unify IPv4 and IPv6 paths in tcp_hash_match() Date: Fri, 4 Nov 2022 19:43:26 +1100 Message-Id: <20221104084333.3761760-4-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221104084333.3761760-1-david@gibson.dropbear.id.au> References: <20221104084333.3761760-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: TWKVRW54MXJRYGC62XLJJ65E73M2BA5X X-Message-ID-Hash: TWKVRW54MXJRYGC62XLJJ65E73M2BA5X X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: <> Archived-At: List-Archive: <> List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: When given an IPv4 address tcp_hash_match() checks if the connection stores an IPv4-mapped IPv6 address, and if so compares the mapped part of that address to the given address. This is equivalent to converting a given IPv4 address to an IPv4-mapped IPv6 address then comparing it to the connection address using the existing IPv6 logic. Convert to this slightly simpler form, which will also allow some further simplifications in future. Signed-off-by: David Gibson --- tcp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tcp.c b/tcp.c index 26dd268..508d6e9 100644 --- a/tcp.c +++ b/tcp.c @@ -1285,13 +1285,14 @@ static int tcp_opt_get(const char *opts, size_t len, uint8_t type_find, static int tcp_hash_match(const struct tcp_conn *conn, int af, const void *addr, in_port_t tap_port, in_port_t sock_port) { - if (af == AF_INET && CONN_V4(conn) && - !memcmp(&conn->a.a4.a, addr, sizeof(conn->a.a4.a)) && - conn->tap_port == tap_port && conn->sock_port == sock_port) - return 1; + struct in6_addr v4mapped; + + if (af == AF_INET) { + encode_ip4mapped_ip6(&v4mapped, addr); + addr = &v4mapped; + } - if (af == AF_INET6 && - IN6_ARE_ADDR_EQUAL(&conn->a.a6, addr) && + if (IN6_ARE_ADDR_EQUAL(&conn->a.a6, addr) && conn->tap_port == tap_port && conn->sock_port == sock_port) return 1; -- 2.38.1