soft-interface.c 22.5 KB
Newer Older
1
/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 * 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
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 */

#include "main.h"
#include "soft-interface.h"
#include "hard-interface.h"
23
#include "distributed-arp-table.h"
24 25
#include "routing.h"
#include "send.h"
26
#include "debugfs.h"
27 28 29 30
#include "translation-table.h"
#include "hash.h"
#include "gateway_common.h"
#include "gateway_client.h"
31
#include "sysfs.h"
32
#include "originator.h"
33 34 35 36
#include <linux/slab.h>
#include <linux/ethtool.h>
#include <linux/etherdevice.h>
#include <linux/if_vlan.h>
37
#include "bridge_loop_avoidance.h"
38
#include "network-coding.h"
39 40


41 42 43 44 45 46
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);
47 48 49 50
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);
51

52 53 54 55 56 57
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,
58 59 60
	.get_strings = batadv_get_strings,
	.get_ethtool_stats = batadv_get_ethtool_stats,
	.get_sset_count = batadv_get_sset_count,
61 62
};

63
int batadv_skb_head_push(struct sk_buff *skb, unsigned int len)
64 65 66
{
	int result;

67
	/* TODO: We must check if we can release all references to non-payload
68 69 70 71 72 73 74 75 76 77 78 79 80 81
	 * 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;
}

82
static int batadv_interface_open(struct net_device *dev)
83 84 85 86 87
{
	netif_start_queue(dev);
	return 0;
}

88
static int batadv_interface_release(struct net_device *dev)
89 90 91 92 93
{
	netif_stop_queue(dev);
	return 0;
}

94
static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
95
{
96
	struct batadv_priv *bat_priv = netdev_priv(dev);
97 98 99 100 101 102 103 104
	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;
105 106
}

107
static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
108
{
109
	struct batadv_priv *bat_priv = netdev_priv(dev);
110
	struct sockaddr *addr = p;
111
	uint8_t old_addr[ETH_ALEN];
112 113 114 115

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

116 117 118
	memcpy(old_addr, dev->dev_addr, ETH_ALEN);
	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);

119
	/* only modify transtable if it has been initialized before */
120
	if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE) {
121
		batadv_tt_local_remove(bat_priv, old_addr,
122
				       "mac address changed", false);
123
		batadv_tt_local_add(dev, addr->sa_data, BATADV_NULL_IFINDEX);
124 125 126 127 128
	}

	return 0;
}

129
static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
130 131
{
	/* check ranges */
132
	if ((new_mtu < 68) || (new_mtu > batadv_hardif_min_mtu(dev)))
133 134 135 136 137 138 139
		return -EINVAL;

	dev->mtu = new_mtu;

	return 0;
}

140 141 142 143 144 145 146 147 148 149 150 151
/**
 * 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)
{
}

152 153
static int batadv_interface_tx(struct sk_buff *skb,
			       struct net_device *soft_iface)
154 155
{
	struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
156 157
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
	struct batadv_hard_iface *primary_if = NULL;
158
	struct batadv_bcast_packet *bcast_packet;
159
	struct vlan_ethhdr *vhdr;
160
	__be16 ethertype = htons(ETH_P_BATMAN);
161 162 163 164
	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};
165
	unsigned int header_len = 0;
166
	int data_len = skb->len, ret;
167
	unsigned short vid __maybe_unused = BATADV_NO_FLAGS;
168
	bool do_bcast = false;
169
	uint32_t seqno;
170
	unsigned long brd_delay = 1;
171

172
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
173 174 175 176 177 178 179 180
		goto dropped;

	soft_iface->trans_start = jiffies;

	switch (ntohs(ethhdr->h_proto)) {
	case ETH_P_8021Q:
		vhdr = (struct vlan_ethhdr *)skb->data;
		vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
181
		vid |= BATADV_VLAN_HAS_TAG;
182

183
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
184 185 186
			break;

		/* fall through */
A
Antonio Quartulli 已提交
187
	case ETH_P_BATMAN:
188
		goto dropped;
189
	}
190

191
	if (batadv_bla_tx(bat_priv, skb, vid))
192 193
		goto dropped;

194 195 196
	/* skb->data might have been reallocated by batadv_bla_tx() */
	ethhdr = (struct ethhdr *)skb->data;

197
	/* Register the client MAC in the transtable */
198 199
	if (!is_multicast_ether_addr(ethhdr->h_source))
		batadv_tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
200

201 202
	/* don't accept stp packets. STP does not help in meshes.
	 * better use the bridge loop avoidance ...
203 204 205
	 *
	 * The same goes for ECTP sent at least by some Cisco Switches,
	 * it might confuse the mesh when used with bridge loop avoidance.
206
	 */
207
	if (batadv_compare_eth(ethhdr->h_dest, stp_addr))
208 209
		goto dropped;

210 211 212
	if (batadv_compare_eth(ethhdr->h_dest, ectp_addr))
		goto dropped;

213 214
	if (is_multicast_ether_addr(ethhdr->h_dest)) {
		do_bcast = true;
215

216
		switch (atomic_read(&bat_priv->gw_mode)) {
217
		case BATADV_GW_MODE_SERVER:
218
			/* gateway servers should not send dhcp
219 220
			 * requests into the mesh
			 */
221
			ret = batadv_gw_is_dhcp_target(skb, &header_len);
222 223 224
			if (ret)
				goto dropped;
			break;
225
		case BATADV_GW_MODE_CLIENT:
226
			/* gateway clients should send dhcp requests
227 228
			 * via unicast to their gateway
			 */
229
			ret = batadv_gw_is_dhcp_target(skb, &header_len);
230 231 232
			if (ret)
				do_bcast = false;
			break;
233
		case BATADV_GW_MODE_OFF:
234 235 236
		default:
			break;
		}
237 238 239 240

		/* reminder: ethhdr might have become unusable from here on
		 * (batadv_gw_is_dhcp_target() might have reallocated skb data)
		 */
241 242
	}

243 244
	batadv_skb_set_priority(skb, 0);

245 246
	/* ethernet packet should be broadcasted */
	if (do_bcast) {
247
		primary_if = batadv_primary_if_get_selected(bat_priv);
248
		if (!primary_if)
249 250
			goto dropped;

251 252 253 254 255 256 257
		/* 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);

258
		if (batadv_skb_head_push(skb, sizeof(*bcast_packet)) < 0)
259 260
			goto dropped;

261
		bcast_packet = (struct batadv_bcast_packet *)skb->data;
262
		bcast_packet->header.version = BATADV_COMPAT_VERSION;
263
		bcast_packet->header.ttl = BATADV_TTL;
264 265

		/* batman packet type: broadcast */
266
		bcast_packet->header.packet_type = BATADV_BCAST;
267
		bcast_packet->reserved = 0;
268 269

		/* hw address of first interface is the orig mac because only
270 271
		 * this mac is known throughout the mesh
		 */
272
		memcpy(bcast_packet->orig,
273
		       primary_if->net_dev->dev_addr, ETH_ALEN);
274 275

		/* set broadcast sequence number */
276 277
		seqno = atomic_inc_return(&bat_priv->bcast_seqno);
		bcast_packet->seqno = htonl(seqno);
278

279
		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay);
280 281

		/* a copy is stored in the bcast list, therefore removing
282 283
		 * the original skb.
		 */
284 285 286 287
		kfree_skb(skb);

	/* unicast packet */
	} else {
288
		if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_OFF) {
289
			ret = batadv_gw_out_of_range(bat_priv, skb);
290 291 292 293
			if (ret)
				goto dropped;
		}

294 295 296 297 298
		if (batadv_dat_snoop_outgoing_arp_request(bat_priv, skb))
			goto dropped;

		batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);

299
		ret = batadv_send_skb_unicast(bat_priv, skb);
300 301 302 303
		if (ret != 0)
			goto dropped_freed;
	}

304 305
	batadv_inc_counter(bat_priv, BATADV_CNT_TX);
	batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
306 307 308 309 310
	goto end;

dropped:
	kfree_skb(skb);
dropped_freed:
311
	batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
312
end:
313
	if (primary_if)
314
		batadv_hardif_free_ref(primary_if);
315 316 317
	return NETDEV_TX_OK;
}

318
void batadv_interface_rx(struct net_device *soft_iface,
319
			 struct sk_buff *skb, struct batadv_hard_iface *recv_if,
320
			 int hdr_size, struct batadv_orig_node *orig_node)
321
{
322
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
323 324
	struct ethhdr *ethhdr;
	struct vlan_ethhdr *vhdr;
325
	struct batadv_header *batadv_header = (struct batadv_header *)skb->data;
326
	unsigned short vid __maybe_unused = BATADV_NO_FLAGS;
327
	__be16 ethertype = htons(ETH_P_BATMAN);
328 329
	bool is_bcast;

330
	is_bcast = (batadv_header->packet_type == BATADV_BCAST);
331 332 333 334 335 336 337 338

	/* 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);

339
	ethhdr = eth_hdr(skb);
340 341 342 343 344

	switch (ntohs(ethhdr->h_proto)) {
	case ETH_P_8021Q:
		vhdr = (struct vlan_ethhdr *)skb->data;
		vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
345
		vid |= BATADV_VLAN_HAS_TAG;
346

347
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
348 349 350
			break;

		/* fall through */
A
Antonio Quartulli 已提交
351
	case ETH_P_BATMAN:
352 353 354 355 356 357 358 359
		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 已提交
360
	/* should not be necessary anymore as we use skb_pull_rcsum()
361
	 * TODO: please verify this and remove this TODO
362 363
	 * -- Dec 21st 2009, Simon Wunderlich
	 */
364

365
	/* skb->ip_summed = CHECKSUM_UNNECESSARY; */
366

367 368 369
	batadv_inc_counter(bat_priv, BATADV_CNT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
			   skb->len + ETH_HLEN);
370 371 372

	soft_iface->last_rx = jiffies;

373 374 375 376 377 378
	/* 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;

379 380 381 382
	if (orig_node)
		batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
						     ethhdr->h_source);

383
	if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest))
384 385
		goto dropped;

386
	netif_rx(skb);
387
	goto out;
388 389 390 391 392 393 394

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

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
/* 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);
}

425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
/**
 * 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)
{
	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;

	batadv_sysfs_del_meshif(soft_iface);

	rtnl_lock();
	unregister_netdevice(soft_iface);
	rtnl_unlock();
}

448 449 450 451 452 453 454
/**
 * 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)
455
{
456
	struct batadv_priv *bat_priv;
457
	uint32_t random_seqno;
458
	int ret;
459
	size_t cnt_len = sizeof(uint64_t) * BATADV_CNT_NUM;
460

461
	batadv_set_lockdep_class(dev);
462

463 464
	bat_priv = netdev_priv(dev);
	bat_priv->soft_iface = dev;
465
	INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
466 467 468 469 470 471

	/* 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)
472
		return -ENOMEM;
473 474 475

	atomic_set(&bat_priv->aggregated_ogms, 1);
	atomic_set(&bat_priv->bonding, 0);
476
#ifdef CONFIG_BATMAN_ADV_BLA
477
	atomic_set(&bat_priv->bridge_loop_avoidance, 0);
478
#endif
479 480 481
#ifdef CONFIG_BATMAN_ADV_DAT
	atomic_set(&bat_priv->distributed_arp_table, 1);
#endif
482
	atomic_set(&bat_priv->ap_isolation, 0);
483
	atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
484
	atomic_set(&bat_priv->gw_sel_class, 20);
485 486
	atomic_set(&bat_priv->gw.bandwidth_down, 100);
	atomic_set(&bat_priv->gw.bandwidth_up, 20);
487
	atomic_set(&bat_priv->orig_interval, 1000);
488
	atomic_set(&bat_priv->hop_penalty, 30);
489
#ifdef CONFIG_BATMAN_ADV_DEBUG
490
	atomic_set(&bat_priv->log_level, 0);
491
#endif
492
	atomic_set(&bat_priv->fragmentation, 1);
493 494
	atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
	atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
495

496
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
497
	atomic_set(&bat_priv->bcast_seqno, 1);
498 499 500 501 502 503 504 505
	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;
506

507 508 509 510
	/* randomize initial seqno to avoid collision */
	get_random_bytes(&random_seqno, sizeof(random_seqno));
	atomic_set(&bat_priv->frag_seqno, random_seqno);

511 512 513
	bat_priv->primary_if = NULL;
	bat_priv->num_ifaces = 0;

514 515
	batadv_nc_init_bat_priv(bat_priv);

516
	ret = batadv_algo_select(bat_priv, batadv_routing_algo);
517
	if (ret < 0)
518
		goto free_bat_counters;
519

520
	ret = batadv_debugfs_add_meshif(dev);
521
	if (ret < 0)
522
		goto free_bat_counters;
523

524
	ret = batadv_mesh_init(dev);
525 526 527
	if (ret < 0)
		goto unreg_debugfs;

528
	return 0;
529 530

unreg_debugfs:
531
	batadv_debugfs_del_meshif(dev);
532 533
free_bat_counters:
	free_percpu(bat_priv->bat_counters);
534
	bat_priv->bat_counters = NULL;
535 536 537 538

	return ret;
}

539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590
/**
 * 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);
	if (!hard_iface || hard_iface->soft_iface != NULL)
		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;
}

591 592 593 594 595 596 597
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,
	.ndo_set_mac_address = batadv_interface_set_mac_addr,
	.ndo_change_mtu = batadv_interface_change_mtu,
598
	.ndo_set_rx_mode = batadv_interface_set_rx_mode,
599
	.ndo_start_xmit = batadv_interface_tx,
600 601 602
	.ndo_validate_addr = eth_validate_addr,
	.ndo_add_slave = batadv_softif_slave_add,
	.ndo_del_slave = batadv_softif_slave_del,
603 604
};

605 606 607 608 609 610 611 612
/**
 * 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);
613 614 615 616 617 618 619

	/* 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();

620 621 622
	free_netdev(dev);
}

623 624 625 626 627 628 629 630 631 632 633
/**
 * 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;
634
	dev->destructor = batadv_softif_free;
635 636 637 638 639 640 641
	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 */
642
	dev->hard_header_len = batadv_max_header_len();
643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661

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

	SET_ETHTOOL_OPS(dev, &batadv_ethtool_ops);

	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,
				  batadv_softif_init_early);
	if (!soft_iface)
		return NULL;

662 663
	soft_iface->rtnl_link_ops = &batadv_link_ops;

664 665 666 667 668 669 670 671 672
	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;
673 674
}

675 676 677 678 679
/**
 * 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)
680
{
681 682 683
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);

	queue_work(batadv_event_workqueue, &bat_priv->cleanup_work);
684 685
}

686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
/**
 * 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);
}

706
int batadv_softif_is_valid(const struct net_device *net_dev)
707
{
708
	if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
709 710 711 712 713
		return 1;

	return 0;
}

714 715 716 717 718 719 720
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,
};

721
/* ethtool */
722
static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
723 724 725
{
	cmd->supported = 0;
	cmd->advertising = 0;
726
	ethtool_cmd_speed_set(cmd, SPEED_10);
727 728 729 730 731 732 733 734 735 736 737
	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;
}

738 739
static void batadv_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info)
740
{
741 742 743 744
	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));
745 746
}

747
static u32 batadv_get_msglevel(struct net_device *dev)
748 749 750 751
{
	return -EOPNOTSUPP;
}

752
static void batadv_set_msglevel(struct net_device *dev, u32 value)
753 754 755
{
}

756
static u32 batadv_get_link(struct net_device *dev)
757 758 759
{
	return 1;
}
760 761 762 763 764 765 766

/* 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];
767
} batadv_counters_strings[] = {
768 769 770 771 772
	{ "tx" },
	{ "tx_bytes" },
	{ "tx_dropped" },
	{ "rx" },
	{ "rx_bytes" },
773 774 775 776 777 778
	{ "forward" },
	{ "forward_bytes" },
	{ "mgmt_tx" },
	{ "mgmt_tx_bytes" },
	{ "mgmt_rx" },
	{ "mgmt_rx_bytes" },
779 780
	{ "frag_tx" },
	{ "frag_tx_bytes" },
781 782 783 784
	{ "frag_rx" },
	{ "frag_rx_bytes" },
	{ "frag_fwd" },
	{ "frag_fwd_bytes" },
785 786 787 788 789 790
	{ "tt_request_tx" },
	{ "tt_request_rx" },
	{ "tt_response_tx" },
	{ "tt_response_rx" },
	{ "tt_roam_adv_tx" },
	{ "tt_roam_adv_rx" },
791 792 793 794 795 796 797
#ifdef CONFIG_BATMAN_ADV_DAT
	{ "dat_get_tx" },
	{ "dat_get_rx" },
	{ "dat_put_tx" },
	{ "dat_put_rx" },
	{ "dat_cached_reply_tx" },
#endif
798 799 800 801 802
#ifdef CONFIG_BATMAN_ADV_NC
	{ "nc_code" },
	{ "nc_code_bytes" },
	{ "nc_recode" },
	{ "nc_recode_bytes" },
803
	{ "nc_buffer" },
804 805 806 807
	{ "nc_decode" },
	{ "nc_decode_bytes" },
	{ "nc_decode_failed" },
	{ "nc_sniffed" },
808
#endif
809 810 811 812 813 814
};

static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
			       uint8_t *data)
{
	if (stringset == ETH_SS_STATS)
815 816
		memcpy(data, batadv_counters_strings,
		       sizeof(batadv_counters_strings));
817 818 819 820 821 822
}

static void batadv_get_ethtool_stats(struct net_device *dev,
				     struct ethtool_stats *stats,
				     uint64_t *data)
{
823
	struct batadv_priv *bat_priv = netdev_priv(dev);
824 825
	int i;

826
	for (i = 0; i < BATADV_CNT_NUM; i++)
827 828 829 830 831 832
		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)
833
		return BATADV_CNT_NUM;
834 835 836

	return -EOPNOTSUPP;
}