diff options
Diffstat (limited to 'net/batman-adv/soft-interface.c')
| -rw-r--r-- | net/batman-adv/soft-interface.c | 27 | 
1 files changed, 24 insertions, 3 deletions
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 49e16b6e0ba3..7b3494ae6ad9 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@ -22,6 +22,7 @@  #include <linux/byteorder/generic.h>  #include <linux/cache.h>  #include <linux/compiler.h> +#include <linux/cpumask.h>  #include <linux/errno.h>  #include <linux/etherdevice.h>  #include <linux/ethtool.h> @@ -116,6 +117,26 @@ static int batadv_interface_release(struct net_device *dev)  	return 0;  } +/** + * batadv_sum_counter - Sum the cpu-local counters for index 'idx' + * @bat_priv: the bat priv with all the soft interface information + * @idx: index of counter to sum up + * + * Return: sum of all cpu-local counters + */ +static u64 batadv_sum_counter(struct batadv_priv *bat_priv,  size_t idx) +{ +	u64 *counters, sum = 0; +	int cpu; + +	for_each_possible_cpu(cpu) { +		counters = per_cpu_ptr(bat_priv->bat_counters, cpu); +		sum += counters[idx]; +	} + +	return sum; +} +  static struct net_device_stats *batadv_interface_stats(struct net_device *dev)  {  	struct batadv_priv *bat_priv = netdev_priv(dev); @@ -336,12 +357,12 @@ send:  		seqno = atomic_inc_return(&bat_priv->bcast_seqno);  		bcast_packet->seqno = htonl(seqno); -		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay); +		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay, true);  		/* a copy is stored in the bcast list, therefore removing  		 * the original skb.  		 */ -		kfree_skb(skb); +		consume_skb(skb);  	/* unicast packet */  	} else { @@ -365,7 +386,7 @@ send:  			ret = batadv_send_skb_via_tt(bat_priv, skb, dst_hint,  						     vid);  		} -		if (ret == NET_XMIT_DROP) +		if (ret != NET_XMIT_SUCCESS)  			goto dropped_freed;  	}  |