From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 96AFF5A0082 for ; Fri, 4 Nov 2022 09:43:42 +0100 (CET) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4N3Z0W26qmz4xHV; 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=vZSK5DEsRGl5OBv/eMW3fLQs4NhChtXZH3tyyIMOfww=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YAc1uppn1DTzBs8mbfk+RGwEBBxzx0CqFdXiyLpg1aaoKHuQzGpohuv2Tfg5JOHCN 6dwh9qzufTF0C0/0d9M+W8tdByZpTBjn6p6GPAvXXHucsp89ZoXjnuT++/MqBaVuqH SQtLj7kMYTATa6zLHQd5zv/X4YOpIW+TrA2whg6E= From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 01/10] tcp: no v6 flag in ref Date: Fri, 4 Nov 2022 19:43:24 +1100 Message-Id: <20221104084333.3761760-2-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: BQRPB6Z22STN2RURDS3VYLPK6JBCFVXA X-Message-ID-Hash: BQRPB6Z22STN2RURDS3VYLPK6JBCFVXA 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: --- tcp.c | 9 ++++----- tcp.h | 1 - tcp_splice.c | 13 +++++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/tcp.c b/tcp.c index 713248f..3d48d6e 100644 --- a/tcp.c +++ b/tcp.c @@ -761,8 +761,7 @@ static int tcp_epoll_ctl(const struct ctx *c, struct tcp_conn *conn) { int m = (conn->flags & IN_EPOLL) ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; union epoll_ref ref = { .r.proto = IPPROTO_TCP, .r.s = conn->sock, - .r.p.tcp.tcp.index = conn - tc, - .r.p.tcp.tcp.v6 = CONN_V6(conn) }; + .r.p.tcp.tcp.index = conn - tc, }; struct epoll_event ev = { .data.u64 = ref.u64 }; if (conn->events == CLOSED) { @@ -2857,6 +2856,7 @@ static void tcp_conn_from_sock(struct ctx *c, union epoll_ref ref, if (c->tcp.conn_count >= TCP_MAX_CONNS) return; + sa.ss_family = AF_UNSPEC; /* FIXME: stop clang-tidy complaining */ sl = sizeof(sa); s = accept4(ref.r.s, (struct sockaddr *)&sa, &sl, SOCK_NONBLOCK); if (s < 0) @@ -2868,7 +2868,7 @@ static void tcp_conn_from_sock(struct ctx *c, union epoll_ref ref, conn->ws_to_tap = conn->ws_from_tap = 0; conn_event(c, conn, SOCK_ACCEPTED); - if (ref.r.p.tcp.tcp.v6) { + if (sa.ss_family == AF_INET6) { struct sockaddr_in6 sa6; memcpy(&sa6, &sa, sizeof(sa6)); @@ -3147,8 +3147,7 @@ static void tcp_sock_init6(const struct ctx *c, int ns, const struct in6_addr *addr, const char *ifname, in_port_t port) { - union tcp_epoll_ref tref = { .tcp.listen = 1, .tcp.outbound = ns, - .tcp.v6 = 1 }; + union tcp_epoll_ref tref = { .tcp.listen = 1, .tcp.outbound = ns, }; bool spliced = false, tap = true; int s; diff --git a/tcp.h b/tcp.h index 3fabb5a..85ac750 100644 --- a/tcp.h +++ b/tcp.h @@ -45,7 +45,6 @@ union tcp_epoll_ref { uint32_t listen:1, splice:1, outbound:1, - v6:1, timer:1, index:20; } tcp; diff --git a/tcp_splice.c b/tcp_splice.c index 99c5fa7..1f26ff4 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -211,12 +211,10 @@ static int tcp_splice_epoll_ctl(const struct ctx *c, int m = (conn->flags & IN_EPOLL) ? EPOLL_CTL_MOD : EPOLL_CTL_ADD; union epoll_ref ref_a = { .r.proto = IPPROTO_TCP, .r.s = conn->a, .r.p.tcp.tcp.splice = 1, - .r.p.tcp.tcp.index = conn - tc, - .r.p.tcp.tcp.v6 = CONN_V6(conn) }; + .r.p.tcp.tcp.index = conn - tc, }; union epoll_ref ref_b = { .r.proto = IPPROTO_TCP, .r.s = conn->b, .r.p.tcp.tcp.splice = 1, - .r.p.tcp.tcp.index = conn - tc, - .r.p.tcp.tcp.v6 = CONN_V6(conn) }; + .r.p.tcp.tcp.index = conn - tc, }; struct epoll_event ev_a = { .data.u64 = ref_a.u64 }; struct epoll_event ev_b = { .data.u64 = ref_b.u64 }; uint32_t events_a, events_b; @@ -579,12 +577,15 @@ void tcp_sock_handler_splice(struct ctx *c, union epoll_ref ref, struct tcp_splice_conn *conn; if (ref.r.p.tcp.tcp.listen) { + struct sockaddr sa; + socklen_t sl = sizeof(sa); int s; if (c->tcp.splice_conn_count >= TCP_SPLICE_MAX_CONNS) return; - if ((s = accept4(ref.r.s, NULL, NULL, SOCK_NONBLOCK)) < 0) + sa.sa_family = AF_UNSPEC; /* FIXME: stop clang-tidy complaining */ + if ((s = accept4(ref.r.s, &sa, &sl, SOCK_NONBLOCK)) < 0) return; if (setsockopt(s, SOL_TCP, TCP_QUICKACK, &((int){ 1 }), @@ -595,7 +596,7 @@ void tcp_sock_handler_splice(struct ctx *c, union epoll_ref ref, conn = CONN(c->tcp.splice_conn_count++); conn->a = s; - conn->flags = ref.r.p.tcp.tcp.v6 ? SOCK_V6 : 0; + conn->flags = (sa.sa_family == AF_INET6) ? SOCK_V6 : 0; if (tcp_splice_new(c, conn, ref.r.p.tcp.tcp.index, ref.r.p.tcp.tcp.outbound)) -- 2.38.1