On Mon, Apr 22, 2024 at 02:50:27PM +0200, Kory Maincent wrote: > Enhance 'get' command to retrieve tsinfo of hwtstamp providers within a > network topology and read current hwtstamp configuration. > > Introduce support for ETHTOOL_MSG_TSINFO_SET ethtool netlink socket to > configure hwtstamp of a PHC provider. Note that simultaneous hwtstamp > isn't supported; configuring a new one disables the previous setting. > > Also, add support for a specific dump command to retrieve all hwtstamp > providers within the network topology, with added functionality for > filtered dump to target a single interface. > > Signed-off-by: Kory Maincent <kory.maincent@xxxxxxxxxxx> Hi Kory, Some minor feedback from my side. > diff --git a/include/linux/ptp_clock_kernel.h b/include/linux/ptp_clock_kernel.h > index 23b43f59fcfb..f901394507b3 100644 > --- a/include/linux/ptp_clock_kernel.h > +++ b/include/linux/ptp_clock_kernel.h > @@ -426,6 +426,43 @@ struct ptp_clock *ptp_clock_get_by_index(struct device *dev, int index); > > void ptp_clock_put(struct device *dev, struct ptp_clock *ptp); > > +/** > + * netdev_ptp_clock_find() - obtain the next PTP clock in the netdev > + * topology > + * > + * @dev: Pointer of the net device > + * @indexp: Pointer of ptp clock index start point > + */ Recently -Wall was added to the kernel CI ./scripts/kernel-doc -none test, which means that Kernel docs are now expected to document return values. It would be nice to add them for new code. > + > +struct ptp_clock *netdev_ptp_clock_find(struct net_device *dev, > + unsigned long *indexp); ... > diff --git a/net/ethtool/tsinfo.c b/net/ethtool/tsinfo.c ... > -const struct nla_policy ethnl_tsinfo_get_policy[] = { > +const struct nla_policy > +ethnl_tsinfo_hwtstamp_provider_policy[ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_MAX + 1] = { ethnl_tsinfo_hwtstamp_provider_policy seems to only be used in this file, so it should be static. > + [ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_INDEX] = > + NLA_POLICY_MIN(NLA_S32, 0), > + [ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_QUALIFIER] = > + NLA_POLICY_MAX(NLA_U32, HWTSTAMP_PROVIDER_QUALIFIER_CNT - 1) > +}; > + > +const struct nla_policy ethnl_tsinfo_get_policy[ETHTOOL_A_TSINFO_MAX + 1] = { > [ETHTOOL_A_TSINFO_HEADER] = > NLA_POLICY_NESTED(ethnl_header_policy_stats), > + [ETHTOOL_A_TSINFO_GHWTSTAMP] = > + NLA_POLICY_MAX(NLA_U8, 1), > + [ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER_NEST] = > + NLA_POLICY_NESTED(ethnl_tsinfo_hwtstamp_provider_policy), > }; ... > +static int ethnl_tsinfo_dump_one_ptp(struct sk_buff *skb, struct net_device *dev, > + struct netlink_callback *cb, > + struct ptp_clock *ptp) > +{ > + struct ethnl_tsinfo_dump_ctx *ctx = (void *)cb->ctx; > + struct tsinfo_reply_data *reply_data; > + struct tsinfo_req_info *req_info; > + void *ehdr; > + int ret; > + > + reply_data = ctx->reply_data; > + req_info = ctx->req_info; > + req_info->hwtst.index = ptp_clock_index(ptp); > + > + for (; ctx->pos_phcqualifier < HWTSTAMP_PROVIDER_QUALIFIER_CNT; > + ctx->pos_phcqualifier++) { > + if (!netdev_support_hwtstamp_qualifier(dev, > + ctx->pos_phcqualifier)) > + continue; > + > + ehdr = ethnl_dump_put(skb, cb, > + ETHTOOL_MSG_TSINFO_GET_REPLY); > + if (!ehdr) > + return -EMSGSIZE; > + > + memset(reply_data, 0, sizeof(*reply_data)); > + reply_data->base.dev = dev; > + req_info->hwtst.qualifier = ctx->pos_phcqualifier; > + ret = tsinfo_prepare_data(&req_info->base, > + &reply_data->base, > + genl_info_dump(cb)); > + if (ret < 0) > + break; > + > + ret = ethnl_fill_reply_header(skb, dev, > + ETHTOOL_A_TSINFO_HEADER); > + if (ret < 0) > + break; > + > + ret = tsinfo_fill_reply(skb, &req_info->base, > + &reply_data->base); > + if (ret < 0) > + break; > + } > + > + reply_data->base.dev = NULL; > + if (ret < 0) > + genlmsg_cancel(skb, ehdr); > + else > + genlmsg_end(skb, ehdr); I suppose it can't occur, but if the for loop iterates zero times, then ret and ehdr will be uninitialised here. Flagged by Smatch. > + return ret; > +} ...