xref: /linux/net/batman-adv/routing.c (revision 3bb598fb23b6040e67b5e6db9a00b28cd26e5809)
1 /*
2  * Copyright (C) 2007-2011 B.A.T.M.A.N. contributors:
3  *
4  * Marek Lindner, Simon Wunderlich
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301, USA
19  *
20  */
21 
22 #include "main.h"
23 #include "routing.h"
24 #include "send.h"
25 #include "hash.h"
26 #include "soft-interface.h"
27 #include "hard-interface.h"
28 #include "icmp_socket.h"
29 #include "translation-table.h"
30 #include "originator.h"
31 #include "ring_buffer.h"
32 #include "vis.h"
33 #include "aggregation.h"
34 #include "gateway_common.h"
35 #include "gateway_client.h"
36 #include "unicast.h"
37 
38 void slide_own_bcast_window(struct hard_iface *hard_iface)
39 {
40 	struct bat_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
41 	struct hashtable_t *hash = bat_priv->orig_hash;
42 	struct hlist_node *node;
43 	struct hlist_head *head;
44 	struct orig_node *orig_node;
45 	unsigned long *word;
46 	int i;
47 	size_t word_index;
48 
49 	for (i = 0; i < hash->size; i++) {
50 		head = &hash->table[i];
51 
52 		rcu_read_lock();
53 		hlist_for_each_entry_rcu(orig_node, node, head, hash_entry) {
54 			spin_lock_bh(&orig_node->ogm_cnt_lock);
55 			word_index = hard_iface->if_num * NUM_WORDS;
56 			word = &(orig_node->bcast_own[word_index]);
57 
58 			bit_get_packet(bat_priv, word, 1, 0);
59 			orig_node->bcast_own_sum[hard_iface->if_num] =
60 				bit_packet_count(word);
61 			spin_unlock_bh(&orig_node->ogm_cnt_lock);
62 		}
63 		rcu_read_unlock();
64 	}
65 }
66 
67 static void update_HNA(struct bat_priv *bat_priv, struct orig_node *orig_node,
68 		       unsigned char *hna_buff, int hna_buff_len)
69 {
70 	if ((hna_buff_len != orig_node->hna_buff_len) ||
71 	    ((hna_buff_len > 0) &&
72 	     (orig_node->hna_buff_len > 0) &&
73 	     (memcmp(orig_node->hna_buff, hna_buff, hna_buff_len) != 0))) {
74 
75 		if (orig_node->hna_buff_len > 0)
76 			hna_global_del_orig(bat_priv, orig_node,
77 					    "originator changed hna");
78 
79 		if ((hna_buff_len > 0) && (hna_buff))
80 			hna_global_add_orig(bat_priv, orig_node,
81 					    hna_buff, hna_buff_len);
82 	}
83 }
84 
85 static void update_route(struct bat_priv *bat_priv,
86 			 struct orig_node *orig_node,
87 			 struct neigh_node *neigh_node,
88 			 unsigned char *hna_buff, int hna_buff_len)
89 {
90 	struct neigh_node *neigh_node_tmp;
91 
92 	/* route deleted */
93 	if ((orig_node->router) && (!neigh_node)) {
94 
95 		bat_dbg(DBG_ROUTES, bat_priv, "Deleting route towards: %pM\n",
96 			orig_node->orig);
97 		hna_global_del_orig(bat_priv, orig_node,
98 				    "originator timed out");
99 
100 		/* route added */
101 	} else if ((!orig_node->router) && (neigh_node)) {
102 
103 		bat_dbg(DBG_ROUTES, bat_priv,
104 			"Adding route towards: %pM (via %pM)\n",
105 			orig_node->orig, neigh_node->addr);
106 		hna_global_add_orig(bat_priv, orig_node,
107 				    hna_buff, hna_buff_len);
108 
109 		/* route changed */
110 	} else {
111 		bat_dbg(DBG_ROUTES, bat_priv,
112 			"Changing route towards: %pM "
113 			"(now via %pM - was via %pM)\n",
114 			orig_node->orig, neigh_node->addr,
115 			orig_node->router->addr);
116 	}
117 
118 	if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
119 		neigh_node = NULL;
120 	neigh_node_tmp = orig_node->router;
121 	orig_node->router = neigh_node;
122 	if (neigh_node_tmp)
123 		neigh_node_free_ref(neigh_node_tmp);
124 }
125 
126 
127 void update_routes(struct bat_priv *bat_priv, struct orig_node *orig_node,
128 		   struct neigh_node *neigh_node, unsigned char *hna_buff,
129 		   int hna_buff_len)
130 {
131 
132 	if (!orig_node)
133 		return;
134 
135 	if (orig_node->router != neigh_node)
136 		update_route(bat_priv, orig_node, neigh_node,
137 			     hna_buff, hna_buff_len);
138 	/* may be just HNA changed */
139 	else
140 		update_HNA(bat_priv, orig_node, hna_buff, hna_buff_len);
141 }
142 
143 static int is_bidirectional_neigh(struct orig_node *orig_node,
144 				struct orig_node *orig_neigh_node,
145 				struct batman_packet *batman_packet,
146 				struct hard_iface *if_incoming)
147 {
148 	struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
149 	struct neigh_node *neigh_node = NULL, *tmp_neigh_node;
150 	struct hlist_node *node;
151 	unsigned char total_count;
152 	uint8_t orig_eq_count, neigh_rq_count, tq_own;
153 	int tq_asym_penalty, ret = 0;
154 
155 	if (orig_node == orig_neigh_node) {
156 		rcu_read_lock();
157 		hlist_for_each_entry_rcu(tmp_neigh_node, node,
158 					 &orig_node->neigh_list, list) {
159 
160 			if (!compare_eth(tmp_neigh_node->addr,
161 					 orig_neigh_node->orig))
162 				continue;
163 
164 			if (tmp_neigh_node->if_incoming != if_incoming)
165 				continue;
166 
167 			if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
168 				continue;
169 
170 			neigh_node = tmp_neigh_node;
171 		}
172 		rcu_read_unlock();
173 
174 		if (!neigh_node)
175 			neigh_node = create_neighbor(orig_node,
176 						     orig_neigh_node,
177 						     orig_neigh_node->orig,
178 						     if_incoming);
179 		if (!neigh_node)
180 			goto out;
181 
182 		neigh_node->last_valid = jiffies;
183 	} else {
184 		/* find packet count of corresponding one hop neighbor */
185 		rcu_read_lock();
186 		hlist_for_each_entry_rcu(tmp_neigh_node, node,
187 					 &orig_neigh_node->neigh_list, list) {
188 
189 			if (!compare_eth(tmp_neigh_node->addr,
190 					 orig_neigh_node->orig))
191 				continue;
192 
193 			if (tmp_neigh_node->if_incoming != if_incoming)
194 				continue;
195 
196 			if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
197 				continue;
198 
199 			neigh_node = tmp_neigh_node;
200 		}
201 		rcu_read_unlock();
202 
203 		if (!neigh_node)
204 			neigh_node = create_neighbor(orig_neigh_node,
205 						     orig_neigh_node,
206 						     orig_neigh_node->orig,
207 						     if_incoming);
208 		if (!neigh_node)
209 			goto out;
210 	}
211 
212 	orig_node->last_valid = jiffies;
213 
214 	spin_lock_bh(&orig_node->ogm_cnt_lock);
215 	orig_eq_count = orig_neigh_node->bcast_own_sum[if_incoming->if_num];
216 	neigh_rq_count = neigh_node->real_packet_count;
217 	spin_unlock_bh(&orig_node->ogm_cnt_lock);
218 
219 	/* pay attention to not get a value bigger than 100 % */
220 	total_count = (orig_eq_count > neigh_rq_count ?
221 		       neigh_rq_count : orig_eq_count);
222 
223 	/* if we have too few packets (too less data) we set tq_own to zero */
224 	/* if we receive too few packets it is not considered bidirectional */
225 	if ((total_count < TQ_LOCAL_BIDRECT_SEND_MINIMUM) ||
226 	    (neigh_rq_count < TQ_LOCAL_BIDRECT_RECV_MINIMUM))
227 		tq_own = 0;
228 	else
229 		/* neigh_node->real_packet_count is never zero as we
230 		 * only purge old information when getting new
231 		 * information */
232 		tq_own = (TQ_MAX_VALUE * total_count) /	neigh_rq_count;
233 
234 	/*
235 	 * 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
236 	 * affect the nearly-symmetric links only a little, but
237 	 * punishes asymmetric links more.  This will give a value
238 	 * between 0 and TQ_MAX_VALUE
239 	 */
240 	tq_asym_penalty = TQ_MAX_VALUE - (TQ_MAX_VALUE *
241 				(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
242 				(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count) *
243 				(TQ_LOCAL_WINDOW_SIZE - neigh_rq_count)) /
244 					(TQ_LOCAL_WINDOW_SIZE *
245 					 TQ_LOCAL_WINDOW_SIZE *
246 					 TQ_LOCAL_WINDOW_SIZE);
247 
248 	batman_packet->tq = ((batman_packet->tq * tq_own * tq_asym_penalty) /
249 						(TQ_MAX_VALUE * TQ_MAX_VALUE));
250 
251 	bat_dbg(DBG_BATMAN, bat_priv,
252 		"bidirectional: "
253 		"orig = %-15pM neigh = %-15pM => own_bcast = %2i, "
254 		"real recv = %2i, local tq: %3i, asym_penalty: %3i, "
255 		"total tq: %3i\n",
256 		orig_node->orig, orig_neigh_node->orig, total_count,
257 		neigh_rq_count, tq_own,	tq_asym_penalty, batman_packet->tq);
258 
259 	/* if link has the minimum required transmission quality
260 	 * consider it bidirectional */
261 	if (batman_packet->tq >= TQ_TOTAL_BIDRECT_LIMIT)
262 		ret = 1;
263 
264 out:
265 	if (neigh_node)
266 		neigh_node_free_ref(neigh_node);
267 	return ret;
268 }
269 
270 /* caller must hold the neigh_list_lock */
271 void bonding_candidate_del(struct orig_node *orig_node,
272 			   struct neigh_node *neigh_node)
273 {
274 	/* this neighbor is not part of our candidate list */
275 	if (list_empty(&neigh_node->bonding_list))
276 		goto out;
277 
278 	list_del_rcu(&neigh_node->bonding_list);
279 	INIT_LIST_HEAD(&neigh_node->bonding_list);
280 	neigh_node_free_ref(neigh_node);
281 	atomic_dec(&orig_node->bond_candidates);
282 
283 out:
284 	return;
285 }
286 
287 static void bonding_candidate_add(struct orig_node *orig_node,
288 				  struct neigh_node *neigh_node)
289 {
290 	struct hlist_node *node;
291 	struct neigh_node *tmp_neigh_node;
292 	uint8_t best_tq, interference_candidate = 0;
293 
294 	spin_lock_bh(&orig_node->neigh_list_lock);
295 
296 	/* only consider if it has the same primary address ...  */
297 	if (!compare_eth(orig_node->orig,
298 			 neigh_node->orig_node->primary_addr))
299 		goto candidate_del;
300 
301 	if (!orig_node->router)
302 		goto candidate_del;
303 
304 	best_tq = orig_node->router->tq_avg;
305 
306 	/* ... and is good enough to be considered */
307 	if (neigh_node->tq_avg < best_tq - BONDING_TQ_THRESHOLD)
308 		goto candidate_del;
309 
310 	/**
311 	 * check if we have another candidate with the same mac address or
312 	 * interface. If we do, we won't select this candidate because of
313 	 * possible interference.
314 	 */
315 	hlist_for_each_entry_rcu(tmp_neigh_node, node,
316 				 &orig_node->neigh_list, list) {
317 
318 		if (tmp_neigh_node == neigh_node)
319 			continue;
320 
321 		/* we only care if the other candidate is even
322 		* considered as candidate. */
323 		if (list_empty(&tmp_neigh_node->bonding_list))
324 			continue;
325 
326 		if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
327 		    (compare_eth(neigh_node->addr, tmp_neigh_node->addr))) {
328 			interference_candidate = 1;
329 			break;
330 		}
331 	}
332 
333 	/* don't care further if it is an interference candidate */
334 	if (interference_candidate)
335 		goto candidate_del;
336 
337 	/* this neighbor already is part of our candidate list */
338 	if (!list_empty(&neigh_node->bonding_list))
339 		goto out;
340 
341 	if (!atomic_inc_not_zero(&neigh_node->refcount))
342 		goto out;
343 
344 	list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
345 	atomic_inc(&orig_node->bond_candidates);
346 	goto out;
347 
348 candidate_del:
349 	bonding_candidate_del(orig_node, neigh_node);
350 
351 out:
352 	spin_unlock_bh(&orig_node->neigh_list_lock);
353 	return;
354 }
355 
356 /* copy primary address for bonding */
357 static void bonding_save_primary(struct orig_node *orig_node,
358 				 struct orig_node *orig_neigh_node,
359 				 struct batman_packet *batman_packet)
360 {
361 	if (!(batman_packet->flags & PRIMARIES_FIRST_HOP))
362 		return;
363 
364 	memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
365 }
366 
367 static void update_orig(struct bat_priv *bat_priv,
368 			struct orig_node *orig_node,
369 			struct ethhdr *ethhdr,
370 			struct batman_packet *batman_packet,
371 			struct hard_iface *if_incoming,
372 			unsigned char *hna_buff, int hna_buff_len,
373 			char is_duplicate)
374 {
375 	struct neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL;
376 	struct orig_node *orig_node_tmp;
377 	struct hlist_node *node;
378 	int tmp_hna_buff_len;
379 	uint8_t bcast_own_sum_orig, bcast_own_sum_neigh;
380 
381 	bat_dbg(DBG_BATMAN, bat_priv, "update_originator(): "
382 		"Searching and updating originator entry of received packet\n");
383 
384 	rcu_read_lock();
385 	hlist_for_each_entry_rcu(tmp_neigh_node, node,
386 				 &orig_node->neigh_list, list) {
387 		if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
388 		    (tmp_neigh_node->if_incoming == if_incoming) &&
389 		     atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
390 			if (neigh_node)
391 				neigh_node_free_ref(neigh_node);
392 			neigh_node = tmp_neigh_node;
393 			continue;
394 		}
395 
396 		if (is_duplicate)
397 			continue;
398 
399 		ring_buffer_set(tmp_neigh_node->tq_recv,
400 				&tmp_neigh_node->tq_index, 0);
401 		tmp_neigh_node->tq_avg =
402 			ring_buffer_avg(tmp_neigh_node->tq_recv);
403 	}
404 
405 	if (!neigh_node) {
406 		struct orig_node *orig_tmp;
407 
408 		orig_tmp = get_orig_node(bat_priv, ethhdr->h_source);
409 		if (!orig_tmp)
410 			goto unlock;
411 
412 		neigh_node = create_neighbor(orig_node, orig_tmp,
413 					     ethhdr->h_source, if_incoming);
414 
415 		orig_node_free_ref(orig_tmp);
416 		if (!neigh_node)
417 			goto unlock;
418 	} else
419 		bat_dbg(DBG_BATMAN, bat_priv,
420 			"Updating existing last-hop neighbor of originator\n");
421 
422 	rcu_read_unlock();
423 
424 	orig_node->flags = batman_packet->flags;
425 	neigh_node->last_valid = jiffies;
426 
427 	ring_buffer_set(neigh_node->tq_recv,
428 			&neigh_node->tq_index,
429 			batman_packet->tq);
430 	neigh_node->tq_avg = ring_buffer_avg(neigh_node->tq_recv);
431 
432 	if (!is_duplicate) {
433 		orig_node->last_ttl = batman_packet->ttl;
434 		neigh_node->last_ttl = batman_packet->ttl;
435 	}
436 
437 	bonding_candidate_add(orig_node, neigh_node);
438 
439 	tmp_hna_buff_len = (hna_buff_len > batman_packet->num_hna * ETH_ALEN ?
440 			    batman_packet->num_hna * ETH_ALEN : hna_buff_len);
441 
442 	/* if this neighbor already is our next hop there is nothing
443 	 * to change */
444 	if (orig_node->router == neigh_node)
445 		goto update_hna;
446 
447 	/* if this neighbor does not offer a better TQ we won't consider it */
448 	if ((orig_node->router) &&
449 	    (orig_node->router->tq_avg > neigh_node->tq_avg))
450 		goto update_hna;
451 
452 	/* if the TQ is the same and the link not more symetric we
453 	 * won't consider it either */
454 	if ((orig_node->router) &&
455 	     (neigh_node->tq_avg == orig_node->router->tq_avg)) {
456 		orig_node_tmp = orig_node->router->orig_node;
457 		spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
458 		bcast_own_sum_orig =
459 			orig_node_tmp->bcast_own_sum[if_incoming->if_num];
460 		spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);
461 
462 		orig_node_tmp = neigh_node->orig_node;
463 		spin_lock_bh(&orig_node_tmp->ogm_cnt_lock);
464 		bcast_own_sum_neigh =
465 			orig_node_tmp->bcast_own_sum[if_incoming->if_num];
466 		spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock);
467 
468 		if (bcast_own_sum_orig >= bcast_own_sum_neigh)
469 			goto update_hna;
470 	}
471 
472 	update_routes(bat_priv, orig_node, neigh_node,
473 		      hna_buff, tmp_hna_buff_len);
474 	goto update_gw;
475 
476 update_hna:
477 	update_routes(bat_priv, orig_node, orig_node->router,
478 		      hna_buff, tmp_hna_buff_len);
479 
480 update_gw:
481 	if (orig_node->gw_flags != batman_packet->gw_flags)
482 		gw_node_update(bat_priv, orig_node, batman_packet->gw_flags);
483 
484 	orig_node->gw_flags = batman_packet->gw_flags;
485 
486 	/* restart gateway selection if fast or late switching was enabled */
487 	if ((orig_node->gw_flags) &&
488 	    (atomic_read(&bat_priv->gw_mode) == GW_MODE_CLIENT) &&
489 	    (atomic_read(&bat_priv->gw_sel_class) > 2))
490 		gw_check_election(bat_priv, orig_node);
491 
492 	goto out;
493 
494 unlock:
495 	rcu_read_unlock();
496 out:
497 	if (neigh_node)
498 		neigh_node_free_ref(neigh_node);
499 }
500 
501 /* checks whether the host restarted and is in the protection time.
502  * returns:
503  *  0 if the packet is to be accepted
504  *  1 if the packet is to be ignored.
505  */
506 static int window_protected(struct bat_priv *bat_priv,
507 			    int32_t seq_num_diff,
508 			    unsigned long *last_reset)
509 {
510 	if ((seq_num_diff <= -TQ_LOCAL_WINDOW_SIZE)
511 		|| (seq_num_diff >= EXPECTED_SEQNO_RANGE)) {
512 		if (time_after(jiffies, *last_reset +
513 			msecs_to_jiffies(RESET_PROTECTION_MS))) {
514 
515 			*last_reset = jiffies;
516 			bat_dbg(DBG_BATMAN, bat_priv,
517 				"old packet received, start protection\n");
518 
519 			return 0;
520 		} else
521 			return 1;
522 	}
523 	return 0;
524 }
525 
526 /* processes a batman packet for all interfaces, adjusts the sequence number and
527  * finds out whether it is a duplicate.
528  * returns:
529  *   1 the packet is a duplicate
530  *   0 the packet has not yet been received
531  *  -1 the packet is old and has been received while the seqno window
532  *     was protected. Caller should drop it.
533  */
534 static char count_real_packets(struct ethhdr *ethhdr,
535 			       struct batman_packet *batman_packet,
536 			       struct hard_iface *if_incoming)
537 {
538 	struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
539 	struct orig_node *orig_node;
540 	struct neigh_node *tmp_neigh_node;
541 	struct hlist_node *node;
542 	char is_duplicate = 0;
543 	int32_t seq_diff;
544 	int need_update = 0;
545 	int set_mark, ret = -1;
546 
547 	orig_node = get_orig_node(bat_priv, batman_packet->orig);
548 	if (!orig_node)
549 		return 0;
550 
551 	spin_lock_bh(&orig_node->ogm_cnt_lock);
552 	seq_diff = batman_packet->seqno - orig_node->last_real_seqno;
553 
554 	/* signalize caller that the packet is to be dropped. */
555 	if (window_protected(bat_priv, seq_diff,
556 			     &orig_node->batman_seqno_reset))
557 		goto out;
558 
559 	rcu_read_lock();
560 	hlist_for_each_entry_rcu(tmp_neigh_node, node,
561 				 &orig_node->neigh_list, list) {
562 
563 		is_duplicate |= get_bit_status(tmp_neigh_node->real_bits,
564 					       orig_node->last_real_seqno,
565 					       batman_packet->seqno);
566 
567 		if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) &&
568 		    (tmp_neigh_node->if_incoming == if_incoming))
569 			set_mark = 1;
570 		else
571 			set_mark = 0;
572 
573 		/* if the window moved, set the update flag. */
574 		need_update |= bit_get_packet(bat_priv,
575 					      tmp_neigh_node->real_bits,
576 					      seq_diff, set_mark);
577 
578 		tmp_neigh_node->real_packet_count =
579 			bit_packet_count(tmp_neigh_node->real_bits);
580 	}
581 	rcu_read_unlock();
582 
583 	if (need_update) {
584 		bat_dbg(DBG_BATMAN, bat_priv,
585 			"updating last_seqno: old %d, new %d\n",
586 			orig_node->last_real_seqno, batman_packet->seqno);
587 		orig_node->last_real_seqno = batman_packet->seqno;
588 	}
589 
590 	ret = is_duplicate;
591 
592 out:
593 	spin_unlock_bh(&orig_node->ogm_cnt_lock);
594 	orig_node_free_ref(orig_node);
595 	return ret;
596 }
597 
598 void receive_bat_packet(struct ethhdr *ethhdr,
599 			struct batman_packet *batman_packet,
600 			unsigned char *hna_buff, int hna_buff_len,
601 			struct hard_iface *if_incoming)
602 {
603 	struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
604 	struct hard_iface *hard_iface;
605 	struct orig_node *orig_neigh_node, *orig_node;
606 	char has_directlink_flag;
607 	char is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0;
608 	char is_broadcast = 0, is_bidirectional, is_single_hop_neigh;
609 	char is_duplicate;
610 	uint32_t if_incoming_seqno;
611 
612 	/* Silently drop when the batman packet is actually not a
613 	 * correct packet.
614 	 *
615 	 * This might happen if a packet is padded (e.g. Ethernet has a
616 	 * minimum frame length of 64 byte) and the aggregation interprets
617 	 * it as an additional length.
618 	 *
619 	 * TODO: A more sane solution would be to have a bit in the
620 	 * batman_packet to detect whether the packet is the last
621 	 * packet in an aggregation.  Here we expect that the padding
622 	 * is always zero (or not 0x01)
623 	 */
624 	if (batman_packet->packet_type != BAT_PACKET)
625 		return;
626 
627 	/* could be changed by schedule_own_packet() */
628 	if_incoming_seqno = atomic_read(&if_incoming->seqno);
629 
630 	has_directlink_flag = (batman_packet->flags & DIRECTLINK ? 1 : 0);
631 
632 	is_single_hop_neigh = (compare_eth(ethhdr->h_source,
633 					   batman_packet->orig) ? 1 : 0);
634 
635 	bat_dbg(DBG_BATMAN, bat_priv,
636 		"Received BATMAN packet via NB: %pM, IF: %s [%pM] "
637 		"(from OG: %pM, via prev OG: %pM, seqno %d, tq %d, "
638 		"TTL %d, V %d, IDF %d)\n",
639 		ethhdr->h_source, if_incoming->net_dev->name,
640 		if_incoming->net_dev->dev_addr, batman_packet->orig,
641 		batman_packet->prev_sender, batman_packet->seqno,
642 		batman_packet->tq, batman_packet->ttl, batman_packet->version,
643 		has_directlink_flag);
644 
645 	rcu_read_lock();
646 	list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
647 		if (hard_iface->if_status != IF_ACTIVE)
648 			continue;
649 
650 		if (hard_iface->soft_iface != if_incoming->soft_iface)
651 			continue;
652 
653 		if (compare_eth(ethhdr->h_source,
654 				hard_iface->net_dev->dev_addr))
655 			is_my_addr = 1;
656 
657 		if (compare_eth(batman_packet->orig,
658 				hard_iface->net_dev->dev_addr))
659 			is_my_orig = 1;
660 
661 		if (compare_eth(batman_packet->prev_sender,
662 				hard_iface->net_dev->dev_addr))
663 			is_my_oldorig = 1;
664 
665 		if (compare_eth(ethhdr->h_source, broadcast_addr))
666 			is_broadcast = 1;
667 	}
668 	rcu_read_unlock();
669 
670 	if (batman_packet->version != COMPAT_VERSION) {
671 		bat_dbg(DBG_BATMAN, bat_priv,
672 			"Drop packet: incompatible batman version (%i)\n",
673 			batman_packet->version);
674 		return;
675 	}
676 
677 	if (is_my_addr) {
678 		bat_dbg(DBG_BATMAN, bat_priv,
679 			"Drop packet: received my own broadcast (sender: %pM"
680 			")\n",
681 			ethhdr->h_source);
682 		return;
683 	}
684 
685 	if (is_broadcast) {
686 		bat_dbg(DBG_BATMAN, bat_priv, "Drop packet: "
687 		"ignoring all packets with broadcast source addr (sender: %pM"
688 		")\n", ethhdr->h_source);
689 		return;
690 	}
691 
692 	if (is_my_orig) {
693 		unsigned long *word;
694 		int offset;
695 
696 		orig_neigh_node = get_orig_node(bat_priv, ethhdr->h_source);
697 		if (!orig_neigh_node)
698 			return;
699 
700 		/* neighbor has to indicate direct link and it has to
701 		 * come via the corresponding interface */
702 		/* if received seqno equals last send seqno save new
703 		 * seqno for bidirectional check */
704 		if (has_directlink_flag &&
705 		    compare_eth(if_incoming->net_dev->dev_addr,
706 				batman_packet->orig) &&
707 		    (batman_packet->seqno - if_incoming_seqno + 2 == 0)) {
708 			offset = if_incoming->if_num * NUM_WORDS;
709 
710 			spin_lock_bh(&orig_neigh_node->ogm_cnt_lock);
711 			word = &(orig_neigh_node->bcast_own[offset]);
712 			bit_mark(word, 0);
713 			orig_neigh_node->bcast_own_sum[if_incoming->if_num] =
714 				bit_packet_count(word);
715 			spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock);
716 		}
717 
718 		bat_dbg(DBG_BATMAN, bat_priv, "Drop packet: "
719 			"originator packet from myself (via neighbor)\n");
720 		orig_node_free_ref(orig_neigh_node);
721 		return;
722 	}
723 
724 	if (is_my_oldorig) {
725 		bat_dbg(DBG_BATMAN, bat_priv,
726 			"Drop packet: ignoring all rebroadcast echos (sender: "
727 			"%pM)\n", ethhdr->h_source);
728 		return;
729 	}
730 
731 	orig_node = get_orig_node(bat_priv, batman_packet->orig);
732 	if (!orig_node)
733 		return;
734 
735 	is_duplicate = count_real_packets(ethhdr, batman_packet, if_incoming);
736 
737 	if (is_duplicate == -1) {
738 		bat_dbg(DBG_BATMAN, bat_priv,
739 			"Drop packet: packet within seqno protection time "
740 			"(sender: %pM)\n", ethhdr->h_source);
741 		goto out;
742 	}
743 
744 	if (batman_packet->tq == 0) {
745 		bat_dbg(DBG_BATMAN, bat_priv,
746 			"Drop packet: originator packet with tq equal 0\n");
747 		goto out;
748 	}
749 
750 	/* avoid temporary routing loops */
751 	if ((orig_node->router) &&
752 	    (orig_node->router->orig_node->router) &&
753 	    (compare_eth(orig_node->router->addr,
754 			 batman_packet->prev_sender)) &&
755 	    !(compare_eth(batman_packet->orig, batman_packet->prev_sender)) &&
756 	    (compare_eth(orig_node->router->addr,
757 			 orig_node->router->orig_node->router->addr))) {
758 		bat_dbg(DBG_BATMAN, bat_priv,
759 			"Drop packet: ignoring all rebroadcast packets that "
760 			"may make me loop (sender: %pM)\n", ethhdr->h_source);
761 		goto out;
762 	}
763 
764 	/* if sender is a direct neighbor the sender mac equals
765 	 * originator mac */
766 	orig_neigh_node = (is_single_hop_neigh ?
767 			   orig_node :
768 			   get_orig_node(bat_priv, ethhdr->h_source));
769 	if (!orig_neigh_node)
770 		goto out;
771 
772 	/* drop packet if sender is not a direct neighbor and if we
773 	 * don't route towards it */
774 	if (!is_single_hop_neigh && (!orig_neigh_node->router)) {
775 		bat_dbg(DBG_BATMAN, bat_priv,
776 			"Drop packet: OGM via unknown neighbor!\n");
777 		goto out_neigh;
778 	}
779 
780 	is_bidirectional = is_bidirectional_neigh(orig_node, orig_neigh_node,
781 						batman_packet, if_incoming);
782 
783 	bonding_save_primary(orig_node, orig_neigh_node, batman_packet);
784 
785 	/* update ranking if it is not a duplicate or has the same
786 	 * seqno and similar ttl as the non-duplicate */
787 	if (is_bidirectional &&
788 	    (!is_duplicate ||
789 	     ((orig_node->last_real_seqno == batman_packet->seqno) &&
790 	      (orig_node->last_ttl - 3 <= batman_packet->ttl))))
791 		update_orig(bat_priv, orig_node, ethhdr, batman_packet,
792 			    if_incoming, hna_buff, hna_buff_len, is_duplicate);
793 
794 	/* is single hop (direct) neighbor */
795 	if (is_single_hop_neigh) {
796 
797 		/* mark direct link on incoming interface */
798 		schedule_forward_packet(orig_node, ethhdr, batman_packet,
799 					1, hna_buff_len, if_incoming);
800 
801 		bat_dbg(DBG_BATMAN, bat_priv, "Forwarding packet: "
802 			"rebroadcast neighbor packet with direct link flag\n");
803 		goto out_neigh;
804 	}
805 
806 	/* multihop originator */
807 	if (!is_bidirectional) {
808 		bat_dbg(DBG_BATMAN, bat_priv,
809 			"Drop packet: not received via bidirectional link\n");
810 		goto out_neigh;
811 	}
812 
813 	if (is_duplicate) {
814 		bat_dbg(DBG_BATMAN, bat_priv,
815 			"Drop packet: duplicate packet received\n");
816 		goto out_neigh;
817 	}
818 
819 	bat_dbg(DBG_BATMAN, bat_priv,
820 		"Forwarding packet: rebroadcast originator packet\n");
821 	schedule_forward_packet(orig_node, ethhdr, batman_packet,
822 				0, hna_buff_len, if_incoming);
823 
824 out_neigh:
825 	if ((orig_neigh_node) && (!is_single_hop_neigh))
826 		orig_node_free_ref(orig_neigh_node);
827 out:
828 	orig_node_free_ref(orig_node);
829 }
830 
831 int recv_bat_packet(struct sk_buff *skb, struct hard_iface *hard_iface)
832 {
833 	struct ethhdr *ethhdr;
834 
835 	/* drop packet if it has not necessary minimum size */
836 	if (unlikely(!pskb_may_pull(skb, sizeof(struct batman_packet))))
837 		return NET_RX_DROP;
838 
839 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
840 
841 	/* packet with broadcast indication but unicast recipient */
842 	if (!is_broadcast_ether_addr(ethhdr->h_dest))
843 		return NET_RX_DROP;
844 
845 	/* packet with broadcast sender address */
846 	if (is_broadcast_ether_addr(ethhdr->h_source))
847 		return NET_RX_DROP;
848 
849 	/* create a copy of the skb, if needed, to modify it. */
850 	if (skb_cow(skb, 0) < 0)
851 		return NET_RX_DROP;
852 
853 	/* keep skb linear */
854 	if (skb_linearize(skb) < 0)
855 		return NET_RX_DROP;
856 
857 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
858 
859 	receive_aggr_bat_packet(ethhdr,
860 				skb->data,
861 				skb_headlen(skb),
862 				hard_iface);
863 
864 	kfree_skb(skb);
865 	return NET_RX_SUCCESS;
866 }
867 
868 static int recv_my_icmp_packet(struct bat_priv *bat_priv,
869 			       struct sk_buff *skb, size_t icmp_len)
870 {
871 	struct orig_node *orig_node = NULL;
872 	struct neigh_node *neigh_node = NULL;
873 	struct icmp_packet_rr *icmp_packet;
874 	int ret = NET_RX_DROP;
875 
876 	icmp_packet = (struct icmp_packet_rr *)skb->data;
877 
878 	/* add data to device queue */
879 	if (icmp_packet->msg_type != ECHO_REQUEST) {
880 		bat_socket_receive_packet(icmp_packet, icmp_len);
881 		goto out;
882 	}
883 
884 	if (!bat_priv->primary_if)
885 		goto out;
886 
887 	/* answer echo request (ping) */
888 	/* get routing information */
889 	rcu_read_lock();
890 	orig_node = orig_hash_find(bat_priv, icmp_packet->orig);
891 
892 	if (!orig_node)
893 		goto unlock;
894 
895 	neigh_node = orig_node->router;
896 
897 	if (!neigh_node)
898 		goto unlock;
899 
900 	if (!atomic_inc_not_zero(&neigh_node->refcount)) {
901 		neigh_node = NULL;
902 		goto unlock;
903 	}
904 
905 	rcu_read_unlock();
906 
907 	/* create a copy of the skb, if needed, to modify it. */
908 	if (skb_cow(skb, sizeof(struct ethhdr)) < 0)
909 		goto out;
910 
911 	icmp_packet = (struct icmp_packet_rr *)skb->data;
912 
913 	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
914 	memcpy(icmp_packet->orig,
915 		bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);
916 	icmp_packet->msg_type = ECHO_REPLY;
917 	icmp_packet->ttl = TTL;
918 
919 	send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
920 	ret = NET_RX_SUCCESS;
921 	goto out;
922 
923 unlock:
924 	rcu_read_unlock();
925 out:
926 	if (neigh_node)
927 		neigh_node_free_ref(neigh_node);
928 	if (orig_node)
929 		orig_node_free_ref(orig_node);
930 	return ret;
931 }
932 
933 static int recv_icmp_ttl_exceeded(struct bat_priv *bat_priv,
934 				  struct sk_buff *skb)
935 {
936 	struct orig_node *orig_node = NULL;
937 	struct neigh_node *neigh_node = NULL;
938 	struct icmp_packet *icmp_packet;
939 	int ret = NET_RX_DROP;
940 
941 	icmp_packet = (struct icmp_packet *)skb->data;
942 
943 	/* send TTL exceeded if packet is an echo request (traceroute) */
944 	if (icmp_packet->msg_type != ECHO_REQUEST) {
945 		pr_debug("Warning - can't forward icmp packet from %pM to "
946 			 "%pM: ttl exceeded\n", icmp_packet->orig,
947 			 icmp_packet->dst);
948 		goto out;
949 	}
950 
951 	if (!bat_priv->primary_if)
952 		goto out;
953 
954 	/* get routing information */
955 	rcu_read_lock();
956 	orig_node = orig_hash_find(bat_priv, icmp_packet->orig);
957 
958 	if (!orig_node)
959 		goto unlock;
960 
961 	neigh_node = orig_node->router;
962 
963 	if (!neigh_node)
964 		goto unlock;
965 
966 	if (!atomic_inc_not_zero(&neigh_node->refcount)) {
967 		neigh_node = NULL;
968 		goto unlock;
969 	}
970 
971 	rcu_read_unlock();
972 
973 	/* create a copy of the skb, if needed, to modify it. */
974 	if (skb_cow(skb, sizeof(struct ethhdr)) < 0)
975 		goto out;
976 
977 	icmp_packet = (struct icmp_packet *)skb->data;
978 
979 	memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
980 	memcpy(icmp_packet->orig,
981 		bat_priv->primary_if->net_dev->dev_addr, ETH_ALEN);
982 	icmp_packet->msg_type = TTL_EXCEEDED;
983 	icmp_packet->ttl = TTL;
984 
985 	send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
986 	ret = NET_RX_SUCCESS;
987 	goto out;
988 
989 unlock:
990 	rcu_read_unlock();
991 out:
992 	if (neigh_node)
993 		neigh_node_free_ref(neigh_node);
994 	if (orig_node)
995 		orig_node_free_ref(orig_node);
996 	return ret;
997 }
998 
999 
1000 int recv_icmp_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1001 {
1002 	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1003 	struct icmp_packet_rr *icmp_packet;
1004 	struct ethhdr *ethhdr;
1005 	struct orig_node *orig_node = NULL;
1006 	struct neigh_node *neigh_node = NULL;
1007 	int hdr_size = sizeof(struct icmp_packet);
1008 	int ret = NET_RX_DROP;
1009 
1010 	/**
1011 	 * we truncate all incoming icmp packets if they don't match our size
1012 	 */
1013 	if (skb->len >= sizeof(struct icmp_packet_rr))
1014 		hdr_size = sizeof(struct icmp_packet_rr);
1015 
1016 	/* drop packet if it has not necessary minimum size */
1017 	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1018 		goto out;
1019 
1020 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
1021 
1022 	/* packet with unicast indication but broadcast recipient */
1023 	if (is_broadcast_ether_addr(ethhdr->h_dest))
1024 		goto out;
1025 
1026 	/* packet with broadcast sender address */
1027 	if (is_broadcast_ether_addr(ethhdr->h_source))
1028 		goto out;
1029 
1030 	/* not for me */
1031 	if (!is_my_mac(ethhdr->h_dest))
1032 		goto out;
1033 
1034 	icmp_packet = (struct icmp_packet_rr *)skb->data;
1035 
1036 	/* add record route information if not full */
1037 	if ((hdr_size == sizeof(struct icmp_packet_rr)) &&
1038 	    (icmp_packet->rr_cur < BAT_RR_LEN)) {
1039 		memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
1040 			ethhdr->h_dest, ETH_ALEN);
1041 		icmp_packet->rr_cur++;
1042 	}
1043 
1044 	/* packet for me */
1045 	if (is_my_mac(icmp_packet->dst))
1046 		return recv_my_icmp_packet(bat_priv, skb, hdr_size);
1047 
1048 	/* TTL exceeded */
1049 	if (icmp_packet->ttl < 2)
1050 		return recv_icmp_ttl_exceeded(bat_priv, skb);
1051 
1052 	/* get routing information */
1053 	rcu_read_lock();
1054 	orig_node = orig_hash_find(bat_priv, icmp_packet->dst);
1055 
1056 	if (!orig_node)
1057 		goto unlock;
1058 
1059 	neigh_node = orig_node->router;
1060 
1061 	if (!neigh_node)
1062 		goto unlock;
1063 
1064 	if (!atomic_inc_not_zero(&neigh_node->refcount)) {
1065 		neigh_node = NULL;
1066 		goto unlock;
1067 	}
1068 
1069 	rcu_read_unlock();
1070 
1071 	/* create a copy of the skb, if needed, to modify it. */
1072 	if (skb_cow(skb, sizeof(struct ethhdr)) < 0)
1073 		goto out;
1074 
1075 	icmp_packet = (struct icmp_packet_rr *)skb->data;
1076 
1077 	/* decrement ttl */
1078 	icmp_packet->ttl--;
1079 
1080 	/* route it */
1081 	send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
1082 	ret = NET_RX_SUCCESS;
1083 	goto out;
1084 
1085 unlock:
1086 	rcu_read_unlock();
1087 out:
1088 	if (neigh_node)
1089 		neigh_node_free_ref(neigh_node);
1090 	if (orig_node)
1091 		orig_node_free_ref(orig_node);
1092 	return ret;
1093 }
1094 
1095 /* find a suitable router for this originator, and use
1096  * bonding if possible. increases the found neighbors
1097  * refcount.*/
1098 struct neigh_node *find_router(struct bat_priv *bat_priv,
1099 			       struct orig_node *orig_node,
1100 			       struct hard_iface *recv_if)
1101 {
1102 	struct orig_node *primary_orig_node;
1103 	struct orig_node *router_orig;
1104 	struct neigh_node *router, *first_candidate, *tmp_neigh_node;
1105 	static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
1106 	int bonding_enabled;
1107 
1108 	if (!orig_node)
1109 		return NULL;
1110 
1111 	if (!orig_node->router)
1112 		return NULL;
1113 
1114 	/* without bonding, the first node should
1115 	 * always choose the default router. */
1116 	bonding_enabled = atomic_read(&bat_priv->bonding);
1117 
1118 	rcu_read_lock();
1119 	/* select default router to output */
1120 	router = orig_node->router;
1121 	router_orig = orig_node->router->orig_node;
1122 	if (!router_orig || !atomic_inc_not_zero(&router->refcount)) {
1123 		rcu_read_unlock();
1124 		return NULL;
1125 	}
1126 
1127 	if ((!recv_if) && (!bonding_enabled))
1128 		goto return_router;
1129 
1130 	/* if we have something in the primary_addr, we can search
1131 	 * for a potential bonding candidate. */
1132 	if (compare_eth(router_orig->primary_addr, zero_mac))
1133 		goto return_router;
1134 
1135 	/* find the orig_node which has the primary interface. might
1136 	 * even be the same as our router_orig in many cases */
1137 
1138 	if (compare_eth(router_orig->primary_addr, router_orig->orig)) {
1139 		primary_orig_node = router_orig;
1140 	} else {
1141 		primary_orig_node = orig_hash_find(bat_priv,
1142 						   router_orig->primary_addr);
1143 		if (!primary_orig_node)
1144 			goto return_router;
1145 
1146 		orig_node_free_ref(primary_orig_node);
1147 	}
1148 
1149 	/* with less than 2 candidates, we can't do any
1150 	 * bonding and prefer the original router. */
1151 	if (atomic_read(&primary_orig_node->bond_candidates) < 2)
1152 		goto return_router;
1153 
1154 
1155 	/* all nodes between should choose a candidate which
1156 	 * is is not on the interface where the packet came
1157 	 * in. */
1158 
1159 	neigh_node_free_ref(router);
1160 	first_candidate = NULL;
1161 	router = NULL;
1162 
1163 	if (bonding_enabled) {
1164 		/* in the bonding case, send the packets in a round
1165 		 * robin fashion over the remaining interfaces. */
1166 
1167 		list_for_each_entry_rcu(tmp_neigh_node,
1168 				&primary_orig_node->bond_list, bonding_list) {
1169 			if (!first_candidate)
1170 				first_candidate = tmp_neigh_node;
1171 			/* recv_if == NULL on the first node. */
1172 			if (tmp_neigh_node->if_incoming != recv_if &&
1173 			    atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
1174 				router = tmp_neigh_node;
1175 				break;
1176 			}
1177 		}
1178 
1179 		/* use the first candidate if nothing was found. */
1180 		if (!router && first_candidate &&
1181 		    atomic_inc_not_zero(&first_candidate->refcount))
1182 			router = first_candidate;
1183 
1184 		if (!router) {
1185 			rcu_read_unlock();
1186 			return NULL;
1187 		}
1188 
1189 		/* selected should point to the next element
1190 		 * after the current router */
1191 		spin_lock_bh(&primary_orig_node->neigh_list_lock);
1192 		/* this is a list_move(), which unfortunately
1193 		 * does not exist as rcu version */
1194 		list_del_rcu(&primary_orig_node->bond_list);
1195 		list_add_rcu(&primary_orig_node->bond_list,
1196 				&router->bonding_list);
1197 		spin_unlock_bh(&primary_orig_node->neigh_list_lock);
1198 
1199 	} else {
1200 		/* if bonding is disabled, use the best of the
1201 		 * remaining candidates which are not using
1202 		 * this interface. */
1203 		list_for_each_entry_rcu(tmp_neigh_node,
1204 			&primary_orig_node->bond_list, bonding_list) {
1205 			if (!first_candidate)
1206 				first_candidate = tmp_neigh_node;
1207 
1208 			/* recv_if == NULL on the first node. */
1209 			if (tmp_neigh_node->if_incoming == recv_if)
1210 				continue;
1211 
1212 			if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
1213 				continue;
1214 
1215 			/* if we don't have a router yet
1216 			 * or this one is better, choose it. */
1217 			if ((!router) ||
1218 			    (tmp_neigh_node->tq_avg > router->tq_avg)) {
1219 				/* decrement refcount of
1220 				 * previously selected router */
1221 				if (router)
1222 					neigh_node_free_ref(router);
1223 
1224 				router = tmp_neigh_node;
1225 				atomic_inc_not_zero(&router->refcount);
1226 			}
1227 
1228 			neigh_node_free_ref(tmp_neigh_node);
1229 		}
1230 
1231 		/* use the first candidate if nothing was found. */
1232 		if (!router && first_candidate &&
1233 		    atomic_inc_not_zero(&first_candidate->refcount))
1234 			router = first_candidate;
1235 	}
1236 return_router:
1237 	rcu_read_unlock();
1238 	return router;
1239 }
1240 
1241 static int check_unicast_packet(struct sk_buff *skb, int hdr_size)
1242 {
1243 	struct ethhdr *ethhdr;
1244 
1245 	/* drop packet if it has not necessary minimum size */
1246 	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1247 		return -1;
1248 
1249 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
1250 
1251 	/* packet with unicast indication but broadcast recipient */
1252 	if (is_broadcast_ether_addr(ethhdr->h_dest))
1253 		return -1;
1254 
1255 	/* packet with broadcast sender address */
1256 	if (is_broadcast_ether_addr(ethhdr->h_source))
1257 		return -1;
1258 
1259 	/* not for me */
1260 	if (!is_my_mac(ethhdr->h_dest))
1261 		return -1;
1262 
1263 	return 0;
1264 }
1265 
1266 int route_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1267 {
1268 	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1269 	struct orig_node *orig_node = NULL;
1270 	struct neigh_node *neigh_node = NULL;
1271 	struct unicast_packet *unicast_packet;
1272 	struct ethhdr *ethhdr = (struct ethhdr *)skb_mac_header(skb);
1273 	int ret = NET_RX_DROP;
1274 	struct sk_buff *new_skb;
1275 
1276 	unicast_packet = (struct unicast_packet *)skb->data;
1277 
1278 	/* TTL exceeded */
1279 	if (unicast_packet->ttl < 2) {
1280 		pr_debug("Warning - can't forward unicast packet from %pM to "
1281 			 "%pM: ttl exceeded\n", ethhdr->h_source,
1282 			 unicast_packet->dest);
1283 		goto out;
1284 	}
1285 
1286 	/* get routing information */
1287 	rcu_read_lock();
1288 	orig_node = orig_hash_find(bat_priv, unicast_packet->dest);
1289 
1290 	if (!orig_node)
1291 		goto unlock;
1292 
1293 	rcu_read_unlock();
1294 
1295 	/* find_router() increases neigh_nodes refcount if found. */
1296 	neigh_node = find_router(bat_priv, orig_node, recv_if);
1297 
1298 	if (!neigh_node)
1299 		goto out;
1300 
1301 	/* create a copy of the skb, if needed, to modify it. */
1302 	if (skb_cow(skb, sizeof(struct ethhdr)) < 0)
1303 		goto out;
1304 
1305 	unicast_packet = (struct unicast_packet *)skb->data;
1306 
1307 	if (unicast_packet->packet_type == BAT_UNICAST &&
1308 	    atomic_read(&bat_priv->fragmentation) &&
1309 	    skb->len > neigh_node->if_incoming->net_dev->mtu) {
1310 		ret = frag_send_skb(skb, bat_priv,
1311 				    neigh_node->if_incoming, neigh_node->addr);
1312 		goto out;
1313 	}
1314 
1315 	if (unicast_packet->packet_type == BAT_UNICAST_FRAG &&
1316 	    frag_can_reassemble(skb, neigh_node->if_incoming->net_dev->mtu)) {
1317 
1318 		ret = frag_reassemble_skb(skb, bat_priv, &new_skb);
1319 
1320 		if (ret == NET_RX_DROP)
1321 			goto out;
1322 
1323 		/* packet was buffered for late merge */
1324 		if (!new_skb) {
1325 			ret = NET_RX_SUCCESS;
1326 			goto out;
1327 		}
1328 
1329 		skb = new_skb;
1330 		unicast_packet = (struct unicast_packet *)skb->data;
1331 	}
1332 
1333 	/* decrement ttl */
1334 	unicast_packet->ttl--;
1335 
1336 	/* route it */
1337 	send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
1338 	ret = NET_RX_SUCCESS;
1339 	goto out;
1340 
1341 unlock:
1342 	rcu_read_unlock();
1343 out:
1344 	if (neigh_node)
1345 		neigh_node_free_ref(neigh_node);
1346 	if (orig_node)
1347 		orig_node_free_ref(orig_node);
1348 	return ret;
1349 }
1350 
1351 int recv_unicast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1352 {
1353 	struct unicast_packet *unicast_packet;
1354 	int hdr_size = sizeof(struct unicast_packet);
1355 
1356 	if (check_unicast_packet(skb, hdr_size) < 0)
1357 		return NET_RX_DROP;
1358 
1359 	unicast_packet = (struct unicast_packet *)skb->data;
1360 
1361 	/* packet for me */
1362 	if (is_my_mac(unicast_packet->dest)) {
1363 		interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size);
1364 		return NET_RX_SUCCESS;
1365 	}
1366 
1367 	return route_unicast_packet(skb, recv_if);
1368 }
1369 
1370 int recv_ucast_frag_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1371 {
1372 	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1373 	struct unicast_frag_packet *unicast_packet;
1374 	int hdr_size = sizeof(struct unicast_frag_packet);
1375 	struct sk_buff *new_skb = NULL;
1376 	int ret;
1377 
1378 	if (check_unicast_packet(skb, hdr_size) < 0)
1379 		return NET_RX_DROP;
1380 
1381 	unicast_packet = (struct unicast_frag_packet *)skb->data;
1382 
1383 	/* packet for me */
1384 	if (is_my_mac(unicast_packet->dest)) {
1385 
1386 		ret = frag_reassemble_skb(skb, bat_priv, &new_skb);
1387 
1388 		if (ret == NET_RX_DROP)
1389 			return NET_RX_DROP;
1390 
1391 		/* packet was buffered for late merge */
1392 		if (!new_skb)
1393 			return NET_RX_SUCCESS;
1394 
1395 		interface_rx(recv_if->soft_iface, new_skb, recv_if,
1396 			     sizeof(struct unicast_packet));
1397 		return NET_RX_SUCCESS;
1398 	}
1399 
1400 	return route_unicast_packet(skb, recv_if);
1401 }
1402 
1403 
1404 int recv_bcast_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1405 {
1406 	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1407 	struct orig_node *orig_node = NULL;
1408 	struct bcast_packet *bcast_packet;
1409 	struct ethhdr *ethhdr;
1410 	int hdr_size = sizeof(struct bcast_packet);
1411 	int ret = NET_RX_DROP;
1412 	int32_t seq_diff;
1413 
1414 	/* drop packet if it has not necessary minimum size */
1415 	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1416 		goto out;
1417 
1418 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
1419 
1420 	/* packet with broadcast indication but unicast recipient */
1421 	if (!is_broadcast_ether_addr(ethhdr->h_dest))
1422 		goto out;
1423 
1424 	/* packet with broadcast sender address */
1425 	if (is_broadcast_ether_addr(ethhdr->h_source))
1426 		goto out;
1427 
1428 	/* ignore broadcasts sent by myself */
1429 	if (is_my_mac(ethhdr->h_source))
1430 		goto out;
1431 
1432 	bcast_packet = (struct bcast_packet *)skb->data;
1433 
1434 	/* ignore broadcasts originated by myself */
1435 	if (is_my_mac(bcast_packet->orig))
1436 		goto out;
1437 
1438 	if (bcast_packet->ttl < 2)
1439 		goto out;
1440 
1441 	rcu_read_lock();
1442 	orig_node = orig_hash_find(bat_priv, bcast_packet->orig);
1443 
1444 	if (!orig_node)
1445 		goto rcu_unlock;
1446 
1447 	rcu_read_unlock();
1448 
1449 	spin_lock_bh(&orig_node->bcast_seqno_lock);
1450 
1451 	/* check whether the packet is a duplicate */
1452 	if (get_bit_status(orig_node->bcast_bits, orig_node->last_bcast_seqno,
1453 			   ntohl(bcast_packet->seqno)))
1454 		goto spin_unlock;
1455 
1456 	seq_diff = ntohl(bcast_packet->seqno) - orig_node->last_bcast_seqno;
1457 
1458 	/* check whether the packet is old and the host just restarted. */
1459 	if (window_protected(bat_priv, seq_diff,
1460 			     &orig_node->bcast_seqno_reset))
1461 		goto spin_unlock;
1462 
1463 	/* mark broadcast in flood history, update window position
1464 	 * if required. */
1465 	if (bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1466 		orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);
1467 
1468 	spin_unlock_bh(&orig_node->bcast_seqno_lock);
1469 
1470 	/* rebroadcast packet */
1471 	add_bcast_packet_to_list(bat_priv, skb);
1472 
1473 	/* broadcast for me */
1474 	interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size);
1475 	ret = NET_RX_SUCCESS;
1476 	goto out;
1477 
1478 rcu_unlock:
1479 	rcu_read_unlock();
1480 	goto out;
1481 spin_unlock:
1482 	spin_unlock_bh(&orig_node->bcast_seqno_lock);
1483 out:
1484 	if (orig_node)
1485 		orig_node_free_ref(orig_node);
1486 	return ret;
1487 }
1488 
1489 int recv_vis_packet(struct sk_buff *skb, struct hard_iface *recv_if)
1490 {
1491 	struct vis_packet *vis_packet;
1492 	struct ethhdr *ethhdr;
1493 	struct bat_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1494 	int hdr_size = sizeof(struct vis_packet);
1495 
1496 	/* keep skb linear */
1497 	if (skb_linearize(skb) < 0)
1498 		return NET_RX_DROP;
1499 
1500 	if (unlikely(!pskb_may_pull(skb, hdr_size)))
1501 		return NET_RX_DROP;
1502 
1503 	vis_packet = (struct vis_packet *)skb->data;
1504 	ethhdr = (struct ethhdr *)skb_mac_header(skb);
1505 
1506 	/* not for me */
1507 	if (!is_my_mac(ethhdr->h_dest))
1508 		return NET_RX_DROP;
1509 
1510 	/* ignore own packets */
1511 	if (is_my_mac(vis_packet->vis_orig))
1512 		return NET_RX_DROP;
1513 
1514 	if (is_my_mac(vis_packet->sender_orig))
1515 		return NET_RX_DROP;
1516 
1517 	switch (vis_packet->vis_type) {
1518 	case VIS_TYPE_SERVER_SYNC:
1519 		receive_server_sync_packet(bat_priv, vis_packet,
1520 					   skb_headlen(skb));
1521 		break;
1522 
1523 	case VIS_TYPE_CLIENT_UPDATE:
1524 		receive_client_update_packet(bat_priv, vis_packet,
1525 					     skb_headlen(skb));
1526 		break;
1527 
1528 	default:	/* ignore unknown packet */
1529 		break;
1530 	}
1531 
1532 	/* We take a copy of the data in the packet, so we should
1533 	   always free the skbuf. */
1534 	return NET_RX_DROP;
1535 }
1536