From: Jakub Kicinski <kuba@kernel.org>
To: Parthiban Veerasooran <Parthiban.Veerasooran@microchip.com>
Cc: <piergiorgio.beruto@gmail.com>, <davem@davemloft.net>,
<edumazet@google.com>, <pabeni@redhat.co>,
<netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<horatiu.vultur@microchip.com>, <Woojung.Huh@microchip.com>,
<Nicolas.Ferre@microchip.com>,
<Thorsten.Kummermehr@microchip.com>
Subject: Re: [PATCH net-next] ethtool: plca: fix plca enable data type while parsing the value
Date: Tue, 5 Sep 2023 15:15:09 -0700 [thread overview]
Message-ID: <20230905151509.5208ee63@kernel.org> (raw)
In-Reply-To: <20230831104523.7178-1-Parthiban.Veerasooran@microchip.com>
On Thu, 31 Aug 2023 16:15:23 +0530 Parthiban Veerasooran wrote:
> Subject: [PATCH net-next] ethtool: plca: fix plca enable data type while parsing the value
Since this is a fix the subject should say net instead of net-next.
[PATCH net v2] for the next revision.
> The ETHTOOL_A_PLCA_ENABLED data type is u8. But while parsing the
> value from the attribute, nla_get_u32() is used in the plca_update_sint()
> function instead of nla_get_u8(). So plca_cfg.enabled variable is updated
> with some garbage value instead of 0 or 1 and always enables plca even
> though plca is disabled through ethtool application. This bug has been
> fixed by implementing plca_update_sint_from_u8() function which uses
> nla_get_u8() function to extract the plca_cfg.enabled value and the
> function plca_update_sint_from_u32() is used for extracting the other
> values using nla_get_u32() function.
Hm, yes, that seems like the best of the available options.
> Fixes: 8580e16c28f3 ("net/ethtool: add netlink interface for the PLCA RS")
Please make sure you CC all the people who signed off the commit under
Fixes. You missed pabeni@redhat.com and andrew@lunn.ch
> Signed-off-by: Parthiban Veerasooran <Parthiban.Veerasooran@microchip.com>
> ---
> net/ethtool/plca.c | 34 ++++++++++++++++++++++++----------
> 1 file changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/net/ethtool/plca.c b/net/ethtool/plca.c
> index b238a1afe9ae..b4e80dd33590 100644
> --- a/net/ethtool/plca.c
> +++ b/net/ethtool/plca.c
> @@ -21,8 +21,8 @@ struct plca_reply_data {
> #define PLCA_REPDATA(__reply_base) \
> container_of(__reply_base, struct plca_reply_data, base)
>
> -static void plca_update_sint(int *dst, const struct nlattr *attr,
> - bool *mod)
> +static void plca_update_sint_from_u32(int *dst, const struct nlattr *attr,
> + bool *mod)
> {
> if (!attr)
> return;
> @@ -31,6 +31,16 @@ static void plca_update_sint(int *dst, const struct nlattr *attr,
> *mod = true;
> }
>
> +static void plca_update_sint_from_u8(int *dst, const struct nlattr *attr,
> + bool *mod)
> +{
> + if (!attr)
> + return;
> +
> + *dst = nla_get_u8(attr);
> + *mod = true;
> +}
> +
> // PLCA get configuration message ------------------------------------------- //
>
> const struct nla_policy ethnl_plca_get_cfg_policy[] = {
> @@ -144,14 +154,18 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
> return -EOPNOTSUPP;
>
> memset(&plca_cfg, 0xff, sizeof(plca_cfg));
> - plca_update_sint(&plca_cfg.enabled, tb[ETHTOOL_A_PLCA_ENABLED], &mod);
> - plca_update_sint(&plca_cfg.node_id, tb[ETHTOOL_A_PLCA_NODE_ID], &mod);
> - plca_update_sint(&plca_cfg.node_cnt, tb[ETHTOOL_A_PLCA_NODE_CNT], &mod);
> - plca_update_sint(&plca_cfg.to_tmr, tb[ETHTOOL_A_PLCA_TO_TMR], &mod);
> - plca_update_sint(&plca_cfg.burst_cnt, tb[ETHTOOL_A_PLCA_BURST_CNT],
> - &mod);
> - plca_update_sint(&plca_cfg.burst_tmr, tb[ETHTOOL_A_PLCA_BURST_TMR],
> - &mod);
> + plca_update_sint_from_u8(&plca_cfg.enabled, tb[ETHTOOL_A_PLCA_ENABLED],
> + &mod);
> + plca_update_sint_from_u32(&plca_cfg.node_id, tb[ETHTOOL_A_PLCA_NODE_ID],
> + &mod);
> + plca_update_sint_from_u32(&plca_cfg.node_cnt,
> + tb[ETHTOOL_A_PLCA_NODE_CNT], &mod);
> + plca_update_sint_from_u32(&plca_cfg.to_tmr, tb[ETHTOOL_A_PLCA_TO_TMR],
> + &mod);
> + plca_update_sint_from_u32(&plca_cfg.burst_cnt,
> + tb[ETHTOOL_A_PLCA_BURST_CNT], &mod);
> + plca_update_sint_from_u32(&plca_cfg.burst_tmr,
> + tb[ETHTOOL_A_PLCA_BURST_TMR], &mod);
This looks error prone. We still need to maintain the types in multiple
places. How about we use the policy to decide the type? Something along
the lines of (untested):
diff --git a/net/ethtool/plca.c b/net/ethtool/plca.c
index b238a1afe9ae..aed30665e9c0 100644
--- a/net/ethtool/plca.c
+++ b/net/ethtool/plca.c
@@ -21,16 +21,6 @@ struct plca_reply_data {
#define PLCA_REPDATA(__reply_base) \
container_of(__reply_base, struct plca_reply_data, base)
-static void plca_update_sint(int *dst, const struct nlattr *attr,
- bool *mod)
-{
- if (!attr)
- return;
-
- *dst = nla_get_u32(attr);
- *mod = true;
-}
-
// PLCA get configuration message ------------------------------------------- //
const struct nla_policy ethnl_plca_get_cfg_policy[] = {
@@ -125,6 +115,29 @@ const struct nla_policy ethnl_plca_set_cfg_policy[] = {
[ETHTOOL_A_PLCA_BURST_TMR] = NLA_POLICY_MAX(NLA_U32, 255),
};
+static void
+plca_update_sint(int *dst, const struct nlattr **tb, u32 attrid, bool *mod)
+{
+ const struct nlattr *attr = tb[attrid];
+
+ if (!attr ||
+ WARN_ON_ONCE(attrid >= ARRAY_SIZE(ethnl_plca_set_cfg_policy)))
+ return;
+
+ switch (ethnl_plca_set_cfg_policy[attrid].type) {
+ case NLA_U8:
+ *dst = nla_get_u8(attr);
+ break;
+ case NLA_U32:
+ *dst = nla_get_u32(attr);
+ break;
+ default:
+ WARN_ON_ONCE(1);
+ }
+
+ *mod = true;
+}
+
static int
ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
{
@@ -144,13 +157,13 @@ ethnl_set_plca(struct ethnl_req_info *req_info, struct genl_info *info)
return -EOPNOTSUPP;
memset(&plca_cfg, 0xff, sizeof(plca_cfg));
- plca_update_sint(&plca_cfg.enabled, tb[ETHTOOL_A_PLCA_ENABLED], &mod);
- plca_update_sint(&plca_cfg.node_id, tb[ETHTOOL_A_PLCA_NODE_ID], &mod);
- plca_update_sint(&plca_cfg.node_cnt, tb[ETHTOOL_A_PLCA_NODE_CNT], &mod);
- plca_update_sint(&plca_cfg.to_tmr, tb[ETHTOOL_A_PLCA_TO_TMR], &mod);
- plca_update_sint(&plca_cfg.burst_cnt, tb[ETHTOOL_A_PLCA_BURST_CNT],
+ plca_update_sint(&plca_cfg.enabled, tb, ETHTOOL_A_PLCA_ENABLED, &mod);
+ plca_update_sint(&plca_cfg.node_id, tb, ETHTOOL_A_PLCA_NODE_ID, &mod);
+ plca_update_sint(&plca_cfg.node_cnt, tb, ETHTOOL_A_PLCA_NODE_CNT, &mod);
+ plca_update_sint(&plca_cfg.to_tmr, tb, ETHTOOL_A_PLCA_TO_TMR, &mod);
+ plca_update_sint(&plca_cfg.burst_cnt, tb, ETHTOOL_A_PLCA_BURST_CNT,
&mod);
- plca_update_sint(&plca_cfg.burst_tmr, tb[ETHTOOL_A_PLCA_BURST_TMR],
+ plca_update_sint(&plca_cfg.burst_tmr, tb, ETHTOOL_A_PLCA_BURST_TMR,
&mod);
if (!mod)
return 0;
next prev parent reply other threads:[~2023-09-05 22:15 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-31 10:45 [PATCH net-next] ethtool: plca: fix plca enable data type while parsing the value Parthiban Veerasooran
2023-09-05 22:15 ` Jakub Kicinski [this message]
2023-09-07 13:38 ` Parthiban.Veerasooran
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230905151509.5208ee63@kernel.org \
--to=kuba@kernel.org \
--cc=Nicolas.Ferre@microchip.com \
--cc=Parthiban.Veerasooran@microchip.com \
--cc=Thorsten.Kummermehr@microchip.com \
--cc=Woojung.Huh@microchip.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horatiu.vultur@microchip.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.co \
--cc=piergiorgio.beruto@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.