bridge: Have tx_bytes count headers like rx_bytes.
authorAshish Sharma <ashishsharma@google.com>
Sat, 8 Oct 2011 00:54:16 +0000 (17:54 -0700)
committerArve Hjønnevåg <arve@android.com>
Mon, 1 Jul 2013 20:40:37 +0000 (13:40 -0700)
Since rx_bytes accounting does not include Ethernet Headers in
br_input.c, excluding ETH_HLEN on the transmit path for consistent
measurement of packet length on both the Tx and Rx chains.

The clean way would be for Rx to include the eth header, but the
skb len has already been adjusted by the time the br code sees the skb.
This is only a temporary workaround until we can completely ignore or
cleanly fix the skb->len handling.

Change-Id: I910de95a4686b2119da7f1f326e2154ef31f9972
Signed-off-by: Ashish Sharma <ashishsharma@google.com>
net/bridge/br_device.c

index 967312803e4130f4e27712daed6d9dd9e2a1a9d6..239e0e84f9e6eef6ff5c17f8e6477d8663974aae 100644 (file)
@@ -41,11 +41,6 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        }
 #endif
 
-       u64_stats_update_begin(&brstats->syncp);
-       brstats->tx_packets++;
-       brstats->tx_bytes += skb->len;
-       u64_stats_update_end(&brstats->syncp);
-
        if (!br_allowed_ingress(br, br_get_vlan_info(br), skb, &vid))
                goto out;
 
@@ -54,6 +49,12 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        skb_reset_mac_header(skb);
        skb_pull(skb, ETH_HLEN);
 
+       u64_stats_update_begin(&brstats->syncp);
+       brstats->tx_packets++;
+       /* Exclude ETH_HLEN from byte stats for consistency with Rx chain */
+       brstats->tx_bytes += skb->len;
+       u64_stats_update_end(&brstats->syncp);
+
        if (is_broadcast_ether_addr(dest))
                br_flood_deliver(br, skb);
        else if (is_multicast_ether_addr(dest)) {