From patchwork Wed Dec 9 08:15:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 1413270 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=2001:19d0:306:5::1; 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=kVbH023j; dkim-atps=neutral Received: from ml01.01.org (ml01.01.org [IPv6:2001:19d0:306:5::1]) (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 4CrVTf4ksYz9sW8 for ; Wed, 9 Dec 2020 19:24:54 +1100 (AEDT) Received: from ml01.vlan13.01.org (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 84053100EBBD6; Wed, 9 Dec 2020 00:24:52 -0800 (PST) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::444; helo=mail-pf1-x444.google.com; envelope-from=geliangtang@gmail.com; receiver= Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) (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 7A6AA100ED4A7 for ; Wed, 9 Dec 2020 00:24:49 -0800 (PST) Received: by mail-pf1-x444.google.com with SMTP id i3so537613pfd.6 for ; Wed, 09 Dec 2020 00:24:49 -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=BLON3TIDClV0At9gCOAKGCWk6sKDuOzGMMThJlMGBcA=; b=kVbH023jZhuUncU/RiiYB4TWVEpbpjNS9cjtY4Sz5RuQs1+4RqsGsX9XOnTgoJ1Tlg JvIUUBZRN3wDaKnlqBqgJG5v281c3u3FsVqrjkhuBeIHKSD+olNHkjIb4z5kNW5wj+4E LdJGQcP0ZYRp4mttdxBL8SpTr97XKi4fg42eHCwyvuye7Y1FlywpR5lgi7dN+MCKjor/ aekWzS0SZDGsAHhav4zado6n7Z9PMruPnwf1ik7F7VqSaIygGlckpUDGzHQK2TZo3R4R Wz5eXyQa2CQae9tk6Q7gcrrb9SivDLrBF6JdqeldhW++e0tkMIM1vgjI9dRz/0txj2ys 2DlA== 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=BLON3TIDClV0At9gCOAKGCWk6sKDuOzGMMThJlMGBcA=; b=PQ2XjjQO4vmts9t9XTiZr3AIMMggU+LRUJOvDrq3T8a2VTvaYKvg3iWiUFSZutjw+w uMsga4/+rDUVqeeA6rhNFY3AR/tqgeV2VZhKIcyUt1ss4RUf1+rTCexmjUaUGjYVHraC 2qGReZQC1VwDLtbhCXZfyTEmwlo18g7Vo7CUfnxpRW1hLLBpainDwrJc0qOK+/fry2xC es61q6wFmjTqKS4ek6tDuAqFTPmtIcWt9tP6BC9dqLaiE6U8FP/ubM88qG6ExEnMfO3Q aQj9mPpn9fnNVxaw4E/G1MMPeEZMNfwG0gvSsWd8pSTE0gmQycwxg6sZD3eWGPd5mnt2 CMWg== X-Gm-Message-State: AOAM531n8h/4Fj/VUgrrjgDPb3NvMg/eQ5no8fvTqyW/O/WdSmAtDaak N+4GFi/Jrr8wW2hDDd/y88ypgilzzjQ4sQ== X-Google-Smtp-Source: ABdhPJwg4nFJAIonroWLt7SdD4AtVrrG3GYjIWKlIaFgDdpfUR0OzWB6oVeNt1tgG5kJdVZkF95MAA== X-Received: by 2002:a65:52c1:: with SMTP id z1mr1028719pgp.46.1607502288748; Wed, 09 Dec 2020 00:24:48 -0800 (PST) Received: from localhost ([43.224.245.179]) by smtp.gmail.com with ESMTPSA id d142sm1474332pfd.6.2020.12.09.00.24.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Dec 2020 00:24:48 -0800 (PST) From: Geliang Tang To: mptcp@lists.01.org Date: Wed, 9 Dec 2020 16:15:43 +0800 Message-Id: <3639b094ea3ddc00ace88c000285558031d5951e.1607501232.git.geliangtang@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <9ecbaa6fd875c1d78b236fc76406d66797dc1d90.1607501232.git.geliangtang@gmail.com> References: <9ecbaa6fd875c1d78b236fc76406d66797dc1d90.1607501232.git.geliangtang@gmail.com> MIME-Version: 1.0 Message-ID-Hash: FNN7ZTMDFL5LASURZB5SNSLQAWCNU2PU X-Message-ID-Hash: FNN7ZTMDFL5LASURZB5SNSLQAWCNU2PU 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 v3 mptcp-next 3/6] mptcp: add set_flags command in PM netlink List-Id: Discussions regarding MPTCP upstreaming Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: This patch added a new command MPTCP_PM_CMD_SET_FLAGS in PM netlink: In mptcp_nl_cmd_set_flags, parse the input address, get the backup value according to whether the address's FLAG_BACKUP flag is set from the user-space. Then check whether this address had been added in the local address list. If it had been, then call mptcp_nl_addr_backup to deal with this address. In mptcp_nl_addr_backup, traverse all the existing msk sockets to find the relevant sockets, and call mptcp_pm_nl_mp_prio_send_ack to send out a MP_PRIO ACK packet. Finally in mptcp_nl_cmd_set_flags, set or clear the address's FLAG_BACKUP flag. Signed-off-by: Geliang Tang --- include/uapi/linux/mptcp.h | 1 + net/mptcp/pm_netlink.c | 65 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 9762660df741..3674a451a18c 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -82,6 +82,7 @@ enum { MPTCP_PM_CMD_FLUSH_ADDRS, MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, + MPTCP_PM_CMD_SET_FLAGS, __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index db5de5dd5325..3f8f3052e013 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1164,6 +1164,66 @@ mptcp_nl_cmd_get_limits(struct sk_buff *skb, struct genl_info *info) return -EMSGSIZE; } +static int mptcp_nl_addr_backup(struct net *net, + struct mptcp_addr_info *addr, + u8 bkup) +{ + long s_slot = 0, s_num = 0; + struct mptcp_sock *msk; + int ret = -EINVAL; + + while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) { + struct sock *sk = (struct sock *)msk; + + if (list_empty(&msk->conn_list)) + goto next; + + lock_sock(sk); + spin_lock_bh(&msk->pm.lock); + ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup); + spin_unlock_bh(&msk->pm.lock); + release_sock(sk); + +next: + sock_put(sk); + cond_resched(); + } + + return ret; +} + +static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; + struct pm_nl_pernet *pernet = genl_info_pm_nl(info); + struct mptcp_pm_addr_entry addr, *entry; + struct net *net = sock_net(skb->sk); + u8 bkup = 0; + int ret; + + ret = mptcp_pm_parse_addr(attr, info, true, &addr); + if (ret < 0) + return ret; + + if (addr.addr.flags & MPTCP_PM_ADDR_FLAG_BACKUP) + bkup = 1; + + list_for_each_entry(entry, &pernet->local_addr_list, list) { + if (addresses_equal(&entry->addr, &addr.addr, true)) { + ret = mptcp_nl_addr_backup(net, &entry->addr, bkup); + if (ret) + return ret; + + if (bkup) + entry->addr.flags |= MPTCP_PM_ADDR_FLAG_BACKUP; + else + entry->addr.flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; + } + } + + return 0; +} + static const struct genl_small_ops mptcp_pm_ops[] = { { .cmd = MPTCP_PM_CMD_ADD_ADDR, @@ -1194,6 +1254,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = { .cmd = MPTCP_PM_CMD_GET_LIMITS, .doit = mptcp_nl_cmd_get_limits, }, + { + .cmd = MPTCP_PM_CMD_SET_FLAGS, + .doit = mptcp_nl_cmd_set_flags, + .flags = GENL_ADMIN_PERM, + }, }; static struct genl_family mptcp_genl_family __ro_after_init = {