timestamping.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * PTP 1588 clock support - support for timestamping in PHY devices
  4. *
  5. * Copyright (C) 2010 OMICRON electronics GmbH
  6. */
  7. #include <linux/errqueue.h>
  8. #include <linux/phy.h>
  9. #include <linux/ptp_classify.h>
  10. #include <linux/skbuff.h>
  11. #include <linux/export.h>
  12. static unsigned int classify(const struct sk_buff *skb)
  13. {
  14. if (likely(skb->dev && skb->dev->phydev &&
  15. skb->dev->phydev->mii_ts))
  16. return ptp_classify_raw(skb);
  17. else
  18. return PTP_CLASS_NONE;
  19. }
  20. void skb_clone_tx_timestamp(struct sk_buff *skb)
  21. {
  22. struct mii_timestamper *mii_ts;
  23. struct sk_buff *clone;
  24. unsigned int type;
  25. if (!skb->sk || !skb->dev ||
  26. !phy_is_default_hwtstamp(skb->dev->phydev))
  27. return;
  28. type = classify(skb);
  29. if (type == PTP_CLASS_NONE)
  30. return;
  31. mii_ts = skb->dev->phydev->mii_ts;
  32. if (likely(mii_ts->txtstamp)) {
  33. clone = skb_clone_sk(skb);
  34. if (!clone)
  35. return;
  36. mii_ts->txtstamp(mii_ts, clone, type);
  37. }
  38. }
  39. EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);
  40. bool skb_defer_rx_timestamp(struct sk_buff *skb)
  41. {
  42. struct mii_timestamper *mii_ts;
  43. unsigned int type;
  44. if (!skb->dev || !phy_is_default_hwtstamp(skb->dev->phydev))
  45. return false;
  46. if (skb_headroom(skb) < ETH_HLEN)
  47. return false;
  48. __skb_push(skb, ETH_HLEN);
  49. type = ptp_classify_raw(skb);
  50. __skb_pull(skb, ETH_HLEN);
  51. if (type == PTP_CLASS_NONE)
  52. return false;
  53. mii_ts = skb->dev->phydev->mii_ts;
  54. if (likely(mii_ts->rxtstamp))
  55. return mii_ts->rxtstamp(mii_ts, skb, type);
  56. return false;
  57. }
  58. EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp);