diff mbox series

[net-next] ptp: only allow phase values lower than 1 period

Message ID 20200803194921.603151-1-olteanv@gmail.com
State Superseded
Delegated to: David Miller
Headers show
Series [net-next] ptp: only allow phase values lower than 1 period | expand

Commit Message

Vladimir Oltean Aug. 3, 2020, 7:49 p.m. UTC
The way we define the phase (the difference between the time of the
signal's rising edge, and the closest integer multiple of the period),
it doesn't make sense to have a phase value larger than 1 period.

So deny these settings coming from the user.

Signed-off-by: Vladimir Oltean <olteanv@gmail.com>
---
 drivers/ptp/ptp_chardev.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

Comments

David Miller Aug. 4, 2020, 1:18 a.m. UTC | #1
From: Vladimir Oltean <olteanv@gmail.com>
Date: Mon,  3 Aug 2020 22:49:21 +0300

> The way we define the phase (the difference between the time of the
> signal's rising edge, and the closest integer multiple of the period),
> it doesn't make sense to have a phase value larger than 1 period.
> 
> So deny these settings coming from the user.
> 
> Signed-off-by: Vladimir Oltean <olteanv@gmail.com>

Richard, please review.
David Miller Aug. 4, 2020, 11:04 p.m. UTC | #2
From: Vladimir Oltean <olteanv@gmail.com>
Date: Mon,  3 Aug 2020 22:49:21 +0300

> The way we define the phase (the difference between the time of the
> signal's rising edge, and the closest integer multiple of the period),
> it doesn't make sense to have a phase value larger than 1 period.
> 
> So deny these settings coming from the user.
> 
> Signed-off-by: Vladimir Oltean <olteanv@gmail.com>

Richard, I need your review on this patch.

Thank you.
Richard Cochran Aug. 4, 2020, 11:23 p.m. UTC | #3
On Mon, Aug 03, 2020 at 10:49:21PM +0300, Vladimir Oltean wrote:
> @@ -218,6 +218,19 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
>  					break;
>  				}
>  			}
> +			if (perout->flags & PTP_PEROUT_PHASE) {
> +				/*
> +				 * The phase should be specified modulo the
> +				 * period, therefore anything larger than 1
> +				 * period is invalid.
> +				 */
> +				if (perout->phase.sec > perout->period.sec ||
> +				    (perout->phase.sec == perout->period.sec &&
> +				     perout->phase.nsec > perout->period.nsec)) {
> +					err = -ERANGE;
> +					break;
> +				}

So if perout->period={1,0} and perout->phase={1,0} then the phase has
wrapped 360 degrees back to zero.

Shouldn't this code catch that case as well?

So why not test for (perout->phase.nsec >= perout->period.nsec) instead?

Thanks,
Richard
Vladimir Oltean Aug. 4, 2020, 11:40 p.m. UTC | #4
On Tue, Aug 04, 2020 at 04:23:35PM -0700, Richard Cochran wrote:
> On Mon, Aug 03, 2020 at 10:49:21PM +0300, Vladimir Oltean wrote:
> > @@ -218,6 +218,19 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
> >  					break;
> >  				}
> >  			}
> > +			if (perout->flags & PTP_PEROUT_PHASE) {
> > +				/*
> > +				 * The phase should be specified modulo the
> > +				 * period, therefore anything larger than 1
> > +				 * period is invalid.
> > +				 */
> > +				if (perout->phase.sec > perout->period.sec ||
> > +				    (perout->phase.sec == perout->period.sec &&
> > +				     perout->phase.nsec > perout->period.nsec)) {
> > +					err = -ERANGE;
> > +					break;
> > +				}
> 
> So if perout->period={1,0} and perout->phase={1,0} then the phase has
> wrapped 360 degrees back to zero.
> 
> Shouldn't this code catch that case as well?
> 
> So why not test for (perout->phase.nsec >= perout->period.nsec) instead?
> 
> Thanks,
> Richard

Oof, I guess this is what one would call 'brain fart'. In my mind,
checking for equality between period and phase required an extra 'if',
which I was reluctant to add (or to even think about, it seems). I
converted the nsec check to >= and it works as it should (I checked with
a modified ts2phc).

ts2phc[326.764]: config item /dev/ptp1.ts2phc.perout_phase is 1000000000
ts2phc[326.764]: config item /dev/ptp1.ts2phc.pulsewidth is 500000000
ts2phc[326.764]: PTP_PEROUT_REQUEST2 failed: Numerical result out of range

I'm sending a v2 with your change very soon.

Thanks.
-Vladimir
diff mbox series

Patch

diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c
index e0e6f85966e1..02fcd5e8b998 100644
--- a/drivers/ptp/ptp_chardev.c
+++ b/drivers/ptp/ptp_chardev.c
@@ -218,6 +218,19 @@  long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
 					break;
 				}
 			}
+			if (perout->flags & PTP_PEROUT_PHASE) {
+				/*
+				 * The phase should be specified modulo the
+				 * period, therefore anything larger than 1
+				 * period is invalid.
+				 */
+				if (perout->phase.sec > perout->period.sec ||
+				    (perout->phase.sec == perout->period.sec &&
+				     perout->phase.nsec > perout->period.nsec)) {
+					err = -ERANGE;
+					break;
+				}
+			}
 		} else if (cmd == PTP_PEROUT_REQUEST) {
 			req.perout.flags &= PTP_PEROUT_V1_VALID_FLAGS;
 			req.perout.rsv[0] = 0;