All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Maxim Georgiev <glipus@gmail.com>
Cc: kory.maincent@bootlin.com, netdev@vger.kernel.org,
	maxime.chevallier@bootlin.com, vladimir.oltean@nxp.com
Subject: Re: [PATCH net-next RFC] Add NDOs for hardware timestamp get/set
Date: Thu, 30 Mar 2023 22:35:19 -0700	[thread overview]
Message-ID: <20230330223519.36ce7d23@kernel.org> (raw)
In-Reply-To: <20230331045619.40256-1-glipus@gmail.com>

On Thu, 30 Mar 2023 22:56:19 -0600 Maxim Georgiev wrote:
> @@ -1642,6 +1650,10 @@ struct net_device_ops {
>  	ktime_t			(*ndo_get_tstamp)(struct net_device *dev,
>  						  const struct skb_shared_hwtstamps *hwtstamps,
>  						  bool cycles);
> +	int			(*ndo_hwtstamp_get)(struct net_device *dev,
> +						    struct hwtstamp_config *config);
> +	int			(*ndo_hwtstamp_set)(struct net_device *dev,
> +						    struct hwtstamp_config *config);

I wonder if we should pass in 

	struct netlink_ext_ack *extack

and maybe another structure for future extensions?
So we don't have to change the drivers again when we extend uAPI.

>  };
>  
>  struct xdp_metadata_ops {
> diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c
> index 5cdbfbf9a7dc..c90fac9a9b2e 100644
> --- a/net/core/dev_ioctl.c
> +++ b/net/core/dev_ioctl.c
> @@ -277,6 +277,39 @@ static int dev_siocbond(struct net_device *dev,
>  	return -EOPNOTSUPP;
>  }
>  
> +static int dev_hwtstamp(struct net_device *dev, struct ifreq *ifr,
> +			unsigned int cmd)
> +{
> +	const struct net_device_ops *ops = dev->netdev_ops;
> +	int err;
> +	struct hwtstamp_config config;

nit: reorder int err after config we like lines longest to shortest

> +
> +	if ((cmd == SIOCGHWTSTAMP && !ops->ndo_hwtstamp_get) ||
> +	    (cmd == SIOCSHWTSTAMP && !ops->ndo_hwtstamp_set))
> +		return dev_eth_ioctl(dev, ifr, cmd);
> +
> +	err = dsa_ndo_eth_ioctl(dev, ifr, cmd);
> +	if (err == 0 || err != -EOPNOTSUPP)
> +		return err;
> +
> +	if (!netif_device_present(dev))
> +		return -ENODEV;
> +
> +	if (cmd == SIOCSHWTSTAMP) {
> +		if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
> +			err = -EFAULT;
> +		else
> +			err = ops->ndo_hwtstamp_set(dev, &config);
> +	} else if (cmd == SIOCGHWTSTAMP) {
> +		err = ops->ndo_hwtstamp_get(dev, &config);
> +	}
> +
> +	if (err == 0)
> +		err = copy_to_user(ifr->ifr_data, &config,
> +				   sizeof(config)) ? -EFAULT : 0;

nit: just error check each return value, don't try to save LoC

> +	return err;
> +}
> +
>  static int dev_siocdevprivate(struct net_device *dev, struct ifreq *ifr,
>  			      void __user *data, unsigned int cmd)
>  {
> @@ -391,11 +424,14 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, void __user *data,
>  		rtnl_lock();
>  		return err;
>  
> +	case SIOCGHWTSTAMP:
> +		return dev_hwtstamp(dev, ifr, cmd);
> +
>  	case SIOCSHWTSTAMP:
>  		err = net_hwtstamp_validate(ifr);
>  		if (err)
>  			return err;
> -		fallthrough;
> +		return dev_hwtstamp(dev, ifr, cmd);

Let's refactor this differently, we need net_hwtstamp_validate()
to run on the same in-kernel copy as we'll send down to the driver.
If we copy_from_user() twice we may validate a different thing
than the driver will end up seeing (ToCToU).

TBH I'm not sure if keeping GET and SET in a common dev_hwtstamp()
ends up being beneficial. If we fold in the validation check half 
of the code will be under and if (GET) or if (SET)..

  reply	other threads:[~2023-03-31  5:35 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-31  4:56 [PATCH net-next RFC] Add NDOs for hardware timestamp get/set Maxim Georgiev
2023-03-31  5:35 ` Jakub Kicinski [this message]
2023-03-31 17:51   ` Max Georgiev
2023-03-31 18:10     ` Jakub Kicinski
2023-04-01 18:16       ` Vladimir Oltean
2023-04-01 19:12       ` Vladimir Oltean
2023-04-01 19:24         ` Jakub Kicinski
2023-04-01 19:30           ` Vladimir Oltean
2023-04-01 20:18           ` Vladimir Oltean
2023-04-02 14:28             ` Max Georgiev
2023-04-02 16:56               ` Vladimir Oltean
2023-04-01 16:08   ` Vladimir Oltean
2023-04-01 17:55     ` Jakub Kicinski
2023-04-01 18:20       ` Vladimir Oltean
2023-04-01 18:22         ` Vladimir Oltean
2023-04-01 19:14         ` Jakub Kicinski
2023-04-01 19:19           ` Vladimir Oltean

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=20230330223519.36ce7d23@kernel.org \
    --to=kuba@kernel.org \
    --cc=glipus@gmail.com \
    --cc=kory.maincent@bootlin.com \
    --cc=maxime.chevallier@bootlin.com \
    --cc=netdev@vger.kernel.org \
    --cc=vladimir.oltean@nxp.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.