From nobody Thu Sep 18 11:14:18 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690371jap; Thu, 16 Dec 2021 14:24:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRI31x87fzithZz0XznApm4B6bOSoNBkmmPanbuTZsROXetPgqarAupv3bfeGj4VbuIJGD X-Received: by 2002:a37:27c9:: with SMTP id n192mr102663qkn.517.1639693472941; Thu, 16 Dec 2021 14:24:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693472; cv=none; d=google.com; s=arc-20160816; b=Kpheq4rCUSP6HGSQiekVD0txvWjFAa3JoHlzp+wDP7eRtWCzQsPhDvTMlnZjQo0qaw gWtmVfDQoe7NZWwJBJC9TgqN7VGBbofwNHeX4E5zM8qsIkfOhlw2nIU8NDFjHOz8DATI ydydT3sKofeFkf7jcyNUrG3iENqnYzyp2NHrxFdz6WiE6tiFqk4lTxCoDPq+//YfX3sp /fOhhB7oqSyHgv2cRwli/7ay1EAj2nZnj9EKDCrN0xIjoL8tFYpmi1x3MvSzexNQ0jDd gTdBVm9IM74vIx5JabJXPgni3E4mpdThDdZS1M7cnARFB8UW4b6gyHHD+JcxK/EOl9Zj eHfg== 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=LXsK2a/jb6xP10h/kWiMh3MR4iQ6N6EHq5N52ijOx4M=; b=bNasleTVQ70FzcrLsbSAJzNfypKoGD4rKpcGKsJW4GRA89FViHU13vyJ36Zt/w88ns udjJKrdTGIMFHDvb1b/KQijNPnkY7KVuycDi/FNFUWYP3tBarQ8a9vCaexV2nyB3fTFH blAO3IE6oX2Osp5OtpyDbKrIW7aTpCdCyf9ZAD12XFOEUltSqdJzwdq5osDBErBh0n0s ANMtu5ET8WL61j+wFucEMT5NE+MJACNuQ49/10MqfhTCPKxkb6JoLD7OEPm4//Aeh+ym yQz2p632xezvtZ/XtI0jmqWY845Kuam3pnqqTnNbrUbsiuAFpHxWySBz6J0EKyENo04d pvNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=fhHrfm5O; spf=pass (google.com: domain of mptcp+bounces-2810-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2810-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 u20si3051150qtw.682.2021.12.16.14.24.32 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:32 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2810-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=fhHrfm5O; spf=pass (google.com: domain of mptcp+bounces-2810-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2810-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 BCEB91C0BDE for ; Thu, 16 Dec 2021 22:24:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B73EC6D18; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 842EB3FFB for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693461; x=1671229461; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0m9IZ8Sn61grdD31UBb+b0qJnn02HsmyoaV1kfpOkHU=; b=fhHrfm5OP1aBPkMAKgi9x0V2mUyIMGtY6QmVbNIreH1yMkBaH7nqDvi4 AqhigRFjCkppsw5q0wDPxG0FEcmOar7FuuDCu4w0GUolA4dQ2gF3YhEu/ PLDodtF7cAoIp41tlBlumlfuwnlRZ8+QRhlLyIXk1dnUYULT29KvBQVwu kCqKf24cE9Xalx+lJp5ZlcZpGsz8GxrmfymDh4uLEUWooM//Yxznxp8Sj uh7jnuL7Bo+xWI5pCDPBj9zbduamvQbh+0EzKUsgtwHN0ieKOTL5faCIZ PaKqrVR4lLTgNe6CHq+VJk/UY5QbFo/h+gzGAc/B3TI6SI8UAX1sWaZNb w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393172" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393172" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461271" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 15/21] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Thu, 16 Dec 2021 17:23:08 -0500 Message-Id: <20211216222314.1244708-16-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 2e9ca5730b10..66462ac706f2 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