routing.c 35.0 KB
Newer Older
1
/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 * 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
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 */

#include "main.h"
#include "routing.h"
#include "send.h"
#include "soft-interface.h"
#include "hard-interface.h"
#include "icmp_socket.h"
#include "translation-table.h"
#include "originator.h"
#include "vis.h"
#include "unicast.h"
30
#include "bridge_loop_avoidance.h"
31
#include "distributed-arp-table.h"
32

33
static int batadv_route_unicast_packet(struct sk_buff *skb,
34
				       struct batadv_hard_iface *recv_if);
35

36
void batadv_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
37
{
38
	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
39
	struct batadv_hashtable *hash = bat_priv->orig_hash;
40
	struct hlist_head *head;
41
	struct batadv_orig_node *orig_node;
42
	unsigned long *word;
43
	uint32_t i;
44
	size_t word_index;
45
	uint8_t *w;
46 47 48 49

	for (i = 0; i < hash->size; i++) {
		head = &hash->table[i];

50
		rcu_read_lock();
51
		hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
52
			spin_lock_bh(&orig_node->ogm_cnt_lock);
53
			word_index = hard_iface->if_num * BATADV_NUM_WORDS;
54 55
			word = &(orig_node->bcast_own[word_index]);

56
			batadv_bit_get_packet(bat_priv, word, 1, 0);
57 58
			w = &orig_node->bcast_own_sum[hard_iface->if_num];
			*w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
59
			spin_unlock_bh(&orig_node->ogm_cnt_lock);
60
		}
61
		rcu_read_unlock();
62 63 64
	}
}

65 66 67
static void _batadv_update_route(struct batadv_priv *bat_priv,
				 struct batadv_orig_node *orig_node,
				 struct batadv_neigh_node *neigh_node)
68
{
69
	struct batadv_neigh_node *curr_router;
70

71
	curr_router = batadv_orig_node_get_router(orig_node);
72

73
	/* route deleted */
74
	if ((curr_router) && (!neigh_node)) {
75 76
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
			   "Deleting route towards: %pM\n", orig_node->orig);
77 78
		batadv_tt_global_del_orig(bat_priv, orig_node,
					  "Deleted route towards originator");
79

80 81
	/* route added */
	} else if ((!curr_router) && (neigh_node)) {
82
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
83 84
			   "Adding route towards: %pM (via %pM)\n",
			   orig_node->orig, neigh_node->addr);
85
	/* route changed */
86
	} else if (neigh_node && curr_router) {
87
		batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
88 89 90
			   "Changing route towards: %pM (now via %pM - was via %pM)\n",
			   orig_node->orig, neigh_node->addr,
			   curr_router->addr);
91 92
	}

93
	if (curr_router)
94
		batadv_neigh_node_free_ref(curr_router);
95 96

	/* increase refcount of new best neighbor */
97 98
	if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
		neigh_node = NULL;
99 100 101 102 103 104 105

	spin_lock_bh(&orig_node->neigh_list_lock);
	rcu_assign_pointer(orig_node->router, neigh_node);
	spin_unlock_bh(&orig_node->neigh_list_lock);

	/* decrease refcount of previous best neighbor */
	if (curr_router)
106
		batadv_neigh_node_free_ref(curr_router);
107 108
}

109 110 111
void batadv_update_route(struct batadv_priv *bat_priv,
			 struct batadv_orig_node *orig_node,
			 struct batadv_neigh_node *neigh_node)
112
{
113
	struct batadv_neigh_node *router = NULL;
114 115

	if (!orig_node)
116 117
		goto out;

118
	router = batadv_orig_node_get_router(orig_node);
119

120
	if (router != neigh_node)
121
		_batadv_update_route(bat_priv, orig_node, neigh_node);
122 123 124

out:
	if (router)
125
		batadv_neigh_node_free_ref(router);
126 127
}

128
/* caller must hold the neigh_list_lock */
129 130
void batadv_bonding_candidate_del(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
131 132 133 134 135 136 137
{
	/* this neighbor is not part of our candidate list */
	if (list_empty(&neigh_node->bonding_list))
		goto out;

	list_del_rcu(&neigh_node->bonding_list);
	INIT_LIST_HEAD(&neigh_node->bonding_list);
138
	batadv_neigh_node_free_ref(neigh_node);
139 140 141 142 143 144
	atomic_dec(&orig_node->bond_candidates);

out:
	return;
}

145 146
void batadv_bonding_candidate_add(struct batadv_orig_node *orig_node,
				  struct batadv_neigh_node *neigh_node)
147
{
148
	struct batadv_neigh_node *tmp_neigh_node, *router = NULL;
149
	uint8_t interference_candidate = 0;
150 151 152 153

	spin_lock_bh(&orig_node->neigh_list_lock);

	/* only consider if it has the same primary address ...  */
154 155
	if (!batadv_compare_eth(orig_node->orig,
				neigh_node->orig_node->primary_addr))
156 157
		goto candidate_del;

158
	router = batadv_orig_node_get_router(orig_node);
159
	if (!router)
160 161 162
		goto candidate_del;

	/* ... and is good enough to be considered */
163
	if (neigh_node->tq_avg < router->tq_avg - BATADV_BONDING_TQ_THRESHOLD)
164 165
		goto candidate_del;

166
	/* check if we have another candidate with the same mac address or
167 168 169
	 * interface. If we do, we won't select this candidate because of
	 * possible interference.
	 */
170
	hlist_for_each_entry_rcu(tmp_neigh_node,
171 172 173 174 175
				 &orig_node->neigh_list, list) {
		if (tmp_neigh_node == neigh_node)
			continue;

		/* we only care if the other candidate is even
176 177
		 * considered as candidate.
		 */
178 179 180 181
		if (list_empty(&tmp_neigh_node->bonding_list))
			continue;

		if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
182 183
		    (batadv_compare_eth(neigh_node->addr,
					tmp_neigh_node->addr))) {
184 185 186 187 188 189 190 191 192 193 194 195 196
			interference_candidate = 1;
			break;
		}
	}

	/* don't care further if it is an interference candidate */
	if (interference_candidate)
		goto candidate_del;

	/* this neighbor already is part of our candidate list */
	if (!list_empty(&neigh_node->bonding_list))
		goto out;

197 198 199
	if (!atomic_inc_not_zero(&neigh_node->refcount))
		goto out;

200 201 202 203 204
	list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
	atomic_inc(&orig_node->bond_candidates);
	goto out;

candidate_del:
205
	batadv_bonding_candidate_del(orig_node, neigh_node);
206 207 208

out:
	spin_unlock_bh(&orig_node->neigh_list_lock);
209 210

	if (router)
211
		batadv_neigh_node_free_ref(router);
212 213 214
}

/* copy primary address for bonding */
215
void
216 217
batadv_bonding_save_primary(const struct batadv_orig_node *orig_node,
			    struct batadv_orig_node *orig_neigh_node,
218
			    const struct batadv_ogm_packet *batman_ogm_packet)
219
{
220
	if (!(batman_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP))
221 222 223 224 225
		return;

	memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
}

226 227 228 229 230
/* checks whether the host restarted and is in the protection time.
 * returns:
 *  0 if the packet is to be accepted
 *  1 if the packet is to be ignored.
 */
231
int batadv_window_protected(struct batadv_priv *bat_priv, int32_t seq_num_diff,
232
			    unsigned long *last_reset)
233
{
234 235 236 237
	if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
	    seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
		if (!batadv_has_timed_out(*last_reset,
					  BATADV_RESET_PROTECTION_MS))
238
			return 1;
239 240

		*last_reset = jiffies;
241
		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
242
			   "old packet received, start protection\n");
243
	}
244

245 246 247
	return 0;
}

248
bool batadv_check_management_packet(struct sk_buff *skb,
249
				    struct batadv_hard_iface *hard_iface,
250
				    int header_len)
251 252 253 254
{
	struct ethhdr *ethhdr;

	/* drop packet if it has not necessary minimum size */
255 256
	if (unlikely(!pskb_may_pull(skb, header_len)))
		return false;
257 258 259 260 261

	ethhdr = (struct ethhdr *)skb_mac_header(skb);

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
262
		return false;
263 264 265

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
266
		return false;
267 268 269

	/* create a copy of the skb, if needed, to modify it. */
	if (skb_cow(skb, 0) < 0)
270
		return false;
271 272 273

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
274
		return false;
275

276
	return true;
277 278
}

279
static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
280
				      struct sk_buff *skb, size_t icmp_len)
281
{
282 283
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
284
	struct batadv_icmp_packet_rr *icmp_packet;
285
	int ret = NET_RX_DROP;
286

287
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
288 289

	/* add data to device queue */
290
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
291
		batadv_socket_receive_packet(icmp_packet, icmp_len);
292
		goto out;
293 294
	}

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

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

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

309
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
310 311

	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
312
	memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
313
	icmp_packet->msg_type = BATADV_ECHO_REPLY;
314
	icmp_packet->header.ttl = BATADV_TTL;
315

316 317
	if (batadv_send_skb_to_orig(skb, orig_node, NULL))
		ret = NET_RX_SUCCESS;
318

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

327
static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
328
					 struct sk_buff *skb)
329
{
330 331
	struct batadv_hard_iface *primary_if = NULL;
	struct batadv_orig_node *orig_node = NULL;
332
	struct batadv_icmp_packet *icmp_packet;
333
	int ret = NET_RX_DROP;
334

335
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
336 337

	/* send TTL exceeded if packet is an echo request (traceroute) */
338
	if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
339 340
		pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
			 icmp_packet->orig, icmp_packet->dst);
341
		goto out;
342 343
	}

344
	primary_if = batadv_primary_if_get_selected(bat_priv);
345
	if (!primary_if)
346
		goto out;
347 348

	/* get routing information */
349
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
350
	if (!orig_node)
351
		goto out;
352

353
	/* create a copy of the skb, if needed, to modify it. */
354
	if (skb_cow(skb, ETH_HLEN) < 0)
355
		goto out;
356

357
	icmp_packet = (struct batadv_icmp_packet *)skb->data;
358

359
	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
360
	memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
361
	icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
362
	icmp_packet->header.ttl = BATADV_TTL;
363

364 365
	if (batadv_send_skb_to_orig(skb, orig_node, NULL))
		ret = NET_RX_SUCCESS;
366

367
out:
368
	if (primary_if)
369
		batadv_hardif_free_ref(primary_if);
370
	if (orig_node)
371
		batadv_orig_node_free_ref(orig_node);
372 373 374 375
	return ret;
}


376 377
int batadv_recv_icmp_packet(struct sk_buff *skb,
			    struct batadv_hard_iface *recv_if)
378
{
379
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
380
	struct batadv_icmp_packet_rr *icmp_packet;
381
	struct ethhdr *ethhdr;
382
	struct batadv_orig_node *orig_node = NULL;
383
	int hdr_size = sizeof(struct batadv_icmp_packet);
384
	int ret = NET_RX_DROP;
385

386
	/* we truncate all incoming icmp packets if they don't match our size */
387 388
	if (skb->len >= sizeof(struct batadv_icmp_packet_rr))
		hdr_size = sizeof(struct batadv_icmp_packet_rr);
389 390 391

	/* drop packet if it has not necessary minimum size */
	if (unlikely(!pskb_may_pull(skb, hdr_size)))
392
		goto out;
393 394 395 396 397

	ethhdr = (struct ethhdr *)skb_mac_header(skb);

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
398
		goto out;
399 400 401

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
402
		goto out;
403 404

	/* not for me */
405
	if (!batadv_is_my_mac(ethhdr->h_dest))
406
		goto out;
407

408
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
409 410

	/* add record route information if not full */
411
	if ((hdr_size == sizeof(struct batadv_icmp_packet_rr)) &&
412
	    (icmp_packet->rr_cur < BATADV_RR_LEN)) {
413
		memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
414
		       ethhdr->h_dest, ETH_ALEN);
415 416 417 418
		icmp_packet->rr_cur++;
	}

	/* packet for me */
419
	if (batadv_is_my_mac(icmp_packet->dst))
420
		return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
421 422

	/* TTL exceeded */
423
	if (icmp_packet->header.ttl < 2)
424
		return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
425 426

	/* get routing information */
427
	orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->dst);
428
	if (!orig_node)
429
		goto out;
430

431
	/* create a copy of the skb, if needed, to modify it. */
432
	if (skb_cow(skb, ETH_HLEN) < 0)
433
		goto out;
434

435
	icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
436

437
	/* decrement ttl */
438
	icmp_packet->header.ttl--;
439 440

	/* route it */
441 442
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if))
		ret = NET_RX_SUCCESS;
443

444 445
out:
	if (orig_node)
446
		batadv_orig_node_free_ref(orig_node);
447 448 449
	return ret;
}

450 451 452 453
/* In the bonding case, send the packets in a round
 * robin fashion over the remaining interfaces.
 *
 * This method rotates the bonding list and increases the
454 455
 * returned router's refcount.
 */
456 457 458
static struct batadv_neigh_node *
batadv_find_bond_router(struct batadv_orig_node *primary_orig,
			const struct batadv_hard_iface *recv_if)
459
{
460 461
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488

	rcu_read_lock();
	list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
				bonding_list) {
		if (!first_candidate)
			first_candidate = tmp_neigh_node;

		/* recv_if == NULL on the first node. */
		if (tmp_neigh_node->if_incoming == recv_if)
			continue;

		if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
			continue;

		router = tmp_neigh_node;
		break;
	}

	/* use the first candidate if nothing was found. */
	if (!router && first_candidate &&
	    atomic_inc_not_zero(&first_candidate->refcount))
		router = first_candidate;

	if (!router)
		goto out;

	/* selected should point to the next element
489 490
	 * after the current router
	 */
491 492
	spin_lock_bh(&primary_orig->neigh_list_lock);
	/* this is a list_move(), which unfortunately
493 494
	 * does not exist as rcu version
	 */
495 496 497 498 499 500 501 502 503 504 505 506 507 508
	list_del_rcu(&primary_orig->bond_list);
	list_add_rcu(&primary_orig->bond_list,
		     &router->bonding_list);
	spin_unlock_bh(&primary_orig->neigh_list_lock);

out:
	rcu_read_unlock();
	return router;
}

/* Interface Alternating: Use the best of the
 * remaining candidates which are not using
 * this interface.
 *
509 510
 * Increases the returned router's refcount
 */
511 512 513
static struct batadv_neigh_node *
batadv_find_ifalter_router(struct batadv_orig_node *primary_orig,
			   const struct batadv_hard_iface *recv_if)
514
{
515 516
	struct batadv_neigh_node *tmp_neigh_node;
	struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
517 518 519 520 521 522 523 524 525 526 527

	rcu_read_lock();
	list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
				bonding_list) {
		if (!first_candidate)
			first_candidate = tmp_neigh_node;

		/* recv_if == NULL on the first node. */
		if (tmp_neigh_node->if_incoming == recv_if)
			continue;

528 529 530
		if (router && tmp_neigh_node->tq_avg <= router->tq_avg)
			continue;

531 532 533
		if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
			continue;

534 535 536
		/* decrement refcount of previously selected router */
		if (router)
			batadv_neigh_node_free_ref(router);
537

538 539
		/* we found a better router (or at least one valid router) */
		router = tmp_neigh_node;
540 541 542 543 544 545 546 547 548 549 550
	}

	/* use the first candidate if nothing was found. */
	if (!router && first_candidate &&
	    atomic_inc_not_zero(&first_candidate->refcount))
		router = first_candidate;

	rcu_read_unlock();
	return router;
}

551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
static int batadv_check_unicast_packet(struct sk_buff *skb, int hdr_size)
{
	struct ethhdr *ethhdr;

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

	ethhdr = (struct ethhdr *)skb_mac_header(skb);

	/* packet with unicast indication but broadcast recipient */
	if (is_broadcast_ether_addr(ethhdr->h_dest))
		return -1;

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
		return -1;

	/* not for me */
	if (!batadv_is_my_mac(ethhdr->h_dest))
		return -1;

	return 0;
}

576
int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
577
{
578
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
579
	struct batadv_tt_query_packet *tt_query;
580
	uint16_t tt_size;
581
	int hdr_size = sizeof(*tt_query);
582
	char tt_flag;
583
	size_t packet_size;
584

585 586
	if (batadv_check_unicast_packet(skb, hdr_size) < 0)
		return NET_RX_DROP;
587 588

	/* I could need to modify it */
589
	if (skb_cow(skb, sizeof(struct batadv_tt_query_packet)) < 0)
590 591
		goto out;

592
	tt_query = (struct batadv_tt_query_packet *)skb->data;
593

594
	switch (tt_query->flags & BATADV_TT_QUERY_TYPE_MASK) {
595
	case BATADV_TT_REQUEST:
596
		batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_RX);
597

598
		/* If we cannot provide an answer the tt_request is
599 600
		 * forwarded
		 */
601
		if (!batadv_send_tt_response(bat_priv, tt_query)) {
602 603 604 605 606
			if (tt_query->flags & BATADV_TT_FULL_TABLE)
				tt_flag = 'F';
			else
				tt_flag = '.';

607
			batadv_dbg(BATADV_DBG_TT, bat_priv,
608 609 610
				   "Routing TT_REQUEST to %pM [%c]\n",
				   tt_query->dst,
				   tt_flag);
611
			return batadv_route_unicast_packet(skb, recv_if);
612 613
		}
		break;
614
	case BATADV_TT_RESPONSE:
615
		batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX);
616

617
		if (batadv_is_my_mac(tt_query->dst)) {
618
			/* packet needs to be linearized to access the TT
619 620
			 * changes
			 */
621 622
			if (skb_linearize(skb) < 0)
				goto out;
623
			/* skb_linearize() possibly changed skb->data */
624
			tt_query = (struct batadv_tt_query_packet *)skb->data;
625

626
			tt_size = batadv_tt_len(ntohs(tt_query->tt_data));
627 628

			/* Ensure we have all the claimed data */
629 630 631
			packet_size = sizeof(struct batadv_tt_query_packet);
			packet_size += tt_size;
			if (unlikely(skb_headlen(skb) < packet_size))
632 633
				goto out;

634
			batadv_handle_tt_response(bat_priv, tt_query);
635
		} else {
636 637 638 639
			if (tt_query->flags & BATADV_TT_FULL_TABLE)
				tt_flag =  'F';
			else
				tt_flag = '.';
640
			batadv_dbg(BATADV_DBG_TT, bat_priv,
641 642 643
				   "Routing TT_RESPONSE to %pM [%c]\n",
				   tt_query->dst,
				   tt_flag);
644
			return batadv_route_unicast_packet(skb, recv_if);
645 646 647 648 649 650 651 652 653
		}
		break;
	}

out:
	/* returning NET_RX_DROP will make the caller function kfree the skb */
	return NET_RX_DROP;
}

654
int batadv_recv_roam_adv(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
655
{
656
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
657
	struct batadv_roam_adv_packet *roam_adv_packet;
658
	struct batadv_orig_node *orig_node;
659

660
	if (batadv_check_unicast_packet(skb, sizeof(*roam_adv_packet)) < 0)
661 662
		goto out;

663
	batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX);
664

665
	roam_adv_packet = (struct batadv_roam_adv_packet *)skb->data;
666

667
	if (!batadv_is_my_mac(roam_adv_packet->dst))
668
		return batadv_route_unicast_packet(skb, recv_if);
669

670 671 672 673
	/* check if it is a backbone gateway. we don't accept
	 * roaming advertisement from it, as it has the same
	 * entries as we have.
	 */
674
	if (batadv_bla_is_backbone_gw_orig(bat_priv, roam_adv_packet->src))
675 676
		goto out;

677
	orig_node = batadv_orig_hash_find(bat_priv, roam_adv_packet->src);
678 679 680
	if (!orig_node)
		goto out;

681
	batadv_dbg(BATADV_DBG_TT, bat_priv,
682 683
		   "Received ROAMING_ADV from %pM (client %pM)\n",
		   roam_adv_packet->src, roam_adv_packet->client);
684

685
	batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
686
			     BATADV_TT_CLIENT_ROAM,
687
			     atomic_read(&orig_node->last_ttvn) + 1);
688

689
	batadv_orig_node_free_ref(orig_node);
690 691 692 693 694
out:
	/* returning NET_RX_DROP will make the caller function kfree the skb */
	return NET_RX_DROP;
}

695
/* find a suitable router for this originator, and use
696
 * bonding if possible. increases the found neighbors
697 698
 * refcount.
 */
699 700 701 702
struct batadv_neigh_node *
batadv_find_router(struct batadv_priv *bat_priv,
		   struct batadv_orig_node *orig_node,
		   const struct batadv_hard_iface *recv_if)
703
{
704 705 706
	struct batadv_orig_node *primary_orig_node;
	struct batadv_orig_node *router_orig;
	struct batadv_neigh_node *router;
707 708
	static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
	int bonding_enabled;
709
	uint8_t *primary_addr;
710 711 712 713

	if (!orig_node)
		return NULL;

714
	router = batadv_orig_node_get_router(orig_node);
715
	if (!router)
716
		goto err;
717 718

	/* without bonding, the first node should
719 720
	 * always choose the default router.
	 */
721 722
	bonding_enabled = atomic_read(&bat_priv->bonding);

723 724
	rcu_read_lock();
	/* select default router to output */
725
	router_orig = router->orig_node;
726 727
	if (!router_orig)
		goto err_unlock;
728 729 730

	if ((!recv_if) && (!bonding_enabled))
		goto return_router;
731

732 733
	primary_addr = router_orig->primary_addr;

734
	/* if we have something in the primary_addr, we can search
735 736
	 * for a potential bonding candidate.
	 */
737
	if (batadv_compare_eth(primary_addr, zero_mac))
738
		goto return_router;
739 740

	/* find the orig_node which has the primary interface. might
741 742
	 * even be the same as our router_orig in many cases
	 */
743
	if (batadv_compare_eth(primary_addr, router_orig->orig)) {
744 745
		primary_orig_node = router_orig;
	} else {
746 747
		primary_orig_node = batadv_orig_hash_find(bat_priv,
							  primary_addr);
748
		if (!primary_orig_node)
749
			goto return_router;
750

751
		batadv_orig_node_free_ref(primary_orig_node);
752 753 754
	}

	/* with less than 2 candidates, we can't do any
755 756
	 * bonding and prefer the original router.
	 */
757 758
	if (atomic_read(&primary_orig_node->bond_candidates) < 2)
		goto return_router;
759 760 761

	/* all nodes between should choose a candidate which
	 * is is not on the interface where the packet came
762 763
	 * in.
	 */
764
	batadv_neigh_node_free_ref(router);
765

766
	if (bonding_enabled)
767
		router = batadv_find_bond_router(primary_orig_node, recv_if);
768
	else
769
		router = batadv_find_ifalter_router(primary_orig_node, recv_if);
770

771
return_router:
772
	if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
773 774
		goto err_unlock;

775
	rcu_read_unlock();
776
	return router;
777 778 779 780
err_unlock:
	rcu_read_unlock();
err:
	if (router)
781
		batadv_neigh_node_free_ref(router);
782
	return NULL;
783 784
}

785
static int batadv_route_unicast_packet(struct sk_buff *skb,
786
				       struct batadv_hard_iface *recv_if)
787
{
788 789 790
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_neigh_node *neigh_node = NULL;
791
	struct batadv_unicast_packet *unicast_packet;
792
	struct ethhdr *ethhdr = (struct ethhdr *)skb_mac_header(skb);
793
	int ret = NET_RX_DROP;
794 795
	struct sk_buff *new_skb;

796
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
797 798

	/* TTL exceeded */
799
	if (unicast_packet->header.ttl < 2) {
800 801
		pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
			 ethhdr->h_source, unicast_packet->dest);
802
		goto out;
803 804 805
	}

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

808
	if (!orig_node)
809
		goto out;
810

811
	/* find_router() increases neigh_nodes refcount if found. */
812
	neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
813

814
	if (!neigh_node)
815
		goto out;
816 817

	/* create a copy of the skb, if needed, to modify it. */
818
	if (skb_cow(skb, ETH_HLEN) < 0)
819
		goto out;
820

821
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
822

823
	if (unicast_packet->header.packet_type == BATADV_UNICAST &&
824
	    atomic_read(&bat_priv->fragmentation) &&
825
	    skb->len > neigh_node->if_incoming->net_dev->mtu) {
826 827 828
		ret = batadv_frag_send_skb(skb, bat_priv,
					   neigh_node->if_incoming,
					   neigh_node->addr);
829 830
		goto out;
	}
831

832
	if (unicast_packet->header.packet_type == BATADV_UNICAST_FRAG &&
833 834
	    batadv_frag_can_reassemble(skb,
				       neigh_node->if_incoming->net_dev->mtu)) {
835
		ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
836 837

		if (ret == NET_RX_DROP)
838
			goto out;
839 840

		/* packet was buffered for late merge */
841 842 843 844
		if (!new_skb) {
			ret = NET_RX_SUCCESS;
			goto out;
		}
845 846

		skb = new_skb;
847
		unicast_packet = (struct batadv_unicast_packet *)skb->data;
848 849 850
	}

	/* decrement ttl */
851
	unicast_packet->header.ttl--;
852

853
	/* Update stats counter */
854 855
	batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
	batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
856 857
			   skb->len + ETH_HLEN);

858
	/* route it */
859 860
	if (batadv_send_skb_to_orig(skb, orig_node, recv_if))
		ret = NET_RX_SUCCESS;
861

862 863
out:
	if (neigh_node)
864
		batadv_neigh_node_free_ref(neigh_node);
865
	if (orig_node)
866
		batadv_orig_node_free_ref(orig_node);
867
	return ret;
868 869
}

870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923
/**
 * 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
 *
 * 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)
 *
 * Returns true if the packet header has been updated, false otherwise
 */
static bool
batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
			      struct batadv_unicast_packet *unicast_packet,
			      uint8_t *dst_addr)
{
	struct batadv_orig_node *orig_node = NULL;
	struct batadv_hard_iface *primary_if = NULL;
	bool ret = false;
	uint8_t *orig_addr, orig_ttvn;

	if (batadv_is_my_client(bat_priv, dst_addr)) {
		primary_if = batadv_primary_if_get_selected(bat_priv);
		if (!primary_if)
			goto out;
		orig_addr = primary_if->net_dev->dev_addr;
		orig_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
	} else {
		orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr);
		if (!orig_node)
			goto out;

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

		orig_addr = orig_node->orig;
		orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
	}

	/* update the packet header */
	memcpy(unicast_packet->dest, orig_addr, ETH_ALEN);
	unicast_packet->ttvn = orig_ttvn;

	ret = true;
out:
	if (primary_if)
		batadv_hardif_free_ref(primary_if);
	if (orig_node)
		batadv_orig_node_free_ref(orig_node);

	return ret;
}

924
static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
925
				     struct sk_buff *skb) {
926
	uint8_t curr_ttvn, old_ttvn;
927
	struct batadv_orig_node *orig_node;
928
	struct ethhdr *ethhdr;
929
	struct batadv_hard_iface *primary_if;
930
	struct batadv_unicast_packet *unicast_packet;
931
	int is_old_ttvn;
932

933 934 935 936 937 938
	/* check if there is enough data before accessing it */
	if (pskb_may_pull(skb, sizeof(*unicast_packet) + ETH_HLEN) < 0)
		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)
939 940
		return 0;

941
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
942
	ethhdr = (struct ethhdr *)(skb->data + sizeof(*unicast_packet));
943

944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
	/* 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
	 */
	if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest)) {
		if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
						  ethhdr->h_dest))
			net_ratelimited_function(batadv_dbg, BATADV_DBG_TT,
						 bat_priv,
						 "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
						 unicast_packet->dest,
						 ethhdr->h_dest);
		/* 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
	 */
	curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
	if (!batadv_is_my_mac(unicast_packet->dest)) {
971 972
		orig_node = batadv_orig_hash_find(bat_priv,
						  unicast_packet->dest);
973 974 975 976
		/* 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
		 */
977 978 979 980
		if (!orig_node)
			return 0;

		curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
981
		batadv_orig_node_free_ref(orig_node);
982 983
	}

984 985 986
	/* check if the TTVN contained in the packet is fresher than what the
	 * node knows
	 */
987
	is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
988 989
	if (!is_old_ttvn)
		return 1;
990

991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
	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,
					  ethhdr->h_dest)) {
		net_ratelimited_function(batadv_dbg, 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);
		return 1;
	}
1004

1005 1006 1007 1008 1009 1010
	/* 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
	 */
	if (!batadv_is_my_client(bat_priv, ethhdr->h_dest))
		return 0;
1011

1012 1013 1014 1015 1016 1017
	/* 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;
1018

1019 1020 1021 1022 1023
	memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);

	batadv_hardif_free_ref(primary_if);

	unicast_packet->ttvn = curr_ttvn;
1024 1025 1026 1027

	return 1;
}

1028 1029
int batadv_recv_unicast_packet(struct sk_buff *skb,
			       struct batadv_hard_iface *recv_if)
1030
{
1031
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1032
	struct batadv_unicast_packet *unicast_packet;
1033
	struct batadv_unicast_4addr_packet *unicast_4addr_packet;
1034 1035
	uint8_t *orig_addr;
	struct batadv_orig_node *orig_node = NULL;
1036
	int hdr_size = sizeof(*unicast_packet);
1037
	bool is4addr;
1038

1039
	unicast_packet = (struct batadv_unicast_packet *)skb->data;
1040
	unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
1041

1042
	is4addr = unicast_packet->header.packet_type == BATADV_UNICAST_4ADDR;
1043
	/* the caller function should have already pulled 2 bytes */
1044
	if (is4addr)
1045
		hdr_size = sizeof(*unicast_4addr_packet);
1046

1047
	if (batadv_check_unicast_packet(skb, hdr_size) < 0)
1048 1049
		return NET_RX_DROP;

1050
	if (!batadv_check_unicast_ttvn(bat_priv, skb))
1051 1052
		return NET_RX_DROP;

1053
	/* packet for me */
1054
	if (batadv_is_my_mac(unicast_packet->dest)) {
1055
		if (is4addr) {
1056 1057
			batadv_dat_inc_counter(bat_priv,
					       unicast_4addr_packet->subtype);
1058 1059 1060
			orig_addr = unicast_4addr_packet->src;
			orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
		}
1061

1062 1063 1064 1065 1066 1067 1068
		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;

1069
		batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
1070
				    orig_node);
1071

1072
rx_success:
1073 1074 1075
		if (orig_node)
			batadv_orig_node_free_ref(orig_node);

1076 1077 1078
		return NET_RX_SUCCESS;
	}

1079
	return batadv_route_unicast_packet(skb, recv_if);
1080 1081
}

1082
int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
1083
				  struct batadv_hard_iface *recv_if)
1084
{
1085
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1086
	struct batadv_unicast_frag_packet *unicast_packet;
1087
	int hdr_size = sizeof(*unicast_packet);
1088 1089 1090
	struct sk_buff *new_skb = NULL;
	int ret;

1091
	if (batadv_check_unicast_packet(skb, hdr_size) < 0)
1092 1093
		return NET_RX_DROP;

1094
	if (!batadv_check_unicast_ttvn(bat_priv, skb))
1095 1096
		return NET_RX_DROP;

1097
	unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
1098 1099

	/* packet for me */
1100
	if (batadv_is_my_mac(unicast_packet->dest)) {
1101
		ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
1102 1103 1104 1105 1106 1107 1108 1109

		if (ret == NET_RX_DROP)
			return NET_RX_DROP;

		/* packet was buffered for late merge */
		if (!new_skb)
			return NET_RX_SUCCESS;

1110 1111 1112 1113 1114 1115 1116
		if (batadv_dat_snoop_incoming_arp_request(bat_priv, new_skb,
							  hdr_size))
			goto rx_success;
		if (batadv_dat_snoop_incoming_arp_reply(bat_priv, new_skb,
							hdr_size))
			goto rx_success;

1117
		batadv_interface_rx(recv_if->soft_iface, new_skb, recv_if,
1118
				    sizeof(struct batadv_unicast_packet), NULL);
1119 1120

rx_success:
1121 1122 1123
		return NET_RX_SUCCESS;
	}

1124
	return batadv_route_unicast_packet(skb, recv_if);
1125 1126 1127
}


1128 1129
int batadv_recv_bcast_packet(struct sk_buff *skb,
			     struct batadv_hard_iface *recv_if)
1130
{
1131 1132
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
	struct batadv_orig_node *orig_node = NULL;
1133
	struct batadv_bcast_packet *bcast_packet;
1134
	struct ethhdr *ethhdr;
1135
	int hdr_size = sizeof(*bcast_packet);
1136
	int ret = NET_RX_DROP;
1137 1138 1139 1140
	int32_t seq_diff;

	/* drop packet if it has not necessary minimum size */
	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1141
		goto out;
1142 1143 1144 1145 1146

	ethhdr = (struct ethhdr *)skb_mac_header(skb);

	/* packet with broadcast indication but unicast recipient */
	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1147
		goto out;
1148 1149 1150

	/* packet with broadcast sender address */
	if (is_broadcast_ether_addr(ethhdr->h_source))
1151
		goto out;
1152 1153

	/* ignore broadcasts sent by myself */
1154
	if (batadv_is_my_mac(ethhdr->h_source))
1155
		goto out;
1156

1157
	bcast_packet = (struct batadv_bcast_packet *)skb->data;
1158 1159

	/* ignore broadcasts originated by myself */
1160
	if (batadv_is_my_mac(bcast_packet->orig))
1161
		goto out;
1162

1163
	if (bcast_packet->header.ttl < 2)
1164
		goto out;
1165

1166
	orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1167 1168

	if (!orig_node)
1169
		goto out;
1170

1171
	spin_lock_bh(&orig_node->bcast_seqno_lock);
1172 1173

	/* check whether the packet is a duplicate */
1174 1175
	if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
			    ntohl(bcast_packet->seqno)))
1176
		goto spin_unlock;
1177 1178 1179 1180

	seq_diff = ntohl(bcast_packet->seqno) - orig_node->last_bcast_seqno;

	/* check whether the packet is old and the host just restarted. */
1181 1182
	if (batadv_window_protected(bat_priv, seq_diff,
				    &orig_node->bcast_seqno_reset))
1183
		goto spin_unlock;
1184 1185

	/* mark broadcast in flood history, update window position
1186 1187
	 * if required.
	 */
1188
	if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1189 1190
		orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);

1191 1192
	spin_unlock_bh(&orig_node->bcast_seqno_lock);

1193
	/* check whether this has been sent by another originator before */
1194
	if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1195 1196
		goto out;

1197
	/* rebroadcast packet */
1198
	batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1199

1200 1201 1202
	/* don't hand the broadcast up if it is from an originator
	 * from the same backbone.
	 */
1203
	if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1204 1205
		goto out;

1206 1207 1208 1209 1210
	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;

1211
	/* broadcast for me */
1212 1213
	batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
			    orig_node);
1214 1215

rx_success:
1216 1217
	ret = NET_RX_SUCCESS;
	goto out;
1218

1219 1220 1221 1222
spin_unlock:
	spin_unlock_bh(&orig_node->bcast_seqno_lock);
out:
	if (orig_node)
1223
		batadv_orig_node_free_ref(orig_node);
1224
	return ret;
1225 1226
}

1227 1228
int batadv_recv_vis_packet(struct sk_buff *skb,
			   struct batadv_hard_iface *recv_if)
1229
{
1230
	struct batadv_vis_packet *vis_packet;
1231
	struct ethhdr *ethhdr;
1232
	struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1233
	int hdr_size = sizeof(*vis_packet);
1234 1235 1236 1237 1238 1239 1240 1241

	/* keep skb linear */
	if (skb_linearize(skb) < 0)
		return NET_RX_DROP;

	if (unlikely(!pskb_may_pull(skb, hdr_size)))
		return NET_RX_DROP;

1242
	vis_packet = (struct batadv_vis_packet *)skb->data;
1243 1244 1245
	ethhdr = (struct ethhdr *)skb_mac_header(skb);

	/* not for me */
1246
	if (!batadv_is_my_mac(ethhdr->h_dest))
1247 1248 1249
		return NET_RX_DROP;

	/* ignore own packets */
1250
	if (batadv_is_my_mac(vis_packet->vis_orig))
1251 1252
		return NET_RX_DROP;

1253
	if (batadv_is_my_mac(vis_packet->sender_orig))
1254 1255 1256
		return NET_RX_DROP;

	switch (vis_packet->vis_type) {
1257
	case BATADV_VIS_TYPE_SERVER_SYNC:
1258 1259
		batadv_receive_server_sync_packet(bat_priv, vis_packet,
						  skb_headlen(skb));
1260 1261
		break;

1262
	case BATADV_VIS_TYPE_CLIENT_UPDATE:
1263 1264
		batadv_receive_client_update_packet(bat_priv, vis_packet,
						    skb_headlen(skb));
1265 1266 1267 1268 1269 1270 1271
		break;

	default:	/* ignore unknown packet */
		break;
	}

	/* We take a copy of the data in the packet, so we should
1272 1273
	 * always free the skbuf.
	 */
1274 1275
	return NET_RX_DROP;
}