cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

timestamping.c (1487B)


      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
     13static unsigned int classify(const struct sk_buff *skb)
     14{
     15	if (likely(skb->dev && skb->dev->phydev &&
     16		   skb->dev->phydev->mii_ts))
     17		return ptp_classify_raw(skb);
     18	else
     19		return PTP_CLASS_NONE;
     20}
     21
     22void skb_clone_tx_timestamp(struct sk_buff *skb)
     23{
     24	struct mii_timestamper *mii_ts;
     25	struct sk_buff *clone;
     26	unsigned int type;
     27
     28	if (!skb->sk)
     29		return;
     30
     31	type = classify(skb);
     32	if (type == PTP_CLASS_NONE)
     33		return;
     34
     35	mii_ts = skb->dev->phydev->mii_ts;
     36	if (likely(mii_ts->txtstamp)) {
     37		clone = skb_clone_sk(skb);
     38		if (!clone)
     39			return;
     40		mii_ts->txtstamp(mii_ts, clone, type);
     41	}
     42}
     43EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);
     44
     45bool skb_defer_rx_timestamp(struct sk_buff *skb)
     46{
     47	struct mii_timestamper *mii_ts;
     48	unsigned int type;
     49
     50	if (!skb->dev || !skb->dev->phydev || !skb->dev->phydev->mii_ts)
     51		return false;
     52
     53	if (skb_headroom(skb) < ETH_HLEN)
     54		return false;
     55
     56	__skb_push(skb, ETH_HLEN);
     57
     58	type = ptp_classify_raw(skb);
     59
     60	__skb_pull(skb, ETH_HLEN);
     61
     62	if (type == PTP_CLASS_NONE)
     63		return false;
     64
     65	mii_ts = skb->dev->phydev->mii_ts;
     66	if (likely(mii_ts->rxtstamp))
     67		return mii_ts->rxtstamp(mii_ts, skb, type);
     68
     69	return false;
     70}
     71EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp);