1 /* Copyright (C) 2007-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 "hard-interface.h" 19 #include "main.h" 20 21 #include <linux/atomic.h> 22 #include <linux/bug.h> 23 #include <linux/byteorder/generic.h> 24 #include <linux/errno.h> 25 #include <linux/fs.h> 26 #include <linux/if_arp.h> 27 #include <linux/if_ether.h> 28 #include <linux/if.h> 29 #include <linux/kernel.h> 30 #include <linux/kref.h> 31 #include <linux/list.h> 32 #include <linux/netdevice.h> 33 #include <linux/printk.h> 34 #include <linux/rculist.h> 35 #include <linux/rtnetlink.h> 36 #include <linux/slab.h> 37 #include <linux/spinlock.h> 38 #include <linux/workqueue.h> 39 #include <net/net_namespace.h> 40 41 #include "bridge_loop_avoidance.h" 42 #include "debugfs.h" 43 #include "distributed-arp-table.h" 44 #include "gateway_client.h" 45 #include "originator.h" 46 #include "packet.h" 47 #include "send.h" 48 #include "soft-interface.h" 49 #include "sysfs.h" 50 #include "translation-table.h" 51 52 /** 53 * batadv_hardif_release - release hard interface from lists and queue for 54 * free after rcu grace period 55 * @ref: kref pointer of the hard interface 56 */ 57 void batadv_hardif_release(struct kref *ref) 58 { 59 struct batadv_hard_iface *hard_iface; 60 61 hard_iface = container_of(ref, struct batadv_hard_iface, refcount); 62 dev_put(hard_iface->net_dev); 63 64 kfree_rcu(hard_iface, rcu); 65 } 66 67 struct batadv_hard_iface * 68 batadv_hardif_get_by_netdev(const struct net_device *net_dev) 69 { 70 struct batadv_hard_iface *hard_iface; 71 72 rcu_read_lock(); 73 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 74 if (hard_iface->net_dev == net_dev && 75 kref_get_unless_zero(&hard_iface->refcount)) 76 goto out; 77 } 78 79 hard_iface = NULL; 80 81 out: 82 rcu_read_unlock(); 83 return hard_iface; 84 } 85 86 /** 87 * batadv_mutual_parents - check if two devices are each others parent 88 * @dev1: 1st net_device 89 * @dev2: 2nd net_device 90 * 91 * veth devices come in pairs and each is the parent of the other! 92 * 93 * Return: true if the devices are each others parent, otherwise false 94 */ 95 static bool batadv_mutual_parents(const struct net_device *dev1, 96 const struct net_device *dev2) 97 { 98 int dev1_parent_iflink = dev_get_iflink(dev1); 99 int dev2_parent_iflink = dev_get_iflink(dev2); 100 101 if (!dev1_parent_iflink || !dev2_parent_iflink) 102 return false; 103 104 return (dev1_parent_iflink == dev2->ifindex) && 105 (dev2_parent_iflink == dev1->ifindex); 106 } 107 108 /** 109 * batadv_is_on_batman_iface - check if a device is a batman iface descendant 110 * @net_dev: the device to check 111 * 112 * If the user creates any virtual device on top of a batman-adv interface, it 113 * is important to prevent this new interface to be used to create a new mesh 114 * network (this behaviour would lead to a batman-over-batman configuration). 115 * This function recursively checks all the fathers of the device passed as 116 * argument looking for a batman-adv soft interface. 117 * 118 * Return: true if the device is descendant of a batman-adv mesh interface (or 119 * if it is a batman-adv interface itself), false otherwise 120 */ 121 static bool batadv_is_on_batman_iface(const struct net_device *net_dev) 122 { 123 struct net_device *parent_dev; 124 bool ret; 125 126 /* check if this is a batman-adv mesh interface */ 127 if (batadv_softif_is_valid(net_dev)) 128 return true; 129 130 /* no more parents..stop recursion */ 131 if (dev_get_iflink(net_dev) == 0 || 132 dev_get_iflink(net_dev) == net_dev->ifindex) 133 return false; 134 135 /* recurse over the parent device */ 136 parent_dev = __dev_get_by_index(&init_net, dev_get_iflink(net_dev)); 137 /* if we got a NULL parent_dev there is something broken.. */ 138 if (WARN(!parent_dev, "Cannot find parent device")) 139 return false; 140 141 if (batadv_mutual_parents(net_dev, parent_dev)) 142 return false; 143 144 ret = batadv_is_on_batman_iface(parent_dev); 145 146 return ret; 147 } 148 149 static int batadv_is_valid_iface(const struct net_device *net_dev) 150 { 151 if (net_dev->flags & IFF_LOOPBACK) 152 return 0; 153 154 if (net_dev->type != ARPHRD_ETHER) 155 return 0; 156 157 if (net_dev->addr_len != ETH_ALEN) 158 return 0; 159 160 /* no batman over batman */ 161 if (batadv_is_on_batman_iface(net_dev)) 162 return 0; 163 164 return 1; 165 } 166 167 /** 168 * batadv_is_wifi_netdev - check if the given net_device struct is a wifi 169 * interface 170 * @net_device: the device to check 171 * 172 * Return: true if the net device is a 802.11 wireless device, false otherwise. 173 */ 174 bool batadv_is_wifi_netdev(struct net_device *net_device) 175 { 176 if (!net_device) 177 return false; 178 179 #ifdef CONFIG_WIRELESS_EXT 180 /* pre-cfg80211 drivers have to implement WEXT, so it is possible to 181 * check for wireless_handlers != NULL 182 */ 183 if (net_device->wireless_handlers) 184 return true; 185 #endif 186 187 /* cfg80211 drivers have to set ieee80211_ptr */ 188 if (net_device->ieee80211_ptr) 189 return true; 190 191 return false; 192 } 193 194 static struct batadv_hard_iface * 195 batadv_hardif_get_active(const struct net_device *soft_iface) 196 { 197 struct batadv_hard_iface *hard_iface; 198 199 rcu_read_lock(); 200 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 201 if (hard_iface->soft_iface != soft_iface) 202 continue; 203 204 if (hard_iface->if_status == BATADV_IF_ACTIVE && 205 kref_get_unless_zero(&hard_iface->refcount)) 206 goto out; 207 } 208 209 hard_iface = NULL; 210 211 out: 212 rcu_read_unlock(); 213 return hard_iface; 214 } 215 216 static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv, 217 struct batadv_hard_iface *oldif) 218 { 219 struct batadv_hard_iface *primary_if; 220 221 primary_if = batadv_primary_if_get_selected(bat_priv); 222 if (!primary_if) 223 goto out; 224 225 batadv_dat_init_own_addr(bat_priv, primary_if); 226 batadv_bla_update_orig_address(bat_priv, primary_if, oldif); 227 out: 228 if (primary_if) 229 batadv_hardif_put(primary_if); 230 } 231 232 static void batadv_primary_if_select(struct batadv_priv *bat_priv, 233 struct batadv_hard_iface *new_hard_iface) 234 { 235 struct batadv_hard_iface *curr_hard_iface; 236 237 ASSERT_RTNL(); 238 239 if (new_hard_iface && !kref_get_unless_zero(&new_hard_iface->refcount)) 240 new_hard_iface = NULL; 241 242 curr_hard_iface = rcu_dereference_protected(bat_priv->primary_if, 1); 243 rcu_assign_pointer(bat_priv->primary_if, new_hard_iface); 244 245 if (!new_hard_iface) 246 goto out; 247 248 bat_priv->bat_algo_ops->bat_primary_iface_set(new_hard_iface); 249 batadv_primary_if_update_addr(bat_priv, curr_hard_iface); 250 251 out: 252 if (curr_hard_iface) 253 batadv_hardif_put(curr_hard_iface); 254 } 255 256 static bool 257 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) 258 { 259 if (hard_iface->net_dev->flags & IFF_UP) 260 return true; 261 262 return false; 263 } 264 265 static void batadv_check_known_mac_addr(const struct net_device *net_dev) 266 { 267 const struct batadv_hard_iface *hard_iface; 268 269 rcu_read_lock(); 270 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 271 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && 272 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) 273 continue; 274 275 if (hard_iface->net_dev == net_dev) 276 continue; 277 278 if (!batadv_compare_eth(hard_iface->net_dev->dev_addr, 279 net_dev->dev_addr)) 280 continue; 281 282 pr_warn("The newly added mac address (%pM) already exists on: %s\n", 283 net_dev->dev_addr, hard_iface->net_dev->name); 284 pr_warn("It is strongly recommended to keep mac addresses unique to avoid problems!\n"); 285 } 286 rcu_read_unlock(); 287 } 288 289 /** 290 * batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom 291 * @soft_iface: netdev struct of the mesh interface 292 */ 293 static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface) 294 { 295 const struct batadv_hard_iface *hard_iface; 296 unsigned short lower_header_len = ETH_HLEN; 297 unsigned short lower_headroom = 0; 298 unsigned short lower_tailroom = 0; 299 unsigned short needed_headroom; 300 301 rcu_read_lock(); 302 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 303 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) 304 continue; 305 306 if (hard_iface->soft_iface != soft_iface) 307 continue; 308 309 lower_header_len = max_t(unsigned short, lower_header_len, 310 hard_iface->net_dev->hard_header_len); 311 312 lower_headroom = max_t(unsigned short, lower_headroom, 313 hard_iface->net_dev->needed_headroom); 314 315 lower_tailroom = max_t(unsigned short, lower_tailroom, 316 hard_iface->net_dev->needed_tailroom); 317 } 318 rcu_read_unlock(); 319 320 needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN); 321 needed_headroom += batadv_max_header_len(); 322 323 soft_iface->needed_headroom = needed_headroom; 324 soft_iface->needed_tailroom = lower_tailroom; 325 } 326 327 int batadv_hardif_min_mtu(struct net_device *soft_iface) 328 { 329 struct batadv_priv *bat_priv = netdev_priv(soft_iface); 330 const struct batadv_hard_iface *hard_iface; 331 int min_mtu = INT_MAX; 332 333 rcu_read_lock(); 334 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 335 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && 336 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) 337 continue; 338 339 if (hard_iface->soft_iface != soft_iface) 340 continue; 341 342 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu); 343 } 344 rcu_read_unlock(); 345 346 if (atomic_read(&bat_priv->fragmentation) == 0) 347 goto out; 348 349 /* with fragmentation enabled the maximum size of internally generated 350 * packets such as translation table exchanges or tvlv containers, etc 351 * has to be calculated 352 */ 353 min_mtu = min_t(int, min_mtu, BATADV_FRAG_MAX_FRAG_SIZE); 354 min_mtu -= sizeof(struct batadv_frag_packet); 355 min_mtu *= BATADV_FRAG_MAX_FRAGMENTS; 356 357 out: 358 /* report to the other components the maximum amount of bytes that 359 * batman-adv can send over the wire (without considering the payload 360 * overhead). For example, this value is used by TT to compute the 361 * maximum local table table size 362 */ 363 atomic_set(&bat_priv->packet_size_max, min_mtu); 364 365 /* the real soft-interface MTU is computed by removing the payload 366 * overhead from the maximum amount of bytes that was just computed. 367 * 368 * However batman-adv does not support MTUs bigger than ETH_DATA_LEN 369 */ 370 return min_t(int, min_mtu - batadv_max_header_len(), ETH_DATA_LEN); 371 } 372 373 /* adjusts the MTU if a new interface with a smaller MTU appeared. */ 374 void batadv_update_min_mtu(struct net_device *soft_iface) 375 { 376 soft_iface->mtu = batadv_hardif_min_mtu(soft_iface); 377 378 /* Check if the local translate table should be cleaned up to match a 379 * new (and smaller) MTU. 380 */ 381 batadv_tt_local_resize_to_mtu(soft_iface); 382 } 383 384 static void 385 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) 386 { 387 struct batadv_priv *bat_priv; 388 struct batadv_hard_iface *primary_if = NULL; 389 390 if (hard_iface->if_status != BATADV_IF_INACTIVE) 391 goto out; 392 393 bat_priv = netdev_priv(hard_iface->soft_iface); 394 395 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); 396 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; 397 398 /* the first active interface becomes our primary interface or 399 * the next active interface after the old primary interface was removed 400 */ 401 primary_if = batadv_primary_if_get_selected(bat_priv); 402 if (!primary_if) 403 batadv_primary_if_select(bat_priv, hard_iface); 404 405 batadv_info(hard_iface->soft_iface, "Interface activated: %s\n", 406 hard_iface->net_dev->name); 407 408 batadv_update_min_mtu(hard_iface->soft_iface); 409 410 out: 411 if (primary_if) 412 batadv_hardif_put(primary_if); 413 } 414 415 static void 416 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) 417 { 418 if ((hard_iface->if_status != BATADV_IF_ACTIVE) && 419 (hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)) 420 return; 421 422 hard_iface->if_status = BATADV_IF_INACTIVE; 423 424 batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n", 425 hard_iface->net_dev->name); 426 427 batadv_update_min_mtu(hard_iface->soft_iface); 428 } 429 430 /** 431 * batadv_master_del_slave - remove hard_iface from the current master interface 432 * @slave: the interface enslaved in another master 433 * @master: the master from which slave has to be removed 434 * 435 * Invoke ndo_del_slave on master passing slave as argument. In this way slave 436 * is free'd and master can correctly change its internal state. 437 * 438 * Return: 0 on success, a negative value representing the error otherwise 439 */ 440 static int batadv_master_del_slave(struct batadv_hard_iface *slave, 441 struct net_device *master) 442 { 443 int ret; 444 445 if (!master) 446 return 0; 447 448 ret = -EBUSY; 449 if (master->netdev_ops->ndo_del_slave) 450 ret = master->netdev_ops->ndo_del_slave(master, slave->net_dev); 451 452 return ret; 453 } 454 455 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, 456 const char *iface_name) 457 { 458 struct batadv_priv *bat_priv; 459 struct net_device *soft_iface, *master; 460 __be16 ethertype = htons(ETH_P_BATMAN); 461 int max_header_len = batadv_max_header_len(); 462 int ret; 463 464 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 465 goto out; 466 467 if (!kref_get_unless_zero(&hard_iface->refcount)) 468 goto out; 469 470 soft_iface = dev_get_by_name(&init_net, iface_name); 471 472 if (!soft_iface) { 473 soft_iface = batadv_softif_create(iface_name); 474 475 if (!soft_iface) { 476 ret = -ENOMEM; 477 goto err; 478 } 479 480 /* dev_get_by_name() increases the reference counter for us */ 481 dev_hold(soft_iface); 482 } 483 484 if (!batadv_softif_is_valid(soft_iface)) { 485 pr_err("Can't create batman mesh interface %s: already exists as regular interface\n", 486 soft_iface->name); 487 ret = -EINVAL; 488 goto err_dev; 489 } 490 491 /* check if the interface is enslaved in another virtual one and 492 * in that case unlink it first 493 */ 494 master = netdev_master_upper_dev_get(hard_iface->net_dev); 495 ret = batadv_master_del_slave(hard_iface, master); 496 if (ret) 497 goto err_dev; 498 499 hard_iface->soft_iface = soft_iface; 500 bat_priv = netdev_priv(hard_iface->soft_iface); 501 502 ret = netdev_master_upper_dev_link(hard_iface->net_dev, 503 soft_iface, NULL, NULL); 504 if (ret) 505 goto err_dev; 506 507 ret = bat_priv->bat_algo_ops->bat_iface_enable(hard_iface); 508 if (ret < 0) 509 goto err_upper; 510 511 hard_iface->if_num = bat_priv->num_ifaces; 512 bat_priv->num_ifaces++; 513 hard_iface->if_status = BATADV_IF_INACTIVE; 514 ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces); 515 if (ret < 0) { 516 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); 517 bat_priv->num_ifaces--; 518 hard_iface->if_status = BATADV_IF_NOT_IN_USE; 519 goto err_upper; 520 } 521 522 hard_iface->batman_adv_ptype.type = ethertype; 523 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; 524 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; 525 dev_add_pack(&hard_iface->batman_adv_ptype); 526 527 batadv_info(hard_iface->soft_iface, "Adding interface: %s\n", 528 hard_iface->net_dev->name); 529 530 if (atomic_read(&bat_priv->fragmentation) && 531 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) 532 batadv_info(hard_iface->soft_iface, 533 "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. Packets going over this interface will be fragmented on layer2 which could impact the performance. Setting the MTU to %i would solve the problem.\n", 534 hard_iface->net_dev->name, hard_iface->net_dev->mtu, 535 ETH_DATA_LEN + max_header_len); 536 537 if (!atomic_read(&bat_priv->fragmentation) && 538 hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len) 539 batadv_info(hard_iface->soft_iface, 540 "The MTU of interface %s is too small (%i) to handle the transport of batman-adv packets. If you experience problems getting traffic through try increasing the MTU to %i.\n", 541 hard_iface->net_dev->name, hard_iface->net_dev->mtu, 542 ETH_DATA_LEN + max_header_len); 543 544 if (batadv_hardif_is_iface_up(hard_iface)) 545 batadv_hardif_activate_interface(hard_iface); 546 else 547 batadv_err(hard_iface->soft_iface, 548 "Not using interface %s (retrying later): interface not active\n", 549 hard_iface->net_dev->name); 550 551 batadv_hardif_recalc_extra_skbroom(soft_iface); 552 553 /* begin scheduling originator messages on that interface */ 554 batadv_schedule_bat_ogm(hard_iface); 555 556 out: 557 return 0; 558 559 err_upper: 560 netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface); 561 err_dev: 562 hard_iface->soft_iface = NULL; 563 dev_put(soft_iface); 564 err: 565 batadv_hardif_put(hard_iface); 566 return ret; 567 } 568 569 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, 570 enum batadv_hard_if_cleanup autodel) 571 { 572 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 573 struct batadv_hard_iface *primary_if = NULL; 574 575 if (hard_iface->if_status == BATADV_IF_ACTIVE) 576 batadv_hardif_deactivate_interface(hard_iface); 577 578 if (hard_iface->if_status != BATADV_IF_INACTIVE) 579 goto out; 580 581 batadv_info(hard_iface->soft_iface, "Removing interface: %s\n", 582 hard_iface->net_dev->name); 583 dev_remove_pack(&hard_iface->batman_adv_ptype); 584 585 bat_priv->num_ifaces--; 586 batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces); 587 588 primary_if = batadv_primary_if_get_selected(bat_priv); 589 if (hard_iface == primary_if) { 590 struct batadv_hard_iface *new_if; 591 592 new_if = batadv_hardif_get_active(hard_iface->soft_iface); 593 batadv_primary_if_select(bat_priv, new_if); 594 595 if (new_if) 596 batadv_hardif_put(new_if); 597 } 598 599 bat_priv->bat_algo_ops->bat_iface_disable(hard_iface); 600 hard_iface->if_status = BATADV_IF_NOT_IN_USE; 601 602 /* delete all references to this hard_iface */ 603 batadv_purge_orig_ref(bat_priv); 604 batadv_purge_outstanding_packets(bat_priv, hard_iface); 605 dev_put(hard_iface->soft_iface); 606 607 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface); 608 batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface); 609 610 /* nobody uses this interface anymore */ 611 if (!bat_priv->num_ifaces) { 612 batadv_gw_check_client_stop(bat_priv); 613 614 if (autodel == BATADV_IF_CLEANUP_AUTO) 615 batadv_softif_destroy_sysfs(hard_iface->soft_iface); 616 } 617 618 hard_iface->soft_iface = NULL; 619 batadv_hardif_put(hard_iface); 620 621 out: 622 if (primary_if) 623 batadv_hardif_put(primary_if); 624 } 625 626 /** 627 * batadv_hardif_remove_interface_finish - cleans up the remains of a hardif 628 * @work: work queue item 629 * 630 * Free the parts of the hard interface which can not be removed under 631 * rtnl lock (to prevent deadlock situations). 632 */ 633 static void batadv_hardif_remove_interface_finish(struct work_struct *work) 634 { 635 struct batadv_hard_iface *hard_iface; 636 637 hard_iface = container_of(work, struct batadv_hard_iface, 638 cleanup_work); 639 640 batadv_debugfs_del_hardif(hard_iface); 641 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); 642 batadv_hardif_put(hard_iface); 643 } 644 645 static struct batadv_hard_iface * 646 batadv_hardif_add_interface(struct net_device *net_dev) 647 { 648 struct batadv_hard_iface *hard_iface; 649 int ret; 650 651 ASSERT_RTNL(); 652 653 ret = batadv_is_valid_iface(net_dev); 654 if (ret != 1) 655 goto out; 656 657 dev_hold(net_dev); 658 659 hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC); 660 if (!hard_iface) 661 goto release_dev; 662 663 ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev); 664 if (ret) 665 goto free_if; 666 667 hard_iface->if_num = -1; 668 hard_iface->net_dev = net_dev; 669 hard_iface->soft_iface = NULL; 670 hard_iface->if_status = BATADV_IF_NOT_IN_USE; 671 672 ret = batadv_debugfs_add_hardif(hard_iface); 673 if (ret) 674 goto free_sysfs; 675 676 INIT_LIST_HEAD(&hard_iface->list); 677 INIT_HLIST_HEAD(&hard_iface->neigh_list); 678 INIT_WORK(&hard_iface->cleanup_work, 679 batadv_hardif_remove_interface_finish); 680 681 spin_lock_init(&hard_iface->neigh_list_lock); 682 683 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; 684 if (batadv_is_wifi_netdev(net_dev)) 685 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; 686 687 /* extra reference for return */ 688 kref_init(&hard_iface->refcount); 689 kref_get(&hard_iface->refcount); 690 691 batadv_check_known_mac_addr(hard_iface->net_dev); 692 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); 693 694 return hard_iface; 695 696 free_sysfs: 697 batadv_sysfs_del_hardif(&hard_iface->hardif_obj); 698 free_if: 699 kfree(hard_iface); 700 release_dev: 701 dev_put(net_dev); 702 out: 703 return NULL; 704 } 705 706 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) 707 { 708 ASSERT_RTNL(); 709 710 /* first deactivate interface */ 711 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 712 batadv_hardif_disable_interface(hard_iface, 713 BATADV_IF_CLEANUP_AUTO); 714 715 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 716 return; 717 718 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; 719 queue_work(batadv_event_workqueue, &hard_iface->cleanup_work); 720 } 721 722 void batadv_hardif_remove_interfaces(void) 723 { 724 struct batadv_hard_iface *hard_iface, *hard_iface_tmp; 725 726 rtnl_lock(); 727 list_for_each_entry_safe(hard_iface, hard_iface_tmp, 728 &batadv_hardif_list, list) { 729 list_del_rcu(&hard_iface->list); 730 batadv_hardif_remove_interface(hard_iface); 731 } 732 rtnl_unlock(); 733 } 734 735 static int batadv_hard_if_event(struct notifier_block *this, 736 unsigned long event, void *ptr) 737 { 738 struct net_device *net_dev = netdev_notifier_info_to_dev(ptr); 739 struct batadv_hard_iface *hard_iface; 740 struct batadv_hard_iface *primary_if = NULL; 741 struct batadv_priv *bat_priv; 742 743 if (batadv_softif_is_valid(net_dev) && event == NETDEV_REGISTER) { 744 batadv_sysfs_add_meshif(net_dev); 745 bat_priv = netdev_priv(net_dev); 746 batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS); 747 return NOTIFY_DONE; 748 } 749 750 hard_iface = batadv_hardif_get_by_netdev(net_dev); 751 if (!hard_iface && (event == NETDEV_REGISTER || 752 event == NETDEV_POST_TYPE_CHANGE)) 753 hard_iface = batadv_hardif_add_interface(net_dev); 754 755 if (!hard_iface) 756 goto out; 757 758 switch (event) { 759 case NETDEV_UP: 760 batadv_hardif_activate_interface(hard_iface); 761 break; 762 case NETDEV_GOING_DOWN: 763 case NETDEV_DOWN: 764 batadv_hardif_deactivate_interface(hard_iface); 765 break; 766 case NETDEV_UNREGISTER: 767 case NETDEV_PRE_TYPE_CHANGE: 768 list_del_rcu(&hard_iface->list); 769 770 batadv_hardif_remove_interface(hard_iface); 771 break; 772 case NETDEV_CHANGEMTU: 773 if (hard_iface->soft_iface) 774 batadv_update_min_mtu(hard_iface->soft_iface); 775 break; 776 case NETDEV_CHANGEADDR: 777 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) 778 goto hardif_put; 779 780 batadv_check_known_mac_addr(hard_iface->net_dev); 781 782 bat_priv = netdev_priv(hard_iface->soft_iface); 783 bat_priv->bat_algo_ops->bat_iface_update_mac(hard_iface); 784 785 primary_if = batadv_primary_if_get_selected(bat_priv); 786 if (!primary_if) 787 goto hardif_put; 788 789 if (hard_iface == primary_if) 790 batadv_primary_if_update_addr(bat_priv, NULL); 791 break; 792 default: 793 break; 794 } 795 796 hardif_put: 797 batadv_hardif_put(hard_iface); 798 out: 799 if (primary_if) 800 batadv_hardif_put(primary_if); 801 return NOTIFY_DONE; 802 } 803 804 struct notifier_block batadv_hard_if_notifier = { 805 .notifier_call = batadv_hard_if_event, 806 }; 807