• Vladimir Oltean's avatar
    net: dsa: Deny PTP on master if switch supports it · f685e609
    Vladimir Oltean authored
    It is possible to kill PTP on a DSA switch completely and absolutely,
    until a reboot, with a simple command:
    
    tcpdump -i eth2 -j adapter_unsynced
    
    where eth2 is the switch's DSA master.
    
    Why? Well, in short, the PTP API in place today is a bit rudimentary and
    relies on applications to retrieve the TX timestamps by polling the
    error queue and looking at the cmsg structure. But there is no timestamp
    identification of any sorts (except whether it's HW or SW), you don't
    know how many more timestamps are there to come, which one is this one,
    from whom it is, etc. In other words, the SO_TIMESTAMPING API is
    fundamentally limited in that you can get a single HW timestamp from the
    stack.
    
    And the "-j adapter_unsynced" flag of tcpdump enables hardware
    timestamping.
    
    So let's imagine what happens when the DSA master decides it wants to
    deliver TX timestamps to the skb's socket too:
    - The timestamp that the user space sees is taken by the DSA master.
      Whereas the RX timestamp will eventually be overwritten by the DSA
      switch. So the RX and TX timestamps will be in different time bases
      (aka garbage).
    - The user space applications have no way to deal with the second (real)
      TX timestamp finally delivered by the DSA switch, or even to know to
      wait for it.
    
    Take ptp4l from the linuxptp project, for example. This is its behavior
    after running tcpdump, before the patch:
    
    ptp4l[172]: [6469.594] Unexpected data on socket err queue:
    ptp4l[172]: [6469.693] rms    8 max   16 freq -21257 +/-  11 delay   748 +/-   0
    ptp4l[172]: [6469.711] Unexpected data on socket err queue:
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 03 aa 05 00 fd
    ptp4l[172]: 0030 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: [6469.721] Unexpected data on socket err queue:
    ptp4l[172]: 0000 01 80 c2 00 00 0e 00 1f 7b 63 02 48 88 f7 10 02
    ptp4l[172]: 0010 00 2c 00 00 02 00 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 01 c6 b1 00 fd
    ptp4l[172]: 0030 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: [6469.838] Unexpected data on socket err queue:
    ptp4l[172]: 0000 01 80 c2 00 00 0e 00 1f 7b 63 02 48 88 f7 10 02
    ptp4l[172]: 0010 00 2c 00 00 02 00 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 03 aa 06 00 fd
    ptp4l[172]: 0030 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: [6469.848] Unexpected data on socket err queue:
    ptp4l[172]: 0000 01 80 c2 00 00 0e 00 1f 7b 63 02 48 88 f7 13 02
    ptp4l[172]: 0010 00 36 00 00 02 00 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 04 1a 45 05 7f
    ptp4l[172]: 0030 00 00 5e 05 41 32 27 c2 1a 68 00 04 9f ff fe 05
    ptp4l[172]: 0040 de 06 00 01
    ptp4l[172]: [6469.855] Unexpected data on socket err queue:
    ptp4l[172]: 0000 01 80 c2 00 00 0e 00 1f 7b 63 02 48 88 f7 10 02
    ptp4l[172]: 0010 00 2c 00 00 02 00 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 01 c6 b2 00 fd
    ptp4l[172]: 0030 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: [6469.974] Unexpected data on socket err queue:
    ptp4l[172]: 0000 01 80 c2 00 00 0e 00 1f 7b 63 02 48 88 f7 10 02
    ptp4l[172]: 0010 00 2c 00 00 02 00 00 00 00 00 00 00 00 00 00 00
    ptp4l[172]: 0020 00 00 00 1f 7b ff fe 63 02 48 00 03 aa 07 00 fd
    ptp4l[172]: 0030 00 00 00 00 00 00 00 00 00 00
    
    The ptp4l program itself is heavily patched to show this (more details
    here [0]). Otherwise, by default it just hangs.
    
    On the other hand, with the DSA patch to disallow HW timestamping
    applied:
    
    tcpdump -i eth2 -j adapter_unsynced
    tcpdump: SIOCSHWTSTAMP failed: Device or resource busy
    
    So it is a fact of life that PTP timestamping on the DSA master is
    incompatible with timestamping on the switch MAC, at least with the
    current API. And if the switch supports PTP, taking the timestamps from
    the switch MAC is highly preferable anyway, due to the fact that those
    don't contain the queuing latencies of the switch. So just disallow PTP
    on the DSA master if there is any PTP-capable switch attached.
    
    [0]: https://sourceforge.net/p/linuxptp/mailman/message/36880648/
    
    Fixes: 0336369d ("net: dsa: forward hardware timestamping ioctls to switch driver")
    Signed-off-by: default avatarVladimir Oltean <olteanv@gmail.com>
    Acked-by: default avatarRichard Cochran <richardcochran@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f685e609
master.c 9.62 KB