soft-interface.c 21.9 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>
A
Antonio Quartulli 已提交
37
#include <linux/if_ether.h>
38
#include "unicast.h"
39
#include "bridge_loop_avoidance.h"
40
#include "network-coding.h"
41 42


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

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

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

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

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

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

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

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

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

118 119 120
	memcpy(old_addr, dev->dev_addr, ETH_ALEN);
	memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);

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

	return 0;
}

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

	dev->mtu = new_mtu;

	return 0;
}

142 143
static int batadv_interface_tx(struct sk_buff *skb,
			       struct net_device *soft_iface)
144 145
{
	struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
146 147
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
	struct batadv_hard_iface *primary_if = NULL;
148
	struct batadv_bcast_packet *bcast_packet;
149
	struct vlan_ethhdr *vhdr;
A
Antonio Quartulli 已提交
150
	__be16 ethertype = __constant_htons(ETH_P_BATMAN);
151 152 153 154
	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};
155
	unsigned int header_len = 0;
156
	int data_len = skb->len, ret;
157
	unsigned short vid __maybe_unused = BATADV_NO_FLAGS;
158
	bool do_bcast = false;
159
	uint32_t seqno;
160
	unsigned long brd_delay = 1;
161

162
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
163 164 165 166 167 168 169 170
		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;
171
		vid |= BATADV_VLAN_HAS_TAG;
172

173
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
174 175 176
			break;

		/* fall through */
A
Antonio Quartulli 已提交
177
	case ETH_P_BATMAN:
178
		goto dropped;
179
	}
180

181
	if (batadv_bla_tx(bat_priv, skb, vid))
182 183
		goto dropped;

184 185 186
	/* skb->data might have been reallocated by batadv_bla_tx() */
	ethhdr = (struct ethhdr *)skb->data;

187
	/* Register the client MAC in the transtable */
188 189
	if (!is_multicast_ether_addr(ethhdr->h_source))
		batadv_tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
190

191 192
	/* don't accept stp packets. STP does not help in meshes.
	 * better use the bridge loop avoidance ...
193 194 195
	 *
	 * The same goes for ECTP sent at least by some Cisco Switches,
	 * it might confuse the mesh when used with bridge loop avoidance.
196
	 */
197
	if (batadv_compare_eth(ethhdr->h_dest, stp_addr))
198 199
		goto dropped;

200 201 202
	if (batadv_compare_eth(ethhdr->h_dest, ectp_addr))
		goto dropped;

203 204
	if (is_multicast_ether_addr(ethhdr->h_dest)) {
		do_bcast = true;
205

206
		switch (atomic_read(&bat_priv->gw_mode)) {
207
		case BATADV_GW_MODE_SERVER:
208
			/* gateway servers should not send dhcp
209 210
			 * requests into the mesh
			 */
211
			ret = batadv_gw_is_dhcp_target(skb, &header_len);
212 213 214
			if (ret)
				goto dropped;
			break;
215
		case BATADV_GW_MODE_CLIENT:
216
			/* gateway clients should send dhcp requests
217 218
			 * via unicast to their gateway
			 */
219
			ret = batadv_gw_is_dhcp_target(skb, &header_len);
220 221 222
			if (ret)
				do_bcast = false;
			break;
223
		case BATADV_GW_MODE_OFF:
224 225 226
		default:
			break;
		}
227 228 229 230

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

233 234
	batadv_skb_set_priority(skb, 0);

235 236
	/* ethernet packet should be broadcasted */
	if (do_bcast) {
237
		primary_if = batadv_primary_if_get_selected(bat_priv);
238
		if (!primary_if)
239 240
			goto dropped;

241 242 243 244 245 246 247
		/* 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);

248
		if (batadv_skb_head_push(skb, sizeof(*bcast_packet)) < 0)
249 250
			goto dropped;

251
		bcast_packet = (struct batadv_bcast_packet *)skb->data;
252
		bcast_packet->header.version = BATADV_COMPAT_VERSION;
253
		bcast_packet->header.ttl = BATADV_TTL;
254 255

		/* batman packet type: broadcast */
256
		bcast_packet->header.packet_type = BATADV_BCAST;
257
		bcast_packet->reserved = 0;
258 259

		/* hw address of first interface is the orig mac because only
260 261
		 * this mac is known throughout the mesh
		 */
262
		memcpy(bcast_packet->orig,
263
		       primary_if->net_dev->dev_addr, ETH_ALEN);
264 265

		/* set broadcast sequence number */
266 267
		seqno = atomic_inc_return(&bat_priv->bcast_seqno);
		bcast_packet->seqno = htonl(seqno);
268

269
		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay);
270 271

		/* a copy is stored in the bcast list, therefore removing
272 273
		 * the original skb.
		 */
274 275 276 277
		kfree_skb(skb);

	/* unicast packet */
	} else {
278
		if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_OFF) {
279
			ret = batadv_gw_out_of_range(bat_priv, skb);
280 281 282 283
			if (ret)
				goto dropped;
		}

284 285 286 287 288
		if (batadv_dat_snoop_outgoing_arp_request(bat_priv, skb))
			goto dropped;

		batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);

289
		ret = batadv_unicast_send_skb(bat_priv, skb);
290 291 292 293
		if (ret != 0)
			goto dropped_freed;
	}

294 295
	batadv_inc_counter(bat_priv, BATADV_CNT_TX);
	batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
296 297 298 299 300
	goto end;

dropped:
	kfree_skb(skb);
dropped_freed:
301
	batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
302
end:
303
	if (primary_if)
304
		batadv_hardif_free_ref(primary_if);
305 306 307
	return NETDEV_TX_OK;
}

308
void batadv_interface_rx(struct net_device *soft_iface,
309
			 struct sk_buff *skb, struct batadv_hard_iface *recv_if,
310
			 int hdr_size, struct batadv_orig_node *orig_node)
311
{
312
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
313 314
	struct ethhdr *ethhdr;
	struct vlan_ethhdr *vhdr;
315
	struct batadv_header *batadv_header = (struct batadv_header *)skb->data;
316
	unsigned short vid __maybe_unused = BATADV_NO_FLAGS;
A
Antonio Quartulli 已提交
317
	__be16 ethertype = __constant_htons(ETH_P_BATMAN);
318 319
	bool is_bcast;

320
	is_bcast = (batadv_header->packet_type == BATADV_BCAST);
321 322 323 324 325 326 327 328

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

329
	ethhdr = eth_hdr(skb);
330 331 332 333 334

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

337
		if (vhdr->h_vlan_encapsulated_proto != ethertype)
338 339 340
			break;

		/* fall through */
A
Antonio Quartulli 已提交
341
	case ETH_P_BATMAN:
342 343 344 345 346 347 348 349
		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 已提交
350
	/* should not be necessary anymore as we use skb_pull_rcsum()
351
	 * TODO: please verify this and remove this TODO
352 353
	 * -- Dec 21st 2009, Simon Wunderlich
	 */
354

355
	/* skb->ip_summed = CHECKSUM_UNNECESSARY; */
356

357 358 359
	batadv_inc_counter(bat_priv, BATADV_CNT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
			   skb->len + ETH_HLEN);
360 361 362

	soft_iface->last_rx = jiffies;

363 364 365 366 367 368
	/* 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;

369 370 371 372
	if (orig_node)
		batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
						     ethhdr->h_source);

373
	if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest))
374 375
		goto dropped;

376
	netif_rx(skb);
377
	goto out;
378 379 380 381 382 383 384

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

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

415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
/**
 * 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();
}

438 439 440 441 442 443 444
/**
 * 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)
445
{
446
	struct batadv_priv *bat_priv;
447
	int ret;
448
	size_t cnt_len = sizeof(uint64_t) * BATADV_CNT_NUM;
449

450
	batadv_set_lockdep_class(dev);
451

452 453
	bat_priv = netdev_priv(dev);
	bat_priv->soft_iface = dev;
454
	INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
455 456 457 458 459 460

	/* 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)
461
		return -ENOMEM;
462 463 464

	atomic_set(&bat_priv->aggregated_ogms, 1);
	atomic_set(&bat_priv->bonding, 0);
465
#ifdef CONFIG_BATMAN_ADV_BLA
466
	atomic_set(&bat_priv->bridge_loop_avoidance, 0);
467
#endif
468 469 470
#ifdef CONFIG_BATMAN_ADV_DAT
	atomic_set(&bat_priv->distributed_arp_table, 1);
#endif
471
	atomic_set(&bat_priv->ap_isolation, 0);
472
	atomic_set(&bat_priv->vis_mode, BATADV_VIS_TYPE_CLIENT_UPDATE);
473
	atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
474 475 476
	atomic_set(&bat_priv->gw_sel_class, 20);
	atomic_set(&bat_priv->gw_bandwidth, 41);
	atomic_set(&bat_priv->orig_interval, 1000);
477
	atomic_set(&bat_priv->hop_penalty, 30);
478
#ifdef CONFIG_BATMAN_ADV_DEBUG
479
	atomic_set(&bat_priv->log_level, 0);
480
#endif
481
	atomic_set(&bat_priv->fragmentation, 1);
482 483
	atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
	atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
484

485
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
486
	atomic_set(&bat_priv->bcast_seqno, 1);
487 488 489 490 491 492 493 494
	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;
495 496 497 498

	bat_priv->primary_if = NULL;
	bat_priv->num_ifaces = 0;

499 500
	batadv_nc_init_bat_priv(bat_priv);

501
	ret = batadv_algo_select(bat_priv, batadv_routing_algo);
502
	if (ret < 0)
503
		goto free_bat_counters;
504

505
	ret = batadv_debugfs_add_meshif(dev);
506
	if (ret < 0)
507
		goto free_bat_counters;
508

509
	ret = batadv_mesh_init(dev);
510 511 512
	if (ret < 0)
		goto unreg_debugfs;

513
	return 0;
514 515

unreg_debugfs:
516
	batadv_debugfs_del_meshif(dev);
517 518
free_bat_counters:
	free_percpu(bat_priv->bat_counters);
519
	bat_priv->bat_counters = NULL;
520 521 522 523

	return ret;
}

524 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 563 564 565 566 567 568 569 570 571 572 573 574 575
/**
 * 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;
}

576 577 578 579 580 581 582 583
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,
	.ndo_start_xmit = batadv_interface_tx,
584 585 586
	.ndo_validate_addr = eth_validate_addr,
	.ndo_add_slave = batadv_softif_slave_add,
	.ndo_del_slave = batadv_softif_slave_del,
587 588
};

589 590 591 592 593 594 595 596
/**
 * 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);
597 598 599 600 601 602 603

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

604 605 606
	free_netdev(dev);
}

607 608 609 610 611 612 613 614 615 616 617
/**
 * 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;
618
	dev->destructor = batadv_softif_free;
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
	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 */
	dev->hard_header_len = BATADV_HEADER_LEN;

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

646 647
	soft_iface->rtnl_link_ops = &batadv_link_ops;

648 649 650 651 652 653 654 655 656
	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;
657 658
}

659 660 661 662 663
/**
 * 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)
664
{
665 666 667
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);

	queue_work(batadv_event_workqueue, &bat_priv->cleanup_work);
668 669
}

670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
/**
 * 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);
}

690
int batadv_softif_is_valid(const struct net_device *net_dev)
691
{
692
	if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
693 694 695 696 697
		return 1;

	return 0;
}

698 699 700 701 702 703 704
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,
};

705
/* ethtool */
706
static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
707 708 709
{
	cmd->supported = 0;
	cmd->advertising = 0;
710
	ethtool_cmd_speed_set(cmd, SPEED_10);
711 712 713 714 715 716 717 718 719 720 721
	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;
}

722 723
static void batadv_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info)
724
{
725 726 727 728
	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));
729 730
}

731
static u32 batadv_get_msglevel(struct net_device *dev)
732 733 734 735
{
	return -EOPNOTSUPP;
}

736
static void batadv_set_msglevel(struct net_device *dev, u32 value)
737 738 739
{
}

740
static u32 batadv_get_link(struct net_device *dev)
741 742 743
{
	return 1;
}
744 745 746 747 748 749 750

/* 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];
751
} batadv_counters_strings[] = {
752 753 754 755 756
	{ "tx" },
	{ "tx_bytes" },
	{ "tx_dropped" },
	{ "rx" },
	{ "rx_bytes" },
757 758 759 760 761 762 763 764 765 766 767 768
	{ "forward" },
	{ "forward_bytes" },
	{ "mgmt_tx" },
	{ "mgmt_tx_bytes" },
	{ "mgmt_rx" },
	{ "mgmt_rx_bytes" },
	{ "tt_request_tx" },
	{ "tt_request_rx" },
	{ "tt_response_tx" },
	{ "tt_response_rx" },
	{ "tt_roam_adv_tx" },
	{ "tt_roam_adv_rx" },
769 770 771 772 773 774 775
#ifdef CONFIG_BATMAN_ADV_DAT
	{ "dat_get_tx" },
	{ "dat_get_rx" },
	{ "dat_put_tx" },
	{ "dat_put_rx" },
	{ "dat_cached_reply_tx" },
#endif
776 777 778 779 780
#ifdef CONFIG_BATMAN_ADV_NC
	{ "nc_code" },
	{ "nc_code_bytes" },
	{ "nc_recode" },
	{ "nc_recode_bytes" },
781
	{ "nc_buffer" },
782 783 784 785
	{ "nc_decode" },
	{ "nc_decode_bytes" },
	{ "nc_decode_failed" },
	{ "nc_sniffed" },
786
#endif
787 788 789 790 791 792
};

static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
			       uint8_t *data)
{
	if (stringset == ETH_SS_STATS)
793 794
		memcpy(data, batadv_counters_strings,
		       sizeof(batadv_counters_strings));
795 796 797 798 799 800
}

static void batadv_get_ethtool_stats(struct net_device *dev,
				     struct ethtool_stats *stats,
				     uint64_t *data)
{
801
	struct batadv_priv *bat_priv = netdev_priv(dev);
802 803
	int i;

804
	for (i = 0; i < BATADV_CNT_NUM; i++)
805 806 807 808 809 810
		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)
811
		return BATADV_CNT_NUM;
812 813 814

	return -EOPNOTSUPP;
}