routing.c 33.1 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
	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;

377
		ethhdr = eth_hdr(skb);
378 379 380 381 382
		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;

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

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

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

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

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

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

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

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

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

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

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

441
	ethhdr = eth_hdr(skb);
442 443 444

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

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

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

	return 0;
}

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

	if (!orig_node)
		return NULL;

485
	router = batadv_orig_router_get(orig_node, recv_if);
486

487 488 489
	if (!router)
		return router;

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

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

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

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

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

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

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

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

594 595 596
	return router;
}

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

607
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
608 609

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

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

619
	if (!orig_node)
620
		goto out;
621 622

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

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

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

646
	len = skb->len;
647
	res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
648

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

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

662 663
out:
	if (orig_node)
664
		batadv_orig_node_put(orig_node);
665
	return ret;
666 667
}

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

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

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

		orig_addr = orig_node->orig;
707
		orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
708 709 710
	}

	/* update the packet header */
711
	ether_addr_copy(unicast_packet->dest, orig_addr);
712 713 714 715 716
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
717
		batadv_hardif_put(primary_if);
718
	if (orig_node)
719
		batadv_orig_node_put(orig_node);
720 721 722 723

	return ret;
}

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

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

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

743
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
744
	vid = batadv_get_vid(skb, hdr_len);
745
	ethhdr = (struct ethhdr *)(skb->data + hdr_len);
746

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

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

783
		curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
784
		batadv_orig_node_put(orig_node);
785 786
	}

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

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

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

815 816 817 818 819
	/* 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)
820
		return false;
821

822
	ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
823

824
	batadv_hardif_put(primary_if);
825 826

	unicast_packet->ttvn = curr_ttvn;
827

828
	return true;
829 830
}

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

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

871
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
872
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
873

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

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

	/* 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)
889
		return NET_RX_DROP;
890
	if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
891 892
		return NET_RX_DROP;

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

912 913 914 915 916 917 918
		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;

919
		batadv_interface_rx(recv_if->soft_iface, skb, hdr_size,
920
				    orig_node);
921

922
rx_success:
923
		if (orig_node)
924
			batadv_orig_node_put(orig_node);
925

926 927 928
		return NET_RX_SUCCESS;
	}

929
	return batadv_route_unicast_packet(skb, recv_if);
930 931
}

932 933 934 935 936
/**
 * 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
 *
937
 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
938 939 940 941 942 943 944 945
 * 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;
946
	u16 tvlv_buff_len;
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 973 974 975
	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);
976 977
	else
		consume_skb(skb);
978 979 980

	return ret;
}
981

982 983 984 985 986 987 988 989 990
/**
 * 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.
 *
991
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
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 1032 1033 1034
 */
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)
1035
		batadv_orig_node_put(orig_node_src);
1036 1037 1038 1039

	return ret;
}

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

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

1056
	ethhdr = eth_hdr(skb);
1057 1058 1059

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1060
		goto out;
1061 1062 1063

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1064
		goto out;
1065 1066

	/* ignore broadcasts sent by myself */
1067
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1068
		goto out;
1069

1070
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1071 1072

	/* ignore broadcasts originated by myself */
1073
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1074
		goto out;
1075

1076
	if (bcast_packet->ttl < 2)
1077
		goto out;
1078

1079
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1080 1081

	if (!orig_node)
1082
		goto out;
1083

1084
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1085

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

1092
	seq_diff = seqno - orig_node->last_bcast_seqno;
1093 1094

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

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

1106 1107
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1108
	/* check whether this has been sent by another originator before */
1109
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1110 1111
		goto out;

1112 1113
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1114
	/* rebroadcast packet */
1115
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1116

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

1123 1124 1125 1126 1127
	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;

1128
	/* broadcast for me */
1129
	batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node);
1130 1131

rx_success:
1132 1133
	ret = NET_RX_SUCCESS;
	goto out;
1134

1135 1136 1137 1138
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1139
		batadv_orig_node_put(orig_node);
1140
	return ret;
1141
}