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
#include "hard-interface.h"
#include "icmp_socket.h"
43
#include "log.h"
44 45 46 47 48 49
#include "network-coding.h"
#include "originator.h"
#include "packet.h"
#include "send.h"
#include "soft-interface.h"
#include "translation-table.h"
50
#include "tvlv.h"
51

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

55 56 57 58 59 60 61 62 63
/**
 * _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
 */
64 65
static void _batadv_update_route(struct batadv_priv *bat_priv,
				 struct batadv_orig_node *orig_node,
66
				 struct batadv_hard_iface *recv_if,
67
				 struct batadv_neigh_node *neigh_node)
68
{
69
	struct batadv_orig_ifinfo *orig_ifinfo;
70
	struct batadv_neigh_node *curr_router;
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);
78
	if (curr_router && !kref_get_unless_zero(&curr_router->refcount))
79 80
		curr_router = NULL;
	rcu_read_unlock();
81

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

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

102
	if (curr_router)
103
		batadv_neigh_node_put(curr_router);
104 105

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

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

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

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

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

	if (!orig_node)
143 144
		goto out;

145
	router = batadv_orig_router_get(orig_node, recv_if);
146

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

out:
	if (router)
152
		batadv_neigh_node_put(router);
153 154
}

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

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

188
	return false;
189 190
}

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

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

201
	ethhdr = eth_hdr(skb);
202 203 204

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

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

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

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
217
		return false;
218

219
	return true;
220 221
}

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

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

240 241 242 243 244 245 246
	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;
247

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

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

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

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

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

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

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

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

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

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

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

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

326
	if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
327
		ret = NET_RX_SUCCESS;
328

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

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

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

352
	ethhdr = eth_hdr(skb);
353 354 355

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

442
	ethhdr = eth_hdr(skb);
443 444 445

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

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

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

	return 0;
}

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

	if (!orig_node)
		return NULL;

486
	router = batadv_orig_router_get(orig_node, recv_if);
487

488 489 490
	if (!router)
		return router;

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

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

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

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

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

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

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

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

595 596 597
	return router;
}

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

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

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

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

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

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

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

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

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

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

		ret = NET_RX_SUCCESS;
658
	} else if (res == -EINPROGRESS) {
659 660
		/* skb was buffered and consumed */
		ret = NET_RX_SUCCESS;
661
	}
662

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

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

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

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

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

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

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

	return ret;
}

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

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

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

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

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

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

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

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

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

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

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

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

825
	batadv_hardif_put(primary_if);
826 827

	unicast_packet->ttvn = curr_ttvn;
828

829
	return true;
830 831
}

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

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

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

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

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

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

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

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

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

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

927 928 929
		return NET_RX_SUCCESS;
	}

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

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

	return ret;
}
982

983 984 985 986 987 988 989 990 991
/**
 * 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.
 *
992
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
 */
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;

1011 1012
	skb->priority = frag_packet->priority + 256;

1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037
	/* 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)
1038
		batadv_orig_node_put(orig_node_src);
1039 1040 1041 1042

	return ret;
}

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

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

1059
	ethhdr = eth_hdr(skb);
1060 1061 1062

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1063
		goto out;
1064 1065 1066

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1067
		goto out;
1068 1069

	/* ignore broadcasts sent by myself */
1070
	if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1071
		goto out;
1072

1073
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1074 1075

	/* ignore broadcasts originated by myself */
1076
	if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1077
		goto out;
1078

1079
	if (bcast_packet->ttl < 2)
1080
		goto out;
1081

1082
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1083 1084

	if (!orig_node)
1085
		goto out;
1086

1087
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1088

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

1095
	seq_diff = seqno - orig_node->last_bcast_seqno;
1096 1097

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

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

1109 1110
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1111
	/* check whether this has been sent by another originator before */
1112
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1113 1114
		goto out;

1115 1116
	batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));

1117
	/* rebroadcast packet */
1118
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1119

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

1126 1127 1128 1129 1130
	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;

1131
	/* broadcast for me */
1132
	batadv_interface_rx(recv_if->soft_iface, skb, hdr_size, orig_node);
1133 1134

rx_success:
1135 1136
	ret = NET_RX_SUCCESS;
	goto out;
1137

1138 1139 1140 1141
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1142
		batadv_orig_node_put(orig_node);
1143
	return ret;
1144
}