diff options
author | Ben Hutchings <ben.hutchings@codethink.co.uk> | 2015-03-25 21:41:33 +0100 |
---|---|---|
committer | Luis Henriques <luis.henriques@canonical.com> | 2015-04-27 09:48:14 +0100 |
commit | 08e0ae0370706aaa18bab048aade89b81470a71e (patch) | |
tree | 6bc5a844fae6cda3184a4bebee44ede73f14c79f /include/linux/usb | |
parent | 7d2237ad7d172dcca04c68378fdfe571d0aaff12 (diff) | |
download | linux-stable-08e0ae0370706aaa18bab048aade89b81470a71e.tar.gz linux-stable-08e0ae0370706aaa18bab048aade89b81470a71e.tar.bz2 linux-stable-08e0ae0370706aaa18bab048aade89b81470a71e.zip |
usbnet: Fix tx_bytes statistic running backward in cdc_ncm
commit 7a1e890e2168e33fb62d84528e996b8b4b478fea upstream.
cdc_ncm disagrees with usbnet about how much framing overhead should
be counted in the tx_bytes statistics, and tries 'fix' this by
decrementing tx_bytes on the transmit path. But statistics must never
be decremented except due to roll-over; this will thoroughly confuse
user-space. Also, tx_bytes is only incremented by usbnet in the
completion path.
Fix this by requiring drivers that set FLAG_MULTI_FRAME to set a
tx_bytes delta along with the tx_packets count.
Fixes: beeecd42c3b4 ("net: cdc_ncm/cdc_mbim: adding NCM protocol statistics")
Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
Diffstat (limited to 'include/linux/usb')
-rw-r--r-- | include/linux/usb/usbnet.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 539eea72129c..36afcd9ca57d 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h @@ -220,7 +220,7 @@ struct skb_data { /* skb->cb is one of these */ struct urb *urb; struct usbnet *dev; enum skb_state state; - size_t length; + long length; unsigned long packets; }; @@ -228,11 +228,13 @@ struct skb_data { /* skb->cb is one of these */ * tx_fixup method before returning an skb. */ static inline void -usbnet_set_skb_tx_stats(struct sk_buff *skb, unsigned long packets) +usbnet_set_skb_tx_stats(struct sk_buff *skb, + unsigned long packets, long bytes_delta) { struct skb_data *entry = (struct skb_data *) skb->cb; entry->packets = packets; + entry->length = bytes_delta; } extern int usbnet_open(struct net_device *net); |