soft-interface.c 32.7 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0
2
/* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
3 4 5 6 7 8 9 10 11 12 13 14 15
 *
 * 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
16
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 18 19
 */

#include "soft-interface.h"
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>
26
#include <linux/cpumask.h>
27
#include <linux/errno.h>
28
#include <linux/etherdevice.h>
29
#include <linux/ethtool.h>
30
#include <linux/gfp.h>
31
#include <linux/if_ether.h>
32
#include <linux/if_vlan.h>
33 34
#include <linux/jiffies.h>
#include <linux/kernel.h>
35
#include <linux/kref.h>
36 37 38 39 40 41 42 43
#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>
44
#include <linux/rtnetlink.h>
45 46 47 48 49 50 51
#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>
52
#include <uapi/linux/batadv_packet.h>
53

54
#include "bat_algo.h"
55
#include "bridge_loop_avoidance.h"
56 57 58 59 60 61
#include "debugfs.h"
#include "distributed-arp-table.h"
#include "gateway_client.h"
#include "gateway_common.h"
#include "hard-interface.h"
#include "multicast.h"
62
#include "network-coding.h"
63
#include "originator.h"
64 65 66
#include "send.h"
#include "sysfs.h"
#include "translation-table.h"
67

68 69 70 71 72 73 74
/**
 * batadv_skb_head_push() - Increase header size and move (push) head pointer
 * @skb: packet buffer which should be modified
 * @len: number of bytes to add
 *
 * Return: 0 on success or negative error number in case of failure
 */
75
int batadv_skb_head_push(struct sk_buff *skb, unsigned int len)
76 77 78
{
	int result;

79
	/* TODO: We must check if we can release all references to non-payload
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
82 83 84 85 86 87 88 89 90 91 92 93
	 * 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;
}

94
static int batadv_interface_open(struct net_device *dev)
95 96 97 98 99
{
	netif_start_queue(dev);
	return 0;
}

100
static int batadv_interface_release(struct net_device *dev)
101 102 103 104 105
{
	netif_stop_queue(dev);
	return 0;
}

106
/**
107
 * batadv_sum_counter() - Sum the cpu-local counters for index 'idx'
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
 * @bat_priv: the bat priv with all the soft interface information
 * @idx: index of counter to sum up
 *
 * Return: sum of all cpu-local counters
 */
static u64 batadv_sum_counter(struct batadv_priv *bat_priv,  size_t idx)
{
	u64 *counters, sum = 0;
	int cpu;

	for_each_possible_cpu(cpu) {
		counters = per_cpu_ptr(bat_priv->bat_counters, cpu);
		sum += counters[idx];
	}

	return sum;
}

126
static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
127
{
128
	struct batadv_priv *bat_priv = netdev_priv(dev);
129
	struct net_device_stats *stats = &dev->stats;
130 131 132 133 134 135 136

	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;
137 138
}

139
static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
140
{
141
	struct batadv_priv *bat_priv = netdev_priv(dev);
142
	struct batadv_softif_vlan *vlan;
143
	struct sockaddr *addr = p;
144
	u8 old_addr[ETH_ALEN];
145 146 147 148

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

149 150
	ether_addr_copy(old_addr, dev->dev_addr);
	ether_addr_copy(dev->dev_addr, addr->sa_data);
151

152
	/* only modify transtable if it has been initialized before */
153 154 155 156 157 158
	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,
159
				       "mac address changed", false);
160
		batadv_tt_local_add(dev, addr->sa_data, vlan->vid,
161
				    BATADV_NULL_IFINDEX, BATADV_NO_MARK);
162
	}
163
	rcu_read_unlock();
164 165 166 167

	return 0;
}

168
static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
169 170
{
	/* check ranges */
171
	if (new_mtu < 68 || new_mtu > batadv_hardif_min_mtu(dev))
172 173 174 175 176 177 178
		return -EINVAL;

	dev->mtu = new_mtu;

	return 0;
}

179
/**
180
 * batadv_interface_set_rx_mode() - set the rx mode of a device
181 182 183 184 185 186 187 188 189 190
 * @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)
{
}

191 192
static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
				       struct net_device *soft_iface)
193
{
194
	struct ethhdr *ethhdr;
195 196
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
	struct batadv_hard_iface *primary_if = NULL;
197
	struct batadv_bcast_packet *bcast_packet;
198 199 200 201
	static const u8 stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00,
					      0x00, 0x00};
	static const u8 ectp_addr[ETH_ALEN] = {0xCF, 0x00, 0x00, 0x00,
					       0x00, 0x00};
202
	enum batadv_dhcp_recipient dhcp_rcp = BATADV_DHCP_NO;
203
	u8 *dst_hint = NULL, chaddr[ETH_ALEN];
204
	struct vlan_ethhdr *vhdr;
205
	unsigned int header_len = 0;
206
	int data_len = skb->len, ret;
207
	unsigned long brd_delay = 1;
208
	bool do_bcast = false, client_added;
209
	unsigned short vid;
210
	u32 seqno;
211
	int gw_mode;
212 213
	enum batadv_forw_mode forw_mode;
	struct batadv_orig_node *mcast_single_orig = NULL;
214
	int network_offset = ETH_HLEN;
215
	__be16 proto;
216

217
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
218 219
		goto dropped;

220 221 222
	/* reset control block to avoid left overs from previous users */
	memset(skb->cb, 0, sizeof(struct batadv_skb_cb));

223
	netif_trans_update(soft_iface);
224
	vid = batadv_get_vid(skb, 0);
225
	ethhdr = eth_hdr(skb);
226

227 228 229
	proto = ethhdr->h_proto;

	switch (ntohs(proto)) {
230
	case ETH_P_8021Q:
231
		vhdr = vlan_eth_hdr(skb);
232
		proto = vhdr->h_vlan_encapsulated_proto;
233

234
		/* drop batman-in-batman packets to prevent loops */
235
		if (proto != htons(ETH_P_BATMAN)) {
236
			network_offset += VLAN_HLEN;
237
			break;
238
		}
239 240

		/* fall through */
A
Antonio Quartulli 已提交
241
	case ETH_P_BATMAN:
242
		goto dropped;
243
	}
244

245 246
	skb_set_network_header(skb, network_offset);

247
	if (batadv_bla_tx(bat_priv, skb, vid))
248 249
		goto dropped;

250
	/* skb->data might have been reallocated by batadv_bla_tx() */
251
	ethhdr = eth_hdr(skb);
252

253
	/* Register the client MAC in the transtable */
254 255
	if (!is_multicast_ether_addr(ethhdr->h_source) &&
	    !batadv_bla_is_loopdetect_mac(ethhdr->h_source)) {
256
		client_added = batadv_tt_local_add(soft_iface, ethhdr->h_source,
257 258
						   vid, skb->skb_iif,
						   skb->mark);
259 260 261
		if (!client_added)
			goto dropped;
	}
262

263 264 265
	/* Snoop address candidates from DHCPACKs for early DAT filling */
	batadv_dat_snoop_outgoing_dhcp_ack(bat_priv, skb, proto, vid);

266 267
	/* don't accept stp packets. STP does not help in meshes.
	 * better use the bridge loop avoidance ...
268 269 270
	 *
	 * The same goes for ECTP sent at least by some Cisco Switches,
	 * it might confuse the mesh when used with bridge loop avoidance.
271
	 */
272
	if (batadv_compare_eth(ethhdr->h_dest, stp_addr))
273 274
		goto dropped;

275 276 277
	if (batadv_compare_eth(ethhdr->h_dest, ectp_addr))
		goto dropped;

278
	gw_mode = atomic_read(&bat_priv->gw.mode);
279
	if (is_multicast_ether_addr(ethhdr->h_dest)) {
280 281 282 283
		/* if gw mode is off, broadcast every packet */
		if (gw_mode == BATADV_GW_MODE_OFF) {
			do_bcast = true;
			goto send;
284
		}
285

286 287 288 289
		dhcp_rcp = batadv_gw_dhcp_recipient_get(skb, &header_len,
							chaddr);
		/* skb->data may have been modified by
		 * batadv_gw_dhcp_recipient_get()
290
		 */
291
		ethhdr = eth_hdr(skb);
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
		/* 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;
308

309
send:
310 311 312 313 314 315 316 317 318 319 320
		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;
		}
	}

321 322
	batadv_skb_set_priority(skb, 0);

323 324
	/* ethernet packet should be broadcasted */
	if (do_bcast) {
325
		primary_if = batadv_primary_if_get_selected(bat_priv);
326
		if (!primary_if)
327 328
			goto dropped;

329 330 331 332 333 334 335
		/* 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);

336
		if (batadv_skb_head_push(skb, sizeof(*bcast_packet)) < 0)
337 338
			goto dropped;

339
		bcast_packet = (struct batadv_bcast_packet *)skb->data;
340 341
		bcast_packet->version = BATADV_COMPAT_VERSION;
		bcast_packet->ttl = BATADV_TTL;
342 343

		/* batman packet type: broadcast */
344
		bcast_packet->packet_type = BATADV_BCAST;
345
		bcast_packet->reserved = 0;
346 347

		/* hw address of first interface is the orig mac because only
348 349
		 * this mac is known throughout the mesh
		 */
350 351
		ether_addr_copy(bcast_packet->orig,
				primary_if->net_dev->dev_addr);
352 353

		/* set broadcast sequence number */
354 355
		seqno = atomic_inc_return(&bat_priv->bcast_seqno);
		bcast_packet->seqno = htonl(seqno);
356

357
		batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay, true);
358 359

		/* a copy is stored in the bcast list, therefore removing
360 361
		 * the original skb.
		 */
362
		consume_skb(skb);
363 364 365

	/* unicast packet */
	} else {
366 367
		/* DHCP packets going to a server will use the GW feature */
		if (dhcp_rcp == BATADV_DHCP_TO_SERVER) {
368
			ret = batadv_gw_out_of_range(bat_priv, skb);
369 370
			if (ret)
				goto dropped;
371
			ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
372 373 374 375
		} else if (mcast_single_orig) {
			ret = batadv_send_skb_unicast(bat_priv, skb,
						      BATADV_UNICAST, 0,
						      mcast_single_orig, vid);
376 377 378 379
		} else {
			if (batadv_dat_snoop_outgoing_arp_request(bat_priv,
								  skb))
				goto dropped;
380

381 382 383 384 385
			batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);

			ret = batadv_send_skb_via_tt(bat_priv, skb, dst_hint,
						     vid);
		}
386
		if (ret != NET_XMIT_SUCCESS)
387 388 389
			goto dropped_freed;
	}

390 391
	batadv_inc_counter(bat_priv, BATADV_CNT_TX);
	batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
392 393 394 395 396
	goto end;

dropped:
	kfree_skb(skb);
dropped_freed:
397
	batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
398
end:
399 400
	if (mcast_single_orig)
		batadv_orig_node_put(mcast_single_orig);
401
	if (primary_if)
402
		batadv_hardif_put(primary_if);
403 404 405
	return NETDEV_TX_OK;
}

406
/**
407
 * batadv_interface_rx() - receive ethernet frame on local batman-adv interface
408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
 * @soft_iface: local interface which will receive the ethernet frame
 * @skb: ethernet frame for @soft_iface
 * @hdr_size: size of already parsed batman-adv header
 * @orig_node: originator from which the batman-adv packet was sent
 *
 * Sends a ethernet frame to the receive path of the local @soft_iface.
 * skb->data has still point to the batman-adv header with the size @hdr_size.
 * The caller has to have parsed this header already and made sure that at least
 * @hdr_size bytes are still available for pull in @skb.
 *
 * The packet may still get dropped. This can happen when the encapsulated
 * ethernet frame is invalid or contains again an batman-adv packet. Also
 * unicast packets will be dropped directly when it was sent between two
 * isolated clients.
 */
423
void batadv_interface_rx(struct net_device *soft_iface,
424 425
			 struct sk_buff *skb, int hdr_size,
			 struct batadv_orig_node *orig_node)
426
{
427
	struct batadv_bcast_packet *batadv_bcast_packet;
428 429 430 431
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
	struct vlan_ethhdr *vhdr;
	struct ethhdr *ethhdr;
	unsigned short vid;
432 433
	bool is_bcast;

434 435
	batadv_bcast_packet = (struct batadv_bcast_packet *)skb->data;
	is_bcast = (batadv_bcast_packet->packet_type == BATADV_BCAST);
436 437 438 439

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

440 441 442 443 444
	/* clean the netfilter state now that the batman-adv header has been
	 * removed
	 */
	nf_reset(skb);

445 446 447
	if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
		goto dropped;

448
	vid = batadv_get_vid(skb, 0);
449
	ethhdr = eth_hdr(skb);
450 451 452

	switch (ntohs(ethhdr->h_proto)) {
	case ETH_P_8021Q:
453 454 455
		if (!pskb_may_pull(skb, VLAN_ETH_HLEN))
			goto dropped;

456 457
		vhdr = (struct vlan_ethhdr *)skb->data;

458 459
		/* drop batman-in-batman packets to prevent loops */
		if (vhdr->h_vlan_encapsulated_proto != htons(ETH_P_BATMAN))
460 461 462
			break;

		/* fall through */
A
Antonio Quartulli 已提交
463
	case ETH_P_BATMAN:
464 465 466 467 468
		goto dropped;
	}

	/* skb->dev & skb->pkt_type are set here */
	skb->protocol = eth_type_trans(skb, soft_iface);
469
	skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
470

471 472 473
	batadv_inc_counter(bat_priv, BATADV_CNT_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
			   skb->len + ETH_HLEN);
474

475 476 477 478 479 480
	/* 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;

481 482
	if (orig_node)
		batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
483
						     ethhdr->h_source, vid);
484

485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
	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)) {
500
		goto dropped;
501
	}
502

503
	netif_rx(skb);
504
	goto out;
505 506 507 508 509 510 511

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

512
/**
513 514
 * batadv_softif_vlan_release() - release vlan from lists and queue for free
 *  after rcu grace period
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
 * @ref: kref pointer of the vlan object
 */
static void batadv_softif_vlan_release(struct kref *ref)
{
	struct batadv_softif_vlan *vlan;

	vlan = container_of(ref, struct batadv_softif_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);
}

530
/**
531
 * batadv_softif_vlan_put() - decrease the vlan object refcounter and
532
 *  possibly release it
533
 * @vlan: the vlan object to release
534
 */
535
void batadv_softif_vlan_put(struct batadv_softif_vlan *vlan)
536
{
537 538 539
	if (!vlan)
		return;

540
	kref_put(&vlan->refcount, batadv_softif_vlan_release);
541 542 543
}

/**
544
 * batadv_softif_vlan_get() - get the vlan object for a specific vid
545 546 547
 * @bat_priv: the bat priv with all the soft interface information
 * @vid: the identifier of the vlan object to retrieve
 *
548
 * Return: the private data of the vlan matching the vid passed as argument or
549 550
 * NULL otherwise. The refcounter of the returned object is incremented by 1.
 */
551 552
struct batadv_softif_vlan *batadv_softif_vlan_get(struct batadv_priv *bat_priv,
						  unsigned short vid)
553 554 555 556 557 558 559 560
{
	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;

561
		if (!kref_get_unless_zero(&vlan_tmp->refcount))
562 563 564 565 566 567 568 569 570 571 572
			continue;

		vlan = vlan_tmp;
		break;
	}
	rcu_read_unlock();

	return vlan;
}

/**
573
 * batadv_softif_create_vlan() - allocate the needed resources for a new vlan
574 575 576
 * @bat_priv: the bat priv with all the soft interface information
 * @vid: the VLAN identifier
 *
577
 * Return: 0 on success, a negative error otherwise.
578 579 580 581
 */
int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
{
	struct batadv_softif_vlan *vlan;
582
	int err;
583

584 585
	spin_lock_bh(&bat_priv->softif_vlan_list_lock);

586 587
	vlan = batadv_softif_vlan_get(bat_priv, vid);
	if (vlan) {
588
		batadv_softif_vlan_put(vlan);
589
		spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
590 591 592 593
		return -EEXIST;
	}

	vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC);
594 595
	if (!vlan) {
		spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
596
		return -ENOMEM;
597
	}
598

599
	vlan->bat_priv = bat_priv;
600
	vlan->vid = vid;
601
	kref_init(&vlan->refcount);
602

603 604
	atomic_set(&vlan->ap_isolation, 0);

605 606 607 608 609 610 611
	kref_get(&vlan->refcount);
	hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list);
	spin_unlock_bh(&bat_priv->softif_vlan_list_lock);

	/* batadv_sysfs_add_vlan cannot be in the spinlock section due to the
	 * sleeping behavior of the sysfs functions and the fs_reclaim lock
	 */
612 613
	err = batadv_sysfs_add_vlan(bat_priv->soft_iface, vlan);
	if (err) {
614 615 616 617 618
		/* ref for the function */
		batadv_softif_vlan_put(vlan);

		/* ref for the list */
		batadv_softif_vlan_put(vlan);
619 620 621
		return err;
	}

622 623 624 625 626
	/* 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,
627
			    BATADV_NULL_IFINDEX, BATADV_NO_MARK);
628

629 630 631
	/* don't return reference to new softif_vlan */
	batadv_softif_vlan_put(vlan);

632 633 634 635
	return 0;
}

/**
636
 * batadv_softif_destroy_vlan() - remove and destroy a softif_vlan object
637 638 639 640 641 642 643 644 645 646 647 648
 * @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);

649
	batadv_sysfs_del_vlan(bat_priv, vlan);
650
	batadv_softif_vlan_put(vlan);
651 652 653
}

/**
654
 * batadv_interface_add_vid() - ndo_add_vid API implementation
655
 * @dev: the netdev of the mesh interface
656
 * @proto: protocol of the the vlan id
657 658 659 660 661
 * @vid: identifier of the new vlan
 *
 * Set up all the internal structures for handling the new vlan on top of the
 * mesh interface
 *
662
 * Return: 0 on success or a negative error code in case of failure.
663 664 665 666 667
 */
static int batadv_interface_add_vid(struct net_device *dev, __be16 proto,
				    unsigned short vid)
{
	struct batadv_priv *bat_priv = netdev_priv(dev);
668 669
	struct batadv_softif_vlan *vlan;
	int ret;
670 671 672 673 674 675 676 677 678

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

679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694
	/* 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) {
695
			batadv_softif_vlan_put(vlan);
696 697 698 699 700 701 702 703 704 705 706 707 708
			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;
709 710 711
}

/**
712
 * batadv_interface_kill_vid() - ndo_kill_vid API implementation
713
 * @dev: the netdev of the mesh interface
714
 * @proto: protocol of the the vlan id
715 716 717 718 719
 * @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
 *
720
 * Return: 0 on success, -EINVAL if the specified prototype is not ETH_P_8021Q
721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741
 * 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 */
742
	batadv_softif_vlan_put(vlan);
743 744 745 746

	return 0;
}

747 748 749 750 751 752 753 754
/* 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;

/**
755
 * batadv_set_lockdep_class_one() - Set lockdep class for a single tx queue
756 757 758 759 760 761 762 763 764 765 766 767
 * @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);
}

/**
768
 * batadv_set_lockdep_class() - Set txq and addr_list lockdep class
769 770 771 772 773 774 775 776
 * @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);
}

777
/**
778
 * batadv_softif_init_late() - late stage initialization of soft interface
779 780
 * @dev: registered network device to modify
 *
781
 * Return: error code on failures
782 783
 */
static int batadv_softif_init_late(struct net_device *dev)
784
{
785
	struct batadv_priv *bat_priv;
786
	u32 random_seqno;
787
	int ret;
788
	size_t cnt_len = sizeof(u64) * BATADV_CNT_NUM;
789

790
	batadv_set_lockdep_class(dev);
791

792 793
	bat_priv = netdev_priv(dev);
	bat_priv->soft_iface = dev;
794 795 796 797

	/* batadv_interface_stats() needs to be available as soon as
	 * register_netdevice() has been called
	 */
798
	bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(u64));
799
	if (!bat_priv->bat_counters)
800
		return -ENOMEM;
801 802 803

	atomic_set(&bat_priv->aggregated_ogms, 1);
	atomic_set(&bat_priv->bonding, 0);
804
#ifdef CONFIG_BATMAN_ADV_BLA
805
	atomic_set(&bat_priv->bridge_loop_avoidance, 1);
806
#endif
807 808
#ifdef CONFIG_BATMAN_ADV_DAT
	atomic_set(&bat_priv->distributed_arp_table, 1);
809 810
#endif
#ifdef CONFIG_BATMAN_ADV_MCAST
811 812 813 814
	bat_priv->mcast.querier_ipv4.exists = false;
	bat_priv->mcast.querier_ipv4.shadowing = false;
	bat_priv->mcast.querier_ipv6.exists = false;
	bat_priv->mcast.querier_ipv6.shadowing = false;
815
	bat_priv->mcast.flags = BATADV_NO_FLAGS;
816
	atomic_set(&bat_priv->multicast_mode, 1);
817
	atomic_set(&bat_priv->mcast.num_want_all_unsnoopables, 0);
818 819
	atomic_set(&bat_priv->mcast.num_want_all_ipv4, 0);
	atomic_set(&bat_priv->mcast.num_want_all_ipv6, 0);
820
#endif
821
	atomic_set(&bat_priv->gw.mode, BATADV_GW_MODE_OFF);
822 823
	atomic_set(&bat_priv->gw.bandwidth_down, 100);
	atomic_set(&bat_priv->gw.bandwidth_up, 20);
824
	atomic_set(&bat_priv->orig_interval, 1000);
825
	atomic_set(&bat_priv->hop_penalty, 30);
826
#ifdef CONFIG_BATMAN_ADV_DEBUG
827
	atomic_set(&bat_priv->log_level, 0);
828
#endif
829
	atomic_set(&bat_priv->fragmentation, 1);
830
	atomic_set(&bat_priv->packet_size_max, ETH_DATA_LEN);
831 832
	atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
	atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
833

834
	atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
835
	atomic_set(&bat_priv->bcast_seqno, 1);
836 837 838 839 840 841
	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
842 843
	atomic_set(&bat_priv->tp_num, 0);

844 845
	bat_priv->tt.last_changeset = NULL;
	bat_priv->tt.last_changeset_len = 0;
846 847
	bat_priv->isolation_mark = 0;
	bat_priv->isolation_mark_mask = 0;
848

849 850 851 852
	/* randomize initial seqno to avoid collision */
	get_random_bytes(&random_seqno, sizeof(random_seqno));
	atomic_set(&bat_priv->frag_seqno, random_seqno);

853 854
	bat_priv->primary_if = NULL;

855 856
	batadv_nc_init_bat_priv(bat_priv);

857
	ret = batadv_algo_select(bat_priv, batadv_routing_algo);
858
	if (ret < 0)
859
		goto free_bat_counters;
860

861
	ret = batadv_debugfs_add_meshif(dev);
862
	if (ret < 0)
863
		goto free_bat_counters;
864

865
	ret = batadv_mesh_init(dev);
866 867 868
	if (ret < 0)
		goto unreg_debugfs;

869
	return 0;
870 871

unreg_debugfs:
872
	batadv_debugfs_del_meshif(dev);
873 874
free_bat_counters:
	free_percpu(bat_priv->bat_counters);
875
	bat_priv->bat_counters = NULL;
876 877 878 879

	return ret;
}

880
/**
881
 * batadv_softif_slave_add() - Add a slave interface to a batadv_soft_interface
882 883
 * @dev: batadv_soft_interface used as master interface
 * @slave_dev: net_device which should become the slave interface
884
 * @extack: extended ACK report struct
885
 *
886
 * Return: 0 if successful or error otherwise.
887 888
 */
static int batadv_softif_slave_add(struct net_device *dev,
D
David Ahern 已提交
889 890
				   struct net_device *slave_dev,
				   struct netlink_ext_ack *extack)
891 892
{
	struct batadv_hard_iface *hard_iface;
893
	struct net *net = dev_net(dev);
894 895 896
	int ret = -EINVAL;

	hard_iface = batadv_hardif_get_by_netdev(slave_dev);
897
	if (!hard_iface || hard_iface->soft_iface)
898 899
		goto out;

900
	ret = batadv_hardif_enable_interface(hard_iface, net, dev->name);
901 902 903

out:
	if (hard_iface)
904
		batadv_hardif_put(hard_iface);
905 906 907 908
	return ret;
}

/**
909
 * batadv_softif_slave_del() - Delete a slave iface from a batadv_soft_interface
910 911 912
 * @dev: batadv_soft_interface used as master interface
 * @slave_dev: net_device which should be removed from the master interface
 *
913
 * Return: 0 if successful or error otherwise.
914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
 */
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)
931
		batadv_hardif_put(hard_iface);
932 933 934
	return ret;
}

935 936 937 938 939
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,
940 941
	.ndo_vlan_rx_add_vid = batadv_interface_add_vid,
	.ndo_vlan_rx_kill_vid = batadv_interface_kill_vid,
942 943
	.ndo_set_mac_address = batadv_interface_set_mac_addr,
	.ndo_change_mtu = batadv_interface_change_mtu,
944
	.ndo_set_rx_mode = batadv_interface_set_rx_mode,
945
	.ndo_start_xmit = batadv_interface_tx,
946 947 948
	.ndo_validate_addr = eth_validate_addr,
	.ndo_add_slave = batadv_softif_slave_add,
	.ndo_del_slave = batadv_softif_slave_del,
949 950
};

951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
static void batadv_get_drvinfo(struct net_device *dev,
			       struct ethtool_drvinfo *info)
{
	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));
}

/* 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];
} batadv_counters_strings[] = {
	{ "tx" },
	{ "tx_bytes" },
	{ "tx_dropped" },
	{ "rx" },
	{ "rx_bytes" },
	{ "forward" },
	{ "forward_bytes" },
	{ "mgmt_tx" },
	{ "mgmt_tx_bytes" },
	{ "mgmt_rx" },
	{ "mgmt_rx_bytes" },
	{ "frag_tx" },
	{ "frag_tx_bytes" },
	{ "frag_rx" },
	{ "frag_rx_bytes" },
	{ "frag_fwd" },
	{ "frag_fwd_bytes" },
	{ "tt_request_tx" },
	{ "tt_request_rx" },
	{ "tt_response_tx" },
	{ "tt_response_rx" },
	{ "tt_roam_adv_tx" },
	{ "tt_roam_adv_rx" },
#ifdef CONFIG_BATMAN_ADV_DAT
	{ "dat_get_tx" },
	{ "dat_get_rx" },
	{ "dat_put_tx" },
	{ "dat_put_rx" },
	{ "dat_cached_reply_tx" },
#endif
#ifdef CONFIG_BATMAN_ADV_NC
	{ "nc_code" },
	{ "nc_code_bytes" },
	{ "nc_recode" },
	{ "nc_recode_bytes" },
	{ "nc_buffer" },
	{ "nc_decode" },
	{ "nc_decode_bytes" },
	{ "nc_decode_failed" },
	{ "nc_sniffed" },
#endif
};

static void batadv_get_strings(struct net_device *dev, u32 stringset, u8 *data)
{
	if (stringset == ETH_SS_STATS)
		memcpy(data, batadv_counters_strings,
		       sizeof(batadv_counters_strings));
}

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

	for (i = 0; i < BATADV_CNT_NUM; i++)
		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)
		return BATADV_CNT_NUM;

	return -EOPNOTSUPP;
}

static const struct ethtool_ops batadv_ethtool_ops = {
	.get_drvinfo = batadv_get_drvinfo,
	.get_link = ethtool_op_get_link,
	.get_strings = batadv_get_strings,
	.get_ethtool_stats = batadv_get_ethtool_stats,
	.get_sset_count = batadv_get_sset_count,
};

1043
/**
1044
 * batadv_softif_free() - Deconstructor of batadv_soft_interface
1045 1046 1047 1048 1049 1050
 * @dev: Device to cleanup and remove
 */
static void batadv_softif_free(struct net_device *dev)
{
	batadv_debugfs_del_meshif(dev);
	batadv_mesh_free(dev);
1051 1052 1053 1054 1055 1056

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

1059
/**
1060
 * batadv_softif_init_early() - early stage initialization of soft interface
1061 1062 1063 1064 1065 1066 1067
 * @dev: registered network device to modify
 */
static void batadv_softif_init_early(struct net_device *dev)
{
	ether_setup(dev);

	dev->netdev_ops = &batadv_netdev_ops;
1068 1069
	dev->needs_free_netdev = true;
	dev->priv_destructor = batadv_softif_free;
1070
	dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL;
1071
	dev->features |= NETIF_F_LLTX;
1072
	dev->priv_flags |= IFF_NO_QUEUE;
1073 1074 1075 1076 1077 1078 1079 1080 1081

	/* can't call min_mtu, because the needed variables
	 * have not been initialized yet
	 */
	dev->mtu = ETH_DATA_LEN;

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

1082
	dev->ethtool_ops = &batadv_ethtool_ops;
1083 1084
}

1085 1086 1087 1088 1089 1090 1091
/**
 * batadv_softif_create() - Create and register soft interface
 * @net: the applicable net namespace
 * @name: name of the new soft interface
 *
 * Return: newly allocated soft_interface, NULL on errors
 */
1092
struct net_device *batadv_softif_create(struct net *net, const char *name)
1093 1094 1095 1096 1097
{
	struct net_device *soft_iface;
	int ret;

	soft_iface = alloc_netdev(sizeof(struct batadv_priv), name,
1098
				  NET_NAME_UNKNOWN, batadv_softif_init_early);
1099 1100 1101
	if (!soft_iface)
		return NULL;

1102 1103
	dev_net_set(soft_iface, net);

1104 1105
	soft_iface->rtnl_link_ops = &batadv_link_ops;

1106 1107 1108 1109 1110 1111 1112 1113 1114
	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;
1115 1116
}

1117
/**
1118
 * batadv_softif_destroy_sysfs() - deletion of batadv_soft_interface via sysfs
1119 1120 1121
 * @soft_iface: the to-be-removed batman-adv interface
 */
void batadv_softif_destroy_sysfs(struct net_device *soft_iface)
1122
{
1123
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
1124 1125 1126 1127 1128 1129 1130 1131 1132 1133
	struct batadv_softif_vlan *vlan;

	ASSERT_RTNL();

	/* 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_put(vlan);
	}
1134

1135 1136
	batadv_sysfs_del_meshif(soft_iface);
	unregister_netdevice(soft_iface);
1137 1138
}

1139
/**
1140 1141
 * batadv_softif_destroy_netlink() - deletion of batadv_soft_interface via
 *  netlink
1142 1143 1144 1145 1146 1147
 * @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)
{
1148
	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
1149
	struct batadv_hard_iface *hard_iface;
1150
	struct batadv_softif_vlan *vlan;
1151 1152 1153 1154 1155 1156 1157

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

1158 1159 1160 1161 1162 1163 1164
	/* 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_put(vlan);
	}

1165 1166 1167 1168
	batadv_sysfs_del_meshif(soft_iface);
	unregister_netdevice_queue(soft_iface, head);
}

1169 1170 1171 1172 1173 1174
/**
 * batadv_softif_is_valid() - Check whether device is a batadv soft interface
 * @net_dev: device which should be checked
 *
 * Return: true when net_dev is a batman-adv interface, false otherwise
 */
1175
bool batadv_softif_is_valid(const struct net_device *net_dev)
1176
{
1177
	if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
1178
		return true;
1179

1180
	return false;
1181 1182
}

1183 1184 1185 1186 1187 1188
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,
};