diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
| commit | bf61c8840efe60fd8f91446860b63338fb424158 (patch) | |
| tree | 7a71832407a4f0d6346db773343f4c3ae2257b19 /net/batman-adv/bridge_loop_avoidance.c | |
| parent | 5846115b30f3a881e542c8bfde59a699c1c13740 (diff) | |
| parent | 0c6a61657da78098472fd0eb71cc01f2387fa1bb (diff) | |
| download | olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.tar.xz olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.zip  | |
Merge branch 'next' into for-linus
Prepare first set of updates for 3.10 merge window.
Diffstat (limited to 'net/batman-adv/bridge_loop_avoidance.c')
| -rw-r--r-- | net/batman-adv/bridge_loop_avoidance.c | 297 | 
1 files changed, 145 insertions, 152 deletions
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c index fd8d5afec0d..6a4f728680a 100644 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2011-2012 B.A.T.M.A.N. contributors: +/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:   *   * Simon Wunderlich   * @@ -34,21 +34,18 @@  static const uint8_t batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};  static void batadv_bla_periodic_work(struct work_struct *work); -static void batadv_bla_send_announce(struct batadv_priv *bat_priv, -				     struct batadv_backbone_gw *backbone_gw); +static void +batadv_bla_send_announce(struct batadv_priv *bat_priv, +			 struct batadv_bla_backbone_gw *backbone_gw);  /* return the index of the claim */  static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)  { -	const unsigned char *key = data; +	struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;  	uint32_t hash = 0; -	size_t i; -	for (i = 0; i < ETH_ALEN + sizeof(short); i++) { -		hash += key[i]; -		hash += (hash << 10); -		hash ^= (hash >> 6); -	} +	hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); +	hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));  	hash += (hash << 3);  	hash ^= (hash >> 11); @@ -61,15 +58,11 @@ static inline uint32_t batadv_choose_claim(const void *data, uint32_t size)  static inline uint32_t batadv_choose_backbone_gw(const void *data,  						 uint32_t size)  { -	const unsigned char *key = data; +	const struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;  	uint32_t hash = 0; -	size_t i; -	for (i = 0; i < ETH_ALEN + sizeof(short); i++) { -		hash += key[i]; -		hash += (hash << 10); -		hash ^= (hash >> 6); -	} +	hash = batadv_hash_bytes(hash, &claim->addr, sizeof(claim->addr)); +	hash = batadv_hash_bytes(hash, &claim->vid, sizeof(claim->vid));  	hash += (hash << 3);  	hash ^= (hash >> 11); @@ -83,24 +76,39 @@ static inline uint32_t batadv_choose_backbone_gw(const void *data,  static int batadv_compare_backbone_gw(const struct hlist_node *node,  				      const void *data2)  { -	const void *data1 = container_of(node, struct batadv_backbone_gw, +	const void *data1 = container_of(node, struct batadv_bla_backbone_gw,  					 hash_entry); +	const struct batadv_bla_backbone_gw *gw1 = data1, *gw2 = data2; -	return (memcmp(data1, data2, ETH_ALEN + sizeof(short)) == 0 ? 1 : 0); +	if (!batadv_compare_eth(gw1->orig, gw2->orig)) +		return 0; + +	if (gw1->vid != gw2->vid) +		return 0; + +	return 1;  }  /* compares address and vid of two claims */  static int batadv_compare_claim(const struct hlist_node *node,  				const void *data2)  { -	const void *data1 = container_of(node, struct batadv_claim, +	const void *data1 = container_of(node, struct batadv_bla_claim,  					 hash_entry); +	const struct batadv_bla_claim *cl1 = data1, *cl2 = data2; -	return (memcmp(data1, data2, ETH_ALEN + sizeof(short)) == 0 ? 1 : 0); +	if (!batadv_compare_eth(cl1->addr, cl2->addr)) +		return 0; + +	if (cl1->vid != cl2->vid) +		return 0; + +	return 1;  }  /* free a backbone gw */ -static void batadv_backbone_gw_free_ref(struct batadv_backbone_gw *backbone_gw) +static void +batadv_backbone_gw_free_ref(struct batadv_bla_backbone_gw *backbone_gw)  {  	if (atomic_dec_and_test(&backbone_gw->refcount))  		kfree_rcu(backbone_gw, rcu); @@ -109,16 +117,16 @@ static void batadv_backbone_gw_free_ref(struct batadv_backbone_gw *backbone_gw)  /* finally deinitialize the claim */  static void batadv_claim_free_rcu(struct rcu_head *rcu)  { -	struct batadv_claim *claim; +	struct batadv_bla_claim *claim; -	claim = container_of(rcu, struct batadv_claim, rcu); +	claim = container_of(rcu, struct batadv_bla_claim, rcu);  	batadv_backbone_gw_free_ref(claim->backbone_gw);  	kfree(claim);  }  /* free a claim, call claim_free_rcu if its the last reference */ -static void batadv_claim_free_ref(struct batadv_claim *claim) +static void batadv_claim_free_ref(struct batadv_bla_claim *claim)  {  	if (atomic_dec_and_test(&claim->refcount))  		call_rcu(&claim->rcu, batadv_claim_free_rcu); @@ -130,14 +138,14 @@ static void batadv_claim_free_ref(struct batadv_claim *claim)   * looks for a claim in the hash, and returns it if found   * or NULL otherwise.   */ -static struct batadv_claim *batadv_claim_hash_find(struct batadv_priv *bat_priv, -						   struct batadv_claim *data) +static struct batadv_bla_claim +*batadv_claim_hash_find(struct batadv_priv *bat_priv, +			struct batadv_bla_claim *data)  {  	struct batadv_hashtable *hash = bat_priv->bla.claim_hash;  	struct hlist_head *head; -	struct hlist_node *node; -	struct batadv_claim *claim; -	struct batadv_claim *claim_tmp = NULL; +	struct batadv_bla_claim *claim; +	struct batadv_bla_claim *claim_tmp = NULL;  	int index;  	if (!hash) @@ -147,7 +155,7 @@ static struct batadv_claim *batadv_claim_hash_find(struct batadv_priv *bat_priv,  	head = &hash->table[index];  	rcu_read_lock(); -	hlist_for_each_entry_rcu(claim, node, head, hash_entry) { +	hlist_for_each_entry_rcu(claim, head, hash_entry) {  		if (!batadv_compare_claim(&claim->hash_entry, data))  			continue; @@ -170,15 +178,14 @@ static struct batadv_claim *batadv_claim_hash_find(struct batadv_priv *bat_priv,   *   * Returns claim if found or NULL otherwise.   */ -static struct batadv_backbone_gw * +static struct batadv_bla_backbone_gw *  batadv_backbone_hash_find(struct batadv_priv *bat_priv,  			  uint8_t *addr, short vid)  {  	struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;  	struct hlist_head *head; -	struct hlist_node *node; -	struct batadv_backbone_gw search_entry, *backbone_gw; -	struct batadv_backbone_gw *backbone_gw_tmp = NULL; +	struct batadv_bla_backbone_gw search_entry, *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw_tmp = NULL;  	int index;  	if (!hash) @@ -191,7 +198,7 @@ batadv_backbone_hash_find(struct batadv_priv *bat_priv,  	head = &hash->table[index];  	rcu_read_lock(); -	hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) { +	hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {  		if (!batadv_compare_backbone_gw(&backbone_gw->hash_entry,  						&search_entry))  			continue; @@ -209,12 +216,12 @@ batadv_backbone_hash_find(struct batadv_priv *bat_priv,  /* delete all claims for a backbone */  static void -batadv_bla_del_backbone_claims(struct batadv_backbone_gw *backbone_gw) +batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw *backbone_gw)  {  	struct batadv_hashtable *hash; -	struct hlist_node *node, *node_tmp; +	struct hlist_node *node_tmp;  	struct hlist_head *head; -	struct batadv_claim *claim; +	struct batadv_bla_claim *claim;  	int i;  	spinlock_t *list_lock;	/* protects write access to the hash lists */ @@ -227,14 +234,13 @@ batadv_bla_del_backbone_claims(struct batadv_backbone_gw *backbone_gw)  		list_lock = &hash->list_locks[i];  		spin_lock_bh(list_lock); -		hlist_for_each_entry_safe(claim, node, node_tmp, +		hlist_for_each_entry_safe(claim, node_tmp,  					  head, hash_entry) { -  			if (claim->backbone_gw != backbone_gw)  				continue;  			batadv_claim_free_ref(claim); -			hlist_del_rcu(node); +			hlist_del_rcu(&claim->hash_entry);  		}  		spin_unlock_bh(list_lock);  	} @@ -332,7 +338,6 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,  			   "bla_send_claim(): REQUEST of %pM to %pMon vid %d\n",  			   ethhdr->h_source, ethhdr->h_dest, vid);  		break; -  	}  	if (vid != -1) @@ -360,11 +365,11 @@ out:   * searches for the backbone gw or creates a new one if it could not   * be found.   */ -static struct batadv_backbone_gw * +static struct batadv_bla_backbone_gw *  batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig, -			   short vid) +			   short vid, bool own_backbone)  { -	struct batadv_backbone_gw *entry; +	struct batadv_bla_backbone_gw *entry;  	struct batadv_orig_node *orig_node;  	int hash_added; @@ -386,6 +391,7 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,  	entry->crc = BATADV_BLA_CRC_INIT;  	entry->bat_priv = bat_priv;  	atomic_set(&entry->request_sent, 0); +	atomic_set(&entry->wait_periods, 0);  	memcpy(entry->orig, orig, ETH_ALEN);  	/* one for the hash, one for returning */ @@ -409,6 +415,16 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,  					  "became a backbone gateway");  		batadv_orig_node_free_ref(orig_node);  	} + +	if (own_backbone) { +		batadv_bla_send_announce(bat_priv, entry); + +		/* this will be decreased in the worker thread */ +		atomic_inc(&entry->request_sent); +		atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS); +		atomic_inc(&bat_priv->bla.num_requests); +	} +  	return entry;  } @@ -420,11 +436,11 @@ batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv,  				  struct batadv_hard_iface *primary_if,  				  short vid)  { -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	backbone_gw = batadv_bla_get_backbone_gw(bat_priv,  						 primary_if->net_dev->dev_addr, -						 vid); +						 vid, true);  	if (unlikely(!backbone_gw))  		return; @@ -442,11 +458,10 @@ static void batadv_bla_answer_request(struct batadv_priv *bat_priv,  				      struct batadv_hard_iface *primary_if,  				      short vid)  { -	struct hlist_node *node;  	struct hlist_head *head;  	struct batadv_hashtable *hash; -	struct batadv_claim *claim; -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_claim *claim; +	struct batadv_bla_backbone_gw *backbone_gw;  	int i;  	batadv_dbg(BATADV_DBG_BLA, bat_priv, @@ -463,7 +478,7 @@ static void batadv_bla_answer_request(struct batadv_priv *bat_priv,  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(claim, node, head, hash_entry) { +		hlist_for_each_entry_rcu(claim, head, hash_entry) {  			/* only own claims are interesting */  			if (claim->backbone_gw != backbone_gw)  				continue; @@ -485,7 +500,7 @@ static void batadv_bla_answer_request(struct batadv_priv *bat_priv,   * After the request, it will repeat all of his own claims and finally   * send an announcement claim with which we can check again.   */ -static void batadv_bla_send_request(struct batadv_backbone_gw *backbone_gw) +static void batadv_bla_send_request(struct batadv_bla_backbone_gw *backbone_gw)  {  	/* first, remove all old entries */  	batadv_bla_del_backbone_claims(backbone_gw); @@ -511,7 +526,7 @@ static void batadv_bla_send_request(struct batadv_backbone_gw *backbone_gw)   * places.   */  static void batadv_bla_send_announce(struct batadv_priv *bat_priv, -				     struct batadv_backbone_gw *backbone_gw) +				     struct batadv_bla_backbone_gw *backbone_gw)  {  	uint8_t mac[ETH_ALEN];  	__be16 crc; @@ -522,7 +537,6 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,  	batadv_bla_send_claim(bat_priv, mac, backbone_gw->vid,  			      BATADV_CLAIM_TYPE_ANNOUNCE); -  }  /** @@ -534,10 +548,10 @@ static void batadv_bla_send_announce(struct batadv_priv *bat_priv,   */  static void batadv_bla_add_claim(struct batadv_priv *bat_priv,  				 const uint8_t *mac, const short vid, -				 struct batadv_backbone_gw *backbone_gw) +				 struct batadv_bla_backbone_gw *backbone_gw)  { -	struct batadv_claim *claim; -	struct batadv_claim search_claim; +	struct batadv_bla_claim *claim; +	struct batadv_bla_claim search_claim;  	int hash_added;  	memcpy(search_claim.addr, mac, ETH_ALEN); @@ -581,7 +595,6 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv,  		claim->backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);  		batadv_backbone_gw_free_ref(claim->backbone_gw); -  	}  	/* set (new) backbone gw */  	atomic_inc(&backbone_gw->refcount); @@ -600,7 +613,7 @@ claim_free_ref:  static void batadv_bla_del_claim(struct batadv_priv *bat_priv,  				 const uint8_t *mac, const short vid)  { -	struct batadv_claim search_claim, *claim; +	struct batadv_bla_claim search_claim, *claim;  	memcpy(search_claim.addr, mac, ETH_ALEN);  	search_claim.vid = vid; @@ -626,13 +639,14 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv,  				  uint8_t *an_addr, uint8_t *backbone_addr,  				  short vid)  { -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	uint16_t crc;  	if (memcmp(an_addr, batadv_announce_mac, 4) != 0)  		return 0; -	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); +	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, +						 false);  	if (unlikely(!backbone_gw))  		return 1; @@ -643,12 +657,12 @@ static int batadv_handle_announce(struct batadv_priv *bat_priv,  	crc = ntohs(*((__be16 *)(&an_addr[4])));  	batadv_dbg(BATADV_DBG_BLA, bat_priv, -		   "handle_announce(): ANNOUNCE vid %d (sent by %pM)... CRC = %04x\n", +		   "handle_announce(): ANNOUNCE vid %d (sent by %pM)... CRC = %#.4x\n",  		   vid, backbone_gw->orig, crc);  	if (backbone_gw->crc != crc) {  		batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv, -			   "handle_announce(): CRC FAILED for %pM/%d (my = %04x, sent = %04x)\n", +			   "handle_announce(): CRC FAILED for %pM/%d (my = %#.4x, sent = %#.4x)\n",  			   backbone_gw->orig, backbone_gw->vid,  			   backbone_gw->crc, crc); @@ -697,7 +711,7 @@ static int batadv_handle_unclaim(struct batadv_priv *bat_priv,  				 uint8_t *backbone_addr,  				 uint8_t *claim_addr, short vid)  { -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	/* unclaim in any case if it is our own */  	if (primary_if && batadv_compare_eth(backbone_addr, @@ -726,11 +740,12 @@ static int batadv_handle_claim(struct batadv_priv *bat_priv,  			       uint8_t *backbone_addr, uint8_t *claim_addr,  			       short vid)  { -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	/* register the gateway if not yet available, and add the claim. */ -	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid); +	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid, +						 false);  	if (unlikely(!backbone_gw))  		return 1; @@ -816,7 +831,7 @@ static int batadv_check_claim_group(struct batadv_priv *bat_priv,  	/* if our mesh friends mac is bigger, use it for ourselves. */  	if (ntohs(bla_dst->group) > ntohs(bla_dst_own->group)) {  		batadv_dbg(BATADV_DBG_BLA, bat_priv, -			   "taking other backbones claim group: %04x\n", +			   "taking other backbones claim group: %#.4x\n",  			   ntohs(bla_dst->group));  		bla_dst_own->group = bla_dst->group;  	} @@ -939,8 +954,8 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,   */  static void batadv_bla_purge_backbone_gw(struct batadv_priv *bat_priv, int now)  { -	struct batadv_backbone_gw *backbone_gw; -	struct hlist_node *node, *node_tmp; +	struct batadv_bla_backbone_gw *backbone_gw; +	struct hlist_node *node_tmp;  	struct hlist_head *head;  	struct batadv_hashtable *hash;  	spinlock_t *list_lock;	/* protects write access to the hash lists */ @@ -955,7 +970,7 @@ static void batadv_bla_purge_backbone_gw(struct batadv_priv *bat_priv, int now)  		list_lock = &hash->list_locks[i];  		spin_lock_bh(list_lock); -		hlist_for_each_entry_safe(backbone_gw, node, node_tmp, +		hlist_for_each_entry_safe(backbone_gw, node_tmp,  					  head, hash_entry) {  			if (now)  				goto purge_now; @@ -974,7 +989,7 @@ purge_now:  			batadv_bla_del_backbone_claims(backbone_gw); -			hlist_del_rcu(node); +			hlist_del_rcu(&backbone_gw->hash_entry);  			batadv_backbone_gw_free_ref(backbone_gw);  		}  		spin_unlock_bh(list_lock); @@ -994,8 +1009,7 @@ static void batadv_bla_purge_claims(struct batadv_priv *bat_priv,  				    struct batadv_hard_iface *primary_if,  				    int now)  { -	struct batadv_claim *claim; -	struct hlist_node *node; +	struct batadv_bla_claim *claim;  	struct hlist_head *head;  	struct batadv_hashtable *hash;  	int i; @@ -1008,7 +1022,7 @@ static void batadv_bla_purge_claims(struct batadv_priv *bat_priv,  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(claim, node, head, hash_entry) { +		hlist_for_each_entry_rcu(claim, head, hash_entry) {  			if (now)  				goto purge_now;  			if (!batadv_compare_eth(claim->backbone_gw->orig, @@ -1043,8 +1057,7 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,  				    struct batadv_hard_iface *primary_if,  				    struct batadv_hard_iface *oldif)  { -	struct batadv_backbone_gw *backbone_gw; -	struct hlist_node *node; +	struct batadv_bla_backbone_gw *backbone_gw;  	struct hlist_head *head;  	struct batadv_hashtable *hash;  	__be16 group; @@ -1068,7 +1081,7 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) { +		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {  			/* own orig still holds the old value. */  			if (!batadv_compare_eth(backbone_gw->orig,  						oldif->net_dev->dev_addr)) @@ -1085,16 +1098,6 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,  	}  } - - -/* (re)start the timer */ -static void batadv_bla_start_timer(struct batadv_priv *bat_priv) -{ -	INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work); -	queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work, -			   msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH)); -} -  /* periodic work to do:   *  * purge structures when they are too old   *  * send announcements @@ -1104,9 +1107,8 @@ static void batadv_bla_periodic_work(struct work_struct *work)  	struct delayed_work *delayed_work;  	struct batadv_priv *bat_priv;  	struct batadv_priv_bla *priv_bla; -	struct hlist_node *node;  	struct hlist_head *head; -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	struct batadv_hashtable *hash;  	struct batadv_hard_iface *primary_if;  	int i; @@ -1132,7 +1134,7 @@ static void batadv_bla_periodic_work(struct work_struct *work)  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) { +		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {  			if (!batadv_compare_eth(backbone_gw->orig,  						primary_if->net_dev->dev_addr))  				continue; @@ -1140,6 +1142,24 @@ static void batadv_bla_periodic_work(struct work_struct *work)  			backbone_gw->lasttime = jiffies;  			batadv_bla_send_announce(bat_priv, backbone_gw); + +			/* request_sent is only set after creation to avoid +			 * problems when we are not yet known as backbone gw +			 * in the backbone. +			 * +			 * We can reset this now after we waited some periods +			 * to give bridge forward delays and bla group forming +			 * some grace time. +			 */ + +			if (atomic_read(&backbone_gw->request_sent) == 0) +				continue; + +			if (!atomic_dec_and_test(&backbone_gw->wait_periods)) +				continue; + +			atomic_dec(&backbone_gw->bat_priv->bla.num_requests); +			atomic_set(&backbone_gw->request_sent, 0);  		}  		rcu_read_unlock();  	} @@ -1147,7 +1167,8 @@ out:  	if (primary_if)  		batadv_hardif_free_ref(primary_if); -	batadv_bla_start_timer(bat_priv); +	queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work, +			   msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));  }  /* The hash for claim and backbone hash receive the same key because they @@ -1205,15 +1226,17 @@ int batadv_bla_init(struct batadv_priv *bat_priv)  	batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hashes initialized\n"); -	batadv_bla_start_timer(bat_priv); +	INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work); + +	queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work, +			   msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));  	return 0;  }  /**   * batadv_bla_check_bcast_duplist   * @bat_priv: the bat priv with all the soft interface information - * @bcast_packet: encapsulated broadcast frame plus batman header - * @bcast_packet_len: length of encapsulated broadcast frame plus batman header + * @skb: contains the bcast_packet to be checked   *   * check if it is on our broadcast list. Another gateway might   * have sent the same packet because it is connected to the same backbone, @@ -1225,20 +1248,17 @@ int batadv_bla_init(struct batadv_priv *bat_priv)   * the same host however as this might be intended.   */  int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv, -				   struct batadv_bcast_packet *bcast_packet, -				   int bcast_packet_len) +				   struct sk_buff *skb)  { -	int i, length, curr, ret = 0; -	uint8_t *content; -	uint16_t crc; +	int i, curr, ret = 0; +	__be32 crc; +	struct batadv_bcast_packet *bcast_packet;  	struct batadv_bcast_duplist_entry *entry; -	length = bcast_packet_len - sizeof(*bcast_packet); -	content = (uint8_t *)bcast_packet; -	content += sizeof(*bcast_packet); +	bcast_packet = (struct batadv_bcast_packet *)skb->data;  	/* calculate the crc ... */ -	crc = crc16(0, content, length); +	crc = batadv_skb_crc32(skb, (u8 *)(bcast_packet + 1));  	spin_lock_bh(&bat_priv->bla.bcast_duplist_lock); @@ -1296,8 +1316,7 @@ int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig)  {  	struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;  	struct hlist_head *head; -	struct hlist_node *node; -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	int i;  	if (!atomic_read(&bat_priv->bridge_loop_avoidance)) @@ -1310,7 +1329,7 @@ int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig)  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) { +		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {  			if (batadv_compare_eth(backbone_gw->orig, orig)) {  				rcu_read_unlock();  				return 1; @@ -1338,7 +1357,7 @@ int batadv_bla_is_backbone_gw(struct sk_buff *skb,  {  	struct ethhdr *ethhdr;  	struct vlan_ethhdr *vhdr; -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	short vid = -1;  	if (!atomic_read(&orig_node->bat_priv->bridge_loop_avoidance)) @@ -1409,7 +1428,7 @@ int batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb, short vid,  		  bool is_bcast)  {  	struct ethhdr *ethhdr; -	struct batadv_claim search_claim, *claim = NULL; +	struct batadv_bla_claim search_claim, *claim = NULL;  	struct batadv_hard_iface *primary_if;  	int ret; @@ -1503,7 +1522,7 @@ out:  int batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb, short vid)  {  	struct ethhdr *ethhdr; -	struct batadv_claim search_claim, *claim = NULL; +	struct batadv_bla_claim search_claim, *claim = NULL;  	struct batadv_hard_iface *primary_if;  	int ret = 0; @@ -1579,45 +1598,32 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)  	struct net_device *net_dev = (struct net_device *)seq->private;  	struct batadv_priv *bat_priv = netdev_priv(net_dev);  	struct batadv_hashtable *hash = bat_priv->bla.claim_hash; -	struct batadv_claim *claim; +	struct batadv_bla_claim *claim;  	struct batadv_hard_iface *primary_if; -	struct hlist_node *node;  	struct hlist_head *head;  	uint32_t i;  	bool is_own; -	int ret = 0;  	uint8_t *primary_addr; -	primary_if = batadv_primary_if_get_selected(bat_priv); -	if (!primary_if) { -		ret = seq_printf(seq, -				 "BATMAN mesh %s disabled - please specify interfaces to enable it\n", -				 net_dev->name); -		goto out; -	} - -	if (primary_if->if_status != BATADV_IF_ACTIVE) { -		ret = seq_printf(seq, -				 "BATMAN mesh %s disabled - primary interface not active\n", -				 net_dev->name); +	primary_if = batadv_seq_print_text_primary_if_get(seq); +	if (!primary_if)  		goto out; -	}  	primary_addr = primary_if->net_dev->dev_addr;  	seq_printf(seq, -		   "Claims announced for the mesh %s (orig %pM, group id %04x)\n", +		   "Claims announced for the mesh %s (orig %pM, group id %#.4x)\n",  		   net_dev->name, primary_addr,  		   ntohs(bat_priv->bla.claim_dest.group)); -	seq_printf(seq, "   %-17s    %-5s    %-17s [o] (%-4s)\n", +	seq_printf(seq, "   %-17s    %-5s    %-17s [o] (%-6s)\n",  		   "Client", "VID", "Originator", "CRC");  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(claim, node, head, hash_entry) { +		hlist_for_each_entry_rcu(claim, head, hash_entry) {  			is_own = batadv_compare_eth(claim->backbone_gw->orig,  						    primary_addr); -			seq_printf(seq,	" * %pM on % 5d by %pM [%c] (%04x)\n", +			seq_printf(seq,	" * %pM on % 5d by %pM [%c] (%#.4x)\n",  				   claim->addr, claim->vid,  				   claim->backbone_gw->orig,  				   (is_own ? 'x' : ' '), @@ -1628,7 +1634,7 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)  out:  	if (primary_if)  		batadv_hardif_free_ref(primary_if); -	return ret; +	return 0;  }  int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset) @@ -1636,43 +1642,30 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)  	struct net_device *net_dev = (struct net_device *)seq->private;  	struct batadv_priv *bat_priv = netdev_priv(net_dev);  	struct batadv_hashtable *hash = bat_priv->bla.backbone_hash; -	struct batadv_backbone_gw *backbone_gw; +	struct batadv_bla_backbone_gw *backbone_gw;  	struct batadv_hard_iface *primary_if; -	struct hlist_node *node;  	struct hlist_head *head;  	int secs, msecs;  	uint32_t i;  	bool is_own; -	int ret = 0;  	uint8_t *primary_addr; -	primary_if = batadv_primary_if_get_selected(bat_priv); -	if (!primary_if) { -		ret = seq_printf(seq, -				 "BATMAN mesh %s disabled - please specify interfaces to enable it\n", -				 net_dev->name); -		goto out; -	} - -	if (primary_if->if_status != BATADV_IF_ACTIVE) { -		ret = seq_printf(seq, -				 "BATMAN mesh %s disabled - primary interface not active\n", -				 net_dev->name); +	primary_if = batadv_seq_print_text_primary_if_get(seq); +	if (!primary_if)  		goto out; -	}  	primary_addr = primary_if->net_dev->dev_addr;  	seq_printf(seq, -		   "Backbones announced for the mesh %s (orig %pM, group id %04x)\n", +		   "Backbones announced for the mesh %s (orig %pM, group id %#.4x)\n",  		   net_dev->name, primary_addr,  		   ntohs(bat_priv->bla.claim_dest.group)); -	seq_printf(seq, "   %-17s    %-5s %-9s (%-4s)\n", +	seq_printf(seq, "   %-17s    %-5s %-9s (%-6s)\n",  		   "Originator", "VID", "last seen", "CRC");  	for (i = 0; i < hash->size; i++) {  		head = &hash->table[i];  		rcu_read_lock(); -		hlist_for_each_entry_rcu(backbone_gw, node, head, hash_entry) { +		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {  			msecs = jiffies_to_msecs(jiffies -  						 backbone_gw->lasttime);  			secs = msecs / 1000; @@ -1684,7 +1677,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)  				continue;  			seq_printf(seq, -				   " * %pM on % 5d % 4i.%03is (%04x)\n", +				   " * %pM on % 5d % 4i.%03is (%#.4x)\n",  				   backbone_gw->orig, backbone_gw->vid,  				   secs, msecs, backbone_gw->crc);  		} @@ -1693,5 +1686,5 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)  out:  	if (primary_if)  		batadv_hardif_free_ref(primary_if); -	return ret; +	return 0;  }  |