1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright (C) B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 */ 6 7 #include "hard-interface.h" 8 #include "main.h" 9 10 #include <linux/bug.h> 11 #include <linux/byteorder/generic.h> 12 #include <linux/compiler.h> 13 #include <linux/container_of.h> 14 #include <linux/errno.h> 15 #include <linux/gfp.h> 16 #include <linux/if.h> 17 #include <linux/if_arp.h> 18 #include <linux/if_ether.h> 19 #include <linux/kref.h> 20 #include <linux/limits.h> 21 #include <linux/list.h> 22 #include <linux/minmax.h> 23 #include <linux/mutex.h> 24 #include <linux/netdevice.h> 25 #include <linux/notifier.h> 26 #include <linux/printk.h> 27 #include <linux/rculist.h> 28 #include <linux/rhashtable-types.h> 29 #include <linux/rhashtable.h> 30 #include <linux/rtnetlink.h> 31 #include <linux/slab.h> 32 #include <linux/spinlock.h> 33 #include <net/net_namespace.h> 34 #include <net/rtnetlink.h> 35 #include <uapi/linux/batadv_packet.h> 36 37 #include "bat_v.h" 38 #include "bridge_loop_avoidance.h" 39 #include "distributed-arp-table.h" 40 #include "gateway_client.h" 41 #include "log.h" 42 #include "mesh-interface.h" 43 #include "originator.h" 44 #include "send.h" 45 #include "translation-table.h" 46 47 static const struct rhashtable_params batadv_wifi_net_devices_params = { 48 .key_len = sizeof(struct net_device *), 49 .key_offset = offsetof(struct batadv_wifi_net_device_state, netdev), 50 .head_offset = offsetof(struct batadv_wifi_net_device_state, l), 51 .automatic_shrinking = true, 52 }; 53 54 static struct rhashtable batadv_wifi_net_devices; 55 56 /** 57 * batadv_hardif_release() - release hard interface from lists and queue for 58 * free after rcu grace period 59 * @ref: kref pointer of the hard interface 60 */ 61 void batadv_hardif_release(struct kref *ref) 62 { 63 struct batadv_hard_iface *hard_iface; 64 65 hard_iface = container_of(ref, struct batadv_hard_iface, refcount); 66 netdev_put(hard_iface->net_dev, &hard_iface->dev_tracker); 67 68 kfree_rcu(hard_iface, rcu); 69 } 70 71 /** 72 * batadv_hardif_get_by_netdev() - Get hard interface object of a net_device 73 * @net_dev: net_device to search for 74 * 75 * Return: batadv_hard_iface of net_dev (with increased refcnt), NULL on errors 76 */ 77 struct batadv_hard_iface * 78 batadv_hardif_get_by_netdev(const struct net_device *net_dev) 79 { 80 struct batadv_hard_iface *hard_iface; 81 82 rcu_read_lock(); 83 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { 84 if (hard_iface->net_dev == net_dev && 85 kref_get_unless_zero(&hard_iface->refcount)) 86 goto out; 87 } 88 89 hard_iface = NULL; 90 91 out: 92 rcu_read_unlock(); 93 return hard_iface; 94 } 95 96 /** 97 * batadv_getlink_net() - return link net namespace (of use fallback) 98 * @netdev: net_device to check 99 * @fallback_net: return in case get_link_net is not available for @netdev 100 * 101 * Return: result of rtnl_link_ops->get_link_net or @fallback_net 102 */ 103 static struct net *batadv_getlink_net(const struct net_device *netdev, 104 struct net *fallback_net) 105 { 106 if (!netdev->rtnl_link_ops) 107 return fallback_net; 108 109 if (!netdev->rtnl_link_ops->get_link_net) 110 return fallback_net; 111 112 return netdev->rtnl_link_ops->get_link_net(netdev); 113 } 114 115 /** 116 * batadv_mutual_parents() - check if two devices are each others parent 117 * @dev1: 1st net dev 118 * @net1: 1st devices netns 119 * @dev2: 2nd net dev 120 * @net2: 2nd devices netns 121 * 122 * veth devices come in pairs and each is the parent of the other! 123 * 124 * Return: true if the devices are each others parent, otherwise false 125 */ 126 static bool batadv_mutual_parents(const struct net_device *dev1, 127 struct net *net1, 128 const struct net_device *dev2, 129 struct net *net2) 130 { 131 int dev1_parent_iflink = dev_get_iflink(dev1); 132 int dev2_parent_iflink = dev_get_iflink(dev2); 133 const struct net *dev1_parent_net; 134 const struct net *dev2_parent_net; 135 136 dev1_parent_net = batadv_getlink_net(dev1, net1); 137 dev2_parent_net = batadv_getlink_net(dev2, net2); 138 139 if (!dev1_parent_iflink || !dev2_parent_iflink) 140 return false; 141 142 return (dev1_parent_iflink == dev2->ifindex) && 143 (dev2_parent_iflink == dev1->ifindex) && 144 net_eq(dev1_parent_net, net2) && 145 net_eq(dev2_parent_net, net1); 146 } 147 148 /** 149 * batadv_is_on_batman_iface() - check if a device is a batman iface descendant 150 * @net_dev: the device to check 151 * 152 * If the user creates any virtual device on top of a batman-adv interface, it 153 * is important to prevent this new interface from being used to create a new 154 * mesh network (this behaviour would lead to a batman-over-batman 155 * configuration). This function recursively checks all the fathers of the 156 * device passed as argument looking for a batman-adv mesh interface. 157 * 158 * Return: true if the device is descendant of a batman-adv mesh interface (or 159 * if it is a batman-adv interface itself), false otherwise 160 */ 161 static bool batadv_is_on_batman_iface(const struct net_device *net_dev) 162 { 163 struct net *net = dev_net(net_dev); 164 struct net_device *parent_dev; 165 struct net *parent_net; 166 int iflink; 167 bool ret; 168 169 /* check if this is a batman-adv mesh interface */ 170 if (batadv_meshif_is_valid(net_dev)) 171 return true; 172 173 iflink = dev_get_iflink(net_dev); 174 if (iflink == 0) 175 return false; 176 177 parent_net = batadv_getlink_net(net_dev, net); 178 179 /* iflink to itself, most likely physical device */ 180 if (net == parent_net && iflink == net_dev->ifindex) 181 return false; 182 183 /* recurse over the parent device */ 184 parent_dev = __dev_get_by_index((struct net *)parent_net, iflink); 185 if (!parent_dev) { 186 pr_warn("Cannot find parent device. Skipping batadv-on-batadv check for %s\n", 187 net_dev->name); 188 return false; 189 } 190 191 if (batadv_mutual_parents(net_dev, net, parent_dev, parent_net)) 192 return false; 193 194 ret = batadv_is_on_batman_iface(parent_dev); 195 196 return ret; 197 } 198 199 static bool batadv_is_valid_iface(const struct net_device *net_dev) 200 { 201 if (net_dev->flags & IFF_LOOPBACK) 202 return false; 203 204 if (net_dev->type != ARPHRD_ETHER) 205 return false; 206 207 if (net_dev->addr_len != ETH_ALEN) 208 return false; 209 210 /* no batman over batman */ 211 if (batadv_is_on_batman_iface(net_dev)) 212 return false; 213 214 return true; 215 } 216 217 /** 218 * __batadv_get_real_netdev() - check if the given netdev struct is a virtual 219 * interface on top of another 'real' interface 220 * @netdev: the device to check 221 * 222 * Callers must hold the rtnl semaphore. You may want batadv_get_real_netdev() 223 * instead of this. 224 * 225 * Return: the 'real' net device or the original net device and NULL in case 226 * of an error. 227 */ 228 struct net_device *__batadv_get_real_netdev(struct net_device *netdev) 229 { 230 struct batadv_hard_iface *hard_iface = NULL; 231 struct net_device *real_netdev = NULL; 232 struct net *real_net; 233 struct net *net; 234 int iflink; 235 236 ASSERT_RTNL(); 237 238 if (!netdev) 239 return NULL; 240 241 iflink = dev_get_iflink(netdev); 242 if (iflink == 0) { 243 dev_hold(netdev); 244 return netdev; 245 } 246 247 hard_iface = batadv_hardif_get_by_netdev(netdev); 248 if (!hard_iface || !hard_iface->mesh_iface) 249 goto out; 250 251 net = dev_net(hard_iface->mesh_iface); 252 real_net = batadv_getlink_net(netdev, net); 253 254 /* iflink to itself, most likely physical device */ 255 if (net == real_net && netdev->ifindex == iflink) { 256 real_netdev = netdev; 257 dev_hold(real_netdev); 258 goto out; 259 } 260 261 real_netdev = dev_get_by_index(real_net, iflink); 262 263 out: 264 batadv_hardif_put(hard_iface); 265 return real_netdev; 266 } 267 268 /** 269 * batadv_get_real_netdev() - check if the given net_device struct is a virtual 270 * interface on top of another 'real' interface 271 * @net_device: the device to check 272 * 273 * Return: the 'real' net device or the original net device and NULL in case 274 * of an error. 275 */ 276 struct net_device *batadv_get_real_netdev(struct net_device *net_device) 277 { 278 struct net_device *real_netdev; 279 280 rtnl_lock(); 281 real_netdev = __batadv_get_real_netdev(net_device); 282 rtnl_unlock(); 283 284 return real_netdev; 285 } 286 287 /** 288 * batadv_is_wext_netdev() - check if the given net_device struct is a 289 * wext wifi interface 290 * @net_device: the device to check 291 * 292 * Return: true if the net device is a wext wireless device, false 293 * otherwise. 294 */ 295 static bool batadv_is_wext_netdev(struct net_device *net_device) 296 { 297 if (!net_device) 298 return false; 299 300 #ifdef CONFIG_WIRELESS_EXT 301 /* pre-cfg80211 drivers have to implement WEXT, so it is possible to 302 * check for wireless_handlers != NULL 303 */ 304 if (net_device->wireless_handlers) 305 return true; 306 #endif 307 308 return false; 309 } 310 311 /** 312 * batadv_is_cfg80211_netdev() - check if the given net_device struct is a 313 * cfg80211 wifi interface 314 * @net_device: the device to check 315 * 316 * Return: true if the net device is a cfg80211 wireless device, false 317 * otherwise. 318 */ 319 static bool batadv_is_cfg80211_netdev(struct net_device *net_device) 320 { 321 if (!net_device) 322 return false; 323 324 #if IS_ENABLED(CONFIG_CFG80211) 325 /* cfg80211 drivers have to set ieee80211_ptr */ 326 if (net_device->ieee80211_ptr) 327 return true; 328 #endif 329 330 return false; 331 } 332 333 /** 334 * batadv_wifi_flags_evaluate() - calculate wifi flags for net_device 335 * @net_device: the device to check 336 * 337 * Return: batadv_hard_iface_wifi_flags flags of the device 338 */ 339 static u32 batadv_wifi_flags_evaluate(struct net_device *net_device) 340 { 341 u32 wifi_flags = 0; 342 struct net_device *real_netdev; 343 344 if (batadv_is_wext_netdev(net_device)) 345 wifi_flags |= BATADV_HARDIF_WIFI_WEXT_DIRECT; 346 347 if (batadv_is_cfg80211_netdev(net_device)) 348 wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT; 349 350 real_netdev = __batadv_get_real_netdev(net_device); 351 if (!real_netdev) 352 return wifi_flags; 353 354 if (real_netdev == net_device) 355 goto out; 356 357 if (batadv_is_wext_netdev(real_netdev)) 358 wifi_flags |= BATADV_HARDIF_WIFI_WEXT_INDIRECT; 359 360 if (batadv_is_cfg80211_netdev(real_netdev)) 361 wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_INDIRECT; 362 363 out: 364 dev_put(real_netdev); 365 return wifi_flags; 366 } 367 368 /** 369 * batadv_netdev_get_wifi_flags() - retrieve wifi flags for net_device 370 * @net_dev: the device to check 371 * 372 * Return: batadv_hard_iface_wifi_flags flags of the device 373 */ 374 u32 batadv_netdev_get_wifi_flags(struct net_device *net_dev) 375 { 376 struct batadv_wifi_net_device_state *device_state; 377 u32 wifi_flags = 0; 378 379 rcu_read_lock(); 380 device_state = rhashtable_lookup_fast(&batadv_wifi_net_devices, 381 &net_dev, 382 batadv_wifi_net_devices_params); 383 if (device_state) 384 wifi_flags = READ_ONCE(device_state->wifi_flags); 385 rcu_read_unlock(); 386 387 return wifi_flags; 388 } 389 390 /** 391 * batadv_hardif_get_wifi_flags() - retrieve wifi flags for hard_iface 392 * @hard_iface: the device to check 393 * 394 * Return: batadv_hard_iface_wifi_flags flags of the device 395 */ 396 u32 batadv_hardif_get_wifi_flags(struct batadv_hard_iface *hard_iface) 397 { 398 if (!hard_iface) 399 return 0; 400 401 return batadv_netdev_get_wifi_flags(hard_iface->net_dev); 402 } 403 404 /** 405 * batadv_is_wifi_hardif() - check if the given hardif is a wifi interface 406 * @hard_iface: the device to check 407 * 408 * Return: true if the net device is a 802.11 wireless device, false otherwise. 409 */ 410 bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface) 411 { 412 u32 wifi_flags = batadv_hardif_get_wifi_flags(hard_iface); 413 414 return batadv_is_wifi(wifi_flags); 415 } 416 417 /** 418 * batadv_hardif_no_broadcast() - check whether (re)broadcast is necessary 419 * @if_outgoing: the outgoing interface checked and considered for (re)broadcast 420 * @orig_addr: the originator of this packet 421 * @orig_neigh: originator address of the forwarder we just got the packet from 422 * (NULL if we originated) 423 * 424 * Checks whether a packet needs to be (re)broadcasted on the given interface. 425 * 426 * Return: 427 * BATADV_HARDIF_BCAST_NORECIPIENT: No neighbor on interface 428 * BATADV_HARDIF_BCAST_DUPFWD: Just one neighbor, but it is the forwarder 429 * BATADV_HARDIF_BCAST_DUPORIG: Just one neighbor, but it is the originator 430 * BATADV_HARDIF_BCAST_OK: Several neighbors, must broadcast 431 */ 432 int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing, 433 u8 *orig_addr, u8 *orig_neigh) 434 { 435 struct batadv_hardif_neigh_node *hardif_neigh; 436 struct hlist_node *first; 437 int ret = BATADV_HARDIF_BCAST_OK; 438 439 rcu_read_lock(); 440 441 /* 0 neighbors -> no (re)broadcast */ 442 first = rcu_dereference(hlist_first_rcu(&if_outgoing->neigh_list)); 443 if (!first) { 444 ret = BATADV_HARDIF_BCAST_NORECIPIENT; 445 goto out; 446 } 447 448 /* >1 neighbors -> (re)broadcast */ 449 if (rcu_dereference(hlist_next_rcu(first))) 450 goto out; 451 452 hardif_neigh = hlist_entry(first, struct batadv_hardif_neigh_node, 453 list); 454 455 /* 1 neighbor, is the originator -> no rebroadcast */ 456 if (orig_addr && batadv_compare_eth(hardif_neigh->orig, orig_addr)) { 457 ret = BATADV_HARDIF_BCAST_DUPORIG; 458 /* 1 neighbor, is the one we received from -> no rebroadcast */ 459 } else if (orig_neigh && 460 batadv_compare_eth(hardif_neigh->orig, orig_neigh)) { 461 ret = BATADV_HARDIF_BCAST_DUPFWD; 462 } 463 464 out: 465 rcu_read_unlock(); 466 return ret; 467 } 468 469 static struct batadv_hard_iface * 470 batadv_hardif_get_active(struct net_device *mesh_iface) 471 { 472 struct batadv_hard_iface *hard_iface; 473 struct list_head *iter; 474 475 rcu_read_lock(); 476 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { 477 if (hard_iface->if_status == BATADV_IF_ACTIVE && 478 kref_get_unless_zero(&hard_iface->refcount)) 479 goto out; 480 } 481 482 hard_iface = NULL; 483 484 out: 485 rcu_read_unlock(); 486 return hard_iface; 487 } 488 489 static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv, 490 struct batadv_hard_iface *oldif) 491 { 492 struct batadv_hard_iface *primary_if; 493 494 primary_if = batadv_primary_if_get_selected(bat_priv); 495 if (!primary_if) 496 goto out; 497 498 batadv_dat_init_own_addr(bat_priv, primary_if); 499 batadv_bla_update_orig_address(bat_priv, primary_if, oldif); 500 out: 501 batadv_hardif_put(primary_if); 502 } 503 504 static void batadv_primary_if_select(struct batadv_priv *bat_priv, 505 struct batadv_hard_iface *new_hard_iface) 506 { 507 struct batadv_hard_iface *curr_hard_iface; 508 509 ASSERT_RTNL(); 510 511 if (new_hard_iface) 512 kref_get(&new_hard_iface->refcount); 513 514 curr_hard_iface = rcu_replace_pointer(bat_priv->primary_if, 515 new_hard_iface, 1); 516 517 if (!new_hard_iface) 518 goto out; 519 520 bat_priv->algo_ops->iface.primary_set(new_hard_iface); 521 batadv_primary_if_update_addr(bat_priv, curr_hard_iface); 522 523 out: 524 batadv_hardif_put(curr_hard_iface); 525 } 526 527 static bool 528 batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface) 529 { 530 if (hard_iface->net_dev->flags & IFF_UP) 531 return true; 532 533 return false; 534 } 535 536 static void batadv_check_known_mac_addr(const struct batadv_hard_iface *hard_iface) 537 { 538 struct net_device *mesh_iface = hard_iface->mesh_iface; 539 const struct batadv_hard_iface *tmp_hard_iface; 540 struct list_head *iter; 541 542 if (!mesh_iface) 543 return; 544 545 netdev_for_each_lower_private(mesh_iface, tmp_hard_iface, iter) { 546 if (tmp_hard_iface == hard_iface) 547 continue; 548 549 if (tmp_hard_iface->if_status == BATADV_IF_NOT_IN_USE) 550 continue; 551 552 if (!batadv_compare_eth(tmp_hard_iface->net_dev->dev_addr, 553 hard_iface->net_dev->dev_addr)) 554 continue; 555 556 pr_warn("The newly added mac address (%pM) already exists on: %s\n", 557 hard_iface->net_dev->dev_addr, tmp_hard_iface->net_dev->name); 558 pr_warn("It is strongly recommended to keep mac addresses unique to avoid problems!\n"); 559 } 560 } 561 562 /** 563 * batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom 564 * @mesh_iface: netdev struct of the mesh interface 565 */ 566 static void batadv_hardif_recalc_extra_skbroom(struct net_device *mesh_iface) 567 { 568 const struct batadv_hard_iface *hard_iface; 569 unsigned short lower_header_len = ETH_HLEN; 570 unsigned short lower_headroom = 0; 571 unsigned short lower_tailroom = 0; 572 unsigned short needed_headroom; 573 struct list_head *iter; 574 575 rcu_read_lock(); 576 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { 577 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) 578 continue; 579 580 lower_header_len = max_t(unsigned short, lower_header_len, 581 hard_iface->net_dev->hard_header_len); 582 583 lower_headroom = max_t(unsigned short, lower_headroom, 584 hard_iface->net_dev->needed_headroom); 585 586 lower_tailroom = max_t(unsigned short, lower_tailroom, 587 hard_iface->net_dev->needed_tailroom); 588 } 589 rcu_read_unlock(); 590 591 needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN); 592 needed_headroom += batadv_max_header_len(); 593 594 /* fragmentation headers don't strip the unicast/... header */ 595 needed_headroom += sizeof(struct batadv_frag_packet); 596 597 mesh_iface->needed_headroom = needed_headroom; 598 mesh_iface->needed_tailroom = lower_tailroom; 599 } 600 601 /** 602 * batadv_hardif_min_mtu() - Calculate maximum MTU for mesh interface 603 * @mesh_iface: netdev struct of the mesh interface 604 * 605 * Return: MTU for the mesh-interface (limited by the minimal MTU of all active 606 * slave interfaces) 607 */ 608 int batadv_hardif_min_mtu(struct net_device *mesh_iface) 609 { 610 struct batadv_priv *bat_priv = netdev_priv(mesh_iface); 611 const struct batadv_hard_iface *hard_iface; 612 struct list_head *iter; 613 int min_mtu = INT_MAX; 614 615 rcu_read_lock(); 616 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) { 617 if (hard_iface->if_status != BATADV_IF_ACTIVE && 618 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED) 619 continue; 620 621 min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu); 622 } 623 rcu_read_unlock(); 624 625 if (READ_ONCE(bat_priv->fragmentation) == 0) 626 goto out; 627 628 /* with fragmentation enabled the maximum size of internally generated 629 * packets such as translation table exchanges or tvlv containers, etc 630 * has to be calculated 631 */ 632 min_mtu = min_t(int, min_mtu, BATADV_FRAG_MAX_FRAG_SIZE); 633 min_mtu -= sizeof(struct batadv_frag_packet); 634 min_mtu *= BATADV_FRAG_MAX_FRAGMENTS; 635 636 out: 637 /* report to the other components the maximum amount of bytes that 638 * batman-adv can send over the wire (without considering the payload 639 * overhead). For example, this value is used by TT to compute the 640 * maximum local table size 641 */ 642 WRITE_ONCE(bat_priv->packet_size_max, min_mtu); 643 644 /* the real mesh-interface MTU is computed by removing the payload 645 * overhead from the maximum amount of bytes that was just computed. 646 */ 647 return min_t(int, min_mtu - batadv_max_header_len(), BATADV_MAX_MTU); 648 } 649 650 /** 651 * batadv_update_min_mtu() - Adjusts the MTU if a new interface with a smaller 652 * MTU appeared 653 * @mesh_iface: netdev struct of the mesh interface 654 */ 655 void batadv_update_min_mtu(struct net_device *mesh_iface) 656 { 657 struct batadv_priv *bat_priv = netdev_priv(mesh_iface); 658 int limit_mtu; 659 int mtu; 660 661 mtu = batadv_hardif_min_mtu(mesh_iface); 662 663 if (bat_priv->mtu_set_by_user) 664 limit_mtu = bat_priv->mtu_set_by_user; 665 else 666 limit_mtu = ETH_DATA_LEN; 667 668 mtu = min(mtu, limit_mtu); 669 dev_set_mtu(mesh_iface, mtu); 670 671 /* Check if the local translate table should be cleaned up to match a 672 * new (and smaller) MTU. 673 */ 674 batadv_tt_local_resize_to_mtu(mesh_iface); 675 } 676 677 static void 678 batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface) 679 { 680 struct batadv_priv *bat_priv; 681 struct batadv_hard_iface *primary_if = NULL; 682 683 if (hard_iface->if_status != BATADV_IF_INACTIVE) 684 goto out; 685 686 bat_priv = netdev_priv(hard_iface->mesh_iface); 687 688 bat_priv->algo_ops->iface.update_mac(hard_iface); 689 hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED; 690 691 /* the first active interface becomes our primary interface or 692 * the next active interface after the old primary interface was removed 693 */ 694 primary_if = batadv_primary_if_get_selected(bat_priv); 695 if (!primary_if) 696 batadv_primary_if_select(bat_priv, hard_iface); 697 698 batadv_info(hard_iface->mesh_iface, "Interface activated: %s\n", 699 hard_iface->net_dev->name); 700 701 batadv_update_min_mtu(hard_iface->mesh_iface); 702 703 if (bat_priv->algo_ops->iface.activate) 704 bat_priv->algo_ops->iface.activate(hard_iface); 705 706 out: 707 batadv_hardif_put(primary_if); 708 } 709 710 static void 711 batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface) 712 { 713 if (hard_iface->if_status != BATADV_IF_ACTIVE && 714 hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED) 715 return; 716 717 hard_iface->if_status = BATADV_IF_INACTIVE; 718 719 batadv_info(hard_iface->mesh_iface, "Interface deactivated: %s\n", 720 hard_iface->net_dev->name); 721 722 batadv_update_min_mtu(hard_iface->mesh_iface); 723 } 724 725 /** 726 * batadv_hardif_enable_interface() - Enslave hard interface to mesh interface 727 * @hard_iface: hard interface to add to mesh interface 728 * @mesh_iface: netdev struct of the mesh interface 729 * 730 * Return: 0 on success or negative error number in case of failure 731 */ 732 int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, 733 struct net_device *mesh_iface) 734 { 735 struct batadv_priv *bat_priv; 736 __be16 ethertype = htons(ETH_P_BATMAN); 737 int max_header_len = batadv_max_header_len(); 738 unsigned int required_mtu; 739 unsigned int hardif_mtu; 740 bool fragmentation; 741 int ret; 742 743 hardif_mtu = READ_ONCE(hard_iface->net_dev->mtu); 744 required_mtu = READ_ONCE(mesh_iface->mtu) + max_header_len; 745 746 if (hardif_mtu < ETH_MIN_MTU + max_header_len) 747 return -EINVAL; 748 749 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 750 goto out; 751 752 kref_get(&hard_iface->refcount); 753 754 netdev_hold(mesh_iface, &hard_iface->meshif_dev_tracker, GFP_ATOMIC); 755 hard_iface->mesh_iface = mesh_iface; 756 bat_priv = netdev_priv(hard_iface->mesh_iface); 757 758 ret = netdev_master_upper_dev_link(hard_iface->net_dev, 759 mesh_iface, hard_iface, NULL, NULL); 760 if (ret) 761 goto err_dev; 762 763 ret = bat_priv->algo_ops->iface.enable(hard_iface); 764 if (ret < 0) 765 goto err_upper; 766 767 hard_iface->if_status = BATADV_IF_INACTIVE; 768 769 kref_get(&hard_iface->refcount); 770 hard_iface->batman_adv_ptype.type = ethertype; 771 hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv; 772 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; 773 dev_add_pack(&hard_iface->batman_adv_ptype); 774 775 batadv_info(hard_iface->mesh_iface, "Adding interface: %s\n", 776 hard_iface->net_dev->name); 777 778 fragmentation = READ_ONCE(bat_priv->fragmentation); 779 if (fragmentation && hardif_mtu < required_mtu) 780 batadv_info(hard_iface->mesh_iface, 781 "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", 782 hard_iface->net_dev->name, hardif_mtu, 783 required_mtu); 784 785 if (!fragmentation && hardif_mtu < required_mtu) 786 batadv_info(hard_iface->mesh_iface, 787 "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", 788 hard_iface->net_dev->name, hardif_mtu, 789 required_mtu); 790 791 batadv_check_known_mac_addr(hard_iface); 792 793 if (batadv_hardif_is_iface_up(hard_iface)) 794 batadv_hardif_activate_interface(hard_iface); 795 else 796 batadv_err(hard_iface->mesh_iface, 797 "Not using interface %s (retrying later): interface not active\n", 798 hard_iface->net_dev->name); 799 800 batadv_hardif_recalc_extra_skbroom(mesh_iface); 801 802 if (bat_priv->algo_ops->iface.enabled) 803 bat_priv->algo_ops->iface.enabled(hard_iface); 804 805 out: 806 return 0; 807 808 err_upper: 809 netdev_upper_dev_unlink(hard_iface->net_dev, mesh_iface); 810 err_dev: 811 hard_iface->mesh_iface = NULL; 812 netdev_put(mesh_iface, &hard_iface->meshif_dev_tracker); 813 batadv_hardif_put(hard_iface); 814 return ret; 815 } 816 817 /** 818 * batadv_hardif_cnt() - get number of interfaces enslaved to mesh interface 819 * @mesh_iface: mesh interface to check 820 * 821 * This function is only using RCU for locking - the result can therefore be 822 * off when another function is modifying the list at the same time. The 823 * caller can use the rtnl_lock to make sure that the count is accurate. 824 * 825 * Return: number of connected/enslaved hard interfaces 826 */ 827 static size_t batadv_hardif_cnt(struct net_device *mesh_iface) 828 { 829 struct batadv_hard_iface *hard_iface; 830 struct list_head *iter; 831 size_t count = 0; 832 833 rcu_read_lock(); 834 netdev_for_each_lower_private_rcu(mesh_iface, hard_iface, iter) 835 count++; 836 rcu_read_unlock(); 837 838 return count; 839 } 840 841 /** 842 * batadv_hardif_disable_interface() - Remove hard interface from mesh interface 843 * @hard_iface: hard interface to be removed 844 */ 845 void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface) 846 { 847 struct batadv_priv *bat_priv = netdev_priv(hard_iface->mesh_iface); 848 struct batadv_hard_iface *primary_if = NULL; 849 850 batadv_hardif_deactivate_interface(hard_iface); 851 852 if (hard_iface->if_status != BATADV_IF_INACTIVE) 853 goto out; 854 855 batadv_info(hard_iface->mesh_iface, "Removing interface: %s\n", 856 hard_iface->net_dev->name); 857 dev_remove_pack(&hard_iface->batman_adv_ptype); 858 batadv_hardif_put(hard_iface); 859 860 primary_if = batadv_primary_if_get_selected(bat_priv); 861 if (hard_iface == primary_if) { 862 struct batadv_hard_iface *new_if; 863 864 new_if = batadv_hardif_get_active(hard_iface->mesh_iface); 865 batadv_primary_if_select(bat_priv, new_if); 866 867 batadv_hardif_put(new_if); 868 } 869 870 bat_priv->algo_ops->iface.disable(hard_iface); 871 hard_iface->if_status = BATADV_IF_NOT_IN_USE; 872 873 /* delete all references to this hard_iface */ 874 batadv_purge_orig_ref(bat_priv); 875 batadv_purge_outstanding_packets(bat_priv, hard_iface); 876 netdev_put(hard_iface->mesh_iface, &hard_iface->meshif_dev_tracker); 877 878 netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->mesh_iface); 879 batadv_hardif_recalc_extra_skbroom(hard_iface->mesh_iface); 880 881 /* nobody uses this interface anymore */ 882 if (batadv_hardif_cnt(hard_iface->mesh_iface) <= 1) 883 batadv_gw_check_client_stop(bat_priv); 884 885 hard_iface->mesh_iface = NULL; 886 batadv_hardif_put(hard_iface); 887 888 out: 889 batadv_hardif_put(primary_if); 890 } 891 892 static struct batadv_hard_iface * 893 batadv_hardif_add_interface(struct net_device *net_dev) 894 { 895 struct batadv_hard_iface *hard_iface; 896 897 ASSERT_RTNL(); 898 899 if (!batadv_is_valid_iface(net_dev)) 900 return NULL; 901 902 hard_iface = kzalloc_obj(*hard_iface, GFP_ATOMIC); 903 if (!hard_iface) 904 return NULL; 905 906 netdev_hold(net_dev, &hard_iface->dev_tracker, GFP_ATOMIC); 907 hard_iface->net_dev = net_dev; 908 909 hard_iface->mesh_iface = NULL; 910 hard_iface->if_status = BATADV_IF_NOT_IN_USE; 911 912 INIT_LIST_HEAD(&hard_iface->list); 913 INIT_HLIST_HEAD(&hard_iface->neigh_list); 914 915 mutex_init(&hard_iface->bat_iv.ogm_buff_mutex); 916 spin_lock_init(&hard_iface->neigh_list_lock); 917 kref_init(&hard_iface->refcount); 918 919 hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; 920 if (batadv_is_wifi_hardif(hard_iface)) 921 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; 922 923 WRITE_ONCE(hard_iface->hop_penalty, 0); 924 925 batadv_v_hardif_init(hard_iface); 926 927 kref_get(&hard_iface->refcount); 928 list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); 929 batadv_hardif_generation++; 930 931 return hard_iface; 932 } 933 934 static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) 935 { 936 ASSERT_RTNL(); 937 938 /* first deactivate interface */ 939 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 940 batadv_hardif_disable_interface(hard_iface); 941 942 if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) 943 return; 944 945 hard_iface->if_status = BATADV_IF_TO_BE_REMOVED; 946 batadv_hardif_put(hard_iface); 947 } 948 949 /** 950 * batadv_hard_if_event_meshif() - Handle events for mesh interfaces 951 * @event: NETDEV_* event to handle 952 * @net_dev: net_device which generated an event 953 * 954 * Return: NOTIFY_* result 955 */ 956 static int batadv_hard_if_event_meshif(unsigned long event, 957 struct net_device *net_dev) 958 { 959 struct batadv_priv *bat_priv; 960 961 switch (event) { 962 case NETDEV_REGISTER: 963 bat_priv = netdev_priv(net_dev); 964 batadv_meshif_create_vlan(bat_priv, BATADV_NO_FLAGS); 965 break; 966 } 967 968 return NOTIFY_DONE; 969 } 970 971 /** 972 * batadv_wifi_net_device_insert() - save information about wifi net_device 973 * @net_dev: net_device to add to batadv_wifi_net_devices 974 * @wifi_flags: extracted batadv_hard_iface_wifi_flags of a net_device 975 * 976 * Return: 0 on success, negative value on error 977 */ 978 static int 979 batadv_wifi_net_device_insert(struct net_device *net_dev, u32 wifi_flags) 980 { 981 struct batadv_wifi_net_device_state *device_state; 982 int ret; 983 984 ASSERT_RTNL(); 985 986 device_state = kzalloc_obj(*device_state, GFP_KERNEL); 987 if (!device_state) 988 return -ENOMEM; 989 990 netdev_hold(net_dev, &device_state->dev_tracker, GFP_KERNEL); 991 device_state->netdev = net_dev; 992 WRITE_ONCE(device_state->wifi_flags, wifi_flags); 993 994 ret = rhashtable_insert_fast(&batadv_wifi_net_devices, &device_state->l, 995 batadv_wifi_net_devices_params); 996 if (ret < 0) 997 goto err_free; 998 999 return 0; 1000 1001 err_free: 1002 netdev_put(device_state->netdev, &device_state->dev_tracker); 1003 kfree(device_state); 1004 return ret; 1005 } 1006 1007 /** 1008 * batadv_wifi_net_device_remove() - remove information about wifi net_device 1009 * @device_state: wifi net_device state to remove from batadv_wifi_net_devices 1010 */ 1011 static void 1012 batadv_wifi_net_device_remove(struct batadv_wifi_net_device_state *device_state) 1013 { 1014 ASSERT_RTNL(); 1015 1016 rhashtable_remove_fast(&batadv_wifi_net_devices, &device_state->l, 1017 batadv_wifi_net_devices_params); 1018 netdev_put(device_state->netdev, &device_state->dev_tracker); 1019 kfree_rcu(device_state, rcu); 1020 } 1021 1022 /** 1023 * batadv_wifi_net_device_update() - update wifi state of net_device 1024 * @net_dev: net_device to update in batadv_wifi_net_devices 1025 * 1026 * The device will only be stored in batadv_wifi_net_devices when 1027 * it could be identified as wifi device. If the net_device is no 1028 * longer a wifi device, it is automatically removed from 1029 * batadv_wifi_net_devices. 1030 */ 1031 static void 1032 batadv_wifi_net_device_update(struct net_device *net_dev) 1033 { 1034 struct batadv_wifi_net_device_state *device_state; 1035 u32 wifi_flags; 1036 1037 ASSERT_RTNL(); 1038 1039 wifi_flags = batadv_wifi_flags_evaluate(net_dev); 1040 device_state = rhashtable_lookup_fast(&batadv_wifi_net_devices, 1041 &net_dev, 1042 batadv_wifi_net_devices_params); 1043 1044 if (device_state) { 1045 if (batadv_is_wifi(wifi_flags)) 1046 WRITE_ONCE(device_state->wifi_flags, wifi_flags); 1047 else 1048 batadv_wifi_net_device_remove(device_state); 1049 } else if (batadv_is_wifi(wifi_flags)) { 1050 batadv_wifi_net_device_insert(net_dev, wifi_flags); 1051 } 1052 } 1053 1054 /** 1055 * batadv_wifi_net_device_unregister() - remove wifi state of net_device 1056 * @net_dev: net_device to remove from batadv_wifi_net_devices 1057 */ 1058 static void 1059 batadv_wifi_net_device_unregister(struct net_device *net_dev) 1060 { 1061 struct batadv_wifi_net_device_state *device_state; 1062 1063 ASSERT_RTNL(); 1064 1065 device_state = rhashtable_lookup_fast(&batadv_wifi_net_devices, 1066 &net_dev, 1067 batadv_wifi_net_devices_params); 1068 if (!device_state) 1069 return; 1070 1071 batadv_wifi_net_device_remove(device_state); 1072 } 1073 1074 /** 1075 * batadv_wifi_net_device_event() - handle network events for batadv_wifi_net_devices 1076 * @event: enum netdev_cmd event to handle 1077 * @net_dev: net_device to update in batadv_wifi_net_devices 1078 */ 1079 static void batadv_wifi_net_device_event(unsigned long event, 1080 struct net_device *net_dev) 1081 { 1082 switch (event) { 1083 case NETDEV_REGISTER: 1084 case NETDEV_POST_TYPE_CHANGE: 1085 case NETDEV_CHANGEUPPER: 1086 batadv_wifi_net_device_update(net_dev); 1087 break; 1088 case NETDEV_UNREGISTER: 1089 case NETDEV_PRE_TYPE_CHANGE: 1090 batadv_wifi_net_device_unregister(net_dev); 1091 break; 1092 } 1093 } 1094 1095 static int batadv_hard_if_event(struct notifier_block *this, 1096 unsigned long event, void *ptr) 1097 { 1098 struct net_device *net_dev = netdev_notifier_info_to_dev(ptr); 1099 struct batadv_hard_iface *hard_iface; 1100 struct batadv_hard_iface *primary_if = NULL; 1101 struct batadv_priv *bat_priv; 1102 1103 if (batadv_meshif_is_valid(net_dev)) 1104 return batadv_hard_if_event_meshif(event, net_dev); 1105 1106 batadv_wifi_net_device_event(event, net_dev); 1107 1108 hard_iface = batadv_hardif_get_by_netdev(net_dev); 1109 if (!hard_iface && (event == NETDEV_REGISTER || 1110 event == NETDEV_POST_TYPE_CHANGE)) 1111 hard_iface = batadv_hardif_add_interface(net_dev); 1112 1113 if (!hard_iface) 1114 goto out; 1115 1116 switch (event) { 1117 case NETDEV_UP: 1118 batadv_hardif_activate_interface(hard_iface); 1119 break; 1120 case NETDEV_GOING_DOWN: 1121 case NETDEV_DOWN: 1122 batadv_hardif_deactivate_interface(hard_iface); 1123 break; 1124 case NETDEV_UNREGISTER: 1125 case NETDEV_PRE_TYPE_CHANGE: 1126 list_del_rcu(&hard_iface->list); 1127 batadv_hardif_generation++; 1128 1129 batadv_hardif_remove_interface(hard_iface); 1130 break; 1131 case NETDEV_CHANGEMTU: 1132 if (hard_iface->mesh_iface) 1133 batadv_update_min_mtu(hard_iface->mesh_iface); 1134 break; 1135 case NETDEV_CHANGEADDR: 1136 if (hard_iface->if_status == BATADV_IF_NOT_IN_USE) 1137 goto hardif_put; 1138 1139 batadv_check_known_mac_addr(hard_iface); 1140 1141 bat_priv = netdev_priv(hard_iface->mesh_iface); 1142 bat_priv->algo_ops->iface.update_mac(hard_iface); 1143 1144 primary_if = batadv_primary_if_get_selected(bat_priv); 1145 if (!primary_if) 1146 goto hardif_put; 1147 1148 if (hard_iface == primary_if) 1149 batadv_primary_if_update_addr(bat_priv, NULL); 1150 break; 1151 case NETDEV_REGISTER: 1152 case NETDEV_POST_TYPE_CHANGE: 1153 case NETDEV_CHANGEUPPER: 1154 if (batadv_is_wifi_hardif(hard_iface)) 1155 hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS; 1156 break; 1157 default: 1158 break; 1159 } 1160 1161 hardif_put: 1162 batadv_hardif_put(hard_iface); 1163 out: 1164 batadv_hardif_put(primary_if); 1165 return NOTIFY_DONE; 1166 } 1167 1168 struct notifier_block batadv_hard_if_notifier = { 1169 .notifier_call = batadv_hard_if_event, 1170 }; 1171 1172 /** 1173 * batadv_wifi_net_devices_init() - Initialize wifi devices cache 1174 * 1175 * Return: 0 on success, negative error code on failure 1176 */ 1177 int __init batadv_wifi_net_devices_init(void) 1178 { 1179 return rhashtable_init(&batadv_wifi_net_devices, 1180 &batadv_wifi_net_devices_params); 1181 } 1182 1183 /** 1184 * batadv_wifi_net_devices_deinit() - Deinitialize wifi devices cache 1185 */ 1186 void batadv_wifi_net_devices_deinit(void) 1187 { 1188 /* just destroy table. entries should have been removed by 1189 * unregister_netdevice_notifier() and the corresponding 1190 * NETDEV_UNREGISTER events 1191 */ 1192 rhashtable_destroy(&batadv_wifi_net_devices); 1193 } 1194