soft-interface.c 31.0 KB
Newer Older
1
/* Copyright (C) 2007-2015 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 "soft-interface.h"
19 20 21 22 23 24 25
#include "main.h"

#include <linux/atomic.h>
#include <linux/byteorder/generic.h>
#include <linux/cache.h>
#include <linux/compiler.h>
#include <linux/errno.h>
26
#include <linux/etherdevice.h>
27 28 29
#include <linux/ethtool.h>
#include <linux/fs.h>
#include <linux/if_ether.h>
30
#include <linux/if_vlan.h>
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/lockdep.h>
#include <linux/netdevice.h>
#include <linux/percpu.h>
#include <linux/printk.h>
#include <linux/random.h>
#include <linux/rculist.h>
#include <linux/rcupdate.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <linux/socket.h>
#include <linux/spinlock.h>
#include <linux/stddef.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/workqueue.h>

50
#include "bridge_loop_avoidance.h"
51 52 53 54 55 56
#include "debugfs.h"
#include "distributed-arp-table.h"
#include "gateway_client.h"
#include "gateway_common.h"
#include "hard-interface.h"
#include "multicast.h"
57
#include "network-coding.h"
58 59 60 61
#include "packet.h"
#include "send.h"
#include "sysfs.h"
#include "translation-table.h"
62

63 64 65 66 67 68
static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd);
static void batadv_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info);
static u32 batadv_get_msglevel(struct net_device *dev);
static void batadv_set_msglevel(struct net_device *dev, u32 value);
static u32 batadv_get_link(struct net_device *dev);
69 70 71 72
static void batadv_get_strings(struct net_device *dev, u32 stringset, u8 *data);
static void batadv_get_ethtool_stats(struct net_device *dev,
				     struct ethtool_stats *stats, u64 *data);
static int batadv_get_sset_count(struct net_device *dev, int stringset);
73

74 75 76 77 78 79
static const struct ethtool_ops batadv_ethtool_ops = {
	.get_settings = batadv_get_settings,
	.get_drvinfo = batadv_get_drvinfo,
	.get_msglevel = batadv_get_msglevel,
	.set_msglevel = batadv_set_msglevel,
	.get_link = batadv_get_link,
80 81 82
	.get_strings = batadv_get_strings,
	.get_ethtool_stats = batadv_get_ethtool_stats,
	.get_sset_count = batadv_get_sset_count,
83 84
};

85
int batadv_skb_head_push(struct sk_buff *skb, unsigned int len)
86 87 88
{
	int result;

89
	/* TODO: We must check if we can release all references to non-payload
90 91 92 93 94 95 96 97 98 99 100 101 102 103
	 * data using skb_header_release in our skbs to allow skb_cow_header to
	 * work optimally. This means that those skbs are not allowed to read
	 * or write any data which is before the current position of skb->data
	 * after that call and thus allow other skbs with the same data buffer
	 * to write freely in that area.
	 */
	result = skb_cow_head(skb, len);
	if (result < 0)
		return result;

	skb_push(skb, len);
	return 0;
}

104
static int batadv_interface_open(struct net_device *dev)
105 106 107 108 109
{
	netif_start_queue(dev);
	return 0;
}

110
static int batadv_interface_release(struct net_device *dev)
111 112 113 114 115
{
	netif_stop_queue(dev);
	return 0;
}

116
static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
117
{
118
	struct batadv_priv *bat_priv = netdev_priv(dev);
119 120 121 122 123 124 125 126
	struct net_device_stats *stats = &bat_priv->stats;

	stats->tx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_TX);
	stats->tx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_TX_BYTES);
	stats->tx_dropped = batadv_sum_counter(bat_priv, BATADV_CNT_TX_DROPPED);
	stats->rx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_RX);
	stats->rx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_RX_BYTES);
	return stats;
127 128
}

129
static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
130
{
131
	struct batadv_priv *bat_priv = netdev_priv(dev);
132
	struct batadv_softif_vlan *vlan;
133
	struct sockaddr *addr = p;
134
	uint8_t old_addr[ETH_ALEN];
135 136 137 138

	if (!is_valid_ether_addr(addr->sa_data))
		return -EADDRNOTAVAIL;

139 140
	ether_addr_copy(old_addr, dev->dev_addr);
	ether_addr_copy(dev->dev_addr, addr->sa_data);
141

142
	/* only modify transtable if it has been initialized before */
143 144 145 146 147 148
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
		return 0;

	rcu_read_lock();
	hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
		batadv_tt_local_remove(bat_priv, old_addr, vlan->vid,
149
				       "mac address changed", false);
150
		batadv_tt_local_add(dev, addr->sa_data, vlan->vid,
151
				    BATADV_NULL_IFINDEX, BATADV_NO_MARK);
152
	}
153
	rcu_read_unlock();
154 155 156 157

	return 0;
}

158
static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
159 160
{
	/* check ranges */
161
	if ((new_mtu < 68) || (new_mtu > batadv_hardif_min_mtu(dev)))
162 163 164 165 166 167 168
		return -EINVAL;

	dev->mtu = new_mtu;

	return 0;
}

169 170 171 172 173 174 175 176 177 178 179 180
/**
 * batadv_interface_set_rx_mode - set the rx mode of a device
 * @dev: registered network device to modify
 *
 * We do not actually need to set any rx filters for the virtual batman
 * soft interface. However a dummy handler enables a user to set static
 * multicast listeners for instance.
 */
static void batadv_interface_set_rx_mode(struct net_device *dev)
{
}

181 182
static int batadv_interface_tx(struct sk_buff *skb,
			       struct net_device *soft_iface)
183
{
184
	struct ethhdr *ethhdr;
185 186
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
	struct batadv_hard_iface *primary_if = NULL;
187
	struct batadv_bcast_packet *bcast_packet;
188
	__be16 ethertype = htons(ETH_P_BATMAN);
189 190 191 192
	static const uint8_t stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00,
						   0x00, 0x00};
	static const uint8_t ectp_addr[ETH_ALEN] = {0xCF, 0x00, 0x00, 0x00,
						    0x00, 0x00};
193 194
	enum batadv_dhcp_recipient dhcp_rcp = BATADV_DHCP_NO;
	uint8_t *dst_hint = NULL, chaddr[ETH_ALEN];
195
	struct vlan_ethhdr *vhdr;
196
	unsigned int header_len = 0;
197
	int data_len = skb->len, ret;
198
	unsigned long brd_delay = 1;
199
	bool do_bcast = false, client_added;
200
	unsigned short vid;
201
	uint32_t seqno;
202
	int gw_mode;
203 204
	enum batadv_forw_mode forw_mode;
	struct batadv_orig_node *mcast_single_orig = NULL;
205

206
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
207 208 209
		goto dropped;

	soft_iface->trans_start = jiffies;
210
	vid = batadv_get_vid(skb, 0);
211
	ethhdr = eth_hdr(skb);
212 213 214

	switch (ntohs(ethhdr->h_proto)) {
	case ETH_P_8021Q:
215
		vhdr = vlan_eth_hdr(skb);
216

217
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
218 219 220
			break;

		/* fall through */
A
Antonio Quartulli 已提交
221
	case ETH_P_BATMAN:
222
		goto dropped;
223
	}
224

225
	if (batadv_bla_tx(bat_priv, skb, vid))
226 227
		goto dropped;

228
	/* skb->data might have been reallocated by batadv_bla_tx() */
229
	ethhdr = eth_hdr(skb);
230

231
	/* Register the client MAC in the transtable */
232 233
	if (!is_multicast_ether_addr(ethhdr->h_source)) {
		client_added = batadv_tt_local_add(soft_iface, ethhdr->h_source,
234 235
						   vid, skb->skb_iif,
						   skb->mark);
236 237 238
		if (!client_added)
			goto dropped;
	}
239

240 241
	/* don't accept stp packets. STP does not help in meshes.
	 * better use the bridge loop avoidance ...
242 243 244
	 *
	 * The same goes for ECTP sent at least by some Cisco Switches,
	 * it might confuse the mesh when used with bridge loop avoidance.
245
	 */
246
	if (batadv_compare_eth(ethhdr->h_dest, stp_addr))
247 248
		goto dropped;

249 250 251
	if (batadv_compare_eth(ethhdr->h_dest, ectp_addr))
		goto dropped;

252
	gw_mode = atomic_read(&bat_priv->gw_mode);
253
	if (is_multicast_ether_addr(ethhdr->h_dest)) {
254 255 256 257
		/* if gw mode is off, broadcast every packet */
		if (gw_mode == BATADV_GW_MODE_OFF) {
			do_bcast = true;
			goto send;
258
		}
259

260 261 262 263
		dhcp_rcp = batadv_gw_dhcp_recipient_get(skb, &header_len,
							chaddr);
		/* skb->data may have been modified by
		 * batadv_gw_dhcp_recipient_get()
264
		 */
265
		ethhdr = eth_hdr(skb);
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
		/* if gw_mode is on, broadcast any non-DHCP message.
		 * All the DHCP packets are going to be sent as unicast
		 */
		if (dhcp_rcp == BATADV_DHCP_NO) {
			do_bcast = true;
			goto send;
		}

		if (dhcp_rcp == BATADV_DHCP_TO_CLIENT)
			dst_hint = chaddr;
		else if ((gw_mode == BATADV_GW_MODE_SERVER) &&
			 (dhcp_rcp == BATADV_DHCP_TO_SERVER))
			/* gateways should not forward any DHCP message if
			 * directed to a DHCP server
			 */
			goto dropped;
282

283
send:
284 285 286 287 288 289 290 291 292 293 294
		if (do_bcast && !is_broadcast_ether_addr(ethhdr->h_dest)) {
			forw_mode = batadv_mcast_forw_mode(bat_priv, skb,
							   &mcast_single_orig);
			if (forw_mode == BATADV_FORW_NONE)
				goto dropped;

			if (forw_mode == BATADV_FORW_SINGLE)
				do_bcast = false;
		}
	}

295 296
	batadv_skb_set_priority(skb, 0);

297 298
	/* ethernet packet should be broadcasted */
	if (do_bcast) {
299
		primary_if = batadv_primary_if_get_selected(bat_priv);
300
		if (!primary_if)
301 302
			goto dropped;

303 304 305 306 307 308 309
		/* in case of ARP request, we do not immediately broadcasti the
		 * packet, instead we first wait for DAT to try to retrieve the
		 * correct ARP entry
		 */
		if (batadv_dat_snoop_outgoing_arp_request(bat_priv, skb))
			brd_delay = msecs_to_jiffies(ARP_REQ_DELAY);

310
		if (batadv_skb_head_push(skb, sizeof(*bcast_packet)) < 0)
311 312
			goto dropped;

313
		bcast_packet = (struct batadv_bcast_packet *)skb->data;
314 315
		bcast_packet->version = BATADV_COMPAT_VERSION;
		bcast_packet->ttl = BATADV_TTL;
316 317

		/* batman packet type: broadcast */
318
		bcast_packet->packet_type = BATADV_BCAST;
319
		bcast_packet->reserved = 0;
320 321

		/* hw address of first interface is the orig mac because only
322 323
		 * this mac is known throughout the mesh
		 */
324 325
		ether_addr_copy(bcast_packet->orig,
				primary_if->net_dev->dev_addr);
326 327

		/* set broadcast sequence number */
328 329
		seqno = atomic_inc_return(&bat_priv->bcast_seqno);
		bcast_packet->seqno = htonl(seqno);
330

331
		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay);
332 333

		/* a copy is stored in the bcast list, therefore removing
334 335
		 * the original skb.
		 */
336 337 338 339
		kfree_skb(skb);

	/* unicast packet */
	} else {
340 341
		/* DHCP packets going to a server will use the GW feature */
		if (dhcp_rcp == BATADV_DHCP_TO_SERVER) {
342
			ret = batadv_gw_out_of_range(bat_priv, skb);
343 344
			if (ret)
				goto dropped;
345
			ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
346 347 348 349
		} else if (mcast_single_orig) {
			ret = batadv_send_skb_unicast(bat_priv, skb,
						      BATADV_UNICAST, 0,
						      mcast_single_orig, vid);
350 351 352 353
		} else {
			if (batadv_dat_snoop_outgoing_arp_request(bat_priv,
								  skb))
				goto dropped;
354

355 356 357 358 359
			batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);

			ret = batadv_send_skb_via_tt(bat_priv, skb, dst_hint,
						     vid);
		}
360
		if (ret == NET_XMIT_DROP)
361 362 363
			goto dropped_freed;
	}

364 365
	batadv_inc_counter(bat_priv, BATADV_CNT_TX);
	batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
366 367 368 369 370
	goto end;

dropped:
	kfree_skb(skb);
dropped_freed:
371
	batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
372
end:
373
	if (primary_if)
374
		batadv_hardif_free_ref(primary_if);
375 376 377
	return NETDEV_TX_OK;
}

378
void batadv_interface_rx(struct net_device *soft_iface,
379
			 struct sk_buff *skb, struct batadv_hard_iface *recv_if,
380
			 int hdr_size, struct batadv_orig_node *orig_node)
381
{
382
	struct batadv_bcast_packet *batadv_bcast_packet;
383
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
384
	__be16 ethertype = htons(ETH_P_BATMAN);
385 386 387
	struct vlan_ethhdr *vhdr;
	struct ethhdr *ethhdr;
	unsigned short vid;
388 389
	bool is_bcast;

390 391
	batadv_bcast_packet = (struct batadv_bcast_packet *)skb->data;
	is_bcast = (batadv_bcast_packet->packet_type == BATADV_BCAST);
392 393 394 395 396 397 398 399

	/* check if enough space is available for pulling, and pull */
	if (!pskb_may_pull(skb, hdr_size))
		goto dropped;

	skb_pull_rcsum(skb, hdr_size);
	skb_reset_mac_header(skb);

400 401 402 403 404
	/* clean the netfilter state now that the batman-adv header has been
	 * removed
	 */
	nf_reset(skb);

405
	vid = batadv_get_vid(skb, 0);
406
	ethhdr = eth_hdr(skb);
407 408 409 410 411

	switch (ntohs(ethhdr->h_proto)) {
	case ETH_P_8021Q:
		vhdr = (struct vlan_ethhdr *)skb->data;

412
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
413 414 415
			break;

		/* fall through */
A
Antonio Quartulli 已提交
416
	case ETH_P_BATMAN:
417 418 419 420 421 422 423 424
		goto dropped;
	}

	/* skb->dev & skb->pkt_type are set here */
	if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
		goto dropped;
	skb->protocol = eth_type_trans(skb, soft_iface);

L
Lucas De Marchi 已提交
425
	/* should not be necessary anymore as we use skb_pull_rcsum()
426
	 * TODO: please verify this and remove this TODO
427 428
	 * -- Dec 21st 2009, Simon Wunderlich
	 */
429

430
	/* skb->ip_summed = CHECKSUM_UNNECESSARY; */
431

432 433 434
	batadv_inc_counter(bat_priv, BATADV_CNT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
			   skb->len + ETH_HLEN);
435 436 437

	soft_iface->last_rx = jiffies;

438 439 440 441 442 443
	/* Let the bridge loop avoidance check the packet. If will
	 * not handle it, we can safely push it up.
	 */
	if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
		goto out;

444 445
	if (orig_node)
		batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
446
						     ethhdr->h_source, vid);
447

448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
	if (is_multicast_ether_addr(ethhdr->h_dest)) {
		/* set the mark on broadcast packets if AP isolation is ON and
		 * the packet is coming from an "isolated" client
		 */
		if (batadv_vlan_ap_isola_get(bat_priv, vid) &&
		    batadv_tt_global_is_isolated(bat_priv, ethhdr->h_source,
						 vid)) {
			/* save bits in skb->mark not covered by the mask and
			 * apply the mark on the rest
			 */
			skb->mark &= ~bat_priv->isolation_mark_mask;
			skb->mark |= bat_priv->isolation_mark;
		}
	} else if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source,
					 ethhdr->h_dest, vid)) {
463
		goto dropped;
464
	}
465

466
	netif_rx(skb);
467
	goto out;
468 469 470 471 472 473 474

dropped:
	kfree_skb(skb);
out:
	return;
}

475 476 477 478 479
/**
 * batadv_softif_vlan_free_ref - decrease the vlan object refcounter and
 *  possibly free it
 * @softif_vlan: the vlan object to release
 */
480
void batadv_softif_vlan_free_ref(struct batadv_softif_vlan *vlan)
481
{
482 483 484 485 486 487 488
	if (atomic_dec_and_test(&vlan->refcount)) {
		spin_lock_bh(&vlan->bat_priv->softif_vlan_list_lock);
		hlist_del_rcu(&vlan->list);
		spin_unlock_bh(&vlan->bat_priv->softif_vlan_list_lock);

		kfree_rcu(vlan, rcu);
	}
489 490 491 492 493 494 495 496 497 498
}

/**
 * batadv_softif_vlan_get - get the vlan object for a specific vid
 * @bat_priv: the bat priv with all the soft interface information
 * @vid: the identifier of the vlan object to retrieve
 *
 * Returns the private data of the vlan matching the vid passed as argument or
 * NULL otherwise. The refcounter of the returned object is incremented by 1.
 */
499 500
struct batadv_softif_vlan *batadv_softif_vlan_get(struct batadv_priv *bat_priv,
						  unsigned short vid)
501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
{
	struct batadv_softif_vlan *vlan_tmp, *vlan = NULL;

	rcu_read_lock();
	hlist_for_each_entry_rcu(vlan_tmp, &bat_priv->softif_vlan_list, list) {
		if (vlan_tmp->vid != vid)
			continue;

		if (!atomic_inc_not_zero(&vlan_tmp->refcount))
			continue;

		vlan = vlan_tmp;
		break;
	}
	rcu_read_unlock();

	return vlan;
}

/**
 * batadv_create_vlan - allocate the needed resources for a new vlan
 * @bat_priv: the bat priv with all the soft interface information
 * @vid: the VLAN identifier
 *
 * Returns 0 on success, a negative error otherwise.
 */
int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
{
	struct batadv_softif_vlan *vlan;
530
	int err;
531 532 533 534 535 536 537 538 539 540 541

	vlan = batadv_softif_vlan_get(bat_priv, vid);
	if (vlan) {
		batadv_softif_vlan_free_ref(vlan);
		return -EEXIST;
	}

	vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC);
	if (!vlan)
		return -ENOMEM;

542
	vlan->bat_priv = bat_priv;
543 544 545
	vlan->vid = vid;
	atomic_set(&vlan->refcount, 1);

546 547
	atomic_set(&vlan->ap_isolation, 0);

548 549 550 551 552 553
	err = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan);
	if (err) {
		kfree(vlan);
		return err;
	}

554 555 556 557
	spin_lock_bh(&bat_priv->softif_vlan_list_lock);
	hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list);
	spin_unlock_bh(&bat_priv->softif_vlan_list_lock);

558 559 560 561 562
	/* add a new TT local entry. This one will be marked with the NOPURGE
	 * flag
	 */
	batadv_tt_local_add(bat_priv->soft_iface,
			    bat_priv->soft_iface->dev_addr, vid,
563
			    BATADV_NULL_IFINDEX, BATADV_NO_MARK);
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581

	return 0;
}

/**
 * batadv_softif_destroy_vlan - remove and destroy a softif_vlan object
 * @bat_priv: the bat priv with all the soft interface information
 * @vlan: the object to remove
 */
static void batadv_softif_destroy_vlan(struct batadv_priv *bat_priv,
				       struct batadv_softif_vlan *vlan)
{
	/* explicitly remove the associated TT local entry because it is marked
	 * with the NOPURGE flag
	 */
	batadv_tt_local_remove(bat_priv, bat_priv->soft_iface->dev_addr,
			       vlan->vid, "vlan interface destroyed", false);

582
	batadv_sysfs_del_vlan(bat_priv, vlan);
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599
	batadv_softif_vlan_free_ref(vlan);
}

/**
 * batadv_interface_add_vid - ndo_add_vid API implementation
 * @dev: the netdev of the mesh interface
 * @vid: identifier of the new vlan
 *
 * Set up all the internal structures for handling the new vlan on top of the
 * mesh interface
 *
 * Returns 0 on success or a negative error code in case of failure.
 */
static int batadv_interface_add_vid(struct net_device *dev, __be16 proto,
				    unsigned short vid)
{
	struct batadv_priv *bat_priv = netdev_priv(dev);
600 601
	struct batadv_softif_vlan *vlan;
	int ret;
602 603 604 605 606 607 608 609 610

	/* only 802.1Q vlans are supported.
	 * batman-adv does not know how to handle other types
	 */
	if (proto != htons(ETH_P_8021Q))
		return -EINVAL;

	vid |= BATADV_VLAN_HAS_TAG;

611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640
	/* if a new vlan is getting created and it already exists, it means that
	 * it was not deleted yet. batadv_softif_vlan_get() increases the
	 * refcount in order to revive the object.
	 *
	 * if it does not exist then create it.
	 */
	vlan = batadv_softif_vlan_get(bat_priv, vid);
	if (!vlan)
		return batadv_softif_create_vlan(bat_priv, vid);

	/* recreate the sysfs object if it was already destroyed (and it should
	 * be since we received a kill_vid() for this vlan
	 */
	if (!vlan->kobj) {
		ret = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan);
		if (ret) {
			batadv_softif_vlan_free_ref(vlan);
			return ret;
		}
	}

	/* add a new TT local entry. This one will be marked with the NOPURGE
	 * flag. This must be added again, even if the vlan object already
	 * exists, because the entry was deleted by kill_vid()
	 */
	batadv_tt_local_add(bat_priv->soft_iface,
			    bat_priv->soft_iface->dev_addr, vid,
			    BATADV_NULL_IFINDEX, BATADV_NO_MARK);

	return 0;
641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
}

/**
 * batadv_interface_kill_vid - ndo_kill_vid API implementation
 * @dev: the netdev of the mesh interface
 * @vid: identifier of the deleted vlan
 *
 * Destroy all the internal structures used to handle the vlan identified by vid
 * on top of the mesh interface
 *
 * Returns 0 on success, -EINVAL if the specified prototype is not ETH_P_8021Q
 * or -ENOENT if the specified vlan id wasn't registered.
 */
static int batadv_interface_kill_vid(struct net_device *dev, __be16 proto,
				     unsigned short vid)
{
	struct batadv_priv *bat_priv = netdev_priv(dev);
	struct batadv_softif_vlan *vlan;

	/* only 802.1Q vlans are supported. batman-adv does not know how to
	 * handle other types
	 */
	if (proto != htons(ETH_P_8021Q))
		return -EINVAL;

	vlan = batadv_softif_vlan_get(bat_priv, vid | BATADV_VLAN_HAS_TAG);
	if (!vlan)
		return -ENOENT;

	batadv_softif_destroy_vlan(bat_priv, vlan);

	/* finally free the vlan object */
	batadv_softif_vlan_free_ref(vlan);

	return 0;
}

678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707
/* batman-adv network devices have devices nesting below it and are a special
 * "super class" of normal network devices; split their locks off into a
 * separate class since they always nest.
 */
static struct lock_class_key batadv_netdev_xmit_lock_key;
static struct lock_class_key batadv_netdev_addr_lock_key;

/**
 * batadv_set_lockdep_class_one - Set lockdep class for a single tx queue
 * @dev: device which owns the tx queue
 * @txq: tx queue to modify
 * @_unused: always NULL
 */
static void batadv_set_lockdep_class_one(struct net_device *dev,
					 struct netdev_queue *txq,
					 void *_unused)
{
	lockdep_set_class(&txq->_xmit_lock, &batadv_netdev_xmit_lock_key);
}

/**
 * batadv_set_lockdep_class - Set txq and addr_list lockdep class
 * @dev: network device to modify
 */
static void batadv_set_lockdep_class(struct net_device *dev)
{
	lockdep_set_class(&dev->addr_list_lock, &batadv_netdev_addr_lock_key);
	netdev_for_each_tx_queue(dev, batadv_set_lockdep_class_one, NULL);
}

708 709 710 711 712 713 714 715 716
/**
 * batadv_softif_destroy_finish - cleans up the remains of a softif
 * @work: work queue item
 *
 * Free the parts of the soft interface which can not be removed under
 * rtnl lock (to prevent deadlock situations).
 */
static void batadv_softif_destroy_finish(struct work_struct *work)
{
717
	struct batadv_softif_vlan *vlan;
718 719 720 721 722 723 724
	struct batadv_priv *bat_priv;
	struct net_device *soft_iface;

	bat_priv = container_of(work, struct batadv_priv,
				cleanup_work);
	soft_iface = bat_priv->soft_iface;

725 726 727 728 729 730 731
	/* destroy the "untagged" VLAN */
	vlan = batadv_softif_vlan_get(bat_priv, BATADV_NO_FLAGS);
	if (vlan) {
		batadv_softif_destroy_vlan(bat_priv, vlan);
		batadv_softif_vlan_free_ref(vlan);
	}

732
	batadv_sysfs_del_meshif(soft_iface);
733
	unregister_netdev(soft_iface);
734 735
}

736 737 738 739 740 741 742
/**
 * batadv_softif_init_late - late stage initialization of soft interface
 * @dev: registered network device to modify
 *
 * Returns error code on failures
 */
static int batadv_softif_init_late(struct net_device *dev)
743
{
744
	struct batadv_priv *bat_priv;
745
	uint32_t random_seqno;
746
	int ret;
747
	size_t cnt_len = sizeof(uint64_t) * BATADV_CNT_NUM;
748

749
	batadv_set_lockdep_class(dev);
750

751 752
	bat_priv = netdev_priv(dev);
	bat_priv->soft_iface = dev;
753
	INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
754 755 756 757 758 759

	/* batadv_interface_stats() needs to be available as soon as
	 * register_netdevice() has been called
	 */
	bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
	if (!bat_priv->bat_counters)
760
		return -ENOMEM;
761 762 763

	atomic_set(&bat_priv->aggregated_ogms, 1);
	atomic_set(&bat_priv->bonding, 0);
764
#ifdef CONFIG_BATMAN_ADV_BLA
765
	atomic_set(&bat_priv->bridge_loop_avoidance, 1);
766
#endif
767 768
#ifdef CONFIG_BATMAN_ADV_DAT
	atomic_set(&bat_priv->distributed_arp_table, 1);
769 770 771
#endif
#ifdef CONFIG_BATMAN_ADV_MCAST
	bat_priv->mcast.flags = BATADV_NO_FLAGS;
772
	atomic_set(&bat_priv->multicast_mode, 1);
773
	atomic_set(&bat_priv->mcast.num_disabled, 0);
774
	atomic_set(&bat_priv->mcast.num_want_all_unsnoopables, 0);
775 776
	atomic_set(&bat_priv->mcast.num_want_all_ipv4, 0);
	atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
777
#endif
778
	atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
779
	atomic_set(&bat_priv->gw_sel_class, 20);
780 781
	atomic_set(&bat_priv->gw.bandwidth_down, 100);
	atomic_set(&bat_priv->gw.bandwidth_up, 20);
782
	atomic_set(&bat_priv->orig_interval, 1000);
783
	atomic_set(&bat_priv->hop_penalty, 30);
784
#ifdef CONFIG_BATMAN_ADV_DEBUG
785
	atomic_set(&bat_priv->log_level, 0);
786
#endif
787
	atomic_set(&bat_priv->fragmentation, 1);
788
	atomic_set(&bat_priv->packet_size_max, ETH_DATA_LEN);
789 790
	atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
	atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
791

792
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
793
	atomic_set(&bat_priv->bcast_seqno, 1);
794 795 796 797 798 799 800 801
	atomic_set(&bat_priv->tt.vn, 0);
	atomic_set(&bat_priv->tt.local_changes, 0);
	atomic_set(&bat_priv->tt.ogm_append_cnt, 0);
#ifdef CONFIG_BATMAN_ADV_BLA
	atomic_set(&bat_priv->bla.num_requests, 0);
#endif
	bat_priv->tt.last_changeset = NULL;
	bat_priv->tt.last_changeset_len = 0;
802 803
	bat_priv->isolation_mark = 0;
	bat_priv->isolation_mark_mask = 0;
804

805 806 807 808
	/* randomize initial seqno to avoid collision */
	get_random_bytes(&random_seqno, sizeof(random_seqno));
	atomic_set(&bat_priv->frag_seqno, random_seqno);

809 810 811
	bat_priv->primary_if = NULL;
	bat_priv->num_ifaces = 0;

812 813
	batadv_nc_init_bat_priv(bat_priv);

814
	ret = batadv_algo_select(bat_priv, batadv_routing_algo);
815
	if (ret < 0)
816
		goto free_bat_counters;
817

818
	ret = batadv_debugfs_add_meshif(dev);
819
	if (ret < 0)
820
		goto free_bat_counters;
821

822
	ret = batadv_mesh_init(dev);
823 824 825
	if (ret < 0)
		goto unreg_debugfs;

826
	return 0;
827 828

unreg_debugfs:
829
	batadv_debugfs_del_meshif(dev);
830 831
free_bat_counters:
	free_percpu(bat_priv->bat_counters);
832
	bat_priv->bat_counters = NULL;
833 834 835 836

	return ret;
}

837 838 839 840 841 842 843 844 845 846 847 848 849 850
/**
 * batadv_softif_slave_add - Add a slave interface to a batadv_soft_interface
 * @dev: batadv_soft_interface used as master interface
 * @slave_dev: net_device which should become the slave interface
 *
 * Return 0 if successful or error otherwise.
 */
static int batadv_softif_slave_add(struct net_device *dev,
				   struct net_device *slave_dev)
{
	struct batadv_hard_iface *hard_iface;
	int ret = -EINVAL;

	hard_iface = batadv_hardif_get_by_netdev(slave_dev);
851
	if (!hard_iface || hard_iface->soft_iface)
852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
		goto out;

	ret = batadv_hardif_enable_interface(hard_iface, dev->name);

out:
	if (hard_iface)
		batadv_hardif_free_ref(hard_iface);
	return ret;
}

/**
 * batadv_softif_slave_del - Delete a slave iface from a batadv_soft_interface
 * @dev: batadv_soft_interface used as master interface
 * @slave_dev: net_device which should be removed from the master interface
 *
 * Return 0 if successful or error otherwise.
 */
static int batadv_softif_slave_del(struct net_device *dev,
				   struct net_device *slave_dev)
{
	struct batadv_hard_iface *hard_iface;
	int ret = -EINVAL;

	hard_iface = batadv_hardif_get_by_netdev(slave_dev);

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

	batadv_hardif_disable_interface(hard_iface, BATADV_IF_CLEANUP_KEEP);
	ret = 0;

out:
	if (hard_iface)
		batadv_hardif_free_ref(hard_iface);
	return ret;
}

889 890 891 892 893
static const struct net_device_ops batadv_netdev_ops = {
	.ndo_init = batadv_softif_init_late,
	.ndo_open = batadv_interface_open,
	.ndo_stop = batadv_interface_release,
	.ndo_get_stats = batadv_interface_stats,
894 895
	.ndo_vlan_rx_add_vid = batadv_interface_add_vid,
	.ndo_vlan_rx_kill_vid = batadv_interface_kill_vid,
896 897
	.ndo_set_mac_address = batadv_interface_set_mac_addr,
	.ndo_change_mtu = batadv_interface_change_mtu,
898
	.ndo_set_rx_mode = batadv_interface_set_rx_mode,
899
	.ndo_start_xmit = batadv_interface_tx,
900 901 902
	.ndo_validate_addr = eth_validate_addr,
	.ndo_add_slave = batadv_softif_slave_add,
	.ndo_del_slave = batadv_softif_slave_del,
903 904
};

905 906 907 908 909 910 911 912
/**
 * batadv_softif_free - Deconstructor of batadv_soft_interface
 * @dev: Device to cleanup and remove
 */
static void batadv_softif_free(struct net_device *dev)
{
	batadv_debugfs_del_meshif(dev);
	batadv_mesh_free(dev);
913 914 915 916 917 918 919

	/* some scheduled RCU callbacks need the bat_priv struct to accomplish
	 * their tasks. Wait for them all to be finished before freeing the
	 * netdev and its private data (bat_priv)
	 */
	rcu_barrier();

920 921 922
	free_netdev(dev);
}

923 924 925 926 927 928 929 930 931 932 933
/**
 * batadv_softif_init_early - early stage initialization of soft interface
 * @dev: registered network device to modify
 */
static void batadv_softif_init_early(struct net_device *dev)
{
	struct batadv_priv *priv = netdev_priv(dev);

	ether_setup(dev);

	dev->netdev_ops = &batadv_netdev_ops;
934
	dev->destructor = batadv_softif_free;
935
	dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
936 937 938 939 940 941 942
	dev->tx_queue_len = 0;

	/* can't call min_mtu, because the needed variables
	 * have not been initialized yet
	 */
	dev->mtu = ETH_DATA_LEN;
	/* reserve more space in the skbuff for our header */
943
	dev->hard_header_len = batadv_max_header_len();
944 945 946 947

	/* generate random address */
	eth_hw_addr_random(dev);

948
	dev->ethtool_ops = &batadv_ethtool_ops;
949 950 951 952 953 954 955 956 957 958

	memset(priv, 0, sizeof(*priv));
}

struct net_device *batadv_softif_create(const char *name)
{
	struct net_device *soft_iface;
	int ret;

	soft_iface = alloc_netdev(sizeof(struct batadv_priv), name,
959
				  NET_NAME_UNKNOWN, batadv_softif_init_early);
960 961 962
	if (!soft_iface)
		return NULL;

963 964
	soft_iface->rtnl_link_ops = &batadv_link_ops;

965 966 967 968 969 970 971 972 973
	ret = register_netdevice(soft_iface);
	if (ret < 0) {
		pr_err("Unable to register the batman interface '%s': %i\n",
		       name, ret);
		free_netdev(soft_iface);
		return NULL;
	}

	return soft_iface;
974 975
}

976 977 978 979 980
/**
 * batadv_softif_destroy_sysfs - deletion of batadv_soft_interface via sysfs
 * @soft_iface: the to-be-removed batman-adv interface
 */
void batadv_softif_destroy_sysfs(struct net_device *soft_iface)
981
{
982 983 984
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);

	queue_work(batadv_event_workqueue, &bat_priv->cleanup_work);
985 986
}

987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006
/**
 * batadv_softif_destroy_netlink - deletion of batadv_soft_interface via netlink
 * @soft_iface: the to-be-removed batman-adv interface
 * @head: list pointer
 */
static void batadv_softif_destroy_netlink(struct net_device *soft_iface,
					  struct list_head *head)
{
	struct batadv_hard_iface *hard_iface;

	list_for_each_entry(hard_iface, &batadv_hardif_list, list) {
		if (hard_iface->soft_iface == soft_iface)
			batadv_hardif_disable_interface(hard_iface,
							BATADV_IF_CLEANUP_KEEP);
	}

	batadv_sysfs_del_meshif(soft_iface);
	unregister_netdevice_queue(soft_iface, head);
}

1007
int batadv_softif_is_valid(const struct net_device *net_dev)
1008
{
1009
	if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
1010 1011 1012 1013 1014
		return 1;

	return 0;
}

1015 1016 1017 1018 1019 1020 1021
struct rtnl_link_ops batadv_link_ops __read_mostly = {
	.kind		= "batadv",
	.priv_size	= sizeof(struct batadv_priv),
	.setup		= batadv_softif_init_early,
	.dellink	= batadv_softif_destroy_netlink,
};

1022
/* ethtool */
1023
static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1024 1025 1026
{
	cmd->supported = 0;
	cmd->advertising = 0;
1027
	ethtool_cmd_speed_set(cmd, SPEED_10);
1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
	cmd->duplex = DUPLEX_FULL;
	cmd->port = PORT_TP;
	cmd->phy_address = 0;
	cmd->transceiver = XCVR_INTERNAL;
	cmd->autoneg = AUTONEG_DISABLE;
	cmd->maxtxpkt = 0;
	cmd->maxrxpkt = 0;

	return 0;
}

1039 1040
static void batadv_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info)
1041
{
1042 1043 1044 1045
	strlcpy(info->driver, "B.A.T.M.A.N. advanced", sizeof(info->driver));
	strlcpy(info->version, BATADV_SOURCE_VERSION, sizeof(info->version));
	strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
	strlcpy(info->bus_info, "batman", sizeof(info->bus_info));
1046 1047
}

1048
static u32 batadv_get_msglevel(struct net_device *dev)
1049 1050 1051 1052
{
	return -EOPNOTSUPP;
}

1053
static void batadv_set_msglevel(struct net_device *dev, u32 value)
1054 1055 1056
{
}

1057
static u32 batadv_get_link(struct net_device *dev)
1058 1059 1060
{
	return 1;
}
1061 1062 1063 1064 1065 1066 1067

/* Inspired by drivers/net/ethernet/dlink/sundance.c:1702
 * Declare each description string in struct.name[] to get fixed sized buffer
 * and compile time checking for strings longer than ETH_GSTRING_LEN.
 */
static const struct {
	const char name[ETH_GSTRING_LEN];
1068
} batadv_counters_strings[] = {
1069 1070 1071 1072 1073
	{ "tx" },
	{ "tx_bytes" },
	{ "tx_dropped" },
	{ "rx" },
	{ "rx_bytes" },
1074 1075 1076 1077 1078 1079
	{ "forward" },
	{ "forward_bytes" },
	{ "mgmt_tx" },
	{ "mgmt_tx_bytes" },
	{ "mgmt_rx" },
	{ "mgmt_rx_bytes" },
1080 1081
	{ "frag_tx" },
	{ "frag_tx_bytes" },
1082 1083 1084 1085
	{ "frag_rx" },
	{ "frag_rx_bytes" },
	{ "frag_fwd" },
	{ "frag_fwd_bytes" },
1086 1087 1088 1089 1090 1091
	{ "tt_request_tx" },
	{ "tt_request_rx" },
	{ "tt_response_tx" },
	{ "tt_response_rx" },
	{ "tt_roam_adv_tx" },
	{ "tt_roam_adv_rx" },
1092 1093 1094 1095 1096 1097 1098
#ifdef CONFIG_BATMAN_ADV_DAT
	{ "dat_get_tx" },
	{ "dat_get_rx" },
	{ "dat_put_tx" },
	{ "dat_put_rx" },
	{ "dat_cached_reply_tx" },
#endif
1099 1100 1101 1102 1103
#ifdef CONFIG_BATMAN_ADV_NC
	{ "nc_code" },
	{ "nc_code_bytes" },
	{ "nc_recode" },
	{ "nc_recode_bytes" },
1104
	{ "nc_buffer" },
1105 1106 1107 1108
	{ "nc_decode" },
	{ "nc_decode_bytes" },
	{ "nc_decode_failed" },
	{ "nc_sniffed" },
1109
#endif
1110 1111 1112 1113 1114 1115
};

static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
			       uint8_t *data)
{
	if (stringset == ETH_SS_STATS)
1116 1117
		memcpy(data, batadv_counters_strings,
		       sizeof(batadv_counters_strings));
1118 1119 1120 1121 1122 1123
}

static void batadv_get_ethtool_stats(struct net_device *dev,
				     struct ethtool_stats *stats,
				     uint64_t *data)
{
1124
	struct batadv_priv *bat_priv = netdev_priv(dev);
1125 1126
	int i;

1127
	for (i = 0; i < BATADV_CNT_NUM; i++)
1128 1129 1130 1131 1132 1133
		data[i] = batadv_sum_counter(bat_priv, i);
}

static int batadv_get_sset_count(struct net_device *dev, int stringset)
{
	if (stringset == ETH_SS_STATS)
1134
		return BATADV_CNT_NUM;
1135 1136 1137

	return -EOPNOTSUPP;
}