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