1 /* 2 * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors: 3 * 4 * Marek Lindner, Simon Wunderlich 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of version 2 of the GNU General Public 8 * License as published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 18 * 02110-1301, USA 19 * 20 */ 21 22 #include "main.h" 23 #include "hard-interface.h" 24 #include "soft-interface.h" 25 #include "send.h" 26 #include "translation-table.h" 27 #include "routing.h" 28 #include "bat_sysfs.h" 29 #include "originator.h" 30 #include "hash.h" 31 #include "bat_ogm.h" 32 33 #include <linux/if_arp.h> 34 35 36 static int batman_skb_recv(struct sk_buff *skb, 37 struct net_device *dev, 38 struct packet_type *ptype, 39 struct net_device *orig_dev); 40 41 void hardif_free_rcu(struct rcu_head *rcu) 42 { 43 struct hard_iface *hard_iface; 44 45 hard_iface = container_of(rcu, struct hard_iface, rcu); 46 dev_put(hard_iface->net_dev); 47 kfree(hard_iface); 48 } 49 50 struct hard_iface *hardif_get_by_netdev(const struct net_device *net_dev) 51 { 52 struct hard_iface *hard_iface; 53 54 rcu_read_lock(); 55 list_for_each_entry_rcu(hard_iface, &hardif_list, list) { 56 if (hard_iface->net_dev == net_dev && 57 atomic_inc_not_zero(&hard_iface->refcount)) 58 goto out; 59 } 60 61 hard_iface = NULL; 62 63 out: 64 rcu_read_unlock(); 65 return hard_iface; 66 } 67 68 static int is_valid_iface(const struct net_device *net_dev) 69 { 70 if (net_dev->flags & IFF_LOOPBACK) 71 return 0; 72 73 if (net_dev->type != ARPHRD_ETHER) 74 return 0; 75 76 if (net_dev->addr_len != ETH_ALEN) 77 return 0; 78 79 /* no batman over batman */ 80 if (softif_is_valid(net_dev)) 81 return 0; 82 83 /* Device is being bridged */ 84 /* if (net_dev->priv_flags & IFF_BRIDGE_PORT) 85 return 0; */ 86 87 return 1; 88 } 89 90 static struct hard_iface *hardif_get_active(const struct net_device *soft_iface) 91 { 92 struct hard_iface *hard_iface; 93 94 rcu_read_lock(); 95 list_for_each_entry_rcu(hard_iface, &hardif_list, list) { 96 if (hard_iface->soft_iface != soft_iface) 97 continue; 98 99 if (hard_iface->if_status == IF_ACTIVE && 100 atomic_inc_not_zero(&hard_iface->refcount)) 101 goto out; 102 } 103 104 hard_iface = NULL; 105 106 out: 107 rcu_read_unlock(); 108 return hard_iface; 109 } 110 111 static void primary_if_update_addr(struct bat_priv *bat_priv) 112 { 113 struct vis_packet *vis_packet; 114 struct hard_iface *primary_if; 115 116 primary_if = primary_if_get_selected(bat_priv); 117 if (!primary_if) 118 goto out; 119 120 vis_packet = (struct vis_packet *) 121 bat_priv->my_vis_info->skb_packet->data; 122 memcpy(vis_packet->vis_orig, primary_if->net_dev->dev_addr, ETH_ALEN); 123 memcpy(vis_packet->sender_orig, 124 primary_if->net_dev->dev_addr, ETH_ALEN); 125 126 out: 127 if (primary_if) 128 hardif_free_ref(primary_if); 129 } 130 131 static void primary_if_select(struct bat_priv *bat_priv, 132 struct hard_iface *new_hard_iface) 133 { 134 struct hard_iface *curr_hard_iface; 135 136 ASSERT_RTNL(); 137 138 if (new_hard_iface && !atomic_inc_not_zero(&new_hard_iface->refcount)) 139 new_hard_iface = NULL; 140 141 curr_hard_iface = rcu_dereference_protected(bat_priv->primary_if, 1); 142 rcu_assign_pointer(bat_priv->primary_if, new_hard_iface); 143 144 if (curr_hard_iface) 145 hardif_free_ref(curr_hard_iface); 146 147 if (!new_hard_iface) 148 return; 149 150 bat_ogm_init_primary(new_hard_iface); 151 primary_if_update_addr(bat_priv); 152 } 153 154 static bool hardif_is_iface_up(const struct hard_iface *hard_iface) 155 { 156 if (hard_iface->net_dev->flags & IFF_UP) 157 return true; 158 159 return false; 160 } 161 162 static void check_known_mac_addr(const struct net_device *net_dev) 163 { 164 const struct hard_iface *hard_iface; 165 166 rcu_read_lock(); 167 list_for_each_entry_rcu(hard_iface, &hardif_list, list) { 168 if ((hard_iface->if_status != IF_ACTIVE) && 169 (hard_iface->if_status != IF_TO_BE_ACTIVATED)) 170 continue; 171 172 if (hard_iface->net_dev == net_dev) 173 continue; 174 175 if (!compare_eth(hard_iface->net_dev->dev_addr, 176 net_dev->dev_addr)) 177 continue; 178 179 pr_warning("The newly added mac address (%pM) already exists " 180 "on: %s\n", net_dev->dev_addr, 181 hard_iface->net_dev->name); 182 pr_warning("It is strongly recommended to keep mac addresses " 183 "unique to avoid problems!\n"); 184 } 185 rcu_read_unlock(); 186 } 187 188 int hardif_min_mtu(struct net_device *soft_iface) 189 { 190 const struct bat_priv *bat_priv = netdev_priv(soft_iface); 191 const struct hard_iface *hard_iface; 192 /* allow big frames if all devices are capable to do so 193 * (have MTU > 1500 + BAT_HEADER_LEN) */ 194 int min_mtu = ETH_DATA_LEN; 195 196 if (atomic_read(&bat_priv->fragmentation)) 197 goto out; 198 199 rcu_read_lock(); 200 list_for_each_entry_rcu(hard_iface, &hardif_list, list) { 201 if ((hard_iface->if_status != IF_ACTIVE) && 202 (hard_iface->if_status != IF_TO_BE_ACTIVATED)) 203 continue; 204 205 if (hard_iface->soft_iface != soft_iface) 206 continue; 207 208 min_mtu = min_t(int, hard_iface->net_dev->mtu - BAT_HEADER_LEN, 209 min_mtu); 210 } 211 rcu_read_unlock(); 212 out: 213 return min_mtu; 214 } 215 216 /* adjusts the MTU if a new interface with a smaller MTU appeared. */ 217 void update_min_mtu(struct net_device *soft_iface) 218 { 219 int min_mtu; 220 221 min_mtu = hardif_min_mtu(soft_iface); 222 if (soft_iface->mtu != min_mtu) 223 soft_iface->mtu = min_mtu; 224 } 225 226 static void hardif_activate_interface(struct hard_iface *hard_iface) 227 { 228 struct bat_priv *bat_priv; 229 struct hard_iface *primary_if = NULL; 230 231 if (hard_iface->if_status != IF_INACTIVE) 232 goto out; 233 234 bat_priv = netdev_priv(hard_iface->soft_iface); 235 236 bat_ogm_update_mac(hard_iface); 237 hard_iface->if_status = IF_TO_BE_ACTIVATED; 238 239 /** 240 * the first active interface becomes our primary interface or 241 * the next active interface after the old primary interface was removed 242 */ 243 primary_if = primary_if_get_selected(bat_priv); 244 if (!primary_if) 245 primary_if_select(bat_priv, hard_iface); 246 247 bat_info(hard_iface->soft_iface, "Interface activated: %s\n", 248 hard_iface->net_dev->name); 249 250 update_min_mtu(hard_iface->soft_iface); 251 252 out: 253 if (primary_if) 254 hardif_free_ref(primary_if); 255 } 256 257 static void hardif_deactivate_interface(struct hard_iface *hard_iface) 258 { 259 if ((hard_iface->if_status != IF_ACTIVE) && 260 (hard_iface->if_status != IF_TO_BE_ACTIVATED)) 261 return; 262 263 hard_iface->if_status = IF_INACTIVE; 264 265 bat_info(hard_iface->soft_iface, "Interface deactivated: %s\n", 266 hard_iface->net_dev->name); 267 268 update_min_mtu(hard_iface->soft_iface); 269 } 270 271 int hardif_enable_interface(struct hard_iface *hard_iface, 272 const char *iface_name) 273 { 274 struct bat_priv *bat_priv; 275 struct net_device *soft_iface; 276 int ret; 277 278 if (hard_iface->if_status != IF_NOT_IN_USE) 279 goto out; 280 281 if (!atomic_inc_not_zero(&hard_iface->refcount)) 282 goto out; 283 284 soft_iface = dev_get_by_name(&init_net, iface_name); 285 286 if (!soft_iface) { 287 soft_iface = softif_create(iface_name); 288 289 if (!soft_iface) { 290 ret = -ENOMEM; 291 goto err; 292 } 293 294 /* dev_get_by_name() increases the reference counter for us */ 295 dev_hold(soft_iface); 296 } 297 298 if (!softif_is_valid(soft_iface)) { 299 pr_err("Can't create batman mesh interface %s: " 300 "already exists as regular interface\n", 301 soft_iface->name); 302 dev_put(soft_iface); 303 ret = -EINVAL; 304 goto err; 305 } 306 307 hard_iface->soft_iface = soft_iface; 308 bat_priv = netdev_priv(hard_iface->soft_iface); 309 310 bat_ogm_init(hard_iface); 311 312 if (!hard_iface->packet_buff) { 313 bat_err(hard_iface->soft_iface, "Can't add interface packet " 314 "(%s): out of memory\n", hard_iface->net_dev->name); 315 ret = -ENOMEM; 316 goto err; 317 } 318 319 hard_iface->if_num = bat_priv->num_ifaces; 320 bat_priv->num_ifaces++; 321 hard_iface->if_status = IF_INACTIVE; 322 orig_hash_add_if(hard_iface, bat_priv->num_ifaces); 323 324 hard_iface->batman_adv_ptype.type = __constant_htons(ETH_P_BATMAN); 325 hard_iface->batman_adv_ptype.func = batman_skb_recv; 326 hard_iface->batman_adv_ptype.dev = hard_iface->net_dev; 327 dev_add_pack(&hard_iface->batman_adv_ptype); 328 329 atomic_set(&hard_iface->seqno, 1); 330 atomic_set(&hard_iface->frag_seqno, 1); 331 bat_info(hard_iface->soft_iface, "Adding interface: %s\n", 332 hard_iface->net_dev->name); 333 334 if (atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < 335 ETH_DATA_LEN + BAT_HEADER_LEN) 336 bat_info(hard_iface->soft_iface, 337 "The MTU of interface %s is too small (%i) to handle " 338 "the transport of batman-adv packets. Packets going " 339 "over this interface will be fragmented on layer2 " 340 "which could impact the performance. Setting the MTU " 341 "to %zi would solve the problem.\n", 342 hard_iface->net_dev->name, hard_iface->net_dev->mtu, 343 ETH_DATA_LEN + BAT_HEADER_LEN); 344 345 if (!atomic_read(&bat_priv->fragmentation) && hard_iface->net_dev->mtu < 346 ETH_DATA_LEN + BAT_HEADER_LEN) 347 bat_info(hard_iface->soft_iface, 348 "The MTU of interface %s is too small (%i) to handle " 349 "the transport of batman-adv packets. If you experience" 350 " problems getting traffic through try increasing the " 351 "MTU to %zi.\n", 352 hard_iface->net_dev->name, hard_iface->net_dev->mtu, 353 ETH_DATA_LEN + BAT_HEADER_LEN); 354 355 if (hardif_is_iface_up(hard_iface)) 356 hardif_activate_interface(hard_iface); 357 else 358 bat_err(hard_iface->soft_iface, "Not using interface %s " 359 "(retrying later): interface not active\n", 360 hard_iface->net_dev->name); 361 362 /* begin scheduling originator messages on that interface */ 363 schedule_bat_ogm(hard_iface); 364 365 out: 366 return 0; 367 368 err: 369 hardif_free_ref(hard_iface); 370 return ret; 371 } 372 373 void hardif_disable_interface(struct hard_iface *hard_iface) 374 { 375 struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface); 376 struct hard_iface *primary_if = NULL; 377 378 if (hard_iface->if_status == IF_ACTIVE) 379 hardif_deactivate_interface(hard_iface); 380 381 if (hard_iface->if_status != IF_INACTIVE) 382 goto out; 383 384 bat_info(hard_iface->soft_iface, "Removing interface: %s\n", 385 hard_iface->net_dev->name); 386 dev_remove_pack(&hard_iface->batman_adv_ptype); 387 388 bat_priv->num_ifaces--; 389 orig_hash_del_if(hard_iface, bat_priv->num_ifaces); 390 391 primary_if = primary_if_get_selected(bat_priv); 392 if (hard_iface == primary_if) { 393 struct hard_iface *new_if; 394 395 new_if = hardif_get_active(hard_iface->soft_iface); 396 primary_if_select(bat_priv, new_if); 397 398 if (new_if) 399 hardif_free_ref(new_if); 400 } 401 402 kfree(hard_iface->packet_buff); 403 hard_iface->packet_buff = NULL; 404 hard_iface->if_status = IF_NOT_IN_USE; 405 406 /* delete all references to this hard_iface */ 407 purge_orig_ref(bat_priv); 408 purge_outstanding_packets(bat_priv, hard_iface); 409 dev_put(hard_iface->soft_iface); 410 411 /* nobody uses this interface anymore */ 412 if (!bat_priv->num_ifaces) 413 softif_destroy(hard_iface->soft_iface); 414 415 hard_iface->soft_iface = NULL; 416 hardif_free_ref(hard_iface); 417 418 out: 419 if (primary_if) 420 hardif_free_ref(primary_if); 421 } 422 423 static struct hard_iface *hardif_add_interface(struct net_device *net_dev) 424 { 425 struct hard_iface *hard_iface; 426 int ret; 427 428 ASSERT_RTNL(); 429 430 ret = is_valid_iface(net_dev); 431 if (ret != 1) 432 goto out; 433 434 dev_hold(net_dev); 435 436 hard_iface = kmalloc(sizeof(*hard_iface), GFP_ATOMIC); 437 if (!hard_iface) 438 goto release_dev; 439 440 ret = sysfs_add_hardif(&hard_iface->hardif_obj, net_dev); 441 if (ret) 442 goto free_if; 443 444 hard_iface->if_num = -1; 445 hard_iface->net_dev = net_dev; 446 hard_iface->soft_iface = NULL; 447 hard_iface->if_status = IF_NOT_IN_USE; 448 INIT_LIST_HEAD(&hard_iface->list); 449 /* extra reference for return */ 450 atomic_set(&hard_iface->refcount, 2); 451 452 check_known_mac_addr(hard_iface->net_dev); 453 list_add_tail_rcu(&hard_iface->list, &hardif_list); 454 455 return hard_iface; 456 457 free_if: 458 kfree(hard_iface); 459 release_dev: 460 dev_put(net_dev); 461 out: 462 return NULL; 463 } 464 465 static void hardif_remove_interface(struct hard_iface *hard_iface) 466 { 467 ASSERT_RTNL(); 468 469 /* first deactivate interface */ 470 if (hard_iface->if_status != IF_NOT_IN_USE) 471 hardif_disable_interface(hard_iface); 472 473 if (hard_iface->if_status != IF_NOT_IN_USE) 474 return; 475 476 hard_iface->if_status = IF_TO_BE_REMOVED; 477 sysfs_del_hardif(&hard_iface->hardif_obj); 478 hardif_free_ref(hard_iface); 479 } 480 481 void hardif_remove_interfaces(void) 482 { 483 struct hard_iface *hard_iface, *hard_iface_tmp; 484 485 rtnl_lock(); 486 list_for_each_entry_safe(hard_iface, hard_iface_tmp, 487 &hardif_list, list) { 488 list_del_rcu(&hard_iface->list); 489 hardif_remove_interface(hard_iface); 490 } 491 rtnl_unlock(); 492 } 493 494 static int hard_if_event(struct notifier_block *this, 495 unsigned long event, void *ptr) 496 { 497 struct net_device *net_dev = ptr; 498 struct hard_iface *hard_iface = hardif_get_by_netdev(net_dev); 499 struct hard_iface *primary_if = NULL; 500 struct bat_priv *bat_priv; 501 502 if (!hard_iface && event == NETDEV_REGISTER) 503 hard_iface = hardif_add_interface(net_dev); 504 505 if (!hard_iface) 506 goto out; 507 508 switch (event) { 509 case NETDEV_UP: 510 hardif_activate_interface(hard_iface); 511 break; 512 case NETDEV_GOING_DOWN: 513 case NETDEV_DOWN: 514 hardif_deactivate_interface(hard_iface); 515 break; 516 case NETDEV_UNREGISTER: 517 list_del_rcu(&hard_iface->list); 518 519 hardif_remove_interface(hard_iface); 520 break; 521 case NETDEV_CHANGEMTU: 522 if (hard_iface->soft_iface) 523 update_min_mtu(hard_iface->soft_iface); 524 break; 525 case NETDEV_CHANGEADDR: 526 if (hard_iface->if_status == IF_NOT_IN_USE) 527 goto hardif_put; 528 529 check_known_mac_addr(hard_iface->net_dev); 530 bat_ogm_update_mac(hard_iface); 531 532 bat_priv = netdev_priv(hard_iface->soft_iface); 533 primary_if = primary_if_get_selected(bat_priv); 534 if (!primary_if) 535 goto hardif_put; 536 537 if (hard_iface == primary_if) 538 primary_if_update_addr(bat_priv); 539 break; 540 default: 541 break; 542 } 543 544 hardif_put: 545 hardif_free_ref(hard_iface); 546 out: 547 if (primary_if) 548 hardif_free_ref(primary_if); 549 return NOTIFY_DONE; 550 } 551 552 /* incoming packets with the batman ethertype received on any active hard 553 * interface */ 554 static int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, 555 struct packet_type *ptype, 556 struct net_device *orig_dev) 557 { 558 struct bat_priv *bat_priv; 559 struct batman_ogm_packet *batman_ogm_packet; 560 struct hard_iface *hard_iface; 561 int ret; 562 563 hard_iface = container_of(ptype, struct hard_iface, batman_adv_ptype); 564 skb = skb_share_check(skb, GFP_ATOMIC); 565 566 /* skb was released by skb_share_check() */ 567 if (!skb) 568 goto err_out; 569 570 /* packet should hold at least type and version */ 571 if (unlikely(!pskb_may_pull(skb, 2))) 572 goto err_free; 573 574 /* expect a valid ethernet header here. */ 575 if (unlikely(skb->mac_len != sizeof(struct ethhdr) 576 || !skb_mac_header(skb))) 577 goto err_free; 578 579 if (!hard_iface->soft_iface) 580 goto err_free; 581 582 bat_priv = netdev_priv(hard_iface->soft_iface); 583 584 if (atomic_read(&bat_priv->mesh_state) != MESH_ACTIVE) 585 goto err_free; 586 587 /* discard frames on not active interfaces */ 588 if (hard_iface->if_status != IF_ACTIVE) 589 goto err_free; 590 591 batman_ogm_packet = (struct batman_ogm_packet *)skb->data; 592 593 if (batman_ogm_packet->version != COMPAT_VERSION) { 594 bat_dbg(DBG_BATMAN, bat_priv, 595 "Drop packet: incompatible batman version (%i)\n", 596 batman_ogm_packet->version); 597 goto err_free; 598 } 599 600 /* all receive handlers return whether they received or reused 601 * the supplied skb. if not, we have to free the skb. */ 602 603 switch (batman_ogm_packet->packet_type) { 604 /* batman originator packet */ 605 case BAT_OGM: 606 ret = recv_bat_ogm_packet(skb, hard_iface); 607 break; 608 609 /* batman icmp packet */ 610 case BAT_ICMP: 611 ret = recv_icmp_packet(skb, hard_iface); 612 break; 613 614 /* unicast packet */ 615 case BAT_UNICAST: 616 ret = recv_unicast_packet(skb, hard_iface); 617 break; 618 619 /* fragmented unicast packet */ 620 case BAT_UNICAST_FRAG: 621 ret = recv_ucast_frag_packet(skb, hard_iface); 622 break; 623 624 /* broadcast packet */ 625 case BAT_BCAST: 626 ret = recv_bcast_packet(skb, hard_iface); 627 break; 628 629 /* vis packet */ 630 case BAT_VIS: 631 ret = recv_vis_packet(skb, hard_iface); 632 break; 633 /* Translation table query (request or response) */ 634 case BAT_TT_QUERY: 635 ret = recv_tt_query(skb, hard_iface); 636 break; 637 /* Roaming advertisement */ 638 case BAT_ROAM_ADV: 639 ret = recv_roam_adv(skb, hard_iface); 640 break; 641 default: 642 ret = NET_RX_DROP; 643 } 644 645 if (ret == NET_RX_DROP) 646 kfree_skb(skb); 647 648 /* return NET_RX_SUCCESS in any case as we 649 * most probably dropped the packet for 650 * routing-logical reasons. */ 651 652 return NET_RX_SUCCESS; 653 654 err_free: 655 kfree_skb(skb); 656 err_out: 657 return NET_RX_DROP; 658 } 659 660 /* This function returns true if the interface represented by ifindex is a 661 * 802.11 wireless device */ 662 bool is_wifi_iface(int ifindex) 663 { 664 struct net_device *net_device = NULL; 665 bool ret = false; 666 667 if (ifindex == NULL_IFINDEX) 668 goto out; 669 670 net_device = dev_get_by_index(&init_net, ifindex); 671 if (!net_device) 672 goto out; 673 674 #ifdef CONFIG_WIRELESS_EXT 675 /* pre-cfg80211 drivers have to implement WEXT, so it is possible to 676 * check for wireless_handlers != NULL */ 677 if (net_device->wireless_handlers) 678 ret = true; 679 else 680 #endif 681 /* cfg80211 drivers have to set ieee80211_ptr */ 682 if (net_device->ieee80211_ptr) 683 ret = true; 684 out: 685 if (net_device) 686 dev_put(net_device); 687 return ret; 688 } 689 690 struct notifier_block hard_if_notifier = { 691 .notifier_call = hard_if_event, 692 }; 693