xref: /linux/net/batman-adv/translation-table.c (revision d0b73b488c55df905ea8faaad079f8535629ed26)
1 /* Copyright (C) 2007-2012 B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner, Simon Wunderlich, Antonio Quartulli
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA
18  */
19 
20 #include "main.h"
21 #include "translation-table.h"
22 #include "soft-interface.h"
23 #include "hard-interface.h"
24 #include "send.h"
25 #include "hash.h"
26 #include "originator.h"
27 #include "routing.h"
28 #include "bridge_loop_avoidance.h"
29 
30 #include <linux/crc16.h>
31 
32 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
33 				 struct batadv_orig_node *orig_node);
34 static void batadv_tt_purge(struct work_struct *work);
35 static void
36 batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry);
37 static void batadv_tt_global_del(struct batadv_priv *bat_priv,
38 				 struct batadv_orig_node *orig_node,
39 				 const unsigned char *addr,
40 				 const char *message, bool roaming);
41 
42 /* returns 1 if they are the same mac addr */
43 static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
44 {
45 	const void *data1 = container_of(node, struct batadv_tt_common_entry,
46 					 hash_entry);
47 
48 	return (memcmp(data1, data2, ETH_ALEN) == 0 ? 1 : 0);
49 }
50 
51 static void batadv_tt_start_timer(struct batadv_priv *bat_priv)
52 {
53 	INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge);
54 	queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
55 			   msecs_to_jiffies(5000));
56 }
57 
58 static struct batadv_tt_common_entry *
59 batadv_tt_hash_find(struct batadv_hashtable *hash, const void *data)
60 {
61 	struct hlist_head *head;
62 	struct hlist_node *node;
63 	struct batadv_tt_common_entry *tt_common_entry;
64 	struct batadv_tt_common_entry *tt_common_entry_tmp = NULL;
65 	uint32_t index;
66 
67 	if (!hash)
68 		return NULL;
69 
70 	index = batadv_choose_orig(data, hash->size);
71 	head = &hash->table[index];
72 
73 	rcu_read_lock();
74 	hlist_for_each_entry_rcu(tt_common_entry, node, head, hash_entry) {
75 		if (!batadv_compare_eth(tt_common_entry, data))
76 			continue;
77 
78 		if (!atomic_inc_not_zero(&tt_common_entry->refcount))
79 			continue;
80 
81 		tt_common_entry_tmp = tt_common_entry;
82 		break;
83 	}
84 	rcu_read_unlock();
85 
86 	return tt_common_entry_tmp;
87 }
88 
89 static struct batadv_tt_local_entry *
90 batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const void *data)
91 {
92 	struct batadv_tt_common_entry *tt_common_entry;
93 	struct batadv_tt_local_entry *tt_local_entry = NULL;
94 
95 	tt_common_entry = batadv_tt_hash_find(bat_priv->tt.local_hash, data);
96 	if (tt_common_entry)
97 		tt_local_entry = container_of(tt_common_entry,
98 					      struct batadv_tt_local_entry,
99 					      common);
100 	return tt_local_entry;
101 }
102 
103 static struct batadv_tt_global_entry *
104 batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const void *data)
105 {
106 	struct batadv_tt_common_entry *tt_common_entry;
107 	struct batadv_tt_global_entry *tt_global_entry = NULL;
108 
109 	tt_common_entry = batadv_tt_hash_find(bat_priv->tt.global_hash, data);
110 	if (tt_common_entry)
111 		tt_global_entry = container_of(tt_common_entry,
112 					       struct batadv_tt_global_entry,
113 					       common);
114 	return tt_global_entry;
115 
116 }
117 
118 static void
119 batadv_tt_local_entry_free_ref(struct batadv_tt_local_entry *tt_local_entry)
120 {
121 	if (atomic_dec_and_test(&tt_local_entry->common.refcount))
122 		kfree_rcu(tt_local_entry, common.rcu);
123 }
124 
125 static void batadv_tt_global_entry_free_rcu(struct rcu_head *rcu)
126 {
127 	struct batadv_tt_common_entry *tt_common_entry;
128 	struct batadv_tt_global_entry *tt_global_entry;
129 
130 	tt_common_entry = container_of(rcu, struct batadv_tt_common_entry, rcu);
131 	tt_global_entry = container_of(tt_common_entry,
132 				       struct batadv_tt_global_entry, common);
133 
134 	kfree(tt_global_entry);
135 }
136 
137 static void
138 batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry)
139 {
140 	if (atomic_dec_and_test(&tt_global_entry->common.refcount)) {
141 		batadv_tt_global_del_orig_list(tt_global_entry);
142 		call_rcu(&tt_global_entry->common.rcu,
143 			 batadv_tt_global_entry_free_rcu);
144 	}
145 }
146 
147 static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
148 {
149 	struct batadv_tt_orig_list_entry *orig_entry;
150 
151 	orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
152 	batadv_orig_node_free_ref(orig_entry->orig_node);
153 	kfree(orig_entry);
154 }
155 
156 static void
157 batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
158 {
159 	if (!atomic_dec_and_test(&orig_entry->refcount))
160 		return;
161 	/* to avoid race conditions, immediately decrease the tt counter */
162 	atomic_dec(&orig_entry->orig_node->tt_size);
163 	call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
164 }
165 
166 static void batadv_tt_local_event(struct batadv_priv *bat_priv,
167 				  const uint8_t *addr, uint8_t flags)
168 {
169 	struct batadv_tt_change_node *tt_change_node, *entry, *safe;
170 	bool event_removed = false;
171 	bool del_op_requested, del_op_entry;
172 
173 	tt_change_node = kmalloc(sizeof(*tt_change_node), GFP_ATOMIC);
174 
175 	if (!tt_change_node)
176 		return;
177 
178 	tt_change_node->change.flags = flags;
179 	memcpy(tt_change_node->change.addr, addr, ETH_ALEN);
180 
181 	del_op_requested = flags & BATADV_TT_CLIENT_DEL;
182 
183 	/* check for ADD+DEL or DEL+ADD events */
184 	spin_lock_bh(&bat_priv->tt.changes_list_lock);
185 	list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
186 				 list) {
187 		if (!batadv_compare_eth(entry->change.addr, addr))
188 			continue;
189 
190 		/* DEL+ADD in the same orig interval have no effect and can be
191 		 * removed to avoid silly behaviour on the receiver side. The
192 		 * other way around (ADD+DEL) can happen in case of roaming of
193 		 * a client still in the NEW state. Roaming of NEW clients is
194 		 * now possible due to automatically recognition of "temporary"
195 		 * clients
196 		 */
197 		del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
198 		if (!del_op_requested && del_op_entry)
199 			goto del;
200 		if (del_op_requested && !del_op_entry)
201 			goto del;
202 		continue;
203 del:
204 		list_del(&entry->list);
205 		kfree(entry);
206 		kfree(tt_change_node);
207 		event_removed = true;
208 		goto unlock;
209 	}
210 
211 	/* track the change in the OGMinterval list */
212 	list_add_tail(&tt_change_node->list, &bat_priv->tt.changes_list);
213 
214 unlock:
215 	spin_unlock_bh(&bat_priv->tt.changes_list_lock);
216 
217 	if (event_removed)
218 		atomic_dec(&bat_priv->tt.local_changes);
219 	else
220 		atomic_inc(&bat_priv->tt.local_changes);
221 }
222 
223 int batadv_tt_len(int changes_num)
224 {
225 	return changes_num * sizeof(struct batadv_tt_change);
226 }
227 
228 static int batadv_tt_local_init(struct batadv_priv *bat_priv)
229 {
230 	if (bat_priv->tt.local_hash)
231 		return 0;
232 
233 	bat_priv->tt.local_hash = batadv_hash_new(1024);
234 
235 	if (!bat_priv->tt.local_hash)
236 		return -ENOMEM;
237 
238 	return 0;
239 }
240 
241 static void batadv_tt_global_free(struct batadv_priv *bat_priv,
242 				  struct batadv_tt_global_entry *tt_global,
243 				  const char *message)
244 {
245 	batadv_dbg(BATADV_DBG_TT, bat_priv,
246 		   "Deleting global tt entry %pM: %s\n",
247 		   tt_global->common.addr, message);
248 
249 	batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
250 			   batadv_choose_orig, tt_global->common.addr);
251 	batadv_tt_global_entry_free_ref(tt_global);
252 
253 }
254 
255 void batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
256 			 int ifindex)
257 {
258 	struct batadv_priv *bat_priv = netdev_priv(soft_iface);
259 	struct batadv_tt_local_entry *tt_local;
260 	struct batadv_tt_global_entry *tt_global;
261 	struct hlist_head *head;
262 	struct hlist_node *node;
263 	struct batadv_tt_orig_list_entry *orig_entry;
264 	int hash_added;
265 	bool roamed_back = false;
266 
267 	tt_local = batadv_tt_local_hash_find(bat_priv, addr);
268 	tt_global = batadv_tt_global_hash_find(bat_priv, addr);
269 
270 	if (tt_local) {
271 		tt_local->last_seen = jiffies;
272 		if (tt_local->common.flags & BATADV_TT_CLIENT_PENDING) {
273 			batadv_dbg(BATADV_DBG_TT, bat_priv,
274 				   "Re-adding pending client %pM\n", addr);
275 			/* whatever the reason why the PENDING flag was set,
276 			 * this is a client which was enqueued to be removed in
277 			 * this orig_interval. Since it popped up again, the
278 			 * flag can be reset like it was never enqueued
279 			 */
280 			tt_local->common.flags &= ~BATADV_TT_CLIENT_PENDING;
281 			goto add_event;
282 		}
283 
284 		if (tt_local->common.flags & BATADV_TT_CLIENT_ROAM) {
285 			batadv_dbg(BATADV_DBG_TT, bat_priv,
286 				   "Roaming client %pM came back to its original location\n",
287 				   addr);
288 			/* the ROAM flag is set because this client roamed away
289 			 * and the node got a roaming_advertisement message. Now
290 			 * that the client popped up again at its original
291 			 * location such flag can be unset
292 			 */
293 			tt_local->common.flags &= ~BATADV_TT_CLIENT_ROAM;
294 			roamed_back = true;
295 		}
296 		goto check_roaming;
297 	}
298 
299 	tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC);
300 	if (!tt_local)
301 		goto out;
302 
303 	batadv_dbg(BATADV_DBG_TT, bat_priv,
304 		   "Creating new local tt entry: %pM (ttvn: %d)\n", addr,
305 		   (uint8_t)atomic_read(&bat_priv->tt.vn));
306 
307 	memcpy(tt_local->common.addr, addr, ETH_ALEN);
308 	tt_local->common.flags = BATADV_NO_FLAGS;
309 	if (batadv_is_wifi_iface(ifindex))
310 		tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
311 	atomic_set(&tt_local->common.refcount, 2);
312 	tt_local->last_seen = jiffies;
313 	tt_local->common.added_at = tt_local->last_seen;
314 
315 	/* the batman interface mac address should never be purged */
316 	if (batadv_compare_eth(addr, soft_iface->dev_addr))
317 		tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE;
318 
319 	/* The local entry has to be marked as NEW to avoid to send it in
320 	 * a full table response going out before the next ttvn increment
321 	 * (consistency check)
322 	 */
323 	tt_local->common.flags |= BATADV_TT_CLIENT_NEW;
324 
325 	hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
326 				     batadv_choose_orig, &tt_local->common,
327 				     &tt_local->common.hash_entry);
328 
329 	if (unlikely(hash_added != 0)) {
330 		/* remove the reference for the hash */
331 		batadv_tt_local_entry_free_ref(tt_local);
332 		goto out;
333 	}
334 
335 add_event:
336 	batadv_tt_local_event(bat_priv, addr, tt_local->common.flags);
337 
338 check_roaming:
339 	/* Check whether it is a roaming, but don't do anything if the roaming
340 	 * process has already been handled
341 	 */
342 	if (tt_global && !(tt_global->common.flags & BATADV_TT_CLIENT_ROAM)) {
343 		/* These node are probably going to update their tt table */
344 		head = &tt_global->orig_list;
345 		rcu_read_lock();
346 		hlist_for_each_entry_rcu(orig_entry, node, head, list) {
347 			batadv_send_roam_adv(bat_priv, tt_global->common.addr,
348 					     orig_entry->orig_node);
349 		}
350 		rcu_read_unlock();
351 		if (roamed_back) {
352 			batadv_tt_global_free(bat_priv, tt_global,
353 					      "Roaming canceled");
354 			tt_global = NULL;
355 		} else {
356 			/* The global entry has to be marked as ROAMING and
357 			 * has to be kept for consistency purpose
358 			 */
359 			tt_global->common.flags |= BATADV_TT_CLIENT_ROAM;
360 			tt_global->roam_at = jiffies;
361 		}
362 	}
363 
364 out:
365 	if (tt_local)
366 		batadv_tt_local_entry_free_ref(tt_local);
367 	if (tt_global)
368 		batadv_tt_global_entry_free_ref(tt_global);
369 }
370 
371 static void batadv_tt_realloc_packet_buff(unsigned char **packet_buff,
372 					  int *packet_buff_len,
373 					  int min_packet_len,
374 					  int new_packet_len)
375 {
376 	unsigned char *new_buff;
377 
378 	new_buff = kmalloc(new_packet_len, GFP_ATOMIC);
379 
380 	/* keep old buffer if kmalloc should fail */
381 	if (new_buff) {
382 		memcpy(new_buff, *packet_buff, min_packet_len);
383 		kfree(*packet_buff);
384 		*packet_buff = new_buff;
385 		*packet_buff_len = new_packet_len;
386 	}
387 }
388 
389 static void batadv_tt_prepare_packet_buff(struct batadv_priv *bat_priv,
390 					  unsigned char **packet_buff,
391 					  int *packet_buff_len,
392 					  int min_packet_len)
393 {
394 	struct batadv_hard_iface *primary_if;
395 	int req_len;
396 
397 	primary_if = batadv_primary_if_get_selected(bat_priv);
398 
399 	req_len = min_packet_len;
400 	req_len += batadv_tt_len(atomic_read(&bat_priv->tt.local_changes));
401 
402 	/* if we have too many changes for one packet don't send any
403 	 * and wait for the tt table request which will be fragmented
404 	 */
405 	if ((!primary_if) || (req_len > primary_if->soft_iface->mtu))
406 		req_len = min_packet_len;
407 
408 	batadv_tt_realloc_packet_buff(packet_buff, packet_buff_len,
409 				      min_packet_len, req_len);
410 
411 	if (primary_if)
412 		batadv_hardif_free_ref(primary_if);
413 }
414 
415 static int batadv_tt_changes_fill_buff(struct batadv_priv *bat_priv,
416 				       unsigned char **packet_buff,
417 				       int *packet_buff_len,
418 				       int min_packet_len)
419 {
420 	struct batadv_tt_change_node *entry, *safe;
421 	int count = 0, tot_changes = 0, new_len;
422 	unsigned char *tt_buff;
423 
424 	batadv_tt_prepare_packet_buff(bat_priv, packet_buff,
425 				      packet_buff_len, min_packet_len);
426 
427 	new_len = *packet_buff_len - min_packet_len;
428 	tt_buff = *packet_buff + min_packet_len;
429 
430 	if (new_len > 0)
431 		tot_changes = new_len / batadv_tt_len(1);
432 
433 	spin_lock_bh(&bat_priv->tt.changes_list_lock);
434 	atomic_set(&bat_priv->tt.local_changes, 0);
435 
436 	list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
437 				 list) {
438 		if (count < tot_changes) {
439 			memcpy(tt_buff + batadv_tt_len(count),
440 			       &entry->change, sizeof(struct batadv_tt_change));
441 			count++;
442 		}
443 		list_del(&entry->list);
444 		kfree(entry);
445 	}
446 	spin_unlock_bh(&bat_priv->tt.changes_list_lock);
447 
448 	/* Keep the buffer for possible tt_request */
449 	spin_lock_bh(&bat_priv->tt.last_changeset_lock);
450 	kfree(bat_priv->tt.last_changeset);
451 	bat_priv->tt.last_changeset_len = 0;
452 	bat_priv->tt.last_changeset = NULL;
453 	/* check whether this new OGM has no changes due to size problems */
454 	if (new_len > 0) {
455 		/* if kmalloc() fails we will reply with the full table
456 		 * instead of providing the diff
457 		 */
458 		bat_priv->tt.last_changeset = kmalloc(new_len, GFP_ATOMIC);
459 		if (bat_priv->tt.last_changeset) {
460 			memcpy(bat_priv->tt.last_changeset, tt_buff, new_len);
461 			bat_priv->tt.last_changeset_len = new_len;
462 		}
463 	}
464 	spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
465 
466 	return count;
467 }
468 
469 int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
470 {
471 	struct net_device *net_dev = (struct net_device *)seq->private;
472 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
473 	struct batadv_hashtable *hash = bat_priv->tt.local_hash;
474 	struct batadv_tt_common_entry *tt_common_entry;
475 	struct batadv_hard_iface *primary_if;
476 	struct hlist_node *node;
477 	struct hlist_head *head;
478 	uint32_t i;
479 
480 	primary_if = batadv_seq_print_text_primary_if_get(seq);
481 	if (!primary_if)
482 		goto out;
483 
484 	seq_printf(seq,
485 		   "Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n",
486 		   net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn));
487 
488 	for (i = 0; i < hash->size; i++) {
489 		head = &hash->table[i];
490 
491 		rcu_read_lock();
492 		hlist_for_each_entry_rcu(tt_common_entry, node,
493 					 head, hash_entry) {
494 			seq_printf(seq, " * %pM [%c%c%c%c%c]\n",
495 				   tt_common_entry->addr,
496 				   (tt_common_entry->flags &
497 				    BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
498 				   (tt_common_entry->flags &
499 				    BATADV_TT_CLIENT_NOPURGE ? 'P' : '.'),
500 				   (tt_common_entry->flags &
501 				    BATADV_TT_CLIENT_NEW ? 'N' : '.'),
502 				   (tt_common_entry->flags &
503 				    BATADV_TT_CLIENT_PENDING ? 'X' : '.'),
504 				   (tt_common_entry->flags &
505 				    BATADV_TT_CLIENT_WIFI ? 'W' : '.'));
506 		}
507 		rcu_read_unlock();
508 	}
509 out:
510 	if (primary_if)
511 		batadv_hardif_free_ref(primary_if);
512 	return 0;
513 }
514 
515 static void
516 batadv_tt_local_set_pending(struct batadv_priv *bat_priv,
517 			    struct batadv_tt_local_entry *tt_local_entry,
518 			    uint16_t flags, const char *message)
519 {
520 	batadv_tt_local_event(bat_priv, tt_local_entry->common.addr,
521 			      tt_local_entry->common.flags | flags);
522 
523 	/* The local client has to be marked as "pending to be removed" but has
524 	 * to be kept in the table in order to send it in a full table
525 	 * response issued before the net ttvn increment (consistency check)
526 	 */
527 	tt_local_entry->common.flags |= BATADV_TT_CLIENT_PENDING;
528 
529 	batadv_dbg(BATADV_DBG_TT, bat_priv,
530 		   "Local tt entry (%pM) pending to be removed: %s\n",
531 		   tt_local_entry->common.addr, message);
532 }
533 
534 /**
535  * batadv_tt_local_remove - logically remove an entry from the local table
536  * @bat_priv: the bat priv with all the soft interface information
537  * @addr: the MAC address of the client to remove
538  * @message: message to append to the log on deletion
539  * @roaming: true if the deletion is due to a roaming event
540  *
541  * Returns the flags assigned to the local entry before being deleted
542  */
543 uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
544 				const uint8_t *addr, const char *message,
545 				bool roaming)
546 {
547 	struct batadv_tt_local_entry *tt_local_entry;
548 	uint16_t flags, curr_flags = BATADV_NO_FLAGS;
549 
550 	tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
551 	if (!tt_local_entry)
552 		goto out;
553 
554 	curr_flags = tt_local_entry->common.flags;
555 
556 	flags = BATADV_TT_CLIENT_DEL;
557 	/* if this global entry addition is due to a roaming, the node has to
558 	 * mark the local entry as "roamed" in order to correctly reroute
559 	 * packets later
560 	 */
561 	if (roaming) {
562 		flags |= BATADV_TT_CLIENT_ROAM;
563 		/* mark the local client as ROAMed */
564 		tt_local_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
565 	}
566 
567 	if (!(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW)) {
568 		batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags,
569 					    message);
570 		goto out;
571 	}
572 	/* if this client has been added right now, it is possible to
573 	 * immediately purge it
574 	 */
575 	batadv_tt_local_event(bat_priv, tt_local_entry->common.addr,
576 			      curr_flags | BATADV_TT_CLIENT_DEL);
577 	hlist_del_rcu(&tt_local_entry->common.hash_entry);
578 	batadv_tt_local_entry_free_ref(tt_local_entry);
579 
580 out:
581 	if (tt_local_entry)
582 		batadv_tt_local_entry_free_ref(tt_local_entry);
583 
584 	return curr_flags;
585 }
586 
587 static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv,
588 				       struct hlist_head *head)
589 {
590 	struct batadv_tt_local_entry *tt_local_entry;
591 	struct batadv_tt_common_entry *tt_common_entry;
592 	struct hlist_node *node, *node_tmp;
593 
594 	hlist_for_each_entry_safe(tt_common_entry, node, node_tmp, head,
595 				  hash_entry) {
596 		tt_local_entry = container_of(tt_common_entry,
597 					      struct batadv_tt_local_entry,
598 					      common);
599 		if (tt_local_entry->common.flags & BATADV_TT_CLIENT_NOPURGE)
600 			continue;
601 
602 		/* entry already marked for deletion */
603 		if (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING)
604 			continue;
605 
606 		if (!batadv_has_timed_out(tt_local_entry->last_seen,
607 					  BATADV_TT_LOCAL_TIMEOUT))
608 			continue;
609 
610 		batadv_tt_local_set_pending(bat_priv, tt_local_entry,
611 					    BATADV_TT_CLIENT_DEL, "timed out");
612 	}
613 }
614 
615 static void batadv_tt_local_purge(struct batadv_priv *bat_priv)
616 {
617 	struct batadv_hashtable *hash = bat_priv->tt.local_hash;
618 	struct hlist_head *head;
619 	spinlock_t *list_lock; /* protects write access to the hash lists */
620 	uint32_t i;
621 
622 	for (i = 0; i < hash->size; i++) {
623 		head = &hash->table[i];
624 		list_lock = &hash->list_locks[i];
625 
626 		spin_lock_bh(list_lock);
627 		batadv_tt_local_purge_list(bat_priv, head);
628 		spin_unlock_bh(list_lock);
629 	}
630 
631 }
632 
633 static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
634 {
635 	struct batadv_hashtable *hash;
636 	spinlock_t *list_lock; /* protects write access to the hash lists */
637 	struct batadv_tt_common_entry *tt_common_entry;
638 	struct batadv_tt_local_entry *tt_local;
639 	struct hlist_node *node, *node_tmp;
640 	struct hlist_head *head;
641 	uint32_t i;
642 
643 	if (!bat_priv->tt.local_hash)
644 		return;
645 
646 	hash = bat_priv->tt.local_hash;
647 
648 	for (i = 0; i < hash->size; i++) {
649 		head = &hash->table[i];
650 		list_lock = &hash->list_locks[i];
651 
652 		spin_lock_bh(list_lock);
653 		hlist_for_each_entry_safe(tt_common_entry, node, node_tmp,
654 					  head, hash_entry) {
655 			hlist_del_rcu(node);
656 			tt_local = container_of(tt_common_entry,
657 						struct batadv_tt_local_entry,
658 						common);
659 			batadv_tt_local_entry_free_ref(tt_local);
660 		}
661 		spin_unlock_bh(list_lock);
662 	}
663 
664 	batadv_hash_destroy(hash);
665 
666 	bat_priv->tt.local_hash = NULL;
667 }
668 
669 static int batadv_tt_global_init(struct batadv_priv *bat_priv)
670 {
671 	if (bat_priv->tt.global_hash)
672 		return 0;
673 
674 	bat_priv->tt.global_hash = batadv_hash_new(1024);
675 
676 	if (!bat_priv->tt.global_hash)
677 		return -ENOMEM;
678 
679 	return 0;
680 }
681 
682 static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv)
683 {
684 	struct batadv_tt_change_node *entry, *safe;
685 
686 	spin_lock_bh(&bat_priv->tt.changes_list_lock);
687 
688 	list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
689 				 list) {
690 		list_del(&entry->list);
691 		kfree(entry);
692 	}
693 
694 	atomic_set(&bat_priv->tt.local_changes, 0);
695 	spin_unlock_bh(&bat_priv->tt.changes_list_lock);
696 }
697 
698 /* retrieves the orig_tt_list_entry belonging to orig_node from the
699  * batadv_tt_global_entry list
700  *
701  * returns it with an increased refcounter, NULL if not found
702  */
703 static struct batadv_tt_orig_list_entry *
704 batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
705 				 const struct batadv_orig_node *orig_node)
706 {
707 	struct batadv_tt_orig_list_entry *tmp_orig_entry, *orig_entry = NULL;
708 	const struct hlist_head *head;
709 	struct hlist_node *node;
710 
711 	rcu_read_lock();
712 	head = &entry->orig_list;
713 	hlist_for_each_entry_rcu(tmp_orig_entry, node, head, list) {
714 		if (tmp_orig_entry->orig_node != orig_node)
715 			continue;
716 		if (!atomic_inc_not_zero(&tmp_orig_entry->refcount))
717 			continue;
718 
719 		orig_entry = tmp_orig_entry;
720 		break;
721 	}
722 	rcu_read_unlock();
723 
724 	return orig_entry;
725 }
726 
727 /* find out if an orig_node is already in the list of a tt_global_entry.
728  * returns true if found, false otherwise
729  */
730 static bool
731 batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
732 				const struct batadv_orig_node *orig_node)
733 {
734 	struct batadv_tt_orig_list_entry *orig_entry;
735 	bool found = false;
736 
737 	orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node);
738 	if (orig_entry) {
739 		found = true;
740 		batadv_tt_orig_list_entry_free_ref(orig_entry);
741 	}
742 
743 	return found;
744 }
745 
746 static void
747 batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
748 				struct batadv_orig_node *orig_node, int ttvn)
749 {
750 	struct batadv_tt_orig_list_entry *orig_entry;
751 
752 	orig_entry = batadv_tt_global_orig_entry_find(tt_global, orig_node);
753 	if (orig_entry) {
754 		/* refresh the ttvn: the current value could be a bogus one that
755 		 * was added during a "temporary client detection"
756 		 */
757 		orig_entry->ttvn = ttvn;
758 		goto out;
759 	}
760 
761 	orig_entry = kzalloc(sizeof(*orig_entry), GFP_ATOMIC);
762 	if (!orig_entry)
763 		goto out;
764 
765 	INIT_HLIST_NODE(&orig_entry->list);
766 	atomic_inc(&orig_node->refcount);
767 	atomic_inc(&orig_node->tt_size);
768 	orig_entry->orig_node = orig_node;
769 	orig_entry->ttvn = ttvn;
770 	atomic_set(&orig_entry->refcount, 2);
771 
772 	spin_lock_bh(&tt_global->list_lock);
773 	hlist_add_head_rcu(&orig_entry->list,
774 			   &tt_global->orig_list);
775 	spin_unlock_bh(&tt_global->list_lock);
776 out:
777 	if (orig_entry)
778 		batadv_tt_orig_list_entry_free_ref(orig_entry);
779 }
780 
781 /* caller must hold orig_node refcount */
782 int batadv_tt_global_add(struct batadv_priv *bat_priv,
783 			 struct batadv_orig_node *orig_node,
784 			 const unsigned char *tt_addr, uint8_t flags,
785 			 uint8_t ttvn)
786 {
787 	struct batadv_tt_global_entry *tt_global_entry;
788 	struct batadv_tt_local_entry *tt_local_entry;
789 	int ret = 0;
790 	int hash_added;
791 	struct batadv_tt_common_entry *common;
792 	uint16_t local_flags;
793 
794 	tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr);
795 	tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr);
796 
797 	/* if the node already has a local client for this entry, it has to wait
798 	 * for a roaming advertisement instead of manually messing up the global
799 	 * table
800 	 */
801 	if ((flags & BATADV_TT_CLIENT_TEMP) && tt_local_entry &&
802 	    !(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW))
803 		goto out;
804 
805 	if (!tt_global_entry) {
806 		tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC);
807 		if (!tt_global_entry)
808 			goto out;
809 
810 		common = &tt_global_entry->common;
811 		memcpy(common->addr, tt_addr, ETH_ALEN);
812 
813 		common->flags = flags;
814 		tt_global_entry->roam_at = 0;
815 		/* node must store current time in case of roaming. This is
816 		 * needed to purge this entry out on timeout (if nobody claims
817 		 * it)
818 		 */
819 		if (flags & BATADV_TT_CLIENT_ROAM)
820 			tt_global_entry->roam_at = jiffies;
821 		atomic_set(&common->refcount, 2);
822 		common->added_at = jiffies;
823 
824 		INIT_HLIST_HEAD(&tt_global_entry->orig_list);
825 		spin_lock_init(&tt_global_entry->list_lock);
826 
827 		hash_added = batadv_hash_add(bat_priv->tt.global_hash,
828 					     batadv_compare_tt,
829 					     batadv_choose_orig, common,
830 					     &common->hash_entry);
831 
832 		if (unlikely(hash_added != 0)) {
833 			/* remove the reference for the hash */
834 			batadv_tt_global_entry_free_ref(tt_global_entry);
835 			goto out_remove;
836 		}
837 	} else {
838 		common = &tt_global_entry->common;
839 		/* If there is already a global entry, we can use this one for
840 		 * our processing.
841 		 * But if we are trying to add a temporary client then here are
842 		 * two options at this point:
843 		 * 1) the global client is not a temporary client: the global
844 		 *    client has to be left as it is, temporary information
845 		 *    should never override any already known client state
846 		 * 2) the global client is a temporary client: purge the
847 		 *    originator list and add the new one orig_entry
848 		 */
849 		if (flags & BATADV_TT_CLIENT_TEMP) {
850 			if (!(common->flags & BATADV_TT_CLIENT_TEMP))
851 				goto out;
852 			if (batadv_tt_global_entry_has_orig(tt_global_entry,
853 							    orig_node))
854 				goto out_remove;
855 			batadv_tt_global_del_orig_list(tt_global_entry);
856 			goto add_orig_entry;
857 		}
858 
859 		/* if the client was temporary added before receiving the first
860 		 * OGM announcing it, we have to clear the TEMP flag
861 		 */
862 		common->flags &= ~BATADV_TT_CLIENT_TEMP;
863 
864 		/* the change can carry possible "attribute" flags like the
865 		 * TT_CLIENT_WIFI, therefore they have to be copied in the
866 		 * client entry
867 		 */
868 		tt_global_entry->common.flags |= flags;
869 
870 		/* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
871 		 * one originator left in the list and we previously received a
872 		 * delete + roaming change for this originator.
873 		 *
874 		 * We should first delete the old originator before adding the
875 		 * new one.
876 		 */
877 		if (common->flags & BATADV_TT_CLIENT_ROAM) {
878 			batadv_tt_global_del_orig_list(tt_global_entry);
879 			common->flags &= ~BATADV_TT_CLIENT_ROAM;
880 			tt_global_entry->roam_at = 0;
881 		}
882 	}
883 add_orig_entry:
884 	/* add the new orig_entry (if needed) or update it */
885 	batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn);
886 
887 	batadv_dbg(BATADV_DBG_TT, bat_priv,
888 		   "Creating new global tt entry: %pM (via %pM)\n",
889 		   common->addr, orig_node->orig);
890 	ret = 1;
891 
892 out_remove:
893 
894 	/* remove address from local hash if present */
895 	local_flags = batadv_tt_local_remove(bat_priv, tt_addr,
896 					     "global tt received",
897 					     !!(flags & BATADV_TT_CLIENT_ROAM));
898 	tt_global_entry->common.flags |= local_flags & BATADV_TT_CLIENT_WIFI;
899 
900 	if (!(flags & BATADV_TT_CLIENT_ROAM))
901 		/* this is a normal global add. Therefore the client is not in a
902 		 * roaming state anymore.
903 		 */
904 		tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM;
905 
906 out:
907 	if (tt_global_entry)
908 		batadv_tt_global_entry_free_ref(tt_global_entry);
909 	if (tt_local_entry)
910 		batadv_tt_local_entry_free_ref(tt_local_entry);
911 	return ret;
912 }
913 
914 /* batadv_transtable_best_orig - Get best originator list entry from tt entry
915  * @tt_global_entry: global translation table entry to be analyzed
916  *
917  * This functon assumes the caller holds rcu_read_lock().
918  * Returns best originator list entry or NULL on errors.
919  */
920 static struct batadv_tt_orig_list_entry *
921 batadv_transtable_best_orig(struct batadv_tt_global_entry *tt_global_entry)
922 {
923 	struct batadv_neigh_node *router = NULL;
924 	struct hlist_head *head;
925 	struct hlist_node *node;
926 	struct batadv_tt_orig_list_entry *orig_entry, *best_entry = NULL;
927 	int best_tq = 0;
928 
929 	head = &tt_global_entry->orig_list;
930 	hlist_for_each_entry_rcu(orig_entry, node, head, list) {
931 		router = batadv_orig_node_get_router(orig_entry->orig_node);
932 		if (!router)
933 			continue;
934 
935 		if (router->tq_avg > best_tq) {
936 			best_entry = orig_entry;
937 			best_tq = router->tq_avg;
938 		}
939 
940 		batadv_neigh_node_free_ref(router);
941 	}
942 
943 	return best_entry;
944 }
945 
946 /* batadv_tt_global_print_entry - print all orig nodes who announce the address
947  * for this global entry
948  * @tt_global_entry: global translation table entry to be printed
949  * @seq: debugfs table seq_file struct
950  *
951  * This functon assumes the caller holds rcu_read_lock().
952  */
953 static void
954 batadv_tt_global_print_entry(struct batadv_tt_global_entry *tt_global_entry,
955 			     struct seq_file *seq)
956 {
957 	struct hlist_head *head;
958 	struct hlist_node *node;
959 	struct batadv_tt_orig_list_entry *orig_entry, *best_entry;
960 	struct batadv_tt_common_entry *tt_common_entry;
961 	uint16_t flags;
962 	uint8_t last_ttvn;
963 
964 	tt_common_entry = &tt_global_entry->common;
965 	flags = tt_common_entry->flags;
966 
967 	best_entry = batadv_transtable_best_orig(tt_global_entry);
968 	if (best_entry) {
969 		last_ttvn = atomic_read(&best_entry->orig_node->last_ttvn);
970 		seq_printf(seq,	" %c %pM  (%3u) via %pM     (%3u)   [%c%c%c]\n",
971 			   '*', tt_global_entry->common.addr,
972 			   best_entry->ttvn, best_entry->orig_node->orig,
973 			   last_ttvn,
974 			   (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
975 			   (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
976 			   (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
977 	}
978 
979 	head = &tt_global_entry->orig_list;
980 
981 	hlist_for_each_entry_rcu(orig_entry, node, head, list) {
982 		if (best_entry == orig_entry)
983 			continue;
984 
985 		last_ttvn = atomic_read(&orig_entry->orig_node->last_ttvn);
986 		seq_printf(seq,	" %c %pM  (%3u) via %pM     (%3u)   [%c%c%c]\n",
987 			   '+', tt_global_entry->common.addr,
988 			   orig_entry->ttvn, orig_entry->orig_node->orig,
989 			   last_ttvn,
990 			   (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
991 			   (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
992 			   (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
993 	}
994 }
995 
996 int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
997 {
998 	struct net_device *net_dev = (struct net_device *)seq->private;
999 	struct batadv_priv *bat_priv = netdev_priv(net_dev);
1000 	struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1001 	struct batadv_tt_common_entry *tt_common_entry;
1002 	struct batadv_tt_global_entry *tt_global;
1003 	struct batadv_hard_iface *primary_if;
1004 	struct hlist_node *node;
1005 	struct hlist_head *head;
1006 	uint32_t i;
1007 
1008 	primary_if = batadv_seq_print_text_primary_if_get(seq);
1009 	if (!primary_if)
1010 		goto out;
1011 
1012 	seq_printf(seq,
1013 		   "Globally announced TT entries received via the mesh %s\n",
1014 		   net_dev->name);
1015 	seq_printf(seq, "       %-13s %s       %-15s %s %s\n",
1016 		   "Client", "(TTVN)", "Originator", "(Curr TTVN)", "Flags");
1017 
1018 	for (i = 0; i < hash->size; i++) {
1019 		head = &hash->table[i];
1020 
1021 		rcu_read_lock();
1022 		hlist_for_each_entry_rcu(tt_common_entry, node,
1023 					 head, hash_entry) {
1024 			tt_global = container_of(tt_common_entry,
1025 						 struct batadv_tt_global_entry,
1026 						 common);
1027 			batadv_tt_global_print_entry(tt_global, seq);
1028 		}
1029 		rcu_read_unlock();
1030 	}
1031 out:
1032 	if (primary_if)
1033 		batadv_hardif_free_ref(primary_if);
1034 	return 0;
1035 }
1036 
1037 /* deletes the orig list of a tt_global_entry */
1038 static void
1039 batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry)
1040 {
1041 	struct hlist_head *head;
1042 	struct hlist_node *node, *safe;
1043 	struct batadv_tt_orig_list_entry *orig_entry;
1044 
1045 	spin_lock_bh(&tt_global_entry->list_lock);
1046 	head = &tt_global_entry->orig_list;
1047 	hlist_for_each_entry_safe(orig_entry, node, safe, head, list) {
1048 		hlist_del_rcu(node);
1049 		batadv_tt_orig_list_entry_free_ref(orig_entry);
1050 	}
1051 	spin_unlock_bh(&tt_global_entry->list_lock);
1052 
1053 }
1054 
1055 static void
1056 batadv_tt_global_del_orig_entry(struct batadv_priv *bat_priv,
1057 				struct batadv_tt_global_entry *tt_global_entry,
1058 				struct batadv_orig_node *orig_node,
1059 				const char *message)
1060 {
1061 	struct hlist_head *head;
1062 	struct hlist_node *node, *safe;
1063 	struct batadv_tt_orig_list_entry *orig_entry;
1064 
1065 	spin_lock_bh(&tt_global_entry->list_lock);
1066 	head = &tt_global_entry->orig_list;
1067 	hlist_for_each_entry_safe(orig_entry, node, safe, head, list) {
1068 		if (orig_entry->orig_node == orig_node) {
1069 			batadv_dbg(BATADV_DBG_TT, bat_priv,
1070 				   "Deleting %pM from global tt entry %pM: %s\n",
1071 				   orig_node->orig,
1072 				   tt_global_entry->common.addr, message);
1073 			hlist_del_rcu(node);
1074 			batadv_tt_orig_list_entry_free_ref(orig_entry);
1075 		}
1076 	}
1077 	spin_unlock_bh(&tt_global_entry->list_lock);
1078 }
1079 
1080 /* If the client is to be deleted, we check if it is the last origantor entry
1081  * within tt_global entry. If yes, we set the BATADV_TT_CLIENT_ROAM flag and the
1082  * timer, otherwise we simply remove the originator scheduled for deletion.
1083  */
1084 static void
1085 batadv_tt_global_del_roaming(struct batadv_priv *bat_priv,
1086 			     struct batadv_tt_global_entry *tt_global_entry,
1087 			     struct batadv_orig_node *orig_node,
1088 			     const char *message)
1089 {
1090 	bool last_entry = true;
1091 	struct hlist_head *head;
1092 	struct hlist_node *node;
1093 	struct batadv_tt_orig_list_entry *orig_entry;
1094 
1095 	/* no local entry exists, case 1:
1096 	 * Check if this is the last one or if other entries exist.
1097 	 */
1098 
1099 	rcu_read_lock();
1100 	head = &tt_global_entry->orig_list;
1101 	hlist_for_each_entry_rcu(orig_entry, node, head, list) {
1102 		if (orig_entry->orig_node != orig_node) {
1103 			last_entry = false;
1104 			break;
1105 		}
1106 	}
1107 	rcu_read_unlock();
1108 
1109 	if (last_entry) {
1110 		/* its the last one, mark for roaming. */
1111 		tt_global_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
1112 		tt_global_entry->roam_at = jiffies;
1113 	} else
1114 		/* there is another entry, we can simply delete this
1115 		 * one and can still use the other one.
1116 		 */
1117 		batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry,
1118 						orig_node, message);
1119 }
1120 
1121 
1122 
1123 static void batadv_tt_global_del(struct batadv_priv *bat_priv,
1124 				 struct batadv_orig_node *orig_node,
1125 				 const unsigned char *addr,
1126 				 const char *message, bool roaming)
1127 {
1128 	struct batadv_tt_global_entry *tt_global_entry;
1129 	struct batadv_tt_local_entry *local_entry = NULL;
1130 
1131 	tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr);
1132 	if (!tt_global_entry)
1133 		goto out;
1134 
1135 	if (!roaming) {
1136 		batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry,
1137 						orig_node, message);
1138 
1139 		if (hlist_empty(&tt_global_entry->orig_list))
1140 			batadv_tt_global_free(bat_priv, tt_global_entry,
1141 					      message);
1142 
1143 		goto out;
1144 	}
1145 
1146 	/* if we are deleting a global entry due to a roam
1147 	 * event, there are two possibilities:
1148 	 * 1) the client roamed from node A to node B => if there
1149 	 *    is only one originator left for this client, we mark
1150 	 *    it with BATADV_TT_CLIENT_ROAM, we start a timer and we
1151 	 *    wait for node B to claim it. In case of timeout
1152 	 *    the entry is purged.
1153 	 *
1154 	 *    If there are other originators left, we directly delete
1155 	 *    the originator.
1156 	 * 2) the client roamed to us => we can directly delete
1157 	 *    the global entry, since it is useless now.
1158 	 */
1159 	local_entry = batadv_tt_local_hash_find(bat_priv,
1160 						tt_global_entry->common.addr);
1161 	if (local_entry) {
1162 		/* local entry exists, case 2: client roamed to us. */
1163 		batadv_tt_global_del_orig_list(tt_global_entry);
1164 		batadv_tt_global_free(bat_priv, tt_global_entry, message);
1165 	} else
1166 		/* no local entry exists, case 1: check for roaming */
1167 		batadv_tt_global_del_roaming(bat_priv, tt_global_entry,
1168 					     orig_node, message);
1169 
1170 
1171 out:
1172 	if (tt_global_entry)
1173 		batadv_tt_global_entry_free_ref(tt_global_entry);
1174 	if (local_entry)
1175 		batadv_tt_local_entry_free_ref(local_entry);
1176 }
1177 
1178 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
1179 			       struct batadv_orig_node *orig_node,
1180 			       const char *message)
1181 {
1182 	struct batadv_tt_global_entry *tt_global;
1183 	struct batadv_tt_common_entry *tt_common_entry;
1184 	uint32_t i;
1185 	struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1186 	struct hlist_node *node, *safe;
1187 	struct hlist_head *head;
1188 	spinlock_t *list_lock; /* protects write access to the hash lists */
1189 
1190 	if (!hash)
1191 		return;
1192 
1193 	for (i = 0; i < hash->size; i++) {
1194 		head = &hash->table[i];
1195 		list_lock = &hash->list_locks[i];
1196 
1197 		spin_lock_bh(list_lock);
1198 		hlist_for_each_entry_safe(tt_common_entry, node, safe,
1199 					  head, hash_entry) {
1200 			tt_global = container_of(tt_common_entry,
1201 						 struct batadv_tt_global_entry,
1202 						 common);
1203 
1204 			batadv_tt_global_del_orig_entry(bat_priv, tt_global,
1205 							orig_node, message);
1206 
1207 			if (hlist_empty(&tt_global->orig_list)) {
1208 				batadv_dbg(BATADV_DBG_TT, bat_priv,
1209 					   "Deleting global tt entry %pM: %s\n",
1210 					   tt_global->common.addr, message);
1211 				hlist_del_rcu(node);
1212 				batadv_tt_global_entry_free_ref(tt_global);
1213 			}
1214 		}
1215 		spin_unlock_bh(list_lock);
1216 	}
1217 	orig_node->tt_initialised = false;
1218 }
1219 
1220 static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
1221 				      char **msg)
1222 {
1223 	bool purge = false;
1224 	unsigned long roam_timeout = BATADV_TT_CLIENT_ROAM_TIMEOUT;
1225 	unsigned long temp_timeout = BATADV_TT_CLIENT_TEMP_TIMEOUT;
1226 
1227 	if ((tt_global->common.flags & BATADV_TT_CLIENT_ROAM) &&
1228 	    batadv_has_timed_out(tt_global->roam_at, roam_timeout)) {
1229 		purge = true;
1230 		*msg = "Roaming timeout\n";
1231 	}
1232 
1233 	if ((tt_global->common.flags & BATADV_TT_CLIENT_TEMP) &&
1234 	    batadv_has_timed_out(tt_global->common.added_at, temp_timeout)) {
1235 		purge = true;
1236 		*msg = "Temporary client timeout\n";
1237 	}
1238 
1239 	return purge;
1240 }
1241 
1242 static void batadv_tt_global_purge(struct batadv_priv *bat_priv)
1243 {
1244 	struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1245 	struct hlist_head *head;
1246 	struct hlist_node *node, *node_tmp;
1247 	spinlock_t *list_lock; /* protects write access to the hash lists */
1248 	uint32_t i;
1249 	char *msg = NULL;
1250 	struct batadv_tt_common_entry *tt_common;
1251 	struct batadv_tt_global_entry *tt_global;
1252 
1253 	for (i = 0; i < hash->size; i++) {
1254 		head = &hash->table[i];
1255 		list_lock = &hash->list_locks[i];
1256 
1257 		spin_lock_bh(list_lock);
1258 		hlist_for_each_entry_safe(tt_common, node, node_tmp, head,
1259 					  hash_entry) {
1260 			tt_global = container_of(tt_common,
1261 						 struct batadv_tt_global_entry,
1262 						 common);
1263 
1264 			if (!batadv_tt_global_to_purge(tt_global, &msg))
1265 				continue;
1266 
1267 			batadv_dbg(BATADV_DBG_TT, bat_priv,
1268 				   "Deleting global tt entry (%pM): %s\n",
1269 				   tt_global->common.addr, msg);
1270 
1271 			hlist_del_rcu(node);
1272 
1273 			batadv_tt_global_entry_free_ref(tt_global);
1274 		}
1275 		spin_unlock_bh(list_lock);
1276 	}
1277 }
1278 
1279 static void batadv_tt_global_table_free(struct batadv_priv *bat_priv)
1280 {
1281 	struct batadv_hashtable *hash;
1282 	spinlock_t *list_lock; /* protects write access to the hash lists */
1283 	struct batadv_tt_common_entry *tt_common_entry;
1284 	struct batadv_tt_global_entry *tt_global;
1285 	struct hlist_node *node, *node_tmp;
1286 	struct hlist_head *head;
1287 	uint32_t i;
1288 
1289 	if (!bat_priv->tt.global_hash)
1290 		return;
1291 
1292 	hash = bat_priv->tt.global_hash;
1293 
1294 	for (i = 0; i < hash->size; i++) {
1295 		head = &hash->table[i];
1296 		list_lock = &hash->list_locks[i];
1297 
1298 		spin_lock_bh(list_lock);
1299 		hlist_for_each_entry_safe(tt_common_entry, node, node_tmp,
1300 					  head, hash_entry) {
1301 			hlist_del_rcu(node);
1302 			tt_global = container_of(tt_common_entry,
1303 						 struct batadv_tt_global_entry,
1304 						 common);
1305 			batadv_tt_global_entry_free_ref(tt_global);
1306 		}
1307 		spin_unlock_bh(list_lock);
1308 	}
1309 
1310 	batadv_hash_destroy(hash);
1311 
1312 	bat_priv->tt.global_hash = NULL;
1313 }
1314 
1315 static bool
1316 _batadv_is_ap_isolated(struct batadv_tt_local_entry *tt_local_entry,
1317 		       struct batadv_tt_global_entry *tt_global_entry)
1318 {
1319 	bool ret = false;
1320 
1321 	if (tt_local_entry->common.flags & BATADV_TT_CLIENT_WIFI &&
1322 	    tt_global_entry->common.flags & BATADV_TT_CLIENT_WIFI)
1323 		ret = true;
1324 
1325 	return ret;
1326 }
1327 
1328 struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
1329 						  const uint8_t *src,
1330 						  const uint8_t *addr)
1331 {
1332 	struct batadv_tt_local_entry *tt_local_entry = NULL;
1333 	struct batadv_tt_global_entry *tt_global_entry = NULL;
1334 	struct batadv_orig_node *orig_node = NULL;
1335 	struct batadv_tt_orig_list_entry *best_entry;
1336 
1337 	if (src && atomic_read(&bat_priv->ap_isolation)) {
1338 		tt_local_entry = batadv_tt_local_hash_find(bat_priv, src);
1339 		if (!tt_local_entry ||
1340 		    (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING))
1341 			goto out;
1342 	}
1343 
1344 	tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr);
1345 	if (!tt_global_entry)
1346 		goto out;
1347 
1348 	/* check whether the clients should not communicate due to AP
1349 	 * isolation
1350 	 */
1351 	if (tt_local_entry &&
1352 	    _batadv_is_ap_isolated(tt_local_entry, tt_global_entry))
1353 		goto out;
1354 
1355 	rcu_read_lock();
1356 	best_entry = batadv_transtable_best_orig(tt_global_entry);
1357 	/* found anything? */
1358 	if (best_entry)
1359 		orig_node = best_entry->orig_node;
1360 	if (orig_node && !atomic_inc_not_zero(&orig_node->refcount))
1361 		orig_node = NULL;
1362 	rcu_read_unlock();
1363 
1364 out:
1365 	if (tt_global_entry)
1366 		batadv_tt_global_entry_free_ref(tt_global_entry);
1367 	if (tt_local_entry)
1368 		batadv_tt_local_entry_free_ref(tt_local_entry);
1369 
1370 	return orig_node;
1371 }
1372 
1373 /* Calculates the checksum of the local table of a given orig_node */
1374 static uint16_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
1375 				     struct batadv_orig_node *orig_node)
1376 {
1377 	uint16_t total = 0, total_one;
1378 	struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1379 	struct batadv_tt_common_entry *tt_common;
1380 	struct batadv_tt_global_entry *tt_global;
1381 	struct hlist_node *node;
1382 	struct hlist_head *head;
1383 	uint32_t i;
1384 	int j;
1385 
1386 	for (i = 0; i < hash->size; i++) {
1387 		head = &hash->table[i];
1388 
1389 		rcu_read_lock();
1390 		hlist_for_each_entry_rcu(tt_common, node, head, hash_entry) {
1391 			tt_global = container_of(tt_common,
1392 						 struct batadv_tt_global_entry,
1393 						 common);
1394 			/* Roaming clients are in the global table for
1395 			 * consistency only. They don't have to be
1396 			 * taken into account while computing the
1397 			 * global crc
1398 			 */
1399 			if (tt_common->flags & BATADV_TT_CLIENT_ROAM)
1400 				continue;
1401 			/* Temporary clients have not been announced yet, so
1402 			 * they have to be skipped while computing the global
1403 			 * crc
1404 			 */
1405 			if (tt_common->flags & BATADV_TT_CLIENT_TEMP)
1406 				continue;
1407 
1408 			/* find out if this global entry is announced by this
1409 			 * originator
1410 			 */
1411 			if (!batadv_tt_global_entry_has_orig(tt_global,
1412 							     orig_node))
1413 				continue;
1414 
1415 			total_one = 0;
1416 			for (j = 0; j < ETH_ALEN; j++)
1417 				total_one = crc16_byte(total_one,
1418 						       tt_common->addr[j]);
1419 			total ^= total_one;
1420 		}
1421 		rcu_read_unlock();
1422 	}
1423 
1424 	return total;
1425 }
1426 
1427 /* Calculates the checksum of the local table */
1428 static uint16_t batadv_tt_local_crc(struct batadv_priv *bat_priv)
1429 {
1430 	uint16_t total = 0, total_one;
1431 	struct batadv_hashtable *hash = bat_priv->tt.local_hash;
1432 	struct batadv_tt_common_entry *tt_common;
1433 	struct hlist_node *node;
1434 	struct hlist_head *head;
1435 	uint32_t i;
1436 	int j;
1437 
1438 	for (i = 0; i < hash->size; i++) {
1439 		head = &hash->table[i];
1440 
1441 		rcu_read_lock();
1442 		hlist_for_each_entry_rcu(tt_common, node, head, hash_entry) {
1443 			/* not yet committed clients have not to be taken into
1444 			 * account while computing the CRC
1445 			 */
1446 			if (tt_common->flags & BATADV_TT_CLIENT_NEW)
1447 				continue;
1448 			total_one = 0;
1449 			for (j = 0; j < ETH_ALEN; j++)
1450 				total_one = crc16_byte(total_one,
1451 						       tt_common->addr[j]);
1452 			total ^= total_one;
1453 		}
1454 		rcu_read_unlock();
1455 	}
1456 
1457 	return total;
1458 }
1459 
1460 static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
1461 {
1462 	struct batadv_tt_req_node *node, *safe;
1463 
1464 	spin_lock_bh(&bat_priv->tt.req_list_lock);
1465 
1466 	list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
1467 		list_del(&node->list);
1468 		kfree(node);
1469 	}
1470 
1471 	spin_unlock_bh(&bat_priv->tt.req_list_lock);
1472 }
1473 
1474 static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv,
1475 				       struct batadv_orig_node *orig_node,
1476 				       const unsigned char *tt_buff,
1477 				       uint8_t tt_num_changes)
1478 {
1479 	uint16_t tt_buff_len = batadv_tt_len(tt_num_changes);
1480 
1481 	/* Replace the old buffer only if I received something in the
1482 	 * last OGM (the OGM could carry no changes)
1483 	 */
1484 	spin_lock_bh(&orig_node->tt_buff_lock);
1485 	if (tt_buff_len > 0) {
1486 		kfree(orig_node->tt_buff);
1487 		orig_node->tt_buff_len = 0;
1488 		orig_node->tt_buff = kmalloc(tt_buff_len, GFP_ATOMIC);
1489 		if (orig_node->tt_buff) {
1490 			memcpy(orig_node->tt_buff, tt_buff, tt_buff_len);
1491 			orig_node->tt_buff_len = tt_buff_len;
1492 		}
1493 	}
1494 	spin_unlock_bh(&orig_node->tt_buff_lock);
1495 }
1496 
1497 static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
1498 {
1499 	struct batadv_tt_req_node *node, *safe;
1500 
1501 	spin_lock_bh(&bat_priv->tt.req_list_lock);
1502 	list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
1503 		if (batadv_has_timed_out(node->issued_at,
1504 					 BATADV_TT_REQUEST_TIMEOUT)) {
1505 			list_del(&node->list);
1506 			kfree(node);
1507 		}
1508 	}
1509 	spin_unlock_bh(&bat_priv->tt.req_list_lock);
1510 }
1511 
1512 /* returns the pointer to the new tt_req_node struct if no request
1513  * has already been issued for this orig_node, NULL otherwise
1514  */
1515 static struct batadv_tt_req_node *
1516 batadv_new_tt_req_node(struct batadv_priv *bat_priv,
1517 		       struct batadv_orig_node *orig_node)
1518 {
1519 	struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL;
1520 
1521 	spin_lock_bh(&bat_priv->tt.req_list_lock);
1522 	list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
1523 		if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
1524 		    !batadv_has_timed_out(tt_req_node_tmp->issued_at,
1525 					  BATADV_TT_REQUEST_TIMEOUT))
1526 			goto unlock;
1527 	}
1528 
1529 	tt_req_node = kmalloc(sizeof(*tt_req_node), GFP_ATOMIC);
1530 	if (!tt_req_node)
1531 		goto unlock;
1532 
1533 	memcpy(tt_req_node->addr, orig_node->orig, ETH_ALEN);
1534 	tt_req_node->issued_at = jiffies;
1535 
1536 	list_add(&tt_req_node->list, &bat_priv->tt.req_list);
1537 unlock:
1538 	spin_unlock_bh(&bat_priv->tt.req_list_lock);
1539 	return tt_req_node;
1540 }
1541 
1542 /* data_ptr is useless here, but has to be kept to respect the prototype */
1543 static int batadv_tt_local_valid_entry(const void *entry_ptr,
1544 				       const void *data_ptr)
1545 {
1546 	const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
1547 
1548 	if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW)
1549 		return 0;
1550 	return 1;
1551 }
1552 
1553 static int batadv_tt_global_valid(const void *entry_ptr,
1554 				  const void *data_ptr)
1555 {
1556 	const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
1557 	const struct batadv_tt_global_entry *tt_global_entry;
1558 	const struct batadv_orig_node *orig_node = data_ptr;
1559 
1560 	if (tt_common_entry->flags & BATADV_TT_CLIENT_ROAM ||
1561 	    tt_common_entry->flags & BATADV_TT_CLIENT_TEMP)
1562 		return 0;
1563 
1564 	tt_global_entry = container_of(tt_common_entry,
1565 				       struct batadv_tt_global_entry,
1566 				       common);
1567 
1568 	return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node);
1569 }
1570 
1571 static struct sk_buff *
1572 batadv_tt_response_fill_table(uint16_t tt_len, uint8_t ttvn,
1573 			      struct batadv_hashtable *hash,
1574 			      struct batadv_hard_iface *primary_if,
1575 			      int (*valid_cb)(const void *, const void *),
1576 			      void *cb_data)
1577 {
1578 	struct batadv_tt_common_entry *tt_common_entry;
1579 	struct batadv_tt_query_packet *tt_response;
1580 	struct batadv_tt_change *tt_change;
1581 	struct hlist_node *node;
1582 	struct hlist_head *head;
1583 	struct sk_buff *skb = NULL;
1584 	uint16_t tt_tot, tt_count;
1585 	ssize_t tt_query_size = sizeof(struct batadv_tt_query_packet);
1586 	uint32_t i;
1587 	size_t len;
1588 
1589 	if (tt_query_size + tt_len > primary_if->soft_iface->mtu) {
1590 		tt_len = primary_if->soft_iface->mtu - tt_query_size;
1591 		tt_len -= tt_len % sizeof(struct batadv_tt_change);
1592 	}
1593 	tt_tot = tt_len / sizeof(struct batadv_tt_change);
1594 
1595 	len = tt_query_size + tt_len;
1596 	skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
1597 	if (!skb)
1598 		goto out;
1599 
1600 	skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
1601 	tt_response = (struct batadv_tt_query_packet *)skb_put(skb, len);
1602 	tt_response->ttvn = ttvn;
1603 
1604 	tt_change = (struct batadv_tt_change *)(skb->data + tt_query_size);
1605 	tt_count = 0;
1606 
1607 	rcu_read_lock();
1608 	for (i = 0; i < hash->size; i++) {
1609 		head = &hash->table[i];
1610 
1611 		hlist_for_each_entry_rcu(tt_common_entry, node,
1612 					 head, hash_entry) {
1613 			if (tt_count == tt_tot)
1614 				break;
1615 
1616 			if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data)))
1617 				continue;
1618 
1619 			memcpy(tt_change->addr, tt_common_entry->addr,
1620 			       ETH_ALEN);
1621 			tt_change->flags = tt_common_entry->flags;
1622 
1623 			tt_count++;
1624 			tt_change++;
1625 		}
1626 	}
1627 	rcu_read_unlock();
1628 
1629 	/* store in the message the number of entries we have successfully
1630 	 * copied
1631 	 */
1632 	tt_response->tt_data = htons(tt_count);
1633 
1634 out:
1635 	return skb;
1636 }
1637 
1638 static int batadv_send_tt_request(struct batadv_priv *bat_priv,
1639 				  struct batadv_orig_node *dst_orig_node,
1640 				  uint8_t ttvn, uint16_t tt_crc,
1641 				  bool full_table)
1642 {
1643 	struct sk_buff *skb = NULL;
1644 	struct batadv_tt_query_packet *tt_request;
1645 	struct batadv_hard_iface *primary_if;
1646 	struct batadv_tt_req_node *tt_req_node = NULL;
1647 	int ret = 1;
1648 	size_t tt_req_len;
1649 
1650 	primary_if = batadv_primary_if_get_selected(bat_priv);
1651 	if (!primary_if)
1652 		goto out;
1653 
1654 	/* The new tt_req will be issued only if I'm not waiting for a
1655 	 * reply from the same orig_node yet
1656 	 */
1657 	tt_req_node = batadv_new_tt_req_node(bat_priv, dst_orig_node);
1658 	if (!tt_req_node)
1659 		goto out;
1660 
1661 	skb = dev_alloc_skb(sizeof(*tt_request) + ETH_HLEN + NET_IP_ALIGN);
1662 	if (!skb)
1663 		goto out;
1664 
1665 	skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
1666 
1667 	tt_req_len = sizeof(*tt_request);
1668 	tt_request = (struct batadv_tt_query_packet *)skb_put(skb, tt_req_len);
1669 
1670 	tt_request->header.packet_type = BATADV_TT_QUERY;
1671 	tt_request->header.version = BATADV_COMPAT_VERSION;
1672 	memcpy(tt_request->src, primary_if->net_dev->dev_addr, ETH_ALEN);
1673 	memcpy(tt_request->dst, dst_orig_node->orig, ETH_ALEN);
1674 	tt_request->header.ttl = BATADV_TTL;
1675 	tt_request->ttvn = ttvn;
1676 	tt_request->tt_data = htons(tt_crc);
1677 	tt_request->flags = BATADV_TT_REQUEST;
1678 
1679 	if (full_table)
1680 		tt_request->flags |= BATADV_TT_FULL_TABLE;
1681 
1682 	batadv_dbg(BATADV_DBG_TT, bat_priv, "Sending TT_REQUEST to %pM [%c]\n",
1683 		   dst_orig_node->orig, (full_table ? 'F' : '.'));
1684 
1685 	batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_TX);
1686 
1687 	if (batadv_send_skb_to_orig(skb, dst_orig_node, NULL))
1688 		ret = 0;
1689 
1690 out:
1691 	if (primary_if)
1692 		batadv_hardif_free_ref(primary_if);
1693 	if (ret)
1694 		kfree_skb(skb);
1695 	if (ret && tt_req_node) {
1696 		spin_lock_bh(&bat_priv->tt.req_list_lock);
1697 		list_del(&tt_req_node->list);
1698 		spin_unlock_bh(&bat_priv->tt.req_list_lock);
1699 		kfree(tt_req_node);
1700 	}
1701 	return ret;
1702 }
1703 
1704 static bool
1705 batadv_send_other_tt_response(struct batadv_priv *bat_priv,
1706 			      struct batadv_tt_query_packet *tt_request)
1707 {
1708 	struct batadv_orig_node *req_dst_orig_node;
1709 	struct batadv_orig_node *res_dst_orig_node = NULL;
1710 	struct batadv_hard_iface *primary_if = NULL;
1711 	uint8_t orig_ttvn, req_ttvn, ttvn;
1712 	int ret = false;
1713 	unsigned char *tt_buff;
1714 	bool full_table;
1715 	uint16_t tt_len, tt_tot;
1716 	struct sk_buff *skb = NULL;
1717 	struct batadv_tt_query_packet *tt_response;
1718 	uint8_t *packet_pos;
1719 	size_t len;
1720 
1721 	batadv_dbg(BATADV_DBG_TT, bat_priv,
1722 		   "Received TT_REQUEST from %pM for ttvn: %u (%pM) [%c]\n",
1723 		   tt_request->src, tt_request->ttvn, tt_request->dst,
1724 		   (tt_request->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
1725 
1726 	/* Let's get the orig node of the REAL destination */
1727 	req_dst_orig_node = batadv_orig_hash_find(bat_priv, tt_request->dst);
1728 	if (!req_dst_orig_node)
1729 		goto out;
1730 
1731 	res_dst_orig_node = batadv_orig_hash_find(bat_priv, tt_request->src);
1732 	if (!res_dst_orig_node)
1733 		goto out;
1734 
1735 	primary_if = batadv_primary_if_get_selected(bat_priv);
1736 	if (!primary_if)
1737 		goto out;
1738 
1739 	orig_ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn);
1740 	req_ttvn = tt_request->ttvn;
1741 
1742 	/* I don't have the requested data */
1743 	if (orig_ttvn != req_ttvn ||
1744 	    tt_request->tt_data != htons(req_dst_orig_node->tt_crc))
1745 		goto out;
1746 
1747 	/* If the full table has been explicitly requested */
1748 	if (tt_request->flags & BATADV_TT_FULL_TABLE ||
1749 	    !req_dst_orig_node->tt_buff)
1750 		full_table = true;
1751 	else
1752 		full_table = false;
1753 
1754 	/* In this version, fragmentation is not implemented, then
1755 	 * I'll send only one packet with as much TT entries as I can
1756 	 */
1757 	if (!full_table) {
1758 		spin_lock_bh(&req_dst_orig_node->tt_buff_lock);
1759 		tt_len = req_dst_orig_node->tt_buff_len;
1760 		tt_tot = tt_len / sizeof(struct batadv_tt_change);
1761 
1762 		len = sizeof(*tt_response) + tt_len;
1763 		skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
1764 		if (!skb)
1765 			goto unlock;
1766 
1767 		skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
1768 		packet_pos = skb_put(skb, len);
1769 		tt_response = (struct batadv_tt_query_packet *)packet_pos;
1770 		tt_response->ttvn = req_ttvn;
1771 		tt_response->tt_data = htons(tt_tot);
1772 
1773 		tt_buff = skb->data + sizeof(*tt_response);
1774 		/* Copy the last orig_node's OGM buffer */
1775 		memcpy(tt_buff, req_dst_orig_node->tt_buff,
1776 		       req_dst_orig_node->tt_buff_len);
1777 
1778 		spin_unlock_bh(&req_dst_orig_node->tt_buff_lock);
1779 	} else {
1780 		tt_len = (uint16_t)atomic_read(&req_dst_orig_node->tt_size);
1781 		tt_len *= sizeof(struct batadv_tt_change);
1782 		ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn);
1783 
1784 		skb = batadv_tt_response_fill_table(tt_len, ttvn,
1785 						    bat_priv->tt.global_hash,
1786 						    primary_if,
1787 						    batadv_tt_global_valid,
1788 						    req_dst_orig_node);
1789 		if (!skb)
1790 			goto out;
1791 
1792 		tt_response = (struct batadv_tt_query_packet *)skb->data;
1793 	}
1794 
1795 	tt_response->header.packet_type = BATADV_TT_QUERY;
1796 	tt_response->header.version = BATADV_COMPAT_VERSION;
1797 	tt_response->header.ttl = BATADV_TTL;
1798 	memcpy(tt_response->src, req_dst_orig_node->orig, ETH_ALEN);
1799 	memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
1800 	tt_response->flags = BATADV_TT_RESPONSE;
1801 
1802 	if (full_table)
1803 		tt_response->flags |= BATADV_TT_FULL_TABLE;
1804 
1805 	batadv_dbg(BATADV_DBG_TT, bat_priv,
1806 		   "Sending TT_RESPONSE %pM for %pM (ttvn: %u)\n",
1807 		   res_dst_orig_node->orig, req_dst_orig_node->orig, req_ttvn);
1808 
1809 	batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX);
1810 
1811 	if (batadv_send_skb_to_orig(skb, res_dst_orig_node, NULL))
1812 		ret = true;
1813 	goto out;
1814 
1815 unlock:
1816 	spin_unlock_bh(&req_dst_orig_node->tt_buff_lock);
1817 
1818 out:
1819 	if (res_dst_orig_node)
1820 		batadv_orig_node_free_ref(res_dst_orig_node);
1821 	if (req_dst_orig_node)
1822 		batadv_orig_node_free_ref(req_dst_orig_node);
1823 	if (primary_if)
1824 		batadv_hardif_free_ref(primary_if);
1825 	if (!ret)
1826 		kfree_skb(skb);
1827 	return ret;
1828 
1829 }
1830 
1831 static bool
1832 batadv_send_my_tt_response(struct batadv_priv *bat_priv,
1833 			   struct batadv_tt_query_packet *tt_request)
1834 {
1835 	struct batadv_orig_node *orig_node;
1836 	struct batadv_hard_iface *primary_if = NULL;
1837 	uint8_t my_ttvn, req_ttvn, ttvn;
1838 	int ret = false;
1839 	unsigned char *tt_buff;
1840 	bool full_table;
1841 	uint16_t tt_len, tt_tot;
1842 	struct sk_buff *skb = NULL;
1843 	struct batadv_tt_query_packet *tt_response;
1844 	uint8_t *packet_pos;
1845 	size_t len;
1846 
1847 	batadv_dbg(BATADV_DBG_TT, bat_priv,
1848 		   "Received TT_REQUEST from %pM for ttvn: %u (me) [%c]\n",
1849 		   tt_request->src, tt_request->ttvn,
1850 		   (tt_request->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
1851 
1852 
1853 	my_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
1854 	req_ttvn = tt_request->ttvn;
1855 
1856 	orig_node = batadv_orig_hash_find(bat_priv, tt_request->src);
1857 	if (!orig_node)
1858 		goto out;
1859 
1860 	primary_if = batadv_primary_if_get_selected(bat_priv);
1861 	if (!primary_if)
1862 		goto out;
1863 
1864 	/* If the full table has been explicitly requested or the gap
1865 	 * is too big send the whole local translation table
1866 	 */
1867 	if (tt_request->flags & BATADV_TT_FULL_TABLE || my_ttvn != req_ttvn ||
1868 	    !bat_priv->tt.last_changeset)
1869 		full_table = true;
1870 	else
1871 		full_table = false;
1872 
1873 	/* In this version, fragmentation is not implemented, then
1874 	 * I'll send only one packet with as much TT entries as I can
1875 	 */
1876 	if (!full_table) {
1877 		spin_lock_bh(&bat_priv->tt.last_changeset_lock);
1878 		tt_len = bat_priv->tt.last_changeset_len;
1879 		tt_tot = tt_len / sizeof(struct batadv_tt_change);
1880 
1881 		len = sizeof(*tt_response) + tt_len;
1882 		skb = dev_alloc_skb(len + ETH_HLEN + NET_IP_ALIGN);
1883 		if (!skb)
1884 			goto unlock;
1885 
1886 		skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
1887 		packet_pos = skb_put(skb, len);
1888 		tt_response = (struct batadv_tt_query_packet *)packet_pos;
1889 		tt_response->ttvn = req_ttvn;
1890 		tt_response->tt_data = htons(tt_tot);
1891 
1892 		tt_buff = skb->data + sizeof(*tt_response);
1893 		memcpy(tt_buff, bat_priv->tt.last_changeset,
1894 		       bat_priv->tt.last_changeset_len);
1895 		spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
1896 	} else {
1897 		tt_len = (uint16_t)atomic_read(&bat_priv->tt.local_entry_num);
1898 		tt_len *= sizeof(struct batadv_tt_change);
1899 		ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
1900 
1901 		skb = batadv_tt_response_fill_table(tt_len, ttvn,
1902 						    bat_priv->tt.local_hash,
1903 						    primary_if,
1904 						    batadv_tt_local_valid_entry,
1905 						    NULL);
1906 		if (!skb)
1907 			goto out;
1908 
1909 		tt_response = (struct batadv_tt_query_packet *)skb->data;
1910 	}
1911 
1912 	tt_response->header.packet_type = BATADV_TT_QUERY;
1913 	tt_response->header.version = BATADV_COMPAT_VERSION;
1914 	tt_response->header.ttl = BATADV_TTL;
1915 	memcpy(tt_response->src, primary_if->net_dev->dev_addr, ETH_ALEN);
1916 	memcpy(tt_response->dst, tt_request->src, ETH_ALEN);
1917 	tt_response->flags = BATADV_TT_RESPONSE;
1918 
1919 	if (full_table)
1920 		tt_response->flags |= BATADV_TT_FULL_TABLE;
1921 
1922 	batadv_dbg(BATADV_DBG_TT, bat_priv,
1923 		   "Sending TT_RESPONSE to %pM [%c]\n",
1924 		   orig_node->orig,
1925 		   (tt_response->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
1926 
1927 	batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX);
1928 
1929 	if (batadv_send_skb_to_orig(skb, orig_node, NULL))
1930 		ret = true;
1931 	goto out;
1932 
1933 unlock:
1934 	spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
1935 out:
1936 	if (orig_node)
1937 		batadv_orig_node_free_ref(orig_node);
1938 	if (primary_if)
1939 		batadv_hardif_free_ref(primary_if);
1940 	if (!ret)
1941 		kfree_skb(skb);
1942 	/* This packet was for me, so it doesn't need to be re-routed */
1943 	return true;
1944 }
1945 
1946 bool batadv_send_tt_response(struct batadv_priv *bat_priv,
1947 			     struct batadv_tt_query_packet *tt_request)
1948 {
1949 	if (batadv_is_my_mac(tt_request->dst)) {
1950 		/* don't answer backbone gws! */
1951 		if (batadv_bla_is_backbone_gw_orig(bat_priv, tt_request->src))
1952 			return true;
1953 
1954 		return batadv_send_my_tt_response(bat_priv, tt_request);
1955 	} else {
1956 		return batadv_send_other_tt_response(bat_priv, tt_request);
1957 	}
1958 }
1959 
1960 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
1961 				      struct batadv_orig_node *orig_node,
1962 				      struct batadv_tt_change *tt_change,
1963 				      uint16_t tt_num_changes, uint8_t ttvn)
1964 {
1965 	int i;
1966 	int roams;
1967 
1968 	for (i = 0; i < tt_num_changes; i++) {
1969 		if ((tt_change + i)->flags & BATADV_TT_CLIENT_DEL) {
1970 			roams = (tt_change + i)->flags & BATADV_TT_CLIENT_ROAM;
1971 			batadv_tt_global_del(bat_priv, orig_node,
1972 					     (tt_change + i)->addr,
1973 					     "tt removed by changes",
1974 					     roams);
1975 		} else {
1976 			if (!batadv_tt_global_add(bat_priv, orig_node,
1977 						  (tt_change + i)->addr,
1978 						  (tt_change + i)->flags, ttvn))
1979 				/* In case of problem while storing a
1980 				 * global_entry, we stop the updating
1981 				 * procedure without committing the
1982 				 * ttvn change. This will avoid to send
1983 				 * corrupted data on tt_request
1984 				 */
1985 				return;
1986 		}
1987 	}
1988 	orig_node->tt_initialised = true;
1989 }
1990 
1991 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
1992 				  struct batadv_tt_query_packet *tt_response)
1993 {
1994 	struct batadv_orig_node *orig_node;
1995 
1996 	orig_node = batadv_orig_hash_find(bat_priv, tt_response->src);
1997 	if (!orig_node)
1998 		goto out;
1999 
2000 	/* Purge the old table first.. */
2001 	batadv_tt_global_del_orig(bat_priv, orig_node, "Received full table");
2002 
2003 	_batadv_tt_update_changes(bat_priv, orig_node,
2004 				  (struct batadv_tt_change *)(tt_response + 1),
2005 				  ntohs(tt_response->tt_data),
2006 				  tt_response->ttvn);
2007 
2008 	spin_lock_bh(&orig_node->tt_buff_lock);
2009 	kfree(orig_node->tt_buff);
2010 	orig_node->tt_buff_len = 0;
2011 	orig_node->tt_buff = NULL;
2012 	spin_unlock_bh(&orig_node->tt_buff_lock);
2013 
2014 	atomic_set(&orig_node->last_ttvn, tt_response->ttvn);
2015 
2016 out:
2017 	if (orig_node)
2018 		batadv_orig_node_free_ref(orig_node);
2019 }
2020 
2021 static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
2022 				     struct batadv_orig_node *orig_node,
2023 				     uint16_t tt_num_changes, uint8_t ttvn,
2024 				     struct batadv_tt_change *tt_change)
2025 {
2026 	_batadv_tt_update_changes(bat_priv, orig_node, tt_change,
2027 				  tt_num_changes, ttvn);
2028 
2029 	batadv_tt_save_orig_buffer(bat_priv, orig_node,
2030 				   (unsigned char *)tt_change, tt_num_changes);
2031 	atomic_set(&orig_node->last_ttvn, ttvn);
2032 }
2033 
2034 bool batadv_is_my_client(struct batadv_priv *bat_priv, const uint8_t *addr)
2035 {
2036 	struct batadv_tt_local_entry *tt_local_entry;
2037 	bool ret = false;
2038 
2039 	tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
2040 	if (!tt_local_entry)
2041 		goto out;
2042 	/* Check if the client has been logically deleted (but is kept for
2043 	 * consistency purpose)
2044 	 */
2045 	if ((tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) ||
2046 	    (tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM))
2047 		goto out;
2048 	ret = true;
2049 out:
2050 	if (tt_local_entry)
2051 		batadv_tt_local_entry_free_ref(tt_local_entry);
2052 	return ret;
2053 }
2054 
2055 void batadv_handle_tt_response(struct batadv_priv *bat_priv,
2056 			       struct batadv_tt_query_packet *tt_response)
2057 {
2058 	struct batadv_tt_req_node *node, *safe;
2059 	struct batadv_orig_node *orig_node = NULL;
2060 	struct batadv_tt_change *tt_change;
2061 
2062 	batadv_dbg(BATADV_DBG_TT, bat_priv,
2063 		   "Received TT_RESPONSE from %pM for ttvn %d t_size: %d [%c]\n",
2064 		   tt_response->src, tt_response->ttvn,
2065 		   ntohs(tt_response->tt_data),
2066 		   (tt_response->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
2067 
2068 	/* we should have never asked a backbone gw */
2069 	if (batadv_bla_is_backbone_gw_orig(bat_priv, tt_response->src))
2070 		goto out;
2071 
2072 	orig_node = batadv_orig_hash_find(bat_priv, tt_response->src);
2073 	if (!orig_node)
2074 		goto out;
2075 
2076 	if (tt_response->flags & BATADV_TT_FULL_TABLE) {
2077 		batadv_tt_fill_gtable(bat_priv, tt_response);
2078 	} else {
2079 		tt_change = (struct batadv_tt_change *)(tt_response + 1);
2080 		batadv_tt_update_changes(bat_priv, orig_node,
2081 					 ntohs(tt_response->tt_data),
2082 					 tt_response->ttvn, tt_change);
2083 	}
2084 
2085 	/* Delete the tt_req_node from pending tt_requests list */
2086 	spin_lock_bh(&bat_priv->tt.req_list_lock);
2087 	list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
2088 		if (!batadv_compare_eth(node->addr, tt_response->src))
2089 			continue;
2090 		list_del(&node->list);
2091 		kfree(node);
2092 	}
2093 	spin_unlock_bh(&bat_priv->tt.req_list_lock);
2094 
2095 	/* Recalculate the CRC for this orig_node and store it */
2096 	orig_node->tt_crc = batadv_tt_global_crc(bat_priv, orig_node);
2097 out:
2098 	if (orig_node)
2099 		batadv_orig_node_free_ref(orig_node);
2100 }
2101 
2102 int batadv_tt_init(struct batadv_priv *bat_priv)
2103 {
2104 	int ret;
2105 
2106 	ret = batadv_tt_local_init(bat_priv);
2107 	if (ret < 0)
2108 		return ret;
2109 
2110 	ret = batadv_tt_global_init(bat_priv);
2111 	if (ret < 0)
2112 		return ret;
2113 
2114 	batadv_tt_start_timer(bat_priv);
2115 
2116 	return 1;
2117 }
2118 
2119 static void batadv_tt_roam_list_free(struct batadv_priv *bat_priv)
2120 {
2121 	struct batadv_tt_roam_node *node, *safe;
2122 
2123 	spin_lock_bh(&bat_priv->tt.roam_list_lock);
2124 
2125 	list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) {
2126 		list_del(&node->list);
2127 		kfree(node);
2128 	}
2129 
2130 	spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2131 }
2132 
2133 static void batadv_tt_roam_purge(struct batadv_priv *bat_priv)
2134 {
2135 	struct batadv_tt_roam_node *node, *safe;
2136 
2137 	spin_lock_bh(&bat_priv->tt.roam_list_lock);
2138 	list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) {
2139 		if (!batadv_has_timed_out(node->first_time,
2140 					  BATADV_ROAMING_MAX_TIME))
2141 			continue;
2142 
2143 		list_del(&node->list);
2144 		kfree(node);
2145 	}
2146 	spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2147 }
2148 
2149 /* This function checks whether the client already reached the
2150  * maximum number of possible roaming phases. In this case the ROAMING_ADV
2151  * will not be sent.
2152  *
2153  * returns true if the ROAMING_ADV can be sent, false otherwise
2154  */
2155 static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv,
2156 				       uint8_t *client)
2157 {
2158 	struct batadv_tt_roam_node *tt_roam_node;
2159 	bool ret = false;
2160 
2161 	spin_lock_bh(&bat_priv->tt.roam_list_lock);
2162 	/* The new tt_req will be issued only if I'm not waiting for a
2163 	 * reply from the same orig_node yet
2164 	 */
2165 	list_for_each_entry(tt_roam_node, &bat_priv->tt.roam_list, list) {
2166 		if (!batadv_compare_eth(tt_roam_node->addr, client))
2167 			continue;
2168 
2169 		if (batadv_has_timed_out(tt_roam_node->first_time,
2170 					 BATADV_ROAMING_MAX_TIME))
2171 			continue;
2172 
2173 		if (!batadv_atomic_dec_not_zero(&tt_roam_node->counter))
2174 			/* Sorry, you roamed too many times! */
2175 			goto unlock;
2176 		ret = true;
2177 		break;
2178 	}
2179 
2180 	if (!ret) {
2181 		tt_roam_node = kmalloc(sizeof(*tt_roam_node), GFP_ATOMIC);
2182 		if (!tt_roam_node)
2183 			goto unlock;
2184 
2185 		tt_roam_node->first_time = jiffies;
2186 		atomic_set(&tt_roam_node->counter,
2187 			   BATADV_ROAMING_MAX_COUNT - 1);
2188 		memcpy(tt_roam_node->addr, client, ETH_ALEN);
2189 
2190 		list_add(&tt_roam_node->list, &bat_priv->tt.roam_list);
2191 		ret = true;
2192 	}
2193 
2194 unlock:
2195 	spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2196 	return ret;
2197 }
2198 
2199 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
2200 				 struct batadv_orig_node *orig_node)
2201 {
2202 	struct sk_buff *skb = NULL;
2203 	struct batadv_roam_adv_packet *roam_adv_packet;
2204 	int ret = 1;
2205 	struct batadv_hard_iface *primary_if;
2206 	size_t len = sizeof(*roam_adv_packet);
2207 
2208 	/* before going on we have to check whether the client has
2209 	 * already roamed to us too many times
2210 	 */
2211 	if (!batadv_tt_check_roam_count(bat_priv, client))
2212 		goto out;
2213 
2214 	skb = dev_alloc_skb(sizeof(*roam_adv_packet) + ETH_HLEN + NET_IP_ALIGN);
2215 	if (!skb)
2216 		goto out;
2217 
2218 	skb_reserve(skb, ETH_HLEN + NET_IP_ALIGN);
2219 
2220 	roam_adv_packet = (struct batadv_roam_adv_packet *)skb_put(skb, len);
2221 
2222 	roam_adv_packet->header.packet_type = BATADV_ROAM_ADV;
2223 	roam_adv_packet->header.version = BATADV_COMPAT_VERSION;
2224 	roam_adv_packet->header.ttl = BATADV_TTL;
2225 	roam_adv_packet->reserved = 0;
2226 	primary_if = batadv_primary_if_get_selected(bat_priv);
2227 	if (!primary_if)
2228 		goto out;
2229 	memcpy(roam_adv_packet->src, primary_if->net_dev->dev_addr, ETH_ALEN);
2230 	batadv_hardif_free_ref(primary_if);
2231 	memcpy(roam_adv_packet->dst, orig_node->orig, ETH_ALEN);
2232 	memcpy(roam_adv_packet->client, client, ETH_ALEN);
2233 
2234 	batadv_dbg(BATADV_DBG_TT, bat_priv,
2235 		   "Sending ROAMING_ADV to %pM (client %pM)\n",
2236 		   orig_node->orig, client);
2237 
2238 	batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_TX);
2239 
2240 	if (batadv_send_skb_to_orig(skb, orig_node, NULL))
2241 		ret = 0;
2242 
2243 out:
2244 	if (ret && skb)
2245 		kfree_skb(skb);
2246 	return;
2247 }
2248 
2249 static void batadv_tt_purge(struct work_struct *work)
2250 {
2251 	struct delayed_work *delayed_work;
2252 	struct batadv_priv_tt *priv_tt;
2253 	struct batadv_priv *bat_priv;
2254 
2255 	delayed_work = container_of(work, struct delayed_work, work);
2256 	priv_tt = container_of(delayed_work, struct batadv_priv_tt, work);
2257 	bat_priv = container_of(priv_tt, struct batadv_priv, tt);
2258 
2259 	batadv_tt_local_purge(bat_priv);
2260 	batadv_tt_global_purge(bat_priv);
2261 	batadv_tt_req_purge(bat_priv);
2262 	batadv_tt_roam_purge(bat_priv);
2263 
2264 	batadv_tt_start_timer(bat_priv);
2265 }
2266 
2267 void batadv_tt_free(struct batadv_priv *bat_priv)
2268 {
2269 	cancel_delayed_work_sync(&bat_priv->tt.work);
2270 
2271 	batadv_tt_local_table_free(bat_priv);
2272 	batadv_tt_global_table_free(bat_priv);
2273 	batadv_tt_req_list_free(bat_priv);
2274 	batadv_tt_changes_list_free(bat_priv);
2275 	batadv_tt_roam_list_free(bat_priv);
2276 
2277 	kfree(bat_priv->tt.last_changeset);
2278 }
2279 
2280 /* This function will enable or disable the specified flags for all the entries
2281  * in the given hash table and returns the number of modified entries
2282  */
2283 static uint16_t batadv_tt_set_flags(struct batadv_hashtable *hash,
2284 				    uint16_t flags, bool enable)
2285 {
2286 	uint32_t i;
2287 	uint16_t changed_num = 0;
2288 	struct hlist_head *head;
2289 	struct hlist_node *node;
2290 	struct batadv_tt_common_entry *tt_common_entry;
2291 
2292 	if (!hash)
2293 		goto out;
2294 
2295 	for (i = 0; i < hash->size; i++) {
2296 		head = &hash->table[i];
2297 
2298 		rcu_read_lock();
2299 		hlist_for_each_entry_rcu(tt_common_entry, node,
2300 					 head, hash_entry) {
2301 			if (enable) {
2302 				if ((tt_common_entry->flags & flags) == flags)
2303 					continue;
2304 				tt_common_entry->flags |= flags;
2305 			} else {
2306 				if (!(tt_common_entry->flags & flags))
2307 					continue;
2308 				tt_common_entry->flags &= ~flags;
2309 			}
2310 			changed_num++;
2311 		}
2312 		rcu_read_unlock();
2313 	}
2314 out:
2315 	return changed_num;
2316 }
2317 
2318 /* Purge out all the tt local entries marked with BATADV_TT_CLIENT_PENDING */
2319 static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
2320 {
2321 	struct batadv_hashtable *hash = bat_priv->tt.local_hash;
2322 	struct batadv_tt_common_entry *tt_common;
2323 	struct batadv_tt_local_entry *tt_local;
2324 	struct hlist_node *node, *node_tmp;
2325 	struct hlist_head *head;
2326 	spinlock_t *list_lock; /* protects write access to the hash lists */
2327 	uint32_t i;
2328 
2329 	if (!hash)
2330 		return;
2331 
2332 	for (i = 0; i < hash->size; i++) {
2333 		head = &hash->table[i];
2334 		list_lock = &hash->list_locks[i];
2335 
2336 		spin_lock_bh(list_lock);
2337 		hlist_for_each_entry_safe(tt_common, node, node_tmp, head,
2338 					  hash_entry) {
2339 			if (!(tt_common->flags & BATADV_TT_CLIENT_PENDING))
2340 				continue;
2341 
2342 			batadv_dbg(BATADV_DBG_TT, bat_priv,
2343 				   "Deleting local tt entry (%pM): pending\n",
2344 				   tt_common->addr);
2345 
2346 			atomic_dec(&bat_priv->tt.local_entry_num);
2347 			hlist_del_rcu(node);
2348 			tt_local = container_of(tt_common,
2349 						struct batadv_tt_local_entry,
2350 						common);
2351 			batadv_tt_local_entry_free_ref(tt_local);
2352 		}
2353 		spin_unlock_bh(list_lock);
2354 	}
2355 
2356 }
2357 
2358 static int batadv_tt_commit_changes(struct batadv_priv *bat_priv,
2359 				    unsigned char **packet_buff,
2360 				    int *packet_buff_len, int packet_min_len)
2361 {
2362 	uint16_t changed_num = 0;
2363 
2364 	if (atomic_read(&bat_priv->tt.local_changes) < 1)
2365 		return -ENOENT;
2366 
2367 	changed_num = batadv_tt_set_flags(bat_priv->tt.local_hash,
2368 					  BATADV_TT_CLIENT_NEW, false);
2369 
2370 	/* all reset entries have to be counted as local entries */
2371 	atomic_add(changed_num, &bat_priv->tt.local_entry_num);
2372 	batadv_tt_local_purge_pending_clients(bat_priv);
2373 	bat_priv->tt.local_crc = batadv_tt_local_crc(bat_priv);
2374 
2375 	/* Increment the TTVN only once per OGM interval */
2376 	atomic_inc(&bat_priv->tt.vn);
2377 	batadv_dbg(BATADV_DBG_TT, bat_priv,
2378 		   "Local changes committed, updating to ttvn %u\n",
2379 		   (uint8_t)atomic_read(&bat_priv->tt.vn));
2380 
2381 	/* reset the sending counter */
2382 	atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX);
2383 
2384 	return batadv_tt_changes_fill_buff(bat_priv, packet_buff,
2385 					   packet_buff_len, packet_min_len);
2386 }
2387 
2388 /* when calling this function (hard_iface == primary_if) has to be true */
2389 int batadv_tt_append_diff(struct batadv_priv *bat_priv,
2390 			  unsigned char **packet_buff, int *packet_buff_len,
2391 			  int packet_min_len)
2392 {
2393 	int tt_num_changes;
2394 
2395 	/* if at least one change happened */
2396 	tt_num_changes = batadv_tt_commit_changes(bat_priv, packet_buff,
2397 						  packet_buff_len,
2398 						  packet_min_len);
2399 
2400 	/* if the changes have been sent often enough */
2401 	if ((tt_num_changes < 0) &&
2402 	    (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt))) {
2403 		batadv_tt_realloc_packet_buff(packet_buff, packet_buff_len,
2404 					      packet_min_len, packet_min_len);
2405 		tt_num_changes = 0;
2406 	}
2407 
2408 	return tt_num_changes;
2409 }
2410 
2411 bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, uint8_t *src,
2412 			   uint8_t *dst)
2413 {
2414 	struct batadv_tt_local_entry *tt_local_entry = NULL;
2415 	struct batadv_tt_global_entry *tt_global_entry = NULL;
2416 	bool ret = false;
2417 
2418 	if (!atomic_read(&bat_priv->ap_isolation))
2419 		goto out;
2420 
2421 	tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst);
2422 	if (!tt_local_entry)
2423 		goto out;
2424 
2425 	tt_global_entry = batadv_tt_global_hash_find(bat_priv, src);
2426 	if (!tt_global_entry)
2427 		goto out;
2428 
2429 	if (!_batadv_is_ap_isolated(tt_local_entry, tt_global_entry))
2430 		goto out;
2431 
2432 	ret = true;
2433 
2434 out:
2435 	if (tt_global_entry)
2436 		batadv_tt_global_entry_free_ref(tt_global_entry);
2437 	if (tt_local_entry)
2438 		batadv_tt_local_entry_free_ref(tt_local_entry);
2439 	return ret;
2440 }
2441 
2442 void batadv_tt_update_orig(struct batadv_priv *bat_priv,
2443 			   struct batadv_orig_node *orig_node,
2444 			   const unsigned char *tt_buff, uint8_t tt_num_changes,
2445 			   uint8_t ttvn, uint16_t tt_crc)
2446 {
2447 	uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
2448 	bool full_table = true;
2449 	struct batadv_tt_change *tt_change;
2450 
2451 	/* don't care about a backbone gateways updates. */
2452 	if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
2453 		return;
2454 
2455 	/* orig table not initialised AND first diff is in the OGM OR the ttvn
2456 	 * increased by one -> we can apply the attached changes
2457 	 */
2458 	if ((!orig_node->tt_initialised && ttvn == 1) ||
2459 	    ttvn - orig_ttvn == 1) {
2460 		/* the OGM could not contain the changes due to their size or
2461 		 * because they have already been sent BATADV_TT_OGM_APPEND_MAX
2462 		 * times.
2463 		 * In this case send a tt request
2464 		 */
2465 		if (!tt_num_changes) {
2466 			full_table = false;
2467 			goto request_table;
2468 		}
2469 
2470 		tt_change = (struct batadv_tt_change *)tt_buff;
2471 		batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes,
2472 					 ttvn, tt_change);
2473 
2474 		/* Even if we received the precomputed crc with the OGM, we
2475 		 * prefer to recompute it to spot any possible inconsistency
2476 		 * in the global table
2477 		 */
2478 		orig_node->tt_crc = batadv_tt_global_crc(bat_priv, orig_node);
2479 
2480 		/* The ttvn alone is not enough to guarantee consistency
2481 		 * because a single value could represent different states
2482 		 * (due to the wrap around). Thus a node has to check whether
2483 		 * the resulting table (after applying the changes) is still
2484 		 * consistent or not. E.g. a node could disconnect while its
2485 		 * ttvn is X and reconnect on ttvn = X + TTVN_MAX: in this case
2486 		 * checking the CRC value is mandatory to detect the
2487 		 * inconsistency
2488 		 */
2489 		if (orig_node->tt_crc != tt_crc)
2490 			goto request_table;
2491 	} else {
2492 		/* if we missed more than one change or our tables are not
2493 		 * in sync anymore -> request fresh tt data
2494 		 */
2495 		if (!orig_node->tt_initialised || ttvn != orig_ttvn ||
2496 		    orig_node->tt_crc != tt_crc) {
2497 request_table:
2498 			batadv_dbg(BATADV_DBG_TT, bat_priv,
2499 				   "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u crc: %u last_crc: %u num_changes: %u)\n",
2500 				   orig_node->orig, ttvn, orig_ttvn, tt_crc,
2501 				   orig_node->tt_crc, tt_num_changes);
2502 			batadv_send_tt_request(bat_priv, orig_node, ttvn,
2503 					       tt_crc, full_table);
2504 			return;
2505 		}
2506 	}
2507 }
2508 
2509 /* returns true whether we know that the client has moved from its old
2510  * originator to another one. This entry is kept is still kept for consistency
2511  * purposes
2512  */
2513 bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv,
2514 					uint8_t *addr)
2515 {
2516 	struct batadv_tt_global_entry *tt_global_entry;
2517 	bool ret = false;
2518 
2519 	tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr);
2520 	if (!tt_global_entry)
2521 		goto out;
2522 
2523 	ret = !!(tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM);
2524 	batadv_tt_global_entry_free_ref(tt_global_entry);
2525 out:
2526 	return ret;
2527 }
2528 
2529 /**
2530  * batadv_tt_local_client_is_roaming - tells whether the client is roaming
2531  * @bat_priv: the bat priv with all the soft interface information
2532  * @addr: the MAC address of the local client to query
2533  *
2534  * Returns true if the local client is known to be roaming (it is not served by
2535  * this node anymore) or not. If yes, the client is still present in the table
2536  * to keep the latter consistent with the node TTVN
2537  */
2538 bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
2539 				       uint8_t *addr)
2540 {
2541 	struct batadv_tt_local_entry *tt_local_entry;
2542 	bool ret = false;
2543 
2544 	tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr);
2545 	if (!tt_local_entry)
2546 		goto out;
2547 
2548 	ret = tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM;
2549 	batadv_tt_local_entry_free_ref(tt_local_entry);
2550 out:
2551 	return ret;
2552 
2553 }
2554 
2555 bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
2556 					  struct batadv_orig_node *orig_node,
2557 					  const unsigned char *addr)
2558 {
2559 	bool ret = false;
2560 
2561 	/* if the originator is a backbone node (meaning it belongs to the same
2562 	 * LAN of this node) the temporary client must not be added because to
2563 	 * reach such destination the node must use the LAN instead of the mesh
2564 	 */
2565 	if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig))
2566 		goto out;
2567 
2568 	if (!batadv_tt_global_add(bat_priv, orig_node, addr,
2569 				  BATADV_TT_CLIENT_TEMP,
2570 				  atomic_read(&orig_node->last_ttvn)))
2571 		goto out;
2572 
2573 	batadv_dbg(BATADV_DBG_TT, bat_priv,
2574 		   "Added temporary global client (addr: %pM orig: %pM)\n",
2575 		   addr, orig_node->orig);
2576 	ret = true;
2577 out:
2578 	return ret;
2579 }
2580