routing.c 32.6 KB
Newer Older
1
/* Copyright (C) 2007-2016  B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14
 *
 * Marek Lindner, Simon Wunderlich
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of version 2 of the GNU General Public
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 17 18
 */

#include "routing.h"
19 20 21 22 23 24 25 26 27
#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

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

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

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

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

	if (!orig_node)
132 133
		goto out;

134
	router = batadv_orig_router_get(orig_node, recv_if);
135

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

out:
	if (router)
141
		batadv_neigh_node_put(router);
142 143
}

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

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

177 178 179
	return 0;
}

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

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

190
	ethhdr = eth_hdr(skb);
191 192 193

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

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

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

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

208
	return true;
209 210
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

318
out:
319
	if (primary_if)
320
		batadv_hardif_put(primary_if);
321
	if (orig_node)
322
		batadv_orig_node_put(orig_node);
323 324 325
	return ret;
}

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

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

341
	ethhdr = eth_hdr(skb);
342 343 344

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

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

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

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

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

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

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

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

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

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

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

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

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

404 405
out:
	if (orig_node)
406
		batadv_orig_node_put(orig_node);
407 408 409
	return ret;
}

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

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

431
	ethhdr = eth_hdr(skb);
432 433 434

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

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

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

	return 0;
}

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

	if (!orig_node)
		return NULL;

475
	router = batadv_orig_router_get(orig_node, recv_if);
476

477 478 479
	if (!router)
		return router;

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

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

508
		if (!kref_get_unless_zero(&cand_router->refcount)) {
S
Simon Wunderlich 已提交
509 510 511 512 513 514 515
			cand_router = NULL;
			goto next;
		}

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

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

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

		/* remove references to first candidate, we don't need it. */
		if (first_candidate) {
569
			batadv_neigh_node_put(first_candidate_router);
S
Simon Wunderlich 已提交
570 571 572 573 574
			batadv_orig_ifinfo_free_ref(first_candidate);
		}
		router = next_candidate_router;
		orig_node->last_bonding_candidate = next_candidate;
	} else if (first_candidate) {
575
		batadv_neigh_node_put(router);
S
Simon Wunderlich 已提交
576 577 578 579 580 581 582

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

584 585 586
	return router;
}

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

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

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

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

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

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

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

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

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

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

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

650 651
out:
	if (orig_node)
652
		batadv_orig_node_put(orig_node);
653
	return ret;
654 655
}

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

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

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

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

	/* update the packet header */
699
	ether_addr_copy(unicast_packet->dest, orig_addr);
700 701 702 703 704
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
705
		batadv_hardif_put(primary_if);
706
	if (orig_node)
707
		batadv_orig_node_put(orig_node);
708 709 710 711

	return ret;
}

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

722
	/* check if there is enough data before accessing it */
723
	if (!pskb_may_pull(skb, hdr_len + ETH_HLEN))
724 725 726 727
		return 0;

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

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

734 735 736 737 738
	/* 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
	 */
739
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
740
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
741
						  ethhdr->h_dest, vid))
742 743 744 745 746
			batadv_dbg_ratelimited(BATADV_DBG_TT,
					       bat_priv,
					       "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
					       unicast_packet->dest,
					       ethhdr->h_dest);
747 748 749 750 751 752 753 754 755 756 757 758
		/* at this point the mesh destination should have been
		 * substituted with the originator address found in the global
		 * table. If not, let the packet go untouched anyway because
		 * there is nothing the node can do
		 */
		return 1;
	}

	/* retrieve the TTVN known by this node for the packet destination. This
	 * value is used later to check if the node which sent (or re-routed
	 * last time) the packet had an updated information or not
	 */
759
	curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
760
	if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
761 762
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
763 764 765 766
		/* 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
		 */
767 768 769
		if (!orig_node)
			return 0;

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

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

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

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

802 803 804 805 806 807
	/* update the header in order to let the packet be delivered to this
	 * node's soft interface
	 */
	primary_if = batadv_primary_if_get_selected(bat_priv);
	if (!primary_if)
		return 0;
808

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

811
	batadv_hardif_put(primary_if);
812 813

	unicast_packet->ttvn = curr_ttvn;
814 815 816 817

	return 1;
}

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

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

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

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

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

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

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

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

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

909
rx_success:
910
		if (orig_node)
911
			batadv_orig_node_put(orig_node);
912

913 914 915
		return NET_RX_SUCCESS;
	}

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

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

	return ret;
}
968

969 970 971 972 973 974 975 976 977
/**
 * 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.
 *
978
 * Return: NET_RX_DROP if the skb is not consumed, NET_RX_SUCCESS otherwise.
979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
 */
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)
1022
		batadv_orig_node_put(orig_node_src);
1023 1024 1025 1026

	return ret;
}

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

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

1043
	ethhdr = eth_hdr(skb);
1044 1045 1046

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

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

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

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

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

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

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

	if (!orig_node)
1069
		goto out;
1070

1071
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1072

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

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

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

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

1093 1094
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

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

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

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

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

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

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

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

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