routing.c 33.0 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 43 44 45 46 47 48
#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"
49

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

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

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

	rcu_read_lock();
	curr_router = rcu_dereference(orig_ifinfo->router);
76
	if (curr_router && !kref_get_unless_zero(&curr_router->refcount))
77 78
		curr_router = NULL;
	rcu_read_unlock();
79

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

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

100
	if (curr_router)
101
		batadv_neigh_node_put(curr_router);
102 103

	spin_lock_bh(&orig_node->neigh_list_lock);
104 105 106 107 108 109 110 111 112
	/* 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);

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

117
	rcu_assign_pointer(orig_ifinfo->router, neigh_node);
118
	spin_unlock_bh(&orig_node->neigh_list_lock);
119
	batadv_orig_ifinfo_put(orig_ifinfo);
120 121 122

	/* decrease refcount of previous best neighbor */
	if (curr_router)
123
		batadv_neigh_node_put(curr_router);
124 125
}

126 127 128 129 130 131 132
/**
 * 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
 */
133 134
void batadv_update_route(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node,
135
			 struct batadv_hard_iface *recv_if,
136
			 struct batadv_neigh_node *neigh_node)
137
{
138
	struct batadv_neigh_node *router = NULL;
139 140

	if (!orig_node)
141 142
		goto out;

143
	router = batadv_orig_router_get(orig_node, recv_if);
144

145
	if (router != neigh_node)
146
		_batadv_update_route(bat_priv, orig_node, recv_if, neigh_node);
147 148 149

out:
	if (router)
150
		batadv_neigh_node_put(router);
151 152
}

153
/**
154
 * batadv_window_protected - checks whether the host restarted and is in the
155
 *  protection time.
156 157 158
 * @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
159
 * @seq_old_max_diff: maximum age of sequence number not considered as restart
160 161
 * @last_reset: jiffies timestamp of the last reset, will be updated when reset
 *  is detected
162 163
 * @protection_started: is set to true if the protection window was started,
 *   doesn't change otherwise.
164 165
 *
 * Return:
166 167
 *  false if the packet is to be accepted.
 *  true if the packet is to be ignored.
168
 */
169 170 171
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)
172
{
173
	if (seq_num_diff <= -seq_old_max_diff ||
174 175 176
	    seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
		if (!batadv_has_timed_out(*last_reset,
					  BATADV_RESET_PROTECTION_MS))
177
			return true;
178 179

		*last_reset = jiffies;
180 181
		if (protection_started)
			*protection_started = true;
182
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
183
			   "old packet received, start protection\n");
184
	}
185

186
	return false;
187 188
}

189
bool batadv_check_management_packet(struct sk_buff *skb,
190
				    struct batadv_hard_iface *hard_iface,
191
				    int header_len)
192 193 194 195
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
196 197
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
198

199
	ethhdr = eth_hdr(skb);
200 201 202

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
203
		return false;
204 205 206

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
207
		return false;
208 209 210

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
211
		return false;
212 213 214

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
215
		return false;
216

217
	return true;
218 219
}

220 221 222 223 224
/**
 * 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
 *
225
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
226 227
 * otherwise.
 */
228
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
229
				      struct sk_buff *skb)
230
{
231 232
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
233 234
	struct batadv_icmp_header *icmph;
	int res, ret = NET_RX_DROP;
235

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

238 239 240 241 242 243 244
	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;
245

246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
		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;

265 266
		ether_addr_copy(icmph->dst, icmph->orig);
		ether_addr_copy(icmph->orig, primary_if->net_dev->dev_addr);
267
		icmph->msg_type = BATADV_ECHO_REPLY;
268
		icmph->ttl = BATADV_TTL;
269 270 271 272 273 274 275 276

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

		break;
	default:
		/* drop unknown type */
277
		goto out;
278
	}
279
out:
280
	if (primary_if)
281
		batadv_hardif_put(primary_if);
282
	if (orig_node)
283
		batadv_orig_node_put(orig_node);
284 285 286
	return ret;
}

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

295
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
296 297

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

304
	primary_if = batadv_primary_if_get_selected(bat_priv);
305
	if (!primary_if)
306
		goto out;
307 308

	/* get routing information */
309
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
310
	if (!orig_node)
311
		goto out;
312

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

317
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
318

319 320
	ether_addr_copy(icmp_packet->dst, icmp_packet->orig);
	ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr);
321 322
	icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
	icmp_packet->ttl = BATADV_TTL;
323

324
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
325
		ret = NET_RX_SUCCESS;
326

327
out:
328
	if (primary_if)
329
		batadv_hardif_put(primary_if);
330
	if (orig_node)
331
		batadv_orig_node_put(orig_node);
332 333 334
	return ret;
}

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

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

350
	ethhdr = eth_hdr(skb);
351 352 353

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
354
		goto out;
355 356 357

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
358
		goto out;
359 360

	/* not for me */
361
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
362
		goto out;
363

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

	/* add record route information if not full */
367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
	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;

382 383
		ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur],
				ethhdr->h_dest);
384
		icmp_packet_rr->rr_cur++;
385 386 387
	}

	/* packet for me */
388 389
	if (batadv_is_my_mac(bat_priv, icmph->dst))
		return batadv_recv_my_icmp_packet(bat_priv, skb);
390 391

	/* TTL exceeded */
392
	if (icmph->ttl < 2)
393
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
394 395

	/* get routing information */
396
	orig_node = batadv_orig_hash_find(bat_priv, icmph->dst);
397
	if (!orig_node)
398
		goto out;
399

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

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

406
	/* decrement ttl */
407
	icmph->ttl--;
408 409

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

413 414
out:
	if (orig_node)
415
		batadv_orig_node_put(orig_node);
416 417 418
	return ret;
}

419 420
/**
 * batadv_check_unicast_packet - Check for malformed unicast packets
421
 * @bat_priv: the bat priv with all the soft interface information
422 423 424
 * @skb: packet to check
 * @hdr_size: size of header to pull
 *
425 426 427 428 429
 * 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.
430
 */
431 432
static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
				       struct sk_buff *skb, int hdr_size)
433 434 435 436 437
{
	struct ethhdr *ethhdr;

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

440
	ethhdr = eth_hdr(skb);
441 442 443

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
444
		return -EBADR;
445 446 447

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
448
		return -EBADR;
449 450

	/* not for me */
451
	if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
452
		return -EREMOTE;
453 454 455 456

	return 0;
}

457 458 459 460 461 462
/**
 * 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
 *
463
 * Return: the router which should be used for this orig_node on
464
 * this interface, or NULL if not available.
465
 */
466 467 468
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
S
Simon Wunderlich 已提交
469
		   struct batadv_hard_iface *recv_if)
470
{
S
Simon Wunderlich 已提交
471 472 473 474 475 476 477 478 479
	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;
480 481 482 483

	if (!orig_node)
		return NULL;

484
	router = batadv_orig_router_get(orig_node, recv_if);
485

486 487 488
	if (!router)
		return router;

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

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

517
		if (!kref_get_unless_zero(&cand_router->refcount)) {
S
Simon Wunderlich 已提交
518 519 520 521 522 523 524
			cand_router = NULL;
			goto next;
		}

		/* alternative candidate should be good enough to be
		 * considered
		 */
525 526 527
		if (!bao->bat_neigh_is_similar_or_better(cand_router,
							 cand->if_outgoing,
							 router, recv_if))
S
Simon Wunderlich 已提交
528 529 530 531 532 533 534 535
			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) {
536
			kref_get(&cand_router->refcount);
537
			kref_get(&cand->refcount);
S
Simon Wunderlich 已提交
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
			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) {
557
			batadv_neigh_node_put(cand_router);
S
Simon Wunderlich 已提交
558 559
			cand_router = NULL;
		}
560
		batadv_orig_ifinfo_put(cand);
S
Simon Wunderlich 已提交
561 562 563 564 565
	}
	rcu_read_unlock();

	/* last_bonding_candidate is reset below, remove the old reference. */
	if (orig_node->last_bonding_candidate)
566
		batadv_orig_ifinfo_put(orig_node->last_bonding_candidate);
S
Simon Wunderlich 已提交
567 568 569 570 571 572 573

	/* 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) {
574
		batadv_neigh_node_put(router);
S
Simon Wunderlich 已提交
575 576 577

		/* remove references to first candidate, we don't need it. */
		if (first_candidate) {
578
			batadv_neigh_node_put(first_candidate_router);
579
			batadv_orig_ifinfo_put(first_candidate);
S
Simon Wunderlich 已提交
580 581 582 583
		}
		router = next_candidate_router;
		orig_node->last_bonding_candidate = next_candidate;
	} else if (first_candidate) {
584
		batadv_neigh_node_put(router);
S
Simon Wunderlich 已提交
585 586 587 588 589 590 591

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

593 594 595
	return router;
}

596
static int batadv_route_unicast_packet(struct sk_buff *skb,
597
				       struct batadv_hard_iface *recv_if)
598
{
599 600
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
601
	struct batadv_unicast_packet *unicast_packet;
602
	struct ethhdr *ethhdr = eth_hdr(skb);
603
	int res, hdr_len, ret = NET_RX_DROP;
604

605
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
606 607

	/* TTL exceeded */
608
	if (unicast_packet->ttl < 2) {
609 610
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
611
		goto out;
612 613 614
	}

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

617
	if (!orig_node)
618
		goto out;
619 620

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

	/* decrement ttl */
625
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
626
	unicast_packet->ttl--;
627

628
	switch (unicast_packet->packet_type) {
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
	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);

644
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
645

646 647 648
	/* translate transmit result into receive result */
	if (res == NET_XMIT_SUCCESS) {
		/* skb was transmitted and consumed */
649 650 651
		batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
		batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
				   skb->len + ETH_HLEN);
652 653 654 655 656

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

659 660
out:
	if (orig_node)
661
		batadv_orig_node_put(orig_node);
662
	return ret;
663 664
}

665 666 667 668 669
/**
 * 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
670
 * @vid: VLAN identifier
671 672 673 674 675
 *
 * 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)
 *
676
 * Return: true if the packet header has been updated, false otherwise
677 678 679 680
 */
static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
			      struct batadv_unicast_packet *unicast_packet,
681
			      u8 *dst_addr, unsigned short vid)
682 683 684 685
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
686
	u8 *orig_addr, orig_ttvn;
687

688
	if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
689 690 691 692
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;
		orig_addr = primary_if->net_dev->dev_addr;
693
		orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
694
	} else {
695 696
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
						     vid);
697 698 699 700 701 702 703
		if (!orig_node)
			goto out;

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

		orig_addr = orig_node->orig;
704
		orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
705 706 707
	}

	/* update the packet header */
708
	ether_addr_copy(unicast_packet->dest, orig_addr);
709 710 711 712 713
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
714
		batadv_hardif_put(primary_if);
715
	if (orig_node)
716
		batadv_orig_node_put(orig_node);
717 718 719 720

	return ret;
}

721 722 723
static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
				      struct sk_buff *skb, int hdr_len)
{
724 725
	struct batadv_unicast_packet *unicast_packet;
	struct batadv_hard_iface *primary_if;
726
	struct batadv_orig_node *orig_node;
727
	u8 curr_ttvn, old_ttvn;
728
	struct ethhdr *ethhdr;
729
	unsigned short vid;
730
	int is_old_ttvn;
731

732
	/* check if there is enough data before accessing it */
733
	if (!pskb_may_pull(skb, hdr_len + ETH_HLEN))
734
		return false;
735 736 737

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

740
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
741
	vid = batadv_get_vid(skb, hdr_len);
742
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
743

744 745 746 747 748
	/* 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
	 */
749
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
750
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
751
						  ethhdr->h_dest, vid))
752 753 754 755 756
			batadv_dbg_ratelimited(BATADV_DBG_TT,
					       bat_priv,
					       "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
					       unicast_packet->dest,
					       ethhdr->h_dest);
757 758 759 760 761
		/* 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
		 */
762
		return true;
763 764 765 766 767 768
	}

	/* 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
	 */
769
	curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
770
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
771 772
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
773 774 775 776
		/* 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
		 */
777
		if (!orig_node)
778
			return false;
779

780
		curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
781
		batadv_orig_node_put(orig_node);
782 783
	}

784 785 786
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
787
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
788
	if (!is_old_ttvn)
789
		return true;
790

791 792 793 794 795 796
	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,
797
					  ethhdr->h_dest, vid)) {
798 799 800 801
		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);
802
		return true;
803
	}
804

805 806 807 808
	/* 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
	 */
809
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest, vid))
810
		return false;
811

812 813 814 815 816
	/* 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)
817
		return false;
818

819
	ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
820

821
	batadv_hardif_put(primary_if);
822 823

	unicast_packet->ttvn = curr_ttvn;
824

825
	return true;
826 827
}

828 829 830 831 832 833
/**
 * 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
 *
834
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855
 * 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);
}

856 857
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
858
{
859
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
860
	struct batadv_unicast_packet *unicast_packet;
861
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
862
	u8 *orig_addr;
863
	struct batadv_orig_node *orig_node = NULL;
864
	int check, hdr_size = sizeof(*unicast_packet);
865
	enum batadv_subtype subtype;
866
	bool is4addr;
867

868
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
869
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
870

871
	is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
872
	/* the caller function should have already pulled 2 bytes */
873
	if (is4addr)
874
		hdr_size = sizeof(*unicast_4addr_packet);
875

876
	/* function returns -EREMOTE for promiscuous packets */
877
	check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
878 879 880 881 882 883 884 885

	/* 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)
886
		return NET_RX_DROP;
887
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
888 889
		return NET_RX_DROP;

890
	/* packet for me */
891
	if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
892
		if (is4addr) {
893 894 895 896 897 898 899 900 901 902 903 904 905 906
			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);
			}
907
		}
908

909 910 911 912 913 914 915
		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;

916
		batadv_interface_rx(recv_if->soft_iface, skb, hdr_size,
917
				    orig_node);
918

919
rx_success:
920
		if (orig_node)
921
			batadv_orig_node_put(orig_node);
922

923 924 925
		return NET_RX_SUCCESS;
	}

926
	return batadv_route_unicast_packet(skb, recv_if);
927 928
}

929 930 931 932 933
/**
 * 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
 *
934
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
935 936 937 938 939 940 941 942
 * 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;
943
	u16 tvlv_buff_len;
944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
	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);
973 974
	else
		consume_skb(skb);
975 976 977

	return ret;
}
978

979 980 981 982 983 984 985 986 987
/**
 * 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.
 *
988
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
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 1027 1028 1029 1030 1031
 */
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)
1032
		batadv_orig_node_put(orig_node_src);
1033 1034 1035 1036

	return ret;
}

1037 1038
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1039
{
1040 1041
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1042
	struct batadv_bcast_packet *bcast_packet;
1043
	struct ethhdr *ethhdr;
1044
	int hdr_size = sizeof(*bcast_packet);
1045
	int ret = NET_RX_DROP;
1046 1047
	s32 seq_diff;
	u32 seqno;
1048 1049 1050

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

1053
	ethhdr = eth_hdr(skb);
1054 1055 1056

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1057
		goto out;
1058 1059 1060

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1061
		goto out;
1062 1063

	/* ignore broadcasts sent by myself */
1064
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1065
		goto out;
1066

1067
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1068 1069

	/* ignore broadcasts originated by myself */
1070
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1071
		goto out;
1072

1073
	if (bcast_packet->ttl < 2)
1074
		goto out;
1075

1076
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1077 1078

	if (!orig_node)
1079
		goto out;
1080

1081
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1082

1083
	seqno = ntohl(bcast_packet->seqno);
1084
	/* check whether the packet is a duplicate */
1085
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
1086
			    seqno))
1087
		goto spin_unlock;
1088

1089
	seq_diff = seqno - orig_node->last_bcast_seqno;
1090 1091

	/* check whether the packet is old and the host just restarted. */
1092
	if (batadv_window_protected(bat_priv, seq_diff,
1093 1094
				    BATADV_BCAST_MAX_AGE,
				    &orig_node->bcast_seqno_reset, NULL))
1095
		goto spin_unlock;
1096 1097

	/* mark broadcast in flood history, update window position
1098 1099
	 * if required.
	 */
1100
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1101
		orig_node->last_bcast_seqno = seqno;
1102

1103 1104
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1105
	/* check whether this has been sent by another originator before */
1106
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1107 1108
		goto out;

1109 1110
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1111
	/* rebroadcast packet */
1112
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1113

1114 1115 1116
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1117
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1118 1119
		goto out;

1120 1121 1122 1123 1124
	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;

1125
	/* broadcast for me */
1126
	batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node);
1127 1128

rx_success:
1129 1130
	ret = NET_RX_SUCCESS;
	goto out;
1131

1132 1133 1134 1135
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1136
		batadv_orig_node_put(orig_node);
1137
	return ret;
1138
}