|
@@ -2658,11 +2658,12 @@ static inline bool skb_needs_check(struct sk_buff *skb, bool tx_path)
|
|
|
struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
|
|
|
netdev_features_t features, bool tx_path)
|
|
|
{
|
|
|
+ struct sk_buff *segs;
|
|
|
+
|
|
|
if (unlikely(skb_needs_check(skb, tx_path))) {
|
|
|
int err;
|
|
|
|
|
|
- skb_warn_bad_offload(skb);
|
|
|
-
|
|
|
+ /* We're going to init ->check field in TCP or UDP header */
|
|
|
err = skb_cow_head(skb, 0);
|
|
|
if (err < 0)
|
|
|
return ERR_PTR(err);
|
|
@@ -2690,7 +2691,12 @@ struct sk_buff *__skb_gso_segment(struct sk_buff *skb,
|
|
|
skb_reset_mac_header(skb);
|
|
|
skb_reset_mac_len(skb);
|
|
|
|
|
|
- return skb_mac_gso_segment(skb, features);
|
|
|
+ segs = skb_mac_gso_segment(skb, features);
|
|
|
+
|
|
|
+ if (unlikely(skb_needs_check(skb, tx_path)))
|
|
|
+ skb_warn_bad_offload(skb);
|
|
|
+
|
|
|
+ return segs;
|
|
|
}
|
|
|
EXPORT_SYMBOL(__skb_gso_segment);
|
|
|
|