|
@@ -62,6 +62,7 @@
|
|
struct pcpu_lstats {
|
|
struct pcpu_lstats {
|
|
unsigned long packets;
|
|
unsigned long packets;
|
|
unsigned long bytes;
|
|
unsigned long bytes;
|
|
|
|
+ unsigned long drops;
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -71,18 +72,22 @@ struct pcpu_lstats {
|
|
static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
{
|
|
{
|
|
struct pcpu_lstats *pcpu_lstats, *lb_stats;
|
|
struct pcpu_lstats *pcpu_lstats, *lb_stats;
|
|
|
|
+ int len;
|
|
|
|
|
|
skb_orphan(skb);
|
|
skb_orphan(skb);
|
|
|
|
|
|
- skb->protocol = eth_type_trans(skb,dev);
|
|
|
|
|
|
+ skb->protocol = eth_type_trans(skb, dev);
|
|
|
|
|
|
/* it's OK to use per_cpu_ptr() because BHs are off */
|
|
/* it's OK to use per_cpu_ptr() because BHs are off */
|
|
pcpu_lstats = dev->ml_priv;
|
|
pcpu_lstats = dev->ml_priv;
|
|
lb_stats = per_cpu_ptr(pcpu_lstats, smp_processor_id());
|
|
lb_stats = per_cpu_ptr(pcpu_lstats, smp_processor_id());
|
|
- lb_stats->bytes += skb->len;
|
|
|
|
- lb_stats->packets++;
|
|
|
|
|
|
|
|
- netif_rx(skb);
|
|
|
|
|
|
+ len = skb->len;
|
|
|
|
+ if (likely(netif_rx(skb) == NET_RX_SUCCESS)) {
|
|
|
|
+ lb_stats->bytes += len;
|
|
|
|
+ lb_stats->packets++;
|
|
|
|
+ } else
|
|
|
|
+ lb_stats->drops++;
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -93,6 +98,7 @@ static struct net_device_stats *loopback_get_stats(struct net_device *dev)
|
|
struct net_device_stats *stats = &dev->stats;
|
|
struct net_device_stats *stats = &dev->stats;
|
|
unsigned long bytes = 0;
|
|
unsigned long bytes = 0;
|
|
unsigned long packets = 0;
|
|
unsigned long packets = 0;
|
|
|
|
+ unsigned long drops = 0;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
pcpu_lstats = dev->ml_priv;
|
|
pcpu_lstats = dev->ml_priv;
|
|
@@ -102,11 +108,14 @@ static struct net_device_stats *loopback_get_stats(struct net_device *dev)
|
|
lb_stats = per_cpu_ptr(pcpu_lstats, i);
|
|
lb_stats = per_cpu_ptr(pcpu_lstats, i);
|
|
bytes += lb_stats->bytes;
|
|
bytes += lb_stats->bytes;
|
|
packets += lb_stats->packets;
|
|
packets += lb_stats->packets;
|
|
|
|
+ drops += lb_stats->drops;
|
|
}
|
|
}
|
|
stats->rx_packets = packets;
|
|
stats->rx_packets = packets;
|
|
stats->tx_packets = packets;
|
|
stats->tx_packets = packets;
|
|
- stats->rx_bytes = bytes;
|
|
|
|
- stats->tx_bytes = bytes;
|
|
|
|
|
|
+ stats->rx_dropped = drops;
|
|
|
|
+ stats->rx_errors = drops;
|
|
|
|
+ stats->rx_bytes = bytes;
|
|
|
|
+ stats->tx_bytes = bytes;
|
|
return stats;
|
|
return stats;
|
|
}
|
|
}
|
|
|
|
|