routing.c 32.5 KB
Newer Older
1
/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
 *
 * 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"
#include "unicast.h"
29
#include "bridge_loop_avoidance.h"
30
#include "distributed-arp-table.h"
31
#include "network-coding.h"
32

33
static int batadv_route_unicast_packet(struct sk_buff *skb,
34
				       struct batadv_hard_iface *recv_if);
35

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

42
	curr_router = batadv_orig_node_get_router(orig_node);
43

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

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

64
	if (curr_router)
65
		batadv_neigh_node_free_ref(curr_router);
66 67

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

	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)
77
		batadv_neigh_node_free_ref(curr_router);
78 79
}

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

	if (!orig_node)
87 88
		goto out;

89
	router = batadv_orig_node_get_router(orig_node);
90

91
	if (router != neigh_node)
92
		_batadv_update_route(bat_priv, orig_node, neigh_node);
93 94 95

out:
	if (router)
96
		batadv_neigh_node_free_ref(router);
97 98
}

99
/* caller must hold the neigh_list_lock */
100 101
void batadv_bonding_candidate_del(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
102 103 104 105 106 107 108
{
	/* 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);
109
	batadv_neigh_node_free_ref(neigh_node);
110 111 112 113 114 115
	atomic_dec(&orig_node->bond_candidates);

out:
	return;
}

116 117
void batadv_bonding_candidate_add(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
118
{
119
	struct batadv_neigh_node *tmp_neigh_node, *router = NULL;
120
	uint8_t interference_candidate = 0;
121 122 123 124

	spin_lock_bh(&orig_node->neigh_list_lock);

	/* only consider if it has the same primary address ...  */
125 126
	if (!batadv_compare_eth(orig_node->orig,
				neigh_node->orig_node->primary_addr))
127 128
		goto candidate_del;

129
	router = batadv_orig_node_get_router(orig_node);
130
	if (!router)
131 132 133
		goto candidate_del;

	/* ... and is good enough to be considered */
134
	if (neigh_node->tq_avg < router->tq_avg - BATADV_BONDING_TQ_THRESHOLD)
135 136
		goto candidate_del;

137
	/* check if we have another candidate with the same mac address or
138 139 140
	 * interface. If we do, we won't select this candidate because of
	 * possible interference.
	 */
141
	hlist_for_each_entry_rcu(tmp_neigh_node,
142 143 144 145 146
				 &orig_node->neigh_list, list) {
		if (tmp_neigh_node == neigh_node)
			continue;

		/* we only care if the other candidate is even
147 148
		 * considered as candidate.
		 */
149 150 151 152
		if (list_empty(&tmp_neigh_node->bonding_list))
			continue;

		if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
153 154
		    (batadv_compare_eth(neigh_node->addr,
					tmp_neigh_node->addr))) {
155 156 157 158 159 160 161 162 163 164 165 166 167
			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;

168 169 170
	if (!atomic_inc_not_zero(&neigh_node->refcount))
		goto out;

171 172 173 174 175
	list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
	atomic_inc(&orig_node->bond_candidates);
	goto out;

candidate_del:
176
	batadv_bonding_candidate_del(orig_node, neigh_node);
177 178 179

out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
180 181

	if (router)
182
		batadv_neigh_node_free_ref(router);
183 184 185
}

/* copy primary address for bonding */
186
void
187 188
batadv_bonding_save_primary(const struct batadv_orig_node *orig_node,
			    struct batadv_orig_node *orig_neigh_node,
189
			    const struct batadv_ogm_packet *batman_ogm_packet)
190
{
191
	if (!(batman_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP))
192 193 194 195 196
		return;

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

197 198 199 200 201
/* 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.
 */
202
int batadv_window_protected(struct batadv_priv *bat_priv, int32_t seq_num_diff,
203
			    unsigned long *last_reset)
204
{
205 206 207 208
	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))
209
			return 1;
210 211

		*last_reset = jiffies;
212
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
213
			   "old packet received, start protection\n");
214
	}
215

216 217 218
	return 0;
}

219
bool batadv_check_management_packet(struct sk_buff *skb,
220
				    struct batadv_hard_iface *hard_iface,
221
				    int header_len)
222 223 224 225
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
226 227
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
228

229
	ethhdr = eth_hdr(skb);
230 231 232

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
233
		return false;
234 235 236

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
237
		return false;
238 239 240

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
241
		return false;
242 243 244

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
245
		return false;
246

247
	return true;
248 249
}

250
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
251
				      struct sk_buff *skb, size_t icmp_len)
252
{
253 254
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
255
	struct batadv_icmp_packet_rr *icmp_packet;
256
	int ret = NET_RX_DROP;
257

258
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
259 260

	/* add data to device queue */
261
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
262
		batadv_socket_receive_packet(icmp_packet, icmp_len);
263
		goto out;
264 265
	}

266
	primary_if = batadv_primary_if_get_selected(bat_priv);
267
	if (!primary_if)
268
		goto out;
269 270 271

	/* answer echo request (ping) */
	/* get routing information */
272
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
273
	if (!orig_node)
274
		goto out;
275

276
	/* create a copy of the skb, if needed, to modify it. */
277
	if (skb_cow(skb, ETH_HLEN) < 0)
278 279
		goto out;

280
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
281 282

	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
283
	memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
284
	icmp_packet->msg_type = BATADV_ECHO_REPLY;
285
	icmp_packet->header.ttl = BATADV_TTL;
286

287
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
288
		ret = NET_RX_SUCCESS;
289

290
out:
291
	if (primary_if)
292
		batadv_hardif_free_ref(primary_if);
293
	if (orig_node)
294
		batadv_orig_node_free_ref(orig_node);
295 296 297
	return ret;
}

298
static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
299
					 struct sk_buff *skb)
300
{
301 302
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
303
	struct batadv_icmp_packet *icmp_packet;
304
	int ret = NET_RX_DROP;
305

306
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
307 308

	/* send TTL exceeded if packet is an echo request (traceroute) */
309
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
310 311
		pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
			 icmp_packet->orig, icmp_packet->dst);
312
		goto out;
313 314
	}

315
	primary_if = batadv_primary_if_get_selected(bat_priv);
316
	if (!primary_if)
317
		goto out;
318 319

	/* get routing information */
320
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
321
	if (!orig_node)
322
		goto out;
323

324
	/* create a copy of the skb, if needed, to modify it. */
325
	if (skb_cow(skb, ETH_HLEN) < 0)
326
		goto out;
327

328
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
329

330
	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
331
	memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
332
	icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
333
	icmp_packet->header.ttl = BATADV_TTL;
334

335
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
336
		ret = NET_RX_SUCCESS;
337

338
out:
339
	if (primary_if)
340
		batadv_hardif_free_ref(primary_if);
341
	if (orig_node)
342
		batadv_orig_node_free_ref(orig_node);
343 344 345 346
	return ret;
}


347 348
int batadv_recv_icmp_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
349
{
350
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
351
	struct batadv_icmp_packet_rr *icmp_packet;
352
	struct ethhdr *ethhdr;
353
	struct batadv_orig_node *orig_node = NULL;
354
	int hdr_size = sizeof(struct batadv_icmp_packet);
355
	int ret = NET_RX_DROP;
356

357
	/* we truncate all incoming icmp packets if they don't match our size */
358 359
	if (skb->len >= sizeof(struct batadv_icmp_packet_rr))
		hdr_size = sizeof(struct batadv_icmp_packet_rr);
360 361 362

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

365
	ethhdr = eth_hdr(skb);
366 367 368

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
369
		goto out;
370 371 372

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
373
		goto out;
374 375

	/* not for me */
376
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
377
		goto out;
378

379
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
380 381

	/* add record route information if not full */
382
	if ((hdr_size == sizeof(struct batadv_icmp_packet_rr)) &&
383
	    (icmp_packet->rr_cur < BATADV_RR_LEN)) {
384
		memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
385
		       ethhdr->h_dest, ETH_ALEN);
386 387 388 389
		icmp_packet->rr_cur++;
	}

	/* packet for me */
390
	if (batadv_is_my_mac(bat_priv, icmp_packet->dst))
391
		return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
392 393

	/* TTL exceeded */
394
	if (icmp_packet->header.ttl < 2)
395
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
396 397

	/* get routing information */
398
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->dst);
399
	if (!orig_node)
400
		goto out;
401

402
	/* create a copy of the skb, if needed, to modify it. */
403
	if (skb_cow(skb, ETH_HLEN) < 0)
404
		goto out;
405

406
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
407

408
	/* decrement ttl */
409
	icmp_packet->header.ttl--;
410 411

	/* route it */
412
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
413
		ret = NET_RX_SUCCESS;
414

415 416
out:
	if (orig_node)
417
		batadv_orig_node_free_ref(orig_node);
418 419 420
	return ret;
}

421 422 423 424
/* 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
425 426
 * returned router's refcount.
 */
427 428 429
static struct batadv_neigh_node *
batadv_find_bond_router(struct batadv_orig_node *primary_orig,
			const struct batadv_hard_iface *recv_if)
430
{
431 432
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459

	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
460 461
	 * after the current router
	 */
462 463
	spin_lock_bh(&primary_orig->neigh_list_lock);
	/* this is a list_move(), which unfortunately
464 465
	 * does not exist as rcu version
	 */
466 467 468 469 470 471 472 473 474 475 476 477 478 479
	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;
}

/* Interface Alternating: Use the best of the
 * remaining candidates which are not using
 * this interface.
 *
480 481
 * Increases the returned router's refcount
 */
482 483 484
static struct batadv_neigh_node *
batadv_find_ifalter_router(struct batadv_orig_node *primary_orig,
			   const struct batadv_hard_iface *recv_if)
485
{
486 487
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
488 489 490 491 492 493 494 495 496 497 498

	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;

499 500 501
		if (router && tmp_neigh_node->tq_avg <= router->tq_avg)
			continue;

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

505 506 507
		/* decrement refcount of previously selected router */
		if (router)
			batadv_neigh_node_free_ref(router);
508

509 510
		/* we found a better router (or at least one valid router) */
		router = tmp_neigh_node;
511 512 513 514 515 516 517 518 519 520 521
	}

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

522 523
/**
 * batadv_check_unicast_packet - Check for malformed unicast packets
524
 * @bat_priv: the bat priv with all the soft interface information
525 526 527 528 529 530 531 532
 * @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.
 */
533 534
static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
				       struct sk_buff *skb, int hdr_size)
535 536 537 538 539
{
	struct ethhdr *ethhdr;

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

542
	ethhdr = eth_hdr(skb);
543 544 545

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
546
		return -EBADR;
547 548 549

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
550
		return -EBADR;
551 552

	/* not for me */
553
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
554
		return -EREMOTE;
555 556 557 558

	return 0;
}

559
/* find a suitable router for this originator, and use
560
 * bonding if possible. increases the found neighbors
561 562
 * refcount.
 */
563 564 565 566
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)
567
{
568 569 570
	struct batadv_orig_node *primary_orig_node;
	struct batadv_orig_node *router_orig;
	struct batadv_neigh_node *router;
571 572
	static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
	int bonding_enabled;
573
	uint8_t *primary_addr;
574 575 576 577

	if (!orig_node)
		return NULL;

578
	router = batadv_orig_node_get_router(orig_node);
579
	if (!router)
580
		goto err;
581 582

	/* without bonding, the first node should
583 584
	 * always choose the default router.
	 */
585 586
	bonding_enabled = atomic_read(&bat_priv->bonding);

587 588
	rcu_read_lock();
	/* select default router to output */
589
	router_orig = router->orig_node;
590 591
	if (!router_orig)
		goto err_unlock;
592 593 594

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

596 597
	primary_addr = router_orig->primary_addr;

598
	/* if we have something in the primary_addr, we can search
599 600
	 * for a potential bonding candidate.
	 */
601
	if (batadv_compare_eth(primary_addr, zero_mac))
602
		goto return_router;
603 604

	/* find the orig_node which has the primary interface. might
605 606
	 * even be the same as our router_orig in many cases
	 */
607
	if (batadv_compare_eth(primary_addr, router_orig->orig)) {
608 609
		primary_orig_node = router_orig;
	} else {
610 611
		primary_orig_node = batadv_orig_hash_find(bat_priv,
							  primary_addr);
612
		if (!primary_orig_node)
613
			goto return_router;
614

615
		batadv_orig_node_free_ref(primary_orig_node);
616 617 618
	}

	/* with less than 2 candidates, we can't do any
619 620
	 * bonding and prefer the original router.
	 */
621 622
	if (atomic_read(&primary_orig_node->bond_candidates) < 2)
		goto return_router;
623 624 625

	/* all nodes between should choose a candidate which
	 * is is not on the interface where the packet came
626 627
	 * in.
	 */
628
	batadv_neigh_node_free_ref(router);
629

630
	if (bonding_enabled)
631
		router = batadv_find_bond_router(primary_orig_node, recv_if);
632
	else
633
		router = batadv_find_ifalter_router(primary_orig_node, recv_if);
634

635
return_router:
636
	if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
637 638
		goto err_unlock;

639
	rcu_read_unlock();
640
	return router;
641 642 643 644
err_unlock:
	rcu_read_unlock();
err:
	if (router)
645
		batadv_neigh_node_free_ref(router);
646
	return NULL;
647 648
}

649
static int batadv_route_unicast_packet(struct sk_buff *skb,
650
				       struct batadv_hard_iface *recv_if)
651
{
652 653 654
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_neigh_node *neigh_node = NULL;
655
	struct batadv_unicast_packet *unicast_packet;
656
	struct ethhdr *ethhdr = eth_hdr(skb);
657
	int res, hdr_len, ret = NET_RX_DROP;
658 659
	struct sk_buff *new_skb;

660
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
661 662

	/* TTL exceeded */
663
	if (unicast_packet->header.ttl < 2) {
664 665
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
666
		goto out;
667 668 669
	}

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

672
	if (!orig_node)
673
		goto out;
674

675
	/* find_router() increases neigh_nodes refcount if found. */
676
	neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
677

678
	if (!neigh_node)
679
		goto out;
680 681

	/* create a copy of the skb, if needed, to modify it. */
682
	if (skb_cow(skb, ETH_HLEN) < 0)
683
		goto out;
684

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

687
	if (unicast_packet->header.packet_type == BATADV_UNICAST &&
688
	    atomic_read(&bat_priv->fragmentation) &&
689
	    skb->len > neigh_node->if_incoming->net_dev->mtu) {
690 691 692
		ret = batadv_frag_send_skb(skb, bat_priv,
					   neigh_node->if_incoming,
					   neigh_node->addr);
693 694
		goto out;
	}
695

696
	if (unicast_packet->header.packet_type == BATADV_UNICAST_FRAG &&
697 698
	    batadv_frag_can_reassemble(skb,
				       neigh_node->if_incoming->net_dev->mtu)) {
699
		ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
700 701

		if (ret == NET_RX_DROP)
702
			goto out;
703 704

		/* packet was buffered for late merge */
705 706 707 708
		if (!new_skb) {
			ret = NET_RX_SUCCESS;
			goto out;
		}
709 710

		skb = new_skb;
711
		unicast_packet = (struct batadv_unicast_packet *)skb->data;
712 713 714
	}

	/* decrement ttl */
715
	unicast_packet->header.ttl--;
716

717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732
	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);

733
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
734

735 736 737
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
738 739 740
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
				   skb->len + ETH_HLEN);
741 742 743 744 745

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

748 749
out:
	if (neigh_node)
750
		batadv_neigh_node_free_ref(neigh_node);
751
	if (orig_node)
752
		batadv_orig_node_free_ref(orig_node);
753
	return ret;
754 755
}

756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
/**
 * 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
 *
 * 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,
			      uint8_t *dst_addr)
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
	uint8_t *orig_addr, orig_ttvn;

	if (batadv_is_my_client(bat_priv, dst_addr)) {
		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 {
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr);
		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;
}

810
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
811
				     struct sk_buff *skb, int hdr_len) {
812
	uint8_t curr_ttvn, old_ttvn;
813
	struct batadv_orig_node *orig_node;
814
	struct ethhdr *ethhdr;
815
	struct batadv_hard_iface *primary_if;
816
	struct batadv_unicast_packet *unicast_packet;
817
	int is_old_ttvn;
818

819
	/* check if there is enough data before accessing it */
820
	if (pskb_may_pull(skb, hdr_len + ETH_HLEN) < 0)
821 822 823 824
		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)
825 826
		return 0;

827
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
828
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
829

830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855
	/* 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
	 */
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest)) {
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
						  ethhdr->h_dest))
			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);
856
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
857 858
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
859 860 861 862
		/* 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
		 */
863 864 865 866
		if (!orig_node)
			return 0;

		curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
867
		batadv_orig_node_free_ref(orig_node);
868 869
	}

870 871 872
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
873
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
874 875
	if (!is_old_ttvn)
		return 1;
876

877 878 879 880 881 882 883 884 885 886 887 888 889
	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,
					  ethhdr->h_dest)) {
		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;
	}
890

891 892 893 894 895 896
	/* 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
	 */
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest))
		return 0;
897

898 899 900 901 902 903
	/* 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;
904

905 906 907 908 909
	memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
910 911 912 913

	return 1;
}

914 915
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
916
{
917
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
918
	struct batadv_unicast_packet *unicast_packet;
919
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
920 921
	uint8_t *orig_addr;
	struct batadv_orig_node *orig_node = NULL;
922
	int check, hdr_size = sizeof(*unicast_packet);
923
	bool is4addr;
924

925
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
926
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
927

928
	is4addr = unicast_packet->header.packet_type == BATADV_UNICAST_4ADDR;
929
	/* the caller function should have already pulled 2 bytes */
930
	if (is4addr)
931
		hdr_size = sizeof(*unicast_4addr_packet);
932

933
	/* function returns -EREMOTE for promiscuous packets */
934
	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
935 936 937 938 939 940 941 942

	/* 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)
943
		return NET_RX_DROP;
944
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
945 946
		return NET_RX_DROP;

947
	/* packet for me */
948
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
949
		if (is4addr) {
950 951
			batadv_dat_inc_counter(bat_priv,
					       unicast_4addr_packet->subtype);
952 953 954
			orig_addr = unicast_4addr_packet->src;
			orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
		}
955

956 957 958 959 960 961 962
		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;

963
		batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
964
				    orig_node);
965

966
rx_success:
967 968 969
		if (orig_node)
			batadv_orig_node_free_ref(orig_node);

970 971 972
		return NET_RX_SUCCESS;
	}

973
	return batadv_route_unicast_packet(skb, recv_if);
974 975
}

976
int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
977
				  struct batadv_hard_iface *recv_if)
978
{
979
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
980
	struct batadv_unicast_frag_packet *unicast_packet;
981
	int hdr_size = sizeof(*unicast_packet);
982 983 984
	struct sk_buff *new_skb = NULL;
	int ret;

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

988
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
989 990
		return NET_RX_DROP;

991
	unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
992 993

	/* packet for me */
994
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
995
		ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
996 997 998 999 1000 1001 1002 1003

		if (ret == NET_RX_DROP)
			return NET_RX_DROP;

		/* packet was buffered for late merge */
		if (!new_skb)
			return NET_RX_SUCCESS;

1004 1005 1006 1007 1008 1009 1010
		if (batadv_dat_snoop_incoming_arp_request(bat_priv, new_skb,
							  hdr_size))
			goto rx_success;
		if (batadv_dat_snoop_incoming_arp_reply(bat_priv, new_skb,
							hdr_size))
			goto rx_success;

1011
		batadv_interface_rx(recv_if->soft_iface, new_skb, recv_if,
1012
				    sizeof(struct batadv_unicast_packet), NULL);
1013 1014

rx_success:
1015 1016 1017
		return NET_RX_SUCCESS;
	}

1018
	return batadv_route_unicast_packet(skb, recv_if);
1019 1020
}

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 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
/**
 * 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;
}
1069

1070 1071
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1072
{
1073 1074
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1075
	struct batadv_bcast_packet *bcast_packet;
1076
	struct ethhdr *ethhdr;
1077
	int hdr_size = sizeof(*bcast_packet);
1078
	int ret = NET_RX_DROP;
1079 1080 1081 1082
	int32_t seq_diff;

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

1085
	ethhdr = eth_hdr(skb);
1086 1087 1088

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1089
		goto out;
1090 1091 1092

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1093
		goto out;
1094 1095

	/* ignore broadcasts sent by myself */
1096
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1097
		goto out;
1098

1099
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1100 1101

	/* ignore broadcasts originated by myself */
1102
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1103
		goto out;
1104

1105
	if (bcast_packet->header.ttl < 2)
1106
		goto out;
1107

1108
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1109 1110

	if (!orig_node)
1111
		goto out;
1112

1113
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1114 1115

	/* check whether the packet is a duplicate */
1116 1117
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
			    ntohl(bcast_packet->seqno)))
1118
		goto spin_unlock;
1119 1120 1121 1122

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

	/* check whether the packet is old and the host just restarted. */
1123 1124
	if (batadv_window_protected(bat_priv, seq_diff,
				    &orig_node->bcast_seqno_reset))
1125
		goto spin_unlock;
1126 1127

	/* mark broadcast in flood history, update window position
1128 1129
	 * if required.
	 */
1130
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1131 1132
		orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);

1133 1134
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1135
	/* check whether this has been sent by another originator before */
1136
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1137 1138
		goto out;

1139 1140
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1141
	/* rebroadcast packet */
1142
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1143

1144 1145 1146
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1147
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1148 1149
		goto out;

1150 1151 1152 1153 1154
	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;

1155
	/* broadcast for me */
1156 1157
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1158 1159

rx_success:
1160 1161
	ret = NET_RX_SUCCESS;
	goto out;
1162

1163 1164 1165 1166
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1167
		batadv_orig_node_free_ref(orig_node);
1168
	return ret;
1169
}