From patchwork Thu Oct 26 22:45:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 13437993 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 861A23F4BA for ; Thu, 26 Oct 2023 22:55:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="f8uWR3yW" Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B7F451B8 for ; Thu, 26 Oct 2023 15:55:41 -0700 (PDT) Received: by mail-pl1-x631.google.com with SMTP id d9443c01a7336-1cac80292aeso11544255ad.1 for ; Thu, 26 Oct 2023 15:55:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1698360941; x=1698965741; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=O73qfCXoiolEYsufjM0ED0QL900jsutmX4Qh/ONnd0U=; b=f8uWR3yWE+7bW1LH5DxMUmNQ/XS0Xsp6PAHP8Wx9CQSfyFSL0gos2UfWgz7J1fQydf SVX6aJfCmqwKZDirfHJ9wL5V9aAfmMjJd57lQAxymgfYZ6xNRjPmz6j+kOr/ut3Lekn/ aa2Rvice9gR5NX2wqFE+ptim8PYmBf5R/wjxU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698360941; x=1698965741; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=O73qfCXoiolEYsufjM0ED0QL900jsutmX4Qh/ONnd0U=; b=ZvGr2RR8/Tr62MdmyBKh29Z1pOvZj4rEyGJCqDu+XNYoschAf+7f0FdNLs5gw4nbzv ALHX5Bz4g+GzLAXVbTn70gV/gboVJEuaFAr+ikch+Kr5VWVLDBpw0arqTDkBjc5sJ/dM LcqttGgLjh94tUgXBw2LG020MhyLpkiG4JxWdvyZUVFX2rmlXcut9vaRnP/GnGNV4jDq cFtJgXlEzkQQozEIx4axIgkruT+/sO60ovkcu3S8m2xh5riXLUTr4YmQCPIjB1jr13D0 t+kJ4aIgEh8sOzzXObEFLJZ2Wl/AjdBUsxVffJTbTGEAN9ofHW7aveIhnfi85AYa4tFz gSlw== X-Gm-Message-State: AOJu0Yx4EiRplv/1v5EoABDaWzICZUqcoIHNoTcH8ofNrULOSq7lS441 QNv81OD6utvQjunlcnRwJlnY4JIeqb9qH5/+K3VVExYMpw0qhB+NLvEZnFmpTPHvD6LkLLZ74/b EXiAX+0cfX6C/dScGZPo2+4w+wb84Dk/bCrGORlOtV2Cax+M/IkM2gZzKl2AM+7+zqRqZ5aLxYe 2jkEF01RG5J6xK X-Google-Smtp-Source: AGHT+IGJHiS6vZru+AUOsJcfgVHC/zU/WvqNoaFnAInF01XTG2AshW+hkcJvTW9Rh0vF5uq2BV1RCA== X-Received: by 2002:a17:902:d2c9:b0:1bb:d59d:8c57 with SMTP id n9-20020a170902d2c900b001bbd59d8c57mr1019293plc.18.1698360940744; Thu, 26 Oct 2023 15:55:40 -0700 (PDT) Received: from fainelli-desktop.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id o1-20020a170902d4c100b001c9b5b63e36sm206295plg.32.2023.10.26.15.55.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Oct 2023 15:55:40 -0700 (PDT) From: Florian Fainelli To: netdev@vger.kernel.org Cc: Florian Fainelli , Doug Berger , Broadcom internal kernel review list , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Andrew Lunn , Heiner Kallweit , Russell King , Vladimir Oltean , Tariq Toukan , Gal Pressman , Willem de Bruijn , Daniil Tatianin , Simon Horman , Justin Chen , Ratheesh Kannoth , Joe Damato , Vincent Mailhol , Jiri Pirko , linux-kernel@vger.kernel.org (open list) Subject: [PATCH net-next v2 2/5] net: ethtool: Add validation for WAKE_FILTER Date: Thu, 26 Oct 2023 15:45:06 -0700 Message-Id: <20231026224509.112353-3-florian.fainelli@broadcom.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231026224509.112353-1-florian.fainelli@broadcom.com> References: <20231026224509.112353-1-florian.fainelli@broadcom.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org A driver implementing WAKE_FILTER must first install at least one rule with RX_CLS_FLOW_WAKE for WAKE_FILTER to be effective. Iterate over RXNFC rules to validate that condition while trying to enable WAKE_FILTER. Signed-off-by: Florian Fainelli Reviewed-by: Jacob Keller --- net/ethtool/common.c | 42 ++++++++++++++++++++++++++++++++++++++++++ net/ethtool/common.h | 3 +++ net/ethtool/ioctl.c | 3 +++ net/ethtool/wol.c | 3 +++ 4 files changed, 51 insertions(+) diff --git a/net/ethtool/common.c b/net/ethtool/common.c index 143dae872fb2..bab901b35731 100644 --- a/net/ethtool/common.c +++ b/net/ethtool/common.c @@ -742,3 +742,45 @@ ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size) } } EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init); + +static int __ethtool_check_rxnfc_wake_filter(struct ethtool_rxnfc *rule_info, + void *priv) +{ + bool *verdict = priv; + + if (rule_info->fs.ring_cookie == RX_CLS_FLOW_WAKE) { + *verdict = true; + return 1; + } + + return 0; +} + +/** + * ethtool_dev_check_wake_filter: Tests if a network device can use the + * WAKE_FILTER Wake-on-LAN option. + * @dev: network device to test + * @wol: %ethtool_wolinfo structure with Wake-on-LAN configuration + * + * Returns true if there is no support for %WAKE_FILTER, no support + * for RXNFC ethtool operations, or if there is at least one WAKE_FILTER + * installed. + */ +bool ethtool_dev_check_wake_filter(struct net_device *dev, + const struct ethtool_wolinfo *wol) +{ + bool verdict = false; + int ret; + + if (!(wol->wolopts & WAKE_FILTER)) + return true; + + if (!dev->ethtool_ops->get_rxnfc || + !dev->ethtool_ops->set_rxnfc) + return true; + + ret = __ethtool_for_each_rxnfc(dev, __ethtool_check_rxnfc_wake_filter, + &verdict); + + return ret < 0 ? false : verdict; +} diff --git a/net/ethtool/common.h b/net/ethtool/common.h index 28b8aaaf9bcb..6cd3286d5038 100644 --- a/net/ethtool/common.h +++ b/net/ethtool/common.h @@ -56,4 +56,7 @@ int ethtool_get_module_eeprom_call(struct net_device *dev, bool __ethtool_dev_mm_supported(struct net_device *dev); +bool ethtool_dev_check_wake_filter(struct net_device *dev, + const struct ethtool_wolinfo *wol); + #endif /* _ETHTOOL_COMMON_H */ diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index 0b0ce4f81c01..954446185158 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -1457,6 +1457,9 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) !memcmp(wol.sopass, cur_wol.sopass, sizeof(wol.sopass))) return 0; + if (!ethtool_dev_check_wake_filter(dev, &wol)) + return -EOPNOTSUPP; + ret = dev->ethtool_ops->set_wol(dev, &wol); if (ret) return ret; diff --git a/net/ethtool/wol.c b/net/ethtool/wol.c index 0ed56c9ac1bc..65fbe743a070 100644 --- a/net/ethtool/wol.c +++ b/net/ethtool/wol.c @@ -132,6 +132,9 @@ ethnl_set_wol(struct ethnl_req_info *req_info, struct genl_info *info) tb[ETHTOOL_A_WOL_SOPASS], &mod); } + if (!ethtool_dev_check_wake_filter(dev, &wol)) + return -EOPNOTSUPP; + if (!mod) return 0; ret = dev->ethtool_ops->set_wol(dev, &wol);