routing.c 32.6 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 28 29 30 31 32 33 34 35 36
#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>
#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"
37
#include "bridge_loop_avoidance.h"
38
#include "distributed-arp-table.h"
39
#include "fragmentation.h"
40 41 42 43 44 45 46 47
#include "hard-interface.h"
#include "icmp_socket.h"
#include "network-coding.h"
#include "originator.h"
#include "packet.h"
#include "send.h"
#include "soft-interface.h"
#include "translation-table.h"
48

49
static int batadv_route_unicast_packet(struct sk_buff *skb,
50
				       struct batadv_hard_iface *recv_if);
51

52 53 54 55 56 57 58 59 60
/**
 * _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
 */
61 62
static void _batadv_update_route(struct batadv_priv *bat_priv,
				 struct batadv_orig_node *orig_node,
63
				 struct batadv_hard_iface *recv_if,
64
				 struct batadv_neigh_node *neigh_node)
65
{
66
	struct batadv_orig_ifinfo *orig_ifinfo;
67
	struct batadv_neigh_node *curr_router;
68

69 70 71 72 73 74 75 76 77
	orig_ifinfo = batadv_orig_ifinfo_get(orig_node, recv_if);
	if (!orig_ifinfo)
		return;

	rcu_read_lock();
	curr_router = rcu_dereference(orig_ifinfo->router);
	if (curr_router && !atomic_inc_not_zero(&curr_router->refcount))
		curr_router = NULL;
	rcu_read_unlock();
78

79
	/* route deleted */
80
	if ((curr_router) && (!neigh_node)) {
81 82
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
			   "Deleting route towards: %pM\n", orig_node->orig);
83
		batadv_tt_global_del_orig(bat_priv, orig_node, -1,
84
					  "Deleted route towards originator");
85

86 87
	/* route added */
	} else if ((!curr_router) && (neigh_node)) {
88
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
89 90
			   "Adding route towards: %pM (via %pM)\n",
			   orig_node->orig, neigh_node->addr);
91
	/* route changed */
92
	} else if (neigh_node && curr_router) {
93
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
94 95 96
			   "Changing route towards: %pM (now via %pM - was via %pM)\n",
			   orig_node->orig, neigh_node->addr,
			   curr_router->addr);
97 98
	}

99
	if (curr_router)
100
		batadv_neigh_node_free_ref(curr_router);
101 102

	/* increase refcount of new best neighbor */
103 104
	if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
		neigh_node = NULL;
105 106

	spin_lock_bh(&orig_node->neigh_list_lock);
107
	rcu_assign_pointer(orig_ifinfo->router, neigh_node);
108
	spin_unlock_bh(&orig_node->neigh_list_lock);
109
	batadv_orig_ifinfo_free_ref(orig_ifinfo);
110 111 112

	/* decrease refcount of previous best neighbor */
	if (curr_router)
113
		batadv_neigh_node_free_ref(curr_router);
114 115
}

116 117 118 119 120 121 122
/**
 * 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
 */
123 124
void batadv_update_route(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node,
125
			 struct batadv_hard_iface *recv_if,
126
			 struct batadv_neigh_node *neigh_node)
127
{
128
	struct batadv_neigh_node *router = NULL;
129 130

	if (!orig_node)
131 132
		goto out;

133
	router = batadv_orig_router_get(orig_node, recv_if);
134

135
	if (router != neigh_node)
136
		_batadv_update_route(bat_priv, orig_node, recv_if, neigh_node);
137 138 139

out:
	if (router)
140
		batadv_neigh_node_free_ref(router);
141 142
}

143
/**
144
 * batadv_window_protected - checks whether the host restarted and is in the
145
 *  protection time.
146 147 148
 * @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
149
 * @seq_old_max_diff: maximum age of sequence number not considered as restart
150 151
 * @last_reset: jiffies timestamp of the last reset, will be updated when reset
 *  is detected
152 153
 * @protection_started: is set to true if the protection window was started,
 *   doesn't change otherwise.
154 155 156
 *
 * Return:
 *  0 if the packet is to be accepted.
157 158
 *  1 if the packet is to be ignored.
 */
159
int batadv_window_protected(struct batadv_priv *bat_priv, s32 seq_num_diff,
160 161
			    s32 seq_old_max_diff, unsigned long *last_reset,
			    bool *protection_started)
162
{
163
	if (seq_num_diff <= -seq_old_max_diff ||
164 165 166
	    seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
		if (!batadv_has_timed_out(*last_reset,
					  BATADV_RESET_PROTECTION_MS))
167
			return 1;
168 169

		*last_reset = jiffies;
170 171
		if (protection_started)
			*protection_started = true;
172
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
173
			   "old packet received, start protection\n");
174
	}
175

176 177 178
	return 0;
}

179
bool batadv_check_management_packet(struct sk_buff *skb,
180
				    struct batadv_hard_iface *hard_iface,
181
				    int header_len)
182 183 184 185
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
186 187
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
188

189
	ethhdr = eth_hdr(skb);
190 191 192

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
193
		return false;
194 195 196

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
197
		return false;
198 199 200

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
201
		return false;
202 203 204

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
205
		return false;
206

207
	return true;
208 209
}

210 211 212 213 214
/**
 * 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
 *
215
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
216 217
 * otherwise.
 */
218
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
219
				      struct sk_buff *skb)
220
{
221 222
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
223 224
	struct batadv_icmp_header *icmph;
	int res, ret = NET_RX_DROP;
225

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

228 229 230 231 232 233 234
	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;
235

236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
		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;

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

		res = batadv_send_skb_to_orig(skb, orig_node, NULL);
		if (res != NET_XMIT_DROP)
			ret = NET_RX_SUCCESS;

		break;
	default:
		/* drop unknown type */
267
		goto out;
268
	}
269
out:
270
	if (primary_if)
271
		batadv_hardif_free_ref(primary_if);
272
	if (orig_node)
273
		batadv_orig_node_free_ref(orig_node);
274 275 276
	return ret;
}

277
static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
278
					 struct sk_buff *skb)
279
{
280 281
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
282
	struct batadv_icmp_packet *icmp_packet;
283
	int ret = NET_RX_DROP;
284

285
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
286 287

	/* send TTL exceeded if packet is an echo request (traceroute) */
288
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
289
		pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
290
			 icmp_packet->orig, icmp_packet->dst);
291
		goto out;
292 293
	}

294
	primary_if = batadv_primary_if_get_selected(bat_priv);
295
	if (!primary_if)
296
		goto out;
297 298

	/* get routing information */
299
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
300
	if (!orig_node)
301
		goto out;
302

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

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

309 310
	ether_addr_copy(icmp_packet->dst, icmp_packet->orig);
	ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr);
311 312
	icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
	icmp_packet->ttl = BATADV_TTL;
313

314
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
315
		ret = NET_RX_SUCCESS;
316

317
out:
318
	if (primary_if)
319
		batadv_hardif_free_ref(primary_if);
320
	if (orig_node)
321
		batadv_orig_node_free_ref(orig_node);
322 323 324
	return ret;
}

325 326
int batadv_recv_icmp_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
327
{
328
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
329 330
	struct batadv_icmp_header *icmph;
	struct batadv_icmp_packet_rr *icmp_packet_rr;
331
	struct ethhdr *ethhdr;
332
	struct batadv_orig_node *orig_node = NULL;
333
	int hdr_size = sizeof(struct batadv_icmp_header);
334
	int ret = NET_RX_DROP;
335 336 337

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

340
	ethhdr = eth_hdr(skb);
341 342 343

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
344
		goto out;
345 346 347

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
348
		goto out;
349 350

	/* not for me */
351
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
352
		goto out;
353

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

	/* add record route information if not full */
357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
	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;

		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;

372 373
		ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur],
				ethhdr->h_dest);
374
		icmp_packet_rr->rr_cur++;
375 376 377
	}

	/* packet for me */
378 379
	if (batadv_is_my_mac(bat_priv, icmph->dst))
		return batadv_recv_my_icmp_packet(bat_priv, skb);
380 381

	/* TTL exceeded */
382
	if (icmph->ttl < 2)
383
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
384 385

	/* get routing information */
386
	orig_node = batadv_orig_hash_find(bat_priv, icmph->dst);
387
	if (!orig_node)
388
		goto out;
389

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

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

396
	/* decrement ttl */
397
	icmph->ttl--;
398 399

	/* route it */
400
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
401
		ret = NET_RX_SUCCESS;
402

403 404
out:
	if (orig_node)
405
		batadv_orig_node_free_ref(orig_node);
406 407 408
	return ret;
}

409 410
/**
 * batadv_check_unicast_packet - Check for malformed unicast packets
411
 * @bat_priv: the bat priv with all the soft interface information
412 413 414
 * @skb: packet to check
 * @hdr_size: size of header to pull
 *
415 416 417 418 419
 * 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.
420
 */
421 422
static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
				       struct sk_buff *skb, int hdr_size)
423 424 425 426 427
{
	struct ethhdr *ethhdr;

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

430
	ethhdr = eth_hdr(skb);
431 432 433

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
434
		return -EBADR;
435 436 437

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
438
		return -EBADR;
439 440

	/* not for me */
441
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
442
		return -EREMOTE;
443 444 445 446

	return 0;
}

447 448 449 450 451 452
/**
 * 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
 *
453
 * Return: the router which should be used for this orig_node on
454
 * this interface, or NULL if not available.
455
 */
456 457 458
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
S
Simon Wunderlich 已提交
459
		   struct batadv_hard_iface *recv_if)
460
{
S
Simon Wunderlich 已提交
461 462 463 464 465 466 467 468 469
	struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
	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;
470 471 472 473

	if (!orig_node)
		return NULL;

474
	router = batadv_orig_router_get(orig_node, recv_if);
475

476 477 478
	if (!router)
		return router;

S
Simon Wunderlich 已提交
479 480 481
	/* only consider bonding for recv_if == BATADV_IF_DEFAULT (first hop)
	 * and if activated.
	 */
482
	if (!(recv_if == BATADV_IF_DEFAULT && atomic_read(&bat_priv->bonding)))
S
Simon Wunderlich 已提交
483 484 485 486 487 488 489
		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).
490
	 * If this can't be found either, return the previously chosen
S
Simon Wunderlich 已提交
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
	 * 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 ... */
		if (!atomic_inc_not_zero(&cand->refcount))
			continue;

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

		if (!atomic_inc_not_zero(&cand_router->refcount)) {
			cand_router = NULL;
			goto next;
		}

		/* alternative candidate should be good enough to be
		 * considered
		 */
515 516 517
		if (!bao->bat_neigh_is_similar_or_better(cand_router,
							 cand->if_outgoing,
							 router, recv_if))
S
Simon Wunderlich 已提交
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581
			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) {
			atomic_inc(&cand_router->refcount);
			atomic_inc(&cand->refcount);
			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) {
			batadv_neigh_node_free_ref(cand_router);
			cand_router = NULL;
		}
		batadv_orig_ifinfo_free_ref(cand);
	}
	rcu_read_unlock();

	/* last_bonding_candidate is reset below, remove the old reference. */
	if (orig_node->last_bonding_candidate)
		batadv_orig_ifinfo_free_ref(orig_node->last_bonding_candidate);

	/* 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) {
		batadv_neigh_node_free_ref(router);

		/* remove references to first candidate, we don't need it. */
		if (first_candidate) {
			batadv_neigh_node_free_ref(first_candidate_router);
			batadv_orig_ifinfo_free_ref(first_candidate);
		}
		router = next_candidate_router;
		orig_node->last_bonding_candidate = next_candidate;
	} else if (first_candidate) {
		batadv_neigh_node_free_ref(router);

		/* refcounting has already been done in the loop above. */
		router = first_candidate_router;
		orig_node->last_bonding_candidate = first_candidate;
	} else {
		orig_node->last_bonding_candidate = NULL;
	}
582

583 584 585
	return router;
}

586
static int batadv_route_unicast_packet(struct sk_buff *skb,
587
				       struct batadv_hard_iface *recv_if)
588
{
589 590
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
591
	struct batadv_unicast_packet *unicast_packet;
592
	struct ethhdr *ethhdr = eth_hdr(skb);
593
	int res, hdr_len, ret = NET_RX_DROP;
594

595
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
596 597

	/* TTL exceeded */
598
	if (unicast_packet->ttl < 2) {
599 600
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
601
		goto out;
602 603 604
	}

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

607
	if (!orig_node)
608
		goto out;
609 610

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

	/* decrement ttl */
615
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
616
	unicast_packet->ttl--;
617

618
	switch (unicast_packet->packet_type) {
619 620 621 622 623 624 625 626 627 628 629 630 631 632 633
	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);

634
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
635

636 637 638
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
639 640 641
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
				   skb->len + ETH_HLEN);
642 643 644 645 646

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

649 650
out:
	if (orig_node)
651
		batadv_orig_node_free_ref(orig_node);
652
	return ret;
653 654
}

655 656 657 658 659
/**
 * 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
660
 * @vid: VLAN identifier
661 662 663 664 665
 *
 * 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)
 *
666
 * Return: true if the packet header has been updated, false otherwise
667 668 669 670
 */
static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
			      struct batadv_unicast_packet *unicast_packet,
671
			      u8 *dst_addr, unsigned short vid)
672 673 674 675
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
676
	u8 *orig_addr, orig_ttvn;
677

678
	if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
679 680 681 682
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;
		orig_addr = primary_if->net_dev->dev_addr;
683
		orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
684
	} else {
685 686
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
						     vid);
687 688 689 690 691 692 693
		if (!orig_node)
			goto out;

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

		orig_addr = orig_node->orig;
694
		orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
695 696 697
	}

	/* update the packet header */
698
	ether_addr_copy(unicast_packet->dest, orig_addr);
699 700 701 702 703 704 705 706 707 708 709 710
	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;
}

711
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
712
				     struct sk_buff *skb, int hdr_len) {
713 714
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_hard_iface *primary_if;
715
	struct batadv_orig_node *orig_node;
716
	u8 curr_ttvn, old_ttvn;
717
	struct ethhdr *ethhdr;
718
	unsigned short vid;
719
	int is_old_ttvn;
720

721
	/* check if there is enough data before accessing it */
722
	if (!pskb_may_pull(skb, hdr_len + ETH_HLEN))
723 724 725 726
		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)
727 728
		return 0;

729
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
730
	vid = batadv_get_vid(skb, hdr_len);
731
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
732

733 734 735 736 737
	/* 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
	 */
738
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
739
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
740
						  ethhdr->h_dest, vid))
741 742 743 744 745
			batadv_dbg_ratelimited(BATADV_DBG_TT,
					       bat_priv,
					       "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
					       unicast_packet->dest,
					       ethhdr->h_dest);
746 747 748 749 750 751 752 753 754 755 756 757
		/* 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
	 */
758
	curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
759
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
760 761
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
762 763 764 765
		/* 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
		 */
766 767 768
		if (!orig_node)
			return 0;

769
		curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
770
		batadv_orig_node_free_ref(orig_node);
771 772
	}

773 774 775
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
776
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
777 778
	if (!is_old_ttvn)
		return 1;
779

780 781 782 783 784 785
	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,
786
					  ethhdr->h_dest, vid)) {
787 788 789 790
		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);
791 792
		return 1;
	}
793

794 795 796 797
	/* 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
	 */
798
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid))
799
		return 0;
800

801 802 803 804 805 806
	/* 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;
807

808
	ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
809 810 811 812

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
813 814 815 816

	return 1;
}

817 818 819 820 821 822
/**
 * 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
 *
823
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
 * 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);
}

845 846
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
847
{
848
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
849
	struct batadv_unicast_packet *unicast_packet;
850
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
851
	u8 *orig_addr;
852
	struct batadv_orig_node *orig_node = NULL;
853
	int check, hdr_size = sizeof(*unicast_packet);
854
	enum batadv_subtype subtype;
855
	bool is4addr;
856

857
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
858
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
859

860
	is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
861
	/* the caller function should have already pulled 2 bytes */
862
	if (is4addr)
863
		hdr_size = sizeof(*unicast_4addr_packet);
864

865
	/* function returns -EREMOTE for promiscuous packets */
866
	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
867 868 869 870 871 872 873 874

	/* 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)
875
		return NET_RX_DROP;
876
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
877 878
		return NET_RX_DROP;

879
	/* packet for me */
880
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
881
		if (is4addr) {
882 883 884 885 886 887 888 889 890 891 892 893 894 895
			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);
			}
896
		}
897

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

905
		batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
906
				    orig_node);
907

908
rx_success:
909 910 911
		if (orig_node)
			batadv_orig_node_free_ref(orig_node);

912 913 914
		return NET_RX_SUCCESS;
	}

915
	return batadv_route_unicast_packet(skb, recv_if);
916 917
}

918 919 920 921 922
/**
 * 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
 *
923
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
924 925 926 927 928 929 930 931
 * 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;
932
	u16 tvlv_buff_len;
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
	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);
962 963
	else
		consume_skb(skb);
964 965 966

	return ret;
}
967

968 969 970 971 972 973 974 975 976
/**
 * 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.
 *
977
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
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
 */
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;
}

1026 1027
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1028
{
1029 1030
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1031
	struct batadv_bcast_packet *bcast_packet;
1032
	struct ethhdr *ethhdr;
1033
	int hdr_size = sizeof(*bcast_packet);
1034
	int ret = NET_RX_DROP;
1035 1036
	s32 seq_diff;
	u32 seqno;
1037 1038 1039

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

1042
	ethhdr = eth_hdr(skb);
1043 1044 1045

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1046
		goto out;
1047 1048 1049

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1050
		goto out;
1051 1052

	/* ignore broadcasts sent by myself */
1053
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1054
		goto out;
1055

1056
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1057 1058

	/* ignore broadcasts originated by myself */
1059
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1060
		goto out;
1061

1062
	if (bcast_packet->ttl < 2)
1063
		goto out;
1064

1065
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1066 1067

	if (!orig_node)
1068
		goto out;
1069

1070
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1071

1072
	seqno = ntohl(bcast_packet->seqno);
1073
	/* check whether the packet is a duplicate */
1074
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
1075
			    seqno))
1076
		goto spin_unlock;
1077

1078
	seq_diff = seqno - orig_node->last_bcast_seqno;
1079 1080

	/* check whether the packet is old and the host just restarted. */
1081
	if (batadv_window_protected(bat_priv, seq_diff,
1082 1083
				    BATADV_BCAST_MAX_AGE,
				    &orig_node->bcast_seqno_reset, NULL))
1084
		goto spin_unlock;
1085 1086

	/* mark broadcast in flood history, update window position
1087 1088
	 * if required.
	 */
1089
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1090
		orig_node->last_bcast_seqno = seqno;
1091

1092 1093
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1094
	/* check whether this has been sent by another originator before */
1095
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1096 1097
		goto out;

1098 1099
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1100
	/* rebroadcast packet */
1101
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1102

1103 1104 1105
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1106
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1107 1108
		goto out;

1109 1110 1111 1112 1113
	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;

1114
	/* broadcast for me */
1115 1116
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1117 1118

rx_success:
1119 1120
	ret = NET_RX_SUCCESS;
	goto out;
1121

1122 1123 1124 1125
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1126
		batadv_orig_node_free_ref(orig_node);
1127
	return ret;
1128
}