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