diff options
Diffstat (limited to 'net/core/timestamping.c')
-rw-r--r-- | net/core/timestamping.c | 19 |
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 | ||
26 | static struct sock_filter ptp_filter[] = { | ||
27 | PTP_FILTER | ||
28 | }; | ||
29 | |||
30 | static unsigned int classify(const struct sk_buff *skb) | 26 | static 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 | } |
134 | EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp); | 134 | EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp); |
135 | |||
136 | void __init skb_timestamping_init(void) | ||
137 | { | ||
138 | BUG_ON(sk_chk_filter(ptp_filter, ARRAY_SIZE(ptp_filter))); | ||
139 | } | ||