From patchwork Wed Sep 2 09:38:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1355638 X-Patchwork-Delegate: matthieu.baerts@tessares.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.01.org (client-ip=198.145.21.10; helo=ml01.01.org; envelope-from=mptcp-bounces@lists.01.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=JGfhKGmj; dkim-atps=neutral Received: from ml01.01.org (ml01.01.org [198.145.21.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BhJvg5HZHz9sTN for ; Wed, 2 Sep 2020 19:45:19 +1000 (AEST) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 6FDAE1396FC01; Wed, 2 Sep 2020 02:45:17 -0700 (PDT) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::1033; helo=mail-pj1-x1033.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D1F4012890A5C for ; Wed, 2 Sep 2020 02:45:15 -0700 (PDT) Received: by mail-pj1-x1033.google.com with SMTP id o16so2108671pjr.2 for ; Wed, 02 Sep 2020 02:45:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=hCOfvLuUFBqNXxcWLqNOUa1fodNoTPEfstG/WybEPwI=; b=JGfhKGmjAIjwPBADcYadbnyeQAClmSld409w+PtuspURPo1c7nUAwpKhs8y5t8a/6E N9IvNF7lhc/Ijx2VSPYGDZjRhIqCM3O5s8D/ekvh0BV0ckh/FVkJD3M0nHgS+nJsYxXl Hx4CITabsdEnIBY9yN4ZmnTvkM5Sexc5QqwBj69rIO4nzPtEAhdhjsUcR1ts0gmVIezg pdOUWkTN35DWUdQHI03Yl9yUCbZqmskul6BAQB8xNCF4dubRGEVgElPlL+1Ai9NpDYL5 iz0E8LDmA2+EBrXctbISMIWkSkaVby9nZjilWhCE27SnZRmNZJ6F7KRFgLZcA67KwSSv kTRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=hCOfvLuUFBqNXxcWLqNOUa1fodNoTPEfstG/WybEPwI=; b=G4BQRzz5HfATSGfGq1mWtt3oUwLEWbEz4bcsWtM+wp8kY6egsKw83SUZ+Elx4C18L0 EcXEJkednfzu/K4eknAgybA1gOcESyex+mIMqc8UuzR0Jk1oP+rNl8NOE1+cxBoqHcZY c3YoCnQrXSQVtmZbfuFfJnniFnoIYKieWXtRKwJ/sNcfthEvpDJxaj8h1AhYKOHAwxuE nFV+RWpyg/T8j/OSOpEQcIuuOLQp07ls931JhjIvsXB4+xA6orp2UKUWpbbmMYvOlsMY EVq/glRnMrg6RgVlhwqdqzKQxGp/7cUDRsqCemII69hH/9sU36yVoiAlktCFmjdoy6Du jBcA== X-Gm-Message-State: AOAM533scyWBq49FpAPNIWxvqt2nrNNCSVTICdFIqJnQ+P0u3g+8fREl 52X76fXMdGtb7VhitpB2RHbX8tpTuGzY3Qhw X-Google-Smtp-Source: ABdhPJz0lNxlXUWmhAB2RqTyKJrQu2/cR0g9+G7jmfWVnL/ZDBUfS7NaSTxn2I91TCjTDrZ+Vt+EEg== X-Received: by 2002:a17:90b:34e:: with SMTP id fh14mr1575425pjb.186.1599039914939; Wed, 02 Sep 2020 02:45:14 -0700 (PDT) Received: from localhost ([43.224.245.180]) by smtp.gmail.com with ESMTPSA id x140sm4754568pfc.211.2020.09.02.02.45.13 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Sep 2020 02:45:14 -0700 (PDT) From: Geliang Tang To: mptcp@lists.01.org Date: Wed, 2 Sep 2020 17:38:24 +0800 Message-Id: <94cf2fa9bb4edce5789f17d57d10baba2eb4eb74.1599038897.git.geliangtang@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: References: Message-ID-Hash: GUQBJJTMXO7UPMVDZOYBGALDHJMVZC2U X-Message-ID-Hash: GUQBJJTMXO7UPMVDZOYBGALDHJMVZC2U X-MailFrom: geliangtang@gmail.com X-Mailman-Rule-Hits: member-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address CC: Geliang Tang X-Mailman-Version: 3.1.1 Precedence: list Subject: [MPTCP] [MPTCP][PATCH v9 mptcp-next 2/8] mptcp: fix mptcp_pm_nl_rm_addr_received logic issue List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 We want to use mptcp_pm_nl_rm_addr_received to deal with both removing an address and removing a subflow. But it not work. Here is the problem: Suppose there are three subflows, 1 local_id=0 remote_id=0 2 local_id=0 remote_id=1 3 local_id=1 remote_id=0. Here we want to remove the local subflow, the No.3 subflow, so we passed msk->pm.rm_id=1 to mptcp_pm_nl_rm_addr_received. According to this logic, if (msk->pm.rm_id != subflow->remote_id && msk->pm.rm_id != subflow->local_id) We removed the wrong subflow, the No.2 subflow. So we need to deal with removing an address and removing a subflow separately. We check subflow->remote_id in mptcp_pm_nl_rm_addr_received to remove an address and check subflow->local_id in mptcp_pm_nl_rm_subflow_received to remove a subflow. Suggested-by: Matthieu Baerts Suggested-by: Paolo Abeni Suggested-by: Mat Martineau Signed-off-by: Geliang Tang --- net/mptcp/pm_netlink.c | 45 ++++++++++++++++++++++++++++++++++++------ net/mptcp/protocol.h | 1 + 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 16709939f767..4e6c141b810f 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -265,7 +265,7 @@ void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) struct mptcp_subflow_context *subflow, *tmp; struct sock *sk = (struct sock *)msk; - pr_debug("rm_id %d", msk->pm.rm_id); + pr_debug("address rm_id %d", msk->pm.rm_id); if (!msk->pm.rm_id) return; @@ -273,23 +273,56 @@ void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) if (list_empty(&msk->conn_list)) return; - msk->pm.add_addr_accepted--; - msk->pm.subflows--; - WRITE_ONCE(msk->pm.accept_addr, true); + list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + int how = RCV_SHUTDOWN | SEND_SHUTDOWN; + long timeout = 0; + + if (msk->pm.rm_id != subflow->remote_id) + continue; + + spin_unlock_bh(&msk->pm.lock); + mptcp_subflow_shutdown(sk, ssk, how); + __mptcp_close_ssk(sk, ssk, subflow, timeout); + spin_lock_bh(&msk->pm.lock); + + msk->pm.add_addr_accepted--; + msk->pm.subflows--; + WRITE_ONCE(msk->pm.accept_addr, true); + + break; + } +} + +void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id) +{ + struct mptcp_subflow_context *subflow, *tmp; + struct sock *sk = (struct sock *)msk; + + pr_debug("subflow rm_id %d", rm_id); + + if (!rm_id) + return; + + if (list_empty(&msk->conn_list)) + return; list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { struct sock *ssk = mptcp_subflow_tcp_sock(subflow); int how = RCV_SHUTDOWN | SEND_SHUTDOWN; long timeout = 0; - if (msk->pm.rm_id != subflow->remote_id && - msk->pm.rm_id != subflow->local_id) + if (rm_id != subflow->local_id) continue; spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); __mptcp_close_ssk(sk, ssk, subflow, timeout); spin_lock_bh(&msk->pm.lock); + + msk->pm.local_addr_used--; + msk->pm.subflows--; + break; } } diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index ba253a6947b0..703fb1f1d0ce 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -477,6 +477,7 @@ void mptcp_pm_nl_fully_established(struct mptcp_sock *msk); void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk); void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk); void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk); +void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk, u8 rm_id); int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); static inline struct mptcp_ext *mptcp_get_ext(struct sk_buff *skb)