1 /* Copyright (C) 2009-2016 B.A.T.M.A.N. contributors: 2 * 3 * Marek Lindner, Simon Wunderlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of version 2 of the GNU General Public 7 * License as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #include "originator.h" 19 #include "main.h" 20 21 #include <linux/atomic.h> 22 #include <linux/errno.h> 23 #include <linux/etherdevice.h> 24 #include <linux/fs.h> 25 #include <linux/jiffies.h> 26 #include <linux/kernel.h> 27 #include <linux/kref.h> 28 #include <linux/list.h> 29 #include <linux/lockdep.h> 30 #include <linux/netdevice.h> 31 #include <linux/rculist.h> 32 #include <linux/seq_file.h> 33 #include <linux/slab.h> 34 #include <linux/spinlock.h> 35 #include <linux/workqueue.h> 36 37 #include "distributed-arp-table.h" 38 #include "fragmentation.h" 39 #include "gateway_client.h" 40 #include "hard-interface.h" 41 #include "hash.h" 42 #include "multicast.h" 43 #include "network-coding.h" 44 #include "routing.h" 45 #include "translation-table.h" 46 47 /* hash class keys */ 48 static struct lock_class_key batadv_orig_hash_lock_class_key; 49 50 static void batadv_purge_orig(struct work_struct *work); 51 52 /** 53 * batadv_compare_orig - comparing function used in the originator hash table 54 * @node: node in the local table 55 * @data2: second object to compare the node to 56 * 57 * Return: true if they are the same originator 58 */ 59 bool batadv_compare_orig(const struct hlist_node *node, const void *data2) 60 { 61 const void *data1 = container_of(node, struct batadv_orig_node, 62 hash_entry); 63 64 return batadv_compare_eth(data1, data2); 65 } 66 67 /** 68 * batadv_orig_node_vlan_get - get an orig_node_vlan object 69 * @orig_node: the originator serving the VLAN 70 * @vid: the VLAN identifier 71 * 72 * Return: the vlan object identified by vid and belonging to orig_node or NULL 73 * if it does not exist. 74 */ 75 struct batadv_orig_node_vlan * 76 batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node, 77 unsigned short vid) 78 { 79 struct batadv_orig_node_vlan *vlan = NULL, *tmp; 80 81 rcu_read_lock(); 82 hlist_for_each_entry_rcu(tmp, &orig_node->vlan_list, list) { 83 if (tmp->vid != vid) 84 continue; 85 86 if (!kref_get_unless_zero(&tmp->refcount)) 87 continue; 88 89 vlan = tmp; 90 91 break; 92 } 93 rcu_read_unlock(); 94 95 return vlan; 96 } 97 98 /** 99 * batadv_orig_node_vlan_new - search and possibly create an orig_node_vlan 100 * object 101 * @orig_node: the originator serving the VLAN 102 * @vid: the VLAN identifier 103 * 104 * Return: NULL in case of failure or the vlan object identified by vid and 105 * belonging to orig_node otherwise. The object is created and added to the list 106 * if it does not exist. 107 * 108 * The object is returned with refcounter increased by 1. 109 */ 110 struct batadv_orig_node_vlan * 111 batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node, 112 unsigned short vid) 113 { 114 struct batadv_orig_node_vlan *vlan; 115 116 spin_lock_bh(&orig_node->vlan_list_lock); 117 118 /* first look if an object for this vid already exists */ 119 vlan = batadv_orig_node_vlan_get(orig_node, vid); 120 if (vlan) 121 goto out; 122 123 vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC); 124 if (!vlan) 125 goto out; 126 127 kref_init(&vlan->refcount); 128 kref_get(&vlan->refcount); 129 vlan->vid = vid; 130 131 hlist_add_head_rcu(&vlan->list, &orig_node->vlan_list); 132 133 out: 134 spin_unlock_bh(&orig_node->vlan_list_lock); 135 136 return vlan; 137 } 138 139 /** 140 * batadv_orig_node_vlan_release - release originator-vlan object from lists 141 * and queue for free after rcu grace period 142 * @ref: kref pointer of the originator-vlan object 143 */ 144 static void batadv_orig_node_vlan_release(struct kref *ref) 145 { 146 struct batadv_orig_node_vlan *orig_vlan; 147 148 orig_vlan = container_of(ref, struct batadv_orig_node_vlan, refcount); 149 150 kfree_rcu(orig_vlan, rcu); 151 } 152 153 /** 154 * batadv_orig_node_vlan_put - decrement the refcounter and possibly release 155 * the originator-vlan object 156 * @orig_vlan: the originator-vlan object to release 157 */ 158 void batadv_orig_node_vlan_put(struct batadv_orig_node_vlan *orig_vlan) 159 { 160 kref_put(&orig_vlan->refcount, batadv_orig_node_vlan_release); 161 } 162 163 int batadv_originator_init(struct batadv_priv *bat_priv) 164 { 165 if (bat_priv->orig_hash) 166 return 0; 167 168 bat_priv->orig_hash = batadv_hash_new(1024); 169 170 if (!bat_priv->orig_hash) 171 goto err; 172 173 batadv_hash_set_lock_class(bat_priv->orig_hash, 174 &batadv_orig_hash_lock_class_key); 175 176 INIT_DELAYED_WORK(&bat_priv->orig_work, batadv_purge_orig); 177 queue_delayed_work(batadv_event_workqueue, 178 &bat_priv->orig_work, 179 msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD)); 180 181 return 0; 182 183 err: 184 return -ENOMEM; 185 } 186 187 /** 188 * batadv_neigh_ifinfo_release - release neigh_ifinfo from lists and queue for 189 * free after rcu grace period 190 * @ref: kref pointer of the neigh_ifinfo 191 */ 192 static void batadv_neigh_ifinfo_release(struct kref *ref) 193 { 194 struct batadv_neigh_ifinfo *neigh_ifinfo; 195 196 neigh_ifinfo = container_of(ref, struct batadv_neigh_ifinfo, refcount); 197 198 if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT) 199 batadv_hardif_put(neigh_ifinfo->if_outgoing); 200 201 kfree_rcu(neigh_ifinfo, rcu); 202 } 203 204 /** 205 * batadv_neigh_ifinfo_put - decrement the refcounter and possibly release 206 * the neigh_ifinfo 207 * @neigh_ifinfo: the neigh_ifinfo object to release 208 */ 209 void batadv_neigh_ifinfo_put(struct batadv_neigh_ifinfo *neigh_ifinfo) 210 { 211 kref_put(&neigh_ifinfo->refcount, batadv_neigh_ifinfo_release); 212 } 213 214 /** 215 * batadv_hardif_neigh_release - release hardif neigh node from lists and 216 * queue for free after rcu grace period 217 * @ref: kref pointer of the neigh_node 218 */ 219 static void batadv_hardif_neigh_release(struct kref *ref) 220 { 221 struct batadv_hardif_neigh_node *hardif_neigh; 222 223 hardif_neigh = container_of(ref, struct batadv_hardif_neigh_node, 224 refcount); 225 226 spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock); 227 hlist_del_init_rcu(&hardif_neigh->list); 228 spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock); 229 230 batadv_hardif_put(hardif_neigh->if_incoming); 231 kfree_rcu(hardif_neigh, rcu); 232 } 233 234 /** 235 * batadv_hardif_neigh_put - decrement the hardif neighbors refcounter 236 * and possibly release it 237 * @hardif_neigh: hardif neigh neighbor to free 238 */ 239 void batadv_hardif_neigh_put(struct batadv_hardif_neigh_node *hardif_neigh) 240 { 241 kref_put(&hardif_neigh->refcount, batadv_hardif_neigh_release); 242 } 243 244 /** 245 * batadv_neigh_node_release - release neigh_node from lists and queue for 246 * free after rcu grace period 247 * @ref: kref pointer of the neigh_node 248 */ 249 static void batadv_neigh_node_release(struct kref *ref) 250 { 251 struct hlist_node *node_tmp; 252 struct batadv_neigh_node *neigh_node; 253 struct batadv_neigh_ifinfo *neigh_ifinfo; 254 struct batadv_algo_ops *bao; 255 256 neigh_node = container_of(ref, struct batadv_neigh_node, refcount); 257 bao = neigh_node->orig_node->bat_priv->bat_algo_ops; 258 259 hlist_for_each_entry_safe(neigh_ifinfo, node_tmp, 260 &neigh_node->ifinfo_list, list) { 261 batadv_neigh_ifinfo_put(neigh_ifinfo); 262 } 263 264 batadv_hardif_neigh_put(neigh_node->hardif_neigh); 265 266 if (bao->bat_neigh_free) 267 bao->bat_neigh_free(neigh_node); 268 269 batadv_hardif_put(neigh_node->if_incoming); 270 271 kfree_rcu(neigh_node, rcu); 272 } 273 274 /** 275 * batadv_neigh_node_put - decrement the neighbors refcounter and possibly 276 * release it 277 * @neigh_node: neigh neighbor to free 278 */ 279 void batadv_neigh_node_put(struct batadv_neigh_node *neigh_node) 280 { 281 kref_put(&neigh_node->refcount, batadv_neigh_node_release); 282 } 283 284 /** 285 * batadv_orig_router_get - router to the originator depending on iface 286 * @orig_node: the orig node for the router 287 * @if_outgoing: the interface where the payload packet has been received or 288 * the OGM should be sent to 289 * 290 * Return: the neighbor which should be router for this orig_node/iface. 291 * 292 * The object is returned with refcounter increased by 1. 293 */ 294 struct batadv_neigh_node * 295 batadv_orig_router_get(struct batadv_orig_node *orig_node, 296 const struct batadv_hard_iface *if_outgoing) 297 { 298 struct batadv_orig_ifinfo *orig_ifinfo; 299 struct batadv_neigh_node *router = NULL; 300 301 rcu_read_lock(); 302 hlist_for_each_entry_rcu(orig_ifinfo, &orig_node->ifinfo_list, list) { 303 if (orig_ifinfo->if_outgoing != if_outgoing) 304 continue; 305 306 router = rcu_dereference(orig_ifinfo->router); 307 break; 308 } 309 310 if (router && !kref_get_unless_zero(&router->refcount)) 311 router = NULL; 312 313 rcu_read_unlock(); 314 return router; 315 } 316 317 /** 318 * batadv_orig_ifinfo_get - find the ifinfo from an orig_node 319 * @orig_node: the orig node to be queried 320 * @if_outgoing: the interface for which the ifinfo should be acquired 321 * 322 * Return: the requested orig_ifinfo or NULL if not found. 323 * 324 * The object is returned with refcounter increased by 1. 325 */ 326 struct batadv_orig_ifinfo * 327 batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node, 328 struct batadv_hard_iface *if_outgoing) 329 { 330 struct batadv_orig_ifinfo *tmp, *orig_ifinfo = NULL; 331 332 rcu_read_lock(); 333 hlist_for_each_entry_rcu(tmp, &orig_node->ifinfo_list, 334 list) { 335 if (tmp->if_outgoing != if_outgoing) 336 continue; 337 338 if (!kref_get_unless_zero(&tmp->refcount)) 339 continue; 340 341 orig_ifinfo = tmp; 342 break; 343 } 344 rcu_read_unlock(); 345 346 return orig_ifinfo; 347 } 348 349 /** 350 * batadv_orig_ifinfo_new - search and possibly create an orig_ifinfo object 351 * @orig_node: the orig node to be queried 352 * @if_outgoing: the interface for which the ifinfo should be acquired 353 * 354 * Return: NULL in case of failure or the orig_ifinfo object for the if_outgoing 355 * interface otherwise. The object is created and added to the list 356 * if it does not exist. 357 * 358 * The object is returned with refcounter increased by 1. 359 */ 360 struct batadv_orig_ifinfo * 361 batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node, 362 struct batadv_hard_iface *if_outgoing) 363 { 364 struct batadv_orig_ifinfo *orig_ifinfo = NULL; 365 unsigned long reset_time; 366 367 spin_lock_bh(&orig_node->neigh_list_lock); 368 369 orig_ifinfo = batadv_orig_ifinfo_get(orig_node, if_outgoing); 370 if (orig_ifinfo) 371 goto out; 372 373 orig_ifinfo = kzalloc(sizeof(*orig_ifinfo), GFP_ATOMIC); 374 if (!orig_ifinfo) 375 goto out; 376 377 if (if_outgoing != BATADV_IF_DEFAULT) 378 kref_get(&if_outgoing->refcount); 379 380 reset_time = jiffies - 1; 381 reset_time -= msecs_to_jiffies(BATADV_RESET_PROTECTION_MS); 382 orig_ifinfo->batman_seqno_reset = reset_time; 383 orig_ifinfo->if_outgoing = if_outgoing; 384 INIT_HLIST_NODE(&orig_ifinfo->list); 385 kref_init(&orig_ifinfo->refcount); 386 kref_get(&orig_ifinfo->refcount); 387 hlist_add_head_rcu(&orig_ifinfo->list, 388 &orig_node->ifinfo_list); 389 out: 390 spin_unlock_bh(&orig_node->neigh_list_lock); 391 return orig_ifinfo; 392 } 393 394 /** 395 * batadv_neigh_ifinfo_get - find the ifinfo from an neigh_node 396 * @neigh: the neigh node to be queried 397 * @if_outgoing: the interface for which the ifinfo should be acquired 398 * 399 * The object is returned with refcounter increased by 1. 400 * 401 * Return: the requested neigh_ifinfo or NULL if not found 402 */ 403 struct batadv_neigh_ifinfo * 404 batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh, 405 struct batadv_hard_iface *if_outgoing) 406 { 407 struct batadv_neigh_ifinfo *neigh_ifinfo = NULL, 408 *tmp_neigh_ifinfo; 409 410 rcu_read_lock(); 411 hlist_for_each_entry_rcu(tmp_neigh_ifinfo, &neigh->ifinfo_list, 412 list) { 413 if (tmp_neigh_ifinfo->if_outgoing != if_outgoing) 414 continue; 415 416 if (!kref_get_unless_zero(&tmp_neigh_ifinfo->refcount)) 417 continue; 418 419 neigh_ifinfo = tmp_neigh_ifinfo; 420 break; 421 } 422 rcu_read_unlock(); 423 424 return neigh_ifinfo; 425 } 426 427 /** 428 * batadv_neigh_ifinfo_new - search and possibly create an neigh_ifinfo object 429 * @neigh: the neigh node to be queried 430 * @if_outgoing: the interface for which the ifinfo should be acquired 431 * 432 * Return: NULL in case of failure or the neigh_ifinfo object for the 433 * if_outgoing interface otherwise. The object is created and added to the list 434 * if it does not exist. 435 * 436 * The object is returned with refcounter increased by 1. 437 */ 438 struct batadv_neigh_ifinfo * 439 batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh, 440 struct batadv_hard_iface *if_outgoing) 441 { 442 struct batadv_neigh_ifinfo *neigh_ifinfo; 443 444 spin_lock_bh(&neigh->ifinfo_lock); 445 446 neigh_ifinfo = batadv_neigh_ifinfo_get(neigh, if_outgoing); 447 if (neigh_ifinfo) 448 goto out; 449 450 neigh_ifinfo = kzalloc(sizeof(*neigh_ifinfo), GFP_ATOMIC); 451 if (!neigh_ifinfo) 452 goto out; 453 454 if (if_outgoing) 455 kref_get(&if_outgoing->refcount); 456 457 INIT_HLIST_NODE(&neigh_ifinfo->list); 458 kref_init(&neigh_ifinfo->refcount); 459 kref_get(&neigh_ifinfo->refcount); 460 neigh_ifinfo->if_outgoing = if_outgoing; 461 462 hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list); 463 464 out: 465 spin_unlock_bh(&neigh->ifinfo_lock); 466 467 return neigh_ifinfo; 468 } 469 470 /** 471 * batadv_neigh_node_get - retrieve a neighbour from the list 472 * @orig_node: originator which the neighbour belongs to 473 * @hard_iface: the interface where this neighbour is connected to 474 * @addr: the address of the neighbour 475 * 476 * Looks for and possibly returns a neighbour belonging to this originator list 477 * which is connected through the provided hard interface. 478 * 479 * Return: neighbor when found. Othwerwise NULL 480 */ 481 static struct batadv_neigh_node * 482 batadv_neigh_node_get(const struct batadv_orig_node *orig_node, 483 const struct batadv_hard_iface *hard_iface, 484 const u8 *addr) 485 { 486 struct batadv_neigh_node *tmp_neigh_node, *res = NULL; 487 488 rcu_read_lock(); 489 hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) { 490 if (!batadv_compare_eth(tmp_neigh_node->addr, addr)) 491 continue; 492 493 if (tmp_neigh_node->if_incoming != hard_iface) 494 continue; 495 496 if (!kref_get_unless_zero(&tmp_neigh_node->refcount)) 497 continue; 498 499 res = tmp_neigh_node; 500 break; 501 } 502 rcu_read_unlock(); 503 504 return res; 505 } 506 507 /** 508 * batadv_hardif_neigh_create - create a hardif neighbour node 509 * @hard_iface: the interface this neighbour is connected to 510 * @neigh_addr: the interface address of the neighbour to retrieve 511 * 512 * Return: the hardif neighbour node if found or created or NULL otherwise. 513 */ 514 static struct batadv_hardif_neigh_node * 515 batadv_hardif_neigh_create(struct batadv_hard_iface *hard_iface, 516 const u8 *neigh_addr) 517 { 518 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 519 struct batadv_hardif_neigh_node *hardif_neigh = NULL; 520 521 spin_lock_bh(&hard_iface->neigh_list_lock); 522 523 /* check if neighbor hasn't been added in the meantime */ 524 hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr); 525 if (hardif_neigh) 526 goto out; 527 528 hardif_neigh = kzalloc(sizeof(*hardif_neigh), GFP_ATOMIC); 529 if (!hardif_neigh) 530 goto out; 531 532 kref_get(&hard_iface->refcount); 533 INIT_HLIST_NODE(&hardif_neigh->list); 534 ether_addr_copy(hardif_neigh->addr, neigh_addr); 535 hardif_neigh->if_incoming = hard_iface; 536 hardif_neigh->last_seen = jiffies; 537 538 kref_init(&hardif_neigh->refcount); 539 540 if (bat_priv->bat_algo_ops->bat_hardif_neigh_init) 541 bat_priv->bat_algo_ops->bat_hardif_neigh_init(hardif_neigh); 542 543 hlist_add_head(&hardif_neigh->list, &hard_iface->neigh_list); 544 545 out: 546 spin_unlock_bh(&hard_iface->neigh_list_lock); 547 return hardif_neigh; 548 } 549 550 /** 551 * batadv_hardif_neigh_get_or_create - retrieve or create a hardif neighbour 552 * node 553 * @hard_iface: the interface this neighbour is connected to 554 * @neigh_addr: the interface address of the neighbour to retrieve 555 * 556 * Return: the hardif neighbour node if found or created or NULL otherwise. 557 */ 558 static struct batadv_hardif_neigh_node * 559 batadv_hardif_neigh_get_or_create(struct batadv_hard_iface *hard_iface, 560 const u8 *neigh_addr) 561 { 562 struct batadv_hardif_neigh_node *hardif_neigh = NULL; 563 564 /* first check without locking to avoid the overhead */ 565 hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr); 566 if (hardif_neigh) 567 return hardif_neigh; 568 569 return batadv_hardif_neigh_create(hard_iface, neigh_addr); 570 } 571 572 /** 573 * batadv_hardif_neigh_get - retrieve a hardif neighbour from the list 574 * @hard_iface: the interface where this neighbour is connected to 575 * @neigh_addr: the address of the neighbour 576 * 577 * Looks for and possibly returns a neighbour belonging to this hard interface. 578 * 579 * Return: neighbor when found. Othwerwise NULL 580 */ 581 struct batadv_hardif_neigh_node * 582 batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface, 583 const u8 *neigh_addr) 584 { 585 struct batadv_hardif_neigh_node *tmp_hardif_neigh, *hardif_neigh = NULL; 586 587 rcu_read_lock(); 588 hlist_for_each_entry_rcu(tmp_hardif_neigh, 589 &hard_iface->neigh_list, list) { 590 if (!batadv_compare_eth(tmp_hardif_neigh->addr, neigh_addr)) 591 continue; 592 593 if (!kref_get_unless_zero(&tmp_hardif_neigh->refcount)) 594 continue; 595 596 hardif_neigh = tmp_hardif_neigh; 597 break; 598 } 599 rcu_read_unlock(); 600 601 return hardif_neigh; 602 } 603 604 /** 605 * batadv_neigh_node_new - create and init a new neigh_node object 606 * @orig_node: originator object representing the neighbour 607 * @hard_iface: the interface where the neighbour is connected to 608 * @neigh_addr: the mac address of the neighbour interface 609 * 610 * Allocates a new neigh_node object and initialises all the generic fields. 611 * 612 * Return: neighbor when found. Othwerwise NULL 613 */ 614 struct batadv_neigh_node * 615 batadv_neigh_node_new(struct batadv_orig_node *orig_node, 616 struct batadv_hard_iface *hard_iface, 617 const u8 *neigh_addr) 618 { 619 struct batadv_neigh_node *neigh_node; 620 struct batadv_hardif_neigh_node *hardif_neigh = NULL; 621 622 spin_lock_bh(&orig_node->neigh_list_lock); 623 624 neigh_node = batadv_neigh_node_get(orig_node, hard_iface, neigh_addr); 625 if (neigh_node) 626 goto out; 627 628 hardif_neigh = batadv_hardif_neigh_get_or_create(hard_iface, 629 neigh_addr); 630 if (!hardif_neigh) 631 goto out; 632 633 neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC); 634 if (!neigh_node) 635 goto out; 636 637 INIT_HLIST_NODE(&neigh_node->list); 638 INIT_HLIST_HEAD(&neigh_node->ifinfo_list); 639 spin_lock_init(&neigh_node->ifinfo_lock); 640 641 kref_get(&hard_iface->refcount); 642 ether_addr_copy(neigh_node->addr, neigh_addr); 643 neigh_node->if_incoming = hard_iface; 644 neigh_node->orig_node = orig_node; 645 neigh_node->last_seen = jiffies; 646 647 /* increment unique neighbor refcount */ 648 kref_get(&hardif_neigh->refcount); 649 neigh_node->hardif_neigh = hardif_neigh; 650 651 /* extra reference for return */ 652 kref_init(&neigh_node->refcount); 653 kref_get(&neigh_node->refcount); 654 655 hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list); 656 657 batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv, 658 "Creating new neighbor %pM for orig_node %pM on interface %s\n", 659 neigh_addr, orig_node->orig, hard_iface->net_dev->name); 660 661 out: 662 spin_unlock_bh(&orig_node->neigh_list_lock); 663 664 if (hardif_neigh) 665 batadv_hardif_neigh_put(hardif_neigh); 666 return neigh_node; 667 } 668 669 /** 670 * batadv_hardif_neigh_seq_print_text - print the single hop neighbour list 671 * @seq: neighbour table seq_file struct 672 * @offset: not used 673 * 674 * Return: always 0 675 */ 676 int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset) 677 { 678 struct net_device *net_dev = (struct net_device *)seq->private; 679 struct batadv_priv *bat_priv = netdev_priv(net_dev); 680 struct batadv_hard_iface *primary_if; 681 682 primary_if = batadv_seq_print_text_primary_if_get(seq); 683 if (!primary_if) 684 return 0; 685 686 seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n", 687 BATADV_SOURCE_VERSION, primary_if->net_dev->name, 688 primary_if->net_dev->dev_addr, net_dev->name, 689 bat_priv->bat_algo_ops->name); 690 691 batadv_hardif_put(primary_if); 692 693 if (!bat_priv->bat_algo_ops->bat_neigh_print) { 694 seq_puts(seq, 695 "No printing function for this routing protocol\n"); 696 return 0; 697 } 698 699 bat_priv->bat_algo_ops->bat_neigh_print(bat_priv, seq); 700 return 0; 701 } 702 703 /** 704 * batadv_orig_ifinfo_release - release orig_ifinfo from lists and queue for 705 * free after rcu grace period 706 * @ref: kref pointer of the orig_ifinfo 707 */ 708 static void batadv_orig_ifinfo_release(struct kref *ref) 709 { 710 struct batadv_orig_ifinfo *orig_ifinfo; 711 struct batadv_neigh_node *router; 712 713 orig_ifinfo = container_of(ref, struct batadv_orig_ifinfo, refcount); 714 715 if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT) 716 batadv_hardif_put(orig_ifinfo->if_outgoing); 717 718 /* this is the last reference to this object */ 719 router = rcu_dereference_protected(orig_ifinfo->router, true); 720 if (router) 721 batadv_neigh_node_put(router); 722 723 kfree_rcu(orig_ifinfo, rcu); 724 } 725 726 /** 727 * batadv_orig_ifinfo_put - decrement the refcounter and possibly release 728 * the orig_ifinfo 729 * @orig_ifinfo: the orig_ifinfo object to release 730 */ 731 void batadv_orig_ifinfo_put(struct batadv_orig_ifinfo *orig_ifinfo) 732 { 733 kref_put(&orig_ifinfo->refcount, batadv_orig_ifinfo_release); 734 } 735 736 /** 737 * batadv_orig_node_free_rcu - free the orig_node 738 * @rcu: rcu pointer of the orig_node 739 */ 740 static void batadv_orig_node_free_rcu(struct rcu_head *rcu) 741 { 742 struct batadv_orig_node *orig_node; 743 744 orig_node = container_of(rcu, struct batadv_orig_node, rcu); 745 746 batadv_mcast_purge_orig(orig_node); 747 748 batadv_frag_purge_orig(orig_node, NULL); 749 750 if (orig_node->bat_priv->bat_algo_ops->bat_orig_free) 751 orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node); 752 753 kfree(orig_node->tt_buff); 754 kfree(orig_node); 755 } 756 757 /** 758 * batadv_orig_node_release - release orig_node from lists and queue for 759 * free after rcu grace period 760 * @ref: kref pointer of the orig_node 761 */ 762 static void batadv_orig_node_release(struct kref *ref) 763 { 764 struct hlist_node *node_tmp; 765 struct batadv_neigh_node *neigh_node; 766 struct batadv_orig_node *orig_node; 767 struct batadv_orig_ifinfo *orig_ifinfo; 768 769 orig_node = container_of(ref, struct batadv_orig_node, refcount); 770 771 spin_lock_bh(&orig_node->neigh_list_lock); 772 773 /* for all neighbors towards this originator ... */ 774 hlist_for_each_entry_safe(neigh_node, node_tmp, 775 &orig_node->neigh_list, list) { 776 hlist_del_rcu(&neigh_node->list); 777 batadv_neigh_node_put(neigh_node); 778 } 779 780 hlist_for_each_entry_safe(orig_ifinfo, node_tmp, 781 &orig_node->ifinfo_list, list) { 782 hlist_del_rcu(&orig_ifinfo->list); 783 batadv_orig_ifinfo_put(orig_ifinfo); 784 } 785 spin_unlock_bh(&orig_node->neigh_list_lock); 786 787 /* Free nc_nodes */ 788 batadv_nc_purge_orig(orig_node->bat_priv, orig_node, NULL); 789 790 call_rcu(&orig_node->rcu, batadv_orig_node_free_rcu); 791 } 792 793 /** 794 * batadv_orig_node_put - decrement the orig node refcounter and possibly 795 * release it 796 * @orig_node: the orig node to free 797 */ 798 void batadv_orig_node_put(struct batadv_orig_node *orig_node) 799 { 800 kref_put(&orig_node->refcount, batadv_orig_node_release); 801 } 802 803 void batadv_originator_free(struct batadv_priv *bat_priv) 804 { 805 struct batadv_hashtable *hash = bat_priv->orig_hash; 806 struct hlist_node *node_tmp; 807 struct hlist_head *head; 808 spinlock_t *list_lock; /* spinlock to protect write access */ 809 struct batadv_orig_node *orig_node; 810 u32 i; 811 812 if (!hash) 813 return; 814 815 cancel_delayed_work_sync(&bat_priv->orig_work); 816 817 bat_priv->orig_hash = NULL; 818 819 for (i = 0; i < hash->size; i++) { 820 head = &hash->table[i]; 821 list_lock = &hash->list_locks[i]; 822 823 spin_lock_bh(list_lock); 824 hlist_for_each_entry_safe(orig_node, node_tmp, 825 head, hash_entry) { 826 hlist_del_rcu(&orig_node->hash_entry); 827 batadv_orig_node_put(orig_node); 828 } 829 spin_unlock_bh(list_lock); 830 } 831 832 batadv_hash_destroy(hash); 833 } 834 835 /** 836 * batadv_orig_node_new - creates a new orig_node 837 * @bat_priv: the bat priv with all the soft interface information 838 * @addr: the mac address of the originator 839 * 840 * Creates a new originator object and initialise all the generic fields. 841 * The new object is not added to the originator list. 842 * 843 * Return: the newly created object or NULL on failure. 844 */ 845 struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv, 846 const u8 *addr) 847 { 848 struct batadv_orig_node *orig_node; 849 struct batadv_orig_node_vlan *vlan; 850 unsigned long reset_time; 851 int i; 852 853 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 854 "Creating new originator: %pM\n", addr); 855 856 orig_node = kzalloc(sizeof(*orig_node), GFP_ATOMIC); 857 if (!orig_node) 858 return NULL; 859 860 INIT_HLIST_HEAD(&orig_node->neigh_list); 861 INIT_HLIST_HEAD(&orig_node->vlan_list); 862 INIT_HLIST_HEAD(&orig_node->ifinfo_list); 863 spin_lock_init(&orig_node->bcast_seqno_lock); 864 spin_lock_init(&orig_node->neigh_list_lock); 865 spin_lock_init(&orig_node->tt_buff_lock); 866 spin_lock_init(&orig_node->tt_lock); 867 spin_lock_init(&orig_node->vlan_list_lock); 868 869 batadv_nc_init_orig(orig_node); 870 871 /* extra reference for return */ 872 kref_init(&orig_node->refcount); 873 kref_get(&orig_node->refcount); 874 875 orig_node->bat_priv = bat_priv; 876 ether_addr_copy(orig_node->orig, addr); 877 batadv_dat_init_orig_node_addr(orig_node); 878 atomic_set(&orig_node->last_ttvn, 0); 879 orig_node->tt_buff = NULL; 880 orig_node->tt_buff_len = 0; 881 orig_node->last_seen = jiffies; 882 reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS); 883 orig_node->bcast_seqno_reset = reset_time; 884 885 #ifdef CONFIG_BATMAN_ADV_MCAST 886 orig_node->mcast_flags = BATADV_NO_FLAGS; 887 INIT_HLIST_NODE(&orig_node->mcast_want_all_unsnoopables_node); 888 INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv4_node); 889 INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv6_node); 890 spin_lock_init(&orig_node->mcast_handler_lock); 891 #endif 892 893 /* create a vlan object for the "untagged" LAN */ 894 vlan = batadv_orig_node_vlan_new(orig_node, BATADV_NO_FLAGS); 895 if (!vlan) 896 goto free_orig_node; 897 /* batadv_orig_node_vlan_new() increases the refcounter. 898 * Immediately release vlan since it is not needed anymore in this 899 * context 900 */ 901 batadv_orig_node_vlan_put(vlan); 902 903 for (i = 0; i < BATADV_FRAG_BUFFER_COUNT; i++) { 904 INIT_HLIST_HEAD(&orig_node->fragments[i].head); 905 spin_lock_init(&orig_node->fragments[i].lock); 906 orig_node->fragments[i].size = 0; 907 } 908 909 return orig_node; 910 free_orig_node: 911 kfree(orig_node); 912 return NULL; 913 } 914 915 /** 916 * batadv_purge_neigh_ifinfo - purge obsolete ifinfo entries from neighbor 917 * @bat_priv: the bat priv with all the soft interface information 918 * @neigh: orig node which is to be checked 919 */ 920 static void 921 batadv_purge_neigh_ifinfo(struct batadv_priv *bat_priv, 922 struct batadv_neigh_node *neigh) 923 { 924 struct batadv_neigh_ifinfo *neigh_ifinfo; 925 struct batadv_hard_iface *if_outgoing; 926 struct hlist_node *node_tmp; 927 928 spin_lock_bh(&neigh->ifinfo_lock); 929 930 /* for all ifinfo objects for this neighinator */ 931 hlist_for_each_entry_safe(neigh_ifinfo, node_tmp, 932 &neigh->ifinfo_list, list) { 933 if_outgoing = neigh_ifinfo->if_outgoing; 934 935 /* always keep the default interface */ 936 if (if_outgoing == BATADV_IF_DEFAULT) 937 continue; 938 939 /* don't purge if the interface is not (going) down */ 940 if ((if_outgoing->if_status != BATADV_IF_INACTIVE) && 941 (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) && 942 (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED)) 943 continue; 944 945 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 946 "neighbor/ifinfo purge: neighbor %pM, iface: %s\n", 947 neigh->addr, if_outgoing->net_dev->name); 948 949 hlist_del_rcu(&neigh_ifinfo->list); 950 batadv_neigh_ifinfo_put(neigh_ifinfo); 951 } 952 953 spin_unlock_bh(&neigh->ifinfo_lock); 954 } 955 956 /** 957 * batadv_purge_orig_ifinfo - purge obsolete ifinfo entries from originator 958 * @bat_priv: the bat priv with all the soft interface information 959 * @orig_node: orig node which is to be checked 960 * 961 * Return: true if any ifinfo entry was purged, false otherwise. 962 */ 963 static bool 964 batadv_purge_orig_ifinfo(struct batadv_priv *bat_priv, 965 struct batadv_orig_node *orig_node) 966 { 967 struct batadv_orig_ifinfo *orig_ifinfo; 968 struct batadv_hard_iface *if_outgoing; 969 struct hlist_node *node_tmp; 970 bool ifinfo_purged = false; 971 972 spin_lock_bh(&orig_node->neigh_list_lock); 973 974 /* for all ifinfo objects for this originator */ 975 hlist_for_each_entry_safe(orig_ifinfo, node_tmp, 976 &orig_node->ifinfo_list, list) { 977 if_outgoing = orig_ifinfo->if_outgoing; 978 979 /* always keep the default interface */ 980 if (if_outgoing == BATADV_IF_DEFAULT) 981 continue; 982 983 /* don't purge if the interface is not (going) down */ 984 if ((if_outgoing->if_status != BATADV_IF_INACTIVE) && 985 (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) && 986 (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED)) 987 continue; 988 989 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 990 "router/ifinfo purge: originator %pM, iface: %s\n", 991 orig_node->orig, if_outgoing->net_dev->name); 992 993 ifinfo_purged = true; 994 995 hlist_del_rcu(&orig_ifinfo->list); 996 batadv_orig_ifinfo_put(orig_ifinfo); 997 if (orig_node->last_bonding_candidate == orig_ifinfo) { 998 orig_node->last_bonding_candidate = NULL; 999 batadv_orig_ifinfo_put(orig_ifinfo); 1000 } 1001 } 1002 1003 spin_unlock_bh(&orig_node->neigh_list_lock); 1004 1005 return ifinfo_purged; 1006 } 1007 1008 /** 1009 * batadv_purge_orig_neighbors - purges neighbors from originator 1010 * @bat_priv: the bat priv with all the soft interface information 1011 * @orig_node: orig node which is to be checked 1012 * 1013 * Return: true if any neighbor was purged, false otherwise 1014 */ 1015 static bool 1016 batadv_purge_orig_neighbors(struct batadv_priv *bat_priv, 1017 struct batadv_orig_node *orig_node) 1018 { 1019 struct hlist_node *node_tmp; 1020 struct batadv_neigh_node *neigh_node; 1021 bool neigh_purged = false; 1022 unsigned long last_seen; 1023 struct batadv_hard_iface *if_incoming; 1024 1025 spin_lock_bh(&orig_node->neigh_list_lock); 1026 1027 /* for all neighbors towards this originator ... */ 1028 hlist_for_each_entry_safe(neigh_node, node_tmp, 1029 &orig_node->neigh_list, list) { 1030 last_seen = neigh_node->last_seen; 1031 if_incoming = neigh_node->if_incoming; 1032 1033 if ((batadv_has_timed_out(last_seen, BATADV_PURGE_TIMEOUT)) || 1034 (if_incoming->if_status == BATADV_IF_INACTIVE) || 1035 (if_incoming->if_status == BATADV_IF_NOT_IN_USE) || 1036 (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED)) { 1037 if ((if_incoming->if_status == BATADV_IF_INACTIVE) || 1038 (if_incoming->if_status == BATADV_IF_NOT_IN_USE) || 1039 (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED)) 1040 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1041 "neighbor purge: originator %pM, neighbor: %pM, iface: %s\n", 1042 orig_node->orig, neigh_node->addr, 1043 if_incoming->net_dev->name); 1044 else 1045 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1046 "neighbor timeout: originator %pM, neighbor: %pM, last_seen: %u\n", 1047 orig_node->orig, neigh_node->addr, 1048 jiffies_to_msecs(last_seen)); 1049 1050 neigh_purged = true; 1051 1052 hlist_del_rcu(&neigh_node->list); 1053 batadv_neigh_node_put(neigh_node); 1054 } else { 1055 /* only necessary if not the whole neighbor is to be 1056 * deleted, but some interface has been removed. 1057 */ 1058 batadv_purge_neigh_ifinfo(bat_priv, neigh_node); 1059 } 1060 } 1061 1062 spin_unlock_bh(&orig_node->neigh_list_lock); 1063 return neigh_purged; 1064 } 1065 1066 /** 1067 * batadv_find_best_neighbor - finds the best neighbor after purging 1068 * @bat_priv: the bat priv with all the soft interface information 1069 * @orig_node: orig node which is to be checked 1070 * @if_outgoing: the interface for which the metric should be compared 1071 * 1072 * Return: the current best neighbor, with refcount increased. 1073 */ 1074 static struct batadv_neigh_node * 1075 batadv_find_best_neighbor(struct batadv_priv *bat_priv, 1076 struct batadv_orig_node *orig_node, 1077 struct batadv_hard_iface *if_outgoing) 1078 { 1079 struct batadv_neigh_node *best = NULL, *neigh; 1080 struct batadv_algo_ops *bao = bat_priv->bat_algo_ops; 1081 1082 rcu_read_lock(); 1083 hlist_for_each_entry_rcu(neigh, &orig_node->neigh_list, list) { 1084 if (best && (bao->bat_neigh_cmp(neigh, if_outgoing, 1085 best, if_outgoing) <= 0)) 1086 continue; 1087 1088 if (!kref_get_unless_zero(&neigh->refcount)) 1089 continue; 1090 1091 if (best) 1092 batadv_neigh_node_put(best); 1093 1094 best = neigh; 1095 } 1096 rcu_read_unlock(); 1097 1098 return best; 1099 } 1100 1101 /** 1102 * batadv_purge_orig_node - purges obsolete information from an orig_node 1103 * @bat_priv: the bat priv with all the soft interface information 1104 * @orig_node: orig node which is to be checked 1105 * 1106 * This function checks if the orig_node or substructures of it have become 1107 * obsolete, and purges this information if that's the case. 1108 * 1109 * Return: true if the orig_node is to be removed, false otherwise. 1110 */ 1111 static bool batadv_purge_orig_node(struct batadv_priv *bat_priv, 1112 struct batadv_orig_node *orig_node) 1113 { 1114 struct batadv_neigh_node *best_neigh_node; 1115 struct batadv_hard_iface *hard_iface; 1116 bool changed_ifinfo, changed_neigh; 1117 1118 if (batadv_has_timed_out(orig_node->last_seen, 1119 2 * BATADV_PURGE_TIMEOUT)) { 1120 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, 1121 "Originator timeout: originator %pM, last_seen %u\n", 1122 orig_node->orig, 1123 jiffies_to_msecs(orig_node->last_seen)); 1124 return true; 1125 } 1126 changed_ifinfo = batadv_purge_orig_ifinfo(bat_priv, orig_node); 1127 changed_neigh = batadv_purge_orig_neighbors(bat_priv, orig_node); 1128 1129 if (!changed_ifinfo && !changed_neigh) 1130 return false; 1131 1132 /* first for NULL ... */ 1133 best_neigh_node = batadv_find_best_neighbor(bat_priv, orig_node, 1134 BATADV_IF_DEFAULT); 1135 batadv_update_route(bat_priv, orig_node, BATADV_IF_DEFAULT, 1136 best_neigh_node); 1137 if (best_neigh_node) 1138 batadv_neigh_node_put(best_neigh_node); 1139 1140 /* ... then for all other interfaces. */ 1141 rcu_read_lock(); 1142 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 1143 if (hard_iface->if_status != BATADV_IF_ACTIVE) 1144 continue; 1145 1146 if (hard_iface->soft_iface != bat_priv->soft_iface) 1147 continue; 1148 1149 if (!kref_get_unless_zero(&hard_iface->refcount)) 1150 continue; 1151 1152 best_neigh_node = batadv_find_best_neighbor(bat_priv, 1153 orig_node, 1154 hard_iface); 1155 batadv_update_route(bat_priv, orig_node, hard_iface, 1156 best_neigh_node); 1157 if (best_neigh_node) 1158 batadv_neigh_node_put(best_neigh_node); 1159 1160 batadv_hardif_put(hard_iface); 1161 } 1162 rcu_read_unlock(); 1163 1164 return false; 1165 } 1166 1167 static void _batadv_purge_orig(struct batadv_priv *bat_priv) 1168 { 1169 struct batadv_hashtable *hash = bat_priv->orig_hash; 1170 struct hlist_node *node_tmp; 1171 struct hlist_head *head; 1172 spinlock_t *list_lock; /* spinlock to protect write access */ 1173 struct batadv_orig_node *orig_node; 1174 u32 i; 1175 1176 if (!hash) 1177 return; 1178 1179 /* for all origins... */ 1180 for (i = 0; i < hash->size; i++) { 1181 head = &hash->table[i]; 1182 list_lock = &hash->list_locks[i]; 1183 1184 spin_lock_bh(list_lock); 1185 hlist_for_each_entry_safe(orig_node, node_tmp, 1186 head, hash_entry) { 1187 if (batadv_purge_orig_node(bat_priv, orig_node)) { 1188 batadv_gw_node_delete(bat_priv, orig_node); 1189 hlist_del_rcu(&orig_node->hash_entry); 1190 batadv_tt_global_del_orig(orig_node->bat_priv, 1191 orig_node, -1, 1192 "originator timed out"); 1193 batadv_orig_node_put(orig_node); 1194 continue; 1195 } 1196 1197 batadv_frag_purge_orig(orig_node, 1198 batadv_frag_check_entry); 1199 } 1200 spin_unlock_bh(list_lock); 1201 } 1202 1203 batadv_gw_election(bat_priv); 1204 } 1205 1206 static void batadv_purge_orig(struct work_struct *work) 1207 { 1208 struct delayed_work *delayed_work; 1209 struct batadv_priv *bat_priv; 1210 1211 delayed_work = to_delayed_work(work); 1212 bat_priv = container_of(delayed_work, struct batadv_priv, orig_work); 1213 _batadv_purge_orig(bat_priv); 1214 queue_delayed_work(batadv_event_workqueue, 1215 &bat_priv->orig_work, 1216 msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD)); 1217 } 1218 1219 void batadv_purge_orig_ref(struct batadv_priv *bat_priv) 1220 { 1221 _batadv_purge_orig(bat_priv); 1222 } 1223 1224 int batadv_orig_seq_print_text(struct seq_file *seq, void *offset) 1225 { 1226 struct net_device *net_dev = (struct net_device *)seq->private; 1227 struct batadv_priv *bat_priv = netdev_priv(net_dev); 1228 struct batadv_hard_iface *primary_if; 1229 1230 primary_if = batadv_seq_print_text_primary_if_get(seq); 1231 if (!primary_if) 1232 return 0; 1233 1234 seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n", 1235 BATADV_SOURCE_VERSION, primary_if->net_dev->name, 1236 primary_if->net_dev->dev_addr, net_dev->name, 1237 bat_priv->bat_algo_ops->name); 1238 1239 batadv_hardif_put(primary_if); 1240 1241 if (!bat_priv->bat_algo_ops->bat_orig_print) { 1242 seq_puts(seq, 1243 "No printing function for this routing protocol\n"); 1244 return 0; 1245 } 1246 1247 bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq, 1248 BATADV_IF_DEFAULT); 1249 1250 return 0; 1251 } 1252 1253 /** 1254 * batadv_orig_hardif_seq_print_text - writes originator infos for a specific 1255 * outgoing interface 1256 * @seq: debugfs table seq_file struct 1257 * @offset: not used 1258 * 1259 * Return: 0 1260 */ 1261 int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset) 1262 { 1263 struct net_device *net_dev = (struct net_device *)seq->private; 1264 struct batadv_hard_iface *hard_iface; 1265 struct batadv_priv *bat_priv; 1266 1267 hard_iface = batadv_hardif_get_by_netdev(net_dev); 1268 1269 if (!hard_iface || !hard_iface->soft_iface) { 1270 seq_puts(seq, "Interface not known to B.A.T.M.A.N.\n"); 1271 goto out; 1272 } 1273 1274 bat_priv = netdev_priv(hard_iface->soft_iface); 1275 if (!bat_priv->bat_algo_ops->bat_orig_print) { 1276 seq_puts(seq, 1277 "No printing function for this routing protocol\n"); 1278 goto out; 1279 } 1280 1281 if (hard_iface->if_status != BATADV_IF_ACTIVE) { 1282 seq_puts(seq, "Interface not active\n"); 1283 goto out; 1284 } 1285 1286 seq_printf(seq, "[B.A.T.M.A.N. adv %s, IF/MAC: %s/%pM (%s %s)]\n", 1287 BATADV_SOURCE_VERSION, hard_iface->net_dev->name, 1288 hard_iface->net_dev->dev_addr, 1289 hard_iface->soft_iface->name, bat_priv->bat_algo_ops->name); 1290 1291 bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq, hard_iface); 1292 1293 out: 1294 if (hard_iface) 1295 batadv_hardif_put(hard_iface); 1296 return 0; 1297 } 1298 1299 int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface, 1300 int max_if_num) 1301 { 1302 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 1303 struct batadv_algo_ops *bao = bat_priv->bat_algo_ops; 1304 struct batadv_hashtable *hash = bat_priv->orig_hash; 1305 struct hlist_head *head; 1306 struct batadv_orig_node *orig_node; 1307 u32 i; 1308 int ret; 1309 1310 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on 1311 * if_num 1312 */ 1313 for (i = 0; i < hash->size; i++) { 1314 head = &hash->table[i]; 1315 1316 rcu_read_lock(); 1317 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 1318 ret = 0; 1319 if (bao->bat_orig_add_if) 1320 ret = bao->bat_orig_add_if(orig_node, 1321 max_if_num); 1322 if (ret == -ENOMEM) 1323 goto err; 1324 } 1325 rcu_read_unlock(); 1326 } 1327 1328 return 0; 1329 1330 err: 1331 rcu_read_unlock(); 1332 return -ENOMEM; 1333 } 1334 1335 int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface, 1336 int max_if_num) 1337 { 1338 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 1339 struct batadv_hashtable *hash = bat_priv->orig_hash; 1340 struct hlist_head *head; 1341 struct batadv_hard_iface *hard_iface_tmp; 1342 struct batadv_orig_node *orig_node; 1343 struct batadv_algo_ops *bao = bat_priv->bat_algo_ops; 1344 u32 i; 1345 int ret; 1346 1347 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on 1348 * if_num 1349 */ 1350 for (i = 0; i < hash->size; i++) { 1351 head = &hash->table[i]; 1352 1353 rcu_read_lock(); 1354 hlist_for_each_entry_rcu(orig_node, head, hash_entry) { 1355 ret = 0; 1356 if (bao->bat_orig_del_if) 1357 ret = bao->bat_orig_del_if(orig_node, 1358 max_if_num, 1359 hard_iface->if_num); 1360 if (ret == -ENOMEM) 1361 goto err; 1362 } 1363 rcu_read_unlock(); 1364 } 1365 1366 /* renumber remaining batman interfaces _inside_ of orig_hash_lock */ 1367 rcu_read_lock(); 1368 list_for_each_entry_rcu(hard_iface_tmp, &batadv_hardif_list, list) { 1369 if (hard_iface_tmp->if_status == BATADV_IF_NOT_IN_USE) 1370 continue; 1371 1372 if (hard_iface == hard_iface_tmp) 1373 continue; 1374 1375 if (hard_iface->soft_iface != hard_iface_tmp->soft_iface) 1376 continue; 1377 1378 if (hard_iface_tmp->if_num > hard_iface->if_num) 1379 hard_iface_tmp->if_num--; 1380 } 1381 rcu_read_unlock(); 1382 1383 hard_iface->if_num = -1; 1384 return 0; 1385 1386 err: 1387 rcu_read_unlock(); 1388 return -ENOMEM; 1389 } 1390