From patchwork Thu Jul 30 11:06:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1338763 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=eBTcatGx; 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 4BHSbv1YjLz9sR4 for ; Thu, 30 Jul 2020 21:19:23 +1000 (AEST) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 7A8CA12747226; Thu, 30 Jul 2020 04:19:20 -0700 (PDT) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::644; helo=mail-pl1-x644.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) (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 BA6FC12747224 for ; Thu, 30 Jul 2020 04:19:18 -0700 (PDT) Received: by mail-pl1-x644.google.com with SMTP id d1so13786139plr.8 for ; Thu, 30 Jul 2020 04:19:18 -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=Xp9JE9Cdn3ZklfqSgYL4j85hYQZfVtBzgY9sxFJd7Dk=; b=eBTcatGxXEJZ9yZMbwPNL1ilIWM+E+Hu3ACp7A6FBObfvn9DKd8dYht7uvF/GsMP5U hwm3Yp4lr6d0qjg7GOImRHsO3LrEhCOaXMYUP9y0bdjqEi6R+/Y9gP2v+Ou0pKohaKd8 qz4o6pd876suQvt7DfUmw9b58uo7ZGZ1YKbI4oLpnQCdgUvCtc/AY4fITR2N8ZemGn6y NkJG82Ob5x2PLEmi717W7eoscPlHs6RLjDqhBmBZK9hTBfqKVUfoANOFCY62iu0F8NPX srLMIsST6JG+yC7a0V30bd107W3M90N/8tYt7+hlpmGFf9q3u26dAQy4Y3jMRaKrUBfJ /JjQ== 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=Xp9JE9Cdn3ZklfqSgYL4j85hYQZfVtBzgY9sxFJd7Dk=; b=eM5KQZeU2fN1iFyTxzADwCMNbOxxActtlCrg2b9B/8WdZHUmgrDPqQqAoSF692Hkpk bIndHQPaNE9FUXSLkpPGQK1gD0ldrkoNWB4BOQakirbRHqZ0U2l4N8Uzr4u1ZzVA1q9I kkRzSUc/u0ZvB4JiFCYOTPsvKddxjcRHSwvCOkE4jLNwYaRUvR+QOP9K51TkHRs1VJce 71pqHL1XVR+Zck427XHNfZwpZOkeCsjEOHxejS6dqkGMBl6mjkQ2JPcvR9GpaHzRFJlB MZse51vFbBm0aZNHce0p78lO8wg64UUB5ig0ZAUwtYt/RNyg6K5SlKgsI0OAHT7zel99 iOrQ== X-Gm-Message-State: AOAM532/4LcXFeZ4v/KHE7FupAmqKvt08X+vZJlaVh8qP36KozXAt+c6 DQR9vMTFV52AFAizcqLfw1PmzSf3zkE= X-Google-Smtp-Source: ABdhPJy9eat2fcsZP//WuJEqueWE3MHOddMj2JnxT5LFTTGAnnBip7gh8yBcS0lIs89l9GWmI75sCQ== X-Received: by 2002:a17:90a:1901:: with SMTP id 1mr2842471pjg.199.1596107957717; Thu, 30 Jul 2020 04:19:17 -0700 (PDT) Received: from localhost ([43.224.245.180]) by smtp.gmail.com with ESMTPSA id h7sm5942826pfq.15.2020.07.30.04.19.16 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 30 Jul 2020 04:19:17 -0700 (PDT) From: Geliang Tang To: mptcp@lists.01.org Date: Thu, 30 Jul 2020 19:06:03 +0800 Message-Id: X-Mailer: git-send-email 2.17.1 In-Reply-To: References: In-Reply-To: <0681c7c5395956c6687108ca4ba7e9daba78a047.1596106606.git.geliangtang@gmail.com> References: <259cb712f796f4b1e9c22e5d65de7ca15755dcd5.1596106606.git.geliangtang@gmail.com> <0681c7c5395956c6687108ca4ba7e9daba78a047.1596106606.git.geliangtang@gmail.com> Message-ID-Hash: HLNCWS4UQZEJZWW6DHIOR2NAGFSIOS3R X-Message-ID-Hash: HLNCWS4UQZEJZWW6DHIOR2NAGFSIOS3R 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 v4 mptcp-next 5/5] mptcp: add remove subflow support List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 This patch added a new function mptcp_nl_remove_subflow to handle the 'MPTCP_PM_ADDR_FLAG_SUBFLOW' flag case. Do the local subflow removing in this function. Signed-off-by: Geliang Tang --- net/mptcp/pm_netlink.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index b9f0622e4082..e1fcd0ff0624 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -304,7 +304,8 @@ void mptcp_pm_nl_rm_addr_received(struct mptcp_sock *msk) int how = RCV_SHUTDOWN | SEND_SHUTDOWN; long timeout = 0; - if (msk->pm.rm_id == subflow->remote_id) { + if (msk->pm.rm_id == subflow->remote_id || + msk->pm.rm_id == subflow->local_id) { spin_unlock_bh(&msk->pm.lock); mptcp_subflow_shutdown(sk, ssk, how); __mptcp_close_ssk(sk, ssk, subflow, timeout); @@ -593,6 +594,29 @@ static void mptcp_nl_remove_addr(struct sk_buff *skb, struct mptcp_addr_info *ad } } +static void mptcp_nl_remove_subflow(struct sk_buff *skb, struct mptcp_addr_info *addr) +{ + struct mptcp_sock *msk; + long s_slot = 0, s_num = 0; + struct net *net = sock_net(skb->sk); + + while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { + struct mptcp_subflow_context *subflow, *tmp; + struct sock *sk = (struct sock *)msk; + + pr_debug("msk=%p\n", msk); + list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) { + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); + struct mptcp_addr_info local; + + local_address((struct sock_common *)ssk, &local); + if (addresses_equal(&local, addr, false)) + mptcp_pm_rm_addr_received(msk, addr->id); + } + sock_put(sk); + } +} + static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info) { struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; @@ -615,8 +639,10 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info) pernet->add_addr_signal_max--; mptcp_nl_remove_addr(skb, &entry->addr); } - if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) + if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) { pernet->local_addr_max--; + mptcp_nl_remove_subflow(skb, &entry->addr); + } pernet->addrs--; list_del_rcu(&entry->list);