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