diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/bat_sysfs.c | 4 | ||||
| -rw-r--r-- | net/batman-adv/bitarray.c | 2 | ||||
| -rw-r--r-- | net/batman-adv/gateway_client.c | 151 | ||||
| -rw-r--r-- | net/batman-adv/gateway_client.h | 5 | ||||
| -rw-r--r-- | net/batman-adv/gateway_common.c | 4 | ||||
| -rw-r--r-- | net/batman-adv/hash.c | 4 | ||||
| -rw-r--r-- | net/batman-adv/hash.h | 13 | ||||
| -rw-r--r-- | net/batman-adv/main.h | 2 | ||||
| -rw-r--r-- | net/batman-adv/originator.c | 13 | ||||
| -rw-r--r-- | net/batman-adv/originator.h | 2 | ||||
| -rw-r--r-- | net/batman-adv/routing.c | 22 | ||||
| -rw-r--r-- | net/batman-adv/soft-interface.c | 43 | ||||
| -rw-r--r-- | net/batman-adv/translation-table.c | 100 | ||||
| -rw-r--r-- | net/batman-adv/vis.c | 17 | 
14 files changed, 201 insertions, 181 deletions
diff --git a/net/batman-adv/bat_sysfs.c b/net/batman-adv/bat_sysfs.c index b8a7414c357..c25492f7d66 100644 --- a/net/batman-adv/bat_sysfs.c +++ b/net/batman-adv/bat_sysfs.c @@ -174,7 +174,7 @@ static int store_uint_attr(const char *buff, size_t count,  	unsigned long uint_val;  	int ret; -	ret = strict_strtoul(buff, 10, &uint_val); +	ret = kstrtoul(buff, 10, &uint_val);  	if (ret) {  		bat_info(net_dev,  			 "%s: Invalid parameter received: %s\n", @@ -239,7 +239,7 @@ static ssize_t store_vis_mode(struct kobject *kobj, struct attribute *attr,  	unsigned long val;  	int ret, vis_mode_tmp = -1; -	ret = strict_strtoul(buff, 10, &val); +	ret = kstrtoul(buff, 10, &val);  	if (((count == 2) && (!ret) && (val == VIS_TYPE_CLIENT_UPDATE)) ||  	    (strncmp(buff, "client", 6) == 0) || diff --git a/net/batman-adv/bitarray.c b/net/batman-adv/bitarray.c index 0be9ff346fa..9bc63b209b3 100644 --- a/net/batman-adv/bitarray.c +++ b/net/batman-adv/bitarray.c @@ -155,7 +155,7 @@ int bit_get_packet(void *priv, unsigned long *seq_bits,  	/* sequence number is much newer, probably missed a lot of packets */  	if ((seq_num_diff >= TQ_LOCAL_WINDOW_SIZE) -		|| (seq_num_diff < EXPECTED_SEQNO_RANGE)) { +		&& (seq_num_diff < EXPECTED_SEQNO_RANGE)) {  		bat_dbg(DBG_BATMAN, bat_priv,  			"We missed a lot of packets (%i) !\n",  			seq_num_diff - 1); diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c index 619fb73b3b7..9373a143c6d 100644 --- a/net/batman-adv/gateway_client.c +++ b/net/batman-adv/gateway_client.c @@ -25,6 +25,7 @@  #include "gateway_common.h"  #include "hard-interface.h"  #include "originator.h" +#include "translation-table.h"  #include "routing.h"  #include <linux/ip.h>  #include <linux/ipv6.h> @@ -572,108 +573,142 @@ out:  	return ret;  } -int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb, -		 struct orig_node *old_gw) +bool gw_is_dhcp_target(struct sk_buff *skb, unsigned int *header_len)  {  	struct ethhdr *ethhdr;  	struct iphdr *iphdr;  	struct ipv6hdr *ipv6hdr;  	struct udphdr *udphdr; -	struct gw_node *curr_gw; -	struct neigh_node *neigh_curr = NULL, *neigh_old = NULL; -	unsigned int header_len = 0; -	int ret = 1; - -	if (atomic_read(&bat_priv->gw_mode) == GW_MODE_OFF) -		return 0;  	/* check for ethernet header */ -	if (!pskb_may_pull(skb, header_len + ETH_HLEN)) -		return 0; +	if (!pskb_may_pull(skb, *header_len + ETH_HLEN)) +		return false;  	ethhdr = (struct ethhdr *)skb->data; -	header_len += ETH_HLEN; +	*header_len += ETH_HLEN;  	/* check for initial vlan header */  	if (ntohs(ethhdr->h_proto) == ETH_P_8021Q) { -		if (!pskb_may_pull(skb, header_len + VLAN_HLEN)) -			return 0; +		if (!pskb_may_pull(skb, *header_len + VLAN_HLEN)) +			return false;  		ethhdr = (struct ethhdr *)(skb->data + VLAN_HLEN); -		header_len += VLAN_HLEN; +		*header_len += VLAN_HLEN;  	}  	/* check for ip header */  	switch (ntohs(ethhdr->h_proto)) {  	case ETH_P_IP: -		if (!pskb_may_pull(skb, header_len + sizeof(*iphdr))) -			return 0; -		iphdr = (struct iphdr *)(skb->data + header_len); -		header_len += iphdr->ihl * 4; +		if (!pskb_may_pull(skb, *header_len + sizeof(*iphdr))) +			return false; +		iphdr = (struct iphdr *)(skb->data + *header_len); +		*header_len += iphdr->ihl * 4;  		/* check for udp header */  		if (iphdr->protocol != IPPROTO_UDP) -			return 0; +			return false;  		break;  	case ETH_P_IPV6: -		if (!pskb_may_pull(skb, header_len + sizeof(*ipv6hdr))) -			return 0; -		ipv6hdr = (struct ipv6hdr *)(skb->data + header_len); -		header_len += sizeof(*ipv6hdr); +		if (!pskb_may_pull(skb, *header_len + sizeof(*ipv6hdr))) +			return false; +		ipv6hdr = (struct ipv6hdr *)(skb->data + *header_len); +		*header_len += sizeof(*ipv6hdr);  		/* check for udp header */  		if (ipv6hdr->nexthdr != IPPROTO_UDP) -			return 0; +			return false;  		break;  	default: -		return 0; +		return false;  	} -	if (!pskb_may_pull(skb, header_len + sizeof(*udphdr))) -		return 0; -	udphdr = (struct udphdr *)(skb->data + header_len); -	header_len += sizeof(*udphdr); +	if (!pskb_may_pull(skb, *header_len + sizeof(*udphdr))) +		return false; +	udphdr = (struct udphdr *)(skb->data + *header_len); +	*header_len += sizeof(*udphdr);  	/* check for bootp port */  	if ((ntohs(ethhdr->h_proto) == ETH_P_IP) &&  	     (ntohs(udphdr->dest) != 67)) -		return 0; +		return false;  	if ((ntohs(ethhdr->h_proto) == ETH_P_IPV6) &&  	    (ntohs(udphdr->dest) != 547)) -		return 0; +		return false; -	if (atomic_read(&bat_priv->gw_mode) == GW_MODE_SERVER) -		return -1; +	return true; +} -	curr_gw = gw_get_selected_gw_node(bat_priv); -	if (!curr_gw) -		return 0; +bool gw_out_of_range(struct bat_priv *bat_priv, +		     struct sk_buff *skb, struct ethhdr *ethhdr) +{ +	struct neigh_node *neigh_curr = NULL, *neigh_old = NULL; +	struct orig_node *orig_dst_node = NULL; +	struct gw_node *curr_gw = NULL; +	bool ret, out_of_range = false; +	unsigned int header_len = 0; +	uint8_t curr_tq_avg; -	/* If old_gw != NULL then this packet is unicast. -	 * So, at this point we have to check the message type: if it is a -	 * DHCPREQUEST we have to decide whether to drop it or not */ -	if (old_gw && curr_gw->orig_node != old_gw) { -		if (is_type_dhcprequest(skb, header_len)) { -			/* If the dhcp packet has been sent to a different gw, -			 * we have to evaluate whether the old gw is still -			 * reliable enough */ -			neigh_curr = find_router(bat_priv, curr_gw->orig_node, -						 NULL); -			neigh_old = find_router(bat_priv, old_gw, NULL); -			if (!neigh_curr || !neigh_old) -				goto free_neigh; -			if (neigh_curr->tq_avg - neigh_old->tq_avg < -								GW_THRESHOLD) -				ret = -1; -		} +	ret = gw_is_dhcp_target(skb, &header_len); +	if (!ret) +		goto out; + +	orig_dst_node = transtable_search(bat_priv, ethhdr->h_source, +					  ethhdr->h_dest); +	if (!orig_dst_node) +		goto out; + +	if (!orig_dst_node->gw_flags) +		goto out; + +	ret = is_type_dhcprequest(skb, header_len); +	if (!ret) +		goto out; + +	switch (atomic_read(&bat_priv->gw_mode)) { +	case GW_MODE_SERVER: +		/* If we are a GW then we are our best GW. We can artificially +		 * set the tq towards ourself as the maximum value */ +		curr_tq_avg = TQ_MAX_VALUE; +		break; +	case GW_MODE_CLIENT: +		curr_gw = gw_get_selected_gw_node(bat_priv); +		if (!curr_gw) +			goto out; + +		/* packet is going to our gateway */ +		if (curr_gw->orig_node == orig_dst_node) +			goto out; + +		/* If the dhcp packet has been sent to a different gw, +		 * we have to evaluate whether the old gw is still +		 * reliable enough */ +		neigh_curr = find_router(bat_priv, curr_gw->orig_node, NULL); +		if (!neigh_curr) +			goto out; + +		curr_tq_avg = neigh_curr->tq_avg; +		break; +	case GW_MODE_OFF: +	default: +		goto out;  	} -free_neigh: + +	neigh_old = find_router(bat_priv, orig_dst_node, NULL); +	if (!!neigh_old) +		goto out; + +	if (curr_tq_avg - neigh_old->tq_avg > GW_THRESHOLD) +		out_of_range = true; + +out: +	if (orig_dst_node) +		orig_node_free_ref(orig_dst_node); +	if (curr_gw) +		gw_node_free_ref(curr_gw);  	if (neigh_old)  		neigh_node_free_ref(neigh_old);  	if (neigh_curr)  		neigh_node_free_ref(neigh_curr); -	if (curr_gw) -		gw_node_free_ref(curr_gw); -	return ret; +	return out_of_range;  } diff --git a/net/batman-adv/gateway_client.h b/net/batman-adv/gateway_client.h index b9b983c07fe..e1edba08eb1 100644 --- a/net/batman-adv/gateway_client.h +++ b/net/batman-adv/gateway_client.h @@ -31,7 +31,8 @@ void gw_node_update(struct bat_priv *bat_priv,  void gw_node_delete(struct bat_priv *bat_priv, struct orig_node *orig_node);  void gw_node_purge(struct bat_priv *bat_priv);  int gw_client_seq_print_text(struct seq_file *seq, void *offset); -int gw_is_target(struct bat_priv *bat_priv, struct sk_buff *skb, -		 struct orig_node *old_gw); +bool gw_is_dhcp_target(struct sk_buff *skb, unsigned int *header_len); +bool gw_out_of_range(struct bat_priv *bat_priv, +		     struct sk_buff *skb, struct ethhdr *ethhdr);  #endif /* _NET_BATMAN_ADV_GATEWAY_CLIENT_H_ */ diff --git a/net/batman-adv/gateway_common.c b/net/batman-adv/gateway_common.c index 18661af0bc3..c4ac7b0a2a6 100644 --- a/net/batman-adv/gateway_common.c +++ b/net/batman-adv/gateway_common.c @@ -97,7 +97,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,  			*tmp_ptr = '\0';  	} -	ret = strict_strtol(buff, 10, &ldown); +	ret = kstrtol(buff, 10, &ldown);  	if (ret) {  		bat_err(net_dev,  			"Download speed of gateway mode invalid: %s\n", @@ -122,7 +122,7 @@ static bool parse_gw_bandwidth(struct net_device *net_dev, char *buff,  				*tmp_ptr = '\0';  		} -		ret = strict_strtol(slash_ptr + 1, 10, &lup); +		ret = kstrtol(slash_ptr + 1, 10, &lup);  		if (ret) {  			bat_err(net_dev,  				"Upload speed of gateway mode invalid: " diff --git a/net/batman-adv/hash.c b/net/batman-adv/hash.c index 2a172505f51..d1da29da333 100644 --- a/net/batman-adv/hash.c +++ b/net/batman-adv/hash.c @@ -25,7 +25,7 @@  /* clears the hash */  static void hash_init(struct hashtable_t *hash)  { -	int i; +	uint32_t i;  	for (i = 0 ; i < hash->size; i++) {  		INIT_HLIST_HEAD(&hash->table[i]); @@ -42,7 +42,7 @@ void hash_destroy(struct hashtable_t *hash)  }  /* allocates and clears the hash */ -struct hashtable_t *hash_new(int size) +struct hashtable_t *hash_new(uint32_t size)  {  	struct hashtable_t *hash; diff --git a/net/batman-adv/hash.h b/net/batman-adv/hash.h index d20aa71ba1e..4768717f07f 100644 --- a/net/batman-adv/hash.h +++ b/net/batman-adv/hash.h @@ -33,17 +33,17 @@ typedef int (*hashdata_compare_cb)(const struct hlist_node *, const void *);  /* the hashfunction, should return an index   * based on the key in the data of the first   * argument and the size the second */ -typedef int (*hashdata_choose_cb)(const void *, int); +typedef uint32_t (*hashdata_choose_cb)(const void *, uint32_t);  typedef void (*hashdata_free_cb)(struct hlist_node *, void *);  struct hashtable_t {  	struct hlist_head *table;   /* the hashtable itself with the buckets */  	spinlock_t *list_locks;     /* spinlock for each hash list entry */ -	int size;		    /* size of hashtable */ +	uint32_t size;		    /* size of hashtable */  };  /* allocates and clears the hash */ -struct hashtable_t *hash_new(int size); +struct hashtable_t *hash_new(uint32_t size);  /* free only the hashtable and the hash itself. */  void hash_destroy(struct hashtable_t *hash); @@ -57,7 +57,7 @@ static inline void hash_delete(struct hashtable_t *hash,  	struct hlist_head *head;  	struct hlist_node *node, *node_tmp;  	spinlock_t *list_lock; /* spinlock to protect write access */ -	int i; +	uint32_t i;  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i]; @@ -93,7 +93,8 @@ static inline int hash_add(struct hashtable_t *hash,  			   hashdata_choose_cb choose,  			   const void *data, struct hlist_node *data_node)  { -	int index, ret = -1; +	uint32_t index; +	int ret = -1;  	struct hlist_head *head;  	struct hlist_node *node;  	spinlock_t *list_lock; /* spinlock to protect write access */ @@ -137,7 +138,7 @@ static inline void *hash_remove(struct hashtable_t *hash,  				hashdata_compare_cb compare,  				hashdata_choose_cb choose, void *data)  { -	size_t index; +	uint32_t index;  	struct hlist_node *node;  	struct hlist_head *head;  	void *data_save = NULL; diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h index 964ad4d8ba3..86354e06eb4 100644 --- a/net/batman-adv/main.h +++ b/net/batman-adv/main.h @@ -28,7 +28,7 @@  #define DRIVER_DEVICE "batman-adv"  #ifndef SOURCE_VERSION -#define SOURCE_VERSION "2011.4.0" +#define SOURCE_VERSION "2012.0.0"  #endif  /* B.A.T.M.A.N. parameters */ diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 0e5b77255d9..0bc2045a2f2 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@ -164,7 +164,7 @@ void originator_free(struct bat_priv *bat_priv)  	struct hlist_head *head;  	spinlock_t *list_lock; /* spinlock to protect write access */  	struct orig_node *orig_node; -	int i; +	uint32_t i;  	if (!hash)  		return; @@ -350,7 +350,7 @@ static void _purge_orig(struct bat_priv *bat_priv)  	struct hlist_head *head;  	spinlock_t *list_lock; /* spinlock to protect write access */  	struct orig_node *orig_node; -	int i; +	uint32_t i;  	if (!hash)  		return; @@ -413,7 +413,8 @@ int orig_seq_print_text(struct seq_file *seq, void *offset)  	int batman_count = 0;  	int last_seen_secs;  	int last_seen_msecs; -	int i, ret = 0; +	uint32_t i; +	int ret = 0;  	primary_if = primary_if_get_selected(bat_priv); @@ -519,7 +520,8 @@ int orig_hash_add_if(struct hard_iface *hard_iface, int max_if_num)  	struct hlist_node *node;  	struct hlist_head *head;  	struct orig_node *orig_node; -	int i, ret; +	uint32_t i; +	int ret;  	/* resize all orig nodes because orig_node->bcast_own(_sum) depend on  	 * if_num */ @@ -601,7 +603,8 @@ int orig_hash_del_if(struct hard_iface *hard_iface, int max_if_num)  	struct hlist_head *head;  	struct hard_iface *hard_iface_tmp;  	struct orig_node *orig_node; -	int i, ret; +	uint32_t i; +	int ret;  	/* resize all orig nodes because orig_node->bcast_own(_sum) depend on  	 * if_num */ diff --git a/net/batman-adv/originator.h b/net/batman-adv/originator.h index cfc1f60a96a..67765ffef73 100644 --- a/net/batman-adv/originator.h +++ b/net/batman-adv/originator.h @@ -42,7 +42,7 @@ int orig_hash_del_if(struct hard_iface *hard_iface, int max_if_num);  /* hashfunction to choose an entry in a hash table of given size */  /* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */ -static inline int choose_orig(const void *data, int32_t size) +static inline uint32_t choose_orig(const void *data, uint32_t size)  {  	const unsigned char *key = data;  	uint32_t hash = 0; diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index f961cc5eade..ef24a7205f6 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c @@ -39,7 +39,7 @@ void slide_own_bcast_window(struct hard_iface *hard_iface)  	struct hlist_head *head;  	struct orig_node *orig_node;  	unsigned long *word; -	int i; +	uint32_t i;  	size_t word_index;  	for (i = 0; i < hash->size; i++) { @@ -578,6 +578,7 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)  {  	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);  	struct tt_query_packet *tt_query; +	uint16_t tt_len;  	struct ethhdr *ethhdr;  	/* drop packet if it has not necessary minimum size */ @@ -616,13 +617,22 @@ int recv_tt_query(struct sk_buff *skb, struct hard_iface *recv_if)  		}  		break;  	case TT_RESPONSE: -		/* packet needs to be linearized to access the TT changes */ -		if (skb_linearize(skb) < 0) -			goto out; +		if (is_my_mac(tt_query->dst)) { +			/* packet needs to be linearized to access the TT +			 * changes */ +			if (skb_linearize(skb) < 0) +				goto out; + +			tt_len = tt_query->tt_data * sizeof(struct tt_change); + +			/* Ensure we have all the claimed data */ +			if (unlikely(skb_headlen(skb) < +					sizeof(struct tt_query_packet) + +					tt_len)) +				goto out; -		if (is_my_mac(tt_query->dst))  			handle_tt_response(bat_priv, tt_query); -		else { +		} else {  			bat_dbg(DBG_TT, bat_priv,  				"Routing TT_RESPONSE to %pM [%c]\n",  				tt_query->dst, diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index f9cc9572898..45297c84309 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@ -563,10 +563,10 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)  	struct bcast_packet *bcast_packet;  	struct vlan_ethhdr *vhdr;  	struct softif_neigh *curr_softif_neigh = NULL; -	struct orig_node *orig_node = NULL; +	unsigned int header_len = 0;  	int data_len = skb->len, ret;  	short vid = -1; -	bool do_bcast; +	bool do_bcast = false;  	if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE)  		goto dropped; @@ -598,17 +598,28 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)  	/* Register the client MAC in the transtable */  	tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif); -	orig_node = transtable_search(bat_priv, ethhdr->h_source, -				      ethhdr->h_dest); -	do_bcast = is_multicast_ether_addr(ethhdr->h_dest); -	if (do_bcast || (orig_node && orig_node->gw_flags)) { -		ret = gw_is_target(bat_priv, skb, orig_node); +	if (is_multicast_ether_addr(ethhdr->h_dest)) { +		do_bcast = true; -		if (ret < 0) -			goto dropped; - -		if (ret) -			do_bcast = false; +		switch (atomic_read(&bat_priv->gw_mode)) { +		case GW_MODE_SERVER: +			/* gateway servers should not send dhcp +			 * requests into the mesh */ +			ret = gw_is_dhcp_target(skb, &header_len); +			if (ret) +				goto dropped; +			break; +		case GW_MODE_CLIENT: +			/* gateway clients should send dhcp requests +			 * via unicast to their gateway */ +			ret = gw_is_dhcp_target(skb, &header_len); +			if (ret) +				do_bcast = false; +			break; +		case GW_MODE_OFF: +		default: +			break; +		}  	}  	/* ethernet packet should be broadcasted */ @@ -644,6 +655,12 @@ static int interface_tx(struct sk_buff *skb, struct net_device *soft_iface)  	/* unicast packet */  	} else { +		if (atomic_read(&bat_priv->gw_mode) != GW_MODE_OFF) { +			ret = gw_out_of_range(bat_priv, skb, ethhdr); +			if (ret) +				goto dropped; +		} +  		ret = unicast_send_skb(skb, bat_priv);  		if (ret != 0)  			goto dropped_freed; @@ -662,8 +679,6 @@ end:  		softif_neigh_free_ref(curr_softif_neigh);  	if (primary_if)  		hardif_free_ref(primary_if); -	if (orig_node) -		orig_node_free_ref(orig_node);  	return NETDEV_TX_OK;  } diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index c7aafc7c5ed..78b9528bfc2 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c @@ -67,7 +67,7 @@ static struct tt_local_entry *tt_local_hash_find(struct bat_priv *bat_priv,  	struct hlist_head *head;  	struct hlist_node *node;  	struct tt_local_entry *tt_local_entry, *tt_local_entry_tmp = NULL; -	int index; +	uint32_t index;  	if (!hash)  		return NULL; @@ -99,7 +99,7 @@ static struct tt_global_entry *tt_global_hash_find(struct bat_priv *bat_priv,  	struct hlist_node *node;  	struct tt_global_entry *tt_global_entry;  	struct tt_global_entry *tt_global_entry_tmp = NULL; -	int index; +	uint32_t index;  	if (!hash)  		return NULL; @@ -314,9 +314,8 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)  	struct hard_iface *primary_if;  	struct hlist_node *node;  	struct hlist_head *head; -	size_t buf_size, pos; -	char *buff; -	int i, ret = 0; +	uint32_t i; +	int ret = 0;  	primary_if = primary_if_get_selected(bat_priv);  	if (!primary_if) { @@ -337,34 +336,13 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)  		   "announced via TT (TTVN: %u):\n",  		   net_dev->name, (uint8_t)atomic_read(&bat_priv->ttvn)); -	buf_size = 1; -	/* Estimate length for: " * xx:xx:xx:xx:xx:xx\n" */ -	for (i = 0; i < hash->size; i++) { -		head = &hash->table[i]; - -		rcu_read_lock(); -		__hlist_for_each_rcu(node, head) -			buf_size += 29; -		rcu_read_unlock(); -	} - -	buff = kmalloc(buf_size, GFP_ATOMIC); -	if (!buff) { -		ret = -ENOMEM; -		goto out; -	} - -	buff[0] = '\0'; -	pos = 0; -  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i];  		rcu_read_lock();  		hlist_for_each_entry_rcu(tt_local_entry, node,  					 head, hash_entry) { -			pos += snprintf(buff + pos, 30, " * %pM " -					"[%c%c%c%c%c]\n", +			seq_printf(seq, " * %pM [%c%c%c%c%c]\n",  					tt_local_entry->addr,  					(tt_local_entry->flags &  					 TT_CLIENT_ROAM ? 'R' : '.'), @@ -379,9 +357,6 @@ int tt_local_seq_print_text(struct seq_file *seq, void *offset)  		}  		rcu_read_unlock();  	} - -	seq_printf(seq, "%s", buff); -	kfree(buff);  out:  	if (primary_if)  		hardif_free_ref(primary_if); @@ -427,7 +402,7 @@ static void tt_local_purge(struct bat_priv *bat_priv)  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head;  	spinlock_t *list_lock; /* protects write access to the hash lists */ -	int i; +	uint32_t i;  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i]; @@ -465,7 +440,7 @@ static void tt_local_table_free(struct bat_priv *bat_priv)  	struct tt_local_entry *tt_local_entry;  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head; -	int i; +	uint32_t i;  	if (!bat_priv->tt_local_hash)  		return; @@ -590,9 +565,8 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)  	struct hard_iface *primary_if;  	struct hlist_node *node;  	struct hlist_head *head; -	size_t buf_size, pos; -	char *buff; -	int i, ret = 0; +	uint32_t i; +	int ret = 0;  	primary_if = primary_if_get_selected(bat_priv);  	if (!primary_if) { @@ -615,35 +589,13 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)  	seq_printf(seq, "       %-13s %s       %-15s %s %s\n",  		   "Client", "(TTVN)", "Originator", "(Curr TTVN)", "Flags"); -	buf_size = 1; -	/* Estimate length for: " * xx:xx:xx:xx:xx:xx (ttvn) via -	 * xx:xx:xx:xx:xx:xx (cur_ttvn)\n"*/ -	for (i = 0; i < hash->size; i++) { -		head = &hash->table[i]; - -		rcu_read_lock(); -		__hlist_for_each_rcu(node, head) -			buf_size += 67; -		rcu_read_unlock(); -	} - -	buff = kmalloc(buf_size, GFP_ATOMIC); -	if (!buff) { -		ret = -ENOMEM; -		goto out; -	} - -	buff[0] = '\0'; -	pos = 0; -  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i];  		rcu_read_lock();  		hlist_for_each_entry_rcu(tt_global_entry, node,  					 head, hash_entry) { -			pos += snprintf(buff + pos, 69, -					" * %pM  (%3u) via %pM     (%3u)   " +			seq_printf(seq, " * %pM  (%3u) via %pM     (%3u)   "  					"[%c%c%c]\n", tt_global_entry->addr,  					tt_global_entry->ttvn,  					tt_global_entry->orig_node->orig, @@ -659,9 +611,6 @@ int tt_global_seq_print_text(struct seq_file *seq, void *offset)  		}  		rcu_read_unlock();  	} - -	seq_printf(seq, "%s", buff); -	kfree(buff);  out:  	if (primary_if)  		hardif_free_ref(primary_if); @@ -716,7 +665,7 @@ void tt_global_del_orig(struct bat_priv *bat_priv,  			struct orig_node *orig_node, const char *message)  {  	struct tt_global_entry *tt_global_entry; -	int i; +	uint32_t i;  	struct hashtable_t *hash = bat_priv->tt_global_hash;  	struct hlist_node *node, *safe;  	struct hlist_head *head; @@ -735,9 +684,10 @@ void tt_global_del_orig(struct bat_priv *bat_priv,  			if (tt_global_entry->orig_node == orig_node) {  				bat_dbg(DBG_TT, bat_priv,  					"Deleting global tt entry %pM " -					"(via %pM): originator time out\n", +					"(via %pM): %s\n",  					tt_global_entry->addr, -					tt_global_entry->orig_node->orig); +					tt_global_entry->orig_node->orig, +					message);  				hlist_del_rcu(node);  				tt_global_entry_free_ref(tt_global_entry);  			} @@ -754,7 +704,7 @@ static void tt_global_roam_purge(struct bat_priv *bat_priv)  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head;  	spinlock_t *list_lock; /* protects write access to the hash lists */ -	int i; +	uint32_t i;  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i]; @@ -788,7 +738,7 @@ static void tt_global_table_free(struct bat_priv *bat_priv)  	struct tt_global_entry *tt_global_entry;  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head; -	int i; +	uint32_t i;  	if (!bat_priv->tt_global_hash)  		return; @@ -874,7 +824,8 @@ uint16_t tt_global_crc(struct bat_priv *bat_priv, struct orig_node *orig_node)  	struct tt_global_entry *tt_global_entry;  	struct hlist_node *node;  	struct hlist_head *head; -	int i, j; +	uint32_t i; +	int j;  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i]; @@ -911,7 +862,8 @@ uint16_t tt_local_crc(struct bat_priv *bat_priv)  	struct tt_local_entry *tt_local_entry;  	struct hlist_node *node;  	struct hlist_head *head; -	int i, j; +	uint32_t i; +	int j;  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i]; @@ -1048,7 +1000,7 @@ static struct sk_buff *tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,  	struct sk_buff *skb = NULL;  	uint16_t tt_tot, tt_count;  	ssize_t tt_query_size = sizeof(struct tt_query_packet); -	int i; +	uint32_t i;  	if (tt_query_size + tt_len > primary_if->soft_iface->mtu) {  		tt_len = primary_if->soft_iface->mtu - tt_query_size; @@ -1187,11 +1139,11 @@ static bool send_other_tt_response(struct bat_priv *bat_priv,  		(tt_request->flags & TT_FULL_TABLE ? 'F' : '.'));  	/* Let's get the orig node of the REAL destination */ -	req_dst_orig_node = get_orig_node(bat_priv, tt_request->dst); +	req_dst_orig_node = orig_hash_find(bat_priv, tt_request->dst);  	if (!req_dst_orig_node)  		goto out; -	res_dst_orig_node = get_orig_node(bat_priv, tt_request->src); +	res_dst_orig_node = orig_hash_find(bat_priv, tt_request->src);  	if (!res_dst_orig_node)  		goto out; @@ -1317,7 +1269,7 @@ static bool send_my_tt_response(struct bat_priv *bat_priv,  	my_ttvn = (uint8_t)atomic_read(&bat_priv->ttvn);  	req_ttvn = tt_request->ttvn; -	orig_node = get_orig_node(bat_priv, tt_request->src); +	orig_node = orig_hash_find(bat_priv, tt_request->src);  	if (!orig_node)  		goto out; @@ -1725,7 +1677,7 @@ void tt_free(struct bat_priv *bat_priv)   * entry */  static void tt_local_reset_flags(struct bat_priv *bat_priv, uint16_t flags)  { -	int i; +	uint32_t i;  	struct hashtable_t *hash = bat_priv->tt_local_hash;  	struct hlist_head *head;  	struct hlist_node *node; @@ -1758,7 +1710,7 @@ static void tt_local_purge_pending_clients(struct bat_priv *bat_priv)  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head;  	spinlock_t *list_lock; /* protects write access to the hash lists */ -	int i; +	uint32_t i;  	if (!hash)  		return; diff --git a/net/batman-adv/vis.c b/net/batman-adv/vis.c index f81a6b668b0..7445413253c 100644 --- a/net/batman-adv/vis.c +++ b/net/batman-adv/vis.c @@ -66,7 +66,7 @@ static int vis_info_cmp(const struct hlist_node *node, const void *data2)  /* hash function to choose an entry in a hash table of given size */  /* hash algorithm from http://en.wikipedia.org/wiki/Hash_table */ -static int vis_info_choose(const void *data, int size) +static uint32_t vis_info_choose(const void *data, uint32_t size)  {  	const struct vis_info *vis_info = data;  	const struct vis_packet *packet; @@ -96,7 +96,7 @@ static struct vis_info *vis_hash_find(struct bat_priv *bat_priv,  	struct hlist_head *head;  	struct hlist_node *node;  	struct vis_info *vis_info, *vis_info_tmp = NULL; -	int index; +	uint32_t index;  	if (!hash)  		return NULL; @@ -202,7 +202,8 @@ int vis_seq_print_text(struct seq_file *seq, void *offset)  	HLIST_HEAD(vis_if_list);  	struct if_list_entry *entry;  	struct hlist_node *pos, *n; -	int i, j, ret = 0; +	uint32_t i; +	int j, ret = 0;  	int vis_server = atomic_read(&bat_priv->vis_mode);  	size_t buff_pos, buf_size;  	char *buff; @@ -556,7 +557,8 @@ static int find_best_vis_server(struct bat_priv *bat_priv,  	struct hlist_head *head;  	struct orig_node *orig_node;  	struct vis_packet *packet; -	int best_tq = -1, i; +	int best_tq = -1; +	uint32_t i;  	packet = (struct vis_packet *)info->skb_packet->data; @@ -608,7 +610,8 @@ static int generate_vis_packet(struct bat_priv *bat_priv)  	struct vis_packet *packet = (struct vis_packet *)info->skb_packet->data;  	struct vis_info_entry *entry;  	struct tt_local_entry *tt_local_entry; -	int best_tq = -1, i; +	int best_tq = -1; +	uint32_t i;  	info->first_seen = jiffies;  	packet->vis_type = atomic_read(&bat_priv->vis_mode); @@ -696,7 +699,7 @@ unlock:   * held */  static void purge_vis_packets(struct bat_priv *bat_priv)  { -	int i; +	uint32_t i;  	struct hashtable_t *hash = bat_priv->vis_hash;  	struct hlist_node *node, *node_tmp;  	struct hlist_head *head; @@ -733,7 +736,7 @@ static void broadcast_vis_packet(struct bat_priv *bat_priv,  	struct sk_buff *skb;  	struct hard_iface *hard_iface;  	uint8_t dstaddr[ETH_ALEN]; -	int i; +	uint32_t i;  	packet = (struct vis_packet *)info->skb_packet->data;  |