diff options
Diffstat (limited to 'net/core/timestamping.c')
-rw-r--r-- | net/core/timestamping.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/core/timestamping.c b/net/core/timestamping.c index 0ae6c22da85b..7e7ca375d431 100644 --- a/net/core/timestamping.c +++ b/net/core/timestamping.c | |||
@@ -26,12 +26,12 @@ static struct sock_filter ptp_filter[] = { | |||
26 | PTP_FILTER | 26 | PTP_FILTER |
27 | }; | 27 | }; |
28 | 28 | ||
29 | static unsigned int classify(struct sk_buff *skb) | 29 | static unsigned int classify(const struct sk_buff *skb) |
30 | { | 30 | { |
31 | if (likely(skb->dev && | 31 | if (likely(skb->dev && |
32 | skb->dev->phydev && | 32 | skb->dev->phydev && |
33 | skb->dev->phydev->drv)) | 33 | skb->dev->phydev->drv)) |
34 | return sk_run_filter(skb, ptp_filter, ARRAY_SIZE(ptp_filter)); | 34 | return sk_run_filter(skb, ptp_filter); |
35 | else | 35 | else |
36 | return PTP_CLASS_NONE; | 36 | return PTP_CLASS_NONE; |
37 | } | 37 | } |
@@ -96,11 +96,13 @@ bool skb_defer_rx_timestamp(struct sk_buff *skb) | |||
96 | struct phy_device *phydev; | 96 | struct phy_device *phydev; |
97 | unsigned int type; | 97 | unsigned int type; |
98 | 98 | ||
99 | skb_push(skb, ETH_HLEN); | 99 | if (skb_headroom(skb) < ETH_HLEN) |
100 | return false; | ||
101 | __skb_push(skb, ETH_HLEN); | ||
100 | 102 | ||
101 | type = classify(skb); | 103 | type = classify(skb); |
102 | 104 | ||
103 | skb_pull(skb, ETH_HLEN); | 105 | __skb_pull(skb, ETH_HLEN); |
104 | 106 | ||
105 | switch (type) { | 107 | switch (type) { |
106 | case PTP_CLASS_V1_IPV4: | 108 | case PTP_CLASS_V1_IPV4: |