|
@@ -2588,6 +2588,7 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
|
|
|
*/
|
|
|
if (shinfo->gso_size) {
|
|
|
unsigned int hdr_len;
|
|
|
+ u16 gso_segs = shinfo->gso_segs;
|
|
|
|
|
|
/* mac layer + network layer */
|
|
|
hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
|
|
@@ -2597,7 +2598,12 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
|
|
|
hdr_len += tcp_hdrlen(skb);
|
|
|
else
|
|
|
hdr_len += sizeof(struct udphdr);
|
|
|
- qdisc_skb_cb(skb)->pkt_len += (shinfo->gso_segs - 1) * hdr_len;
|
|
|
+
|
|
|
+ if (shinfo->gso_type & SKB_GSO_DODGY)
|
|
|
+ gso_segs = DIV_ROUND_UP(skb->len - hdr_len,
|
|
|
+ shinfo->gso_size);
|
|
|
+
|
|
|
+ qdisc_skb_cb(skb)->pkt_len += (gso_segs - 1) * hdr_len;
|
|
|
}
|
|
|
}
|
|
|
|