diff options
Diffstat (limited to 'net/batman-adv/network-coding.c')
| -rw-r--r-- | net/batman-adv/network-coding.c | 43 | 
1 files changed, 25 insertions, 18 deletions
diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c index e3baf697a35c..ab5a3bf0765f 100644 --- a/net/batman-adv/network-coding.c +++ b/net/batman-adv/network-coding.c @@ -44,7 +44,6 @@  #include <linux/skbuff.h>  #include <linux/slab.h>  #include <linux/spinlock.h> -#include <linux/stat.h>  #include <linux/stddef.h>  #include <linux/string.h>  #include <linux/workqueue.h> @@ -261,10 +260,16 @@ static void batadv_nc_path_put(struct batadv_nc_path *nc_path)  /**   * batadv_nc_packet_free - frees nc packet   * @nc_packet: the nc packet to free + * @dropped: whether the packet is freed because is is dropped   */ -static void batadv_nc_packet_free(struct batadv_nc_packet *nc_packet) +static void batadv_nc_packet_free(struct batadv_nc_packet *nc_packet, +				  bool dropped)  { -	kfree_skb(nc_packet->skb); +	if (dropped) +		kfree_skb(nc_packet->skb); +	else +		consume_skb(nc_packet->skb); +  	batadv_nc_path_put(nc_packet->nc_path);  	kfree(nc_packet);  } @@ -577,7 +582,7 @@ static void batadv_nc_send_packet(struct batadv_nc_packet *nc_packet)  {  	batadv_send_unicast_skb(nc_packet->skb, nc_packet->neigh_node);  	nc_packet->skb = NULL; -	batadv_nc_packet_free(nc_packet); +	batadv_nc_packet_free(nc_packet, false);  }  /** @@ -611,7 +616,7 @@ static bool batadv_nc_sniffed_purge(struct batadv_priv *bat_priv,  	/* purge nc packet */  	list_del(&nc_packet->list); -	batadv_nc_packet_free(nc_packet); +	batadv_nc_packet_free(nc_packet, true);  	res = true; @@ -1209,11 +1214,11 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,  	}  	/* skb_src is now coded into skb_dest, so free it */ -	kfree_skb(skb_src); +	consume_skb(skb_src);  	/* avoid duplicate free of skb from nc_packet */  	nc_packet->skb = NULL; -	batadv_nc_packet_free(nc_packet); +	batadv_nc_packet_free(nc_packet, false);  	/* Send the coded packet and return true */  	batadv_send_unicast_skb(skb_dest, first_dest); @@ -1400,7 +1405,7 @@ static void batadv_nc_skb_store_before_coding(struct batadv_priv *bat_priv,  	/* batadv_nc_skb_store_for_decoding() clones the skb, so we must free  	 * our ref  	 */ -	kfree_skb(skb); +	consume_skb(skb);  }  /** @@ -1724,7 +1729,7 @@ batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,  	ether_addr_copy(unicast_packet->dest, orig_dest);  	unicast_packet->ttvn = ttvn; -	batadv_nc_packet_free(nc_packet); +	batadv_nc_packet_free(nc_packet, false);  	return unicast_packet;  } @@ -1814,11 +1819,11 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,  	/* Check if network coding is enabled */  	if (!atomic_read(&bat_priv->network_coding)) -		return NET_RX_DROP; +		goto free_skb;  	/* Make sure we can access (and remove) header */  	if (unlikely(!pskb_may_pull(skb, hdr_size))) -		return NET_RX_DROP; +		goto free_skb;  	coded_packet = (struct batadv_coded_packet *)skb->data;  	ethhdr = eth_hdr(skb); @@ -1826,7 +1831,7 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,  	/* Verify frame is destined for us */  	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest) &&  	    !batadv_is_my_mac(bat_priv, coded_packet->second_dest)) -		return NET_RX_DROP; +		goto free_skb;  	/* Update stat counter */  	if (batadv_is_my_mac(bat_priv, coded_packet->second_dest)) @@ -1836,7 +1841,7 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,  						   coded_packet);  	if (!nc_packet) {  		batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE_FAILED); -		return NET_RX_DROP; +		goto free_skb;  	}  	/* Make skb's linear, because decoding accesses the entire buffer */ @@ -1861,7 +1866,10 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,  	return batadv_recv_unicast_packet(skb, recv_if);  free_nc_packet: -	batadv_nc_packet_free(nc_packet); +	batadv_nc_packet_free(nc_packet, true); +free_skb: +	kfree_skb(skb); +  	return NET_RX_DROP;  } @@ -1961,17 +1969,16 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv)  	if (!nc_dir)  		goto out; -	file = debugfs_create_u8("min_tq", S_IRUGO | S_IWUSR, nc_dir, -				 &bat_priv->nc.min_tq); +	file = debugfs_create_u8("min_tq", 0644, nc_dir, &bat_priv->nc.min_tq);  	if (!file)  		goto out; -	file = debugfs_create_u32("max_fwd_delay", S_IRUGO | S_IWUSR, nc_dir, +	file = debugfs_create_u32("max_fwd_delay", 0644, nc_dir,  				  &bat_priv->nc.max_fwd_delay);  	if (!file)  		goto out; -	file = debugfs_create_u32("max_buffer_time", S_IRUGO | S_IWUSR, nc_dir, +	file = debugfs_create_u32("max_buffer_time", 0644, nc_dir,  				  &bat_priv->nc.max_buffer_time);  	if (!file)  		goto out;  |