hard-interface.c 27.8 KB
Newer Older
1
/* Copyright (C) 2007-2017  B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14
 *
 * Marek Lindner, Simon Wunderlich
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * 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 23 24 25
#include <linux/bug.h>
#include <linux/byteorder/generic.h>
#include <linux/errno.h>
#include <linux/fs.h>
26
#include <linux/if.h>
27
#include <linux/if_arp.h>
A
Antonio Quartulli 已提交
28
#include <linux/if_ether.h>
29
#include <linux/kernel.h>
30
#include <linux/kref.h>
31 32 33 34 35 36
#include <linux/list.h>
#include <linux/netdevice.h>
#include <linux/printk.h>
#include <linux/rculist.h>
#include <linux/rtnetlink.h>
#include <linux/slab.h>
37
#include <linux/spinlock.h>
38 39
#include <net/net_namespace.h>
#include <net/rtnetlink.h>
40

41
#include "bat_v.h"
42 43 44 45
#include "bridge_loop_avoidance.h"
#include "debugfs.h"
#include "distributed-arp-table.h"
#include "gateway_client.h"
46
#include "log.h"
47 48 49 50 51 52
#include "originator.h"
#include "packet.h"
#include "send.h"
#include "soft-interface.h"
#include "sysfs.h"
#include "translation-table.h"
53

54 55 56
/**
 * batadv_hardif_release - release hard interface from lists and queue for
 *  free after rcu grace period
57
 * @ref: kref pointer of the hard interface
58
 */
59
void batadv_hardif_release(struct kref *ref)
60
{
61 62 63
	struct batadv_hard_iface *hard_iface;

	hard_iface = container_of(ref, struct batadv_hard_iface, refcount);
64
	dev_put(hard_iface->net_dev);
65 66

	kfree_rcu(hard_iface, rcu);
67 68
}

69 70
struct batadv_hard_iface *
batadv_hardif_get_by_netdev(const struct net_device *net_dev)
71
{
72
	struct batadv_hard_iface *hard_iface;
73 74

	rcu_read_lock();
75
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
76
		if (hard_iface->net_dev == net_dev &&
77
		    kref_get_unless_zero(&hard_iface->refcount))
78 79 80
			goto out;
	}

81
	hard_iface = NULL;
82 83 84

out:
	rcu_read_unlock();
85
	return hard_iface;
86 87
}

88 89 90 91 92 93 94
/**
 * batadv_getlink_net - return link net namespace (of use fallback)
 * @netdev: net_device to check
 * @fallback_net: return in case get_link_net is not available for @netdev
 *
 * Return: result of rtnl_link_ops->get_link_net or @fallback_net
 */
95 96
static struct net *batadv_getlink_net(const struct net_device *netdev,
				      struct net *fallback_net)
97 98 99 100 101 102 103 104 105 106
{
	if (!netdev->rtnl_link_ops)
		return fallback_net;

	if (!netdev->rtnl_link_ops->get_link_net)
		return fallback_net;

	return netdev->rtnl_link_ops->get_link_net(netdev);
}

107 108
/**
 * batadv_mutual_parents - check if two devices are each others parent
109 110 111 112
 * @dev1: 1st net dev
 * @net1: 1st devices netns
 * @dev2: 2nd net dev
 * @net2: 2nd devices netns
113 114 115 116 117 118
 *
 * veth devices come in pairs and each is the parent of the other!
 *
 * Return: true if the devices are each others parent, otherwise false
 */
static bool batadv_mutual_parents(const struct net_device *dev1,
119
				  struct net *net1,
120
				  const struct net_device *dev2,
121
				  struct net *net2)
122 123 124
{
	int dev1_parent_iflink = dev_get_iflink(dev1);
	int dev2_parent_iflink = dev_get_iflink(dev2);
125 126 127 128 129
	const struct net *dev1_parent_net;
	const struct net *dev2_parent_net;

	dev1_parent_net = batadv_getlink_net(dev1, net1);
	dev2_parent_net = batadv_getlink_net(dev2, net2);
130 131 132 133 134

	if (!dev1_parent_iflink || !dev2_parent_iflink)
		return false;

	return (dev1_parent_iflink == dev2->ifindex) &&
135 136 137
	       (dev2_parent_iflink == dev1->ifindex) &&
	       net_eq(dev1_parent_net, net2) &&
	       net_eq(dev2_parent_net, net1);
138 139
}

140 141 142 143 144 145 146 147 148 149
/**
 * batadv_is_on_batman_iface - check if a device is a batman iface descendant
 * @net_dev: the device to check
 *
 * If the user creates any virtual device on top of a batman-adv interface, it
 * is important to prevent this new interface to be used to create a new mesh
 * network (this behaviour would lead to a batman-over-batman configuration).
 * This function recursively checks all the fathers of the device passed as
 * argument looking for a batman-adv soft interface.
 *
150
 * Return: true if the device is descendant of a batman-adv mesh interface (or
151 152 153 154
 * if it is a batman-adv interface itself), false otherwise
 */
static bool batadv_is_on_batman_iface(const struct net_device *net_dev)
{
155
	struct net *net = dev_net(net_dev);
156
	struct net_device *parent_dev;
157
	struct net *parent_net;
158 159 160 161 162 163 164
	bool ret;

	/* check if this is a batman-adv mesh interface */
	if (batadv_softif_is_valid(net_dev))
		return true;

	/* no more parents..stop recursion */
165 166
	if (dev_get_iflink(net_dev) == 0 ||
	    dev_get_iflink(net_dev) == net_dev->ifindex)
167 168
		return false;

169 170
	parent_net = batadv_getlink_net(net_dev, net);

171
	/* recurse over the parent device */
172 173
	parent_dev = __dev_get_by_index((struct net *)parent_net,
					dev_get_iflink(net_dev));
174 175 176 177
	/* if we got a NULL parent_dev there is something broken.. */
	if (WARN(!parent_dev, "Cannot find parent device"))
		return false;

178
	if (batadv_mutual_parents(net_dev, net, parent_dev, parent_net))
179 180
		return false;

181 182 183 184 185
	ret = batadv_is_on_batman_iface(parent_dev);

	return ret;
}

186
static bool batadv_is_valid_iface(const struct net_device *net_dev)
187 188
{
	if (net_dev->flags & IFF_LOOPBACK)
189
		return false;
190 191

	if (net_dev->type != ARPHRD_ETHER)
192
		return false;
193 194

	if (net_dev->addr_len != ETH_ALEN)
195
		return false;
196 197

	/* no batman over batman */
198
	if (batadv_is_on_batman_iface(net_dev))
199
		return false;
200

201
	return true;
202 203
}

204
/**
205 206 207 208
 * batadv_get_real_netdevice - check if the given netdev struct is a virtual
 *  interface on top of another 'real' interface
 * @netdev: the device to check
 *
209 210 211
 * Callers must hold the rtnl semaphore. You may want batadv_get_real_netdev()
 * instead of this.
 *
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247
 * Return: the 'real' net device or the original net device and NULL in case
 *  of an error.
 */
static struct net_device *batadv_get_real_netdevice(struct net_device *netdev)
{
	struct batadv_hard_iface *hard_iface = NULL;
	struct net_device *real_netdev = NULL;
	struct net *real_net;
	struct net *net;
	int ifindex;

	ASSERT_RTNL();

	if (!netdev)
		return NULL;

	if (netdev->ifindex == dev_get_iflink(netdev)) {
		dev_hold(netdev);
		return netdev;
	}

	hard_iface = batadv_hardif_get_by_netdev(netdev);
	if (!hard_iface || !hard_iface->soft_iface)
		goto out;

	net = dev_net(hard_iface->soft_iface);
	ifindex = dev_get_iflink(netdev);
	real_net = batadv_getlink_net(netdev, net);
	real_netdev = dev_get_by_index(real_net, ifindex);

out:
	if (hard_iface)
		batadv_hardif_put(hard_iface);
	return real_netdev;
}

248 249 250
/**
 * batadv_get_real_netdev - check if the given net_device struct is a virtual
 *  interface on top of another 'real' interface
251 252
 * @net_device: the device to check
 *
253 254
 * Return: the 'real' net device or the original net device and NULL in case
 *  of an error.
255
 */
256 257 258 259 260 261 262 263 264 265 266
struct net_device *batadv_get_real_netdev(struct net_device *net_device)
{
	struct net_device *real_netdev;

	rtnl_lock();
	real_netdev = batadv_get_real_netdevice(net_device);
	rtnl_unlock();

	return real_netdev;
}

267 268 269 270 271 272 273 274 275
/**
 * batadv_is_wext_netdev - check if the given net_device struct is a
 *  wext wifi interface
 * @net_device: the device to check
 *
 * Return: true if the net device is a wext wireless device, false
 *  otherwise.
 */
static bool batadv_is_wext_netdev(struct net_device *net_device)
276
{
277 278 279
	if (!net_device)
		return false;

280 281 282 283 284 285 286 287
#ifdef CONFIG_WIRELESS_EXT
	/* pre-cfg80211 drivers have to implement WEXT, so it is possible to
	 * check for wireless_handlers != NULL
	 */
	if (net_device->wireless_handlers)
		return true;
#endif

288 289 290
	return false;
}

291 292 293 294 295 296 297 298
/**
 * batadv_is_cfg80211_netdev - check if the given net_device struct is a
 *  cfg80211 wifi interface
 * @net_device: the device to check
 *
 * Return: true if the net device is a cfg80211 wireless device, false
 *  otherwise.
 */
299
static bool batadv_is_cfg80211_netdev(struct net_device *net_device)
300 301 302 303
{
	if (!net_device)
		return false;

304 305 306 307 308 309 310 311
	/* cfg80211 drivers have to set ieee80211_ptr */
	if (net_device->ieee80211_ptr)
		return true;

	return false;
}

/**
312
 * batadv_wifi_flags_evaluate - calculate wifi flags for net_device
313 314
 * @net_device: the device to check
 *
315 316 317 318 319
 * Return: batadv_hard_iface_wifi_flags flags of the device
 */
static u32 batadv_wifi_flags_evaluate(struct net_device *net_device)
{
	u32 wifi_flags = 0;
320
	struct net_device *real_netdev;
321 322 323 324 325 326 327

	if (batadv_is_wext_netdev(net_device))
		wifi_flags |= BATADV_HARDIF_WIFI_WEXT_DIRECT;

	if (batadv_is_cfg80211_netdev(net_device))
		wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT;

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
	real_netdev = batadv_get_real_netdevice(net_device);
	if (!real_netdev)
		return wifi_flags;

	if (real_netdev == net_device)
		goto out;

	if (batadv_is_wext_netdev(real_netdev))
		wifi_flags |= BATADV_HARDIF_WIFI_WEXT_INDIRECT;

	if (batadv_is_cfg80211_netdev(real_netdev))
		wifi_flags |= BATADV_HARDIF_WIFI_CFG80211_INDIRECT;

out:
	dev_put(real_netdev);
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358
	return wifi_flags;
}

/**
 * batadv_is_cfg80211_hardif - check if the given hardif is a cfg80211 wifi
 *  interface
 * @hard_iface: the device to check
 *
 * Return: true if the net device is a cfg80211 wireless device, false
 *  otherwise.
 */
bool batadv_is_cfg80211_hardif(struct batadv_hard_iface *hard_iface)
{
	u32 allowed_flags = 0;

	allowed_flags |= BATADV_HARDIF_WIFI_CFG80211_DIRECT;
359
	allowed_flags |= BATADV_HARDIF_WIFI_CFG80211_INDIRECT;
360 361 362 363 364 365 366 367

	return !!(hard_iface->wifi_flags & allowed_flags);
}

/**
 * batadv_is_wifi_hardif - check if the given hardif is a wifi interface
 * @hard_iface: the device to check
 *
368
 * Return: true if the net device is a 802.11 wireless device, false otherwise.
369
 */
370
bool batadv_is_wifi_hardif(struct batadv_hard_iface *hard_iface)
371
{
372
	if (!hard_iface)
373 374
		return false;

375
	return hard_iface->wifi_flags != 0;
376 377
}

378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
/**
 * batadv_hardif_no_broadcast - check whether (re)broadcast is necessary
 * @if_outgoing: the outgoing interface checked and considered for (re)broadcast
 * @orig_addr: the originator of this packet
 * @orig_neigh: originator address of the forwarder we just got the packet from
 *  (NULL if we originated)
 *
 * Checks whether a packet needs to be (re)broadcasted on the given interface.
 *
 * Return:
 *	BATADV_HARDIF_BCAST_NORECIPIENT: No neighbor on interface
 *	BATADV_HARDIF_BCAST_DUPFWD: Just one neighbor, but it is the forwarder
 *	BATADV_HARDIF_BCAST_DUPORIG: Just one neighbor, but it is the originator
 *	BATADV_HARDIF_BCAST_OK: Several neighbors, must broadcast
 */
int batadv_hardif_no_broadcast(struct batadv_hard_iface *if_outgoing,
			       u8 *orig_addr, u8 *orig_neigh)
{
	struct batadv_hardif_neigh_node *hardif_neigh;
	struct hlist_node *first;
	int ret = BATADV_HARDIF_BCAST_OK;

	rcu_read_lock();

	/* 0 neighbors -> no (re)broadcast */
	first = rcu_dereference(hlist_first_rcu(&if_outgoing->neigh_list));
	if (!first) {
		ret = BATADV_HARDIF_BCAST_NORECIPIENT;
		goto out;
	}

	/* >1 neighbors -> (re)brodcast */
	if (rcu_dereference(hlist_next_rcu(first)))
		goto out;

	hardif_neigh = hlist_entry(first, struct batadv_hardif_neigh_node,
				   list);

	/* 1 neighbor, is the originator -> no rebroadcast */
	if (orig_addr && batadv_compare_eth(hardif_neigh->orig, orig_addr)) {
		ret = BATADV_HARDIF_BCAST_DUPORIG;
	/* 1 neighbor, is the one we received from -> no rebroadcast */
	} else if (orig_neigh &&
		   batadv_compare_eth(hardif_neigh->orig, orig_neigh)) {
		ret = BATADV_HARDIF_BCAST_DUPFWD;
	}

out:
	rcu_read_unlock();
	return ret;
}

430
static struct batadv_hard_iface *
431
batadv_hardif_get_active(const struct net_device *soft_iface)
432
{
433
	struct batadv_hard_iface *hard_iface;
434 435

	rcu_read_lock();
436
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
437
		if (hard_iface->soft_iface != soft_iface)
438 439
			continue;

440
		if (hard_iface->if_status == BATADV_IF_ACTIVE &&
441
		    kref_get_unless_zero(&hard_iface->refcount))
442 443 444
			goto out;
	}

445
	hard_iface = NULL;
446 447 448

out:
	rcu_read_unlock();
449
	return hard_iface;
450 451
}

452 453
static void batadv_primary_if_update_addr(struct batadv_priv *bat_priv,
					  struct batadv_hard_iface *oldif)
454
{
455
	struct batadv_hard_iface *primary_if;
456

457
	primary_if = batadv_primary_if_get_selected(bat_priv);
458 459
	if (!primary_if)
		goto out;
460

461
	batadv_dat_init_own_addr(bat_priv, primary_if);
462
	batadv_bla_update_orig_address(bat_priv, primary_if, oldif);
463 464
out:
	if (primary_if)
465
		batadv_hardif_put(primary_if);
466 467
}

468 469
static void batadv_primary_if_select(struct batadv_priv *bat_priv,
				     struct batadv_hard_iface *new_hard_iface)
470
{
471
	struct batadv_hard_iface *curr_hard_iface;
472

473
	ASSERT_RTNL();
474

475 476
	if (new_hard_iface)
		kref_get(&new_hard_iface->refcount);
477

478
	curr_hard_iface = rcu_dereference_protected(bat_priv->primary_if, 1);
479
	rcu_assign_pointer(bat_priv->primary_if, new_hard_iface);
480

481
	if (!new_hard_iface)
482
		goto out;
483

484
	bat_priv->algo_ops->iface.primary_set(new_hard_iface);
485
	batadv_primary_if_update_addr(bat_priv, curr_hard_iface);
486 487 488

out:
	if (curr_hard_iface)
489
		batadv_hardif_put(curr_hard_iface);
490 491
}

492 493
static bool
batadv_hardif_is_iface_up(const struct batadv_hard_iface *hard_iface)
494
{
495
	if (hard_iface->net_dev->flags & IFF_UP)
496 497 498 499 500
		return true;

	return false;
}

501
static void batadv_check_known_mac_addr(const struct net_device *net_dev)
502
{
503
	const struct batadv_hard_iface *hard_iface;
504 505

	rcu_read_lock();
506
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
507 508
		if (hard_iface->if_status != BATADV_IF_ACTIVE &&
		    hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
509 510
			continue;

511
		if (hard_iface->net_dev == net_dev)
512 513
			continue;

514 515
		if (!batadv_compare_eth(hard_iface->net_dev->dev_addr,
					net_dev->dev_addr))
516 517
			continue;

518 519 520
		pr_warn("The newly added mac address (%pM) already exists on: %s\n",
			net_dev->dev_addr, hard_iface->net_dev->name);
		pr_warn("It is strongly recommended to keep mac addresses unique to avoid problems!\n");
521 522 523 524
	}
	rcu_read_unlock();
}

525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
/**
 * batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom
 * @soft_iface: netdev struct of the mesh interface
 */
static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
{
	const struct batadv_hard_iface *hard_iface;
	unsigned short lower_header_len = ETH_HLEN;
	unsigned short lower_headroom = 0;
	unsigned short lower_tailroom = 0;
	unsigned short needed_headroom;

	rcu_read_lock();
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
		if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
			continue;

		if (hard_iface->soft_iface != soft_iface)
			continue;

		lower_header_len = max_t(unsigned short, lower_header_len,
					 hard_iface->net_dev->hard_header_len);

		lower_headroom = max_t(unsigned short, lower_headroom,
				       hard_iface->net_dev->needed_headroom);

		lower_tailroom = max_t(unsigned short, lower_tailroom,
				       hard_iface->net_dev->needed_tailroom);
	}
	rcu_read_unlock();

	needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
	needed_headroom += batadv_max_header_len();

	soft_iface->needed_headroom = needed_headroom;
	soft_iface->needed_tailroom = lower_tailroom;
}

563
int batadv_hardif_min_mtu(struct net_device *soft_iface)
564
{
565
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
566
	const struct batadv_hard_iface *hard_iface;
567
	int min_mtu = INT_MAX;
568 569

	rcu_read_lock();
570
	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
571 572
		if (hard_iface->if_status != BATADV_IF_ACTIVE &&
		    hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
573 574
			continue;

575
		if (hard_iface->soft_iface != soft_iface)
576 577
			continue;

578
		min_mtu = min_t(int, hard_iface->net_dev->mtu, min_mtu);
579 580
	}
	rcu_read_unlock();
581 582 583 584 585 586 587 588 589 590 591 592

	if (atomic_read(&bat_priv->fragmentation) == 0)
		goto out;

	/* with fragmentation enabled the maximum size of internally generated
	 * packets such as translation table exchanges or tvlv containers, etc
	 * has to be calculated
	 */
	min_mtu = min_t(int, min_mtu, BATADV_FRAG_MAX_FRAG_SIZE);
	min_mtu -= sizeof(struct batadv_frag_packet);
	min_mtu *= BATADV_FRAG_MAX_FRAGMENTS;

593
out:
594 595 596 597 598 599 600 601 602 603 604 605 606
	/* report to the other components the maximum amount of bytes that
	 * batman-adv can send over the wire (without considering the payload
	 * overhead). For example, this value is used by TT to compute the
	 * maximum local table table size
	 */
	atomic_set(&bat_priv->packet_size_max, min_mtu);

	/* the real soft-interface MTU is computed by removing the payload
	 * overhead from the maximum amount of bytes that was just computed.
	 *
	 * However batman-adv does not support MTUs bigger than ETH_DATA_LEN
	 */
	return min_t(int, min_mtu - batadv_max_header_len(), ETH_DATA_LEN);
607 608 609
}

/* adjusts the MTU if a new interface with a smaller MTU appeared. */
610
void batadv_update_min_mtu(struct net_device *soft_iface)
611
{
612
	soft_iface->mtu = batadv_hardif_min_mtu(soft_iface);
613

614 615 616 617
	/* Check if the local translate table should be cleaned up to match a
	 * new (and smaller) MTU.
	 */
	batadv_tt_local_resize_to_mtu(soft_iface);
618 619
}

620 621
static void
batadv_hardif_activate_interface(struct batadv_hard_iface *hard_iface)
622
{
623 624
	struct batadv_priv *bat_priv;
	struct batadv_hard_iface *primary_if = NULL;
625

626
	if (hard_iface->if_status != BATADV_IF_INACTIVE)
627
		goto out;
628

629
	bat_priv = netdev_priv(hard_iface->soft_iface);
630

631
	bat_priv->algo_ops->iface.update_mac(hard_iface);
632
	hard_iface->if_status = BATADV_IF_TO_BE_ACTIVATED;
633

634
	/* the first active interface becomes our primary interface or
635
	 * the next active interface after the old primary interface was removed
636
	 */
637
	primary_if = batadv_primary_if_get_selected(bat_priv);
638
	if (!primary_if)
639
		batadv_primary_if_select(bat_priv, hard_iface);
640

641 642
	batadv_info(hard_iface->soft_iface, "Interface activated: %s\n",
		    hard_iface->net_dev->name);
643

644
	batadv_update_min_mtu(hard_iface->soft_iface);
645

646 647
	if (bat_priv->algo_ops->iface.activate)
		bat_priv->algo_ops->iface.activate(hard_iface);
648

649 650
out:
	if (primary_if)
651
		batadv_hardif_put(primary_if);
652 653
}

654 655
static void
batadv_hardif_deactivate_interface(struct batadv_hard_iface *hard_iface)
656
{
657 658
	if (hard_iface->if_status != BATADV_IF_ACTIVE &&
	    hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
659 660
		return;

661
	hard_iface->if_status = BATADV_IF_INACTIVE;
662

663 664
	batadv_info(hard_iface->soft_iface, "Interface deactivated: %s\n",
		    hard_iface->net_dev->name);
665

666
	batadv_update_min_mtu(hard_iface->soft_iface);
667 668
}

669 670 671 672 673 674 675
/**
 * batadv_master_del_slave - remove hard_iface from the current master interface
 * @slave: the interface enslaved in another master
 * @master: the master from which slave has to be removed
 *
 * Invoke ndo_del_slave on master passing slave as argument. In this way slave
 * is free'd and master can correctly change its internal state.
676 677
 *
 * Return: 0 on success, a negative value representing the error otherwise
678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
 */
static int batadv_master_del_slave(struct batadv_hard_iface *slave,
				   struct net_device *master)
{
	int ret;

	if (!master)
		return 0;

	ret = -EBUSY;
	if (master->netdev_ops->ndo_del_slave)
		ret = master->netdev_ops->ndo_del_slave(master, slave->net_dev);

	return ret;
}

694
int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
695
				   struct net *net, const char *iface_name)
696
{
697
	struct batadv_priv *bat_priv;
698
	struct net_device *soft_iface, *master;
699
	__be16 ethertype = htons(ETH_P_BATMAN);
700
	int max_header_len = batadv_max_header_len();
701
	int ret;
702

703
	if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
704 705
		goto out;

706
	kref_get(&hard_iface->refcount);
707

708
	soft_iface = dev_get_by_name(net, iface_name);
709

710
	if (!soft_iface) {
711
		soft_iface = batadv_softif_create(net, iface_name);
712

713 714
		if (!soft_iface) {
			ret = -ENOMEM;
715
			goto err;
716
		}
717 718

		/* dev_get_by_name() increases the reference counter for us */
719 720 721
		dev_hold(soft_iface);
	}

722
	if (!batadv_softif_is_valid(soft_iface)) {
723
		pr_err("Can't create batman mesh interface %s: already exists as regular interface\n",
724 725
		       soft_iface->name);
		ret = -EINVAL;
726
		goto err_dev;
727 728
	}

729 730 731 732 733 734 735 736
	/* check if the interface is enslaved in another virtual one and
	 * in that case unlink it first
	 */
	master = netdev_master_upper_dev_get(hard_iface->net_dev);
	ret = batadv_master_del_slave(hard_iface, master);
	if (ret)
		goto err_dev;

737
	hard_iface->soft_iface = soft_iface;
738
	bat_priv = netdev_priv(hard_iface->soft_iface);
739

740
	ret = netdev_master_upper_dev_link(hard_iface->net_dev,
741
					   soft_iface, NULL, NULL, NULL);
742 743 744
	if (ret)
		goto err_dev;

745
	ret = bat_priv->algo_ops->iface.enable(hard_iface);
746
	if (ret < 0)
747
		goto err_upper;
748

749
	hard_iface->if_num = bat_priv->num_ifaces;
750
	bat_priv->num_ifaces++;
751
	hard_iface->if_status = BATADV_IF_INACTIVE;
752 753
	ret = batadv_orig_hash_add_if(hard_iface, bat_priv->num_ifaces);
	if (ret < 0) {
754
		bat_priv->algo_ops->iface.disable(hard_iface);
755 756
		bat_priv->num_ifaces--;
		hard_iface->if_status = BATADV_IF_NOT_IN_USE;
757
		goto err_upper;
758
	}
759

760
	kref_get(&hard_iface->refcount);
761
	hard_iface->batman_adv_ptype.type = ethertype;
762
	hard_iface->batman_adv_ptype.func = batadv_batman_skb_recv;
763 764
	hard_iface->batman_adv_ptype.dev = hard_iface->net_dev;
	dev_add_pack(&hard_iface->batman_adv_ptype);
765

766 767
	batadv_info(hard_iface->soft_iface, "Adding interface: %s\n",
		    hard_iface->net_dev->name);
768

769
	if (atomic_read(&bat_priv->fragmentation) &&
770
	    hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
771
		batadv_info(hard_iface->soft_iface,
772
			    "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",
773
			    hard_iface->net_dev->name, hard_iface->net_dev->mtu,
774
			    ETH_DATA_LEN + max_header_len);
775

776
	if (!atomic_read(&bat_priv->fragmentation) &&
777
	    hard_iface->net_dev->mtu < ETH_DATA_LEN + max_header_len)
778
		batadv_info(hard_iface->soft_iface,
779
			    "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",
780
			    hard_iface->net_dev->name, hard_iface->net_dev->mtu,
781
			    ETH_DATA_LEN + max_header_len);
782

783 784
	if (batadv_hardif_is_iface_up(hard_iface))
		batadv_hardif_activate_interface(hard_iface);
785
	else
786 787 788
		batadv_err(hard_iface->soft_iface,
			   "Not using interface %s (retrying later): interface not active\n",
			   hard_iface->net_dev->name);
789

790 791
	batadv_hardif_recalc_extra_skbroom(soft_iface);

792 793 794
out:
	return 0;

795 796
err_upper:
	netdev_upper_dev_unlink(hard_iface->net_dev, soft_iface);
797
err_dev:
798
	hard_iface->soft_iface = NULL;
799
	dev_put(soft_iface);
800
err:
801
	batadv_hardif_put(hard_iface);
802
	return ret;
803 804
}

805 806
void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
				     enum batadv_hard_if_cleanup autodel)
807
{
808 809
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
	struct batadv_hard_iface *primary_if = NULL;
810

811
	batadv_hardif_deactivate_interface(hard_iface);
812

813
	if (hard_iface->if_status != BATADV_IF_INACTIVE)
814
		goto out;
815

816 817
	batadv_info(hard_iface->soft_iface, "Removing interface: %s\n",
		    hard_iface->net_dev->name);
818
	dev_remove_pack(&hard_iface->batman_adv_ptype);
819
	batadv_hardif_put(hard_iface);
820 821

	bat_priv->num_ifaces--;
822
	batadv_orig_hash_del_if(hard_iface, bat_priv->num_ifaces);
823

824
	primary_if = batadv_primary_if_get_selected(bat_priv);
825
	if (hard_iface == primary_if) {
826
		struct batadv_hard_iface *new_if;
827

828 829
		new_if = batadv_hardif_get_active(hard_iface->soft_iface);
		batadv_primary_if_select(bat_priv, new_if);
830 831

		if (new_if)
832
			batadv_hardif_put(new_if);
833 834
	}

835
	bat_priv->algo_ops->iface.disable(hard_iface);
836
	hard_iface->if_status = BATADV_IF_NOT_IN_USE;
837

838
	/* delete all references to this hard_iface */
839
	batadv_purge_orig_ref(bat_priv);
840
	batadv_purge_outstanding_packets(bat_priv, hard_iface);
841
	dev_put(hard_iface->soft_iface);
842

843
	netdev_upper_dev_unlink(hard_iface->net_dev, hard_iface->soft_iface);
844
	batadv_hardif_recalc_extra_skbroom(hard_iface->soft_iface);
845

846
	/* nobody uses this interface anymore */
847 848 849 850 851 852
	if (!bat_priv->num_ifaces) {
		batadv_gw_check_client_stop(bat_priv);

		if (autodel == BATADV_IF_CLEANUP_AUTO)
			batadv_softif_destroy_sysfs(hard_iface->soft_iface);
	}
853

854
	hard_iface->soft_iface = NULL;
855
	batadv_hardif_put(hard_iface);
856 857 858

out:
	if (primary_if)
859
		batadv_hardif_put(primary_if);
860 861
}

862
static struct batadv_hard_iface *
863
batadv_hardif_add_interface(struct net_device *net_dev)
864
{
865
	struct batadv_hard_iface *hard_iface;
866 867
	int ret;

868 869
	ASSERT_RTNL();

870
	if (!batadv_is_valid_iface(net_dev))
871 872 873 874
		goto out;

	dev_hold(net_dev);

875
	hard_iface = kzalloc(sizeof(*hard_iface), GFP_ATOMIC);
876
	if (!hard_iface)
877 878
		goto release_dev;

879
	ret = batadv_sysfs_add_hardif(&hard_iface->hardif_obj, net_dev);
880 881 882
	if (ret)
		goto free_if;

883 884 885
	hard_iface->if_num = -1;
	hard_iface->net_dev = net_dev;
	hard_iface->soft_iface = NULL;
886
	hard_iface->if_status = BATADV_IF_NOT_IN_USE;
887 888 889 890 891

	ret = batadv_debugfs_add_hardif(hard_iface);
	if (ret)
		goto free_sysfs;

892
	INIT_LIST_HEAD(&hard_iface->list);
893
	INIT_HLIST_HEAD(&hard_iface->neigh_list);
894

895
	spin_lock_init(&hard_iface->neigh_list_lock);
896
	kref_init(&hard_iface->refcount);
897

898
	hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
899 900
	hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
	if (batadv_is_wifi_hardif(hard_iface))
901 902
		hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;

903 904
	batadv_v_hardif_init(hard_iface);

905
	batadv_check_known_mac_addr(hard_iface->net_dev);
906
	kref_get(&hard_iface->refcount);
907
	list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
908

909
	return hard_iface;
910

911 912
free_sysfs:
	batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
913
free_if:
914
	kfree(hard_iface);
915 916 917 918 919 920
release_dev:
	dev_put(net_dev);
out:
	return NULL;
}

921
static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
922
{
923 924
	ASSERT_RTNL();

925
	/* first deactivate interface */
926
	if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
927
		batadv_hardif_disable_interface(hard_iface,
928
						BATADV_IF_CLEANUP_KEEP);
929

930
	if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
931 932
		return;

933
	hard_iface->if_status = BATADV_IF_TO_BE_REMOVED;
934 935 936
	batadv_debugfs_del_hardif(hard_iface);
	batadv_sysfs_del_hardif(&hard_iface->hardif_obj);
	batadv_hardif_put(hard_iface);
937 938
}

939
void batadv_hardif_remove_interfaces(void)
940
{
941
	struct batadv_hard_iface *hard_iface, *hard_iface_tmp;
942

943
	rtnl_lock();
944
	list_for_each_entry_safe(hard_iface, hard_iface_tmp,
945
				 &batadv_hardif_list, list) {
946
		list_del_rcu(&hard_iface->list);
947
		batadv_hardif_remove_interface(hard_iface);
948 949 950 951
	}
	rtnl_unlock();
}

952 953
static int batadv_hard_if_event(struct notifier_block *this,
				unsigned long event, void *ptr)
954
{
955
	struct net_device *net_dev = netdev_notifier_info_to_dev(ptr);
956 957 958
	struct batadv_hard_iface *hard_iface;
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_priv *bat_priv;
959

960 961
	if (batadv_softif_is_valid(net_dev) && event == NETDEV_REGISTER) {
		batadv_sysfs_add_meshif(net_dev);
962 963
		bat_priv = netdev_priv(net_dev);
		batadv_softif_create_vlan(bat_priv, BATADV_NO_FLAGS);
964 965 966
		return NOTIFY_DONE;
	}

967
	hard_iface = batadv_hardif_get_by_netdev(net_dev);
968 969
	if (!hard_iface && (event == NETDEV_REGISTER ||
			    event == NETDEV_POST_TYPE_CHANGE))
970
		hard_iface = batadv_hardif_add_interface(net_dev);
971

972
	if (!hard_iface)
973 974 975 976
		goto out;

	switch (event) {
	case NETDEV_UP:
977
		batadv_hardif_activate_interface(hard_iface);
978 979 980
		break;
	case NETDEV_GOING_DOWN:
	case NETDEV_DOWN:
981
		batadv_hardif_deactivate_interface(hard_iface);
982 983
		break;
	case NETDEV_UNREGISTER:
984
	case NETDEV_PRE_TYPE_CHANGE:
985
		list_del_rcu(&hard_iface->list);
986

987
		batadv_hardif_remove_interface(hard_iface);
988 989
		break;
	case NETDEV_CHANGEMTU:
990
		if (hard_iface->soft_iface)
991
			batadv_update_min_mtu(hard_iface->soft_iface);
992 993
		break;
	case NETDEV_CHANGEADDR:
994
		if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
995 996
			goto hardif_put;

997
		batadv_check_known_mac_addr(hard_iface->net_dev);
998

999
		bat_priv = netdev_priv(hard_iface->soft_iface);
1000
		bat_priv->algo_ops->iface.update_mac(hard_iface);
1001

1002
		primary_if = batadv_primary_if_get_selected(bat_priv);
1003 1004 1005 1006
		if (!primary_if)
			goto hardif_put;

		if (hard_iface == primary_if)
1007
			batadv_primary_if_update_addr(bat_priv, NULL);
1008
		break;
1009 1010 1011 1012 1013
	case NETDEV_CHANGEUPPER:
		hard_iface->wifi_flags = batadv_wifi_flags_evaluate(net_dev);
		if (batadv_is_wifi_hardif(hard_iface))
			hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
		break;
1014 1015
	default:
		break;
J
Joe Perches 已提交
1016
	}
1017 1018

hardif_put:
1019
	batadv_hardif_put(hard_iface);
1020
out:
1021
	if (primary_if)
1022
		batadv_hardif_put(primary_if);
1023 1024 1025
	return NOTIFY_DONE;
}

1026
struct notifier_block batadv_hard_if_notifier = {
1027
	.notifier_call = batadv_hard_if_event,
1028
};