routing.c 33.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
 *
 * 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, tq;
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
		goto candidate_del;

135

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

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

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

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

172 173 174
	if (!atomic_inc_not_zero(&neigh_node->refcount))
		goto out;

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

candidate_del:
180
	batadv_bonding_candidate_del(orig_node, neigh_node);
181 182 183

out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
184 185

	if (router)
186
		batadv_neigh_node_free_ref(router);
187 188 189
}

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

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

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

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

220 221 222
	return 0;
}

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

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

233
	ethhdr = eth_hdr(skb);
234 235 236

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

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

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

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
249
		return false;
250

251
	return true;
252 253
}

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

262
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
263 264

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

270
	primary_if = batadv_primary_if_get_selected(bat_priv);
271
	if (!primary_if)
272
		goto out;
273 274 275

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

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

284
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
285

286 287 288 289 290
	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;
291

292
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
293
		ret = NET_RX_SUCCESS;
294

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

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

311
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
312 313

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

320
	primary_if = batadv_primary_if_get_selected(bat_priv);
321
	if (!primary_if)
322
		goto out;
323 324

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

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

333
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
334

335 336 337 338 339
	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;
340

341
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
342
		ret = NET_RX_SUCCESS;
343

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


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

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

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

371
	ethhdr = eth_hdr(skb);
372 373 374

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

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

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

385
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
386 387

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

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

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

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

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

414
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
415

416
	/* decrement ttl */
417
	icmp_packet->icmph.header.ttl--;
418 419

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

423 424
out:
	if (orig_node)
425
		batadv_orig_node_free_ref(orig_node);
426 427 428
	return ret;
}

429 430 431 432
/* 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
433 434
 * returned router's refcount.
 */
435 436 437
static struct batadv_neigh_node *
batadv_find_bond_router(struct batadv_orig_node *primary_orig,
			const struct batadv_hard_iface *recv_if)
438
{
439 440
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
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 466 467

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

	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;

507 508
		if (router &&
		    tmp_neigh_node->bat_iv.tq_avg <= router->bat_iv.tq_avg)
509 510
			continue;

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

514 515 516
		/* decrement refcount of previously selected router */
		if (router)
			batadv_neigh_node_free_ref(router);
517

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

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

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

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

551
	ethhdr = eth_hdr(skb);
552 553 554

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
555
		return -EBADR;
556 557 558

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
559
		return -EBADR;
560 561

	/* not for me */
562
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
563
		return -EREMOTE;
564 565 566 567

	return 0;
}

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

	if (!orig_node)
		return NULL;

587
	router = batadv_orig_node_get_router(orig_node);
588
	if (!router)
589
		goto err;
590 591

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

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

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

605 606
	primary_addr = router_orig->primary_addr;

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

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

624
		batadv_orig_node_free_ref(primary_orig_node);
625 626 627
	}

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

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

639
	if (bonding_enabled)
640
		router = batadv_find_bond_router(primary_orig_node, recv_if);
641
	else
642
		router = batadv_find_ifalter_router(primary_orig_node, recv_if);
643

644
return_router:
645
	if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
646 647
		goto err_unlock;

648
	rcu_read_unlock();
649
	return router;
650 651 652 653
err_unlock:
	rcu_read_unlock();
err:
	if (router)
654
		batadv_neigh_node_free_ref(router);
655
	return NULL;
656 657
}

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

667
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
668 669

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

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

679
	if (!orig_node)
680
		goto out;
681 682

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

	/* decrement ttl */
687
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
688
	unicast_packet->header.ttl--;
689

690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705
	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);

706
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
707

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

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

721 722
out:
	if (orig_node)
723
		batadv_orig_node_free_ref(orig_node);
724
	return ret;
725 726
}

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

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

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

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

801
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
802
	vid = batadv_get_vid(skb, hdr_len);
803
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
804

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

		curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
842
		batadv_orig_node_free_ref(orig_node);
843 844
	}

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

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

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

873 874 875 876 877 878
	/* 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;
879

880 881 882 883 884
	memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
885 886 887 888

	return 1;
}

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

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

928
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
929
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
930

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

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

	/* 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)
946
		return NET_RX_DROP;
947
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
948 949
		return NET_RX_DROP;

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

959 960 961 962 963 964 965
		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;

966
		batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
967
				    orig_node);
968

969
rx_success:
970 971 972
		if (orig_node)
			batadv_orig_node_free_ref(orig_node);

973 974 975
		return NET_RX_SUCCESS;
	}

976
	return batadv_route_unicast_packet(skb, recv_if);
977 978
}

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026
/**
 * 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;
}
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 1083 1084 1085
/**
 * 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;
}

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

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

1101
	ethhdr = eth_hdr(skb);
1102 1103 1104

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1105
		goto out;
1106 1107 1108

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1109
		goto out;
1110 1111

	/* ignore broadcasts sent by myself */
1112
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1113
		goto out;
1114

1115
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1116 1117

	/* ignore broadcasts originated by myself */
1118
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1119
		goto out;
1120

1121
	if (bcast_packet->header.ttl < 2)
1122
		goto out;
1123

1124
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1125 1126

	if (!orig_node)
1127
		goto out;
1128

1129
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1130 1131

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

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

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

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

1149 1150
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1151
	/* check whether this has been sent by another originator before */
1152
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1153 1154
		goto out;

1155 1156
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1157
	/* rebroadcast packet */
1158
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1159

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

1166 1167 1168 1169 1170
	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;

1171
	/* broadcast for me */
1172 1173
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1174 1175

rx_success:
1176 1177
	ret = NET_RX_SUCCESS;
	goto out;
1178

1179 1180 1181 1182
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1183
		batadv_orig_node_free_ref(orig_node);
1184
	return ret;
1185
}