From patchwork Fri Feb 5 14:24:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1436671 X-Patchwork-Delegate: mathew.j.martineau@linux.intel.com 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; 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=noOhqXJv; 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 4DXHkY0wByz9sVm for ; Sat, 6 Feb 2021 01:25:08 +1100 (AEDT) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id E90A9100EA2DB; Fri, 5 Feb 2021 06:25:06 -0800 (PST) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::62b; helo=mail-pl1-x62b.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) (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 CF9AF100ED48A for ; Fri, 5 Feb 2021 06:25:03 -0800 (PST) Received: by mail-pl1-x62b.google.com with SMTP id u11so3611525plg.13 for ; Fri, 05 Feb 2021 06:25:03 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=CDmt7u9wQP/Ztbw6jgkoVAmpQPJCO0yOdx39ANZwP7o=; b=noOhqXJvJ+njXKS6XPFfLKVFnfXJWVNmwku+sCuRxTe6FlVQKRsoSbZAxcj4ry9Os3 KTltBNYqQzuXix09JX7pp0/lMKgaREoVEQpa0ByH/G6EkH0Vrhc9BWdhcZPoPdRuGTiX a/dnqu3dlPmBjPhdQk2CIROmzURkFP1I4U76DI0nLeGCcgelwpzBz0sXSi2kQlFhvYcN lSch35JtfTDeSp+u1uRx+jmuC50JqNEVj/3op3zgWOm+EVZ27/TWFmm3lJ0awfbvFbLN lI7+VdG8RPMfq3XjCEUHbIIer1o8TY2rEh/l5/USgpwP1zf4GfodWzgZP0VHfekopANp 38Dw== 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:mime-version:content-transfer-encoding; bh=CDmt7u9wQP/Ztbw6jgkoVAmpQPJCO0yOdx39ANZwP7o=; b=krgJ4SgUXENEWOItJVCBCaAiJnu4cJ1/h1TRFKkKp4YnQI5E+2AuBHyzWfeUrNrLY2 WzxxjAXs6YPZ/4UENi0zu/N/yevEuOokqEpdS5bwVE3p+588u9LMUWF/9xyJlTOGrpUO WWBE/oquYsx08j5q/c143hMNv4LltNCrkAoUE7A9hO0S/UEuZF7ho325m+zJcvZGBpFU F7AbVziNcy4d+OZJ08LDowpJb1VhwKKKk3kVK53n31A3juGqG5Wr0CyhnXPLzOskAXG5 iAqPRdZirdshg9A4+ix8dEEsM5tPFqSC/4hJX/b6A3E8kkpmqZGvKVWscj4vGt2md1EM kY2Q== X-Gm-Message-State: AOAM5324SvmrcHB0GSeAB8EIIkL9DJrHDvDhOD0WFU8PEoZmjbV6b7GX AVXCjCUY9Yjx6OcE975tUsW2vmMWVBZ8xw== X-Google-Smtp-Source: ABdhPJw/iUBrHF27EcySGP0TcMJ/3SoMI7zGzIIYaZFTmDcEsapbicwOLENv2PJC+xQTfFt2pjeb7w== X-Received: by 2002:a17:90a:e00f:: with SMTP id u15mr4487114pjy.3.1612535102802; Fri, 05 Feb 2021 06:25:02 -0800 (PST) Received: from localhost ([43.224.245.180]) by smtp.gmail.com with ESMTPSA id s18sm7292635pfm.129.2021.02.05.06.25.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 05 Feb 2021 06:25:02 -0800 (PST) From: Geliang Tang To: mptcp@lists.01.org Date: Fri, 5 Feb 2021 22:24:31 +0800 Message-Id: <2e1e50023c1ca80e9737681fad83623f0be05a6f.1612534634.git.geliangtang@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <4150034f6f320da03b19c30b91798ad3fc3bb6ba.1612534634.git.geliangtang@gmail.com> References: <7d72dee8595a08b314a5e97300b2d839058c3596.1612534634.git.geliangtang@gmail.com> <6aa788764dc5d769523835ebdec053c8ee391eec.1612534634.git.geliangtang@gmail.com> <242379f38b7038fc14cd0397449bd782237639af.1612534634.git.geliangtang@gmail.com> <3cf42c12a72c462884a26d6c5fe6721c66070fc7.1612534634.git.geliangtang@gmail.com> <4150034f6f320da03b19c30b91798ad3fc3bb6ba.1612534634.git.geliangtang@gmail.com> MIME-Version: 1.0 Message-ID-Hash: LXFWY3QVXWLBKZA7R52IJHKVX2CBN457 X-Message-ID-Hash: LXFWY3QVXWLBKZA7R52IJHKVX2CBN457 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 7/9] mptcp: remove multi addresses and subflows in PM List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: This patch implemented the function to remove a list of addresses and subflows, named mptcp_nl_remove_addrs_list, which had a input parameter rm_list as the removing addresses list. In mptcp_nl_remove_addrs_list, traverse all the existing msk sockets to invoke mptcp_pm_remove_addrs_and_subflows to remove a list of addresses for each msk socket. In mptcp_pm_remove_addrs_and_subflows, traverse all the addresses in the removing addresses list, to find whether this address is in the conn_list or anno_list. If it is, put the address ID into the removing address ids array, and pass the array to mptcp_pm_remove_addr or mptcp_pm_remove_subflow. Signed-off-by: Geliang Tang --- net/mptcp/pm_netlink.c | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index b4d6f7b56a65..392aa4dc0834 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1213,6 +1213,58 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info) return ret; } +static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list) +{ + struct mptcp_pm_addr_entry *entry; + u8 subflow_ids[MPTCP_RM_IDS_MAX]; + u8 address_ids[MPTCP_RM_IDS_MAX]; + int i = 0, j = 0; + + memset(subflow_ids, MAX_ADDR_ID, MPTCP_RM_IDS_MAX); + memset(address_ids, MAX_ADDR_ID, MPTCP_RM_IDS_MAX); + + list_for_each_entry(entry, rm_list, list) { + if (lookup_subflow_by_saddr(&msk->conn_list, &entry->addr) && i < MPTCP_RM_IDS_MAX) + subflow_ids[i++] = entry->addr.id; + else if (remove_anno_list_by_saddr(msk, &entry->addr) && j < MPTCP_RM_IDS_MAX) + address_ids[j++] = entry->addr.id; + } + + if (mptcp_get_rm_ids_nr(subflow_ids)) { + spin_lock_bh(&msk->pm.lock); + mptcp_pm_remove_addr(msk, subflow_ids); + spin_unlock_bh(&msk->pm.lock); + mptcp_pm_remove_subflow(msk, subflow_ids); + } + if (mptcp_get_rm_ids_nr(address_ids)) { + spin_lock_bh(&msk->pm.lock); + mptcp_pm_remove_addr(msk, address_ids); + spin_unlock_bh(&msk->pm.lock); + } +} + +static void mptcp_nl_remove_addrs_list(struct net *net, + struct list_head *rm_list) +{ + long s_slot = 0, s_num = 0; + struct mptcp_sock *msk; + + if (list_empty(rm_list)) + return; + + while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { + struct sock *sk = (struct sock *)msk; + + lock_sock(sk); + mptcp_pm_remove_addrs_and_subflows(msk, rm_list); + release_sock(sk); + + sock_put(sk); + cond_resched(); + } +} + static void __flush_addrs(struct net *net, struct list_head *list) { while (!list_empty(list)) {