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

#include "routing.h"
19 20 21 22 23 24 25 26 27
#include "main.h"

#include <linux/atomic.h>
#include <linux/byteorder/generic.h>
#include <linux/compiler.h>
#include <linux/errno.h>
#include <linux/etherdevice.h>
#include <linux/if_ether.h>
#include <linux/jiffies.h>
28
#include <linux/kref.h>
29 30 31 32 33 34 35 36 37
#include <linux/netdevice.h>
#include <linux/printk.h>
#include <linux/rculist.h>
#include <linux/rcupdate.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
#include <linux/stddef.h>

#include "bitarray.h"
38
#include "bridge_loop_avoidance.h"
39
#include "distributed-arp-table.h"
40
#include "fragmentation.h"
41 42
#include "hard-interface.h"
#include "icmp_socket.h"
43
#include "log.h"
44 45 46 47 48
#include "network-coding.h"
#include "originator.h"
#include "packet.h"
#include "send.h"
#include "soft-interface.h"
49
#include "tp_meter.h"
50
#include "translation-table.h"
51
#include "tvlv.h"
52

53
static int batadv_route_unicast_packet(struct sk_buff *skb,
54
				       struct batadv_hard_iface *recv_if);
55

56 57 58 59 60 61 62 63 64
/**
 * _batadv_update_route - set the router for this originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be configured
 * @recv_if: the receive interface for which this route is set
 * @neigh_node: neighbor which should be the next router
 *
 * This function does not perform any error checks
 */
65 66
static void _batadv_update_route(struct batadv_priv *bat_priv,
				 struct batadv_orig_node *orig_node,
67
				 struct batadv_hard_iface *recv_if,
68
				 struct batadv_neigh_node *neigh_node)
69
{
70
	struct batadv_orig_ifinfo *orig_ifinfo;
71
	struct batadv_neigh_node *curr_router;
72

73 74 75 76
	orig_ifinfo = batadv_orig_ifinfo_get(orig_node, recv_if);
	if (!orig_ifinfo)
		return;

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
	spin_lock_bh(&orig_node->neigh_list_lock);
	/* curr_router used earlier may not be the current orig_ifinfo->router
	 * anymore because it was dereferenced outside of the neigh_list_lock
	 * protected region. After the new best neighbor has replace the current
	 * best neighbor the reference counter needs to decrease. Consequently,
	 * the code needs to ensure the curr_router variable contains a pointer
	 * to the replaced best neighbor.
	 */
	curr_router = rcu_dereference_protected(orig_ifinfo->router, true);

	/* increase refcount of new best neighbor */
	if (neigh_node)
		kref_get(&neigh_node->refcount);

	rcu_assign_pointer(orig_ifinfo->router, neigh_node);
	spin_unlock_bh(&orig_node->neigh_list_lock);
	batadv_orig_ifinfo_put(orig_ifinfo);
94

95
	/* route deleted */
96
	if ((curr_router) && (!neigh_node)) {
97 98
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
			   "Deleting route towards: %pM\n", orig_node->orig);
99
		batadv_tt_global_del_orig(bat_priv, orig_node, -1,
100
					  "Deleted route towards originator");
101

102 103
	/* route added */
	} else if ((!curr_router) && (neigh_node)) {
104
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
105 106
			   "Adding route towards: %pM (via %pM)\n",
			   orig_node->orig, neigh_node->addr);
107
	/* route changed */
108
	} else if (neigh_node && curr_router) {
109
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
110 111 112
			   "Changing route towards: %pM (now via %pM - was via %pM)\n",
			   orig_node->orig, neigh_node->addr,
			   curr_router->addr);
113 114
	}

115 116
	/* decrease refcount of previous best neighbor */
	if (curr_router)
117
		batadv_neigh_node_put(curr_router);
118 119
}

120 121 122 123 124 125 126
/**
 * batadv_update_route - set the router for this originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: orig node which is to be configured
 * @recv_if: the receive interface for which this route is set
 * @neigh_node: neighbor which should be the next router
 */
127 128
void batadv_update_route(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node,
129
			 struct batadv_hard_iface *recv_if,
130
			 struct batadv_neigh_node *neigh_node)
131
{
132
	struct batadv_neigh_node *router = NULL;
133 134

	if (!orig_node)
135 136
		goto out;

137
	router = batadv_orig_router_get(orig_node, recv_if);
138

139
	if (router != neigh_node)
140
		_batadv_update_route(bat_priv, orig_node, recv_if, neigh_node);
141 142 143

out:
	if (router)
144
		batadv_neigh_node_put(router);
145 146
}

147
/**
148
 * batadv_window_protected - checks whether the host restarted and is in the
149
 *  protection time.
150 151 152
 * @bat_priv: the bat priv with all the soft interface information
 * @seq_num_diff: difference between the current/received sequence number and
 *  the last sequence number
153
 * @seq_old_max_diff: maximum age of sequence number not considered as restart
154 155
 * @last_reset: jiffies timestamp of the last reset, will be updated when reset
 *  is detected
156 157
 * @protection_started: is set to true if the protection window was started,
 *   doesn't change otherwise.
158 159
 *
 * Return:
160 161
 *  false if the packet is to be accepted.
 *  true if the packet is to be ignored.
162
 */
163 164 165
bool batadv_window_protected(struct batadv_priv *bat_priv, s32 seq_num_diff,
			     s32 seq_old_max_diff, unsigned long *last_reset,
			     bool *protection_started)
166
{
167
	if (seq_num_diff <= -seq_old_max_diff ||
168 169 170
	    seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
		if (!batadv_has_timed_out(*last_reset,
					  BATADV_RESET_PROTECTION_MS))
171
			return true;
172 173

		*last_reset = jiffies;
174 175
		if (protection_started)
			*protection_started = true;
176
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
177
			   "old packet received, start protection\n");
178
	}
179

180
	return false;
181 182
}

183
bool batadv_check_management_packet(struct sk_buff *skb,
184
				    struct batadv_hard_iface *hard_iface,
185
				    int header_len)
186 187 188 189
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
190 191
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
192

193
	ethhdr = eth_hdr(skb);
194 195 196

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
197
		return false;
198 199 200

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
201
		return false;
202 203 204

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
205
		return false;
206 207 208

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
209
		return false;
210

211
	return true;
212 213
}

214 215 216 217 218
/**
 * batadv_recv_my_icmp_packet - receive an icmp packet locally
 * @bat_priv: the bat priv with all the soft interface information
 * @skb: icmp packet to process
 *
219
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
220 221
 * otherwise.
 */
222
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
223
				      struct sk_buff *skb)
224
{
225 226
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
227 228
	struct batadv_icmp_header *icmph;
	int res, ret = NET_RX_DROP;
229

230
	icmph = (struct batadv_icmp_header *)skb->data;
231

232 233 234 235 236 237 238
	switch (icmph->msg_type) {
	case BATADV_ECHO_REPLY:
	case BATADV_DESTINATION_UNREACHABLE:
	case BATADV_TTL_EXCEEDED:
		/* receive the packet */
		if (skb_linearize(skb) < 0)
			break;
239

240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
		batadv_socket_receive_packet(icmph, skb->len);
		break;
	case BATADV_ECHO_REQUEST:
		/* answer echo request (ping) */
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;

		/* get routing information */
		orig_node = batadv_orig_hash_find(bat_priv, icmph->orig);
		if (!orig_node)
			goto out;

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

		icmph = (struct batadv_icmp_header *)skb->data;

259 260
		ether_addr_copy(icmph->dst, icmph->orig);
		ether_addr_copy(icmph->orig, primary_if->net_dev->dev_addr);
261
		icmph->msg_type = BATADV_ECHO_REPLY;
262
		icmph->ttl = BATADV_TTL;
263 264

		res = batadv_send_skb_to_orig(skb, orig_node, NULL);
265 266 267 268
		if (res == -1)
			goto out;

		ret = NET_RX_SUCCESS;
269 270

		break;
271 272 273 274 275 276 277
	case BATADV_TP:
		if (!pskb_may_pull(skb, sizeof(struct batadv_icmp_tp_packet)))
			goto out;

		batadv_tp_meter_recv(bat_priv, skb);
		ret = NET_RX_SUCCESS;
		goto out;
278 279
	default:
		/* drop unknown type */
280
		goto out;
281
	}
282
out:
283
	if (primary_if)
284
		batadv_hardif_put(primary_if);
285
	if (orig_node)
286
		batadv_orig_node_put(orig_node);
287 288 289
	return ret;
}

290
static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
291
					 struct sk_buff *skb)
292
{
293 294
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
295
	struct batadv_icmp_packet *icmp_packet;
296
	int res, ret = NET_RX_DROP;
297

298
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
299 300

	/* send TTL exceeded if packet is an echo request (traceroute) */
301
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
302
		pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
303
			 icmp_packet->orig, icmp_packet->dst);
304
		goto out;
305 306
	}

307
	primary_if = batadv_primary_if_get_selected(bat_priv);
308
	if (!primary_if)
309
		goto out;
310 311

	/* get routing information */
312
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
313
	if (!orig_node)
314
		goto out;
315

316
	/* create a copy of the skb, if needed, to modify it. */
317
	if (skb_cow(skb, ETH_HLEN) < 0)
318
		goto out;
319

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

322 323
	ether_addr_copy(icmp_packet->dst, icmp_packet->orig);
	ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr);
324 325
	icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
	icmp_packet->ttl = BATADV_TTL;
326

327 328
	res = batadv_send_skb_to_orig(skb, orig_node, NULL);
	if (res != -1)
329
		ret = NET_RX_SUCCESS;
330

331
out:
332
	if (primary_if)
333
		batadv_hardif_put(primary_if);
334
	if (orig_node)
335
		batadv_orig_node_put(orig_node);
336 337 338
	return ret;
}

339 340
int batadv_recv_icmp_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
341
{
342
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
343 344
	struct batadv_icmp_header *icmph;
	struct batadv_icmp_packet_rr *icmp_packet_rr;
345
	struct ethhdr *ethhdr;
346
	struct batadv_orig_node *orig_node = NULL;
347
	int hdr_size = sizeof(struct batadv_icmp_header);
348
	int res, ret = NET_RX_DROP;
349 350 351

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

354
	ethhdr = eth_hdr(skb);
355 356 357

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
358
		goto out;
359 360 361

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
362
		goto out;
363 364

	/* not for me */
365
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
366
		goto out;
367

368
	icmph = (struct batadv_icmp_header *)skb->data;
369 370

	/* add record route information if not full */
371 372 373 374 375 376 377 378 379 380
	if ((icmph->msg_type == BATADV_ECHO_REPLY ||
	     icmph->msg_type == BATADV_ECHO_REQUEST) &&
	    (skb->len >= sizeof(struct batadv_icmp_packet_rr))) {
		if (skb_linearize(skb) < 0)
			goto out;

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

381
		ethhdr = eth_hdr(skb);
382 383 384 385 386
		icmph = (struct batadv_icmp_header *)skb->data;
		icmp_packet_rr = (struct batadv_icmp_packet_rr *)icmph;
		if (icmp_packet_rr->rr_cur >= BATADV_RR_LEN)
			goto out;

387 388
		ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur],
				ethhdr->h_dest);
389
		icmp_packet_rr->rr_cur++;
390 391 392
	}

	/* packet for me */
393 394
	if (batadv_is_my_mac(bat_priv, icmph->dst))
		return batadv_recv_my_icmp_packet(bat_priv, skb);
395 396

	/* TTL exceeded */
397
	if (icmph->ttl < 2)
398
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
399 400

	/* get routing information */
401
	orig_node = batadv_orig_hash_find(bat_priv, icmph->dst);
402
	if (!orig_node)
403
		goto out;
404

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

409
	icmph = (struct batadv_icmp_header *)skb->data;
410

411
	/* decrement ttl */
412
	icmph->ttl--;
413 414

	/* route it */
415 416
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
	if (res != -1)
417
		ret = NET_RX_SUCCESS;
418

419 420
out:
	if (orig_node)
421
		batadv_orig_node_put(orig_node);
422 423 424
	return ret;
}

425 426
/**
 * batadv_check_unicast_packet - Check for malformed unicast packets
427
 * @bat_priv: the bat priv with all the soft interface information
428 429 430
 * @skb: packet to check
 * @hdr_size: size of header to pull
 *
431 432 433 434 435
 * Check for short header and bad addresses in given packet.
 *
 * Return: 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.
436
 */
437 438
static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
				       struct sk_buff *skb, int hdr_size)
439 440 441 442 443
{
	struct ethhdr *ethhdr;

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

446
	ethhdr = eth_hdr(skb);
447 448 449

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
450
		return -EBADR;
451 452 453

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
454
		return -EBADR;
455 456

	/* not for me */
457
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
458
		return -EREMOTE;
459 460 461 462

	return 0;
}

463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485
/**
 * batadv_last_bonding_replace - Replace last_bonding_candidate of orig_node
 * @orig_node: originator node whose bonding candidates should be replaced
 * @new_candidate: new bonding candidate or NULL
 */
static void
batadv_last_bonding_replace(struct batadv_orig_node *orig_node,
			    struct batadv_orig_ifinfo *new_candidate)
{
	struct batadv_orig_ifinfo *old_candidate;

	spin_lock_bh(&orig_node->neigh_list_lock);
	old_candidate = orig_node->last_bonding_candidate;

	if (new_candidate)
		kref_get(&new_candidate->refcount);
	orig_node->last_bonding_candidate = new_candidate;
	spin_unlock_bh(&orig_node->neigh_list_lock);

	if (old_candidate)
		batadv_orig_ifinfo_put(old_candidate);
}

486 487 488 489 490 491
/**
 * batadv_find_router - find a suitable router for this originator
 * @bat_priv: the bat priv with all the soft interface information
 * @orig_node: the destination node
 * @recv_if: pointer to interface this packet was received on
 *
492
 * Return: the router which should be used for this orig_node on
493
 * this interface, or NULL if not available.
494
 */
495 496 497
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
S
Simon Wunderlich 已提交
498
		   struct batadv_hard_iface *recv_if)
499
{
500
	struct batadv_algo_ops *bao = bat_priv->algo_ops;
S
Simon Wunderlich 已提交
501 502 503 504 505 506 507 508
	struct batadv_neigh_node *first_candidate_router = NULL;
	struct batadv_neigh_node *next_candidate_router = NULL;
	struct batadv_neigh_node *router, *cand_router = NULL;
	struct batadv_neigh_node *last_cand_router = NULL;
	struct batadv_orig_ifinfo *cand, *first_candidate = NULL;
	struct batadv_orig_ifinfo *next_candidate = NULL;
	struct batadv_orig_ifinfo *last_candidate;
	bool last_candidate_found = false;
509 510 511 512

	if (!orig_node)
		return NULL;

513
	router = batadv_orig_router_get(orig_node, recv_if);
514

515 516 517
	if (!router)
		return router;

S
Simon Wunderlich 已提交
518 519 520
	/* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop)
	 * and if activated.
	 */
521
	if (!(recv_if == BATADV_IF_DEFAULT && atomic_read(&bat_priv->bonding)))
S
Simon Wunderlich 已提交
522 523 524 525 526 527 528
		return router;

	/* bonding: loop through the list of possible routers found
	 * for the various outgoing interfaces and find a candidate after
	 * the last chosen bonding candidate (next_candidate). If no such
	 * router is found, use the first candidate found (the previously
	 * chosen bonding candidate might have been the last one in the list).
529
	 * If this can't be found either, return the previously chosen
S
Simon Wunderlich 已提交
530 531 532 533 534 535 536 537 538
	 * router - obviously there are no other candidates.
	 */
	rcu_read_lock();
	last_candidate = orig_node->last_bonding_candidate;
	if (last_candidate)
		last_cand_router = rcu_dereference(last_candidate->router);

	hlist_for_each_entry_rcu(cand, &orig_node->ifinfo_list, list) {
		/* acquire some structures and references ... */
539
		if (!kref_get_unless_zero(&cand->refcount))
S
Simon Wunderlich 已提交
540 541 542 543 544 545
			continue;

		cand_router = rcu_dereference(cand->router);
		if (!cand_router)
			goto next;

546
		if (!kref_get_unless_zero(&cand_router->refcount)) {
S
Simon Wunderlich 已提交
547 548 549 550 551 552 553
			cand_router = NULL;
			goto next;
		}

		/* alternative candidate should be good enough to be
		 * considered
		 */
554 555 556
		if (!bao->neigh.is_similar_or_better(cand_router,
						     cand->if_outgoing, router,
						     recv_if))
S
Simon Wunderlich 已提交
557 558 559 560 561 562 563 564
			goto next;

		/* don't use the same router twice */
		if (last_cand_router == cand_router)
			goto next;

		/* mark the first possible candidate */
		if (!first_candidate) {
565
			kref_get(&cand_router->refcount);
566
			kref_get(&cand->refcount);
S
Simon Wunderlich 已提交
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585
			first_candidate = cand;
			first_candidate_router = cand_router;
		}

		/* check if the loop has already passed the previously selected
		 * candidate ... this function should select the next candidate
		 * AFTER the previously used bonding candidate.
		 */
		if (!last_candidate || last_candidate_found) {
			next_candidate = cand;
			next_candidate_router = cand_router;
			break;
		}

		if (last_candidate == cand)
			last_candidate_found = true;
next:
		/* free references */
		if (cand_router) {
586
			batadv_neigh_node_put(cand_router);
S
Simon Wunderlich 已提交
587 588
			cand_router = NULL;
		}
589
		batadv_orig_ifinfo_put(cand);
S
Simon Wunderlich 已提交
590 591 592 593 594 595 596 597 598
	}
	rcu_read_unlock();

	/* After finding candidates, handle the three cases:
	 * 1) there is a next candidate, use that
	 * 2) there is no next candidate, use the first of the list
	 * 3) there is no candidate at all, return the default router
	 */
	if (next_candidate) {
599
		batadv_neigh_node_put(router);
S
Simon Wunderlich 已提交
600

601
		kref_get(&next_candidate_router->refcount);
S
Simon Wunderlich 已提交
602
		router = next_candidate_router;
603
		batadv_last_bonding_replace(orig_node, next_candidate);
S
Simon Wunderlich 已提交
604
	} else if (first_candidate) {
605
		batadv_neigh_node_put(router);
S
Simon Wunderlich 已提交
606

607
		kref_get(&first_candidate_router->refcount);
S
Simon Wunderlich 已提交
608
		router = first_candidate_router;
609
		batadv_last_bonding_replace(orig_node, first_candidate);
S
Simon Wunderlich 已提交
610
	} else {
611 612 613 614 615 616 617 618 619 620 621 622
		batadv_last_bonding_replace(orig_node, NULL);
	}

	/* cleanup of candidates */
	if (first_candidate) {
		batadv_neigh_node_put(first_candidate_router);
		batadv_orig_ifinfo_put(first_candidate);
	}

	if (next_candidate) {
		batadv_neigh_node_put(next_candidate_router);
		batadv_orig_ifinfo_put(next_candidate);
S
Simon Wunderlich 已提交
623
	}
624

625 626 627
	return router;
}

628
static int batadv_route_unicast_packet(struct sk_buff *skb,
629
				       struct batadv_hard_iface *recv_if)
630
{
631 632
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
633
	struct batadv_unicast_packet *unicast_packet;
634
	struct ethhdr *ethhdr = eth_hdr(skb);
635
	int res, hdr_len, ret = NET_RX_DROP;
636
	unsigned int len;
637

638
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
639 640

	/* TTL exceeded */
641
	if (unicast_packet->ttl < 2) {
642 643
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
644
		goto out;
645 646 647
	}

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

650
	if (!orig_node)
651
		goto out;
652 653

	/* create a copy of the skb, if needed, to modify it. */
654
	if (skb_cow(skb, ETH_HLEN) < 0)
655
		goto out;
656 657

	/* decrement ttl */
658
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
659
	unicast_packet->ttl--;
660

661
	switch (unicast_packet->packet_type) {
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
	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);

677
	len = skb->len;
678
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
679 680
	if (res == -1)
		goto out;
681

682 683 684
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
685 686
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
687
				   len + ETH_HLEN);
688
	}
689

690 691
	ret = NET_RX_SUCCESS;

692 693
out:
	if (orig_node)
694
		batadv_orig_node_put(orig_node);
695
	return ret;
696 697
}

698 699 700 701 702
/**
 * 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
703
 * @vid: VLAN identifier
704 705 706 707 708
 *
 * 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)
 *
709
 * Return: true if the packet header has been updated, false otherwise
710 711 712 713
 */
static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
			      struct batadv_unicast_packet *unicast_packet,
714
			      u8 *dst_addr, unsigned short vid)
715 716 717 718
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
719
	u8 *orig_addr, orig_ttvn;
720

721
	if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
722 723 724 725
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;
		orig_addr = primary_if->net_dev->dev_addr;
726
		orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
727
	} else {
728 729
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
						     vid);
730 731 732 733 734 735 736
		if (!orig_node)
			goto out;

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

		orig_addr = orig_node->orig;
737
		orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
738 739 740
	}

	/* update the packet header */
741
	ether_addr_copy(unicast_packet->dest, orig_addr);
742 743 744 745 746
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
747
		batadv_hardif_put(primary_if);
748
	if (orig_node)
749
		batadv_orig_node_put(orig_node);
750 751 752 753

	return ret;
}

754 755 756
static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
				      struct sk_buff *skb, int hdr_len)
{
757 758
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_hard_iface *primary_if;
759
	struct batadv_orig_node *orig_node;
760
	u8 curr_ttvn, old_ttvn;
761
	struct ethhdr *ethhdr;
762
	unsigned short vid;
763
	int is_old_ttvn;
764

765
	/* check if there is enough data before accessing it */
766
	if (!pskb_may_pull(skb, hdr_len + ETH_HLEN))
767
		return false;
768 769 770

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

773
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
774
	vid = batadv_get_vid(skb, hdr_len);
775
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
776

777 778 779 780 781
	/* 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
	 */
782
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
783
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
784
						  ethhdr->h_dest, vid))
785 786 787 788 789
			batadv_dbg_ratelimited(BATADV_DBG_TT,
					       bat_priv,
					       "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
					       unicast_packet->dest,
					       ethhdr->h_dest);
790 791 792 793 794
		/* 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
		 */
795
		return true;
796 797 798 799 800 801
	}

	/* 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
	 */
802
	curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
803
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
804 805
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
806 807 808 809
		/* 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
		 */
810
		if (!orig_node)
811
			return false;
812

813
		curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
814
		batadv_orig_node_put(orig_node);
815 816
	}

817 818 819
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
820
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
821
	if (!is_old_ttvn)
822
		return true;
823

824 825 826 827 828 829
	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,
830
					  ethhdr->h_dest, vid)) {
831 832 833 834
		batadv_dbg_ratelimited(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);
835
		return true;
836
	}
837

838 839 840 841
	/* 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
	 */
842
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid))
843
		return false;
844

845 846 847 848 849
	/* 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)
850
		return false;
851

852
	ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
853

854
	batadv_hardif_put(primary_if);
855 856

	unicast_packet->ttvn = curr_ttvn;
857

858
	return true;
859 860
}

861 862 863 864 865 866
/**
 * 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
 *
867
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
 * 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);
}

889 890
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
891
{
892
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
893
	struct batadv_unicast_packet *unicast_packet;
894
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
895
	u8 *orig_addr;
896
	struct batadv_orig_node *orig_node = NULL;
897
	int check, hdr_size = sizeof(*unicast_packet);
898
	enum batadv_subtype subtype;
899
	bool is4addr;
900

901
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
902
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
903

904
	is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
905
	/* the caller function should have already pulled 2 bytes */
906
	if (is4addr)
907
		hdr_size = sizeof(*unicast_4addr_packet);
908

909
	/* function returns -EREMOTE for promiscuous packets */
910
	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
911 912 913 914 915 916 917 918

	/* 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)
919
		return NET_RX_DROP;
920
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
921 922
		return NET_RX_DROP;

923
	/* packet for me */
924
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
925
		if (is4addr) {
926 927 928 929 930 931 932 933 934 935 936 937 938 939
			subtype = unicast_4addr_packet->subtype;
			batadv_dat_inc_counter(bat_priv, subtype);

			/* Only payload data should be considered for speedy
			 * join. For example, DAT also uses unicast 4addr
			 * types, but those packets should not be considered
			 * for speedy join, since the clients do not actually
			 * reside at the sending originator.
			 */
			if (subtype == BATADV_P_DATA) {
				orig_addr = unicast_4addr_packet->src;
				orig_node = batadv_orig_hash_find(bat_priv,
								  orig_addr);
			}
940
		}
941

942 943 944 945 946 947 948
		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;

949
		batadv_interface_rx(recv_if->soft_iface, skb, hdr_size,
950
				    orig_node);
951

952
rx_success:
953
		if (orig_node)
954
			batadv_orig_node_put(orig_node);
955

956 957 958
		return NET_RX_SUCCESS;
	}

959
	return batadv_route_unicast_packet(skb, recv_if);
960 961
}

962 963 964 965 966
/**
 * 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
 *
967
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
968 969 970 971 972 973 974 975
 * 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;
976
	u16 tvlv_buff_len;
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
	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);
1006 1007
	else
		consume_skb(skb);
1008 1009 1010

	return ret;
}
1011

1012 1013 1014 1015 1016 1017 1018 1019 1020
/**
 * 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.
 *
1021
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
 */
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;

1040 1041
	skb->priority = frag_packet->priority + 256;

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
	/* 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)
1067
		batadv_orig_node_put(orig_node_src);
1068 1069 1070 1071

	return ret;
}

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

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

1088
	ethhdr = eth_hdr(skb);
1089 1090 1091

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1092
		goto out;
1093 1094 1095

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1096
		goto out;
1097 1098

	/* ignore broadcasts sent by myself */
1099
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1100
		goto out;
1101

1102
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1103 1104

	/* ignore broadcasts originated by myself */
1105
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1106
		goto out;
1107

1108
	if (bcast_packet->ttl < 2)
1109
		goto out;
1110

1111
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1112 1113

	if (!orig_node)
1114
		goto out;
1115

1116
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1117

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

1124
	seq_diff = seqno - orig_node->last_bcast_seqno;
1125 1126

	/* check whether the packet is old and the host just restarted. */
1127
	if (batadv_window_protected(bat_priv, seq_diff,
1128 1129
				    BATADV_BCAST_MAX_AGE,
				    &orig_node->bcast_seqno_reset, NULL))
1130
		goto spin_unlock;
1131 1132

	/* mark broadcast in flood history, update window position
1133 1134
	 * if required.
	 */
1135
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1136
		orig_node->last_bcast_seqno = seqno;
1137

1138 1139
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1140
	/* check whether this has been sent by another originator before */
1141
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1142 1143
		goto out;

1144 1145
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1146
	/* rebroadcast packet */
1147
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1148

1149 1150 1151
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1152
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1153 1154
		goto out;

1155 1156 1157 1158 1159
	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;

1160
	/* broadcast for me */
1161
	batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node);
1162 1163

rx_success:
1164 1165
	ret = NET_RX_SUCCESS;
	goto out;
1166

1167 1168 1169 1170
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1171
		batadv_orig_node_put(orig_node);
1172
	return ret;
1173
}