From 2ee764b2a195cd7c145c06d6b6b8918b3f1c6629 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Thu, 10 Jan 2013 12:36:42 +0000 Subject: [PATCH] --- yaml --- r: 351339 b: refs/heads/master c: 1def9238d4aa2146924994aa4b7dc861f03b9362 h: refs/heads/master i: 351337: 2ec048e57973035fae6d300da8dc2e31f2f0e7fb 351335: 3f1c651f1596ad7823a4063af2b9a20300ce8dd3 v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 861cacd9efa4..34a9576fad9e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3d55b323709661df34d93e4cdcc5337620e34dfd +refs/heads/master: 1def9238d4aa2146924994aa4b7dc861f03b9362 diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 594830e83589..4794cae84939 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -2532,6 +2532,26 @@ struct netdev_queue *netdev_pick_tx(struct net_device *dev, return netdev_get_tx_queue(dev, queue_index); } +static void qdisc_pkt_len_init(struct sk_buff *skb) +{ + const struct skb_shared_info *shinfo = skb_shinfo(skb); + + qdisc_skb_cb(skb)->pkt_len = skb->len; + + /* To get more precise estimation of bytes sent on wire, + * we add to pkt_len the headers size of all segments + */ + if (shinfo->gso_size) { + unsigned int hdr_len = skb_transport_offset(skb); + + if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) + hdr_len += tcp_hdrlen(skb); + else + hdr_len += sizeof(struct udphdr); + qdisc_skb_cb(skb)->pkt_len += (shinfo->gso_segs - 1) * hdr_len; + } +} + static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, struct net_device *dev, struct netdev_queue *txq) @@ -2540,7 +2560,7 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, bool contended; int rc; - qdisc_skb_cb(skb)->pkt_len = skb->len; + qdisc_pkt_len_init(skb); qdisc_calculate_pkt_len(skb, q); /* * Heuristic to force contended enqueues to serialize on a