From nobody Fri Apr 19 20:16:57 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107892jah; Wed, 12 Jan 2022 14:16:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJxRqAM9E3hNMyBqlsI3oCqyJ+zM0m1wkEflKPFx+BHjgVYT7BWNDuFo784ijL2iKuWyPwGT X-Received: by 2002:ac8:5890:: with SMTP id t16mr1481220qta.177.1642025787847; Wed, 12 Jan 2022 14:16:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025787; cv=none; d=google.com; s=arc-20160816; b=eAohPgx7RHHB+rInACDuTqNhrZNJslKqEJmBXnSV1WhLyhfQXvikOtGsFu+OqBxo3x Jc395zTAVml73MM2cguRHz2lRbsNbyEvikn86CWyfH5M+ch4v6Nh63OQj3A1/VG6Bn96 2r3VWo63U/PgVrgr7Ee/A0m0/cmjDa7yfpE+cM42z9+SgQmsETA1sljjKDJWq+NyXXaQ a7vMwzMYK+fkZnDn9BxeksZzrmZsgITw7oWPjU7dz1G9f16G5IvSDUiQGGhPCgOHnwl6 t7h4QdoG+vuavHaZ5+btUMilv526aeuqFKw6tGxfN7or361Rdy7Lhrey3AOp/ihvsAza tW9g== 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=w0wR/MP6Kx6DMqXQJOOqmmFc4S+aNO9pELZh7RIJ9ck=; b=PL8tmIl2Y6txXnUaGUBc7+UafIB25s8moNu+gyFCB+2ki3njMAnu0+h/nHhGlO2w7J ccNTEaJwh8vFAHB5XiJRdd+zgWYJGNZVTC88SDQp1WPWTm08TvDICm20s8pGwbziytrx VJT28TIT+yzAnvG1P90Vk9bxCB4DSzgXbdhq0lSuDyCc3DYjthV/f1pV11NndWCrEHUB kdU60MlcpjIq8rFYks1nRI1L6hvwXCCrNbhE/YTCBb7NewuHgpFzlG8JcMeA9dWZjThf 7QU9tsFiSy6pbVnRvgefFBI4HEyrWSeDC7tSNutbD5pgsCgEL1bC8ugwmz9eOGOzrNbO Em8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=S3TL0Qqp; spf=pass (google.com: domain of mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id l16si514343qkp.165.2022.01.12.14.16.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:27 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3087-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=@intel.com header.s=Intel header.b=S3TL0Qqp; spf=pass (google.com: domain of mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.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 8E5FF1C0C62 for ; Wed, 12 Jan 2022 22:16:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 003AA2CA7; Wed, 12 Jan 2022 22:16:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 BC2BD2CA3 for ; Wed, 12 Jan 2022 22:16:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025775; x=1673561775; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=gmvUV2eLl4VmHm5SsVMrkJdr5G+PdFvIrQsxt3Rbk34=; b=S3TL0Qqp5TRnRy8PAUYfVES9cnLOT0vVPJ52ftk4b2taH33xtJgQv4kI Nzi85M9J3aEsn4tLw7YJqcZsBn7ZfuSLWRvIfHNP9xsbhv4bYFUvlTiyK EIOSsR6ed9gKNM/iXBaJqE9Z8fHthqs6frNgcbf+N3iaOyfgVsKcbpbmr OIxTyT+J7ZBAyeBtVHneaiIP9sY+yTUg/L2MwbZe3veDiwT/FhxCB8wON EGWUYmxjxUIySrXLi3EFywPHHfXbFwBKXVqVzDRui5e1TBfwNu/P0K5f1 elUNF5uJEVb4u9q+QjCfJU/ZIimm0ph+JO/bnOAruaIYOGrUvIzs2Zb/n w==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213945" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213945" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907373" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 15/21] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Wed, 12 Jan 2022 17:15:17 -0500 Message-Id: <20220112221523.1829397-16-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink command for issuing REMOVE_ADDR signals for a specific address over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: {token, loc_id}. Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 40380be396c8..ec63f9382dbe 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -56,6 +56,7 @@ enum { MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ + MPTCP_PM_ATTR_LOC_ID, /* u8 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -94,6 +95,7 @@ enum { MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_CMD_REMOVE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 18228b2dfa2d..bec45560060a 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1269,6 +1269,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { [MPTCP_PM_ATTR_RCV_ADD_ADDRS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, + [MPTCP_PM_ATTR_LOC_ID] =3D { .type =3D NLA_U8, }, }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1719,6 +1720,7 @@ static void mptcp_pm_remove_addrs_and_subflows(struct= mptcp_sock *msk, slist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; slist.ids[slist.nr++] =3D entry->addr.id; + remove_anno_list_by_saddr(msk, &entry->addr); } else if (remove_anno_list_by_saddr(msk, &entry->addr) && alist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; @@ -2330,6 +2332,66 @@ void mptcp_event_addr_removed(const struct mptcp_soc= k *msk, uint8_t id) kfree_skb(skb); } =20 +static int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *id =3D info->attrs[MPTCP_PM_ATTR_LOC_ID]; + struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); + struct mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (entry->addr.id =3D=3D id_val) { + match =3D entry; + break; + } + } + + if (!match) { + GENL_SET_ERR_MSG(info, "address with specified id not found"); + release_sock((struct sock *)msk); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + list_for_each_entry_safe(match, entry, &free_list, list) { + if (match->lsk_ref) + lsk_list_release(pernet, match->lsk_ref); + kfree(match); + } + return 0; +} + void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info, const struct sock *ssk) @@ -2481,6 +2543,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_announce, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_REMOVE, + .doit =3D mptcp_nl_cmd_remove, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1