routing.c 34.2 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 23 24 25 26 27
 *
 * 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 "routing.h"
#include "send.h"
#include "soft-interface.h"
#include "hard-interface.h"
#include "icmp_socket.h"
#include "translation-table.h"
#include "originator.h"
28
#include "bridge_loop_avoidance.h"
29
#include "distributed-arp-table.h"
30
#include "network-coding.h"
31
#include "fragmentation.h"
32

33 34
#include <linux/if_vlan.h>

35
static int batadv_route_unicast_packet(struct sk_buff *skb,
36
				       struct batadv_hard_iface *recv_if);
37

38 39 40
static void _batadv_update_route(struct batadv_priv *bat_priv,
				 struct batadv_orig_node *orig_node,
				 struct batadv_neigh_node *neigh_node)
41
{
42
	struct batadv_neigh_node *curr_router;
43

44
	curr_router = batadv_orig_node_get_router(orig_node);
45

46
	/* route deleted */
47
	if ((curr_router) && (!neigh_node)) {
48 49
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
			   "Deleting route towards: %pM\n", orig_node->orig);
50
		batadv_tt_global_del_orig(bat_priv, orig_node, -1,
51
					  "Deleted route towards originator");
52

53 54
	/* route added */
	} else if ((!curr_router) && (neigh_node)) {
55
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
56 57
			   "Adding route towards: %pM (via %pM)\n",
			   orig_node->orig, neigh_node->addr);
58
	/* route changed */
59
	} else if (neigh_node && curr_router) {
60
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
61 62 63
			   "Changing route towards: %pM (now via %pM - was via %pM)\n",
			   orig_node->orig, neigh_node->addr,
			   curr_router->addr);
64 65
	}

66
	if (curr_router)
67
		batadv_neigh_node_free_ref(curr_router);
68 69

	/* increase refcount of new best neighbor */
70 71
	if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
		neigh_node = NULL;
72 73 74 75 76 77 78

	spin_lock_bh(&orig_node->neigh_list_lock);
	rcu_assign_pointer(orig_node->router, neigh_node);
	spin_unlock_bh(&orig_node->neigh_list_lock);

	/* decrease refcount of previous best neighbor */
	if (curr_router)
79
		batadv_neigh_node_free_ref(curr_router);
80 81
}

82 83 84
void batadv_update_route(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node,
			 struct batadv_neigh_node *neigh_node)
85
{
86
	struct batadv_neigh_node *router = NULL;
87 88

	if (!orig_node)
89 90
		goto out;

91
	router = batadv_orig_node_get_router(orig_node);
92

93
	if (router != neigh_node)
94
		_batadv_update_route(bat_priv, orig_node, neigh_node);
95 96 97

out:
	if (router)
98
		batadv_neigh_node_free_ref(router);
99 100
}

101
/* caller must hold the neigh_list_lock */
102 103
void batadv_bonding_candidate_del(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
104 105 106 107 108 109 110
{
	/* this neighbor is not part of our candidate list */
	if (list_empty(&neigh_node->bonding_list))
		goto out;

	list_del_rcu(&neigh_node->bonding_list);
	INIT_LIST_HEAD(&neigh_node->bonding_list);
111
	batadv_neigh_node_free_ref(neigh_node);
112 113 114 115 116 117
	atomic_dec(&orig_node->bond_candidates);

out:
	return;
}

118 119 120 121 122 123 124 125 126 127
/**
 * batadv_bonding_candidate_add - consider a new link for bonding mode towards
 *  the given originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: the target node
 * @neigh_node: the neighbor representing the new link to consider for bonding
 *  mode
 */
void batadv_bonding_candidate_add(struct batadv_priv *bat_priv,
				  struct batadv_orig_node *orig_node,
128
				  struct batadv_neigh_node *neigh_node)
129
{
130
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
131
	struct batadv_neigh_node *tmp_neigh_node, *router = NULL;
132
	uint8_t interference_candidate = 0;
133 134 135 136

	spin_lock_bh(&orig_node->neigh_list_lock);

	/* only consider if it has the same primary address ...  */
137 138
	if (!batadv_compare_eth(orig_node->orig,
				neigh_node->orig_node->primary_addr))
139 140
		goto candidate_del;

141
	router = batadv_orig_node_get_router(orig_node);
142
	if (!router)
143 144
		goto candidate_del;

145

146
	/* ... and is good enough to be considered */
147
	if (bao->bat_neigh_is_equiv_or_better(neigh_node, router))
148 149
		goto candidate_del;

150
	/* check if we have another candidate with the same mac address or
151 152 153
	 * interface. If we do, we won't select this candidate because of
	 * possible interference.
	 */
154
	hlist_for_each_entry_rcu(tmp_neigh_node,
155 156 157 158 159
				 &orig_node->neigh_list, list) {
		if (tmp_neigh_node == neigh_node)
			continue;

		/* we only care if the other candidate is even
160 161
		 * considered as candidate.
		 */
162 163 164 165
		if (list_empty(&tmp_neigh_node->bonding_list))
			continue;

		if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
166 167
		    (batadv_compare_eth(neigh_node->addr,
					tmp_neigh_node->addr))) {
168 169 170 171 172 173 174 175 176 177 178 179 180
			interference_candidate = 1;
			break;
		}
	}

	/* don't care further if it is an interference candidate */
	if (interference_candidate)
		goto candidate_del;

	/* this neighbor already is part of our candidate list */
	if (!list_empty(&neigh_node->bonding_list))
		goto out;

181 182 183
	if (!atomic_inc_not_zero(&neigh_node->refcount))
		goto out;

184 185 186 187 188
	list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
	atomic_inc(&orig_node->bond_candidates);
	goto out;

candidate_del:
189
	batadv_bonding_candidate_del(orig_node, neigh_node);
190 191 192

out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
193 194

	if (router)
195
		batadv_neigh_node_free_ref(router);
196 197 198
}

/* copy primary address for bonding */
199
void
200 201
batadv_bonding_save_primary(const struct batadv_orig_node *orig_node,
			    struct batadv_orig_node *orig_neigh_node,
202
			    const struct batadv_ogm_packet *batman_ogm_packet)
203
{
204
	if (!(batman_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP))
205 206 207 208 209
		return;

	memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
}

210 211 212 213 214
/* checks whether the host restarted and is in the protection time.
 * returns:
 *  0 if the packet is to be accepted
 *  1 if the packet is to be ignored.
 */
215
int batadv_window_protected(struct batadv_priv *bat_priv, int32_t seq_num_diff,
216
			    unsigned long *last_reset)
217
{
218 219 220 221
	if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
	    seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
		if (!batadv_has_timed_out(*last_reset,
					  BATADV_RESET_PROTECTION_MS))
222
			return 1;
223 224

		*last_reset = jiffies;
225
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
226
			   "old packet received, start protection\n");
227
	}
228

229 230 231
	return 0;
}

232
bool batadv_check_management_packet(struct sk_buff *skb,
233
				    struct batadv_hard_iface *hard_iface,
234
				    int header_len)
235 236 237 238
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
239 240
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
241

242
	ethhdr = eth_hdr(skb);
243 244 245

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
246
		return false;
247 248 249

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
250
		return false;
251 252 253

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
254
		return false;
255 256 257

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
258
		return false;
259

260
	return true;
261 262
}

263
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
264
				      struct sk_buff *skb, size_t icmp_len)
265
{
266 267
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
268
	struct batadv_icmp_packet_rr *icmp_packet;
269
	int ret = NET_RX_DROP;
270

271
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
272 273

	/* add data to device queue */
274
	if (icmp_packet->icmph.msg_type != BATADV_ECHO_REQUEST) {
275
		batadv_socket_receive_packet(icmp_packet, icmp_len);
276
		goto out;
277 278
	}

279
	primary_if = batadv_primary_if_get_selected(bat_priv);
280
	if (!primary_if)
281
		goto out;
282 283 284

	/* answer echo request (ping) */
	/* get routing information */
285
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.orig);
286
	if (!orig_node)
287
		goto out;
288

289
	/* create a copy of the skb, if needed, to modify it. */
290
	if (skb_cow(skb, ETH_HLEN) < 0)
291 292
		goto out;

293
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
294

295 296 297 298 299
	memcpy(icmp_packet->icmph.dst, icmp_packet->icmph.orig, ETH_ALEN);
	memcpy(icmp_packet->icmph.orig, primary_if->net_dev->dev_addr,
	       ETH_ALEN);
	icmp_packet->icmph.msg_type = BATADV_ECHO_REPLY;
	icmp_packet->icmph.header.ttl = BATADV_TTL;
300

301
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
302
		ret = NET_RX_SUCCESS;
303

304
out:
305
	if (primary_if)
306
		batadv_hardif_free_ref(primary_if);
307
	if (orig_node)
308
		batadv_orig_node_free_ref(orig_node);
309 310 311
	return ret;
}

312
static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
313
					 struct sk_buff *skb)
314
{
315 316
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
317
	struct batadv_icmp_packet *icmp_packet;
318
	int ret = NET_RX_DROP;
319

320
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
321 322

	/* send TTL exceeded if packet is an echo request (traceroute) */
323
	if (icmp_packet->icmph.msg_type != BATADV_ECHO_REQUEST) {
324
		pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
325
			 icmp_packet->icmph.orig, icmp_packet->icmph.dst);
326
		goto out;
327 328
	}

329
	primary_if = batadv_primary_if_get_selected(bat_priv);
330
	if (!primary_if)
331
		goto out;
332 333

	/* get routing information */
334
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.orig);
335
	if (!orig_node)
336
		goto out;
337

338
	/* create a copy of the skb, if needed, to modify it. */
339
	if (skb_cow(skb, ETH_HLEN) < 0)
340
		goto out;
341

342
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
343

344 345 346 347 348
	memcpy(icmp_packet->icmph.dst, icmp_packet->icmph.orig, ETH_ALEN);
	memcpy(icmp_packet->icmph.orig, primary_if->net_dev->dev_addr,
	       ETH_ALEN);
	icmp_packet->icmph.msg_type = BATADV_TTL_EXCEEDED;
	icmp_packet->icmph.header.ttl = BATADV_TTL;
349

350
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
351
		ret = NET_RX_SUCCESS;
352

353
out:
354
	if (primary_if)
355
		batadv_hardif_free_ref(primary_if);
356
	if (orig_node)
357
		batadv_orig_node_free_ref(orig_node);
358 359 360 361
	return ret;
}


362 363
int batadv_recv_icmp_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
364
{
365
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
366
	struct batadv_icmp_packet_rr *icmp_packet;
367
	struct ethhdr *ethhdr;
368
	struct batadv_orig_node *orig_node = NULL;
369
	int hdr_size = sizeof(struct batadv_icmp_packet);
370
	int ret = NET_RX_DROP;
371

372
	/* we truncate all incoming icmp packets if they don't match our size */
373 374
	if (skb->len >= sizeof(struct batadv_icmp_packet_rr))
		hdr_size = sizeof(struct batadv_icmp_packet_rr);
375 376 377

	/* drop packet if it has not necessary minimum size */
	if (unlikely(!pskb_may_pull(skb, hdr_size)))
378
		goto out;
379

380
	ethhdr = eth_hdr(skb);
381 382 383

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
384
		goto out;
385 386 387

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
388
		goto out;
389 390

	/* not for me */
391
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
392
		goto out;
393

394
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
395 396

	/* add record route information if not full */
397 398
	if ((icmp_packet->icmph.msg_type == BATADV_ECHO_REPLY ||
	     icmp_packet->icmph.msg_type == BATADV_ECHO_REQUEST) &&
399
	    (hdr_size == sizeof(struct batadv_icmp_packet_rr)) &&
400
	    (icmp_packet->rr_cur < BATADV_RR_LEN)) {
401
		memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
402
		       ethhdr->h_dest, ETH_ALEN);
403 404 405 406
		icmp_packet->rr_cur++;
	}

	/* packet for me */
407
	if (batadv_is_my_mac(bat_priv, icmp_packet->icmph.dst))
408
		return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
409 410

	/* TTL exceeded */
411
	if (icmp_packet->icmph.header.ttl < 2)
412
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
413 414

	/* get routing information */
415
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.dst);
416
	if (!orig_node)
417
		goto out;
418

419
	/* create a copy of the skb, if needed, to modify it. */
420
	if (skb_cow(skb, ETH_HLEN) < 0)
421
		goto out;
422

423
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
424

425
	/* decrement ttl */
426
	icmp_packet->icmph.header.ttl--;
427 428

	/* route it */
429
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
430
		ret = NET_RX_SUCCESS;
431

432 433
out:
	if (orig_node)
434
		batadv_orig_node_free_ref(orig_node);
435 436 437
	return ret;
}

438 439 440 441
/* In the bonding case, send the packets in a round
 * robin fashion over the remaining interfaces.
 *
 * This method rotates the bonding list and increases the
442 443
 * returned router's refcount.
 */
444 445 446
static struct batadv_neigh_node *
batadv_find_bond_router(struct batadv_orig_node *primary_orig,
			const struct batadv_hard_iface *recv_if)
447
{
448 449
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476

	rcu_read_lock();
	list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
				bonding_list) {
		if (!first_candidate)
			first_candidate = tmp_neigh_node;

		/* recv_if == NULL on the first node. */
		if (tmp_neigh_node->if_incoming == recv_if)
			continue;

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

		router = tmp_neigh_node;
		break;
	}

	/* use the first candidate if nothing was found. */
	if (!router && first_candidate &&
	    atomic_inc_not_zero(&first_candidate->refcount))
		router = first_candidate;

	if (!router)
		goto out;

	/* selected should point to the next element
477 478
	 * after the current router
	 */
479 480
	spin_lock_bh(&primary_orig->neigh_list_lock);
	/* this is a list_move(), which unfortunately
481 482
	 * does not exist as rcu version
	 */
483 484 485 486 487 488 489 490 491 492
	list_del_rcu(&primary_orig->bond_list);
	list_add_rcu(&primary_orig->bond_list,
		     &router->bonding_list);
	spin_unlock_bh(&primary_orig->neigh_list_lock);

out:
	rcu_read_unlock();
	return router;
}

493 494 495 496 497 498 499
/**
 * batadv_find_ifalter_router - find the best of the remaining candidates which
 *  are not using this interface
 * @bat_priv: the bat priv with all the soft interface information
 * @primary_orig: the destination
 * @recv_if: the interface that the router returned by this function has to not
 *  use
500
 *
501 502
 * Returns the best candidate towards primary_orig that is not using recv_if.
 * Increases the returned neighbor's refcount
503
 */
504
static struct batadv_neigh_node *
505 506
batadv_find_ifalter_router(struct batadv_priv *bat_priv,
			   struct batadv_orig_node *primary_orig,
507
			   const struct batadv_hard_iface *recv_if)
508
{
509
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
510 511
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
	struct batadv_neigh_node *tmp_neigh_node;
512 513 514 515 516 517 518 519 520 521 522

	rcu_read_lock();
	list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
				bonding_list) {
		if (!first_candidate)
			first_candidate = tmp_neigh_node;

		/* recv_if == NULL on the first node. */
		if (tmp_neigh_node->if_incoming == recv_if)
			continue;

523
		if (router && bao->bat_neigh_cmp(tmp_neigh_node, router))
524 525
			continue;

526 527 528
		if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
			continue;

529 530 531
		/* decrement refcount of previously selected router */
		if (router)
			batadv_neigh_node_free_ref(router);
532

533 534
		/* we found a better router (or at least one valid router) */
		router = tmp_neigh_node;
535 536 537 538 539 540 541 542 543 544 545
	}

	/* use the first candidate if nothing was found. */
	if (!router && first_candidate &&
	    atomic_inc_not_zero(&first_candidate->refcount))
		router = first_candidate;

	rcu_read_unlock();
	return router;
}

546 547
/**
 * batadv_check_unicast_packet - Check for malformed unicast packets
548
 * @bat_priv: the bat priv with all the soft interface information
549 550 551 552 553 554 555 556
 * @skb: packet to check
 * @hdr_size: size of header to pull
 *
 * Check for short header and bad addresses in given packet. Returns negative
 * value when check fails and 0 otherwise. The negative value depends on the
 * reason: -ENODATA for bad header, -EBADR for broadcast destination or source,
 * and -EREMOTE for non-local (other host) destination.
 */
557 558
static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
				       struct sk_buff *skb, int hdr_size)
559 560 561 562 563
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
	if (unlikely(!pskb_may_pull(skb, hdr_size)))
564
		return -ENODATA;
565

566
	ethhdr = eth_hdr(skb);
567 568 569

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
570
		return -EBADR;
571 572 573

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
574
		return -EBADR;
575 576

	/* not for me */
577
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
578
		return -EREMOTE;
579 580 581 582

	return 0;
}

583
/* find a suitable router for this originator, and use
584
 * bonding if possible. increases the found neighbors
585 586
 * refcount.
 */
587 588 589 590
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
		   const struct batadv_hard_iface *recv_if)
591
{
592 593 594
	struct batadv_orig_node *primary_orig_node;
	struct batadv_orig_node *router_orig;
	struct batadv_neigh_node *router;
595 596
	static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
	int bonding_enabled;
597
	uint8_t *primary_addr;
598 599 600 601

	if (!orig_node)
		return NULL;

602
	router = batadv_orig_node_get_router(orig_node);
603
	if (!router)
604
		goto err;
605 606

	/* without bonding, the first node should
607 608
	 * always choose the default router.
	 */
609 610
	bonding_enabled = atomic_read(&bat_priv->bonding);

611 612
	rcu_read_lock();
	/* select default router to output */
613
	router_orig = router->orig_node;
614 615
	if (!router_orig)
		goto err_unlock;
616 617 618

	if ((!recv_if) && (!bonding_enabled))
		goto return_router;
619

620 621
	primary_addr = router_orig->primary_addr;

622
	/* if we have something in the primary_addr, we can search
623 624
	 * for a potential bonding candidate.
	 */
625
	if (batadv_compare_eth(primary_addr, zero_mac))
626
		goto return_router;
627 628

	/* find the orig_node which has the primary interface. might
629 630
	 * even be the same as our router_orig in many cases
	 */
631
	if (batadv_compare_eth(primary_addr, router_orig->orig)) {
632 633
		primary_orig_node = router_orig;
	} else {
634 635
		primary_orig_node = batadv_orig_hash_find(bat_priv,
							  primary_addr);
636
		if (!primary_orig_node)
637
			goto return_router;
638

639
		batadv_orig_node_free_ref(primary_orig_node);
640 641 642
	}

	/* with less than 2 candidates, we can't do any
643 644
	 * bonding and prefer the original router.
	 */
645 646
	if (atomic_read(&primary_orig_node->bond_candidates) < 2)
		goto return_router;
647 648 649

	/* all nodes between should choose a candidate which
	 * is is not on the interface where the packet came
650 651
	 * in.
	 */
652
	batadv_neigh_node_free_ref(router);
653

654
	if (bonding_enabled)
655
		router = batadv_find_bond_router(primary_orig_node, recv_if);
656
	else
657 658
		router = batadv_find_ifalter_router(bat_priv, primary_orig_node,
						    recv_if);
659

660
return_router:
661
	if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
662 663
		goto err_unlock;

664
	rcu_read_unlock();
665
	return router;
666 667 668 669
err_unlock:
	rcu_read_unlock();
err:
	if (router)
670
		batadv_neigh_node_free_ref(router);
671
	return NULL;
672 673
}

674
static int batadv_route_unicast_packet(struct sk_buff *skb,
675
				       struct batadv_hard_iface *recv_if)
676
{
677 678
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
679
	struct batadv_unicast_packet *unicast_packet;
680
	struct ethhdr *ethhdr = eth_hdr(skb);
681
	int res, hdr_len, ret = NET_RX_DROP;
682

683
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
684 685

	/* TTL exceeded */
686
	if (unicast_packet->header.ttl < 2) {
687 688
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
689
		goto out;
690 691 692
	}

	/* get routing information */
693
	orig_node = batadv_orig_hash_find(bat_priv, unicast_packet->dest);
694

695
	if (!orig_node)
696
		goto out;
697 698

	/* create a copy of the skb, if needed, to modify it. */
699
	if (skb_cow(skb, ETH_HLEN) < 0)
700
		goto out;
701 702

	/* decrement ttl */
703
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
704
	unicast_packet->header.ttl--;
705

706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721
	switch (unicast_packet->header.packet_type) {
	case BATADV_UNICAST_4ADDR:
		hdr_len = sizeof(struct batadv_unicast_4addr_packet);
		break;
	case BATADV_UNICAST:
		hdr_len = sizeof(struct batadv_unicast_packet);
		break;
	default:
		/* other packet types not supported - yet */
		hdr_len = -1;
		break;
	}

	if (hdr_len > 0)
		batadv_skb_set_priority(skb, hdr_len);

722
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
723

724 725 726
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
727 728 729
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
				   skb->len + ETH_HLEN);
730 731 732 733 734

		ret = NET_RX_SUCCESS;
	} else if (res == NET_XMIT_POLICED) {
		/* skb was buffered and consumed */
		ret = NET_RX_SUCCESS;
735
	}
736

737 738
out:
	if (orig_node)
739
		batadv_orig_node_free_ref(orig_node);
740
	return ret;
741 742
}

743 744 745 746 747
/**
 * batadv_reroute_unicast_packet - update the unicast header for re-routing
 * @bat_priv: the bat priv with all the soft interface information
 * @unicast_packet: the unicast header to be updated
 * @dst_addr: the payload destination
748
 * @vid: VLAN identifier
749 750 751 752 753 754 755 756 757 758
 *
 * Search the translation table for dst_addr and update the unicast header with
 * the new corresponding information (originator address where the destination
 * client currently is and its known TTVN)
 *
 * Returns true if the packet header has been updated, false otherwise
 */
static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
			      struct batadv_unicast_packet *unicast_packet,
759
			      uint8_t *dst_addr, unsigned short vid)
760 761 762 763 764 765
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
	uint8_t *orig_addr, orig_ttvn;

766
	if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
767 768 769 770 771 772
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;
		orig_addr = primary_if->net_dev->dev_addr;
		orig_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
	} else {
773 774
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
						     vid);
775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798
		if (!orig_node)
			goto out;

		if (batadv_compare_eth(orig_node->orig, unicast_packet->dest))
			goto out;

		orig_addr = orig_node->orig;
		orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
	}

	/* update the packet header */
	memcpy(unicast_packet->dest, orig_addr, ETH_ALEN);
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
		batadv_hardif_free_ref(primary_if);
	if (orig_node)
		batadv_orig_node_free_ref(orig_node);

	return ret;
}

799
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
800
				     struct sk_buff *skb, int hdr_len) {
801 802
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_hard_iface *primary_if;
803
	struct batadv_orig_node *orig_node;
804
	uint8_t curr_ttvn, old_ttvn;
805
	struct ethhdr *ethhdr;
806
	unsigned short vid;
807
	int is_old_ttvn;
808

809
	/* check if there is enough data before accessing it */
810
	if (pskb_may_pull(skb, hdr_len + ETH_HLEN) < 0)
811 812 813 814
		return 0;

	/* create a copy of the skb (in case of for re-routing) to modify it. */
	if (skb_cow(skb, sizeof(*unicast_packet)) < 0)
815 816
		return 0;

817
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
818
	vid = batadv_get_vid(skb, hdr_len);
819
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
820

821 822 823 824 825
	/* check if the destination client was served by this node and it is now
	 * roaming. In this case, it means that the node has got a ROAM_ADV
	 * message and that it knows the new destination in the mesh to re-route
	 * the packet to
	 */
826
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
827
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
828
						  ethhdr->h_dest, vid))
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846
			net_ratelimited_function(batadv_dbg, BATADV_DBG_TT,
						 bat_priv,
						 "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
						 unicast_packet->dest,
						 ethhdr->h_dest);
		/* at this point the mesh destination should have been
		 * substituted with the originator address found in the global
		 * table. If not, let the packet go untouched anyway because
		 * there is nothing the node can do
		 */
		return 1;
	}

	/* retrieve the TTVN known by this node for the packet destination. This
	 * value is used later to check if the node which sent (or re-routed
	 * last time) the packet had an updated information or not
	 */
	curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
847
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
848 849
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
850 851 852 853
		/* if it is not possible to find the orig_node representing the
		 * destination, the packet can immediately be dropped as it will
		 * not be possible to deliver it
		 */
854 855 856 857
		if (!orig_node)
			return 0;

		curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
858
		batadv_orig_node_free_ref(orig_node);
859 860
	}

861 862 863
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
864
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
865 866
	if (!is_old_ttvn)
		return 1;
867

868 869 870 871 872 873
	old_ttvn = unicast_packet->ttvn;
	/* the packet was forged based on outdated network information. Its
	 * destination can possibly be updated and forwarded towards the new
	 * target host
	 */
	if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
874
					  ethhdr->h_dest, vid)) {
875 876 877 878 879 880
		net_ratelimited_function(batadv_dbg, BATADV_DBG_TT, bat_priv,
					 "Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n",
					 unicast_packet->dest, ethhdr->h_dest,
					 old_ttvn, curr_ttvn);
		return 1;
	}
881

882 883 884 885
	/* the packet has not been re-routed: either the destination is
	 * currently served by this node or there is no destination at all and
	 * it is possible to drop the packet
	 */
886
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid))
887
		return 0;
888

889 890 891 892 893 894
	/* update the header in order to let the packet be delivered to this
	 * node's soft interface
	 */
	primary_if = batadv_primary_if_get_selected(bat_priv);
	if (!primary_if)
		return 0;
895

896 897 898 899 900
	memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
901 902 903 904

	return 1;
}

905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932
/**
 * batadv_recv_unhandled_unicast_packet - receive and process packets which
 *	are in the unicast number space but not yet known to the implementation
 * @skb: unicast tvlv packet to process
 * @recv_if: pointer to interface this packet was received on
 *
 * Returns NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
 * otherwise.
 */
int batadv_recv_unhandled_unicast_packet(struct sk_buff *skb,
					 struct batadv_hard_iface *recv_if)
{
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	int check, hdr_size = sizeof(*unicast_packet);

	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
	if (check < 0)
		return NET_RX_DROP;

	/* we don't know about this type, drop it. */
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest))
		return NET_RX_DROP;

	return batadv_route_unicast_packet(skb, recv_if);
}

933 934
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
935
{
936
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
937
	struct batadv_unicast_packet *unicast_packet;
938
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
939 940
	uint8_t *orig_addr;
	struct batadv_orig_node *orig_node = NULL;
941
	int check, hdr_size = sizeof(*unicast_packet);
942
	bool is4addr;
943

944
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
945
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
946

947
	is4addr = unicast_packet->header.packet_type == BATADV_UNICAST_4ADDR;
948
	/* the caller function should have already pulled 2 bytes */
949
	if (is4addr)
950
		hdr_size = sizeof(*unicast_4addr_packet);
951

952
	/* function returns -EREMOTE for promiscuous packets */
953
	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
954 955 956 957 958 959 960 961

	/* Even though the packet is not for us, we might save it to use for
	 * decoding a later received coded packet
	 */
	if (check == -EREMOTE)
		batadv_nc_skb_store_sniffed_unicast(bat_priv, skb);

	if (check < 0)
962
		return NET_RX_DROP;
963
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
964 965
		return NET_RX_DROP;

966
	/* packet for me */
967
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
968
		if (is4addr) {
969 970
			batadv_dat_inc_counter(bat_priv,
					       unicast_4addr_packet->subtype);
971 972 973
			orig_addr = unicast_4addr_packet->src;
			orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
		}
974

975 976 977 978 979 980 981
		if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
							  hdr_size))
			goto rx_success;
		if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb,
							hdr_size))
			goto rx_success;

982
		batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
983
				    orig_node);
984

985
rx_success:
986 987 988
		if (orig_node)
			batadv_orig_node_free_ref(orig_node);

989 990 991
		return NET_RX_SUCCESS;
	}

992
	return batadv_route_unicast_packet(skb, recv_if);
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
/**
 * batadv_recv_unicast_tvlv - receive and process unicast tvlv packets
 * @skb: unicast tvlv packet to process
 * @recv_if: pointer to interface this packet was received on
 * @dst_addr: the payload destination
 *
 * Returns NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
 * otherwise.
 */
int batadv_recv_unicast_tvlv(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
{
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_unicast_tvlv_packet *unicast_tvlv_packet;
	unsigned char *tvlv_buff;
	uint16_t tvlv_buff_len;
	int hdr_size = sizeof(*unicast_tvlv_packet);
	int ret = NET_RX_DROP;

	if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
		return NET_RX_DROP;

	/* the header is likely to be modified while forwarding */
	if (skb_cow(skb, hdr_size) < 0)
		return NET_RX_DROP;

	/* packet needs to be linearized to access the tvlv content */
	if (skb_linearize(skb) < 0)
		return NET_RX_DROP;

	unicast_tvlv_packet = (struct batadv_unicast_tvlv_packet *)skb->data;

	tvlv_buff = (unsigned char *)(skb->data + hdr_size);
	tvlv_buff_len = ntohs(unicast_tvlv_packet->tvlv_len);

	if (tvlv_buff_len > skb->len - hdr_size)
		return NET_RX_DROP;

	ret = batadv_tvlv_containers_process(bat_priv, false, NULL,
					     unicast_tvlv_packet->src,
					     unicast_tvlv_packet->dst,
					     tvlv_buff, tvlv_buff_len);

	if (ret != NET_RX_SUCCESS)
		ret = batadv_route_unicast_packet(skb, recv_if);

	return ret;
}
1043

1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
/**
 * batadv_recv_frag_packet - process received fragment
 * @skb: the received fragment
 * @recv_if: interface that the skb is received on
 *
 * This function does one of the three following things: 1) Forward fragment, if
 * the assembled packet will exceed our MTU; 2) Buffer fragment, if we till
 * lack further fragments; 3) Merge fragments, if we have all needed parts.
 *
 * Return NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
 */
int batadv_recv_frag_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
{
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node_src = NULL;
	struct batadv_frag_packet *frag_packet;
	int ret = NET_RX_DROP;

	if (batadv_check_unicast_packet(bat_priv, skb,
					sizeof(*frag_packet)) < 0)
		goto out;

	frag_packet = (struct batadv_frag_packet *)skb->data;
	orig_node_src = batadv_orig_hash_find(bat_priv, frag_packet->orig);
	if (!orig_node_src)
		goto out;

	/* Route the fragment if it is not for us and too big to be merged. */
	if (!batadv_is_my_mac(bat_priv, frag_packet->dest) &&
	    batadv_frag_skb_fwd(skb, recv_if, orig_node_src)) {
		ret = NET_RX_SUCCESS;
		goto out;
	}

	batadv_inc_counter(bat_priv, BATADV_CNT_FRAG_RX);
	batadv_add_counter(bat_priv, BATADV_CNT_FRAG_RX_BYTES, skb->len);

	/* Add fragment to buffer and merge if possible. */
	if (!batadv_frag_skb_buffer(&skb, orig_node_src))
		goto out;

	/* Deliver merged packet to the appropriate handler, if it was
	 * merged
	 */
	if (skb)
		batadv_batman_skb_recv(skb, recv_if->net_dev,
				       &recv_if->batman_adv_ptype, NULL);

	ret = NET_RX_SUCCESS;

out:
	if (orig_node_src)
		batadv_orig_node_free_ref(orig_node_src);

	return ret;
}

1102 1103
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1104
{
1105 1106
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1107
	struct batadv_bcast_packet *bcast_packet;
1108
	struct ethhdr *ethhdr;
1109
	int hdr_size = sizeof(*bcast_packet);
1110
	int ret = NET_RX_DROP;
1111 1112 1113 1114
	int32_t seq_diff;

	/* drop packet if it has not necessary minimum size */
	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1115
		goto out;
1116

1117
	ethhdr = eth_hdr(skb);
1118 1119 1120

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1121
		goto out;
1122 1123 1124

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1125
		goto out;
1126 1127

	/* ignore broadcasts sent by myself */
1128
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1129
		goto out;
1130

1131
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1132 1133

	/* ignore broadcasts originated by myself */
1134
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1135
		goto out;
1136

1137
	if (bcast_packet->header.ttl < 2)
1138
		goto out;
1139

1140
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1141 1142

	if (!orig_node)
1143
		goto out;
1144

1145
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1146 1147

	/* check whether the packet is a duplicate */
1148 1149
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
			    ntohl(bcast_packet->seqno)))
1150
		goto spin_unlock;
1151 1152 1153 1154

	seq_diff = ntohl(bcast_packet->seqno) - orig_node->last_bcast_seqno;

	/* check whether the packet is old and the host just restarted. */
1155 1156
	if (batadv_window_protected(bat_priv, seq_diff,
				    &orig_node->bcast_seqno_reset))
1157
		goto spin_unlock;
1158 1159

	/* mark broadcast in flood history, update window position
1160 1161
	 * if required.
	 */
1162
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1163 1164
		orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);

1165 1166
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1167
	/* check whether this has been sent by another originator before */
1168
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1169 1170
		goto out;

1171 1172
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1173
	/* rebroadcast packet */
1174
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1175

1176 1177 1178
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1179
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1180 1181
		goto out;

1182 1183 1184 1185 1186
	if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb, hdr_size))
		goto rx_success;
	if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb, hdr_size))
		goto rx_success;

1187
	/* broadcast for me */
1188 1189
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1190 1191

rx_success:
1192 1193
	ret = NET_RX_SUCCESS;
	goto out;
1194

1195 1196 1197 1198
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1199
		batadv_orig_node_free_ref(orig_node);
1200
	return ret;
1201
}