Commit Graph

18 Commits

Author SHA1 Message Date
Ivan Vecera b0d7e2a017 ethtool: netlink: always pass genl_info to .prepare_data
JIRA: https://issues.redhat.com/browse/RHEL-30656

commit f946270d05c26044c67511ef5a9d91e06962d79f
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Mon Aug 14 14:47:23 2023 -0700

    ethtool: netlink: always pass genl_info to .prepare_data

    We had a number of bugs in the past because developers forgot
    to fully test dumps, which pass NULL as info to .prepare_data.
    .prepare_data implementations would try to access info->extack
    leading to a null-deref.

    Now that dumps and notifications can access struct genl_info
    we can pass it in, and remove the info null checks.

    Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> # pause
    Reviewed-by: Jiri Pirko <jiri@nvidia.com>
    Link: https://lore.kernel.org/r/20230814214723.2924989-11-kuba@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2024-04-10 09:19:31 +02:00
Ivan Vecera cb943b9230 ethtool: netlink: handle SET intro/outro in the common code
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2175237

commit 99132b6eb7927a549351f57638a1d560039f06f9
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Wed Jan 25 15:05:18 2023 -0800

    ethtool: netlink: handle SET intro/outro in the common code

    Most ethtool SET callbacks follow the same general structure.

      ethnl_parse_header_dev_get()
      rtnl_lock()
      ethnl_ops_begin()

      ... do stuff ...

      ethtool_notify()
      ethnl_ops_complete()
      rtnl_unlock()
      ethnl_parse_header_dev_put()

    This leads to a lot of copy / pasted code an bugs when people
    mis-handle the error path.

    Add a generic implementation of this pattern with a .set callback
    in struct ethnl_request_ops called to "do stuff".

    Also add an optional .set_validate which is called before
    ethnl_ops_begin() -- a lot of implementations do basic request
    capability / sanity checking at that point.

    Because we want to avoid generating the notification when
    no change happened - adopt a slightly hairy return values:
     - 0 means nothing to do (no notification)
     - 1 means done / continue
     - negative error codes on error

    Reuse .hdr_attr from struct ethnl_request_ops, GET and SET
    use the same attr spaces in all cases.

    Convert pause as an example (and to avoid unused function warnings).

    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2023-03-31 18:02:52 +02:00
Ivan Vecera 13a89d2290 net: ethtool: fix NULL pointer dereference in pause_prepare_data()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2175237

commit f5be9caf7bf022ab550f62ea68f1c1bb8f5287ee
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Tue Jan 24 13:13:28 2023 +0200

    net: ethtool: fix NULL pointer dereference in pause_prepare_data()

    In the following call path:

    ethnl_default_dumpit
    -> ethnl_default_dump_one
       -> ctx->ops->prepare_data
          -> pause_prepare_data

    struct genl_info *info will be passed as NULL, and pause_prepare_data()
    dereferences it while getting the extended ack pointer.

    To avoid that, just set the extack to NULL if "info" is NULL, since the
    netlink extack handling messages know how to deal with that.

    The pattern "info ? info->extack : NULL" is present in quite a few other
    "prepare_data" implementations, so it's clear that it's a more general
    problem to be dealt with at a higher level, but the code should have at
    least adhered to the current conventions to avoid the NULL dereference.

    Fixes: 04692c9020b7 ("net: ethtool: netlink: retrieve stats from multiple sources (eMAC, pMAC)")
    Reported-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reported-by: syzbot+9d44aae2720fc40b8474@syzkaller.appspotmail.com
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2023-03-31 18:02:52 +02:00
Ivan Vecera d736f725f7 net: ethtool: netlink: retrieve stats from multiple sources (eMAC, pMAC)
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2175237

commit 04692c9020b76939715d6f2b4ff84d832246e0fc
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Thu Jan 19 14:26:56 2023 +0200

    net: ethtool: netlink: retrieve stats from multiple sources (eMAC, pMAC)

    IEEE 802.3-2018 clause 99 defines a MAC Merge sublayer which contains an
    Express MAC and a Preemptible MAC. Both MACs are hidden to higher and
    lower layers and visible as a single MAC (packet classification to eMAC
    or pMAC on TX is done based on priority; classification on RX is done
    based on SFD).

    For devices which support a MAC Merge sublayer, it is desirable to
    retrieve individual packet counters from the eMAC and the pMAC, as well
    as aggregate statistics (their sum).

    Introduce a new ETHTOOL_A_STATS_SRC attribute which is part of the
    policy of ETHTOOL_MSG_STATS_GET and, and an ETHTOOL_A_PAUSE_STATS_SRC
    which is part of the policy of ETHTOOL_MSG_PAUSE_GET (accepted when
    ETHTOOL_FLAG_STATS is set in the common ethtool header). Both of these
    take values from enum ethtool_mac_stats_src, defaulting to "aggregate"
    in the absence of the attribute.

    Existing drivers do not need to pay attention to this enum which was
    added to all driver-facing structures, just the ones which report the
    MAC merge layer as supported.

    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2023-03-31 18:02:51 +02:00
Ivan Vecera 477a52d8e1 ethtool: use ethnl_parse_header_dev_put()
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2096377

commit 34ac17ecbf575eb079094d44f1bd30c66897aa21
Author: Eric Dumazet <edumazet@google.com>
Date:   Tue Dec 14 00:42:30 2021 -0800

    ethtool: use ethnl_parse_header_dev_put()

    It seems I missed that most ethnl_parse_header_dev_get() callers
    declare an on-stack struct ethnl_req_info, and that they simply call
    dev_put(req_info.dev) when about to return.

    Add ethnl_parse_header_dev_put() helper to properly untrack
    reference taken by ethnl_parse_header_dev_get().

    Fixes: e4b8954074f6 ("netlink: add net device refcount tracker to struct ethnl_req_info")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2022-06-13 18:39:15 +02:00
Ivan Vecera 5356aa9797 ethtool: fix ethtool msg len calculation for pause stats
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2047636

commit 1aabe578dd86e9f2867c4db4fba9a15f4ba1825d
Author: Jakub Kicinski <kuba@kernel.org>
Date:   Tue Nov 2 15:02:36 2021 -0700

    ethtool: fix ethtool msg len calculation for pause stats

    ETHTOOL_A_PAUSE_STAT_MAX is the MAX attribute id,
    so we need to subtract non-stats and add one to
    get a count (IOW -2+1 == -1).

    Otherwise we'll see:

      ethnl cmd 21: calculated reply length 40, but consumed 52

    Fixes: 9a27a33027 ("ethtool: add standard pause stats")
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
2022-01-28 15:55:56 +01:00
Jakub Kicinski 8203c7ce4e Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
 - keep the ZC code, drop the code related to reinit
net/bridge/netfilter/ebtables.c
 - fix build after move to net_generic

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2021-04-17 11:08:07 -07:00
Jakub Kicinski c5797f8a64 ethtool: move ethtool_stats_init
We'll need it for FEC stats as well.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-04-15 17:08:29 -07:00
Jakub Kicinski 16756d3e77 ethtool: pause: make sure we init driver stats
The intention was for pause statistics to not be reported
when driver does not have the relevant callback (only
report an empty netlink nest). What happens currently
we report all 0s instead. Make sure statistics are
initialized to "not set" (which is -1) so the dumping
code skips them.

Fixes: 9a27a33027 ("ethtool: add standard pause stats")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2021-04-14 13:03:06 -07:00
Jakub Kicinski a0de1cd356 ethtool: specify which header flags are supported per command
Perform header flags validation through the policy.

Only pause command supports ETHTOOL_FLAG_STATS. Create a separate
policy to be able to express that in policy dumps to user space.

Note that even though the core will validate the header policy,
it cannot record multiple layers of attributes and we have to
re-parse header sub-attrs. When doing so we could skip attribute
validation, or use most permissive policy. Opt for the former.

We will no longer return the extack cookie for flags but since
we only added first new flag in this release it's not expected
that any user space had a chance to make use of it.

v2: - remove the re-validation in ethnl_parse_header_dev_get()

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-10-06 06:25:55 -07:00
Jakub Kicinski 329d9c333e ethtool: link up ethnl_header_policy as a nested policy
To get the most out of parsing by the core, and to allow dumping
full policies we need to specify which policy applies to nested
attrs. For headers it's ethnl_header_policy.

$ sed -i 's@\(ETHTOOL_A_.*HEADER\].*=\) { .type = NLA_NESTED },@\1\n\t\tNLA_POLICY_NESTED(ethnl_header_policy),@' net/ethtool/*

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-10-06 06:25:55 -07:00
Jakub Kicinski ff419afa43 ethtool: trim policy tables
Since ethtool uses strict attribute validation there's no need
to initialize all attributes in policy tables. 0 is NLA_UNSPEC
which is going to be rejected. Remove the NLA_REJECTs.

Similarly attributes above maxattrs are rejected, so there's
no need to always size the policy tables to ETHTOOL_A_..._MAX.

v2: - new patch

Suggested-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-10-06 06:25:55 -07:00
Jakub Kicinski 5028588b62 ethtool: wire up set policies to ops
Similarly to get commands wire up the policies of set commands
to get parsing by the core and policy dumps.

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-10-06 06:25:55 -07:00
Jakub Kicinski 4f30974feb ethtool: wire up get policies to ops
Wire up policies for get commands in struct nla_policy of the ethtool
family. Make use of genetlink code attr validation and parsing, as well
as allow dumping policies to user space.

For every ETHTOOL_MSG_*_GET:
 - add 'ethnl_' prefix to policy name
 - add extern declaration in net/ethtool/netlink.h
 - wire up the policy & attr in ethtool_genl_ops[].
 - remove .request_policy and .max_attr from ethnl_request_ops.

Obviously core only records the first "layer" of parsed attrs
so we still need to parse the sub-attrs of the nested header
attribute.

v2:
 - merge of patches 1 and 2 from v1
 - remove stray empty lines in ops
 - also remove .max_attr

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-10-06 06:25:55 -07:00
Jakub Kicinski 9a27a33027 ethtool: add standard pause stats
Currently drivers have to report their pause frames statistics
via ethtool -S, and there is a wide variety of names used for
these statistics.

Add the two statistics defined in IEEE 802.3x to the standard
API. Create a new ethtool request header flag for including
statistics in the response to GET commands.

Always create the ETHTOOL_A_PAUSE_STATS nest in replies when
flag is set. Testing if driver declares the op is not a reliable
way of checking if any stats will actually be included and therefore
we don't want to give the impression that presence of
ETHTOOL_A_PAUSE_STATS indicates driver support.

Note that this patch does not include PFC counters, which may fit
better in dcbnl? But mostly I don't need them/have a setup to test
them so I haven't looked deeply into exposing them :)

v3:
 - add a helper for "uninitializing" stats, rather than a cryptic
   memset() (Andrew)

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-09-15 13:26:28 -07:00
Michal Kubecek bf37faa386 ethtool: add PAUSE_NTF notification
Send ETHTOOL_MSG_PAUSE_NTF notification whenever pause parameters of
a network device are modified using ETHTOOL_MSG_PAUSE_SET netlink message
or ETHTOOL_SPAUSEPARAM ioctl request.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-03-29 22:32:36 -07:00
Michal Kubecek 3ab879933d ethtool: set pause parameters with PAUSE_SET request
Implement PAUSE_SET netlink request to set pause parameters of a network
device. Thease are traditionally set with ETHTOOL_SPAUSEPARAM ioctl
request.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-03-29 22:32:36 -07:00
Michal Kubecek 7f59fb32b0 ethtool: provide pause parameters with PAUSE_GET request
Implement PAUSE_GET request to get pause parameters of a network device.
These are traditionally available via ETHTOOL_GPAUSEPARAM ioctl request.

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-03-29 22:32:36 -07:00