1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) B.A.T.M.A.N. contributors:
3  *
4  * Simon Wunderlich
5  */
6 
7 #include "bridge_loop_avoidance.h"
8 #include "main.h"
9 
10 #include <linux/atomic.h>
11 #include <linux/byteorder/generic.h>
12 #include <linux/compiler.h>
13 #include <linux/crc16.h>
14 #include <linux/errno.h>
15 #include <linux/etherdevice.h>
16 #include <linux/gfp.h>
17 #include <linux/if_arp.h>
18 #include <linux/if_ether.h>
19 #include <linux/if_vlan.h>
20 #include <linux/jhash.h>
21 #include <linux/jiffies.h>
22 #include <linux/kernel.h>
23 #include <linux/kref.h>
24 #include <linux/list.h>
25 #include <linux/lockdep.h>
26 #include <linux/netdevice.h>
27 #include <linux/netlink.h>
28 #include <linux/rculist.h>
29 #include <linux/rcupdate.h>
30 #include <linux/skbuff.h>
31 #include <linux/slab.h>
32 #include <linux/spinlock.h>
33 #include <linux/stddef.h>
34 #include <linux/string.h>
35 #include <linux/workqueue.h>
36 #include <net/arp.h>
37 #include <net/genetlink.h>
38 #include <net/netlink.h>
39 #include <net/sock.h>
40 #include <uapi/linux/batadv_packet.h>
41 #include <uapi/linux/batman_adv.h>
42 
43 #include "hard-interface.h"
44 #include "hash.h"
45 #include "log.h"
46 #include "netlink.h"
47 #include "originator.h"
48 #include "soft-interface.h"
49 #include "translation-table.h"
50 
51 static const u8 batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
52 
53 static void batadv_bla_periodic_work(struct work_struct *work);
54 static void
55 batadv_bla_send_announce(struct batadv_priv *bat_priv,
56 			 struct batadv_bla_backbone_gw *backbone_gw);
57 
58 /**
59  * batadv_choose_claim() - choose the right bucket for a claim.
60  * @data: data to hash
61  * @size: size of the hash table
62  *
63  * Return: the hash index of the claim
64  */
batadv_choose_claim(const void * data,u32 size)65 static inline u32 batadv_choose_claim(const void *data, u32 size)
66 {
67 	struct batadv_bla_claim *claim = (struct batadv_bla_claim *)data;
68 	u32 hash = 0;
69 
70 	hash = jhash(&claim->addr, sizeof(claim->addr), hash);
71 	hash = jhash(&claim->vid, sizeof(claim->vid), hash);
72 
73 	return hash % size;
74 }
75 
76 /**
77  * batadv_choose_backbone_gw() - choose the right bucket for a backbone gateway.
78  * @data: data to hash
79  * @size: size of the hash table
80  *
81  * Return: the hash index of the backbone gateway
82  */
batadv_choose_backbone_gw(const void * data,u32 size)83 static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
84 {
85 	const struct batadv_bla_backbone_gw *gw;
86 	u32 hash = 0;
87 
88 	gw = (struct batadv_bla_backbone_gw *)data;
89 	hash = jhash(&gw->orig, sizeof(gw->orig), hash);
90 	hash = jhash(&gw->vid, sizeof(gw->vid), hash);
91 
92 	return hash % size;
93 }
94 
95 /**
96  * batadv_compare_backbone_gw() - compare address and vid of two backbone gws
97  * @node: list node of the first entry to compare
98  * @data2: pointer to the second backbone gateway
99  *
100  * Return: true if the backbones have the same data, false otherwise
101  */
batadv_compare_backbone_gw(const struct hlist_node * node,const void * data2)102 static bool batadv_compare_backbone_gw(const struct hlist_node *node,
103 				       const void *data2)
104 {
105 	const void *data1 = container_of(node, struct batadv_bla_backbone_gw,
106 					 hash_entry);
107 	const struct batadv_bla_backbone_gw *gw1 = data1;
108 	const struct batadv_bla_backbone_gw *gw2 = data2;
109 
110 	if (!batadv_compare_eth(gw1->orig, gw2->orig))
111 		return false;
112 
113 	if (gw1->vid != gw2->vid)
114 		return false;
115 
116 	return true;
117 }
118 
119 /**
120  * batadv_compare_claim() - compare address and vid of two claims
121  * @node: list node of the first entry to compare
122  * @data2: pointer to the second claims
123  *
124  * Return: true if the claim have the same data, 0 otherwise
125  */
batadv_compare_claim(const struct hlist_node * node,const void * data2)126 static bool batadv_compare_claim(const struct hlist_node *node,
127 				 const void *data2)
128 {
129 	const void *data1 = container_of(node, struct batadv_bla_claim,
130 					 hash_entry);
131 	const struct batadv_bla_claim *cl1 = data1;
132 	const struct batadv_bla_claim *cl2 = data2;
133 
134 	if (!batadv_compare_eth(cl1->addr, cl2->addr))
135 		return false;
136 
137 	if (cl1->vid != cl2->vid)
138 		return false;
139 
140 	return true;
141 }
142 
143 /**
144  * batadv_backbone_gw_release() - release backbone gw from lists and queue for
145  *  free after rcu grace period
146  * @ref: kref pointer of the backbone gw
147  */
batadv_backbone_gw_release(struct kref * ref)148 static void batadv_backbone_gw_release(struct kref *ref)
149 {
150 	struct batadv_bla_backbone_gw *backbone_gw;
151 
152 	backbone_gw = container_of(ref, struct batadv_bla_backbone_gw,
153 				   refcount);
154 
155 	kfree_rcu(backbone_gw, rcu);
156 }
157 
158 /**
159  * batadv_backbone_gw_put() - decrement the backbone gw refcounter and possibly
160  *  release it
161  * @backbone_gw: backbone gateway to be free'd
162  */
batadv_backbone_gw_put(struct batadv_bla_backbone_gw * backbone_gw)163 static void batadv_backbone_gw_put(struct batadv_bla_backbone_gw *backbone_gw)
164 {
165 	kref_put(&backbone_gw->refcount, batadv_backbone_gw_release);
166 }
167 
168 /**
169  * batadv_claim_release() - release claim from lists and queue for free after
170  *  rcu grace period
171  * @ref: kref pointer of the claim
172  */
batadv_claim_release(struct kref * ref)173 static void batadv_claim_release(struct kref *ref)
174 {
175 	struct batadv_bla_claim *claim;
176 	struct batadv_bla_backbone_gw *old_backbone_gw;
177 
178 	claim = container_of(ref, struct batadv_bla_claim, refcount);
179 
180 	spin_lock_bh(&claim->backbone_lock);
181 	old_backbone_gw = claim->backbone_gw;
182 	claim->backbone_gw = NULL;
183 	spin_unlock_bh(&claim->backbone_lock);
184 
185 	spin_lock_bh(&old_backbone_gw->crc_lock);
186 	old_backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
187 	spin_unlock_bh(&old_backbone_gw->crc_lock);
188 
189 	batadv_backbone_gw_put(old_backbone_gw);
190 
191 	kfree_rcu(claim, rcu);
192 }
193 
194 /**
195  * batadv_claim_put() - decrement the claim refcounter and possibly release it
196  * @claim: claim to be free'd
197  */
batadv_claim_put(struct batadv_bla_claim * claim)198 static void batadv_claim_put(struct batadv_bla_claim *claim)
199 {
200 	kref_put(&claim->refcount, batadv_claim_release);
201 }
202 
203 /**
204  * batadv_claim_hash_find() - looks for a claim in the claim hash
205  * @bat_priv: the bat priv with all the soft interface information
206  * @data: search data (may be local/static data)
207  *
208  * Return: claim if found or NULL otherwise.
209  */
210 static struct batadv_bla_claim *
batadv_claim_hash_find(struct batadv_priv * bat_priv,struct batadv_bla_claim * data)211 batadv_claim_hash_find(struct batadv_priv *bat_priv,
212 		       struct batadv_bla_claim *data)
213 {
214 	struct batadv_hashtable *hash = bat_priv->bla.claim_hash;
215 	struct hlist_head *head;
216 	struct batadv_bla_claim *claim;
217 	struct batadv_bla_claim *claim_tmp = NULL;
218 	int index;
219 
220 	if (!hash)
221 		return NULL;
222 
223 	index = batadv_choose_claim(data, hash->size);
224 	head = &hash->table[index];
225 
226 	rcu_read_lock();
227 	hlist_for_each_entry_rcu(claim, head, hash_entry) {
228 		if (!batadv_compare_claim(&claim->hash_entry, data))
229 			continue;
230 
231 		if (!kref_get_unless_zero(&claim->refcount))
232 			continue;
233 
234 		claim_tmp = claim;
235 		break;
236 	}
237 	rcu_read_unlock();
238 
239 	return claim_tmp;
240 }
241 
242 /**
243  * batadv_backbone_hash_find() - looks for a backbone gateway in the hash
244  * @bat_priv: the bat priv with all the soft interface information
245  * @addr: the address of the originator
246  * @vid: the VLAN ID
247  *
248  * Return: backbone gateway if found or NULL otherwise
249  */
250 static struct batadv_bla_backbone_gw *
batadv_backbone_hash_find(struct batadv_priv * bat_priv,u8 * addr,unsigned short vid)251 batadv_backbone_hash_find(struct batadv_priv *bat_priv, u8 *addr,
252 			  unsigned short vid)
253 {
254 	struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
255 	struct hlist_head *head;
256 	struct batadv_bla_backbone_gw search_entry, *backbone_gw;
257 	struct batadv_bla_backbone_gw *backbone_gw_tmp = NULL;
258 	int index;
259 
260 	if (!hash)
261 		return NULL;
262 
263 	ether_addr_copy(search_entry.orig, addr);
264 	search_entry.vid = vid;
265 
266 	index = batadv_choose_backbone_gw(&search_entry, hash->size);
267 	head = &hash->table[index];
268 
269 	rcu_read_lock();
270 	hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
271 		if (!batadv_compare_backbone_gw(&backbone_gw->hash_entry,
272 						&search_entry))
273 			continue;
274 
275 		if (!kref_get_unless_zero(&backbone_gw->refcount))
276 			continue;
277 
278 		backbone_gw_tmp = backbone_gw;
279 		break;
280 	}
281 	rcu_read_unlock();
282 
283 	return backbone_gw_tmp;
284 }
285 
286 /**
287  * batadv_bla_del_backbone_claims() - delete all claims for a backbone
288  * @backbone_gw: backbone gateway where the claims should be removed
289  */
290 static void
batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw * backbone_gw)291 batadv_bla_del_backbone_claims(struct batadv_bla_backbone_gw *backbone_gw)
292 {
293 	struct batadv_hashtable *hash;
294 	struct hlist_node *node_tmp;
295 	struct hlist_head *head;
296 	struct batadv_bla_claim *claim;
297 	int i;
298 	spinlock_t *list_lock;	/* protects write access to the hash lists */
299 
300 	hash = backbone_gw->bat_priv->bla.claim_hash;
301 	if (!hash)
302 		return;
303 
304 	for (i = 0; i < hash->size; i++) {
305 		head = &hash->table[i];
306 		list_lock = &hash->list_locks[i];
307 
308 		spin_lock_bh(list_lock);
309 		hlist_for_each_entry_safe(claim, node_tmp,
310 					  head, hash_entry) {
311 			if (claim->backbone_gw != backbone_gw)
312 				continue;
313 
314 			batadv_claim_put(claim);
315 			hlist_del_rcu(&claim->hash_entry);
316 		}
317 		spin_unlock_bh(list_lock);
318 	}
319 
320 	/* all claims gone, initialize CRC */
321 	spin_lock_bh(&backbone_gw->crc_lock);
322 	backbone_gw->crc = BATADV_BLA_CRC_INIT;
323 	spin_unlock_bh(&backbone_gw->crc_lock);
324 }
325 
326 /**
327  * batadv_bla_send_claim() - sends a claim frame according to the provided info
328  * @bat_priv: the bat priv with all the soft interface information
329  * @mac: the mac address to be announced within the claim
330  * @vid: the VLAN ID
331  * @claimtype: the type of the claim (CLAIM, UNCLAIM, ANNOUNCE, ...)
332  */
batadv_bla_send_claim(struct batadv_priv * bat_priv,u8 * mac,unsigned short vid,int claimtype)333 static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac,
334 				  unsigned short vid, int claimtype)
335 {
336 	struct sk_buff *skb;
337 	struct ethhdr *ethhdr;
338 	struct batadv_hard_iface *primary_if;
339 	struct net_device *soft_iface;
340 	u8 *hw_src;
341 	struct batadv_bla_claim_dst local_claim_dest;
342 	__be32 zeroip = 0;
343 
344 	primary_if = batadv_primary_if_get_selected(bat_priv);
345 	if (!primary_if)
346 		return;
347 
348 	memcpy(&local_claim_dest, &bat_priv->bla.claim_dest,
349 	       sizeof(local_claim_dest));
350 	local_claim_dest.type = claimtype;
351 
352 	soft_iface = primary_if->soft_iface;
353 
354 	skb = arp_create(ARPOP_REPLY, ETH_P_ARP,
355 			 /* IP DST: 0.0.0.0 */
356 			 zeroip,
357 			 primary_if->soft_iface,
358 			 /* IP SRC: 0.0.0.0 */
359 			 zeroip,
360 			 /* Ethernet DST: Broadcast */
361 			 NULL,
362 			 /* Ethernet SRC/HW SRC:  originator mac */
363 			 primary_if->net_dev->dev_addr,
364 			 /* HW DST: FF:43:05:XX:YY:YY
365 			  * with XX   = claim type
366 			  * and YY:YY = group id
367 			  */
368 			 (u8 *)&local_claim_dest);
369 
370 	if (!skb)
371 		goto out;
372 
373 	ethhdr = (struct ethhdr *)skb->data;
374 	hw_src = (u8 *)ethhdr + ETH_HLEN + sizeof(struct arphdr);
375 
376 	/* now we pretend that the client would have sent this ... */
377 	switch (claimtype) {
378 	case BATADV_CLAIM_TYPE_CLAIM:
379 		/* normal claim frame
380 		 * set Ethernet SRC to the clients mac
381 		 */
382 		ether_addr_copy(ethhdr->h_source, mac);
383 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
384 			   "%s(): CLAIM %pM on vid %d\n", __func__, mac,
385 			   batadv_print_vid(vid));
386 		break;
387 	case BATADV_CLAIM_TYPE_UNCLAIM:
388 		/* unclaim frame
389 		 * set HW SRC to the clients mac
390 		 */
391 		ether_addr_copy(hw_src, mac);
392 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
393 			   "%s(): UNCLAIM %pM on vid %d\n", __func__, mac,
394 			   batadv_print_vid(vid));
395 		break;
396 	case BATADV_CLAIM_TYPE_ANNOUNCE:
397 		/* announcement frame
398 		 * set HW SRC to the special mac containg the crc
399 		 */
400 		ether_addr_copy(hw_src, mac);
401 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
402 			   "%s(): ANNOUNCE of %pM on vid %d\n", __func__,
403 			   ethhdr->h_source, batadv_print_vid(vid));
404 		break;
405 	case BATADV_CLAIM_TYPE_REQUEST:
406 		/* request frame
407 		 * set HW SRC and header destination to the receiving backbone
408 		 * gws mac
409 		 */
410 		ether_addr_copy(hw_src, mac);
411 		ether_addr_copy(ethhdr->h_dest, mac);
412 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
413 			   "%s(): REQUEST of %pM to %pM on vid %d\n", __func__,
414 			   ethhdr->h_source, ethhdr->h_dest,
415 			   batadv_print_vid(vid));
416 		break;
417 	case BATADV_CLAIM_TYPE_LOOPDETECT:
418 		ether_addr_copy(ethhdr->h_source, mac);
419 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
420 			   "%s(): LOOPDETECT of %pM to %pM on vid %d\n",
421 			   __func__, ethhdr->h_source, ethhdr->h_dest,
422 			   batadv_print_vid(vid));
423 
424 		break;
425 	}
426 
427 	if (vid & BATADV_VLAN_HAS_TAG) {
428 		skb = vlan_insert_tag(skb, htons(ETH_P_8021Q),
429 				      vid & VLAN_VID_MASK);
430 		if (!skb)
431 			goto out;
432 	}
433 
434 	skb_reset_mac_header(skb);
435 	skb->protocol = eth_type_trans(skb, soft_iface);
436 	batadv_inc_counter(bat_priv, BATADV_CNT_RX);
437 	batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
438 			   skb->len + ETH_HLEN);
439 
440 	netif_rx_any_context(skb);
441 out:
442 	if (primary_if)
443 		batadv_hardif_put(primary_if);
444 }
445 
446 /**
447  * batadv_bla_loopdetect_report() - worker for reporting the loop
448  * @work: work queue item
449  *
450  * Throws an uevent, as the loopdetect check function can't do that itself
451  * since the kernel may sleep while throwing uevents.
452  */
batadv_bla_loopdetect_report(struct work_struct * work)453 static void batadv_bla_loopdetect_report(struct work_struct *work)
454 {
455 	struct batadv_bla_backbone_gw *backbone_gw;
456 	struct batadv_priv *bat_priv;
457 	char vid_str[6] = { '\0' };
458 
459 	backbone_gw = container_of(work, struct batadv_bla_backbone_gw,
460 				   report_work);
461 	bat_priv = backbone_gw->bat_priv;
462 
463 	batadv_info(bat_priv->soft_iface,
464 		    "Possible loop on VLAN %d detected which can't be handled by BLA - please check your network setup!\n",
465 		    batadv_print_vid(backbone_gw->vid));
466 	snprintf(vid_str, sizeof(vid_str), "%d",
467 		 batadv_print_vid(backbone_gw->vid));
468 	vid_str[sizeof(vid_str) - 1] = 0;
469 
470 	batadv_throw_uevent(bat_priv, BATADV_UEV_BLA, BATADV_UEV_LOOPDETECT,
471 			    vid_str);
472 
473 	batadv_backbone_gw_put(backbone_gw);
474 }
475 
476 /**
477  * batadv_bla_get_backbone_gw() - finds or creates a backbone gateway
478  * @bat_priv: the bat priv with all the soft interface information
479  * @orig: the mac address of the originator
480  * @vid: the VLAN ID
481  * @own_backbone: set if the requested backbone is local
482  *
483  * Return: the (possibly created) backbone gateway or NULL on error
484  */
485 static struct batadv_bla_backbone_gw *
batadv_bla_get_backbone_gw(struct batadv_priv * bat_priv,u8 * orig,unsigned short vid,bool own_backbone)486 batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, u8 *orig,
487 			   unsigned short vid, bool own_backbone)
488 {
489 	struct batadv_bla_backbone_gw *entry;
490 	struct batadv_orig_node *orig_node;
491 	int hash_added;
492 
493 	entry = batadv_backbone_hash_find(bat_priv, orig, vid);
494 
495 	if (entry)
496 		return entry;
497 
498 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
499 		   "%s(): not found (%pM, %d), creating new entry\n", __func__,
500 		   orig, batadv_print_vid(vid));
501 
502 	entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
503 	if (!entry)
504 		return NULL;
505 
506 	entry->vid = vid;
507 	entry->lasttime = jiffies;
508 	entry->crc = BATADV_BLA_CRC_INIT;
509 	entry->bat_priv = bat_priv;
510 	spin_lock_init(&entry->crc_lock);
511 	atomic_set(&entry->request_sent, 0);
512 	atomic_set(&entry->wait_periods, 0);
513 	ether_addr_copy(entry->orig, orig);
514 	INIT_WORK(&entry->report_work, batadv_bla_loopdetect_report);
515 	kref_init(&entry->refcount);
516 
517 	kref_get(&entry->refcount);
518 	hash_added = batadv_hash_add(bat_priv->bla.backbone_hash,
519 				     batadv_compare_backbone_gw,
520 				     batadv_choose_backbone_gw, entry,
521 				     &entry->hash_entry);
522 
523 	if (unlikely(hash_added != 0)) {
524 		/* hash failed, free the structure */
525 		kfree(entry);
526 		return NULL;
527 	}
528 
529 	/* this is a gateway now, remove any TT entry on this VLAN */
530 	orig_node = batadv_orig_hash_find(bat_priv, orig);
531 	if (orig_node) {
532 		batadv_tt_global_del_orig(bat_priv, orig_node, vid,
533 					  "became a backbone gateway");
534 		batadv_orig_node_put(orig_node);
535 	}
536 
537 	if (own_backbone) {
538 		batadv_bla_send_announce(bat_priv, entry);
539 
540 		/* this will be decreased in the worker thread */
541 		atomic_inc(&entry->request_sent);
542 		atomic_set(&entry->wait_periods, BATADV_BLA_WAIT_PERIODS);
543 		atomic_inc(&bat_priv->bla.num_requests);
544 	}
545 
546 	return entry;
547 }
548 
549 /**
550  * batadv_bla_update_own_backbone_gw() - updates the own backbone gw for a VLAN
551  * @bat_priv: the bat priv with all the soft interface information
552  * @primary_if: the selected primary interface
553  * @vid: VLAN identifier
554  *
555  * update or add the own backbone gw to make sure we announce
556  * where we receive other backbone gws
557  */
558 static void
batadv_bla_update_own_backbone_gw(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,unsigned short vid)559 batadv_bla_update_own_backbone_gw(struct batadv_priv *bat_priv,
560 				  struct batadv_hard_iface *primary_if,
561 				  unsigned short vid)
562 {
563 	struct batadv_bla_backbone_gw *backbone_gw;
564 
565 	backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
566 						 primary_if->net_dev->dev_addr,
567 						 vid, true);
568 	if (unlikely(!backbone_gw))
569 		return;
570 
571 	backbone_gw->lasttime = jiffies;
572 	batadv_backbone_gw_put(backbone_gw);
573 }
574 
575 /**
576  * batadv_bla_answer_request() - answer a bla request by sending own claims
577  * @bat_priv: the bat priv with all the soft interface information
578  * @primary_if: interface where the request came on
579  * @vid: the vid where the request came on
580  *
581  * Repeat all of our own claims, and finally send an ANNOUNCE frame
582  * to allow the requester another check if the CRC is correct now.
583  */
batadv_bla_answer_request(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,unsigned short vid)584 static void batadv_bla_answer_request(struct batadv_priv *bat_priv,
585 				      struct batadv_hard_iface *primary_if,
586 				      unsigned short vid)
587 {
588 	struct hlist_head *head;
589 	struct batadv_hashtable *hash;
590 	struct batadv_bla_claim *claim;
591 	struct batadv_bla_backbone_gw *backbone_gw;
592 	int i;
593 
594 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
595 		   "%s(): received a claim request, send all of our own claims again\n",
596 		   __func__);
597 
598 	backbone_gw = batadv_backbone_hash_find(bat_priv,
599 						primary_if->net_dev->dev_addr,
600 						vid);
601 	if (!backbone_gw)
602 		return;
603 
604 	hash = bat_priv->bla.claim_hash;
605 	for (i = 0; i < hash->size; i++) {
606 		head = &hash->table[i];
607 
608 		rcu_read_lock();
609 		hlist_for_each_entry_rcu(claim, head, hash_entry) {
610 			/* only own claims are interesting */
611 			if (claim->backbone_gw != backbone_gw)
612 				continue;
613 
614 			batadv_bla_send_claim(bat_priv, claim->addr, claim->vid,
615 					      BATADV_CLAIM_TYPE_CLAIM);
616 		}
617 		rcu_read_unlock();
618 	}
619 
620 	/* finally, send an announcement frame */
621 	batadv_bla_send_announce(bat_priv, backbone_gw);
622 	batadv_backbone_gw_put(backbone_gw);
623 }
624 
625 /**
626  * batadv_bla_send_request() - send a request to repeat claims
627  * @backbone_gw: the backbone gateway from whom we are out of sync
628  *
629  * When the crc is wrong, ask the backbone gateway for a full table update.
630  * After the request, it will repeat all of his own claims and finally
631  * send an announcement claim with which we can check again.
632  */
batadv_bla_send_request(struct batadv_bla_backbone_gw * backbone_gw)633 static void batadv_bla_send_request(struct batadv_bla_backbone_gw *backbone_gw)
634 {
635 	/* first, remove all old entries */
636 	batadv_bla_del_backbone_claims(backbone_gw);
637 
638 	batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
639 		   "Sending REQUEST to %pM\n", backbone_gw->orig);
640 
641 	/* send request */
642 	batadv_bla_send_claim(backbone_gw->bat_priv, backbone_gw->orig,
643 			      backbone_gw->vid, BATADV_CLAIM_TYPE_REQUEST);
644 
645 	/* no local broadcasts should be sent or received, for now. */
646 	if (!atomic_read(&backbone_gw->request_sent)) {
647 		atomic_inc(&backbone_gw->bat_priv->bla.num_requests);
648 		atomic_set(&backbone_gw->request_sent, 1);
649 	}
650 }
651 
652 /**
653  * batadv_bla_send_announce() - Send an announcement frame
654  * @bat_priv: the bat priv with all the soft interface information
655  * @backbone_gw: our backbone gateway which should be announced
656  */
batadv_bla_send_announce(struct batadv_priv * bat_priv,struct batadv_bla_backbone_gw * backbone_gw)657 static void batadv_bla_send_announce(struct batadv_priv *bat_priv,
658 				     struct batadv_bla_backbone_gw *backbone_gw)
659 {
660 	u8 mac[ETH_ALEN];
661 	__be16 crc;
662 
663 	memcpy(mac, batadv_announce_mac, 4);
664 	spin_lock_bh(&backbone_gw->crc_lock);
665 	crc = htons(backbone_gw->crc);
666 	spin_unlock_bh(&backbone_gw->crc_lock);
667 	memcpy(&mac[4], &crc, 2);
668 
669 	batadv_bla_send_claim(bat_priv, mac, backbone_gw->vid,
670 			      BATADV_CLAIM_TYPE_ANNOUNCE);
671 }
672 
673 /**
674  * batadv_bla_add_claim() - Adds a claim in the claim hash
675  * @bat_priv: the bat priv with all the soft interface information
676  * @mac: the mac address of the claim
677  * @vid: the VLAN ID of the frame
678  * @backbone_gw: the backbone gateway which claims it
679  */
batadv_bla_add_claim(struct batadv_priv * bat_priv,const u8 * mac,const unsigned short vid,struct batadv_bla_backbone_gw * backbone_gw)680 static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
681 				 const u8 *mac, const unsigned short vid,
682 				 struct batadv_bla_backbone_gw *backbone_gw)
683 {
684 	struct batadv_bla_backbone_gw *old_backbone_gw;
685 	struct batadv_bla_claim *claim;
686 	struct batadv_bla_claim search_claim;
687 	bool remove_crc = false;
688 	int hash_added;
689 
690 	ether_addr_copy(search_claim.addr, mac);
691 	search_claim.vid = vid;
692 	claim = batadv_claim_hash_find(bat_priv, &search_claim);
693 
694 	/* create a new claim entry if it does not exist yet. */
695 	if (!claim) {
696 		claim = kzalloc(sizeof(*claim), GFP_ATOMIC);
697 		if (!claim)
698 			return;
699 
700 		ether_addr_copy(claim->addr, mac);
701 		spin_lock_init(&claim->backbone_lock);
702 		claim->vid = vid;
703 		claim->lasttime = jiffies;
704 		kref_get(&backbone_gw->refcount);
705 		claim->backbone_gw = backbone_gw;
706 		kref_init(&claim->refcount);
707 
708 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
709 			   "%s(): adding new entry %pM, vid %d to hash ...\n",
710 			   __func__, mac, batadv_print_vid(vid));
711 
712 		kref_get(&claim->refcount);
713 		hash_added = batadv_hash_add(bat_priv->bla.claim_hash,
714 					     batadv_compare_claim,
715 					     batadv_choose_claim, claim,
716 					     &claim->hash_entry);
717 
718 		if (unlikely(hash_added != 0)) {
719 			/* only local changes happened. */
720 			kfree(claim);
721 			return;
722 		}
723 	} else {
724 		claim->lasttime = jiffies;
725 		if (claim->backbone_gw == backbone_gw)
726 			/* no need to register a new backbone */
727 			goto claim_free_ref;
728 
729 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
730 			   "%s(): changing ownership for %pM, vid %d to gw %pM\n",
731 			   __func__, mac, batadv_print_vid(vid),
732 			   backbone_gw->orig);
733 
734 		remove_crc = true;
735 	}
736 
737 	/* replace backbone_gw atomically and adjust reference counters */
738 	spin_lock_bh(&claim->backbone_lock);
739 	old_backbone_gw = claim->backbone_gw;
740 	kref_get(&backbone_gw->refcount);
741 	claim->backbone_gw = backbone_gw;
742 	spin_unlock_bh(&claim->backbone_lock);
743 
744 	if (remove_crc) {
745 		/* remove claim address from old backbone_gw */
746 		spin_lock_bh(&old_backbone_gw->crc_lock);
747 		old_backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
748 		spin_unlock_bh(&old_backbone_gw->crc_lock);
749 	}
750 
751 	batadv_backbone_gw_put(old_backbone_gw);
752 
753 	/* add claim address to new backbone_gw */
754 	spin_lock_bh(&backbone_gw->crc_lock);
755 	backbone_gw->crc ^= crc16(0, claim->addr, ETH_ALEN);
756 	spin_unlock_bh(&backbone_gw->crc_lock);
757 	backbone_gw->lasttime = jiffies;
758 
759 claim_free_ref:
760 	batadv_claim_put(claim);
761 }
762 
763 /**
764  * batadv_bla_claim_get_backbone_gw() - Get valid reference for backbone_gw of
765  *  claim
766  * @claim: claim whose backbone_gw should be returned
767  *
768  * Return: valid reference to claim::backbone_gw
769  */
770 static struct batadv_bla_backbone_gw *
batadv_bla_claim_get_backbone_gw(struct batadv_bla_claim * claim)771 batadv_bla_claim_get_backbone_gw(struct batadv_bla_claim *claim)
772 {
773 	struct batadv_bla_backbone_gw *backbone_gw;
774 
775 	spin_lock_bh(&claim->backbone_lock);
776 	backbone_gw = claim->backbone_gw;
777 	kref_get(&backbone_gw->refcount);
778 	spin_unlock_bh(&claim->backbone_lock);
779 
780 	return backbone_gw;
781 }
782 
783 /**
784  * batadv_bla_del_claim() - delete a claim from the claim hash
785  * @bat_priv: the bat priv with all the soft interface information
786  * @mac: mac address of the claim to be removed
787  * @vid: VLAN id for the claim to be removed
788  */
batadv_bla_del_claim(struct batadv_priv * bat_priv,const u8 * mac,const unsigned short vid)789 static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
790 				 const u8 *mac, const unsigned short vid)
791 {
792 	struct batadv_bla_claim search_claim, *claim;
793 	struct batadv_bla_claim *claim_removed_entry;
794 	struct hlist_node *claim_removed_node;
795 
796 	ether_addr_copy(search_claim.addr, mac);
797 	search_claim.vid = vid;
798 	claim = batadv_claim_hash_find(bat_priv, &search_claim);
799 	if (!claim)
800 		return;
801 
802 	batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__,
803 		   mac, batadv_print_vid(vid));
804 
805 	claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash,
806 						batadv_compare_claim,
807 						batadv_choose_claim, claim);
808 	if (!claim_removed_node)
809 		goto free_claim;
810 
811 	/* reference from the hash is gone */
812 	claim_removed_entry = hlist_entry(claim_removed_node,
813 					  struct batadv_bla_claim, hash_entry);
814 	batadv_claim_put(claim_removed_entry);
815 
816 free_claim:
817 	/* don't need the reference from hash_find() anymore */
818 	batadv_claim_put(claim);
819 }
820 
821 /**
822  * batadv_handle_announce() - check for ANNOUNCE frame
823  * @bat_priv: the bat priv with all the soft interface information
824  * @an_addr: announcement mac address (ARP Sender HW address)
825  * @backbone_addr: originator address of the sender (Ethernet source MAC)
826  * @vid: the VLAN ID of the frame
827  *
828  * Return: true if handled
829  */
batadv_handle_announce(struct batadv_priv * bat_priv,u8 * an_addr,u8 * backbone_addr,unsigned short vid)830 static bool batadv_handle_announce(struct batadv_priv *bat_priv, u8 *an_addr,
831 				   u8 *backbone_addr, unsigned short vid)
832 {
833 	struct batadv_bla_backbone_gw *backbone_gw;
834 	u16 backbone_crc, crc;
835 
836 	if (memcmp(an_addr, batadv_announce_mac, 4) != 0)
837 		return false;
838 
839 	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid,
840 						 false);
841 
842 	if (unlikely(!backbone_gw))
843 		return true;
844 
845 	/* handle as ANNOUNCE frame */
846 	backbone_gw->lasttime = jiffies;
847 	crc = ntohs(*((__force __be16 *)(&an_addr[4])));
848 
849 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
850 		   "%s(): ANNOUNCE vid %d (sent by %pM)... CRC = %#.4x\n",
851 		   __func__, batadv_print_vid(vid), backbone_gw->orig, crc);
852 
853 	spin_lock_bh(&backbone_gw->crc_lock);
854 	backbone_crc = backbone_gw->crc;
855 	spin_unlock_bh(&backbone_gw->crc_lock);
856 
857 	if (backbone_crc != crc) {
858 		batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
859 			   "%s(): CRC FAILED for %pM/%d (my = %#.4x, sent = %#.4x)\n",
860 			   __func__, backbone_gw->orig,
861 			   batadv_print_vid(backbone_gw->vid),
862 			   backbone_crc, crc);
863 
864 		batadv_bla_send_request(backbone_gw);
865 	} else {
866 		/* if we have sent a request and the crc was OK,
867 		 * we can allow traffic again.
868 		 */
869 		if (atomic_read(&backbone_gw->request_sent)) {
870 			atomic_dec(&backbone_gw->bat_priv->bla.num_requests);
871 			atomic_set(&backbone_gw->request_sent, 0);
872 		}
873 	}
874 
875 	batadv_backbone_gw_put(backbone_gw);
876 	return true;
877 }
878 
879 /**
880  * batadv_handle_request() - check for REQUEST frame
881  * @bat_priv: the bat priv with all the soft interface information
882  * @primary_if: the primary hard interface of this batman soft interface
883  * @backbone_addr: backbone address to be requested (ARP sender HW MAC)
884  * @ethhdr: ethernet header of a packet
885  * @vid: the VLAN ID of the frame
886  *
887  * Return: true if handled
888  */
batadv_handle_request(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,u8 * backbone_addr,struct ethhdr * ethhdr,unsigned short vid)889 static bool batadv_handle_request(struct batadv_priv *bat_priv,
890 				  struct batadv_hard_iface *primary_if,
891 				  u8 *backbone_addr, struct ethhdr *ethhdr,
892 				  unsigned short vid)
893 {
894 	/* check for REQUEST frame */
895 	if (!batadv_compare_eth(backbone_addr, ethhdr->h_dest))
896 		return false;
897 
898 	/* sanity check, this should not happen on a normal switch,
899 	 * we ignore it in this case.
900 	 */
901 	if (!batadv_compare_eth(ethhdr->h_dest, primary_if->net_dev->dev_addr))
902 		return true;
903 
904 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
905 		   "%s(): REQUEST vid %d (sent by %pM)...\n",
906 		   __func__, batadv_print_vid(vid), ethhdr->h_source);
907 
908 	batadv_bla_answer_request(bat_priv, primary_if, vid);
909 	return true;
910 }
911 
912 /**
913  * batadv_handle_unclaim() - check for UNCLAIM frame
914  * @bat_priv: the bat priv with all the soft interface information
915  * @primary_if: the primary hard interface of this batman soft interface
916  * @backbone_addr: originator address of the backbone (Ethernet source)
917  * @claim_addr: Client to be unclaimed (ARP sender HW MAC)
918  * @vid: the VLAN ID of the frame
919  *
920  * Return: true if handled
921  */
batadv_handle_unclaim(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,u8 * backbone_addr,u8 * claim_addr,unsigned short vid)922 static bool batadv_handle_unclaim(struct batadv_priv *bat_priv,
923 				  struct batadv_hard_iface *primary_if,
924 				  u8 *backbone_addr, u8 *claim_addr,
925 				  unsigned short vid)
926 {
927 	struct batadv_bla_backbone_gw *backbone_gw;
928 
929 	/* unclaim in any case if it is our own */
930 	if (primary_if && batadv_compare_eth(backbone_addr,
931 					     primary_if->net_dev->dev_addr))
932 		batadv_bla_send_claim(bat_priv, claim_addr, vid,
933 				      BATADV_CLAIM_TYPE_UNCLAIM);
934 
935 	backbone_gw = batadv_backbone_hash_find(bat_priv, backbone_addr, vid);
936 
937 	if (!backbone_gw)
938 		return true;
939 
940 	/* this must be an UNCLAIM frame */
941 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
942 		   "%s(): UNCLAIM %pM on vid %d (sent by %pM)...\n", __func__,
943 		   claim_addr, batadv_print_vid(vid), backbone_gw->orig);
944 
945 	batadv_bla_del_claim(bat_priv, claim_addr, vid);
946 	batadv_backbone_gw_put(backbone_gw);
947 	return true;
948 }
949 
950 /**
951  * batadv_handle_claim() - check for CLAIM frame
952  * @bat_priv: the bat priv with all the soft interface information
953  * @primary_if: the primary hard interface of this batman soft interface
954  * @backbone_addr: originator address of the backbone (Ethernet Source)
955  * @claim_addr: client mac address to be claimed (ARP sender HW MAC)
956  * @vid: the VLAN ID of the frame
957  *
958  * Return: true if handled
959  */
batadv_handle_claim(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,u8 * backbone_addr,u8 * claim_addr,unsigned short vid)960 static bool batadv_handle_claim(struct batadv_priv *bat_priv,
961 				struct batadv_hard_iface *primary_if,
962 				u8 *backbone_addr, u8 *claim_addr,
963 				unsigned short vid)
964 {
965 	struct batadv_bla_backbone_gw *backbone_gw;
966 
967 	/* register the gateway if not yet available, and add the claim. */
968 
969 	backbone_gw = batadv_bla_get_backbone_gw(bat_priv, backbone_addr, vid,
970 						 false);
971 
972 	if (unlikely(!backbone_gw))
973 		return true;
974 
975 	/* this must be a CLAIM frame */
976 	batadv_bla_add_claim(bat_priv, claim_addr, vid, backbone_gw);
977 	if (batadv_compare_eth(backbone_addr, primary_if->net_dev->dev_addr))
978 		batadv_bla_send_claim(bat_priv, claim_addr, vid,
979 				      BATADV_CLAIM_TYPE_CLAIM);
980 
981 	/* TODO: we could call something like tt_local_del() here. */
982 
983 	batadv_backbone_gw_put(backbone_gw);
984 	return true;
985 }
986 
987 /**
988  * batadv_check_claim_group() - check for claim group membership
989  * @bat_priv: the bat priv with all the soft interface information
990  * @primary_if: the primary interface of this batman interface
991  * @hw_src: the Hardware source in the ARP Header
992  * @hw_dst: the Hardware destination in the ARP Header
993  * @ethhdr: pointer to the Ethernet header of the claim frame
994  *
995  * checks if it is a claim packet and if it's on the same group.
996  * This function also applies the group ID of the sender
997  * if it is in the same mesh.
998  *
999  * Return:
1000  *	2  - if it is a claim packet and on the same group
1001  *	1  - if is a claim packet from another group
1002  *	0  - if it is not a claim packet
1003  */
batadv_check_claim_group(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,u8 * hw_src,u8 * hw_dst,struct ethhdr * ethhdr)1004 static int batadv_check_claim_group(struct batadv_priv *bat_priv,
1005 				    struct batadv_hard_iface *primary_if,
1006 				    u8 *hw_src, u8 *hw_dst,
1007 				    struct ethhdr *ethhdr)
1008 {
1009 	u8 *backbone_addr;
1010 	struct batadv_orig_node *orig_node;
1011 	struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
1012 
1013 	bla_dst = (struct batadv_bla_claim_dst *)hw_dst;
1014 	bla_dst_own = &bat_priv->bla.claim_dest;
1015 
1016 	/* if announcement packet, use the source,
1017 	 * otherwise assume it is in the hw_src
1018 	 */
1019 	switch (bla_dst->type) {
1020 	case BATADV_CLAIM_TYPE_CLAIM:
1021 		backbone_addr = hw_src;
1022 		break;
1023 	case BATADV_CLAIM_TYPE_REQUEST:
1024 	case BATADV_CLAIM_TYPE_ANNOUNCE:
1025 	case BATADV_CLAIM_TYPE_UNCLAIM:
1026 		backbone_addr = ethhdr->h_source;
1027 		break;
1028 	default:
1029 		return 0;
1030 	}
1031 
1032 	/* don't accept claim frames from ourselves */
1033 	if (batadv_compare_eth(backbone_addr, primary_if->net_dev->dev_addr))
1034 		return 0;
1035 
1036 	/* if its already the same group, it is fine. */
1037 	if (bla_dst->group == bla_dst_own->group)
1038 		return 2;
1039 
1040 	/* lets see if this originator is in our mesh */
1041 	orig_node = batadv_orig_hash_find(bat_priv, backbone_addr);
1042 
1043 	/* dont accept claims from gateways which are not in
1044 	 * the same mesh or group.
1045 	 */
1046 	if (!orig_node)
1047 		return 1;
1048 
1049 	/* if our mesh friends mac is bigger, use it for ourselves. */
1050 	if (ntohs(bla_dst->group) > ntohs(bla_dst_own->group)) {
1051 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
1052 			   "taking other backbones claim group: %#.4x\n",
1053 			   ntohs(bla_dst->group));
1054 		bla_dst_own->group = bla_dst->group;
1055 	}
1056 
1057 	batadv_orig_node_put(orig_node);
1058 
1059 	return 2;
1060 }
1061 
1062 /**
1063  * batadv_bla_process_claim() - Check if this is a claim frame, and process it
1064  * @bat_priv: the bat priv with all the soft interface information
1065  * @primary_if: the primary hard interface of this batman soft interface
1066  * @skb: the frame to be checked
1067  *
1068  * Return: true if it was a claim frame, otherwise return false to
1069  * tell the callee that it can use the frame on its own.
1070  */
batadv_bla_process_claim(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,struct sk_buff * skb)1071 static bool batadv_bla_process_claim(struct batadv_priv *bat_priv,
1072 				     struct batadv_hard_iface *primary_if,
1073 				     struct sk_buff *skb)
1074 {
1075 	struct batadv_bla_claim_dst *bla_dst, *bla_dst_own;
1076 	u8 *hw_src, *hw_dst;
1077 	struct vlan_hdr *vhdr, vhdr_buf;
1078 	struct ethhdr *ethhdr;
1079 	struct arphdr *arphdr;
1080 	unsigned short vid;
1081 	int vlan_depth = 0;
1082 	__be16 proto;
1083 	int headlen;
1084 	int ret;
1085 
1086 	vid = batadv_get_vid(skb, 0);
1087 	ethhdr = eth_hdr(skb);
1088 
1089 	proto = ethhdr->h_proto;
1090 	headlen = ETH_HLEN;
1091 	if (vid & BATADV_VLAN_HAS_TAG) {
1092 		/* Traverse the VLAN/Ethertypes.
1093 		 *
1094 		 * At this point it is known that the first protocol is a VLAN
1095 		 * header, so start checking at the encapsulated protocol.
1096 		 *
1097 		 * The depth of the VLAN headers is recorded to drop BLA claim
1098 		 * frames encapsulated into multiple VLAN headers (QinQ).
1099 		 */
1100 		do {
1101 			vhdr = skb_header_pointer(skb, headlen, VLAN_HLEN,
1102 						  &vhdr_buf);
1103 			if (!vhdr)
1104 				return false;
1105 
1106 			proto = vhdr->h_vlan_encapsulated_proto;
1107 			headlen += VLAN_HLEN;
1108 			vlan_depth++;
1109 		} while (proto == htons(ETH_P_8021Q));
1110 	}
1111 
1112 	if (proto != htons(ETH_P_ARP))
1113 		return false; /* not a claim frame */
1114 
1115 	/* this must be a ARP frame. check if it is a claim. */
1116 
1117 	if (unlikely(!pskb_may_pull(skb, headlen + arp_hdr_len(skb->dev))))
1118 		return false;
1119 
1120 	/* pskb_may_pull() may have modified the pointers, get ethhdr again */
1121 	ethhdr = eth_hdr(skb);
1122 	arphdr = (struct arphdr *)((u8 *)ethhdr + headlen);
1123 
1124 	/* Check whether the ARP frame carries a valid
1125 	 * IP information
1126 	 */
1127 	if (arphdr->ar_hrd != htons(ARPHRD_ETHER))
1128 		return false;
1129 	if (arphdr->ar_pro != htons(ETH_P_IP))
1130 		return false;
1131 	if (arphdr->ar_hln != ETH_ALEN)
1132 		return false;
1133 	if (arphdr->ar_pln != 4)
1134 		return false;
1135 
1136 	hw_src = (u8 *)arphdr + sizeof(struct arphdr);
1137 	hw_dst = hw_src + ETH_ALEN + 4;
1138 	bla_dst = (struct batadv_bla_claim_dst *)hw_dst;
1139 	bla_dst_own = &bat_priv->bla.claim_dest;
1140 
1141 	/* check if it is a claim frame in general */
1142 	if (memcmp(bla_dst->magic, bla_dst_own->magic,
1143 		   sizeof(bla_dst->magic)) != 0)
1144 		return false;
1145 
1146 	/* check if there is a claim frame encapsulated deeper in (QinQ) and
1147 	 * drop that, as this is not supported by BLA but should also not be
1148 	 * sent via the mesh.
1149 	 */
1150 	if (vlan_depth > 1)
1151 		return true;
1152 
1153 	/* Let the loopdetect frames on the mesh in any case. */
1154 	if (bla_dst->type == BATADV_CLAIM_TYPE_LOOPDETECT)
1155 		return false;
1156 
1157 	/* check if it is a claim frame. */
1158 	ret = batadv_check_claim_group(bat_priv, primary_if, hw_src, hw_dst,
1159 				       ethhdr);
1160 	if (ret == 1)
1161 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
1162 			   "%s(): received a claim frame from another group. From: %pM on vid %d ...(hw_src %pM, hw_dst %pM)\n",
1163 			   __func__, ethhdr->h_source, batadv_print_vid(vid),
1164 			   hw_src, hw_dst);
1165 
1166 	if (ret < 2)
1167 		return !!ret;
1168 
1169 	/* become a backbone gw ourselves on this vlan if not happened yet */
1170 	batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
1171 
1172 	/* check for the different types of claim frames ... */
1173 	switch (bla_dst->type) {
1174 	case BATADV_CLAIM_TYPE_CLAIM:
1175 		if (batadv_handle_claim(bat_priv, primary_if, hw_src,
1176 					ethhdr->h_source, vid))
1177 			return true;
1178 		break;
1179 	case BATADV_CLAIM_TYPE_UNCLAIM:
1180 		if (batadv_handle_unclaim(bat_priv, primary_if,
1181 					  ethhdr->h_source, hw_src, vid))
1182 			return true;
1183 		break;
1184 
1185 	case BATADV_CLAIM_TYPE_ANNOUNCE:
1186 		if (batadv_handle_announce(bat_priv, hw_src, ethhdr->h_source,
1187 					   vid))
1188 			return true;
1189 		break;
1190 	case BATADV_CLAIM_TYPE_REQUEST:
1191 		if (batadv_handle_request(bat_priv, primary_if, hw_src, ethhdr,
1192 					  vid))
1193 			return true;
1194 		break;
1195 	}
1196 
1197 	batadv_dbg(BATADV_DBG_BLA, bat_priv,
1198 		   "%s(): ERROR - this looks like a claim frame, but is useless. eth src %pM on vid %d ...(hw_src %pM, hw_dst %pM)\n",
1199 		   __func__, ethhdr->h_source, batadv_print_vid(vid), hw_src,
1200 		   hw_dst);
1201 	return true;
1202 }
1203 
1204 /**
1205  * batadv_bla_purge_backbone_gw() - Remove backbone gateways after a timeout or
1206  *  immediately
1207  * @bat_priv: the bat priv with all the soft interface information
1208  * @now: whether the whole hash shall be wiped now
1209  *
1210  * Check when we last heard from other nodes, and remove them in case of
1211  * a time out, or clean all backbone gws if now is set.
1212  */
batadv_bla_purge_backbone_gw(struct batadv_priv * bat_priv,int now)1213 static void batadv_bla_purge_backbone_gw(struct batadv_priv *bat_priv, int now)
1214 {
1215 	struct batadv_bla_backbone_gw *backbone_gw;
1216 	struct hlist_node *node_tmp;
1217 	struct hlist_head *head;
1218 	struct batadv_hashtable *hash;
1219 	spinlock_t *list_lock;	/* protects write access to the hash lists */
1220 	int i;
1221 
1222 	hash = bat_priv->bla.backbone_hash;
1223 	if (!hash)
1224 		return;
1225 
1226 	for (i = 0; i < hash->size; i++) {
1227 		head = &hash->table[i];
1228 		list_lock = &hash->list_locks[i];
1229 
1230 		spin_lock_bh(list_lock);
1231 		hlist_for_each_entry_safe(backbone_gw, node_tmp,
1232 					  head, hash_entry) {
1233 			if (now)
1234 				goto purge_now;
1235 			if (!batadv_has_timed_out(backbone_gw->lasttime,
1236 						  BATADV_BLA_BACKBONE_TIMEOUT))
1237 				continue;
1238 
1239 			batadv_dbg(BATADV_DBG_BLA, backbone_gw->bat_priv,
1240 				   "%s(): backbone gw %pM timed out\n",
1241 				   __func__, backbone_gw->orig);
1242 
1243 purge_now:
1244 			/* don't wait for the pending request anymore */
1245 			if (atomic_read(&backbone_gw->request_sent))
1246 				atomic_dec(&bat_priv->bla.num_requests);
1247 
1248 			batadv_bla_del_backbone_claims(backbone_gw);
1249 
1250 			hlist_del_rcu(&backbone_gw->hash_entry);
1251 			batadv_backbone_gw_put(backbone_gw);
1252 		}
1253 		spin_unlock_bh(list_lock);
1254 	}
1255 }
1256 
1257 /**
1258  * batadv_bla_purge_claims() - Remove claims after a timeout or immediately
1259  * @bat_priv: the bat priv with all the soft interface information
1260  * @primary_if: the selected primary interface, may be NULL if now is set
1261  * @now: whether the whole hash shall be wiped now
1262  *
1263  * Check when we heard last time from our own claims, and remove them in case of
1264  * a time out, or clean all claims if now is set
1265  */
batadv_bla_purge_claims(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,int now)1266 static void batadv_bla_purge_claims(struct batadv_priv *bat_priv,
1267 				    struct batadv_hard_iface *primary_if,
1268 				    int now)
1269 {
1270 	struct batadv_bla_backbone_gw *backbone_gw;
1271 	struct batadv_bla_claim *claim;
1272 	struct hlist_head *head;
1273 	struct batadv_hashtable *hash;
1274 	int i;
1275 
1276 	hash = bat_priv->bla.claim_hash;
1277 	if (!hash)
1278 		return;
1279 
1280 	for (i = 0; i < hash->size; i++) {
1281 		head = &hash->table[i];
1282 
1283 		rcu_read_lock();
1284 		hlist_for_each_entry_rcu(claim, head, hash_entry) {
1285 			backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
1286 			if (now)
1287 				goto purge_now;
1288 
1289 			if (!batadv_compare_eth(backbone_gw->orig,
1290 						primary_if->net_dev->dev_addr))
1291 				goto skip;
1292 
1293 			if (!batadv_has_timed_out(claim->lasttime,
1294 						  BATADV_BLA_CLAIM_TIMEOUT))
1295 				goto skip;
1296 
1297 			batadv_dbg(BATADV_DBG_BLA, bat_priv,
1298 				   "%s(): timed out.\n", __func__);
1299 
1300 purge_now:
1301 			batadv_dbg(BATADV_DBG_BLA, bat_priv,
1302 				   "%s(): %pM, vid %d\n", __func__,
1303 				   claim->addr, claim->vid);
1304 
1305 			batadv_handle_unclaim(bat_priv, primary_if,
1306 					      backbone_gw->orig,
1307 					      claim->addr, claim->vid);
1308 skip:
1309 			batadv_backbone_gw_put(backbone_gw);
1310 		}
1311 		rcu_read_unlock();
1312 	}
1313 }
1314 
1315 /**
1316  * batadv_bla_update_orig_address() - Update the backbone gateways when the own
1317  *  originator address changes
1318  * @bat_priv: the bat priv with all the soft interface information
1319  * @primary_if: the new selected primary_if
1320  * @oldif: the old primary interface, may be NULL
1321  */
batadv_bla_update_orig_address(struct batadv_priv * bat_priv,struct batadv_hard_iface * primary_if,struct batadv_hard_iface * oldif)1322 void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
1323 				    struct batadv_hard_iface *primary_if,
1324 				    struct batadv_hard_iface *oldif)
1325 {
1326 	struct batadv_bla_backbone_gw *backbone_gw;
1327 	struct hlist_head *head;
1328 	struct batadv_hashtable *hash;
1329 	__be16 group;
1330 	int i;
1331 
1332 	/* reset bridge loop avoidance group id */
1333 	group = htons(crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN));
1334 	bat_priv->bla.claim_dest.group = group;
1335 
1336 	/* purge everything when bridge loop avoidance is turned off */
1337 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
1338 		oldif = NULL;
1339 
1340 	if (!oldif) {
1341 		batadv_bla_purge_claims(bat_priv, NULL, 1);
1342 		batadv_bla_purge_backbone_gw(bat_priv, 1);
1343 		return;
1344 	}
1345 
1346 	hash = bat_priv->bla.backbone_hash;
1347 	if (!hash)
1348 		return;
1349 
1350 	for (i = 0; i < hash->size; i++) {
1351 		head = &hash->table[i];
1352 
1353 		rcu_read_lock();
1354 		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
1355 			/* own orig still holds the old value. */
1356 			if (!batadv_compare_eth(backbone_gw->orig,
1357 						oldif->net_dev->dev_addr))
1358 				continue;
1359 
1360 			ether_addr_copy(backbone_gw->orig,
1361 					primary_if->net_dev->dev_addr);
1362 			/* send an announce frame so others will ask for our
1363 			 * claims and update their tables.
1364 			 */
1365 			batadv_bla_send_announce(bat_priv, backbone_gw);
1366 		}
1367 		rcu_read_unlock();
1368 	}
1369 }
1370 
1371 /**
1372  * batadv_bla_send_loopdetect() - send a loopdetect frame
1373  * @bat_priv: the bat priv with all the soft interface information
1374  * @backbone_gw: the backbone gateway for which a loop should be detected
1375  *
1376  * To detect loops that the bridge loop avoidance can't handle, send a loop
1377  * detection packet on the backbone. Unlike other BLA frames, this frame will
1378  * be allowed on the mesh by other nodes. If it is received on the mesh, this
1379  * indicates that there is a loop.
1380  */
1381 static void
batadv_bla_send_loopdetect(struct batadv_priv * bat_priv,struct batadv_bla_backbone_gw * backbone_gw)1382 batadv_bla_send_loopdetect(struct batadv_priv *bat_priv,
1383 			   struct batadv_bla_backbone_gw *backbone_gw)
1384 {
1385 	batadv_dbg(BATADV_DBG_BLA, bat_priv, "Send loopdetect frame for vid %d\n",
1386 		   backbone_gw->vid);
1387 	batadv_bla_send_claim(bat_priv, bat_priv->bla.loopdetect_addr,
1388 			      backbone_gw->vid, BATADV_CLAIM_TYPE_LOOPDETECT);
1389 }
1390 
1391 /**
1392  * batadv_bla_status_update() - purge bla interfaces if necessary
1393  * @net_dev: the soft interface net device
1394  */
batadv_bla_status_update(struct net_device * net_dev)1395 void batadv_bla_status_update(struct net_device *net_dev)
1396 {
1397 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
1398 	struct batadv_hard_iface *primary_if;
1399 
1400 	primary_if = batadv_primary_if_get_selected(bat_priv);
1401 	if (!primary_if)
1402 		return;
1403 
1404 	/* this function already purges everything when bla is disabled,
1405 	 * so just call that one.
1406 	 */
1407 	batadv_bla_update_orig_address(bat_priv, primary_if, primary_if);
1408 	batadv_hardif_put(primary_if);
1409 }
1410 
1411 /**
1412  * batadv_bla_periodic_work() - performs periodic bla work
1413  * @work: kernel work struct
1414  *
1415  * periodic work to do:
1416  *  * purge structures when they are too old
1417  *  * send announcements
1418  */
batadv_bla_periodic_work(struct work_struct * work)1419 static void batadv_bla_periodic_work(struct work_struct *work)
1420 {
1421 	struct delayed_work *delayed_work;
1422 	struct batadv_priv *bat_priv;
1423 	struct batadv_priv_bla *priv_bla;
1424 	struct hlist_head *head;
1425 	struct batadv_bla_backbone_gw *backbone_gw;
1426 	struct batadv_hashtable *hash;
1427 	struct batadv_hard_iface *primary_if;
1428 	bool send_loopdetect = false;
1429 	int i;
1430 
1431 	delayed_work = to_delayed_work(work);
1432 	priv_bla = container_of(delayed_work, struct batadv_priv_bla, work);
1433 	bat_priv = container_of(priv_bla, struct batadv_priv, bla);
1434 	primary_if = batadv_primary_if_get_selected(bat_priv);
1435 	if (!primary_if)
1436 		goto out;
1437 
1438 	batadv_bla_purge_claims(bat_priv, primary_if, 0);
1439 	batadv_bla_purge_backbone_gw(bat_priv, 0);
1440 
1441 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
1442 		goto out;
1443 
1444 	if (atomic_dec_and_test(&bat_priv->bla.loopdetect_next)) {
1445 		/* set a new random mac address for the next bridge loop
1446 		 * detection frames. Set the locally administered bit to avoid
1447 		 * collisions with users mac addresses.
1448 		 */
1449 		eth_random_addr(bat_priv->bla.loopdetect_addr);
1450 		bat_priv->bla.loopdetect_addr[0] = 0xba;
1451 		bat_priv->bla.loopdetect_addr[1] = 0xbe;
1452 		bat_priv->bla.loopdetect_lasttime = jiffies;
1453 		atomic_set(&bat_priv->bla.loopdetect_next,
1454 			   BATADV_BLA_LOOPDETECT_PERIODS);
1455 
1456 		/* mark for sending loop detect on all VLANs */
1457 		send_loopdetect = true;
1458 	}
1459 
1460 	hash = bat_priv->bla.backbone_hash;
1461 	if (!hash)
1462 		goto out;
1463 
1464 	for (i = 0; i < hash->size; i++) {
1465 		head = &hash->table[i];
1466 
1467 		rcu_read_lock();
1468 		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
1469 			if (!batadv_compare_eth(backbone_gw->orig,
1470 						primary_if->net_dev->dev_addr))
1471 				continue;
1472 
1473 			backbone_gw->lasttime = jiffies;
1474 
1475 			batadv_bla_send_announce(bat_priv, backbone_gw);
1476 			if (send_loopdetect)
1477 				batadv_bla_send_loopdetect(bat_priv,
1478 							   backbone_gw);
1479 
1480 			/* request_sent is only set after creation to avoid
1481 			 * problems when we are not yet known as backbone gw
1482 			 * in the backbone.
1483 			 *
1484 			 * We can reset this now after we waited some periods
1485 			 * to give bridge forward delays and bla group forming
1486 			 * some grace time.
1487 			 */
1488 
1489 			if (atomic_read(&backbone_gw->request_sent) == 0)
1490 				continue;
1491 
1492 			if (!atomic_dec_and_test(&backbone_gw->wait_periods))
1493 				continue;
1494 
1495 			atomic_dec(&backbone_gw->bat_priv->bla.num_requests);
1496 			atomic_set(&backbone_gw->request_sent, 0);
1497 		}
1498 		rcu_read_unlock();
1499 	}
1500 out:
1501 	if (primary_if)
1502 		batadv_hardif_put(primary_if);
1503 
1504 	queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
1505 			   msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
1506 }
1507 
1508 /* The hash for claim and backbone hash receive the same key because they
1509  * are getting initialized by hash_new with the same key. Reinitializing
1510  * them with to different keys to allow nested locking without generating
1511  * lockdep warnings
1512  */
1513 static struct lock_class_key batadv_claim_hash_lock_class_key;
1514 static struct lock_class_key batadv_backbone_hash_lock_class_key;
1515 
1516 /**
1517  * batadv_bla_init() - initialize all bla structures
1518  * @bat_priv: the bat priv with all the soft interface information
1519  *
1520  * Return: 0 on success, < 0 on error.
1521  */
batadv_bla_init(struct batadv_priv * bat_priv)1522 int batadv_bla_init(struct batadv_priv *bat_priv)
1523 {
1524 	int i;
1525 	u8 claim_dest[ETH_ALEN] = {0xff, 0x43, 0x05, 0x00, 0x00, 0x00};
1526 	struct batadv_hard_iface *primary_if;
1527 	u16 crc;
1528 	unsigned long entrytime;
1529 
1530 	spin_lock_init(&bat_priv->bla.bcast_duplist_lock);
1531 
1532 	batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hash registering\n");
1533 
1534 	/* setting claim destination address */
1535 	memcpy(&bat_priv->bla.claim_dest.magic, claim_dest, 3);
1536 	bat_priv->bla.claim_dest.type = 0;
1537 	primary_if = batadv_primary_if_get_selected(bat_priv);
1538 	if (primary_if) {
1539 		crc = crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN);
1540 		bat_priv->bla.claim_dest.group = htons(crc);
1541 		batadv_hardif_put(primary_if);
1542 	} else {
1543 		bat_priv->bla.claim_dest.group = 0; /* will be set later */
1544 	}
1545 
1546 	/* initialize the duplicate list */
1547 	entrytime = jiffies - msecs_to_jiffies(BATADV_DUPLIST_TIMEOUT);
1548 	for (i = 0; i < BATADV_DUPLIST_SIZE; i++)
1549 		bat_priv->bla.bcast_duplist[i].entrytime = entrytime;
1550 	bat_priv->bla.bcast_duplist_curr = 0;
1551 
1552 	atomic_set(&bat_priv->bla.loopdetect_next,
1553 		   BATADV_BLA_LOOPDETECT_PERIODS);
1554 
1555 	if (bat_priv->bla.claim_hash)
1556 		return 0;
1557 
1558 	bat_priv->bla.claim_hash = batadv_hash_new(128);
1559 	bat_priv->bla.backbone_hash = batadv_hash_new(32);
1560 
1561 	if (!bat_priv->bla.claim_hash || !bat_priv->bla.backbone_hash)
1562 		return -ENOMEM;
1563 
1564 	batadv_hash_set_lock_class(bat_priv->bla.claim_hash,
1565 				   &batadv_claim_hash_lock_class_key);
1566 	batadv_hash_set_lock_class(bat_priv->bla.backbone_hash,
1567 				   &batadv_backbone_hash_lock_class_key);
1568 
1569 	batadv_dbg(BATADV_DBG_BLA, bat_priv, "bla hashes initialized\n");
1570 
1571 	INIT_DELAYED_WORK(&bat_priv->bla.work, batadv_bla_periodic_work);
1572 
1573 	queue_delayed_work(batadv_event_workqueue, &bat_priv->bla.work,
1574 			   msecs_to_jiffies(BATADV_BLA_PERIOD_LENGTH));
1575 	return 0;
1576 }
1577 
1578 /**
1579  * batadv_bla_check_duplist() - Check if a frame is in the broadcast dup.
1580  * @bat_priv: the bat priv with all the soft interface information
1581  * @skb: contains the multicast packet to be checked
1582  * @payload_ptr: pointer to position inside the head buffer of the skb
1583  *  marking the start of the data to be CRC'ed
1584  * @orig: originator mac address, NULL if unknown
1585  *
1586  * Check if it is on our broadcast list. Another gateway might have sent the
1587  * same packet because it is connected to the same backbone, so we have to
1588  * remove this duplicate.
1589  *
1590  * This is performed by checking the CRC, which will tell us
1591  * with a good chance that it is the same packet. If it is furthermore
1592  * sent by another host, drop it. We allow equal packets from
1593  * the same host however as this might be intended.
1594  *
1595  * Return: true if a packet is in the duplicate list, false otherwise.
1596  */
batadv_bla_check_duplist(struct batadv_priv * bat_priv,struct sk_buff * skb,u8 * payload_ptr,const u8 * orig)1597 static bool batadv_bla_check_duplist(struct batadv_priv *bat_priv,
1598 				     struct sk_buff *skb, u8 *payload_ptr,
1599 				     const u8 *orig)
1600 {
1601 	struct batadv_bcast_duplist_entry *entry;
1602 	bool ret = false;
1603 	int i, curr;
1604 	__be32 crc;
1605 
1606 	/* calculate the crc ... */
1607 	crc = batadv_skb_crc32(skb, payload_ptr);
1608 
1609 	spin_lock_bh(&bat_priv->bla.bcast_duplist_lock);
1610 
1611 	for (i = 0; i < BATADV_DUPLIST_SIZE; i++) {
1612 		curr = (bat_priv->bla.bcast_duplist_curr + i);
1613 		curr %= BATADV_DUPLIST_SIZE;
1614 		entry = &bat_priv->bla.bcast_duplist[curr];
1615 
1616 		/* we can stop searching if the entry is too old ;
1617 		 * later entries will be even older
1618 		 */
1619 		if (batadv_has_timed_out(entry->entrytime,
1620 					 BATADV_DUPLIST_TIMEOUT))
1621 			break;
1622 
1623 		if (entry->crc != crc)
1624 			continue;
1625 
1626 		/* are the originators both known and not anonymous? */
1627 		if (orig && !is_zero_ether_addr(orig) &&
1628 		    !is_zero_ether_addr(entry->orig)) {
1629 			/* If known, check if the new frame came from
1630 			 * the same originator:
1631 			 * We are safe to take identical frames from the
1632 			 * same orig, if known, as multiplications in
1633 			 * the mesh are detected via the (orig, seqno) pair.
1634 			 * So we can be a bit more liberal here and allow
1635 			 * identical frames from the same orig which the source
1636 			 * host might have sent multiple times on purpose.
1637 			 */
1638 			if (batadv_compare_eth(entry->orig, orig))
1639 				continue;
1640 		}
1641 
1642 		/* this entry seems to match: same crc, not too old,
1643 		 * and from another gw. therefore return true to forbid it.
1644 		 */
1645 		ret = true;
1646 		goto out;
1647 	}
1648 	/* not found, add a new entry (overwrite the oldest entry)
1649 	 * and allow it, its the first occurrence.
1650 	 */
1651 	curr = (bat_priv->bla.bcast_duplist_curr + BATADV_DUPLIST_SIZE - 1);
1652 	curr %= BATADV_DUPLIST_SIZE;
1653 	entry = &bat_priv->bla.bcast_duplist[curr];
1654 	entry->crc = crc;
1655 	entry->entrytime = jiffies;
1656 
1657 	/* known originator */
1658 	if (orig)
1659 		ether_addr_copy(entry->orig, orig);
1660 	/* anonymous originator */
1661 	else
1662 		eth_zero_addr(entry->orig);
1663 
1664 	bat_priv->bla.bcast_duplist_curr = curr;
1665 
1666 out:
1667 	spin_unlock_bh(&bat_priv->bla.bcast_duplist_lock);
1668 
1669 	return ret;
1670 }
1671 
1672 /**
1673  * batadv_bla_check_ucast_duplist() - Check if a frame is in the broadcast dup.
1674  * @bat_priv: the bat priv with all the soft interface information
1675  * @skb: contains the multicast packet to be checked, decapsulated from a
1676  *  unicast_packet
1677  *
1678  * Check if it is on our broadcast list. Another gateway might have sent the
1679  * same packet because it is connected to the same backbone, so we have to
1680  * remove this duplicate.
1681  *
1682  * Return: true if a packet is in the duplicate list, false otherwise.
1683  */
batadv_bla_check_ucast_duplist(struct batadv_priv * bat_priv,struct sk_buff * skb)1684 static bool batadv_bla_check_ucast_duplist(struct batadv_priv *bat_priv,
1685 					   struct sk_buff *skb)
1686 {
1687 	return batadv_bla_check_duplist(bat_priv, skb, (u8 *)skb->data, NULL);
1688 }
1689 
1690 /**
1691  * batadv_bla_check_bcast_duplist() - Check if a frame is in the broadcast dup.
1692  * @bat_priv: the bat priv with all the soft interface information
1693  * @skb: contains the bcast_packet to be checked
1694  *
1695  * Check if it is on our broadcast list. Another gateway might have sent the
1696  * same packet because it is connected to the same backbone, so we have to
1697  * remove this duplicate.
1698  *
1699  * Return: true if a packet is in the duplicate list, false otherwise.
1700  */
batadv_bla_check_bcast_duplist(struct batadv_priv * bat_priv,struct sk_buff * skb)1701 bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
1702 				    struct sk_buff *skb)
1703 {
1704 	struct batadv_bcast_packet *bcast_packet;
1705 	u8 *payload_ptr;
1706 
1707 	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1708 	payload_ptr = (u8 *)(bcast_packet + 1);
1709 
1710 	return batadv_bla_check_duplist(bat_priv, skb, payload_ptr,
1711 					bcast_packet->orig);
1712 }
1713 
1714 /**
1715  * batadv_bla_is_backbone_gw_orig() - Check if the originator is a gateway for
1716  *  the VLAN identified by vid.
1717  * @bat_priv: the bat priv with all the soft interface information
1718  * @orig: originator mac address
1719  * @vid: VLAN identifier
1720  *
1721  * Return: true if orig is a backbone for this vid, false otherwise.
1722  */
batadv_bla_is_backbone_gw_orig(struct batadv_priv * bat_priv,u8 * orig,unsigned short vid)1723 bool batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, u8 *orig,
1724 				    unsigned short vid)
1725 {
1726 	struct batadv_hashtable *hash = bat_priv->bla.backbone_hash;
1727 	struct hlist_head *head;
1728 	struct batadv_bla_backbone_gw *backbone_gw;
1729 	int i;
1730 
1731 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
1732 		return false;
1733 
1734 	if (!hash)
1735 		return false;
1736 
1737 	for (i = 0; i < hash->size; i++) {
1738 		head = &hash->table[i];
1739 
1740 		rcu_read_lock();
1741 		hlist_for_each_entry_rcu(backbone_gw, head, hash_entry) {
1742 			if (batadv_compare_eth(backbone_gw->orig, orig) &&
1743 			    backbone_gw->vid == vid) {
1744 				rcu_read_unlock();
1745 				return true;
1746 			}
1747 		}
1748 		rcu_read_unlock();
1749 	}
1750 
1751 	return false;
1752 }
1753 
1754 /**
1755  * batadv_bla_is_backbone_gw() - check if originator is a backbone gw for a VLAN
1756  * @skb: the frame to be checked
1757  * @orig_node: the orig_node of the frame
1758  * @hdr_size: maximum length of the frame
1759  *
1760  * Return: true if the orig_node is also a gateway on the soft interface,
1761  * otherwise it returns false.
1762  */
batadv_bla_is_backbone_gw(struct sk_buff * skb,struct batadv_orig_node * orig_node,int hdr_size)1763 bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
1764 			       struct batadv_orig_node *orig_node, int hdr_size)
1765 {
1766 	struct batadv_bla_backbone_gw *backbone_gw;
1767 	unsigned short vid;
1768 
1769 	if (!atomic_read(&orig_node->bat_priv->bridge_loop_avoidance))
1770 		return false;
1771 
1772 	/* first, find out the vid. */
1773 	if (!pskb_may_pull(skb, hdr_size + ETH_HLEN))
1774 		return false;
1775 
1776 	vid = batadv_get_vid(skb, hdr_size);
1777 
1778 	/* see if this originator is a backbone gw for this VLAN */
1779 	backbone_gw = batadv_backbone_hash_find(orig_node->bat_priv,
1780 						orig_node->orig, vid);
1781 	if (!backbone_gw)
1782 		return false;
1783 
1784 	batadv_backbone_gw_put(backbone_gw);
1785 	return true;
1786 }
1787 
1788 /**
1789  * batadv_bla_free() - free all bla structures
1790  * @bat_priv: the bat priv with all the soft interface information
1791  *
1792  * for softinterface free or module unload
1793  */
batadv_bla_free(struct batadv_priv * bat_priv)1794 void batadv_bla_free(struct batadv_priv *bat_priv)
1795 {
1796 	struct batadv_hard_iface *primary_if;
1797 
1798 	cancel_delayed_work_sync(&bat_priv->bla.work);
1799 	primary_if = batadv_primary_if_get_selected(bat_priv);
1800 
1801 	if (bat_priv->bla.claim_hash) {
1802 		batadv_bla_purge_claims(bat_priv, primary_if, 1);
1803 		batadv_hash_destroy(bat_priv->bla.claim_hash);
1804 		bat_priv->bla.claim_hash = NULL;
1805 	}
1806 	if (bat_priv->bla.backbone_hash) {
1807 		batadv_bla_purge_backbone_gw(bat_priv, 1);
1808 		batadv_hash_destroy(bat_priv->bla.backbone_hash);
1809 		bat_priv->bla.backbone_hash = NULL;
1810 	}
1811 	if (primary_if)
1812 		batadv_hardif_put(primary_if);
1813 }
1814 
1815 /**
1816  * batadv_bla_loopdetect_check() - check and handle a detected loop
1817  * @bat_priv: the bat priv with all the soft interface information
1818  * @skb: the packet to check
1819  * @primary_if: interface where the request came on
1820  * @vid: the VLAN ID of the frame
1821  *
1822  * Checks if this packet is a loop detect frame which has been sent by us,
1823  * throws an uevent and logs the event if that is the case.
1824  *
1825  * Return: true if it is a loop detect frame which is to be dropped, false
1826  * otherwise.
1827  */
1828 static bool
batadv_bla_loopdetect_check(struct batadv_priv * bat_priv,struct sk_buff * skb,struct batadv_hard_iface * primary_if,unsigned short vid)1829 batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
1830 			    struct batadv_hard_iface *primary_if,
1831 			    unsigned short vid)
1832 {
1833 	struct batadv_bla_backbone_gw *backbone_gw;
1834 	struct ethhdr *ethhdr;
1835 	bool ret;
1836 
1837 	ethhdr = eth_hdr(skb);
1838 
1839 	/* Only check for the MAC address and skip more checks here for
1840 	 * performance reasons - this function is on the hotpath, after all.
1841 	 */
1842 	if (!batadv_compare_eth(ethhdr->h_source,
1843 				bat_priv->bla.loopdetect_addr))
1844 		return false;
1845 
1846 	/* If the packet came too late, don't forward it on the mesh
1847 	 * but don't consider that as loop. It might be a coincidence.
1848 	 */
1849 	if (batadv_has_timed_out(bat_priv->bla.loopdetect_lasttime,
1850 				 BATADV_BLA_LOOPDETECT_TIMEOUT))
1851 		return true;
1852 
1853 	backbone_gw = batadv_bla_get_backbone_gw(bat_priv,
1854 						 primary_if->net_dev->dev_addr,
1855 						 vid, true);
1856 	if (unlikely(!backbone_gw))
1857 		return true;
1858 
1859 	ret = queue_work(batadv_event_workqueue, &backbone_gw->report_work);
1860 
1861 	/* backbone_gw is unreferenced in the report work function
1862 	 * if queue_work() call was successful
1863 	 */
1864 	if (!ret)
1865 		batadv_backbone_gw_put(backbone_gw);
1866 
1867 	return true;
1868 }
1869 
1870 /**
1871  * batadv_bla_rx() - check packets coming from the mesh.
1872  * @bat_priv: the bat priv with all the soft interface information
1873  * @skb: the frame to be checked
1874  * @vid: the VLAN ID of the frame
1875  * @packet_type: the batman packet type this frame came in
1876  *
1877  * batadv_bla_rx avoidance checks if:
1878  *  * we have to race for a claim
1879  *  * if the frame is allowed on the LAN
1880  *
1881  * In these cases, the skb is further handled by this function
1882  *
1883  * Return: true if handled, otherwise it returns false and the caller shall
1884  * further process the skb.
1885  */
batadv_bla_rx(struct batadv_priv * bat_priv,struct sk_buff * skb,unsigned short vid,int packet_type)1886 bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
1887 		   unsigned short vid, int packet_type)
1888 {
1889 	struct batadv_bla_backbone_gw *backbone_gw;
1890 	struct ethhdr *ethhdr;
1891 	struct batadv_bla_claim search_claim, *claim = NULL;
1892 	struct batadv_hard_iface *primary_if;
1893 	bool own_claim;
1894 	bool ret;
1895 
1896 	ethhdr = eth_hdr(skb);
1897 
1898 	primary_if = batadv_primary_if_get_selected(bat_priv);
1899 	if (!primary_if)
1900 		goto handled;
1901 
1902 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
1903 		goto allow;
1904 
1905 	if (batadv_bla_loopdetect_check(bat_priv, skb, primary_if, vid))
1906 		goto handled;
1907 
1908 	if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
1909 		/* don't allow multicast packets while requests are in flight */
1910 		if (is_multicast_ether_addr(ethhdr->h_dest))
1911 			/* Both broadcast flooding or multicast-via-unicasts
1912 			 * delivery might send to multiple backbone gateways
1913 			 * sharing the same LAN and therefore need to coordinate
1914 			 * which backbone gateway forwards into the LAN,
1915 			 * by claiming the payload source address.
1916 			 *
1917 			 * Broadcast flooding and multicast-via-unicasts
1918 			 * delivery use the following two batman packet types.
1919 			 * Note: explicitly exclude BATADV_UNICAST_4ADDR,
1920 			 * as the DHCP gateway feature will send explicitly
1921 			 * to only one BLA gateway, so the claiming process
1922 			 * should be avoided there.
1923 			 */
1924 			if (packet_type == BATADV_BCAST ||
1925 			    packet_type == BATADV_UNICAST)
1926 				goto handled;
1927 
1928 	/* potential duplicates from foreign BLA backbone gateways via
1929 	 * multicast-in-unicast packets
1930 	 */
1931 	if (is_multicast_ether_addr(ethhdr->h_dest) &&
1932 	    packet_type == BATADV_UNICAST &&
1933 	    batadv_bla_check_ucast_duplist(bat_priv, skb))
1934 		goto handled;
1935 
1936 	ether_addr_copy(search_claim.addr, ethhdr->h_source);
1937 	search_claim.vid = vid;
1938 	claim = batadv_claim_hash_find(bat_priv, &search_claim);
1939 
1940 	if (!claim) {
1941 		/* possible optimization: race for a claim */
1942 		/* No claim exists yet, claim it for us!
1943 		 */
1944 
1945 		batadv_dbg(BATADV_DBG_BLA, bat_priv,
1946 			   "%s(): Unclaimed MAC %pM found. Claim it. Local: %s\n",
1947 			   __func__, ethhdr->h_source,
1948 			   batadv_is_my_client(bat_priv,
1949 					       ethhdr->h_source, vid) ?
1950 			   "yes" : "no");
1951 		batadv_handle_claim(bat_priv, primary_if,
1952 				    primary_if->net_dev->dev_addr,
1953 				    ethhdr->h_source, vid);
1954 		goto allow;
1955 	}
1956 
1957 	/* if it is our own claim ... */
1958 	backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
1959 	own_claim = batadv_compare_eth(backbone_gw->orig,
1960 				       primary_if->net_dev->dev_addr);
1961 	batadv_backbone_gw_put(backbone_gw);
1962 
1963 	if (own_claim) {
1964 		/* ... allow it in any case */
1965 		claim->lasttime = jiffies;
1966 		goto allow;
1967 	}
1968 
1969 	/* if it is a multicast ... */
1970 	if (is_multicast_ether_addr(ethhdr->h_dest) &&
1971 	    (packet_type == BATADV_BCAST || packet_type == BATADV_UNICAST)) {
1972 		/* ... drop it. the responsible gateway is in charge.
1973 		 *
1974 		 * We need to check packet type because with the gateway
1975 		 * feature, broadcasts (like DHCP requests) may be sent
1976 		 * using a unicast 4 address packet type. See comment above.
1977 		 */
1978 		goto handled;
1979 	} else {
1980 		/* seems the client considers us as its best gateway.
1981 		 * send a claim and update the claim table
1982 		 * immediately.
1983 		 */
1984 		batadv_handle_claim(bat_priv, primary_if,
1985 				    primary_if->net_dev->dev_addr,
1986 				    ethhdr->h_source, vid);
1987 		goto allow;
1988 	}
1989 allow:
1990 	batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
1991 	ret = false;
1992 	goto out;
1993 
1994 handled:
1995 	kfree_skb(skb);
1996 	ret = true;
1997 
1998 out:
1999 	if (primary_if)
2000 		batadv_hardif_put(primary_if);
2001 	if (claim)
2002 		batadv_claim_put(claim);
2003 	return ret;
2004 }
2005 
2006 /**
2007  * batadv_bla_tx() - check packets going into the mesh
2008  * @bat_priv: the bat priv with all the soft interface information
2009  * @skb: the frame to be checked
2010  * @vid: the VLAN ID of the frame
2011  *
2012  * batadv_bla_tx checks if:
2013  *  * a claim was received which has to be processed
2014  *  * the frame is allowed on the mesh
2015  *
2016  * in these cases, the skb is further handled by this function.
2017  *
2018  * This call might reallocate skb data.
2019  *
2020  * Return: true if handled, otherwise it returns false and the caller shall
2021  * further process the skb.
2022  */
batadv_bla_tx(struct batadv_priv * bat_priv,struct sk_buff * skb,unsigned short vid)2023 bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
2024 		   unsigned short vid)
2025 {
2026 	struct ethhdr *ethhdr;
2027 	struct batadv_bla_claim search_claim, *claim = NULL;
2028 	struct batadv_bla_backbone_gw *backbone_gw;
2029 	struct batadv_hard_iface *primary_if;
2030 	bool client_roamed;
2031 	bool ret = false;
2032 
2033 	primary_if = batadv_primary_if_get_selected(bat_priv);
2034 	if (!primary_if)
2035 		goto out;
2036 
2037 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
2038 		goto allow;
2039 
2040 	if (batadv_bla_process_claim(bat_priv, primary_if, skb))
2041 		goto handled;
2042 
2043 	ethhdr = eth_hdr(skb);
2044 
2045 	if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
2046 		/* don't allow broadcasts while requests are in flight */
2047 		if (is_multicast_ether_addr(ethhdr->h_dest))
2048 			goto handled;
2049 
2050 	ether_addr_copy(search_claim.addr, ethhdr->h_source);
2051 	search_claim.vid = vid;
2052 
2053 	claim = batadv_claim_hash_find(bat_priv, &search_claim);
2054 
2055 	/* if no claim exists, allow it. */
2056 	if (!claim)
2057 		goto allow;
2058 
2059 	/* check if we are responsible. */
2060 	backbone_gw = batadv_bla_claim_get_backbone_gw(claim);
2061 	client_roamed = batadv_compare_eth(backbone_gw->orig,
2062 					   primary_if->net_dev->dev_addr);
2063 	batadv_backbone_gw_put(backbone_gw);
2064 
2065 	if (client_roamed) {
2066 		/* if yes, the client has roamed and we have
2067 		 * to unclaim it.
2068 		 */
2069 		if (batadv_has_timed_out(claim->lasttime, 100)) {
2070 			/* only unclaim if the last claim entry is
2071 			 * older than 100 ms to make sure we really
2072 			 * have a roaming client here.
2073 			 */
2074 			batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): Roaming client %pM detected. Unclaim it.\n",
2075 				   __func__, ethhdr->h_source);
2076 			batadv_handle_unclaim(bat_priv, primary_if,
2077 					      primary_if->net_dev->dev_addr,
2078 					      ethhdr->h_source, vid);
2079 			goto allow;
2080 		} else {
2081 			batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): Race for claim %pM detected. Drop packet.\n",
2082 				   __func__, ethhdr->h_source);
2083 			goto handled;
2084 		}
2085 	}
2086 
2087 	/* check if it is a multicast/broadcast frame */
2088 	if (is_multicast_ether_addr(ethhdr->h_dest)) {
2089 		/* drop it. the responsible gateway has forwarded it into
2090 		 * the backbone network.
2091 		 */
2092 		goto handled;
2093 	} else {
2094 		/* we must allow it. at least if we are
2095 		 * responsible for the DESTINATION.
2096 		 */
2097 		goto allow;
2098 	}
2099 allow:
2100 	batadv_bla_update_own_backbone_gw(bat_priv, primary_if, vid);
2101 	ret = false;
2102 	goto out;
2103 handled:
2104 	ret = true;
2105 out:
2106 	if (primary_if)
2107 		batadv_hardif_put(primary_if);
2108 	if (claim)
2109 		batadv_claim_put(claim);
2110 	return ret;
2111 }
2112 
2113 /**
2114  * batadv_bla_claim_dump_entry() - dump one entry of the claim table
2115  * to a netlink socket
2116  * @msg: buffer for the message
2117  * @portid: netlink port
2118  * @cb: Control block containing additional options
2119  * @primary_if: primary interface
2120  * @claim: entry to dump
2121  *
2122  * Return: 0 or error code.
2123  */
2124 static int
batadv_bla_claim_dump_entry(struct sk_buff * msg,u32 portid,struct netlink_callback * cb,struct batadv_hard_iface * primary_if,struct batadv_bla_claim * claim)2125 batadv_bla_claim_dump_entry(struct sk_buff *msg, u32 portid,
2126 			    struct netlink_callback *cb,
2127 			    struct batadv_hard_iface *primary_if,
2128 			    struct batadv_bla_claim *claim)
2129 {
2130 	u8 *primary_addr = primary_if->net_dev->dev_addr;
2131 	u16 backbone_crc;
2132 	bool is_own;
2133 	void *hdr;
2134 	int ret = -EINVAL;
2135 
2136 	hdr = genlmsg_put(msg, portid, cb->nlh->nlmsg_seq,
2137 			  &batadv_netlink_family, NLM_F_MULTI,
2138 			  BATADV_CMD_GET_BLA_CLAIM);
2139 	if (!hdr) {
2140 		ret = -ENOBUFS;
2141 		goto out;
2142 	}
2143 
2144 	genl_dump_check_consistent(cb, hdr);
2145 
2146 	is_own = batadv_compare_eth(claim->backbone_gw->orig,
2147 				    primary_addr);
2148 
2149 	spin_lock_bh(&claim->backbone_gw->crc_lock);
2150 	backbone_crc = claim->backbone_gw->crc;
2151 	spin_unlock_bh(&claim->backbone_gw->crc_lock);
2152 
2153 	if (is_own)
2154 		if (nla_put_flag(msg, BATADV_ATTR_BLA_OWN)) {
2155 			genlmsg_cancel(msg, hdr);
2156 			goto out;
2157 		}
2158 
2159 	if (nla_put(msg, BATADV_ATTR_BLA_ADDRESS, ETH_ALEN, claim->addr) ||
2160 	    nla_put_u16(msg, BATADV_ATTR_BLA_VID, claim->vid) ||
2161 	    nla_put(msg, BATADV_ATTR_BLA_BACKBONE, ETH_ALEN,
2162 		    claim->backbone_gw->orig) ||
2163 	    nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
2164 			backbone_crc)) {
2165 		genlmsg_cancel(msg, hdr);
2166 		goto out;
2167 	}
2168 
2169 	genlmsg_end(msg, hdr);
2170 	ret = 0;
2171 
2172 out:
2173 	return ret;
2174 }
2175 
2176 /**
2177  * batadv_bla_claim_dump_bucket() - dump one bucket of the claim table
2178  * to a netlink socket
2179  * @msg: buffer for the message
2180  * @portid: netlink port
2181  * @cb: Control block containing additional options
2182  * @primary_if: primary interface
2183  * @hash: hash to dump
2184  * @bucket: bucket index to dump
2185  * @idx_skip: How many entries to skip
2186  *
2187  * Return: always 0.
2188  */
2189 static int
batadv_bla_claim_dump_bucket(struct sk_buff * msg,u32 portid,struct netlink_callback * cb,struct batadv_hard_iface * primary_if,struct batadv_hashtable * hash,unsigned int bucket,int * idx_skip)2190 batadv_bla_claim_dump_bucket(struct sk_buff *msg, u32 portid,
2191 			     struct netlink_callback *cb,
2192 			     struct batadv_hard_iface *primary_if,
2193 			     struct batadv_hashtable *hash, unsigned int bucket,
2194 			     int *idx_skip)
2195 {
2196 	struct batadv_bla_claim *claim;
2197 	int idx = 0;
2198 	int ret = 0;
2199 
2200 	spin_lock_bh(&hash->list_locks[bucket]);
2201 	cb->seq = atomic_read(&hash->generation) << 1 | 1;
2202 
2203 	hlist_for_each_entry(claim, &hash->table[bucket], hash_entry) {
2204 		if (idx++ < *idx_skip)
2205 			continue;
2206 
2207 		ret = batadv_bla_claim_dump_entry(msg, portid, cb,
2208 						  primary_if, claim);
2209 		if (ret) {
2210 			*idx_skip = idx - 1;
2211 			goto unlock;
2212 		}
2213 	}
2214 
2215 	*idx_skip = 0;
2216 unlock:
2217 	spin_unlock_bh(&hash->list_locks[bucket]);
2218 	return ret;
2219 }
2220 
2221 /**
2222  * batadv_bla_claim_dump() - dump claim table to a netlink socket
2223  * @msg: buffer for the message
2224  * @cb: callback structure containing arguments
2225  *
2226  * Return: message length.
2227  */
batadv_bla_claim_dump(struct sk_buff * msg,struct netlink_callback * cb)2228 int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb)
2229 {
2230 	struct batadv_hard_iface *primary_if = NULL;
2231 	int portid = NETLINK_CB(cb->skb).portid;
2232 	struct net *net = sock_net(cb->skb->sk);
2233 	struct net_device *soft_iface;
2234 	struct batadv_hashtable *hash;
2235 	struct batadv_priv *bat_priv;
2236 	int bucket = cb->args[0];
2237 	int idx = cb->args[1];
2238 	int ifindex;
2239 	int ret = 0;
2240 
2241 	ifindex = batadv_netlink_get_ifindex(cb->nlh,
2242 					     BATADV_ATTR_MESH_IFINDEX);
2243 	if (!ifindex)
2244 		return -EINVAL;
2245 
2246 	soft_iface = dev_get_by_index(net, ifindex);
2247 	if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
2248 		ret = -ENODEV;
2249 		goto out;
2250 	}
2251 
2252 	bat_priv = netdev_priv(soft_iface);
2253 	hash = bat_priv->bla.claim_hash;
2254 
2255 	primary_if = batadv_primary_if_get_selected(bat_priv);
2256 	if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
2257 		ret = -ENOENT;
2258 		goto out;
2259 	}
2260 
2261 	while (bucket < hash->size) {
2262 		if (batadv_bla_claim_dump_bucket(msg, portid, cb, primary_if,
2263 						 hash, bucket, &idx))
2264 			break;
2265 		bucket++;
2266 	}
2267 
2268 	cb->args[0] = bucket;
2269 	cb->args[1] = idx;
2270 
2271 	ret = msg->len;
2272 
2273 out:
2274 	if (primary_if)
2275 		batadv_hardif_put(primary_if);
2276 
2277 	if (soft_iface)
2278 		dev_put(soft_iface);
2279 
2280 	return ret;
2281 }
2282 
2283 /**
2284  * batadv_bla_backbone_dump_entry() - dump one entry of the backbone table to a
2285  *  netlink socket
2286  * @msg: buffer for the message
2287  * @portid: netlink port
2288  * @cb: Control block containing additional options
2289  * @primary_if: primary interface
2290  * @backbone_gw: entry to dump
2291  *
2292  * Return: 0 or error code.
2293  */
2294 static int
batadv_bla_backbone_dump_entry(struct sk_buff * msg,u32 portid,struct netlink_callback * cb,struct batadv_hard_iface * primary_if,struct batadv_bla_backbone_gw * backbone_gw)2295 batadv_bla_backbone_dump_entry(struct sk_buff *msg, u32 portid,
2296 			       struct netlink_callback *cb,
2297 			       struct batadv_hard_iface *primary_if,
2298 			       struct batadv_bla_backbone_gw *backbone_gw)
2299 {
2300 	u8 *primary_addr = primary_if->net_dev->dev_addr;
2301 	u16 backbone_crc;
2302 	bool is_own;
2303 	int msecs;
2304 	void *hdr;
2305 	int ret = -EINVAL;
2306 
2307 	hdr = genlmsg_put(msg, portid, cb->nlh->nlmsg_seq,
2308 			  &batadv_netlink_family, NLM_F_MULTI,
2309 			  BATADV_CMD_GET_BLA_BACKBONE);
2310 	if (!hdr) {
2311 		ret = -ENOBUFS;
2312 		goto out;
2313 	}
2314 
2315 	genl_dump_check_consistent(cb, hdr);
2316 
2317 	is_own = batadv_compare_eth(backbone_gw->orig, primary_addr);
2318 
2319 	spin_lock_bh(&backbone_gw->crc_lock);
2320 	backbone_crc = backbone_gw->crc;
2321 	spin_unlock_bh(&backbone_gw->crc_lock);
2322 
2323 	msecs = jiffies_to_msecs(jiffies - backbone_gw->lasttime);
2324 
2325 	if (is_own)
2326 		if (nla_put_flag(msg, BATADV_ATTR_BLA_OWN)) {
2327 			genlmsg_cancel(msg, hdr);
2328 			goto out;
2329 		}
2330 
2331 	if (nla_put(msg, BATADV_ATTR_BLA_BACKBONE, ETH_ALEN,
2332 		    backbone_gw->orig) ||
2333 	    nla_put_u16(msg, BATADV_ATTR_BLA_VID, backbone_gw->vid) ||
2334 	    nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
2335 			backbone_crc) ||
2336 	    nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS, msecs)) {
2337 		genlmsg_cancel(msg, hdr);
2338 		goto out;
2339 	}
2340 
2341 	genlmsg_end(msg, hdr);
2342 	ret = 0;
2343 
2344 out:
2345 	return ret;
2346 }
2347 
2348 /**
2349  * batadv_bla_backbone_dump_bucket() - dump one bucket of the backbone table to
2350  *  a netlink socket
2351  * @msg: buffer for the message
2352  * @portid: netlink port
2353  * @cb: Control block containing additional options
2354  * @primary_if: primary interface
2355  * @hash: hash to dump
2356  * @bucket: bucket index to dump
2357  * @idx_skip: How many entries to skip
2358  *
2359  * Return: always 0.
2360  */
2361 static int
batadv_bla_backbone_dump_bucket(struct sk_buff * msg,u32 portid,struct netlink_callback * cb,struct batadv_hard_iface * primary_if,struct batadv_hashtable * hash,unsigned int bucket,int * idx_skip)2362 batadv_bla_backbone_dump_bucket(struct sk_buff *msg, u32 portid,
2363 				struct netlink_callback *cb,
2364 				struct batadv_hard_iface *primary_if,
2365 				struct batadv_hashtable *hash,
2366 				unsigned int bucket, int *idx_skip)
2367 {
2368 	struct batadv_bla_backbone_gw *backbone_gw;
2369 	int idx = 0;
2370 	int ret = 0;
2371 
2372 	spin_lock_bh(&hash->list_locks[bucket]);
2373 	cb->seq = atomic_read(&hash->generation) << 1 | 1;
2374 
2375 	hlist_for_each_entry(backbone_gw, &hash->table[bucket], hash_entry) {
2376 		if (idx++ < *idx_skip)
2377 			continue;
2378 
2379 		ret = batadv_bla_backbone_dump_entry(msg, portid, cb,
2380 						     primary_if, backbone_gw);
2381 		if (ret) {
2382 			*idx_skip = idx - 1;
2383 			goto unlock;
2384 		}
2385 	}
2386 
2387 	*idx_skip = 0;
2388 unlock:
2389 	spin_unlock_bh(&hash->list_locks[bucket]);
2390 	return ret;
2391 }
2392 
2393 /**
2394  * batadv_bla_backbone_dump() - dump backbone table to a netlink socket
2395  * @msg: buffer for the message
2396  * @cb: callback structure containing arguments
2397  *
2398  * Return: message length.
2399  */
batadv_bla_backbone_dump(struct sk_buff * msg,struct netlink_callback * cb)2400 int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb)
2401 {
2402 	struct batadv_hard_iface *primary_if = NULL;
2403 	int portid = NETLINK_CB(cb->skb).portid;
2404 	struct net *net = sock_net(cb->skb->sk);
2405 	struct net_device *soft_iface;
2406 	struct batadv_hashtable *hash;
2407 	struct batadv_priv *bat_priv;
2408 	int bucket = cb->args[0];
2409 	int idx = cb->args[1];
2410 	int ifindex;
2411 	int ret = 0;
2412 
2413 	ifindex = batadv_netlink_get_ifindex(cb->nlh,
2414 					     BATADV_ATTR_MESH_IFINDEX);
2415 	if (!ifindex)
2416 		return -EINVAL;
2417 
2418 	soft_iface = dev_get_by_index(net, ifindex);
2419 	if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
2420 		ret = -ENODEV;
2421 		goto out;
2422 	}
2423 
2424 	bat_priv = netdev_priv(soft_iface);
2425 	hash = bat_priv->bla.backbone_hash;
2426 
2427 	primary_if = batadv_primary_if_get_selected(bat_priv);
2428 	if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
2429 		ret = -ENOENT;
2430 		goto out;
2431 	}
2432 
2433 	while (bucket < hash->size) {
2434 		if (batadv_bla_backbone_dump_bucket(msg, portid, cb, primary_if,
2435 						    hash, bucket, &idx))
2436 			break;
2437 		bucket++;
2438 	}
2439 
2440 	cb->args[0] = bucket;
2441 	cb->args[1] = idx;
2442 
2443 	ret = msg->len;
2444 
2445 out:
2446 	if (primary_if)
2447 		batadv_hardif_put(primary_if);
2448 
2449 	if (soft_iface)
2450 		dev_put(soft_iface);
2451 
2452 	return ret;
2453 }
2454 
2455 #ifdef CONFIG_BATMAN_ADV_DAT
2456 /**
2457  * batadv_bla_check_claim() - check if address is claimed
2458  *
2459  * @bat_priv: the bat priv with all the soft interface information
2460  * @addr: mac address of which the claim status is checked
2461  * @vid: the VLAN ID
2462  *
2463  * addr is checked if this address is claimed by the local device itself.
2464  *
2465  * Return: true if bla is disabled or the mac is claimed by the device,
2466  * false if the device addr is already claimed by another gateway
2467  */
batadv_bla_check_claim(struct batadv_priv * bat_priv,u8 * addr,unsigned short vid)2468 bool batadv_bla_check_claim(struct batadv_priv *bat_priv,
2469 			    u8 *addr, unsigned short vid)
2470 {
2471 	struct batadv_bla_claim search_claim;
2472 	struct batadv_bla_claim *claim = NULL;
2473 	struct batadv_hard_iface *primary_if = NULL;
2474 	bool ret = true;
2475 
2476 	if (!atomic_read(&bat_priv->bridge_loop_avoidance))
2477 		return ret;
2478 
2479 	primary_if = batadv_primary_if_get_selected(bat_priv);
2480 	if (!primary_if)
2481 		return ret;
2482 
2483 	/* First look if the mac address is claimed */
2484 	ether_addr_copy(search_claim.addr, addr);
2485 	search_claim.vid = vid;
2486 
2487 	claim = batadv_claim_hash_find(bat_priv, &search_claim);
2488 
2489 	/* If there is a claim and we are not owner of the claim,
2490 	 * return false.
2491 	 */
2492 	if (claim) {
2493 		if (!batadv_compare_eth(claim->backbone_gw->orig,
2494 					primary_if->net_dev->dev_addr))
2495 			ret = false;
2496 		batadv_claim_put(claim);
2497 	}
2498 
2499 	batadv_hardif_put(primary_if);
2500 	return ret;
2501 }
2502 #endif
2503