routing.c 33.4 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
void batadv_bonding_candidate_add(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
120
{
121
	struct batadv_neigh_node *tmp_neigh_node, *router = NULL;
122
	uint8_t interference_candidate = 0;
123 124 125 126

	spin_lock_bh(&orig_node->neigh_list_lock);

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

131
	router = batadv_orig_node_get_router(orig_node);
132
	if (!router)
133 134 135
		goto candidate_del;

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

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

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

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

170 171 172
	if (!atomic_inc_not_zero(&neigh_node->refcount))
		goto out;

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

candidate_del:
178
	batadv_bonding_candidate_del(orig_node, neigh_node);
179 180 181

out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
182 183

	if (router)
184
		batadv_neigh_node_free_ref(router);
185 186 187
}

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

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

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

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

218 219 220
	return 0;
}

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

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

231
	ethhdr = eth_hdr(skb);
232 233 234

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

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

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

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
247
		return false;
248

249
	return true;
250 251
}

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

260
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
261 262

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

268
	primary_if = batadv_primary_if_get_selected(bat_priv);
269
	if (!primary_if)
270
		goto out;
271 272 273

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

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

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

284 285 286 287 288
	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;
289

290
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
291
		ret = NET_RX_SUCCESS;
292

293
out:
294
	if (primary_if)
295
		batadv_hardif_free_ref(primary_if);
296
	if (orig_node)
297
		batadv_orig_node_free_ref(orig_node);
298 299 300
	return ret;
}

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

309
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
310 311

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

318
	primary_if = batadv_primary_if_get_selected(bat_priv);
319
	if (!primary_if)
320
		goto out;
321 322

	/* get routing information */
323
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.orig);
324
	if (!orig_node)
325
		goto out;
326

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

331
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
332

333 334 335 336 337
	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;
338

339
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
340
		ret = NET_RX_SUCCESS;
341

342
out:
343
	if (primary_if)
344
		batadv_hardif_free_ref(primary_if);
345
	if (orig_node)
346
		batadv_orig_node_free_ref(orig_node);
347 348 349 350
	return ret;
}


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

361
	/* we truncate all incoming icmp packets if they don't match our size */
362 363
	if (skb->len >= sizeof(struct batadv_icmp_packet_rr))
		hdr_size = sizeof(struct batadv_icmp_packet_rr);
364 365 366

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

369
	ethhdr = eth_hdr(skb);
370 371 372

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
373
		goto out;
374 375 376

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
377
		goto out;
378 379

	/* not for me */
380
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
381
		goto out;
382

383
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
384 385

	/* add record route information if not full */
386 387
	if ((icmp_packet->icmph.msg_type == BATADV_ECHO_REPLY ||
	     icmp_packet->icmph.msg_type == BATADV_ECHO_REQUEST) &&
388
	    (hdr_size == sizeof(struct batadv_icmp_packet_rr)) &&
389
	    (icmp_packet->rr_cur < BATADV_RR_LEN)) {
390
		memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
391
		       ethhdr->h_dest, ETH_ALEN);
392 393 394 395
		icmp_packet->rr_cur++;
	}

	/* packet for me */
396
	if (batadv_is_my_mac(bat_priv, icmp_packet->icmph.dst))
397
		return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
398 399

	/* TTL exceeded */
400
	if (icmp_packet->icmph.header.ttl < 2)
401
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
402 403

	/* get routing information */
404
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->icmph.dst);
405
	if (!orig_node)
406
		goto out;
407

408
	/* create a copy of the skb, if needed, to modify it. */
409
	if (skb_cow(skb, ETH_HLEN) < 0)
410
		goto out;
411

412
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
413

414
	/* decrement ttl */
415
	icmp_packet->icmph.header.ttl--;
416 417

	/* route it */
418
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
419
		ret = NET_RX_SUCCESS;
420

421 422
out:
	if (orig_node)
423
		batadv_orig_node_free_ref(orig_node);
424 425 426
	return ret;
}

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

	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
466 467
	 * after the current router
	 */
468 469
	spin_lock_bh(&primary_orig->neigh_list_lock);
	/* this is a list_move(), which unfortunately
470 471
	 * does not exist as rcu version
	 */
472 473 474 475 476 477 478 479 480 481 482 483 484 485
	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.
 *
486 487
 * Increases the returned router's refcount
 */
488 489 490
static struct batadv_neigh_node *
batadv_find_ifalter_router(struct batadv_orig_node *primary_orig,
			   const struct batadv_hard_iface *recv_if)
491
{
492 493
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
494 495 496 497 498 499 500 501 502 503 504

	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;

505 506 507
		if (router && tmp_neigh_node->tq_avg <= router->tq_avg)
			continue;

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

511 512 513
		/* decrement refcount of previously selected router */
		if (router)
			batadv_neigh_node_free_ref(router);
514

515 516
		/* we found a better router (or at least one valid router) */
		router = tmp_neigh_node;
517 518 519 520 521 522 523 524 525 526 527
	}

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

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

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

548
	ethhdr = eth_hdr(skb);
549 550 551

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
552
		return -EBADR;
553 554 555

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
556
		return -EBADR;
557 558

	/* not for me */
559
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
560
		return -EREMOTE;
561 562 563 564

	return 0;
}

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

	if (!orig_node)
		return NULL;

584
	router = batadv_orig_node_get_router(orig_node);
585
	if (!router)
586
		goto err;
587 588

	/* without bonding, the first node should
589 590
	 * always choose the default router.
	 */
591 592
	bonding_enabled = atomic_read(&bat_priv->bonding);

593 594
	rcu_read_lock();
	/* select default router to output */
595
	router_orig = router->orig_node;
596 597
	if (!router_orig)
		goto err_unlock;
598 599 600

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

602 603
	primary_addr = router_orig->primary_addr;

604
	/* if we have something in the primary_addr, we can search
605 606
	 * for a potential bonding candidate.
	 */
607
	if (batadv_compare_eth(primary_addr, zero_mac))
608
		goto return_router;
609 610

	/* find the orig_node which has the primary interface. might
611 612
	 * even be the same as our router_orig in many cases
	 */
613
	if (batadv_compare_eth(primary_addr, router_orig->orig)) {
614 615
		primary_orig_node = router_orig;
	} else {
616 617
		primary_orig_node = batadv_orig_hash_find(bat_priv,
							  primary_addr);
618
		if (!primary_orig_node)
619
			goto return_router;
620

621
		batadv_orig_node_free_ref(primary_orig_node);
622 623 624
	}

	/* with less than 2 candidates, we can't do any
625 626
	 * bonding and prefer the original router.
	 */
627 628
	if (atomic_read(&primary_orig_node->bond_candidates) < 2)
		goto return_router;
629 630 631

	/* all nodes between should choose a candidate which
	 * is is not on the interface where the packet came
632 633
	 * in.
	 */
634
	batadv_neigh_node_free_ref(router);
635

636
	if (bonding_enabled)
637
		router = batadv_find_bond_router(primary_orig_node, recv_if);
638
	else
639
		router = batadv_find_ifalter_router(primary_orig_node, recv_if);
640

641
return_router:
642
	if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
643 644
		goto err_unlock;

645
	rcu_read_unlock();
646
	return router;
647 648 649 650
err_unlock:
	rcu_read_unlock();
err:
	if (router)
651
		batadv_neigh_node_free_ref(router);
652
	return NULL;
653 654
}

655
static int batadv_route_unicast_packet(struct sk_buff *skb,
656
				       struct batadv_hard_iface *recv_if)
657
{
658 659
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
660
	struct batadv_unicast_packet *unicast_packet;
661
	struct ethhdr *ethhdr = eth_hdr(skb);
662
	int res, hdr_len, ret = NET_RX_DROP;
663

664
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
665 666

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

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

676
	if (!orig_node)
677
		goto out;
678 679

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

	/* decrement ttl */
684
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
685
	unicast_packet->header.ttl--;
686

687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702
	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);

703
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
704

705 706 707
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
708 709 710
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
				   skb->len + ETH_HLEN);
711 712 713 714 715

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

718 719
out:
	if (orig_node)
720
		batadv_orig_node_free_ref(orig_node);
721
	return ret;
722 723
}

724 725 726 727 728
/**
 * 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
729
 * @vid: VLAN identifier
730 731 732 733 734 735 736 737 738 739
 *
 * 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,
740
			      uint8_t *dst_addr, unsigned short vid)
741 742 743 744 745 746
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
	uint8_t *orig_addr, orig_ttvn;

747
	if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
748 749 750 751 752 753
		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 {
754 755
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
						     vid);
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
		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;
}

780
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
781
				     struct sk_buff *skb, int hdr_len) {
782 783
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_hard_iface *primary_if;
784
	struct batadv_orig_node *orig_node;
785
	uint8_t curr_ttvn, old_ttvn;
786
	struct ethhdr *ethhdr;
787
	unsigned short vid;
788
	int is_old_ttvn;
789

790
	/* check if there is enough data before accessing it */
791
	if (pskb_may_pull(skb, hdr_len + ETH_HLEN) < 0)
792 793 794 795
		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)
796 797
		return 0;

798
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
799
	vid = batadv_get_vid(skb, hdr_len);
800
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
801

802 803 804 805 806
	/* 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
	 */
807
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
808
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
809
						  ethhdr->h_dest, vid))
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
			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);
828
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
829 830
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
831 832 833 834
		/* 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
		 */
835 836 837 838
		if (!orig_node)
			return 0;

		curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
839
		batadv_orig_node_free_ref(orig_node);
840 841
	}

842 843 844
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
845
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
846 847
	if (!is_old_ttvn)
		return 1;
848

849 850 851 852 853 854
	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,
855
					  ethhdr->h_dest, vid)) {
856 857 858 859 860 861
		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;
	}
862

863 864 865 866
	/* 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
	 */
867
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid))
868
		return 0;
869

870 871 872 873 874 875
	/* 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;
876

877 878 879 880 881
	memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
882 883 884 885

	return 1;
}

886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913
/**
 * 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);
}

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 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
/**
 * 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;
}
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 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
/**
 * 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;
}

1083 1084
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1085
{
1086 1087
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1088
	struct batadv_bcast_packet *bcast_packet;
1089
	struct ethhdr *ethhdr;
1090
	int hdr_size = sizeof(*bcast_packet);
1091
	int ret = NET_RX_DROP;
1092 1093 1094 1095
	int32_t seq_diff;

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

1098
	ethhdr = eth_hdr(skb);
1099 1100 1101

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1102
		goto out;
1103 1104 1105

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1106
		goto out;
1107 1108

	/* ignore broadcasts sent by myself */
1109
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1110
		goto out;
1111

1112
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1113 1114

	/* ignore broadcasts originated by myself */
1115
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1116
		goto out;
1117

1118
	if (bcast_packet->header.ttl < 2)
1119
		goto out;
1120

1121
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1122 1123

	if (!orig_node)
1124
		goto out;
1125

1126
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1127 1128

	/* check whether the packet is a duplicate */
1129 1130
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
			    ntohl(bcast_packet->seqno)))
1131
		goto spin_unlock;
1132 1133 1134 1135

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

	/* check whether the packet is old and the host just restarted. */
1136 1137
	if (batadv_window_protected(bat_priv, seq_diff,
				    &orig_node->bcast_seqno_reset))
1138
		goto spin_unlock;
1139 1140

	/* mark broadcast in flood history, update window position
1141 1142
	 * if required.
	 */
1143
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1144 1145
		orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);

1146 1147
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1148
	/* check whether this has been sent by another originator before */
1149
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1150 1151
		goto out;

1152 1153
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1154
	/* rebroadcast packet */
1155
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1156

1157 1158 1159
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1160
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1161 1162
		goto out;

1163 1164 1165 1166 1167
	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;

1168
	/* broadcast for me */
1169 1170
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1171 1172

rx_success:
1173 1174
	ret = NET_RX_SUCCESS;
	goto out;
1175

1176 1177 1178 1179
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1180
		batadv_orig_node_free_ref(orig_node);
1181
	return ret;
1182
}