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