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