aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/timestamping.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/timestamping.c')
-rw-r--r--net/core/timestamping.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/net/core/timestamping.c b/net/core/timestamping.c
index 661b5a40ec10..6521dfd8b7c8 100644
--- a/net/core/timestamping.c
+++ b/net/core/timestamping.c
@@ -23,16 +23,11 @@
23#include <linux/skbuff.h> 23#include <linux/skbuff.h>
24#include <linux/export.h> 24#include <linux/export.h>
25 25
26static struct sock_filter ptp_filter[] = {
27 PTP_FILTER
28};
29
30static unsigned int classify(const struct sk_buff *skb) 26static unsigned int classify(const struct sk_buff *skb)
31{ 27{
32 if (likely(skb->dev && 28 if (likely(skb->dev && skb->dev->phydev &&
33 skb->dev->phydev &&
34 skb->dev->phydev->drv)) 29 skb->dev->phydev->drv))
35 return sk_run_filter(skb, ptp_filter); 30 return ptp_classify_raw(skb);
36 else 31 else
37 return PTP_CLASS_NONE; 32 return PTP_CLASS_NONE;
38} 33}
@@ -60,11 +55,13 @@ void skb_clone_tx_timestamp(struct sk_buff *skb)
60 if (likely(phydev->drv->txtstamp)) { 55 if (likely(phydev->drv->txtstamp)) {
61 if (!atomic_inc_not_zero(&sk->sk_refcnt)) 56 if (!atomic_inc_not_zero(&sk->sk_refcnt))
62 return; 57 return;
58
63 clone = skb_clone(skb, GFP_ATOMIC); 59 clone = skb_clone(skb, GFP_ATOMIC);
64 if (!clone) { 60 if (!clone) {
65 sock_put(sk); 61 sock_put(sk);
66 return; 62 return;
67 } 63 }
64
68 clone->sk = sk; 65 clone->sk = sk;
69 phydev->drv->txtstamp(phydev, clone, type); 66 phydev->drv->txtstamp(phydev, clone, type);
70 } 67 }
@@ -89,12 +86,15 @@ void skb_complete_tx_timestamp(struct sk_buff *skb,
89 } 86 }
90 87
91 *skb_hwtstamps(skb) = *hwtstamps; 88 *skb_hwtstamps(skb) = *hwtstamps;
89
92 serr = SKB_EXT_ERR(skb); 90 serr = SKB_EXT_ERR(skb);
93 memset(serr, 0, sizeof(*serr)); 91 memset(serr, 0, sizeof(*serr));
94 serr->ee.ee_errno = ENOMSG; 92 serr->ee.ee_errno = ENOMSG;
95 serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING; 93 serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING;
96 skb->sk = NULL; 94 skb->sk = NULL;
95
97 err = sock_queue_err_skb(sk, skb); 96 err = sock_queue_err_skb(sk, skb);
97
98 sock_put(sk); 98 sock_put(sk);
99 if (err) 99 if (err)
100 kfree_skb(skb); 100 kfree_skb(skb);
@@ -132,8 +132,3 @@ bool skb_defer_rx_timestamp(struct sk_buff *skb)
132 return false; 132 return false;
133} 133}
134EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp); 134EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp);
135
136void __init skb_timestamping_init(void)
137{
138 BUG_ON(sk_chk_filter(ptp_filter, ARRAY_SIZE(ptp_filter)));
139}