From nobody Sat Apr 27 20:33:42 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp642280jap; Fri, 3 Dec 2021 07:20:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJzgFyMh485suy7zquGlsVcyNce/bLewI41P31snTKM+cJi2+z8xvJyX4gv2YIeUnLzxdGVQ X-Received: by 2002:a05:620a:1a95:: with SMTP id bl21mr17446269qkb.529.1638544821788; Fri, 03 Dec 2021 07:20:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638544821; cv=none; d=google.com; s=arc-20160816; b=akSgZpkU7VBiQCwaE/gr5fiu9b9U/lTVLwxi6tf7JYtzWTwx59DW2W6PtNmYegBB2J A+9Z3DzQqNHw8j8DHqDuE3Jj27uZ1wMDGMvstO0Ckr3nQYu0cD3IqPiO46Futy/x/Cw/ CpbG1HRvnHBbcwU8zhCZlgj43zw2z9ys4m1I6ujVuZImPLaN39NJfYdAsynK0pzVs9Bs y6IhupxEpWdw6ry0S3qvVjFHf0k5A6G1tOlMdNb60id6H/MjEl2D4p0MjvdkDJV2H4Do PfUc277v3btqt19fbUG5629Cwd5crq2e3+6dA3UulIcg1NzOEVY0JN+usE0QRwkjlQ6Y rq8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=aMR1hYkvoUwefVKooQD8Jdkgq7b6DI69kqlt/t+9Rd8=; b=RY8+Hpawf2KbVmXsOE/JMMWYlblU1teHp3DFvkTras+wUxUpxXyrlrQW43phPlPIAH tMJ3WLNe0SBjZffAwY7nOQkRpKjzFS+VHnjjfD/JRXxwf0fi5zh598/6Vr7qhsXiPn6w iXxMQ09YNqymndZyw8j3wGrFCulX512QRU2ZMm7d+BtzynWU33QL0RHLo1eiAFQfihWu qq7zfFMJOnocYPCxKsbjtcx4JbHpBXQuci7E3lNmuWIE+VdJtuCygpJ0y03f8xN5WOk4 BE8WmfoApnI8DYlKWb1Hsttqtx+O3E1WM2MIL6JVfawRqYD8a995fSJH9TWAR2snOop/ sgRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=W4XwRpyf; spf=pass (google.com: domain of mptcp+bounces-2615-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2615-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id d14si3359350qtx.484.2021.12.03.07.20.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 07:20:21 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2615-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=W4XwRpyf; spf=pass (google.com: domain of mptcp+bounces-2615-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2615-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 7A9451C0A80 for ; Fri, 3 Dec 2021 15:20:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 304122CA6; Fri, 3 Dec 2021 15:20:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C879468 for ; Fri, 3 Dec 2021 15:20:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638544817; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=aMR1hYkvoUwefVKooQD8Jdkgq7b6DI69kqlt/t+9Rd8=; b=W4XwRpyfrF8NFuARYTCroVkSj57QXUdW/Du4ZAHrFdYXcNDqtOzDjBQp9xsKWaFlOnu6TU 7NywtyxJ45ev9RleJ5UPlxwzTpMGaaxQ6/IywFi514VSHNuXYM8XdTSTVF4txsMBa0DnFy hnRoD9opF0zGjjaRtciTcu+II77Cfqw= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-150-Heyf2SBWPMizMBOu5IU8KA-1; Fri, 03 Dec 2021 10:20:16 -0500 X-MC-Unique: Heyf2SBWPMizMBOu5IU8KA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BAB321926DA2 for ; Fri, 3 Dec 2021 15:20:15 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.192.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2E6455F4E0 for ; Fri, 3 Dec 2021 15:20:14 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 1/5] mptcp: fix per socket endpoint accounting. Date: Fri, 3 Dec 2021 16:19:38 +0100 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Since full-mesh endpoint support, the reception of a single ADD_ADDR option can cause multiple subflows creation. When such option is accepted we increment 'add_addr_accepted' by one. When we received a paired RM_ADDR option, we deleted all the relevant subflows, decrementing 'add_addr_accepted' by one for each of them. We have a similar issue for 'local_addr_used' Fix them moving the pm endpoint accounting outside the subflow traversal. Fixes: 1a0d6136c5f0 ("mptcp: local addresses fullmesh") Signed-off-by: Paolo Abeni --- net/mptcp/pm_netlink.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 3186d33b5208..d18b13e3e74c 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -710,6 +710,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, return; =20 for (i =3D 0; i < rm_list->nr; i++) { + bool removed =3D false; + list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); int how =3D RCV_SHUTDOWN | SEND_SHUTDOWN; @@ -729,15 +731,19 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mpt= cp_sock *msk, mptcp_close_ssk(sk, ssk, subflow); spin_lock_bh(&msk->pm.lock); =20 - if (rm_type =3D=3D MPTCP_MIB_RMADDR) { - msk->pm.add_addr_accepted--; - WRITE_ONCE(msk->pm.accept_addr, true); - } else if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) { - msk->pm.local_addr_used--; - } + removed =3D true; msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } + if (!removed) + continue; + + if (rm_type =3D=3D MPTCP_MIB_RMADDR) { + msk->pm.add_addr_accepted--; + WRITE_ONCE(msk->pm.accept_addr, true); + } else if (rm_type =3D=3D MPTCP_MIB_RMSUBFLOW) { + msk->pm.local_addr_used--; + } } } =20 --=20 2.33.1 From nobody Sat Apr 27 20:33:42 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp642320jap; Fri, 3 Dec 2021 07:20:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzLiSjtYKU0+9thDIzkTRwKUX1caHpWGebpB4LwyfW+DY5u/PgNk+M82yDyQzqJTS4Dk/B5 X-Received: by 2002:a17:90b:4a83:: with SMTP id lp3mr14965766pjb.34.1638544823664; Fri, 03 Dec 2021 07:20:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638544823; cv=none; d=google.com; s=arc-20160816; b=puM9+prt6ieKp3Umlgw745wojyFKQy7VeB0AX6dj2I57QwB8VI+P+cuJG8D5P2w5E3 cEHZB/FWFQrZwUVnFlq5Zzw8AklN6dXjj9PSuuXtnhYKW9+ZyFjWrfEIhbq8yRXGFuXQ O3ov0YqjJWSCe7v9GjneoyhLo7dPGiPQ9eB86keTGl3Dkk/QTgQ/U4hDlxz/2sBOHCuR uNHRQZi3iBoXHurzsiX/e5Bxdrv7J96IrV+TLW33epvvxatKfYB/R94l6U7Y+IXpmSUK KeFyIiV4k5d6hePmycVFxXYGMJnjDvpnP0bzFSt0t8O2Z2s1QMQPLp+OkUai4Wnz6LVq BHLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=R1mY7UFdQVRSDeafvZWZ10zEPnX1i9Jjr2qNMeJH7g8=; b=XZhexAIp5qdK42Cb20+AcZER9a5LU/qalu7OaKUfSz9qECK1QEkIi2v/WvldgDXnCf XptyMLbOb4TB5EwFj5meEq2lioPSC/lAGy+5XuTWCdh3nOeyxSHXXKOuLCpC78U1javi WR2UpaxBnximBTASDwDpwlDjrIh3BdAgLPlV6Q3O9LEa/lcDKNN0JaqSEL8r4R83B9xu aQLjycdWTYDbinq3ye55fW5YKB7JRMFY8mtw6kOkEz6Fxa9gvw8sibcBztK8WjuLdOQX XxX5RXHb0dajJ1gtSSTY+QXSKxqpoyc6Qzs5pQtM6BN3smCcd0rEPqTdgKzkW1+PI+2y 4vUw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Ch4+dMHM; spf=pass (google.com: domain of mptcp+bounces-2617-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2617-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id i13si3868975pjd.177.2021.12.03.07.20.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 07:20:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2617-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Ch4+dMHM; spf=pass (google.com: domain of mptcp+bounces-2617-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2617-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 5FE643E0EFD for ; Fri, 3 Dec 2021 15:20:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6B74D2CAB; Fri, 3 Dec 2021 15:20:21 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BECAC29CA for ; Fri, 3 Dec 2021 15:20:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638544818; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R1mY7UFdQVRSDeafvZWZ10zEPnX1i9Jjr2qNMeJH7g8=; b=Ch4+dMHMcGtaJypBoJ0CPZeiMEaUJPTz0PcMFXJMAqNRvHoIe1Vf8tp+NGAubCfbnraFDp tcKA9z1WTTolZO7NIuoiz4vLjSUH9KgxbqDnvjSlk4MKEE5C855GeHIK0kADCBXjkkvKhp r5Dt0kki9REIohDb+agY9sd/NLKUIxY= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-293-xjmF-HkpNRy8v-usNBZDGg-1; Fri, 03 Dec 2021 10:20:17 -0500 X-MC-Unique: xjmF-HkpNRy8v-usNBZDGg-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AD29E760C4 for ; Fri, 3 Dec 2021 15:20:16 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.192.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2142C5F4E0 for ; Fri, 3 Dec 2021 15:20:15 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 2/5] mptcp: clean-up MPJ option writing. Date: Fri, 3 Dec 2021 16:19:39 +0100 Message-Id: <1b9aefe2bd407aaec835a2aa0df7e36b951c0513.1638544716.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Check for all MPJ variant at once, this reduces the number of conditionals traversed on average and will simplify the next patch. No functional change intended. Signed-off-by: Paolo Abeni --- net/mptcp/options.c | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 8a1020e4285c..7a6a39b71633 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1381,27 +1381,29 @@ void mptcp_write_options(__be32 *ptr, const struct = tcp_sock *tp, =20 /* MPC is additionally mutually exclusive with MP_PRIO */ goto mp_capable_done; - } else if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_SYN, - opts->backup, opts->join_id); - put_unaligned_be32(opts->token, ptr); - ptr +=3D 1; - put_unaligned_be32(opts->nonce, ptr); - ptr +=3D 1; - } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_SYNACK, - opts->backup, opts->join_id); - put_unaligned_be64(opts->thmac, ptr); - ptr +=3D 2; - put_unaligned_be32(opts->nonce, ptr); - ptr +=3D 1; - } else if (OPTION_MPTCP_MPJ_ACK & opts->suboptions) { - *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, - TCPOLEN_MPTCP_MPJ_ACK, 0, 0); - memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); - ptr +=3D 5; + } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) { + if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_SYN, + opts->backup, opts->join_id); + put_unaligned_be32(opts->token, ptr); + ptr +=3D 1; + put_unaligned_be32(opts->nonce, ptr); + ptr +=3D 1; + } else if (OPTION_MPTCP_MPJ_SYNACK & opts->suboptions) { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_SYNACK, + opts->backup, opts->join_id); + put_unaligned_be64(opts->thmac, ptr); + ptr +=3D 2; + put_unaligned_be32(opts->nonce, ptr); + ptr +=3D 1; + } else { + *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, + TCPOLEN_MPTCP_MPJ_ACK, 0, 0); + memcpy(ptr, opts->hmac, MPTCPOPT_HMAC_LEN); + ptr +=3D 5; + } } else if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) { u8 len =3D TCPOLEN_MPTCP_ADD_ADDR_BASE; u8 echo =3D MPTCP_ADDR_ECHO; --=20 2.33.1 From nobody Sat Apr 27 20:33:42 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp642404jap; Fri, 3 Dec 2021 07:20:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJzEk/XqmTRbQwKyTzZMK1xQHFWBjpbc0dX+rRdYQGy/nDVfuJdYT/7xs3wvxi2ojyksLNVm X-Received: by 2002:ab0:3b12:: with SMTP id n18mr22665077uaw.2.1638544826650; Fri, 03 Dec 2021 07:20:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638544826; cv=none; d=google.com; s=arc-20160816; b=O5lOrSV0qsCPGvM82sIr5S3FFP5J6JXO4JafuwE+jLoPbjZLT++aGECewXJ7OTPYab nI5niw4SrN51uokDiE20KGMla+hBVwHHZbkv2mATHmpbh24iiqI9VjB0XvlKN8MVqDYl uf2+zdvQElMfYExuNt1kiMOI7SLe7eRZx/MMHYmhhzCoSozVAgBCWvoYK6dX7b3M7vQG 35uz+Seep0j5Uh5SibL8qqdQxhlhTtvuqmDIXWBJkGVMwPgeZ121A/PSaDYEViumUMkq i8oc6buHNf22Sla2qIVwzW8LoEo4wTiGazzU3+GUPbJ++hgtt6Kqiktow/ONslyCAbsM dXVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=zkMZusmujnYG8+69mD4tt9+7KekuqPJQvWZEHi/butk=; b=RZjatPQ1gd3bG6JknqXl2Ri+XRlKuHT/jJSDzNF+onJi3GtKGGt7WuqCIHAudZ4bia 1e1Sj841tgttHLswwhE0Exc8Lz+sVpLOfexmxVEZSY4ApQK4KZZsVDDvovjOYWysur7D RrYBM8gSDDdQk5PycWX0n7TWSmLlhfNbHDO1F9Q8yOyYtT6EIB1GkhmF9uK9ZhQA4M9z 2oNCH5FebbHhHyN/f+pSP04f2I4ZZ62lN4LAERoxbhhqm14klfq9ene+PHwBZ9jzhSxG WUInOlID5bLfcfl5t5bNjrv2tDgOnDl26sbBJtjL7yQe1UYrmtTyF+R7SiXzYOFzAvuo m0uA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="K4/5xK6l"; spf=pass (google.com: domain of mptcp+bounces-2619-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2619-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id e185si2814329vkh.216.2021.12.03.07.20.26 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 07:20:26 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2619-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b="K4/5xK6l"; spf=pass (google.com: domain of mptcp+bounces-2619-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2619-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 075111C0F0D for ; Fri, 3 Dec 2021 15:20:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EC4532C80; Fri, 3 Dec 2021 15:20:22 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE14F2CAC for ; Fri, 3 Dec 2021 15:20:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638544820; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=zkMZusmujnYG8+69mD4tt9+7KekuqPJQvWZEHi/butk=; b=K4/5xK6l/heESDPCUgtmQ2eV+IRtGBkKNDJ3XWClRmGyucoSt4md36Tgx7thFV+0+MVUS6 apX54p82X4mILVs5rK8Jkk9fQA/lxgHOLNcO94ilKAuillic080dHc01Rblfp+yu443azu LsjKM286ywri7GFcVmDwghm8KPExt0E= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-350-HEqlTBq3N66gm9q3jryv6Q-1; Fri, 03 Dec 2021 10:20:18 -0500 X-MC-Unique: HEqlTBq3N66gm9q3jryv6Q-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 9891683DD2F for ; Fri, 3 Dec 2021 15:20:17 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.192.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0E97E5F4E0 for ; Fri, 3 Dec 2021 15:20:16 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 3/5] mptcp: keep track of local endpoint still available for each msk Date: Fri, 3 Dec 2021 16:19:40 +0100 Message-Id: <20e1d11df9396b33ab49b07204bd8b7db2e21a01.1638544716.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Include into the path manager status a bitmap tracking the list of local endpoints still available - not yet used - for the relavant mptcp socket. Keep such map updated at endpoint creation/deleteion time, so that we can easily skip already used endpoint at local address selection time. This allows for fair local endpoints usage in case of subflow failure. As a side effect, this patch also enforces that each endpoint is used at most once for each mptcp connection. Signed-off-by: Paolo Abeni --- v3 -> v4: - track the available (not yet used) id instead of the used ones - track both - cleanup duplication with id_bitmap --- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 57 ++++++++++++++++++------------------------ net/mptcp/protocol.h | 3 +++ 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 761995a34124..d6d22f18c418 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -376,6 +376,7 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk) WRITE_ONCE(msk->pm.accept_subflow, false); WRITE_ONCE(msk->pm.remote_deny_join_id0, false); msk->pm.status =3D 0; + bitmap_fill(msk->pm.id_avail_bitmap, MAX_ADDR_ID + 1); =20 mptcp_pm_nl_data_init(msk); } diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index d18b13e3e74c..b3dc19fd1d37 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -38,9 +38,6 @@ struct mptcp_pm_add_entry { u8 retrans_times; }; =20 -#define MAX_ADDR_ID 255 -#define BITMAP_SZ DIV_ROUND_UP(MAX_ADDR_ID + 1, BITS_PER_LONG) - struct pm_nl_pernet { /* protects pernet updates */ spinlock_t lock; @@ -52,7 +49,7 @@ struct pm_nl_pernet { unsigned int local_addr_max; unsigned int subflows_max; unsigned int next_id; - unsigned long id_bitmap[BITMAP_SZ]; + DECLARE_BITMAP(id_bitmap, MAX_ADDR_ID + 1); }; =20 #define MPTCP_PM_ADDR_MAX 8 @@ -173,6 +170,9 @@ select_local_address(const struct pm_nl_pernet *pernet, if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW)) continue; =20 + if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) + continue; + if (entry->addr.family !=3D sk->sk_family) { #if IS_ENABLED(CONFIG_MPTCP_IPV6) if ((entry->addr.family =3D=3D AF_INET && @@ -183,23 +183,17 @@ select_local_address(const struct pm_nl_pernet *perne= t, continue; } =20 - /* avoid any address already in use by subflows and - * pending join - */ - if (!lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) { - ret =3D entry; - break; - } + ret =3D entry; + break; } rcu_read_unlock(); return ret; } =20 static struct mptcp_pm_addr_entry * -select_signal_address(struct pm_nl_pernet *pernet, unsigned int pos) +select_signal_address(struct pm_nl_pernet *pernet, struct mptcp_sock *msk) { struct mptcp_pm_addr_entry *entry, *ret =3D NULL; - int i =3D 0; =20 rcu_read_lock(); /* do not keep any additional per socket state, just signal @@ -208,12 +202,14 @@ select_signal_address(struct pm_nl_pernet *pernet, un= signed int pos) * can lead to additional addresses not being announced. */ list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (!test_bit(entry->addr.id, msk->pm.id_avail_bitmap)) + continue; + if (!(entry->flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) continue; - if (i++ =3D=3D pos) { - ret =3D entry; - break; - } + + ret =3D entry; + break; } rcu_read_unlock(); return ret; @@ -257,9 +253,11 @@ EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max); =20 static void check_work_pending(struct mptcp_sock *msk) { - if (msk->pm.add_addr_signaled =3D=3D mptcp_pm_get_add_addr_signal_max(msk= ) && - (msk->pm.local_addr_used =3D=3D mptcp_pm_get_local_addr_max(msk) || - msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk))) + struct pm_nl_pernet *pernet =3D net_generic(sock_net((struct sock *)msk),= pm_nl_pernet_id); + + if (msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk) || + (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, MAX_AD= DR_ID + 1, 0) =3D=3D + MAX_ADDR_ID + 1)) WRITE_ONCE(msk->pm.work_pending, false); } =20 @@ -481,21 +479,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) =20 /* check first for announce */ if (msk->pm.add_addr_signaled < add_addr_signal_max) { - local =3D select_signal_address(pernet, - msk->pm.add_addr_signaled); + local =3D select_signal_address(pernet, msk); =20 if (local) { if (mptcp_pm_alloc_anno_list(msk, local)) { + __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++; mptcp_pm_announce_addr(msk, &local->addr, false); mptcp_pm_nl_addr_send_ack(msk); } - } else { - /* pick failed, avoid fourther attempts later */ - msk->pm.local_addr_used =3D add_addr_signal_max; } - - check_work_pending(msk); } =20 /* check if should create a new subflow */ @@ -509,19 +502,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) int i, nr; =20 msk->pm.local_addr_used++; - check_work_pending(msk); nr =3D fill_remote_addresses_vec(msk, fullmesh, addrs); + if (nr) + __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); spin_unlock_bh(&msk->pm.lock); for (i =3D 0; i < nr; i++) __mptcp_subflow_connect(sk, &local->addr, &addrs[i]); spin_lock_bh(&msk->pm.lock); - return; } - - /* lookup failed, avoid fourther attempts later */ - msk->pm.local_addr_used =3D local_addr_max; - check_work_pending(msk); } + check_work_pending(msk); } =20 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) @@ -735,6 +725,7 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } + __set_bit(rm_list->ids[1], msk->pm.id_avail_bitmap); if (!removed) continue; =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 47d24478763c..b1ab476520aa 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -183,6 +183,8 @@ enum mptcp_addr_signal_status { MPTCP_RM_ADDR_SIGNAL, }; =20 +#define MAX_ADDR_ID 255 + struct mptcp_pm_data { struct mptcp_addr_info local; struct mptcp_addr_info remote; @@ -190,6 +192,7 @@ struct mptcp_pm_data { =20 spinlock_t lock; /*protects the whole PM data */ =20 + DECLARE_BITMAP(id_avail_bitmap, MAX_ADDR_ID + 1); u8 addr_signal; bool server_side; bool work_pending; --=20 2.33.1 From nobody Sat Apr 27 20:33:42 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp642350jap; Fri, 3 Dec 2021 07:20:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJwClbv/SITPjQVzpL/4riTM8Pq2AFaBCsk90BCEQ54lzHkyUjAEylkxi9OTUoCJNbyDcsgM X-Received: by 2002:ac8:7f02:: with SMTP id f2mr21030218qtk.147.1638544825116; Fri, 03 Dec 2021 07:20:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638544825; cv=none; d=google.com; s=arc-20160816; b=PoOH/kbi3H7vTUDp9bI4LKjugOZ9YJQZOK9W0Tk6HZrLkASZGdvmtA1Rew9QM5VllC D4VNmm7Lr0bUor537lVvYQ+PS6abjpU09NDCyZ383JiZLpckHHf7MxUV1RQ97qmR+t2O 2jxTyR/1OSulDucYBUZ8sCwUUdr340Kaop4ALCbqgyh5H41ulvp6izqOT7kPigW+1ssh 7vIMSZ0HREte53J3T77mXmVNJX1zCA1NNGkHdepVLqzNdZESFo1rmpVTQKulxg9KCg+j OyXgCyeiqUi3ZTOpjZ02Hckwn3Pn6qClT46PoPk9+Gow0k8jNDRovt7iiCQqnEuc2IsE tHxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=OjCcgUFDJ0xce/LzYHi1YlTD8yfZKpFWZx/UwR0YnHw=; b=E/1Teptfxijdu2jNmFEDY59Xgi2PDrHdIrZv8BKrwq6Cmq7LI8oPqZZglooAv3V8jC bzxSUZoyGmwRJIdlIq7094yqHOd/1yPMkkORqmbq7b0BsyDHuj5yvw5rkbyrCtEL04Ye MsJRN/4HLuevEysD2oPdjy9bmnOOubYIUEWZDWB5m22n3bGx1LwDosV5kWeEkN6tIWNJ rWyHvfnDY7iyCl1JzzpoO1NB3p9yT0Rwn+ruUfe0pYEl0/HqXTed4X4HR4bJYSHf8IAd /uGEFHY/AWKQ/05QgTHz35BmaXV/ymaILvQ5KX1o/vLaycebplpK/rw9wS8qX2BX0VNC omyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=SqZpG1SW; spf=pass (google.com: domain of mptcp+bounces-2618-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2618-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id gu5si3715237qvb.318.2021.12.03.07.20.25 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 07:20:25 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2618-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=SqZpG1SW; spf=pass (google.com: domain of mptcp+bounces-2618-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2618-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id CD5941C0D66 for ; Fri, 3 Dec 2021 15:20:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BC6AB2CAD; Fri, 3 Dec 2021 15:20:22 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5EE102C80 for ; Fri, 3 Dec 2021 15:20:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638544820; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=OjCcgUFDJ0xce/LzYHi1YlTD8yfZKpFWZx/UwR0YnHw=; b=SqZpG1SWnVDAPMfTUHdrrByDSWBMC/9aWZvQK1LoydUToDrwvRa6PI0Ew3PU4kANdD+Whn DKYh2NHCpst1mQ8YgCtNfvkTIEGOkQ6e+ouu6yvd2jOhx3gXj+Wp4coloRntE2Cbk9vHTs kWV2mdJ76w2K7MPD1fwM9G5ays0FG24= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-532-GIlPWkhRPS-29GfazJk0xQ-1; Fri, 03 Dec 2021 10:20:19 -0500 X-MC-Unique: GIlPWkhRPS-29GfazJk0xQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 8540280A1BD for ; Fri, 3 Dec 2021 15:20:18 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.192.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id EE95C5F4E0 for ; Fri, 3 Dec 2021 15:20:17 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 4/5] mptcp: do not block subflows creation on errors Date: Fri, 3 Dec 2021 16:19:41 +0100 Message-Id: <6b72cd85764a7c92f99741757b1e0e2b04f11f19.1638544716.git.pabeni@redhat.com> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If the MPTCP configuration allows for multiple subflows creation, and the first additional subflows never reach the fully established status - e.g. due to packets drop or reset - the in kernel path manager do not move to the next subflow. This patch introduces a new PM helper to cope with MPJ subflow creation failure and delay and hook it where appropriate. Such helper triggers additional subflow creation, as needed and updates the PM subflow counter, if the current one is closing. Note that we don't need an additional timer to catch timeout and/or long delay in connection completion: we just need to measure the time elapsed since the subflow creation every time we emit an MPJ sub-option. Signed-off-by: Paolo Abeni --- v3 -> v4: - fix 'subflows' underflow v2 -> v3: - fix compile warning (CI) v1 -> v2: - explicitly hook on subflow close instead of error notification - fix checkpatch issue (Mat) - introduce and use a new pm helper to cope with subflow close - update pm subflow counters on close --- net/mptcp/options.c | 21 ++++++++++++++++++--- net/mptcp/pm.c | 23 +++++++++++++++++++++-- net/mptcp/pm_netlink.c | 12 ++++++++---- net/mptcp/protocol.c | 6 ++++++ net/mptcp/protocol.h | 5 ++++- net/mptcp/subflow.c | 5 ++++- 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 7a6a39b71633..00a8697addcd 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1257,10 +1257,10 @@ static u16 mptcp_make_csum(const struct mptcp_ext *= mpext) void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp, struct mptcp_out_options *opts) { - if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) { - const struct sock *ssk =3D (const struct sock *)tp; - struct mptcp_subflow_context *subflow; + const struct sock *ssk =3D (const struct sock *)tp; + struct mptcp_subflow_context *subflow; =20 + if (unlikely(OPTION_MPTCP_FAIL & opts->suboptions)) { subflow =3D mptcp_subflow_ctx(ssk); subflow->send_mp_fail =3D 0; =20 @@ -1382,6 +1382,21 @@ void mptcp_write_options(__be32 *ptr, const struct t= cp_sock *tp, /* MPC is additionally mutually exclusive with MP_PRIO */ goto mp_capable_done; } else if (OPTIONS_MPTCP_MPJ & opts->suboptions) { + if (ssk) { + /* we are still in the MPJ handshake and "a lot" of time passed + * e.g. due to syn retranmissions. We can attempt next + * subflow creation + */ + subflow =3D mptcp_subflow_ctx(ssk); + if (subflow->start_stamp && + unlikely(after(tcp_jiffies32, subflow->start_stamp + HZ / 10))) { + mptcp_pm_subflow_check_next(mptcp_sk(subflow->conn), ssk, subflow); + + /* avoid triggering the PM multiple times due to timeout */ + subflow->start_stamp =3D 0; + } + } + if (OPTION_MPTCP_MPJ_SYN & opts->suboptions) { *ptr++ =3D mptcp_option(MPTCPOPT_MP_JOIN, TCPOLEN_MPTCP_MPJ_SYN, diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index d6d22f18c418..7e2c76924492 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -172,9 +172,28 @@ void mptcp_pm_subflow_established(struct mptcp_sock *m= sk) spin_unlock_bh(&pm->lock); } =20 -void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id) +void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock= *ssk, + const struct mptcp_subflow_context *subflow) { - pr_debug("msk=3D%p", msk); + struct mptcp_pm_data *pm =3D &msk->pm; + bool update_subflows; + + update_subflows =3D (ssk->sk_state =3D=3D TCP_CLOSE) && + (subflow->request_join || subflow->mp_join); + if (!READ_ONCE(pm->work_pending) && !update_subflows) + return; + + spin_lock_bh(&pm->lock); + if (update_subflows) + pm->subflows--; + + /* Even if this subflow is not really established, tell the PM to try + * to pick the next one, if possible. + */ + if (mptcp_pm_nl_check_work_pending(msk)) + mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED); + + spin_unlock_bh(&pm->lock); } =20 void mptcp_pm_add_addr_received(struct mptcp_sock *msk, diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index b3dc19fd1d37..48963ae4c610 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -251,14 +251,17 @@ unsigned int mptcp_pm_get_local_addr_max(struct mptcp= _sock *msk) } EXPORT_SYMBOL_GPL(mptcp_pm_get_local_addr_max); =20 -static void check_work_pending(struct mptcp_sock *msk) +bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk) { struct pm_nl_pernet *pernet =3D net_generic(sock_net((struct sock *)msk),= pm_nl_pernet_id); =20 if (msk->pm.subflows =3D=3D mptcp_pm_get_subflows_max(msk) || (find_next_and_bit(pernet->id_bitmap, msk->pm.id_avail_bitmap, MAX_AD= DR_ID + 1, 0) =3D=3D - MAX_ADDR_ID + 1)) + MAX_ADDR_ID + 1)) { WRITE_ONCE(msk->pm.work_pending, false); + return false; + } + return true; } =20 struct mptcp_pm_add_entry * @@ -511,7 +514,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(stru= ct mptcp_sock *msk) spin_lock_bh(&msk->pm.lock); } } - check_work_pending(msk); + mptcp_pm_nl_check_work_pending(msk); } =20 static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) @@ -718,11 +721,12 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mpt= cp_sock *msk, i, rm_list->ids[i], subflow->local_id, subflow->remote_id); spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); + + /* the following takes care of updating the subflows counter */ mptcp_close_ssk(sk, ssk, subflow); spin_lock_bh(&msk->pm.lock); =20 removed =3D true; - msk->pm.subflows--; __MPTCP_INC_STATS(sock_net(sk), rm_type); } __set_bit(rm_list->ids[1], msk->pm.id_avail_bitmap); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 8b49866bcc25..c9f302169145 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2351,6 +2351,12 @@ void mptcp_close_ssk(struct sock *sk, struct sock *s= sk, { if (sk->sk_state =3D=3D TCP_ESTABLISHED) mptcp_event(MPTCP_EVENT_SUB_CLOSED, mptcp_sk(sk), ssk, GFP_KERNEL); + + /* subflow aborted before reaching the fully_established status + * attempt the creation of the next subflow + */ + mptcp_pm_subflow_check_next(mptcp_sk(sk), ssk, subflow); + __mptcp_close_ssk(sk, ssk, subflow, MPTCP_CF_PUSH); } =20 diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index b1ab476520aa..3e7e541a013f 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -437,6 +437,7 @@ struct mptcp_subflow_context { stale : 1; /* unable to snd/rcv data, do not use for xmit */ enum mptcp_data_avail data_avail; u32 remote_nonce; + u32 start_stamp; u64 thmac; u32 local_nonce; u32 remote_token; @@ -738,7 +739,9 @@ void mptcp_pm_fully_established(struct mptcp_sock *msk,= const struct sock *ssk, bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk); void mptcp_pm_connection_closed(struct mptcp_sock *msk); void mptcp_pm_subflow_established(struct mptcp_sock *msk); -void mptcp_pm_subflow_closed(struct mptcp_sock *msk, u8 id); +bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk); +void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock= *ssk, + const struct mptcp_subflow_context *subflow); void mptcp_pm_add_addr_received(struct mptcp_sock *msk, const struct mptcp_addr_info *addr); void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 0f90bd61de01..76556743e952 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1273,7 +1273,8 @@ void __mptcp_error_report(struct sock *sk) =20 static void subflow_error_report(struct sock *ssk) { - struct sock *sk =3D mptcp_subflow_ctx(ssk)->conn; + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + struct sock *sk =3D subflow->conn; =20 mptcp_data_lock(sk); if (!sock_owned_by_user(sk)) @@ -1444,6 +1445,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, subflow->remote_id =3D remote_id; subflow->request_join =3D 1; subflow->request_bkup =3D !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP); + subflow->start_stamp =3D tcp_jiffies32; mptcp_info2sockaddr(remote, &addr, ssk->sk_family); =20 mptcp_add_pending_subflow(msk, subflow); @@ -1461,6 +1463,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, spin_lock_bh(&msk->join_list_lock); list_del(&subflow->node); spin_unlock_bh(&msk->join_list_lock); + mptcp_pm_subflow_check_next(msk, ssk, subflow); sock_put(mptcp_subflow_tcp_sock(subflow)); =20 failed: --=20 2.33.1 From nobody Sat Apr 27 20:33:42 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp642444jap; Fri, 3 Dec 2021 07:20:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJwnYzcg+2L95+ZC/49CRoauazWnDF4kQ6AtJ3VJES8KjezG979NfuChgEBqyFGWkL30sBKf X-Received: by 2002:ab0:6998:: with SMTP id t24mr22441726uaq.60.1638544827702; Fri, 03 Dec 2021 07:20:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1638544827; cv=none; d=google.com; s=arc-20160816; b=Fy5jk2dqDzeuTpSaJFr+BiuLTN/3/e6Mv6XNw4XO0fGbl7zYjuHSnoCSBTi2kX/xbL Ft23WX6zNjAkb3FECjZG/DGx5T5mQugq6ogi89/XHEkRyMG84Y+yga7oP2j9y5BgTnIF ofdLVt0v+L2nnug+1V6KRGUu6Nshrya0BIt2pBRqIivw5S15kNDOatOPEVGt2i1BX4ax 09ICmHhbcTDhAhxdzQucvQEam5jdJjWWD6HVmPHlLPLf3n6reBmMokloeG9/GfWNpXpN Ez0/mEgzOjIpWdjjlBd0Jr7RM45hnsvECpmdL6sPm9OcFQKUiR5Wzs77xMiGdR2dN40L sjHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=xLaRfrJvXNIttTyMpF6ppBwHGuxUDeimKIRNkm4UJ78=; b=vRzu1hWI7YzBZuUKCNcbDn0FB8p0Xxm0K9ePndcASg/wCiX4m1sAs3+V1KZnUqSs7M zxVz4/ULingoPB971dY7axDiXPIU+XDZPFlM9eUo0D+L0j+GtvtlrsXFVwUnacwdPAzR lXiyqBwKYEgB30ZbH+GB+JCA7rzV/rcqg4AW1SgFXam9u5oDAPa6LzS2YuAo6lVxLWW1 Ji4DSkQvA97BRacbW15ulPDvdCw1x1FAOxBUSfCZByshib6+2hDf95ZLhRAbyQJPiF9R 3S0WNYj6dzBRmzxK947Byh5rPYBhYg+jd/gHDZ+L1Gd0ydMLwpj11BtWYpYYakDAuZFv Bzyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EDquj4Ur; spf=pass (google.com: domain of mptcp+bounces-2620-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2620-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id e185si2814329vkh.216.2021.12.03.07.20.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Dec 2021 07:20:27 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2620-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=EDquj4Ur; spf=pass (google.com: domain of mptcp+bounces-2620-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2620-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 52B451C0F17 for ; Fri, 3 Dec 2021 15:20:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A2D8B68; Fri, 3 Dec 2021 15:20:23 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D41E2CA6 for ; Fri, 3 Dec 2021 15:20:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1638544821; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xLaRfrJvXNIttTyMpF6ppBwHGuxUDeimKIRNkm4UJ78=; b=EDquj4UrT2dioN2dlwIa3+17EXeJIXNBdxOpM6NhBxEisz8G6pPxCDVELepoRG9zYoSVh5 YTn2wFmRv7z0anI3jPQPaFPE9oaBonKHbX+qHsqfGfV+RB2mNN+NPEZtEF3Im3NGJF94pu y4bI2nnktHkj1R1OzfsGCzf7h0hgxNU= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-572-Mhluw2EjM2Saenjsfyj4MQ-1; Fri, 03 Dec 2021 10:20:20 -0500 X-MC-Unique: Mhluw2EjM2Saenjsfyj4MQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 78E4F101F000 for ; Fri, 3 Dec 2021 15:20:19 +0000 (UTC) Received: from gerbillo.fritz.box (unknown [10.39.192.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id D98875F4E0 for ; Fri, 3 Dec 2021 15:20:18 +0000 (UTC) From: Paolo Abeni To: mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 5/5] selftests: mptcp: add tests for subflow creation failure Date: Fri, 3 Dec 2021 16:19:42 +0100 Message-Id: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=pabeni@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Verify that, when multiple endpoints are available, subflows creation proceed even when the first additional subflow creation fails - due to packet drop on the relevant link Signed-off-by: Paolo Abeni --- v3 -> v4: - use $() where applicable - Matt - fix typo in help() - Matt v1 -> v2: - add missing NF kconfig - add more test-cases (drop, later subflow creation) --- tools/testing/selftests/net/mptcp/config | 1 + .../testing/selftests/net/mptcp/mptcp_join.sh | 65 ++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/config b/tools/testing/selft= ests/net/mptcp/config index 419e71560fd1..41e94e004bdc 100644 --- a/tools/testing/selftests/net/mptcp/config +++ b/tools/testing/selftests/net/mptcp/config @@ -18,4 +18,5 @@ CONFIG_NFT_TPROXY=3Dm CONFIG_NFT_SOCKET=3Dm CONFIG_IP_ADVANCED_ROUTER=3Dy CONFIG_IP_MULTIPLE_TABLES=3Dy +CONFIG_IP_NF_TARGET_REJECT=3Dm CONFIG_IPV6_MULTIPLE_TABLES=3Dy diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testin= g/selftests/net/mptcp/mptcp_join.sh index 2684ef9c0d42..54a826ae984b 100755 --- a/tools/testing/selftests/net/mptcp/mptcp_join.sh +++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh @@ -975,6 +975,22 @@ chk_link_usage() fi } =20 +wait_for_tw() +{ + local timeout_ms=3D$((timeout_poll * 1000)) + local time=3D0 + local ns=3D$1 + + while [ $time -lt $timeout_ms ]; do + local cnt=3D$(ip netns exec $ns ss -t state time-wait |wc -l) + + [ "$cnt" =3D 1 ] && return 1 + time=3D$((time + 100)) + sleep 0.1 + done + return 1 +} + subflows_tests() { reset @@ -1032,6 +1048,48 @@ subflows_tests() chk_join_nr "single subflow, dev" 1 1 1 } =20 +subflows_error_tests() +{ + # multiple subflows, with subflow creation error + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow + chk_join_nr "multiple subflows, with failing subflow" 1 1 1 + + # multiple subflows, with subflow timeout on MPJ + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl limits 0 2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j DROP + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow + chk_join_nr "multiple subflows, with subflow timeout" 1 1 1 + + # multiple subflows, check that the endpoint corresponding to + # closed subflow (due to reset) is not reused if additional + # subflows are added later + reset + ip netns exec $ns1 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl limits 0 1 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.3.2 flags subflow + ip netns exec $ns1 iptables -A INPUT -s 10.0.3.2 -p tcp -j REJECT + run_tests $ns1 $ns2 10.0.1.1 0 0 0 slow & + + # mpj subflow will be in TW after the reset + wait_for_tw $ns2 + ip netns exec $ns2 ./pm_nl_ctl add 10.0.2.2 flags subflow + wait + + # additional subflow could be created only if the PM select + # the later endpoint, skipping the already used one + chk_join_nr "multiple subflows, fair usage on close" 1 1 1 +} + signal_address_tests() { # add_address, unused @@ -1840,6 +1898,7 @@ fullmesh_tests() all_tests() { subflows_tests + subflows_error_tests signal_address_tests link_failure_tests add_addr_timeout_tests @@ -1859,6 +1918,7 @@ usage() { echo "mptcp_join usage:" echo " -f subflows_tests" + echo " -e subflows_error_tests" echo " -s signal_address_tests" echo " -l link_failure_tests" echo " -t add_addr_timeout_tests" @@ -1907,11 +1967,14 @@ if [ $do_all_tests -eq 1 ]; then exit $ret fi =20 -while getopts 'fsltra64bpkdmchCS' opt; do +while getopts 'fesltra64bpkdmchCS' opt; do case $opt in f) subflows_tests ;; + e) + subflows_error_tests + ;; s) signal_address_tests ;; --=20 2.33.1