batman-adv: introduce capability initialization bitfield
[cascardo/linux.git] / net / batman-adv / translation-table.c
1 /* Copyright (C) 2007-2014 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, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "main.h"
19 #include "translation-table.h"
20 #include "soft-interface.h"
21 #include "hard-interface.h"
22 #include "send.h"
23 #include "hash.h"
24 #include "originator.h"
25 #include "routing.h"
26 #include "bridge_loop_avoidance.h"
27 #include "multicast.h"
28
29 #include <linux/crc32c.h>
30
31 /* hash class keys */
32 static struct lock_class_key batadv_tt_local_hash_lock_class_key;
33 static struct lock_class_key batadv_tt_global_hash_lock_class_key;
34
35 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
36                                  unsigned short vid,
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                                  unsigned short vid, const char *message,
45                                  bool roaming);
46
47 /* returns 1 if they are the same mac addr */
48 static int batadv_compare_tt(const struct hlist_node *node, const void *data2)
49 {
50         const void *data1 = container_of(node, struct batadv_tt_common_entry,
51                                          hash_entry);
52
53         return batadv_compare_eth(data1, data2);
54 }
55
56 /**
57  * batadv_choose_tt - return the index of the tt entry in the hash table
58  * @data: pointer to the tt_common_entry object to map
59  * @size: the size of the hash table
60  *
61  * Returns the hash index where the object represented by 'data' should be
62  * stored at.
63  */
64 static inline uint32_t batadv_choose_tt(const void *data, uint32_t size)
65 {
66         struct batadv_tt_common_entry *tt;
67         uint32_t hash = 0;
68
69         tt = (struct batadv_tt_common_entry *)data;
70         hash = batadv_hash_bytes(hash, &tt->addr, ETH_ALEN);
71         hash = batadv_hash_bytes(hash, &tt->vid, sizeof(tt->vid));
72
73         hash += (hash << 3);
74         hash ^= (hash >> 11);
75         hash += (hash << 15);
76
77         return hash % size;
78 }
79
80 /**
81  * batadv_tt_hash_find - look for a client in the given hash table
82  * @hash: the hash table to search
83  * @addr: the mac address of the client to look for
84  * @vid: VLAN identifier
85  *
86  * Returns a pointer to the tt_common struct belonging to the searched client if
87  * found, NULL otherwise.
88  */
89 static struct batadv_tt_common_entry *
90 batadv_tt_hash_find(struct batadv_hashtable *hash, const uint8_t *addr,
91                     unsigned short vid)
92 {
93         struct hlist_head *head;
94         struct batadv_tt_common_entry to_search, *tt, *tt_tmp = NULL;
95         uint32_t index;
96
97         if (!hash)
98                 return NULL;
99
100         ether_addr_copy(to_search.addr, addr);
101         to_search.vid = vid;
102
103         index = batadv_choose_tt(&to_search, hash->size);
104         head = &hash->table[index];
105
106         rcu_read_lock();
107         hlist_for_each_entry_rcu(tt, head, hash_entry) {
108                 if (!batadv_compare_eth(tt, addr))
109                         continue;
110
111                 if (tt->vid != vid)
112                         continue;
113
114                 if (!atomic_inc_not_zero(&tt->refcount))
115                         continue;
116
117                 tt_tmp = tt;
118                 break;
119         }
120         rcu_read_unlock();
121
122         return tt_tmp;
123 }
124
125 /**
126  * batadv_tt_local_hash_find - search the local table for a given client
127  * @bat_priv: the bat priv with all the soft interface information
128  * @addr: the mac address of the client to look for
129  * @vid: VLAN identifier
130  *
131  * Returns a pointer to the corresponding tt_local_entry struct if the client is
132  * found, NULL otherwise.
133  */
134 static struct batadv_tt_local_entry *
135 batadv_tt_local_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr,
136                           unsigned short vid)
137 {
138         struct batadv_tt_common_entry *tt_common_entry;
139         struct batadv_tt_local_entry *tt_local_entry = NULL;
140
141         tt_common_entry = batadv_tt_hash_find(bat_priv->tt.local_hash, addr,
142                                               vid);
143         if (tt_common_entry)
144                 tt_local_entry = container_of(tt_common_entry,
145                                               struct batadv_tt_local_entry,
146                                               common);
147         return tt_local_entry;
148 }
149
150 /**
151  * batadv_tt_global_hash_find - search the global table for a given client
152  * @bat_priv: the bat priv with all the soft interface information
153  * @addr: the mac address of the client to look for
154  * @vid: VLAN identifier
155  *
156  * Returns a pointer to the corresponding tt_global_entry struct if the client
157  * is found, NULL otherwise.
158  */
159 static struct batadv_tt_global_entry *
160 batadv_tt_global_hash_find(struct batadv_priv *bat_priv, const uint8_t *addr,
161                            unsigned short vid)
162 {
163         struct batadv_tt_common_entry *tt_common_entry;
164         struct batadv_tt_global_entry *tt_global_entry = NULL;
165
166         tt_common_entry = batadv_tt_hash_find(bat_priv->tt.global_hash, addr,
167                                               vid);
168         if (tt_common_entry)
169                 tt_global_entry = container_of(tt_common_entry,
170                                                struct batadv_tt_global_entry,
171                                                common);
172         return tt_global_entry;
173 }
174
175 static void
176 batadv_tt_local_entry_free_ref(struct batadv_tt_local_entry *tt_local_entry)
177 {
178         if (atomic_dec_and_test(&tt_local_entry->common.refcount))
179                 kfree_rcu(tt_local_entry, common.rcu);
180 }
181
182 /**
183  * batadv_tt_global_entry_free_ref - decrement the refcounter for a
184  *  tt_global_entry and possibly free it
185  * @tt_global_entry: the object to free
186  */
187 static void
188 batadv_tt_global_entry_free_ref(struct batadv_tt_global_entry *tt_global_entry)
189 {
190         if (atomic_dec_and_test(&tt_global_entry->common.refcount)) {
191                 batadv_tt_global_del_orig_list(tt_global_entry);
192                 kfree_rcu(tt_global_entry, common.rcu);
193         }
194 }
195
196 static void batadv_tt_orig_list_entry_free_rcu(struct rcu_head *rcu)
197 {
198         struct batadv_tt_orig_list_entry *orig_entry;
199
200         orig_entry = container_of(rcu, struct batadv_tt_orig_list_entry, rcu);
201
202         /* We are in an rcu callback here, therefore we cannot use
203          * batadv_orig_node_free_ref() and its call_rcu():
204          * An rcu_barrier() wouldn't wait for that to finish
205          */
206         batadv_orig_node_free_ref_now(orig_entry->orig_node);
207         kfree(orig_entry);
208 }
209
210 /**
211  * batadv_tt_local_size_mod - change the size by v of the local table identified
212  *  by vid
213  * @bat_priv: the bat priv with all the soft interface information
214  * @vid: the VLAN identifier of the sub-table to change
215  * @v: the amount to sum to the local table size
216  */
217 static void batadv_tt_local_size_mod(struct batadv_priv *bat_priv,
218                                      unsigned short vid, int v)
219 {
220         struct batadv_softif_vlan *vlan;
221
222         vlan = batadv_softif_vlan_get(bat_priv, vid);
223         if (!vlan)
224                 return;
225
226         atomic_add(v, &vlan->tt.num_entries);
227
228         batadv_softif_vlan_free_ref(vlan);
229 }
230
231 /**
232  * batadv_tt_local_size_inc - increase by one the local table size for the given
233  *  vid
234  * @bat_priv: the bat priv with all the soft interface information
235  * @vid: the VLAN identifier
236  */
237 static void batadv_tt_local_size_inc(struct batadv_priv *bat_priv,
238                                      unsigned short vid)
239 {
240         batadv_tt_local_size_mod(bat_priv, vid, 1);
241 }
242
243 /**
244  * batadv_tt_local_size_dec - decrease by one the local table size for the given
245  *  vid
246  * @bat_priv: the bat priv with all the soft interface information
247  * @vid: the VLAN identifier
248  */
249 static void batadv_tt_local_size_dec(struct batadv_priv *bat_priv,
250                                      unsigned short vid)
251 {
252         batadv_tt_local_size_mod(bat_priv, vid, -1);
253 }
254
255 /**
256  * batadv_tt_global_size_mod - change the size by v of the local table
257  *  identified by vid
258  * @bat_priv: the bat priv with all the soft interface information
259  * @vid: the VLAN identifier
260  * @v: the amount to sum to the global table size
261  */
262 static void batadv_tt_global_size_mod(struct batadv_orig_node *orig_node,
263                                       unsigned short vid, int v)
264 {
265         struct batadv_orig_node_vlan *vlan;
266
267         vlan = batadv_orig_node_vlan_new(orig_node, vid);
268         if (!vlan)
269                 return;
270
271         if (atomic_add_return(v, &vlan->tt.num_entries) == 0) {
272                 spin_lock_bh(&orig_node->vlan_list_lock);
273                 list_del_rcu(&vlan->list);
274                 spin_unlock_bh(&orig_node->vlan_list_lock);
275                 batadv_orig_node_vlan_free_ref(vlan);
276         }
277
278         batadv_orig_node_vlan_free_ref(vlan);
279 }
280
281 /**
282  * batadv_tt_global_size_inc - increase by one the global table size for the
283  *  given vid
284  * @orig_node: the originator which global table size has to be decreased
285  * @vid: the vlan identifier
286  */
287 static void batadv_tt_global_size_inc(struct batadv_orig_node *orig_node,
288                                       unsigned short vid)
289 {
290         batadv_tt_global_size_mod(orig_node, vid, 1);
291 }
292
293 /**
294  * batadv_tt_global_size_dec - decrease by one the global table size for the
295  *  given vid
296  * @orig_node: the originator which global table size has to be decreased
297  * @vid: the vlan identifier
298  */
299 static void batadv_tt_global_size_dec(struct batadv_orig_node *orig_node,
300                                       unsigned short vid)
301 {
302         batadv_tt_global_size_mod(orig_node, vid, -1);
303 }
304
305 static void
306 batadv_tt_orig_list_entry_free_ref(struct batadv_tt_orig_list_entry *orig_entry)
307 {
308         if (!atomic_dec_and_test(&orig_entry->refcount))
309                 return;
310
311         call_rcu(&orig_entry->rcu, batadv_tt_orig_list_entry_free_rcu);
312 }
313
314 /**
315  * batadv_tt_local_event - store a local TT event (ADD/DEL)
316  * @bat_priv: the bat priv with all the soft interface information
317  * @tt_local_entry: the TT entry involved in the event
318  * @event_flags: flags to store in the event structure
319  */
320 static void batadv_tt_local_event(struct batadv_priv *bat_priv,
321                                   struct batadv_tt_local_entry *tt_local_entry,
322                                   uint8_t event_flags)
323 {
324         struct batadv_tt_change_node *tt_change_node, *entry, *safe;
325         struct batadv_tt_common_entry *common = &tt_local_entry->common;
326         uint8_t flags = common->flags | event_flags;
327         bool event_removed = false;
328         bool del_op_requested, del_op_entry;
329
330         tt_change_node = kmalloc(sizeof(*tt_change_node), GFP_ATOMIC);
331         if (!tt_change_node)
332                 return;
333
334         tt_change_node->change.flags = flags;
335         memset(tt_change_node->change.reserved, 0,
336                sizeof(tt_change_node->change.reserved));
337         ether_addr_copy(tt_change_node->change.addr, common->addr);
338         tt_change_node->change.vid = htons(common->vid);
339
340         del_op_requested = flags & BATADV_TT_CLIENT_DEL;
341
342         /* check for ADD+DEL or DEL+ADD events */
343         spin_lock_bh(&bat_priv->tt.changes_list_lock);
344         list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
345                                  list) {
346                 if (!batadv_compare_eth(entry->change.addr, common->addr))
347                         continue;
348
349                 /* DEL+ADD in the same orig interval have no effect and can be
350                  * removed to avoid silly behaviour on the receiver side. The
351                  * other way around (ADD+DEL) can happen in case of roaming of
352                  * a client still in the NEW state. Roaming of NEW clients is
353                  * now possible due to automatically recognition of "temporary"
354                  * clients
355                  */
356                 del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
357                 if (!del_op_requested && del_op_entry)
358                         goto del;
359                 if (del_op_requested && !del_op_entry)
360                         goto del;
361
362                 /* this is a second add in the same originator interval. It
363                  * means that flags have been changed: update them!
364                  */
365                 if (!del_op_requested && !del_op_entry)
366                         entry->change.flags = flags;
367
368                 continue;
369 del:
370                 list_del(&entry->list);
371                 kfree(entry);
372                 kfree(tt_change_node);
373                 event_removed = true;
374                 goto unlock;
375         }
376
377         /* track the change in the OGMinterval list */
378         list_add_tail(&tt_change_node->list, &bat_priv->tt.changes_list);
379
380 unlock:
381         spin_unlock_bh(&bat_priv->tt.changes_list_lock);
382
383         if (event_removed)
384                 atomic_dec(&bat_priv->tt.local_changes);
385         else
386                 atomic_inc(&bat_priv->tt.local_changes);
387 }
388
389 /**
390  * batadv_tt_len - compute length in bytes of given number of tt changes
391  * @changes_num: number of tt changes
392  *
393  * Returns computed length in bytes.
394  */
395 static int batadv_tt_len(int changes_num)
396 {
397         return changes_num * sizeof(struct batadv_tvlv_tt_change);
398 }
399
400 /**
401  * batadv_tt_entries - compute the number of entries fitting in tt_len bytes
402  * @tt_len: available space
403  *
404  * Returns the number of entries.
405  */
406 static uint16_t batadv_tt_entries(uint16_t tt_len)
407 {
408         return tt_len / batadv_tt_len(1);
409 }
410
411 /**
412  * batadv_tt_local_table_transmit_size - calculates the local translation table
413  *  size when transmitted over the air
414  * @bat_priv: the bat priv with all the soft interface information
415  *
416  * Returns local translation table size in bytes.
417  */
418 static int batadv_tt_local_table_transmit_size(struct batadv_priv *bat_priv)
419 {
420         uint16_t num_vlan = 0, tt_local_entries = 0;
421         struct batadv_softif_vlan *vlan;
422         int hdr_size;
423
424         rcu_read_lock();
425         hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
426                 num_vlan++;
427                 tt_local_entries += atomic_read(&vlan->tt.num_entries);
428         }
429         rcu_read_unlock();
430
431         /* header size of tvlv encapsulated tt response payload */
432         hdr_size = sizeof(struct batadv_unicast_tvlv_packet);
433         hdr_size += sizeof(struct batadv_tvlv_hdr);
434         hdr_size += sizeof(struct batadv_tvlv_tt_data);
435         hdr_size += num_vlan * sizeof(struct batadv_tvlv_tt_vlan_data);
436
437         return hdr_size + batadv_tt_len(tt_local_entries);
438 }
439
440 static int batadv_tt_local_init(struct batadv_priv *bat_priv)
441 {
442         if (bat_priv->tt.local_hash)
443                 return 0;
444
445         bat_priv->tt.local_hash = batadv_hash_new(1024);
446
447         if (!bat_priv->tt.local_hash)
448                 return -ENOMEM;
449
450         batadv_hash_set_lock_class(bat_priv->tt.local_hash,
451                                    &batadv_tt_local_hash_lock_class_key);
452
453         return 0;
454 }
455
456 static void batadv_tt_global_free(struct batadv_priv *bat_priv,
457                                   struct batadv_tt_global_entry *tt_global,
458                                   const char *message)
459 {
460         batadv_dbg(BATADV_DBG_TT, bat_priv,
461                    "Deleting global tt entry %pM (vid: %d): %s\n",
462                    tt_global->common.addr,
463                    BATADV_PRINT_VID(tt_global->common.vid), message);
464
465         batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
466                            batadv_choose_tt, &tt_global->common);
467         batadv_tt_global_entry_free_ref(tt_global);
468 }
469
470 /**
471  * batadv_tt_local_add - add a new client to the local table or update an
472  *  existing client
473  * @soft_iface: netdev struct of the mesh interface
474  * @addr: the mac address of the client to add
475  * @vid: VLAN identifier
476  * @ifindex: index of the interface where the client is connected to (useful to
477  *  identify wireless clients)
478  * @mark: the value contained in the skb->mark field of the received packet (if
479  *  any)
480  *
481  * Returns true if the client was successfully added, false otherwise.
482  */
483 bool batadv_tt_local_add(struct net_device *soft_iface, const uint8_t *addr,
484                          unsigned short vid, int ifindex, uint32_t mark)
485 {
486         struct batadv_priv *bat_priv = netdev_priv(soft_iface);
487         struct batadv_tt_local_entry *tt_local;
488         struct batadv_tt_global_entry *tt_global = NULL;
489         struct net_device *in_dev = NULL;
490         struct hlist_head *head;
491         struct batadv_tt_orig_list_entry *orig_entry;
492         int hash_added, table_size, packet_size_max;
493         bool ret = false, roamed_back = false;
494         uint8_t remote_flags;
495         uint32_t match_mark;
496
497         if (ifindex != BATADV_NULL_IFINDEX)
498                 in_dev = dev_get_by_index(&init_net, ifindex);
499
500         tt_local = batadv_tt_local_hash_find(bat_priv, addr, vid);
501
502         if (!is_multicast_ether_addr(addr))
503                 tt_global = batadv_tt_global_hash_find(bat_priv, addr, vid);
504
505         if (tt_local) {
506                 tt_local->last_seen = jiffies;
507                 if (tt_local->common.flags & BATADV_TT_CLIENT_PENDING) {
508                         batadv_dbg(BATADV_DBG_TT, bat_priv,
509                                    "Re-adding pending client %pM (vid: %d)\n",
510                                    addr, BATADV_PRINT_VID(vid));
511                         /* whatever the reason why the PENDING flag was set,
512                          * this is a client which was enqueued to be removed in
513                          * this orig_interval. Since it popped up again, the
514                          * flag can be reset like it was never enqueued
515                          */
516                         tt_local->common.flags &= ~BATADV_TT_CLIENT_PENDING;
517                         goto add_event;
518                 }
519
520                 if (tt_local->common.flags & BATADV_TT_CLIENT_ROAM) {
521                         batadv_dbg(BATADV_DBG_TT, bat_priv,
522                                    "Roaming client %pM (vid: %d) came back to its original location\n",
523                                    addr, BATADV_PRINT_VID(vid));
524                         /* the ROAM flag is set because this client roamed away
525                          * and the node got a roaming_advertisement message. Now
526                          * that the client popped up again at its original
527                          * location such flag can be unset
528                          */
529                         tt_local->common.flags &= ~BATADV_TT_CLIENT_ROAM;
530                         roamed_back = true;
531                 }
532                 goto check_roaming;
533         }
534
535         /* Ignore the client if we cannot send it in a full table response. */
536         table_size = batadv_tt_local_table_transmit_size(bat_priv);
537         table_size += batadv_tt_len(1);
538         packet_size_max = atomic_read(&bat_priv->packet_size_max);
539         if (table_size > packet_size_max) {
540                 net_ratelimited_function(batadv_info, soft_iface,
541                                          "Local translation table size (%i) exceeds maximum packet size (%i); Ignoring new local tt entry: %pM\n",
542                                          table_size, packet_size_max, addr);
543                 goto out;
544         }
545
546         tt_local = kmalloc(sizeof(*tt_local), GFP_ATOMIC);
547         if (!tt_local)
548                 goto out;
549
550         batadv_dbg(BATADV_DBG_TT, bat_priv,
551                    "Creating new local tt entry: %pM (vid: %d, ttvn: %d)\n",
552                    addr, BATADV_PRINT_VID(vid),
553                    (uint8_t)atomic_read(&bat_priv->tt.vn));
554
555         ether_addr_copy(tt_local->common.addr, addr);
556         /* The local entry has to be marked as NEW to avoid to send it in
557          * a full table response going out before the next ttvn increment
558          * (consistency check)
559          */
560         tt_local->common.flags = BATADV_TT_CLIENT_NEW;
561         tt_local->common.vid = vid;
562         if (batadv_is_wifi_netdev(in_dev))
563                 tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
564         atomic_set(&tt_local->common.refcount, 2);
565         tt_local->last_seen = jiffies;
566         tt_local->common.added_at = tt_local->last_seen;
567
568         /* the batman interface mac and multicast addresses should never be
569          * purged
570          */
571         if (batadv_compare_eth(addr, soft_iface->dev_addr) ||
572             is_multicast_ether_addr(addr))
573                 tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE;
574
575         hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
576                                      batadv_choose_tt, &tt_local->common,
577                                      &tt_local->common.hash_entry);
578
579         if (unlikely(hash_added != 0)) {
580                 /* remove the reference for the hash */
581                 batadv_tt_local_entry_free_ref(tt_local);
582                 goto out;
583         }
584
585 add_event:
586         batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS);
587
588 check_roaming:
589         /* Check whether it is a roaming, but don't do anything if the roaming
590          * process has already been handled
591          */
592         if (tt_global && !(tt_global->common.flags & BATADV_TT_CLIENT_ROAM)) {
593                 /* These node are probably going to update their tt table */
594                 head = &tt_global->orig_list;
595                 rcu_read_lock();
596                 hlist_for_each_entry_rcu(orig_entry, head, list) {
597                         batadv_send_roam_adv(bat_priv, tt_global->common.addr,
598                                              tt_global->common.vid,
599                                              orig_entry->orig_node);
600                 }
601                 rcu_read_unlock();
602                 if (roamed_back) {
603                         batadv_tt_global_free(bat_priv, tt_global,
604                                               "Roaming canceled");
605                         tt_global = NULL;
606                 } else {
607                         /* The global entry has to be marked as ROAMING and
608                          * has to be kept for consistency purpose
609                          */
610                         tt_global->common.flags |= BATADV_TT_CLIENT_ROAM;
611                         tt_global->roam_at = jiffies;
612                 }
613         }
614
615         /* store the current remote flags before altering them. This helps
616          * understanding is flags are changing or not
617          */
618         remote_flags = tt_local->common.flags & BATADV_TT_REMOTE_MASK;
619
620         if (batadv_is_wifi_netdev(in_dev))
621                 tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
622         else
623                 tt_local->common.flags &= ~BATADV_TT_CLIENT_WIFI;
624
625         /* check the mark in the skb: if it's equal to the configured
626          * isolation_mark, it means the packet is coming from an isolated
627          * non-mesh client
628          */
629         match_mark = (mark & bat_priv->isolation_mark_mask);
630         if (bat_priv->isolation_mark_mask &&
631             match_mark == bat_priv->isolation_mark)
632                 tt_local->common.flags |= BATADV_TT_CLIENT_ISOLA;
633         else
634                 tt_local->common.flags &= ~BATADV_TT_CLIENT_ISOLA;
635
636         /* if any "dynamic" flag has been modified, resend an ADD event for this
637          * entry so that all the nodes can get the new flags
638          */
639         if (remote_flags ^ (tt_local->common.flags & BATADV_TT_REMOTE_MASK))
640                 batadv_tt_local_event(bat_priv, tt_local, BATADV_NO_FLAGS);
641
642         ret = true;
643 out:
644         if (in_dev)
645                 dev_put(in_dev);
646         if (tt_local)
647                 batadv_tt_local_entry_free_ref(tt_local);
648         if (tt_global)
649                 batadv_tt_global_entry_free_ref(tt_global);
650         return ret;
651 }
652
653 /**
654  * batadv_tt_prepare_tvlv_global_data - prepare the TVLV TT header to send
655  *  within a TT Response directed to another node
656  * @orig_node: originator for which the TT data has to be prepared
657  * @tt_data: uninitialised pointer to the address of the TVLV buffer
658  * @tt_change: uninitialised pointer to the address of the area where the TT
659  *  changed can be stored
660  * @tt_len: pointer to the length to reserve to the tt_change. if -1 this
661  *  function reserves the amount of space needed to send the entire global TT
662  *  table. In case of success the value is updated with the real amount of
663  *  reserved bytes
664
665  * Allocate the needed amount of memory for the entire TT TVLV and write its
666  * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data
667  * objects, one per active VLAN served by the originator node.
668  *
669  * Return the size of the allocated buffer or 0 in case of failure.
670  */
671 static uint16_t
672 batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
673                                    struct batadv_tvlv_tt_data **tt_data,
674                                    struct batadv_tvlv_tt_change **tt_change,
675                                    int32_t *tt_len)
676 {
677         uint16_t num_vlan = 0, num_entries = 0, change_offset, tvlv_len;
678         struct batadv_tvlv_tt_vlan_data *tt_vlan;
679         struct batadv_orig_node_vlan *vlan;
680         uint8_t *tt_change_ptr;
681
682         rcu_read_lock();
683         list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
684                 num_vlan++;
685                 num_entries += atomic_read(&vlan->tt.num_entries);
686         }
687
688         change_offset = sizeof(**tt_data);
689         change_offset += num_vlan * sizeof(*tt_vlan);
690
691         /* if tt_len is negative, allocate the space needed by the full table */
692         if (*tt_len < 0)
693                 *tt_len = batadv_tt_len(num_entries);
694
695         tvlv_len = *tt_len;
696         tvlv_len += change_offset;
697
698         *tt_data = kmalloc(tvlv_len, GFP_ATOMIC);
699         if (!*tt_data) {
700                 *tt_len = 0;
701                 goto out;
702         }
703
704         (*tt_data)->flags = BATADV_NO_FLAGS;
705         (*tt_data)->ttvn = atomic_read(&orig_node->last_ttvn);
706         (*tt_data)->num_vlan = htons(num_vlan);
707
708         tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
709         list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
710                 tt_vlan->vid = htons(vlan->vid);
711                 tt_vlan->crc = htonl(vlan->tt.crc);
712
713                 tt_vlan++;
714         }
715
716         tt_change_ptr = (uint8_t *)*tt_data + change_offset;
717         *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
718
719 out:
720         rcu_read_unlock();
721         return tvlv_len;
722 }
723
724 /**
725  * batadv_tt_prepare_tvlv_local_data - allocate and prepare the TT TVLV for this
726  *  node
727  * @bat_priv: the bat priv with all the soft interface information
728  * @tt_data: uninitialised pointer to the address of the TVLV buffer
729  * @tt_change: uninitialised pointer to the address of the area where the TT
730  *  changes can be stored
731  * @tt_len: pointer to the length to reserve to the tt_change. if -1 this
732  *  function reserves the amount of space needed to send the entire local TT
733  *  table. In case of success the value is updated with the real amount of
734  *  reserved bytes
735  *
736  * Allocate the needed amount of memory for the entire TT TVLV and write its
737  * header made up by one tvlv_tt_data object and a series of tvlv_tt_vlan_data
738  * objects, one per active VLAN.
739  *
740  * Return the size of the allocated buffer or 0 in case of failure.
741  */
742 static uint16_t
743 batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
744                                   struct batadv_tvlv_tt_data **tt_data,
745                                   struct batadv_tvlv_tt_change **tt_change,
746                                   int32_t *tt_len)
747 {
748         struct batadv_tvlv_tt_vlan_data *tt_vlan;
749         struct batadv_softif_vlan *vlan;
750         uint16_t num_vlan = 0, num_entries = 0, tvlv_len;
751         uint8_t *tt_change_ptr;
752         int change_offset;
753
754         rcu_read_lock();
755         hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
756                 num_vlan++;
757                 num_entries += atomic_read(&vlan->tt.num_entries);
758         }
759
760         change_offset = sizeof(**tt_data);
761         change_offset += num_vlan * sizeof(*tt_vlan);
762
763         /* if tt_len is negative, allocate the space needed by the full table */
764         if (*tt_len < 0)
765                 *tt_len = batadv_tt_len(num_entries);
766
767         tvlv_len = *tt_len;
768         tvlv_len += change_offset;
769
770         *tt_data = kmalloc(tvlv_len, GFP_ATOMIC);
771         if (!*tt_data) {
772                 tvlv_len = 0;
773                 goto out;
774         }
775
776         (*tt_data)->flags = BATADV_NO_FLAGS;
777         (*tt_data)->ttvn = atomic_read(&bat_priv->tt.vn);
778         (*tt_data)->num_vlan = htons(num_vlan);
779
780         tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(*tt_data + 1);
781         hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
782                 tt_vlan->vid = htons(vlan->vid);
783                 tt_vlan->crc = htonl(vlan->tt.crc);
784
785                 tt_vlan++;
786         }
787
788         tt_change_ptr = (uint8_t *)*tt_data + change_offset;
789         *tt_change = (struct batadv_tvlv_tt_change *)tt_change_ptr;
790
791 out:
792         rcu_read_unlock();
793         return tvlv_len;
794 }
795
796 /**
797  * batadv_tt_tvlv_container_update - update the translation table tvlv container
798  *  after local tt changes have been committed
799  * @bat_priv: the bat priv with all the soft interface information
800  */
801 static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
802 {
803         struct batadv_tt_change_node *entry, *safe;
804         struct batadv_tvlv_tt_data *tt_data;
805         struct batadv_tvlv_tt_change *tt_change;
806         int tt_diff_len, tt_change_len = 0;
807         int tt_diff_entries_num = 0, tt_diff_entries_count = 0;
808         uint16_t tvlv_len;
809
810         tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
811         tt_diff_len = batadv_tt_len(tt_diff_entries_num);
812
813         /* if we have too many changes for one packet don't send any
814          * and wait for the tt table request which will be fragmented
815          */
816         if (tt_diff_len > bat_priv->soft_iface->mtu)
817                 tt_diff_len = 0;
818
819         tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv, &tt_data,
820                                                      &tt_change, &tt_diff_len);
821         if (!tvlv_len)
822                 return;
823
824         tt_data->flags = BATADV_TT_OGM_DIFF;
825
826         if (tt_diff_len == 0)
827                 goto container_register;
828
829         spin_lock_bh(&bat_priv->tt.changes_list_lock);
830         atomic_set(&bat_priv->tt.local_changes, 0);
831
832         list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
833                                  list) {
834                 if (tt_diff_entries_count < tt_diff_entries_num) {
835                         memcpy(tt_change + tt_diff_entries_count,
836                                &entry->change,
837                                sizeof(struct batadv_tvlv_tt_change));
838                         tt_diff_entries_count++;
839                 }
840                 list_del(&entry->list);
841                 kfree(entry);
842         }
843         spin_unlock_bh(&bat_priv->tt.changes_list_lock);
844
845         /* Keep the buffer for possible tt_request */
846         spin_lock_bh(&bat_priv->tt.last_changeset_lock);
847         kfree(bat_priv->tt.last_changeset);
848         bat_priv->tt.last_changeset_len = 0;
849         bat_priv->tt.last_changeset = NULL;
850         tt_change_len = batadv_tt_len(tt_diff_entries_count);
851         /* check whether this new OGM has no changes due to size problems */
852         if (tt_diff_entries_count > 0) {
853                 /* if kmalloc() fails we will reply with the full table
854                  * instead of providing the diff
855                  */
856                 bat_priv->tt.last_changeset = kzalloc(tt_diff_len, GFP_ATOMIC);
857                 if (bat_priv->tt.last_changeset) {
858                         memcpy(bat_priv->tt.last_changeset,
859                                tt_change, tt_change_len);
860                         bat_priv->tt.last_changeset_len = tt_diff_len;
861                 }
862         }
863         spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
864
865 container_register:
866         batadv_tvlv_container_register(bat_priv, BATADV_TVLV_TT, 1, tt_data,
867                                        tvlv_len);
868         kfree(tt_data);
869 }
870
871 int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
872 {
873         struct net_device *net_dev = (struct net_device *)seq->private;
874         struct batadv_priv *bat_priv = netdev_priv(net_dev);
875         struct batadv_hashtable *hash = bat_priv->tt.local_hash;
876         struct batadv_tt_common_entry *tt_common_entry;
877         struct batadv_tt_local_entry *tt_local;
878         struct batadv_hard_iface *primary_if;
879         struct batadv_softif_vlan *vlan;
880         struct hlist_head *head;
881         unsigned short vid;
882         uint32_t i;
883         int last_seen_secs;
884         int last_seen_msecs;
885         unsigned long last_seen_jiffies;
886         bool no_purge;
887         uint16_t np_flag = BATADV_TT_CLIENT_NOPURGE;
888
889         primary_if = batadv_seq_print_text_primary_if_get(seq);
890         if (!primary_if)
891                 goto out;
892
893         seq_printf(seq,
894                    "Locally retrieved addresses (from %s) announced via TT (TTVN: %u):\n",
895                    net_dev->name, (uint8_t)atomic_read(&bat_priv->tt.vn));
896         seq_printf(seq, "       %-13s  %s %-8s %-9s (%-10s)\n", "Client", "VID",
897                    "Flags", "Last seen", "CRC");
898
899         for (i = 0; i < hash->size; i++) {
900                 head = &hash->table[i];
901
902                 rcu_read_lock();
903                 hlist_for_each_entry_rcu(tt_common_entry,
904                                          head, hash_entry) {
905                         tt_local = container_of(tt_common_entry,
906                                                 struct batadv_tt_local_entry,
907                                                 common);
908                         vid = tt_common_entry->vid;
909                         last_seen_jiffies = jiffies - tt_local->last_seen;
910                         last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
911                         last_seen_secs = last_seen_msecs / 1000;
912                         last_seen_msecs = last_seen_msecs % 1000;
913
914                         no_purge = tt_common_entry->flags & np_flag;
915
916                         vlan = batadv_softif_vlan_get(bat_priv, vid);
917                         if (!vlan) {
918                                 seq_printf(seq, "Cannot retrieve VLAN %d\n",
919                                            BATADV_PRINT_VID(vid));
920                                 continue;
921                         }
922
923                         seq_printf(seq,
924                                    " * %pM %4i [%c%c%c%c%c%c] %3u.%03u   (%#.8x)\n",
925                                    tt_common_entry->addr,
926                                    BATADV_PRINT_VID(tt_common_entry->vid),
927                                    (tt_common_entry->flags &
928                                     BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
929                                    no_purge ? 'P' : '.',
930                                    (tt_common_entry->flags &
931                                     BATADV_TT_CLIENT_NEW ? 'N' : '.'),
932                                    (tt_common_entry->flags &
933                                     BATADV_TT_CLIENT_PENDING ? 'X' : '.'),
934                                    (tt_common_entry->flags &
935                                     BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
936                                    (tt_common_entry->flags &
937                                     BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
938                                    no_purge ? 0 : last_seen_secs,
939                                    no_purge ? 0 : last_seen_msecs,
940                                    vlan->tt.crc);
941
942                         batadv_softif_vlan_free_ref(vlan);
943                 }
944                 rcu_read_unlock();
945         }
946 out:
947         if (primary_if)
948                 batadv_hardif_free_ref(primary_if);
949         return 0;
950 }
951
952 static void
953 batadv_tt_local_set_pending(struct batadv_priv *bat_priv,
954                             struct batadv_tt_local_entry *tt_local_entry,
955                             uint16_t flags, const char *message)
956 {
957         batadv_tt_local_event(bat_priv, tt_local_entry, flags);
958
959         /* The local client has to be marked as "pending to be removed" but has
960          * to be kept in the table in order to send it in a full table
961          * response issued before the net ttvn increment (consistency check)
962          */
963         tt_local_entry->common.flags |= BATADV_TT_CLIENT_PENDING;
964
965         batadv_dbg(BATADV_DBG_TT, bat_priv,
966                    "Local tt entry (%pM, vid: %d) pending to be removed: %s\n",
967                    tt_local_entry->common.addr,
968                    BATADV_PRINT_VID(tt_local_entry->common.vid), message);
969 }
970
971 /**
972  * batadv_tt_local_remove - logically remove an entry from the local table
973  * @bat_priv: the bat priv with all the soft interface information
974  * @addr: the MAC address of the client to remove
975  * @vid: VLAN identifier
976  * @message: message to append to the log on deletion
977  * @roaming: true if the deletion is due to a roaming event
978  *
979  * Returns the flags assigned to the local entry before being deleted
980  */
981 uint16_t batadv_tt_local_remove(struct batadv_priv *bat_priv,
982                                 const uint8_t *addr, unsigned short vid,
983                                 const char *message, bool roaming)
984 {
985         struct batadv_tt_local_entry *tt_local_entry;
986         uint16_t flags, curr_flags = BATADV_NO_FLAGS;
987
988         tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
989         if (!tt_local_entry)
990                 goto out;
991
992         curr_flags = tt_local_entry->common.flags;
993
994         flags = BATADV_TT_CLIENT_DEL;
995         /* if this global entry addition is due to a roaming, the node has to
996          * mark the local entry as "roamed" in order to correctly reroute
997          * packets later
998          */
999         if (roaming) {
1000                 flags |= BATADV_TT_CLIENT_ROAM;
1001                 /* mark the local client as ROAMed */
1002                 tt_local_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
1003         }
1004
1005         if (!(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW)) {
1006                 batadv_tt_local_set_pending(bat_priv, tt_local_entry, flags,
1007                                             message);
1008                 goto out;
1009         }
1010         /* if this client has been added right now, it is possible to
1011          * immediately purge it
1012          */
1013         batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL);
1014         hlist_del_rcu(&tt_local_entry->common.hash_entry);
1015         batadv_tt_local_entry_free_ref(tt_local_entry);
1016
1017 out:
1018         if (tt_local_entry)
1019                 batadv_tt_local_entry_free_ref(tt_local_entry);
1020
1021         return curr_flags;
1022 }
1023
1024 /**
1025  * batadv_tt_local_purge_list - purge inactive tt local entries
1026  * @bat_priv: the bat priv with all the soft interface information
1027  * @head: pointer to the list containing the local tt entries
1028  * @timeout: parameter deciding whether a given tt local entry is considered
1029  *  inactive or not
1030  */
1031 static void batadv_tt_local_purge_list(struct batadv_priv *bat_priv,
1032                                        struct hlist_head *head,
1033                                        int timeout)
1034 {
1035         struct batadv_tt_local_entry *tt_local_entry;
1036         struct batadv_tt_common_entry *tt_common_entry;
1037         struct hlist_node *node_tmp;
1038
1039         hlist_for_each_entry_safe(tt_common_entry, node_tmp, head,
1040                                   hash_entry) {
1041                 tt_local_entry = container_of(tt_common_entry,
1042                                               struct batadv_tt_local_entry,
1043                                               common);
1044                 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_NOPURGE)
1045                         continue;
1046
1047                 /* entry already marked for deletion */
1048                 if (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING)
1049                         continue;
1050
1051                 if (!batadv_has_timed_out(tt_local_entry->last_seen, timeout))
1052                         continue;
1053
1054                 batadv_tt_local_set_pending(bat_priv, tt_local_entry,
1055                                             BATADV_TT_CLIENT_DEL, "timed out");
1056         }
1057 }
1058
1059 /**
1060  * batadv_tt_local_purge - purge inactive tt local entries
1061  * @bat_priv: the bat priv with all the soft interface information
1062  * @timeout: parameter deciding whether a given tt local entry is considered
1063  *  inactive or not
1064  */
1065 static void batadv_tt_local_purge(struct batadv_priv *bat_priv,
1066                                   int timeout)
1067 {
1068         struct batadv_hashtable *hash = bat_priv->tt.local_hash;
1069         struct hlist_head *head;
1070         spinlock_t *list_lock; /* protects write access to the hash lists */
1071         uint32_t i;
1072
1073         for (i = 0; i < hash->size; i++) {
1074                 head = &hash->table[i];
1075                 list_lock = &hash->list_locks[i];
1076
1077                 spin_lock_bh(list_lock);
1078                 batadv_tt_local_purge_list(bat_priv, head, timeout);
1079                 spin_unlock_bh(list_lock);
1080         }
1081 }
1082
1083 static void batadv_tt_local_table_free(struct batadv_priv *bat_priv)
1084 {
1085         struct batadv_hashtable *hash;
1086         spinlock_t *list_lock; /* protects write access to the hash lists */
1087         struct batadv_tt_common_entry *tt_common_entry;
1088         struct batadv_tt_local_entry *tt_local;
1089         struct hlist_node *node_tmp;
1090         struct hlist_head *head;
1091         uint32_t i;
1092
1093         if (!bat_priv->tt.local_hash)
1094                 return;
1095
1096         hash = bat_priv->tt.local_hash;
1097
1098         for (i = 0; i < hash->size; i++) {
1099                 head = &hash->table[i];
1100                 list_lock = &hash->list_locks[i];
1101
1102                 spin_lock_bh(list_lock);
1103                 hlist_for_each_entry_safe(tt_common_entry, node_tmp,
1104                                           head, hash_entry) {
1105                         hlist_del_rcu(&tt_common_entry->hash_entry);
1106                         tt_local = container_of(tt_common_entry,
1107                                                 struct batadv_tt_local_entry,
1108                                                 common);
1109                         batadv_tt_local_entry_free_ref(tt_local);
1110                 }
1111                 spin_unlock_bh(list_lock);
1112         }
1113
1114         batadv_hash_destroy(hash);
1115
1116         bat_priv->tt.local_hash = NULL;
1117 }
1118
1119 static int batadv_tt_global_init(struct batadv_priv *bat_priv)
1120 {
1121         if (bat_priv->tt.global_hash)
1122                 return 0;
1123
1124         bat_priv->tt.global_hash = batadv_hash_new(1024);
1125
1126         if (!bat_priv->tt.global_hash)
1127                 return -ENOMEM;
1128
1129         batadv_hash_set_lock_class(bat_priv->tt.global_hash,
1130                                    &batadv_tt_global_hash_lock_class_key);
1131
1132         return 0;
1133 }
1134
1135 static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv)
1136 {
1137         struct batadv_tt_change_node *entry, *safe;
1138
1139         spin_lock_bh(&bat_priv->tt.changes_list_lock);
1140
1141         list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
1142                                  list) {
1143                 list_del(&entry->list);
1144                 kfree(entry);
1145         }
1146
1147         atomic_set(&bat_priv->tt.local_changes, 0);
1148         spin_unlock_bh(&bat_priv->tt.changes_list_lock);
1149 }
1150
1151 /* retrieves the orig_tt_list_entry belonging to orig_node from the
1152  * batadv_tt_global_entry list
1153  *
1154  * returns it with an increased refcounter, NULL if not found
1155  */
1156 static struct batadv_tt_orig_list_entry *
1157 batadv_tt_global_orig_entry_find(const struct batadv_tt_global_entry *entry,
1158                                  const struct batadv_orig_node *orig_node)
1159 {
1160         struct batadv_tt_orig_list_entry *tmp_orig_entry, *orig_entry = NULL;
1161         const struct hlist_head *head;
1162
1163         rcu_read_lock();
1164         head = &entry->orig_list;
1165         hlist_for_each_entry_rcu(tmp_orig_entry, head, list) {
1166                 if (tmp_orig_entry->orig_node != orig_node)
1167                         continue;
1168                 if (!atomic_inc_not_zero(&tmp_orig_entry->refcount))
1169                         continue;
1170
1171                 orig_entry = tmp_orig_entry;
1172                 break;
1173         }
1174         rcu_read_unlock();
1175
1176         return orig_entry;
1177 }
1178
1179 /* find out if an orig_node is already in the list of a tt_global_entry.
1180  * returns true if found, false otherwise
1181  */
1182 static bool
1183 batadv_tt_global_entry_has_orig(const struct batadv_tt_global_entry *entry,
1184                                 const struct batadv_orig_node *orig_node)
1185 {
1186         struct batadv_tt_orig_list_entry *orig_entry;
1187         bool found = false;
1188
1189         orig_entry = batadv_tt_global_orig_entry_find(entry, orig_node);
1190         if (orig_entry) {
1191                 found = true;
1192                 batadv_tt_orig_list_entry_free_ref(orig_entry);
1193         }
1194
1195         return found;
1196 }
1197
1198 static void
1199 batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
1200                                 struct batadv_orig_node *orig_node, int ttvn)
1201 {
1202         struct batadv_tt_orig_list_entry *orig_entry;
1203
1204         orig_entry = batadv_tt_global_orig_entry_find(tt_global, orig_node);
1205         if (orig_entry) {
1206                 /* refresh the ttvn: the current value could be a bogus one that
1207                  * was added during a "temporary client detection"
1208                  */
1209                 orig_entry->ttvn = ttvn;
1210                 goto out;
1211         }
1212
1213         orig_entry = kzalloc(sizeof(*orig_entry), GFP_ATOMIC);
1214         if (!orig_entry)
1215                 goto out;
1216
1217         INIT_HLIST_NODE(&orig_entry->list);
1218         atomic_inc(&orig_node->refcount);
1219         batadv_tt_global_size_inc(orig_node, tt_global->common.vid);
1220         orig_entry->orig_node = orig_node;
1221         orig_entry->ttvn = ttvn;
1222         atomic_set(&orig_entry->refcount, 2);
1223
1224         spin_lock_bh(&tt_global->list_lock);
1225         hlist_add_head_rcu(&orig_entry->list,
1226                            &tt_global->orig_list);
1227         spin_unlock_bh(&tt_global->list_lock);
1228 out:
1229         if (orig_entry)
1230                 batadv_tt_orig_list_entry_free_ref(orig_entry);
1231 }
1232
1233 /**
1234  * batadv_tt_global_add - add a new TT global entry or update an existing one
1235  * @bat_priv: the bat priv with all the soft interface information
1236  * @orig_node: the originator announcing the client
1237  * @tt_addr: the mac address of the non-mesh client
1238  * @vid: VLAN identifier
1239  * @flags: TT flags that have to be set for this non-mesh client
1240  * @ttvn: the tt version number ever announcing this non-mesh client
1241  *
1242  * Add a new TT global entry for the given originator. If the entry already
1243  * exists add a new reference to the given originator (a global entry can have
1244  * references to multiple originators) and adjust the flags attribute to reflect
1245  * the function argument.
1246  * If a TT local entry exists for this non-mesh client remove it.
1247  *
1248  * The caller must hold orig_node refcount.
1249  *
1250  * Return true if the new entry has been added, false otherwise
1251  */
1252 static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
1253                                  struct batadv_orig_node *orig_node,
1254                                  const unsigned char *tt_addr,
1255                                  unsigned short vid, uint16_t flags,
1256                                  uint8_t ttvn)
1257 {
1258         struct batadv_tt_global_entry *tt_global_entry;
1259         struct batadv_tt_local_entry *tt_local_entry;
1260         bool ret = false;
1261         int hash_added;
1262         struct batadv_tt_common_entry *common;
1263         uint16_t local_flags;
1264
1265         /* ignore global entries from backbone nodes */
1266         if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid))
1267                 return true;
1268
1269         tt_global_entry = batadv_tt_global_hash_find(bat_priv, tt_addr, vid);
1270         tt_local_entry = batadv_tt_local_hash_find(bat_priv, tt_addr, vid);
1271
1272         /* if the node already has a local client for this entry, it has to wait
1273          * for a roaming advertisement instead of manually messing up the global
1274          * table
1275          */
1276         if ((flags & BATADV_TT_CLIENT_TEMP) && tt_local_entry &&
1277             !(tt_local_entry->common.flags & BATADV_TT_CLIENT_NEW))
1278                 goto out;
1279
1280         if (!tt_global_entry) {
1281                 tt_global_entry = kzalloc(sizeof(*tt_global_entry), GFP_ATOMIC);
1282                 if (!tt_global_entry)
1283                         goto out;
1284
1285                 common = &tt_global_entry->common;
1286                 ether_addr_copy(common->addr, tt_addr);
1287                 common->vid = vid;
1288
1289                 common->flags = flags;
1290                 tt_global_entry->roam_at = 0;
1291                 /* node must store current time in case of roaming. This is
1292                  * needed to purge this entry out on timeout (if nobody claims
1293                  * it)
1294                  */
1295                 if (flags & BATADV_TT_CLIENT_ROAM)
1296                         tt_global_entry->roam_at = jiffies;
1297                 atomic_set(&common->refcount, 2);
1298                 common->added_at = jiffies;
1299
1300                 INIT_HLIST_HEAD(&tt_global_entry->orig_list);
1301                 spin_lock_init(&tt_global_entry->list_lock);
1302
1303                 hash_added = batadv_hash_add(bat_priv->tt.global_hash,
1304                                              batadv_compare_tt,
1305                                              batadv_choose_tt, common,
1306                                              &common->hash_entry);
1307
1308                 if (unlikely(hash_added != 0)) {
1309                         /* remove the reference for the hash */
1310                         batadv_tt_global_entry_free_ref(tt_global_entry);
1311                         goto out_remove;
1312                 }
1313         } else {
1314                 common = &tt_global_entry->common;
1315                 /* If there is already a global entry, we can use this one for
1316                  * our processing.
1317                  * But if we are trying to add a temporary client then here are
1318                  * two options at this point:
1319                  * 1) the global client is not a temporary client: the global
1320                  *    client has to be left as it is, temporary information
1321                  *    should never override any already known client state
1322                  * 2) the global client is a temporary client: purge the
1323                  *    originator list and add the new one orig_entry
1324                  */
1325                 if (flags & BATADV_TT_CLIENT_TEMP) {
1326                         if (!(common->flags & BATADV_TT_CLIENT_TEMP))
1327                                 goto out;
1328                         if (batadv_tt_global_entry_has_orig(tt_global_entry,
1329                                                             orig_node))
1330                                 goto out_remove;
1331                         batadv_tt_global_del_orig_list(tt_global_entry);
1332                         goto add_orig_entry;
1333                 }
1334
1335                 /* if the client was temporary added before receiving the first
1336                  * OGM announcing it, we have to clear the TEMP flag
1337                  */
1338                 common->flags &= ~BATADV_TT_CLIENT_TEMP;
1339
1340                 /* the change can carry possible "attribute" flags like the
1341                  * TT_CLIENT_WIFI, therefore they have to be copied in the
1342                  * client entry
1343                  */
1344                 tt_global_entry->common.flags |= flags;
1345
1346                 /* If there is the BATADV_TT_CLIENT_ROAM flag set, there is only
1347                  * one originator left in the list and we previously received a
1348                  * delete + roaming change for this originator.
1349                  *
1350                  * We should first delete the old originator before adding the
1351                  * new one.
1352                  */
1353                 if (common->flags & BATADV_TT_CLIENT_ROAM) {
1354                         batadv_tt_global_del_orig_list(tt_global_entry);
1355                         common->flags &= ~BATADV_TT_CLIENT_ROAM;
1356                         tt_global_entry->roam_at = 0;
1357                 }
1358         }
1359 add_orig_entry:
1360         /* add the new orig_entry (if needed) or update it */
1361         batadv_tt_global_orig_entry_add(tt_global_entry, orig_node, ttvn);
1362
1363         batadv_dbg(BATADV_DBG_TT, bat_priv,
1364                    "Creating new global tt entry: %pM (vid: %d, via %pM)\n",
1365                    common->addr, BATADV_PRINT_VID(common->vid),
1366                    orig_node->orig);
1367         ret = true;
1368
1369 out_remove:
1370         /* Do not remove multicast addresses from the local hash on
1371          * global additions
1372          */
1373         if (is_multicast_ether_addr(tt_addr))
1374                 goto out;
1375
1376         /* remove address from local hash if present */
1377         local_flags = batadv_tt_local_remove(bat_priv, tt_addr, vid,
1378                                              "global tt received",
1379                                              flags & BATADV_TT_CLIENT_ROAM);
1380         tt_global_entry->common.flags |= local_flags & BATADV_TT_CLIENT_WIFI;
1381
1382         if (!(flags & BATADV_TT_CLIENT_ROAM))
1383                 /* this is a normal global add. Therefore the client is not in a
1384                  * roaming state anymore.
1385                  */
1386                 tt_global_entry->common.flags &= ~BATADV_TT_CLIENT_ROAM;
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         return ret;
1394 }
1395
1396 /**
1397  * batadv_transtable_best_orig - Get best originator list entry from tt entry
1398  * @bat_priv: the bat priv with all the soft interface information
1399  * @tt_global_entry: global translation table entry to be analyzed
1400  *
1401  * This functon assumes the caller holds rcu_read_lock().
1402  * Returns best originator list entry or NULL on errors.
1403  */
1404 static struct batadv_tt_orig_list_entry *
1405 batadv_transtable_best_orig(struct batadv_priv *bat_priv,
1406                             struct batadv_tt_global_entry *tt_global_entry)
1407 {
1408         struct batadv_neigh_node *router, *best_router = NULL;
1409         struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
1410         struct hlist_head *head;
1411         struct batadv_tt_orig_list_entry *orig_entry, *best_entry = NULL;
1412
1413         head = &tt_global_entry->orig_list;
1414         hlist_for_each_entry_rcu(orig_entry, head, list) {
1415                 router = batadv_orig_router_get(orig_entry->orig_node,
1416                                                 BATADV_IF_DEFAULT);
1417                 if (!router)
1418                         continue;
1419
1420                 if (best_router &&
1421                     bao->bat_neigh_cmp(router, BATADV_IF_DEFAULT,
1422                                        best_router, BATADV_IF_DEFAULT) <= 0) {
1423                         batadv_neigh_node_free_ref(router);
1424                         continue;
1425                 }
1426
1427                 /* release the refcount for the "old" best */
1428                 if (best_router)
1429                         batadv_neigh_node_free_ref(best_router);
1430
1431                 best_entry = orig_entry;
1432                 best_router = router;
1433         }
1434
1435         if (best_router)
1436                 batadv_neigh_node_free_ref(best_router);
1437
1438         return best_entry;
1439 }
1440
1441 /**
1442  * batadv_tt_global_print_entry - print all orig nodes who announce the address
1443  *  for this global entry
1444  * @bat_priv: the bat priv with all the soft interface information
1445  * @tt_global_entry: global translation table entry to be printed
1446  * @seq: debugfs table seq_file struct
1447  *
1448  * This functon assumes the caller holds rcu_read_lock().
1449  */
1450 static void
1451 batadv_tt_global_print_entry(struct batadv_priv *bat_priv,
1452                              struct batadv_tt_global_entry *tt_global_entry,
1453                              struct seq_file *seq)
1454 {
1455         struct batadv_tt_orig_list_entry *orig_entry, *best_entry;
1456         struct batadv_tt_common_entry *tt_common_entry;
1457         struct batadv_orig_node_vlan *vlan;
1458         struct hlist_head *head;
1459         uint8_t last_ttvn;
1460         uint16_t flags;
1461
1462         tt_common_entry = &tt_global_entry->common;
1463         flags = tt_common_entry->flags;
1464
1465         best_entry = batadv_transtable_best_orig(bat_priv, tt_global_entry);
1466         if (best_entry) {
1467                 vlan = batadv_orig_node_vlan_get(best_entry->orig_node,
1468                                                  tt_common_entry->vid);
1469                 if (!vlan) {
1470                         seq_printf(seq,
1471                                    " * Cannot retrieve VLAN %d for originator %pM\n",
1472                                    BATADV_PRINT_VID(tt_common_entry->vid),
1473                                    best_entry->orig_node->orig);
1474                         goto print_list;
1475                 }
1476
1477                 last_ttvn = atomic_read(&best_entry->orig_node->last_ttvn);
1478                 seq_printf(seq,
1479                            " %c %pM %4i   (%3u) via %pM     (%3u)   (%#.8x) [%c%c%c%c]\n",
1480                            '*', tt_global_entry->common.addr,
1481                            BATADV_PRINT_VID(tt_global_entry->common.vid),
1482                            best_entry->ttvn, best_entry->orig_node->orig,
1483                            last_ttvn, vlan->tt.crc,
1484                            (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
1485                            (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
1486                            (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
1487                            (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
1488
1489                 batadv_orig_node_vlan_free_ref(vlan);
1490         }
1491
1492 print_list:
1493         head = &tt_global_entry->orig_list;
1494
1495         hlist_for_each_entry_rcu(orig_entry, head, list) {
1496                 if (best_entry == orig_entry)
1497                         continue;
1498
1499                 vlan = batadv_orig_node_vlan_get(orig_entry->orig_node,
1500                                                  tt_common_entry->vid);
1501                 if (!vlan) {
1502                         seq_printf(seq,
1503                                    " + Cannot retrieve VLAN %d for originator %pM\n",
1504                                    BATADV_PRINT_VID(tt_common_entry->vid),
1505                                    orig_entry->orig_node->orig);
1506                         continue;
1507                 }
1508
1509                 last_ttvn = atomic_read(&orig_entry->orig_node->last_ttvn);
1510                 seq_printf(seq,
1511                            " %c %pM %4d   (%3u) via %pM     (%3u)   (%#.8x) [%c%c%c%c]\n",
1512                            '+', tt_global_entry->common.addr,
1513                            BATADV_PRINT_VID(tt_global_entry->common.vid),
1514                            orig_entry->ttvn, orig_entry->orig_node->orig,
1515                            last_ttvn, vlan->tt.crc,
1516                            (flags & BATADV_TT_CLIENT_ROAM ? 'R' : '.'),
1517                            (flags & BATADV_TT_CLIENT_WIFI ? 'W' : '.'),
1518                            (flags & BATADV_TT_CLIENT_ISOLA ? 'I' : '.'),
1519                            (flags & BATADV_TT_CLIENT_TEMP ? 'T' : '.'));
1520
1521                 batadv_orig_node_vlan_free_ref(vlan);
1522         }
1523 }
1524
1525 int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
1526 {
1527         struct net_device *net_dev = (struct net_device *)seq->private;
1528         struct batadv_priv *bat_priv = netdev_priv(net_dev);
1529         struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1530         struct batadv_tt_common_entry *tt_common_entry;
1531         struct batadv_tt_global_entry *tt_global;
1532         struct batadv_hard_iface *primary_if;
1533         struct hlist_head *head;
1534         uint32_t i;
1535
1536         primary_if = batadv_seq_print_text_primary_if_get(seq);
1537         if (!primary_if)
1538                 goto out;
1539
1540         seq_printf(seq,
1541                    "Globally announced TT entries received via the mesh %s\n",
1542                    net_dev->name);
1543         seq_printf(seq, "       %-13s  %s  %s       %-15s %s (%-10s) %s\n",
1544                    "Client", "VID", "(TTVN)", "Originator", "(Curr TTVN)",
1545                    "CRC", "Flags");
1546
1547         for (i = 0; i < hash->size; i++) {
1548                 head = &hash->table[i];
1549
1550                 rcu_read_lock();
1551                 hlist_for_each_entry_rcu(tt_common_entry,
1552                                          head, hash_entry) {
1553                         tt_global = container_of(tt_common_entry,
1554                                                  struct batadv_tt_global_entry,
1555                                                  common);
1556                         batadv_tt_global_print_entry(bat_priv, tt_global, seq);
1557                 }
1558                 rcu_read_unlock();
1559         }
1560 out:
1561         if (primary_if)
1562                 batadv_hardif_free_ref(primary_if);
1563         return 0;
1564 }
1565
1566 /* deletes the orig list of a tt_global_entry */
1567 static void
1568 batadv_tt_global_del_orig_list(struct batadv_tt_global_entry *tt_global_entry)
1569 {
1570         struct hlist_head *head;
1571         struct hlist_node *safe;
1572         struct batadv_tt_orig_list_entry *orig_entry;
1573
1574         spin_lock_bh(&tt_global_entry->list_lock);
1575         head = &tt_global_entry->orig_list;
1576         hlist_for_each_entry_safe(orig_entry, safe, head, list) {
1577                 hlist_del_rcu(&orig_entry->list);
1578                 batadv_tt_global_size_dec(orig_entry->orig_node,
1579                                           tt_global_entry->common.vid);
1580                 batadv_tt_orig_list_entry_free_ref(orig_entry);
1581         }
1582         spin_unlock_bh(&tt_global_entry->list_lock);
1583 }
1584
1585 static void
1586 batadv_tt_global_del_orig_entry(struct batadv_priv *bat_priv,
1587                                 struct batadv_tt_global_entry *tt_global_entry,
1588                                 struct batadv_orig_node *orig_node,
1589                                 const char *message)
1590 {
1591         struct hlist_head *head;
1592         struct hlist_node *safe;
1593         struct batadv_tt_orig_list_entry *orig_entry;
1594         unsigned short vid;
1595
1596         spin_lock_bh(&tt_global_entry->list_lock);
1597         head = &tt_global_entry->orig_list;
1598         hlist_for_each_entry_safe(orig_entry, safe, head, list) {
1599                 if (orig_entry->orig_node == orig_node) {
1600                         vid = tt_global_entry->common.vid;
1601                         batadv_dbg(BATADV_DBG_TT, bat_priv,
1602                                    "Deleting %pM from global tt entry %pM (vid: %d): %s\n",
1603                                    orig_node->orig,
1604                                    tt_global_entry->common.addr,
1605                                    BATADV_PRINT_VID(vid), message);
1606                         hlist_del_rcu(&orig_entry->list);
1607                         batadv_tt_global_size_dec(orig_node,
1608                                                   tt_global_entry->common.vid);
1609                         batadv_tt_orig_list_entry_free_ref(orig_entry);
1610                 }
1611         }
1612         spin_unlock_bh(&tt_global_entry->list_lock);
1613 }
1614
1615 /* If the client is to be deleted, we check if it is the last origantor entry
1616  * within tt_global entry. If yes, we set the BATADV_TT_CLIENT_ROAM flag and the
1617  * timer, otherwise we simply remove the originator scheduled for deletion.
1618  */
1619 static void
1620 batadv_tt_global_del_roaming(struct batadv_priv *bat_priv,
1621                              struct batadv_tt_global_entry *tt_global_entry,
1622                              struct batadv_orig_node *orig_node,
1623                              const char *message)
1624 {
1625         bool last_entry = true;
1626         struct hlist_head *head;
1627         struct batadv_tt_orig_list_entry *orig_entry;
1628
1629         /* no local entry exists, case 1:
1630          * Check if this is the last one or if other entries exist.
1631          */
1632
1633         rcu_read_lock();
1634         head = &tt_global_entry->orig_list;
1635         hlist_for_each_entry_rcu(orig_entry, head, list) {
1636                 if (orig_entry->orig_node != orig_node) {
1637                         last_entry = false;
1638                         break;
1639                 }
1640         }
1641         rcu_read_unlock();
1642
1643         if (last_entry) {
1644                 /* its the last one, mark for roaming. */
1645                 tt_global_entry->common.flags |= BATADV_TT_CLIENT_ROAM;
1646                 tt_global_entry->roam_at = jiffies;
1647         } else
1648                 /* there is another entry, we can simply delete this
1649                  * one and can still use the other one.
1650                  */
1651                 batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry,
1652                                                 orig_node, message);
1653 }
1654
1655 /**
1656  * batadv_tt_global_del - remove a client from the global table
1657  * @bat_priv: the bat priv with all the soft interface information
1658  * @orig_node: an originator serving this client
1659  * @addr: the mac address of the client
1660  * @vid: VLAN identifier
1661  * @message: a message explaining the reason for deleting the client to print
1662  *  for debugging purpose
1663  * @roaming: true if the deletion has been triggered by a roaming event
1664  */
1665 static void batadv_tt_global_del(struct batadv_priv *bat_priv,
1666                                  struct batadv_orig_node *orig_node,
1667                                  const unsigned char *addr, unsigned short vid,
1668                                  const char *message, bool roaming)
1669 {
1670         struct batadv_tt_global_entry *tt_global_entry;
1671         struct batadv_tt_local_entry *local_entry = NULL;
1672
1673         tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid);
1674         if (!tt_global_entry)
1675                 goto out;
1676
1677         if (!roaming) {
1678                 batadv_tt_global_del_orig_entry(bat_priv, tt_global_entry,
1679                                                 orig_node, message);
1680
1681                 if (hlist_empty(&tt_global_entry->orig_list))
1682                         batadv_tt_global_free(bat_priv, tt_global_entry,
1683                                               message);
1684
1685                 goto out;
1686         }
1687
1688         /* if we are deleting a global entry due to a roam
1689          * event, there are two possibilities:
1690          * 1) the client roamed from node A to node B => if there
1691          *    is only one originator left for this client, we mark
1692          *    it with BATADV_TT_CLIENT_ROAM, we start a timer and we
1693          *    wait for node B to claim it. In case of timeout
1694          *    the entry is purged.
1695          *
1696          *    If there are other originators left, we directly delete
1697          *    the originator.
1698          * 2) the client roamed to us => we can directly delete
1699          *    the global entry, since it is useless now.
1700          */
1701         local_entry = batadv_tt_local_hash_find(bat_priv,
1702                                                 tt_global_entry->common.addr,
1703                                                 vid);
1704         if (local_entry) {
1705                 /* local entry exists, case 2: client roamed to us. */
1706                 batadv_tt_global_del_orig_list(tt_global_entry);
1707                 batadv_tt_global_free(bat_priv, tt_global_entry, message);
1708         } else
1709                 /* no local entry exists, case 1: check for roaming */
1710                 batadv_tt_global_del_roaming(bat_priv, tt_global_entry,
1711                                              orig_node, message);
1712
1713
1714 out:
1715         if (tt_global_entry)
1716                 batadv_tt_global_entry_free_ref(tt_global_entry);
1717         if (local_entry)
1718                 batadv_tt_local_entry_free_ref(local_entry);
1719 }
1720
1721 /**
1722  * batadv_tt_global_del_orig - remove all the TT global entries belonging to the
1723  *  given originator matching the provided vid
1724  * @bat_priv: the bat priv with all the soft interface information
1725  * @orig_node: the originator owning the entries to remove
1726  * @match_vid: the VLAN identifier to match. If negative all the entries will be
1727  *  removed
1728  * @message: debug message to print as "reason"
1729  */
1730 void batadv_tt_global_del_orig(struct batadv_priv *bat_priv,
1731                                struct batadv_orig_node *orig_node,
1732                                int32_t match_vid,
1733                                const char *message)
1734 {
1735         struct batadv_tt_global_entry *tt_global;
1736         struct batadv_tt_common_entry *tt_common_entry;
1737         uint32_t i;
1738         struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1739         struct hlist_node *safe;
1740         struct hlist_head *head;
1741         spinlock_t *list_lock; /* protects write access to the hash lists */
1742         unsigned short vid;
1743
1744         if (!hash)
1745                 return;
1746
1747         for (i = 0; i < hash->size; i++) {
1748                 head = &hash->table[i];
1749                 list_lock = &hash->list_locks[i];
1750
1751                 spin_lock_bh(list_lock);
1752                 hlist_for_each_entry_safe(tt_common_entry, safe,
1753                                           head, hash_entry) {
1754                         /* remove only matching entries */
1755                         if (match_vid >= 0 && tt_common_entry->vid != match_vid)
1756                                 continue;
1757
1758                         tt_global = container_of(tt_common_entry,
1759                                                  struct batadv_tt_global_entry,
1760                                                  common);
1761
1762                         batadv_tt_global_del_orig_entry(bat_priv, tt_global,
1763                                                         orig_node, message);
1764
1765                         if (hlist_empty(&tt_global->orig_list)) {
1766                                 vid = tt_global->common.vid;
1767                                 batadv_dbg(BATADV_DBG_TT, bat_priv,
1768                                            "Deleting global tt entry %pM (vid: %d): %s\n",
1769                                            tt_global->common.addr,
1770                                            BATADV_PRINT_VID(vid), message);
1771                                 hlist_del_rcu(&tt_common_entry->hash_entry);
1772                                 batadv_tt_global_entry_free_ref(tt_global);
1773                         }
1774                 }
1775                 spin_unlock_bh(list_lock);
1776         }
1777         orig_node->capa_initialized &= ~BATADV_ORIG_CAPA_HAS_TT;
1778 }
1779
1780 static bool batadv_tt_global_to_purge(struct batadv_tt_global_entry *tt_global,
1781                                       char **msg)
1782 {
1783         bool purge = false;
1784         unsigned long roam_timeout = BATADV_TT_CLIENT_ROAM_TIMEOUT;
1785         unsigned long temp_timeout = BATADV_TT_CLIENT_TEMP_TIMEOUT;
1786
1787         if ((tt_global->common.flags & BATADV_TT_CLIENT_ROAM) &&
1788             batadv_has_timed_out(tt_global->roam_at, roam_timeout)) {
1789                 purge = true;
1790                 *msg = "Roaming timeout\n";
1791         }
1792
1793         if ((tt_global->common.flags & BATADV_TT_CLIENT_TEMP) &&
1794             batadv_has_timed_out(tt_global->common.added_at, temp_timeout)) {
1795                 purge = true;
1796                 *msg = "Temporary client timeout\n";
1797         }
1798
1799         return purge;
1800 }
1801
1802 static void batadv_tt_global_purge(struct batadv_priv *bat_priv)
1803 {
1804         struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1805         struct hlist_head *head;
1806         struct hlist_node *node_tmp;
1807         spinlock_t *list_lock; /* protects write access to the hash lists */
1808         uint32_t i;
1809         char *msg = NULL;
1810         struct batadv_tt_common_entry *tt_common;
1811         struct batadv_tt_global_entry *tt_global;
1812
1813         for (i = 0; i < hash->size; i++) {
1814                 head = &hash->table[i];
1815                 list_lock = &hash->list_locks[i];
1816
1817                 spin_lock_bh(list_lock);
1818                 hlist_for_each_entry_safe(tt_common, node_tmp, head,
1819                                           hash_entry) {
1820                         tt_global = container_of(tt_common,
1821                                                  struct batadv_tt_global_entry,
1822                                                  common);
1823
1824                         if (!batadv_tt_global_to_purge(tt_global, &msg))
1825                                 continue;
1826
1827                         batadv_dbg(BATADV_DBG_TT, bat_priv,
1828                                    "Deleting global tt entry %pM (vid: %d): %s\n",
1829                                    tt_global->common.addr,
1830                                    BATADV_PRINT_VID(tt_global->common.vid),
1831                                    msg);
1832
1833                         hlist_del_rcu(&tt_common->hash_entry);
1834
1835                         batadv_tt_global_entry_free_ref(tt_global);
1836                 }
1837                 spin_unlock_bh(list_lock);
1838         }
1839 }
1840
1841 static void batadv_tt_global_table_free(struct batadv_priv *bat_priv)
1842 {
1843         struct batadv_hashtable *hash;
1844         spinlock_t *list_lock; /* protects write access to the hash lists */
1845         struct batadv_tt_common_entry *tt_common_entry;
1846         struct batadv_tt_global_entry *tt_global;
1847         struct hlist_node *node_tmp;
1848         struct hlist_head *head;
1849         uint32_t i;
1850
1851         if (!bat_priv->tt.global_hash)
1852                 return;
1853
1854         hash = bat_priv->tt.global_hash;
1855
1856         for (i = 0; i < hash->size; i++) {
1857                 head = &hash->table[i];
1858                 list_lock = &hash->list_locks[i];
1859
1860                 spin_lock_bh(list_lock);
1861                 hlist_for_each_entry_safe(tt_common_entry, node_tmp,
1862                                           head, hash_entry) {
1863                         hlist_del_rcu(&tt_common_entry->hash_entry);
1864                         tt_global = container_of(tt_common_entry,
1865                                                  struct batadv_tt_global_entry,
1866                                                  common);
1867                         batadv_tt_global_entry_free_ref(tt_global);
1868                 }
1869                 spin_unlock_bh(list_lock);
1870         }
1871
1872         batadv_hash_destroy(hash);
1873
1874         bat_priv->tt.global_hash = NULL;
1875 }
1876
1877 static bool
1878 _batadv_is_ap_isolated(struct batadv_tt_local_entry *tt_local_entry,
1879                        struct batadv_tt_global_entry *tt_global_entry)
1880 {
1881         bool ret = false;
1882
1883         if (tt_local_entry->common.flags & BATADV_TT_CLIENT_WIFI &&
1884             tt_global_entry->common.flags & BATADV_TT_CLIENT_WIFI)
1885                 ret = true;
1886
1887         /* check if the two clients are marked as isolated */
1888         if (tt_local_entry->common.flags & BATADV_TT_CLIENT_ISOLA &&
1889             tt_global_entry->common.flags & BATADV_TT_CLIENT_ISOLA)
1890                 ret = true;
1891
1892         return ret;
1893 }
1894
1895 /**
1896  * batadv_transtable_search - get the mesh destination for a given client
1897  * @bat_priv: the bat priv with all the soft interface information
1898  * @src: mac address of the source client
1899  * @addr: mac address of the destination client
1900  * @vid: VLAN identifier
1901  *
1902  * Returns a pointer to the originator that was selected as destination in the
1903  * mesh for contacting the client 'addr', NULL otherwise.
1904  * In case of multiple originators serving the same client, the function returns
1905  * the best one (best in terms of metric towards the destination node).
1906  *
1907  * If the two clients are AP isolated the function returns NULL.
1908  */
1909 struct batadv_orig_node *batadv_transtable_search(struct batadv_priv *bat_priv,
1910                                                   const uint8_t *src,
1911                                                   const uint8_t *addr,
1912                                                   unsigned short vid)
1913 {
1914         struct batadv_tt_local_entry *tt_local_entry = NULL;
1915         struct batadv_tt_global_entry *tt_global_entry = NULL;
1916         struct batadv_orig_node *orig_node = NULL;
1917         struct batadv_tt_orig_list_entry *best_entry;
1918
1919         if (src && batadv_vlan_ap_isola_get(bat_priv, vid)) {
1920                 tt_local_entry = batadv_tt_local_hash_find(bat_priv, src, vid);
1921                 if (!tt_local_entry ||
1922                     (tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING))
1923                         goto out;
1924         }
1925
1926         tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid);
1927         if (!tt_global_entry)
1928                 goto out;
1929
1930         /* check whether the clients should not communicate due to AP
1931          * isolation
1932          */
1933         if (tt_local_entry &&
1934             _batadv_is_ap_isolated(tt_local_entry, tt_global_entry))
1935                 goto out;
1936
1937         rcu_read_lock();
1938         best_entry = batadv_transtable_best_orig(bat_priv, tt_global_entry);
1939         /* found anything? */
1940         if (best_entry)
1941                 orig_node = best_entry->orig_node;
1942         if (orig_node && !atomic_inc_not_zero(&orig_node->refcount))
1943                 orig_node = NULL;
1944         rcu_read_unlock();
1945
1946 out:
1947         if (tt_global_entry)
1948                 batadv_tt_global_entry_free_ref(tt_global_entry);
1949         if (tt_local_entry)
1950                 batadv_tt_local_entry_free_ref(tt_local_entry);
1951
1952         return orig_node;
1953 }
1954
1955 /**
1956  * batadv_tt_global_crc - calculates the checksum of the local table belonging
1957  *  to the given orig_node
1958  * @bat_priv: the bat priv with all the soft interface information
1959  * @orig_node: originator for which the CRC should be computed
1960  * @vid: VLAN identifier for which the CRC32 has to be computed
1961  *
1962  * This function computes the checksum for the global table corresponding to a
1963  * specific originator. In particular, the checksum is computed as follows: For
1964  * each client connected to the originator the CRC32C of the MAC address and the
1965  * VID is computed and then all the CRC32Cs of the various clients are xor'ed
1966  * together.
1967  *
1968  * The idea behind is that CRC32C should be used as much as possible in order to
1969  * produce a unique hash of the table, but since the order which is used to feed
1970  * the CRC32C function affects the result and since every node in the network
1971  * probably sorts the clients differently, the hash function cannot be directly
1972  * computed over the entire table. Hence the CRC32C is used only on
1973  * the single client entry, while all the results are then xor'ed together
1974  * because the XOR operation can combine them all while trying to reduce the
1975  * noise as much as possible.
1976  *
1977  * Returns the checksum of the global table of a given originator.
1978  */
1979 static uint32_t batadv_tt_global_crc(struct batadv_priv *bat_priv,
1980                                      struct batadv_orig_node *orig_node,
1981                                      unsigned short vid)
1982 {
1983         struct batadv_hashtable *hash = bat_priv->tt.global_hash;
1984         struct batadv_tt_common_entry *tt_common;
1985         struct batadv_tt_global_entry *tt_global;
1986         struct hlist_head *head;
1987         uint32_t i, crc_tmp, crc = 0;
1988         uint8_t flags;
1989         __be16 tmp_vid;
1990
1991         for (i = 0; i < hash->size; i++) {
1992                 head = &hash->table[i];
1993
1994                 rcu_read_lock();
1995                 hlist_for_each_entry_rcu(tt_common, head, hash_entry) {
1996                         tt_global = container_of(tt_common,
1997                                                  struct batadv_tt_global_entry,
1998                                                  common);
1999                         /* compute the CRC only for entries belonging to the
2000                          * VLAN identified by the vid passed as parameter
2001                          */
2002                         if (tt_common->vid != vid)
2003                                 continue;
2004
2005                         /* Roaming clients are in the global table for
2006                          * consistency only. They don't have to be
2007                          * taken into account while computing the
2008                          * global crc
2009                          */
2010                         if (tt_common->flags & BATADV_TT_CLIENT_ROAM)
2011                                 continue;
2012                         /* Temporary clients have not been announced yet, so
2013                          * they have to be skipped while computing the global
2014                          * crc
2015                          */
2016                         if (tt_common->flags & BATADV_TT_CLIENT_TEMP)
2017                                 continue;
2018
2019                         /* find out if this global entry is announced by this
2020                          * originator
2021                          */
2022                         if (!batadv_tt_global_entry_has_orig(tt_global,
2023                                                              orig_node))
2024                                 continue;
2025
2026                         /* use network order to read the VID: this ensures that
2027                          * every node reads the bytes in the same order.
2028                          */
2029                         tmp_vid = htons(tt_common->vid);
2030                         crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid));
2031
2032                         /* compute the CRC on flags that have to be kept in sync
2033                          * among nodes
2034                          */
2035                         flags = tt_common->flags & BATADV_TT_SYNC_MASK;
2036                         crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
2037
2038                         crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2039                 }
2040                 rcu_read_unlock();
2041         }
2042
2043         return crc;
2044 }
2045
2046 /**
2047  * batadv_tt_local_crc - calculates the checksum of the local table
2048  * @bat_priv: the bat priv with all the soft interface information
2049  * @vid: VLAN identifier for which the CRC32 has to be computed
2050  *
2051  * For details about the computation, please refer to the documentation for
2052  * batadv_tt_global_crc().
2053  *
2054  * Returns the checksum of the local table
2055  */
2056 static uint32_t batadv_tt_local_crc(struct batadv_priv *bat_priv,
2057                                     unsigned short vid)
2058 {
2059         struct batadv_hashtable *hash = bat_priv->tt.local_hash;
2060         struct batadv_tt_common_entry *tt_common;
2061         struct hlist_head *head;
2062         uint32_t i, crc_tmp, crc = 0;
2063         uint8_t flags;
2064         __be16 tmp_vid;
2065
2066         for (i = 0; i < hash->size; i++) {
2067                 head = &hash->table[i];
2068
2069                 rcu_read_lock();
2070                 hlist_for_each_entry_rcu(tt_common, head, hash_entry) {
2071                         /* compute the CRC only for entries belonging to the
2072                          * VLAN identified by vid
2073                          */
2074                         if (tt_common->vid != vid)
2075                                 continue;
2076
2077                         /* not yet committed clients have not to be taken into
2078                          * account while computing the CRC
2079                          */
2080                         if (tt_common->flags & BATADV_TT_CLIENT_NEW)
2081                                 continue;
2082
2083                         /* use network order to read the VID: this ensures that
2084                          * every node reads the bytes in the same order.
2085                          */
2086                         tmp_vid = htons(tt_common->vid);
2087                         crc_tmp = crc32c(0, &tmp_vid, sizeof(tmp_vid));
2088
2089                         /* compute the CRC on flags that have to be kept in sync
2090                          * among nodes
2091                          */
2092                         flags = tt_common->flags & BATADV_TT_SYNC_MASK;
2093                         crc_tmp = crc32c(crc_tmp, &flags, sizeof(flags));
2094
2095                         crc ^= crc32c(crc_tmp, tt_common->addr, ETH_ALEN);
2096                 }
2097                 rcu_read_unlock();
2098         }
2099
2100         return crc;
2101 }
2102
2103 static void batadv_tt_req_list_free(struct batadv_priv *bat_priv)
2104 {
2105         struct batadv_tt_req_node *node, *safe;
2106
2107         spin_lock_bh(&bat_priv->tt.req_list_lock);
2108
2109         list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
2110                 list_del(&node->list);
2111                 kfree(node);
2112         }
2113
2114         spin_unlock_bh(&bat_priv->tt.req_list_lock);
2115 }
2116
2117 static void batadv_tt_save_orig_buffer(struct batadv_priv *bat_priv,
2118                                        struct batadv_orig_node *orig_node,
2119                                        const void *tt_buff,
2120                                        uint16_t tt_buff_len)
2121 {
2122         /* Replace the old buffer only if I received something in the
2123          * last OGM (the OGM could carry no changes)
2124          */
2125         spin_lock_bh(&orig_node->tt_buff_lock);
2126         if (tt_buff_len > 0) {
2127                 kfree(orig_node->tt_buff);
2128                 orig_node->tt_buff_len = 0;
2129                 orig_node->tt_buff = kmalloc(tt_buff_len, GFP_ATOMIC);
2130                 if (orig_node->tt_buff) {
2131                         memcpy(orig_node->tt_buff, tt_buff, tt_buff_len);
2132                         orig_node->tt_buff_len = tt_buff_len;
2133                 }
2134         }
2135         spin_unlock_bh(&orig_node->tt_buff_lock);
2136 }
2137
2138 static void batadv_tt_req_purge(struct batadv_priv *bat_priv)
2139 {
2140         struct batadv_tt_req_node *node, *safe;
2141
2142         spin_lock_bh(&bat_priv->tt.req_list_lock);
2143         list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
2144                 if (batadv_has_timed_out(node->issued_at,
2145                                          BATADV_TT_REQUEST_TIMEOUT)) {
2146                         list_del(&node->list);
2147                         kfree(node);
2148                 }
2149         }
2150         spin_unlock_bh(&bat_priv->tt.req_list_lock);
2151 }
2152
2153 /* returns the pointer to the new tt_req_node struct if no request
2154  * has already been issued for this orig_node, NULL otherwise
2155  */
2156 static struct batadv_tt_req_node *
2157 batadv_new_tt_req_node(struct batadv_priv *bat_priv,
2158                        struct batadv_orig_node *orig_node)
2159 {
2160         struct batadv_tt_req_node *tt_req_node_tmp, *tt_req_node = NULL;
2161
2162         spin_lock_bh(&bat_priv->tt.req_list_lock);
2163         list_for_each_entry(tt_req_node_tmp, &bat_priv->tt.req_list, list) {
2164                 if (batadv_compare_eth(tt_req_node_tmp, orig_node) &&
2165                     !batadv_has_timed_out(tt_req_node_tmp->issued_at,
2166                                           BATADV_TT_REQUEST_TIMEOUT))
2167                         goto unlock;
2168         }
2169
2170         tt_req_node = kmalloc(sizeof(*tt_req_node), GFP_ATOMIC);
2171         if (!tt_req_node)
2172                 goto unlock;
2173
2174         ether_addr_copy(tt_req_node->addr, orig_node->orig);
2175         tt_req_node->issued_at = jiffies;
2176
2177         list_add(&tt_req_node->list, &bat_priv->tt.req_list);
2178 unlock:
2179         spin_unlock_bh(&bat_priv->tt.req_list_lock);
2180         return tt_req_node;
2181 }
2182
2183 /**
2184  * batadv_tt_local_valid - verify that given tt entry is a valid one
2185  * @entry_ptr: to be checked local tt entry
2186  * @data_ptr: not used but definition required to satisfy the callback prototype
2187  *
2188  * Returns 1 if the entry is a valid, 0 otherwise.
2189  */
2190 static int batadv_tt_local_valid(const void *entry_ptr, const void *data_ptr)
2191 {
2192         const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
2193
2194         if (tt_common_entry->flags & BATADV_TT_CLIENT_NEW)
2195                 return 0;
2196         return 1;
2197 }
2198
2199 static int batadv_tt_global_valid(const void *entry_ptr,
2200                                   const void *data_ptr)
2201 {
2202         const struct batadv_tt_common_entry *tt_common_entry = entry_ptr;
2203         const struct batadv_tt_global_entry *tt_global_entry;
2204         const struct batadv_orig_node *orig_node = data_ptr;
2205
2206         if (tt_common_entry->flags & BATADV_TT_CLIENT_ROAM ||
2207             tt_common_entry->flags & BATADV_TT_CLIENT_TEMP)
2208                 return 0;
2209
2210         tt_global_entry = container_of(tt_common_entry,
2211                                        struct batadv_tt_global_entry,
2212                                        common);
2213
2214         return batadv_tt_global_entry_has_orig(tt_global_entry, orig_node);
2215 }
2216
2217 /**
2218  * batadv_tt_tvlv_generate - fill the tvlv buff with the tt entries from the
2219  *  specified tt hash
2220  * @bat_priv: the bat priv with all the soft interface information
2221  * @hash: hash table containing the tt entries
2222  * @tt_len: expected tvlv tt data buffer length in number of bytes
2223  * @tvlv_buff: pointer to the buffer to fill with the TT data
2224  * @valid_cb: function to filter tt change entries
2225  * @cb_data: data passed to the filter function as argument
2226  */
2227 static void batadv_tt_tvlv_generate(struct batadv_priv *bat_priv,
2228                                     struct batadv_hashtable *hash,
2229                                     void *tvlv_buff, uint16_t tt_len,
2230                                     int (*valid_cb)(const void *, const void *),
2231                                     void *cb_data)
2232 {
2233         struct batadv_tt_common_entry *tt_common_entry;
2234         struct batadv_tvlv_tt_change *tt_change;
2235         struct hlist_head *head;
2236         uint16_t tt_tot, tt_num_entries = 0;
2237         uint32_t i;
2238
2239         tt_tot = batadv_tt_entries(tt_len);
2240         tt_change = (struct batadv_tvlv_tt_change *)tvlv_buff;
2241
2242         rcu_read_lock();
2243         for (i = 0; i < hash->size; i++) {
2244                 head = &hash->table[i];
2245
2246                 hlist_for_each_entry_rcu(tt_common_entry,
2247                                          head, hash_entry) {
2248                         if (tt_tot == tt_num_entries)
2249                                 break;
2250
2251                         if ((valid_cb) && (!valid_cb(tt_common_entry, cb_data)))
2252                                 continue;
2253
2254                         ether_addr_copy(tt_change->addr, tt_common_entry->addr);
2255                         tt_change->flags = tt_common_entry->flags;
2256                         tt_change->vid = htons(tt_common_entry->vid);
2257                         memset(tt_change->reserved, 0,
2258                                sizeof(tt_change->reserved));
2259
2260                         tt_num_entries++;
2261                         tt_change++;
2262                 }
2263         }
2264         rcu_read_unlock();
2265 }
2266
2267 /**
2268  * batadv_tt_global_check_crc - check if all the CRCs are correct
2269  * @orig_node: originator for which the CRCs have to be checked
2270  * @tt_vlan: pointer to the first tvlv VLAN entry
2271  * @num_vlan: number of tvlv VLAN entries
2272  * @create: if true, create VLAN objects if not found
2273  *
2274  * Return true if all the received CRCs match the locally stored ones, false
2275  * otherwise
2276  */
2277 static bool batadv_tt_global_check_crc(struct batadv_orig_node *orig_node,
2278                                        struct batadv_tvlv_tt_vlan_data *tt_vlan,
2279                                        uint16_t num_vlan)
2280 {
2281         struct batadv_tvlv_tt_vlan_data *tt_vlan_tmp;
2282         struct batadv_orig_node_vlan *vlan;
2283         uint32_t crc;
2284         int i;
2285
2286         /* check if each received CRC matches the locally stored one */
2287         for (i = 0; i < num_vlan; i++) {
2288                 tt_vlan_tmp = tt_vlan + i;
2289
2290                 /* if orig_node is a backbone node for this VLAN, don't check
2291                  * the CRC as we ignore all the global entries over it
2292                  */
2293                 if (batadv_bla_is_backbone_gw_orig(orig_node->bat_priv,
2294                                                    orig_node->orig,
2295                                                    ntohs(tt_vlan_tmp->vid)))
2296                         continue;
2297
2298                 vlan = batadv_orig_node_vlan_get(orig_node,
2299                                                  ntohs(tt_vlan_tmp->vid));
2300                 if (!vlan)
2301                         return false;
2302
2303                 crc = vlan->tt.crc;
2304                 batadv_orig_node_vlan_free_ref(vlan);
2305
2306                 if (crc != ntohl(tt_vlan_tmp->crc))
2307                         return false;
2308         }
2309
2310         return true;
2311 }
2312
2313 /**
2314  * batadv_tt_local_update_crc - update all the local CRCs
2315  * @bat_priv: the bat priv with all the soft interface information
2316  */
2317 static void batadv_tt_local_update_crc(struct batadv_priv *bat_priv)
2318 {
2319         struct batadv_softif_vlan *vlan;
2320
2321         /* recompute the global CRC for each VLAN */
2322         rcu_read_lock();
2323         hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
2324                 vlan->tt.crc = batadv_tt_local_crc(bat_priv, vlan->vid);
2325         }
2326         rcu_read_unlock();
2327 }
2328
2329 /**
2330  * batadv_tt_global_update_crc - update all the global CRCs for this orig_node
2331  * @bat_priv: the bat priv with all the soft interface information
2332  * @orig_node: the orig_node for which the CRCs have to be updated
2333  */
2334 static void batadv_tt_global_update_crc(struct batadv_priv *bat_priv,
2335                                         struct batadv_orig_node *orig_node)
2336 {
2337         struct batadv_orig_node_vlan *vlan;
2338         uint32_t crc;
2339
2340         /* recompute the global CRC for each VLAN */
2341         rcu_read_lock();
2342         list_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
2343                 /* if orig_node is a backbone node for this VLAN, don't compute
2344                  * the CRC as we ignore all the global entries over it
2345                  */
2346                 if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig,
2347                                                    vlan->vid))
2348                         continue;
2349
2350                 crc = batadv_tt_global_crc(bat_priv, orig_node, vlan->vid);
2351                 vlan->tt.crc = crc;
2352         }
2353         rcu_read_unlock();
2354 }
2355
2356 /**
2357  * batadv_send_tt_request - send a TT Request message to a given node
2358  * @bat_priv: the bat priv with all the soft interface information
2359  * @dst_orig_node: the destination of the message
2360  * @ttvn: the version number that the source of the message is looking for
2361  * @tt_vlan: pointer to the first tvlv VLAN object to request
2362  * @num_vlan: number of tvlv VLAN entries
2363  * @full_table: ask for the entire translation table if true, while only for the
2364  *  last TT diff otherwise
2365  */
2366 static int batadv_send_tt_request(struct batadv_priv *bat_priv,
2367                                   struct batadv_orig_node *dst_orig_node,
2368                                   uint8_t ttvn,
2369                                   struct batadv_tvlv_tt_vlan_data *tt_vlan,
2370                                   uint16_t num_vlan, bool full_table)
2371 {
2372         struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
2373         struct batadv_tt_req_node *tt_req_node = NULL;
2374         struct batadv_tvlv_tt_vlan_data *tt_vlan_req;
2375         struct batadv_hard_iface *primary_if;
2376         bool ret = false;
2377         int i, size;
2378
2379         primary_if = batadv_primary_if_get_selected(bat_priv);
2380         if (!primary_if)
2381                 goto out;
2382
2383         /* The new tt_req will be issued only if I'm not waiting for a
2384          * reply from the same orig_node yet
2385          */
2386         tt_req_node = batadv_new_tt_req_node(bat_priv, dst_orig_node);
2387         if (!tt_req_node)
2388                 goto out;
2389
2390         size = sizeof(*tvlv_tt_data) + sizeof(*tt_vlan_req) * num_vlan;
2391         tvlv_tt_data = kzalloc(size, GFP_ATOMIC);
2392         if (!tvlv_tt_data)
2393                 goto out;
2394
2395         tvlv_tt_data->flags = BATADV_TT_REQUEST;
2396         tvlv_tt_data->ttvn = ttvn;
2397         tvlv_tt_data->num_vlan = htons(num_vlan);
2398
2399         /* send all the CRCs within the request. This is needed by intermediate
2400          * nodes to ensure they have the correct table before replying
2401          */
2402         tt_vlan_req = (struct batadv_tvlv_tt_vlan_data *)(tvlv_tt_data + 1);
2403         for (i = 0; i < num_vlan; i++) {
2404                 tt_vlan_req->vid = tt_vlan->vid;
2405                 tt_vlan_req->crc = tt_vlan->crc;
2406
2407                 tt_vlan_req++;
2408                 tt_vlan++;
2409         }
2410
2411         if (full_table)
2412                 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE;
2413
2414         batadv_dbg(BATADV_DBG_TT, bat_priv, "Sending TT_REQUEST to %pM [%c]\n",
2415                    dst_orig_node->orig, full_table ? 'F' : '.');
2416
2417         batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_TX);
2418         batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr,
2419                                  dst_orig_node->orig, BATADV_TVLV_TT, 1,
2420                                  tvlv_tt_data, size);
2421         ret = true;
2422
2423 out:
2424         if (primary_if)
2425                 batadv_hardif_free_ref(primary_if);
2426         if (ret && tt_req_node) {
2427                 spin_lock_bh(&bat_priv->tt.req_list_lock);
2428                 list_del(&tt_req_node->list);
2429                 spin_unlock_bh(&bat_priv->tt.req_list_lock);
2430                 kfree(tt_req_node);
2431         }
2432         kfree(tvlv_tt_data);
2433         return ret;
2434 }
2435
2436 /**
2437  * batadv_send_other_tt_response - send reply to tt request concerning another
2438  *  node's translation table
2439  * @bat_priv: the bat priv with all the soft interface information
2440  * @tt_data: tt data containing the tt request information
2441  * @req_src: mac address of tt request sender
2442  * @req_dst: mac address of tt request recipient
2443  *
2444  * Returns true if tt request reply was sent, false otherwise.
2445  */
2446 static bool batadv_send_other_tt_response(struct batadv_priv *bat_priv,
2447                                           struct batadv_tvlv_tt_data *tt_data,
2448                                           uint8_t *req_src, uint8_t *req_dst)
2449 {
2450         struct batadv_orig_node *req_dst_orig_node;
2451         struct batadv_orig_node *res_dst_orig_node = NULL;
2452         struct batadv_tvlv_tt_change *tt_change;
2453         struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
2454         struct batadv_tvlv_tt_vlan_data *tt_vlan;
2455         bool ret = false, full_table;
2456         uint8_t orig_ttvn, req_ttvn;
2457         uint16_t tvlv_len;
2458         int32_t tt_len;
2459
2460         batadv_dbg(BATADV_DBG_TT, bat_priv,
2461                    "Received TT_REQUEST from %pM for ttvn: %u (%pM) [%c]\n",
2462                    req_src, tt_data->ttvn, req_dst,
2463                    (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
2464
2465         /* Let's get the orig node of the REAL destination */
2466         req_dst_orig_node = batadv_orig_hash_find(bat_priv, req_dst);
2467         if (!req_dst_orig_node)
2468                 goto out;
2469
2470         res_dst_orig_node = batadv_orig_hash_find(bat_priv, req_src);
2471         if (!res_dst_orig_node)
2472                 goto out;
2473
2474         orig_ttvn = (uint8_t)atomic_read(&req_dst_orig_node->last_ttvn);
2475         req_ttvn = tt_data->ttvn;
2476
2477         tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1);
2478         /* this node doesn't have the requested data */
2479         if (orig_ttvn != req_ttvn ||
2480             !batadv_tt_global_check_crc(req_dst_orig_node, tt_vlan,
2481                                         ntohs(tt_data->num_vlan)))
2482                 goto out;
2483
2484         /* If the full table has been explicitly requested */
2485         if (tt_data->flags & BATADV_TT_FULL_TABLE ||
2486             !req_dst_orig_node->tt_buff)
2487                 full_table = true;
2488         else
2489                 full_table = false;
2490
2491         /* TT fragmentation hasn't been implemented yet, so send as many
2492          * TT entries fit a single packet as possible only
2493          */
2494         if (!full_table) {
2495                 spin_lock_bh(&req_dst_orig_node->tt_buff_lock);
2496                 tt_len = req_dst_orig_node->tt_buff_len;
2497
2498                 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node,
2499                                                               &tvlv_tt_data,
2500                                                               &tt_change,
2501                                                               &tt_len);
2502                 if (!tt_len)
2503                         goto unlock;
2504
2505                 /* Copy the last orig_node's OGM buffer */
2506                 memcpy(tt_change, req_dst_orig_node->tt_buff,
2507                        req_dst_orig_node->tt_buff_len);
2508                 spin_unlock_bh(&req_dst_orig_node->tt_buff_lock);
2509         } else {
2510                 /* allocate the tvlv, put the tt_data and all the tt_vlan_data
2511                  * in the initial part
2512                  */
2513                 tt_len = -1;
2514                 tvlv_len = batadv_tt_prepare_tvlv_global_data(req_dst_orig_node,
2515                                                               &tvlv_tt_data,
2516                                                               &tt_change,
2517                                                               &tt_len);
2518                 if (!tt_len)
2519                         goto out;
2520
2521                 /* fill the rest of the tvlv with the real TT entries */
2522                 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.global_hash,
2523                                         tt_change, tt_len,
2524                                         batadv_tt_global_valid,
2525                                         req_dst_orig_node);
2526         }
2527
2528         /* Don't send the response, if larger than fragmented packet. */
2529         tt_len = sizeof(struct batadv_unicast_tvlv_packet) + tvlv_len;
2530         if (tt_len > atomic_read(&bat_priv->packet_size_max)) {
2531                 net_ratelimited_function(batadv_info, bat_priv->soft_iface,
2532                                          "Ignoring TT_REQUEST from %pM; Response size exceeds max packet size.\n",
2533                                          res_dst_orig_node->orig);
2534                 goto out;
2535         }
2536
2537         tvlv_tt_data->flags = BATADV_TT_RESPONSE;
2538         tvlv_tt_data->ttvn = req_ttvn;
2539
2540         if (full_table)
2541                 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE;
2542
2543         batadv_dbg(BATADV_DBG_TT, bat_priv,
2544                    "Sending TT_RESPONSE %pM for %pM [%c] (ttvn: %u)\n",
2545                    res_dst_orig_node->orig, req_dst_orig_node->orig,
2546                    full_table ? 'F' : '.', req_ttvn);
2547
2548         batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX);
2549
2550         batadv_tvlv_unicast_send(bat_priv, req_dst_orig_node->orig,
2551                                  req_src, BATADV_TVLV_TT, 1, tvlv_tt_data,
2552                                  tvlv_len);
2553
2554         ret = true;
2555         goto out;
2556
2557 unlock:
2558         spin_unlock_bh(&req_dst_orig_node->tt_buff_lock);
2559
2560 out:
2561         if (res_dst_orig_node)
2562                 batadv_orig_node_free_ref(res_dst_orig_node);
2563         if (req_dst_orig_node)
2564                 batadv_orig_node_free_ref(req_dst_orig_node);
2565         kfree(tvlv_tt_data);
2566         return ret;
2567 }
2568
2569 /**
2570  * batadv_send_my_tt_response - send reply to tt request concerning this node's
2571  *  translation table
2572  * @bat_priv: the bat priv with all the soft interface information
2573  * @tt_data: tt data containing the tt request information
2574  * @req_src: mac address of tt request sender
2575  *
2576  * Returns true if tt request reply was sent, false otherwise.
2577  */
2578 static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
2579                                        struct batadv_tvlv_tt_data *tt_data,
2580                                        uint8_t *req_src)
2581 {
2582         struct batadv_tvlv_tt_data *tvlv_tt_data = NULL;
2583         struct batadv_hard_iface *primary_if = NULL;
2584         struct batadv_tvlv_tt_change *tt_change;
2585         struct batadv_orig_node *orig_node;
2586         uint8_t my_ttvn, req_ttvn;
2587         uint16_t tvlv_len;
2588         bool full_table;
2589         int32_t tt_len;
2590
2591         batadv_dbg(BATADV_DBG_TT, bat_priv,
2592                    "Received TT_REQUEST from %pM for ttvn: %u (me) [%c]\n",
2593                    req_src, tt_data->ttvn,
2594                    (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
2595
2596         spin_lock_bh(&bat_priv->tt.commit_lock);
2597
2598         my_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
2599         req_ttvn = tt_data->ttvn;
2600
2601         orig_node = batadv_orig_hash_find(bat_priv, req_src);
2602         if (!orig_node)
2603                 goto out;
2604
2605         primary_if = batadv_primary_if_get_selected(bat_priv);
2606         if (!primary_if)
2607                 goto out;
2608
2609         /* If the full table has been explicitly requested or the gap
2610          * is too big send the whole local translation table
2611          */
2612         if (tt_data->flags & BATADV_TT_FULL_TABLE || my_ttvn != req_ttvn ||
2613             !bat_priv->tt.last_changeset)
2614                 full_table = true;
2615         else
2616                 full_table = false;
2617
2618         /* TT fragmentation hasn't been implemented yet, so send as many
2619          * TT entries fit a single packet as possible only
2620          */
2621         if (!full_table) {
2622                 spin_lock_bh(&bat_priv->tt.last_changeset_lock);
2623
2624                 tt_len = bat_priv->tt.last_changeset_len;
2625                 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv,
2626                                                              &tvlv_tt_data,
2627                                                              &tt_change,
2628                                                              &tt_len);
2629                 if (!tt_len)
2630                         goto unlock;
2631
2632                 /* Copy the last orig_node's OGM buffer */
2633                 memcpy(tt_change, bat_priv->tt.last_changeset,
2634                        bat_priv->tt.last_changeset_len);
2635                 spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
2636         } else {
2637                 req_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
2638
2639                 /* allocate the tvlv, put the tt_data and all the tt_vlan_data
2640                  * in the initial part
2641                  */
2642                 tt_len = -1;
2643                 tvlv_len = batadv_tt_prepare_tvlv_local_data(bat_priv,
2644                                                              &tvlv_tt_data,
2645                                                              &tt_change,
2646                                                              &tt_len);
2647                 if (!tt_len)
2648                         goto out;
2649
2650                 /* fill the rest of the tvlv with the real TT entries */
2651                 batadv_tt_tvlv_generate(bat_priv, bat_priv->tt.local_hash,
2652                                         tt_change, tt_len,
2653                                         batadv_tt_local_valid, NULL);
2654         }
2655
2656         tvlv_tt_data->flags = BATADV_TT_RESPONSE;
2657         tvlv_tt_data->ttvn = req_ttvn;
2658
2659         if (full_table)
2660                 tvlv_tt_data->flags |= BATADV_TT_FULL_TABLE;
2661
2662         batadv_dbg(BATADV_DBG_TT, bat_priv,
2663                    "Sending TT_RESPONSE to %pM [%c] (ttvn: %u)\n",
2664                    orig_node->orig, full_table ? 'F' : '.', req_ttvn);
2665
2666         batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_TX);
2667
2668         batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr,
2669                                  req_src, BATADV_TVLV_TT, 1, tvlv_tt_data,
2670                                  tvlv_len);
2671
2672         goto out;
2673
2674 unlock:
2675         spin_unlock_bh(&bat_priv->tt.last_changeset_lock);
2676 out:
2677         spin_unlock_bh(&bat_priv->tt.commit_lock);
2678         if (orig_node)
2679                 batadv_orig_node_free_ref(orig_node);
2680         if (primary_if)
2681                 batadv_hardif_free_ref(primary_if);
2682         kfree(tvlv_tt_data);
2683         /* The packet was for this host, so it doesn't need to be re-routed */
2684         return true;
2685 }
2686
2687 /**
2688  * batadv_send_tt_response - send reply to tt request
2689  * @bat_priv: the bat priv with all the soft interface information
2690  * @tt_data: tt data containing the tt request information
2691  * @req_src: mac address of tt request sender
2692  * @req_dst: mac address of tt request recipient
2693  *
2694  * Returns true if tt request reply was sent, false otherwise.
2695  */
2696 static bool batadv_send_tt_response(struct batadv_priv *bat_priv,
2697                                     struct batadv_tvlv_tt_data *tt_data,
2698                                     uint8_t *req_src, uint8_t *req_dst)
2699 {
2700         if (batadv_is_my_mac(bat_priv, req_dst))
2701                 return batadv_send_my_tt_response(bat_priv, tt_data, req_src);
2702         else
2703                 return batadv_send_other_tt_response(bat_priv, tt_data,
2704                                                      req_src, req_dst);
2705 }
2706
2707 static void _batadv_tt_update_changes(struct batadv_priv *bat_priv,
2708                                       struct batadv_orig_node *orig_node,
2709                                       struct batadv_tvlv_tt_change *tt_change,
2710                                       uint16_t tt_num_changes, uint8_t ttvn)
2711 {
2712         int i;
2713         int roams;
2714
2715         for (i = 0; i < tt_num_changes; i++) {
2716                 if ((tt_change + i)->flags & BATADV_TT_CLIENT_DEL) {
2717                         roams = (tt_change + i)->flags & BATADV_TT_CLIENT_ROAM;
2718                         batadv_tt_global_del(bat_priv, orig_node,
2719                                              (tt_change + i)->addr,
2720                                              ntohs((tt_change + i)->vid),
2721                                              "tt removed by changes",
2722                                              roams);
2723                 } else {
2724                         if (!batadv_tt_global_add(bat_priv, orig_node,
2725                                                   (tt_change + i)->addr,
2726                                                   ntohs((tt_change + i)->vid),
2727                                                   (tt_change + i)->flags, ttvn))
2728                                 /* In case of problem while storing a
2729                                  * global_entry, we stop the updating
2730                                  * procedure without committing the
2731                                  * ttvn change. This will avoid to send
2732                                  * corrupted data on tt_request
2733                                  */
2734                                 return;
2735                 }
2736         }
2737         orig_node->capa_initialized |= BATADV_ORIG_CAPA_HAS_TT;
2738 }
2739
2740 static void batadv_tt_fill_gtable(struct batadv_priv *bat_priv,
2741                                   struct batadv_tvlv_tt_change *tt_change,
2742                                   uint8_t ttvn, uint8_t *resp_src,
2743                                   uint16_t num_entries)
2744 {
2745         struct batadv_orig_node *orig_node;
2746
2747         orig_node = batadv_orig_hash_find(bat_priv, resp_src);
2748         if (!orig_node)
2749                 goto out;
2750
2751         /* Purge the old table first.. */
2752         batadv_tt_global_del_orig(bat_priv, orig_node, -1,
2753                                   "Received full table");
2754
2755         _batadv_tt_update_changes(bat_priv, orig_node, tt_change, num_entries,
2756                                   ttvn);
2757
2758         spin_lock_bh(&orig_node->tt_buff_lock);
2759         kfree(orig_node->tt_buff);
2760         orig_node->tt_buff_len = 0;
2761         orig_node->tt_buff = NULL;
2762         spin_unlock_bh(&orig_node->tt_buff_lock);
2763
2764         atomic_set(&orig_node->last_ttvn, ttvn);
2765
2766 out:
2767         if (orig_node)
2768                 batadv_orig_node_free_ref(orig_node);
2769 }
2770
2771 static void batadv_tt_update_changes(struct batadv_priv *bat_priv,
2772                                      struct batadv_orig_node *orig_node,
2773                                      uint16_t tt_num_changes, uint8_t ttvn,
2774                                      struct batadv_tvlv_tt_change *tt_change)
2775 {
2776         _batadv_tt_update_changes(bat_priv, orig_node, tt_change,
2777                                   tt_num_changes, ttvn);
2778
2779         batadv_tt_save_orig_buffer(bat_priv, orig_node, tt_change,
2780                                    batadv_tt_len(tt_num_changes));
2781         atomic_set(&orig_node->last_ttvn, ttvn);
2782 }
2783
2784 /**
2785  * batadv_is_my_client - check if a client is served by the local node
2786  * @bat_priv: the bat priv with all the soft interface information
2787  * @addr: the mac adress of the client to check
2788  * @vid: VLAN identifier
2789  *
2790  * Returns true if the client is served by this node, false otherwise.
2791  */
2792 bool batadv_is_my_client(struct batadv_priv *bat_priv, const uint8_t *addr,
2793                          unsigned short vid)
2794 {
2795         struct batadv_tt_local_entry *tt_local_entry;
2796         bool ret = false;
2797
2798         tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
2799         if (!tt_local_entry)
2800                 goto out;
2801         /* Check if the client has been logically deleted (but is kept for
2802          * consistency purpose)
2803          */
2804         if ((tt_local_entry->common.flags & BATADV_TT_CLIENT_PENDING) ||
2805             (tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM))
2806                 goto out;
2807         ret = true;
2808 out:
2809         if (tt_local_entry)
2810                 batadv_tt_local_entry_free_ref(tt_local_entry);
2811         return ret;
2812 }
2813
2814 /**
2815  * batadv_handle_tt_response - process incoming tt reply
2816  * @bat_priv: the bat priv with all the soft interface information
2817  * @tt_data: tt data containing the tt request information
2818  * @resp_src: mac address of tt reply sender
2819  * @num_entries: number of tt change entries appended to the tt data
2820  */
2821 static void batadv_handle_tt_response(struct batadv_priv *bat_priv,
2822                                       struct batadv_tvlv_tt_data *tt_data,
2823                                       uint8_t *resp_src, uint16_t num_entries)
2824 {
2825         struct batadv_tt_req_node *node, *safe;
2826         struct batadv_orig_node *orig_node = NULL;
2827         struct batadv_tvlv_tt_change *tt_change;
2828         uint8_t *tvlv_ptr = (uint8_t *)tt_data;
2829         uint16_t change_offset;
2830
2831         batadv_dbg(BATADV_DBG_TT, bat_priv,
2832                    "Received TT_RESPONSE from %pM for ttvn %d t_size: %d [%c]\n",
2833                    resp_src, tt_data->ttvn, num_entries,
2834                    (tt_data->flags & BATADV_TT_FULL_TABLE ? 'F' : '.'));
2835
2836         orig_node = batadv_orig_hash_find(bat_priv, resp_src);
2837         if (!orig_node)
2838                 goto out;
2839
2840         spin_lock_bh(&orig_node->tt_lock);
2841
2842         change_offset = sizeof(struct batadv_tvlv_tt_vlan_data);
2843         change_offset *= ntohs(tt_data->num_vlan);
2844         change_offset += sizeof(*tt_data);
2845         tvlv_ptr += change_offset;
2846
2847         tt_change = (struct batadv_tvlv_tt_change *)tvlv_ptr;
2848         if (tt_data->flags & BATADV_TT_FULL_TABLE) {
2849                 batadv_tt_fill_gtable(bat_priv, tt_change, tt_data->ttvn,
2850                                       resp_src, num_entries);
2851         } else {
2852                 batadv_tt_update_changes(bat_priv, orig_node, num_entries,
2853                                          tt_data->ttvn, tt_change);
2854         }
2855
2856         /* Recalculate the CRC for this orig_node and store it */
2857         batadv_tt_global_update_crc(bat_priv, orig_node);
2858
2859         spin_unlock_bh(&orig_node->tt_lock);
2860
2861         /* Delete the tt_req_node from pending tt_requests list */
2862         spin_lock_bh(&bat_priv->tt.req_list_lock);
2863         list_for_each_entry_safe(node, safe, &bat_priv->tt.req_list, list) {
2864                 if (!batadv_compare_eth(node->addr, resp_src))
2865                         continue;
2866                 list_del(&node->list);
2867                 kfree(node);
2868         }
2869
2870         spin_unlock_bh(&bat_priv->tt.req_list_lock);
2871 out:
2872         if (orig_node)
2873                 batadv_orig_node_free_ref(orig_node);
2874 }
2875
2876 static void batadv_tt_roam_list_free(struct batadv_priv *bat_priv)
2877 {
2878         struct batadv_tt_roam_node *node, *safe;
2879
2880         spin_lock_bh(&bat_priv->tt.roam_list_lock);
2881
2882         list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) {
2883                 list_del(&node->list);
2884                 kfree(node);
2885         }
2886
2887         spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2888 }
2889
2890 static void batadv_tt_roam_purge(struct batadv_priv *bat_priv)
2891 {
2892         struct batadv_tt_roam_node *node, *safe;
2893
2894         spin_lock_bh(&bat_priv->tt.roam_list_lock);
2895         list_for_each_entry_safe(node, safe, &bat_priv->tt.roam_list, list) {
2896                 if (!batadv_has_timed_out(node->first_time,
2897                                           BATADV_ROAMING_MAX_TIME))
2898                         continue;
2899
2900                 list_del(&node->list);
2901                 kfree(node);
2902         }
2903         spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2904 }
2905
2906 /* This function checks whether the client already reached the
2907  * maximum number of possible roaming phases. In this case the ROAMING_ADV
2908  * will not be sent.
2909  *
2910  * returns true if the ROAMING_ADV can be sent, false otherwise
2911  */
2912 static bool batadv_tt_check_roam_count(struct batadv_priv *bat_priv,
2913                                        uint8_t *client)
2914 {
2915         struct batadv_tt_roam_node *tt_roam_node;
2916         bool ret = false;
2917
2918         spin_lock_bh(&bat_priv->tt.roam_list_lock);
2919         /* The new tt_req will be issued only if I'm not waiting for a
2920          * reply from the same orig_node yet
2921          */
2922         list_for_each_entry(tt_roam_node, &bat_priv->tt.roam_list, list) {
2923                 if (!batadv_compare_eth(tt_roam_node->addr, client))
2924                         continue;
2925
2926                 if (batadv_has_timed_out(tt_roam_node->first_time,
2927                                          BATADV_ROAMING_MAX_TIME))
2928                         continue;
2929
2930                 if (!batadv_atomic_dec_not_zero(&tt_roam_node->counter))
2931                         /* Sorry, you roamed too many times! */
2932                         goto unlock;
2933                 ret = true;
2934                 break;
2935         }
2936
2937         if (!ret) {
2938                 tt_roam_node = kmalloc(sizeof(*tt_roam_node), GFP_ATOMIC);
2939                 if (!tt_roam_node)
2940                         goto unlock;
2941
2942                 tt_roam_node->first_time = jiffies;
2943                 atomic_set(&tt_roam_node->counter,
2944                            BATADV_ROAMING_MAX_COUNT - 1);
2945                 ether_addr_copy(tt_roam_node->addr, client);
2946
2947                 list_add(&tt_roam_node->list, &bat_priv->tt.roam_list);
2948                 ret = true;
2949         }
2950
2951 unlock:
2952         spin_unlock_bh(&bat_priv->tt.roam_list_lock);
2953         return ret;
2954 }
2955
2956 /**
2957  * batadv_send_roam_adv - send a roaming advertisement message
2958  * @bat_priv: the bat priv with all the soft interface information
2959  * @client: mac address of the roaming client
2960  * @vid: VLAN identifier
2961  * @orig_node: message destination
2962  *
2963  * Send a ROAMING_ADV message to the node which was previously serving this
2964  * client. This is done to inform the node that from now on all traffic destined
2965  * for this particular roamed client has to be forwarded to the sender of the
2966  * roaming message.
2967  */
2968 static void batadv_send_roam_adv(struct batadv_priv *bat_priv, uint8_t *client,
2969                                  unsigned short vid,
2970                                  struct batadv_orig_node *orig_node)
2971 {
2972         struct batadv_hard_iface *primary_if;
2973         struct batadv_tvlv_roam_adv tvlv_roam;
2974
2975         primary_if = batadv_primary_if_get_selected(bat_priv);
2976         if (!primary_if)
2977                 goto out;
2978
2979         /* before going on we have to check whether the client has
2980          * already roamed to us too many times
2981          */
2982         if (!batadv_tt_check_roam_count(bat_priv, client))
2983                 goto out;
2984
2985         batadv_dbg(BATADV_DBG_TT, bat_priv,
2986                    "Sending ROAMING_ADV to %pM (client %pM, vid: %d)\n",
2987                    orig_node->orig, client, BATADV_PRINT_VID(vid));
2988
2989         batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_TX);
2990
2991         memcpy(tvlv_roam.client, client, sizeof(tvlv_roam.client));
2992         tvlv_roam.vid = htons(vid);
2993
2994         batadv_tvlv_unicast_send(bat_priv, primary_if->net_dev->dev_addr,
2995                                  orig_node->orig, BATADV_TVLV_ROAM, 1,
2996                                  &tvlv_roam, sizeof(tvlv_roam));
2997
2998 out:
2999         if (primary_if)
3000                 batadv_hardif_free_ref(primary_if);
3001 }
3002
3003 static void batadv_tt_purge(struct work_struct *work)
3004 {
3005         struct delayed_work *delayed_work;
3006         struct batadv_priv_tt *priv_tt;
3007         struct batadv_priv *bat_priv;
3008
3009         delayed_work = container_of(work, struct delayed_work, work);
3010         priv_tt = container_of(delayed_work, struct batadv_priv_tt, work);
3011         bat_priv = container_of(priv_tt, struct batadv_priv, tt);
3012
3013         batadv_tt_local_purge(bat_priv, BATADV_TT_LOCAL_TIMEOUT);
3014         batadv_tt_global_purge(bat_priv);
3015         batadv_tt_req_purge(bat_priv);
3016         batadv_tt_roam_purge(bat_priv);
3017
3018         queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
3019                            msecs_to_jiffies(BATADV_TT_WORK_PERIOD));
3020 }
3021
3022 void batadv_tt_free(struct batadv_priv *bat_priv)
3023 {
3024         batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_TT, 1);
3025         batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_TT, 1);
3026
3027         cancel_delayed_work_sync(&bat_priv->tt.work);
3028
3029         batadv_tt_local_table_free(bat_priv);
3030         batadv_tt_global_table_free(bat_priv);
3031         batadv_tt_req_list_free(bat_priv);
3032         batadv_tt_changes_list_free(bat_priv);
3033         batadv_tt_roam_list_free(bat_priv);
3034
3035         kfree(bat_priv->tt.last_changeset);
3036 }
3037
3038 /**
3039  * batadv_tt_local_set_flags - set or unset the specified flags on the local
3040  *  table and possibly count them in the TT size
3041  * @bat_priv: the bat priv with all the soft interface information
3042  * @flags: the flag to switch
3043  * @enable: whether to set or unset the flag
3044  * @count: whether to increase the TT size by the number of changed entries
3045  */
3046 static void batadv_tt_local_set_flags(struct batadv_priv *bat_priv,
3047                                       uint16_t flags, bool enable, bool count)
3048 {
3049         struct batadv_hashtable *hash = bat_priv->tt.local_hash;
3050         struct batadv_tt_common_entry *tt_common_entry;
3051         uint16_t changed_num = 0;
3052         struct hlist_head *head;
3053         uint32_t i;
3054
3055         if (!hash)
3056                 return;
3057
3058         for (i = 0; i < hash->size; i++) {
3059                 head = &hash->table[i];
3060
3061                 rcu_read_lock();
3062                 hlist_for_each_entry_rcu(tt_common_entry,
3063                                          head, hash_entry) {
3064                         if (enable) {
3065                                 if ((tt_common_entry->flags & flags) == flags)
3066                                         continue;
3067                                 tt_common_entry->flags |= flags;
3068                         } else {
3069                                 if (!(tt_common_entry->flags & flags))
3070                                         continue;
3071                                 tt_common_entry->flags &= ~flags;
3072                         }
3073                         changed_num++;
3074
3075                         if (!count)
3076                                 continue;
3077
3078                         batadv_tt_local_size_inc(bat_priv,
3079                                                  tt_common_entry->vid);
3080                 }
3081                 rcu_read_unlock();
3082         }
3083 }
3084
3085 /* Purge out all the tt local entries marked with BATADV_TT_CLIENT_PENDING */
3086 static void batadv_tt_local_purge_pending_clients(struct batadv_priv *bat_priv)
3087 {
3088         struct batadv_hashtable *hash = bat_priv->tt.local_hash;
3089         struct batadv_tt_common_entry *tt_common;
3090         struct batadv_tt_local_entry *tt_local;
3091         struct hlist_node *node_tmp;
3092         struct hlist_head *head;
3093         spinlock_t *list_lock; /* protects write access to the hash lists */
3094         uint32_t i;
3095
3096         if (!hash)
3097                 return;
3098
3099         for (i = 0; i < hash->size; i++) {
3100                 head = &hash->table[i];
3101                 list_lock = &hash->list_locks[i];
3102
3103                 spin_lock_bh(list_lock);
3104                 hlist_for_each_entry_safe(tt_common, node_tmp, head,
3105                                           hash_entry) {
3106                         if (!(tt_common->flags & BATADV_TT_CLIENT_PENDING))
3107                                 continue;
3108
3109                         batadv_dbg(BATADV_DBG_TT, bat_priv,
3110                                    "Deleting local tt entry (%pM, vid: %d): pending\n",
3111                                    tt_common->addr,
3112                                    BATADV_PRINT_VID(tt_common->vid));
3113
3114                         batadv_tt_local_size_dec(bat_priv, tt_common->vid);
3115                         hlist_del_rcu(&tt_common->hash_entry);
3116                         tt_local = container_of(tt_common,
3117                                                 struct batadv_tt_local_entry,
3118                                                 common);
3119                         batadv_tt_local_entry_free_ref(tt_local);
3120                 }
3121                 spin_unlock_bh(list_lock);
3122         }
3123 }
3124
3125 /**
3126  * batadv_tt_local_commit_changes_nolock - commit all pending local tt changes
3127  *  which have been queued in the time since the last commit
3128  * @bat_priv: the bat priv with all the soft interface information
3129  *
3130  * Caller must hold tt->commit_lock.
3131  */
3132 static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
3133 {
3134         /* Update multicast addresses in local translation table */
3135         batadv_mcast_mla_update(bat_priv);
3136
3137         if (atomic_read(&bat_priv->tt.local_changes) < 1) {
3138                 if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt))
3139                         batadv_tt_tvlv_container_update(bat_priv);
3140                 return;
3141         }
3142
3143         batadv_tt_local_set_flags(bat_priv, BATADV_TT_CLIENT_NEW, false, true);
3144
3145         batadv_tt_local_purge_pending_clients(bat_priv);
3146         batadv_tt_local_update_crc(bat_priv);
3147
3148         /* Increment the TTVN only once per OGM interval */
3149         atomic_inc(&bat_priv->tt.vn);
3150         batadv_dbg(BATADV_DBG_TT, bat_priv,
3151                    "Local changes committed, updating to ttvn %u\n",
3152                    (uint8_t)atomic_read(&bat_priv->tt.vn));
3153
3154         /* reset the sending counter */
3155         atomic_set(&bat_priv->tt.ogm_append_cnt, BATADV_TT_OGM_APPEND_MAX);
3156         batadv_tt_tvlv_container_update(bat_priv);
3157 }
3158
3159 /**
3160  * batadv_tt_local_commit_changes - commit all pending local tt changes which
3161  *  have been queued in the time since the last commit
3162  * @bat_priv: the bat priv with all the soft interface information
3163  */
3164 void batadv_tt_local_commit_changes(struct batadv_priv *bat_priv)
3165 {
3166         spin_lock_bh(&bat_priv->tt.commit_lock);
3167         batadv_tt_local_commit_changes_nolock(bat_priv);
3168         spin_unlock_bh(&bat_priv->tt.commit_lock);
3169 }
3170
3171 bool batadv_is_ap_isolated(struct batadv_priv *bat_priv, uint8_t *src,
3172                            uint8_t *dst, unsigned short vid)
3173 {
3174         struct batadv_tt_local_entry *tt_local_entry = NULL;
3175         struct batadv_tt_global_entry *tt_global_entry = NULL;
3176         struct batadv_softif_vlan *vlan;
3177         bool ret = false;
3178
3179         vlan = batadv_softif_vlan_get(bat_priv, vid);
3180         if (!vlan || !atomic_read(&vlan->ap_isolation))
3181                 goto out;
3182
3183         tt_local_entry = batadv_tt_local_hash_find(bat_priv, dst, vid);
3184         if (!tt_local_entry)
3185                 goto out;
3186
3187         tt_global_entry = batadv_tt_global_hash_find(bat_priv, src, vid);
3188         if (!tt_global_entry)
3189                 goto out;
3190
3191         if (!_batadv_is_ap_isolated(tt_local_entry, tt_global_entry))
3192                 goto out;
3193
3194         ret = true;
3195
3196 out:
3197         if (vlan)
3198                 batadv_softif_vlan_free_ref(vlan);
3199         if (tt_global_entry)
3200                 batadv_tt_global_entry_free_ref(tt_global_entry);
3201         if (tt_local_entry)
3202                 batadv_tt_local_entry_free_ref(tt_local_entry);
3203         return ret;
3204 }
3205
3206 /**
3207  * batadv_tt_update_orig - update global translation table with new tt
3208  *  information received via ogms
3209  * @bat_priv: the bat priv with all the soft interface information
3210  * @orig: the orig_node of the ogm
3211  * @tt_vlan: pointer to the first tvlv VLAN entry
3212  * @tt_num_vlan: number of tvlv VLAN entries
3213  * @tt_change: pointer to the first entry in the TT buffer
3214  * @tt_num_changes: number of tt changes inside the tt buffer
3215  * @ttvn: translation table version number of this changeset
3216  * @tt_crc: crc32 checksum of orig node's translation table
3217  */
3218 static void batadv_tt_update_orig(struct batadv_priv *bat_priv,
3219                                   struct batadv_orig_node *orig_node,
3220                                   const void *tt_buff, uint16_t tt_num_vlan,
3221                                   struct batadv_tvlv_tt_change *tt_change,
3222                                   uint16_t tt_num_changes, uint8_t ttvn)
3223 {
3224         uint8_t orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
3225         struct batadv_tvlv_tt_vlan_data *tt_vlan;
3226         bool full_table = true;
3227         bool has_tt_init;
3228
3229         tt_vlan = (struct batadv_tvlv_tt_vlan_data *)tt_buff;
3230         has_tt_init = orig_node->capa_initialized & BATADV_ORIG_CAPA_HAS_TT;
3231
3232         /* orig table not initialised AND first diff is in the OGM OR the ttvn
3233          * increased by one -> we can apply the attached changes
3234          */
3235         if ((!has_tt_init && ttvn == 1) || ttvn - orig_ttvn == 1) {
3236                 /* the OGM could not contain the changes due to their size or
3237                  * because they have already been sent BATADV_TT_OGM_APPEND_MAX
3238                  * times.
3239                  * In this case send a tt request
3240                  */
3241                 if (!tt_num_changes) {
3242                         full_table = false;
3243                         goto request_table;
3244                 }
3245
3246                 spin_lock_bh(&orig_node->tt_lock);
3247
3248                 batadv_tt_update_changes(bat_priv, orig_node, tt_num_changes,
3249                                          ttvn, tt_change);
3250
3251                 /* Even if we received the precomputed crc with the OGM, we
3252                  * prefer to recompute it to spot any possible inconsistency
3253                  * in the global table
3254                  */
3255                 batadv_tt_global_update_crc(bat_priv, orig_node);
3256
3257                 spin_unlock_bh(&orig_node->tt_lock);
3258
3259                 /* The ttvn alone is not enough to guarantee consistency
3260                  * because a single value could represent different states
3261                  * (due to the wrap around). Thus a node has to check whether
3262                  * the resulting table (after applying the changes) is still
3263                  * consistent or not. E.g. a node could disconnect while its
3264                  * ttvn is X and reconnect on ttvn = X + TTVN_MAX: in this case
3265                  * checking the CRC value is mandatory to detect the
3266                  * inconsistency
3267                  */
3268                 if (!batadv_tt_global_check_crc(orig_node, tt_vlan,
3269                                                 tt_num_vlan))
3270                         goto request_table;
3271         } else {
3272                 /* if we missed more than one change or our tables are not
3273                  * in sync anymore -> request fresh tt data
3274                  */
3275                 if (!has_tt_init || ttvn != orig_ttvn ||
3276                     !batadv_tt_global_check_crc(orig_node, tt_vlan,
3277                                                 tt_num_vlan)) {
3278 request_table:
3279                         batadv_dbg(BATADV_DBG_TT, bat_priv,
3280                                    "TT inconsistency for %pM. Need to retrieve the correct information (ttvn: %u last_ttvn: %u num_changes: %u)\n",
3281                                    orig_node->orig, ttvn, orig_ttvn,
3282                                    tt_num_changes);
3283                         batadv_send_tt_request(bat_priv, orig_node, ttvn,
3284                                                tt_vlan, tt_num_vlan,
3285                                                full_table);
3286                         return;
3287                 }
3288         }
3289 }
3290
3291 /**
3292  * batadv_tt_global_client_is_roaming - check if a client is marked as roaming
3293  * @bat_priv: the bat priv with all the soft interface information
3294  * @addr: the mac address of the client to check
3295  * @vid: VLAN identifier
3296  *
3297  * Returns true if we know that the client has moved from its old originator
3298  * to another one. This entry is still kept for consistency purposes and will be
3299  * deleted later by a DEL or because of timeout
3300  */
3301 bool batadv_tt_global_client_is_roaming(struct batadv_priv *bat_priv,
3302                                         uint8_t *addr, unsigned short vid)
3303 {
3304         struct batadv_tt_global_entry *tt_global_entry;
3305         bool ret = false;
3306
3307         tt_global_entry = batadv_tt_global_hash_find(bat_priv, addr, vid);
3308         if (!tt_global_entry)
3309                 goto out;
3310
3311         ret = tt_global_entry->common.flags & BATADV_TT_CLIENT_ROAM;
3312         batadv_tt_global_entry_free_ref(tt_global_entry);
3313 out:
3314         return ret;
3315 }
3316
3317 /**
3318  * batadv_tt_local_client_is_roaming - tells whether the client is roaming
3319  * @bat_priv: the bat priv with all the soft interface information
3320  * @addr: the mac address of the local client to query
3321  * @vid: VLAN identifier
3322  *
3323  * Returns true if the local client is known to be roaming (it is not served by
3324  * this node anymore) or not. If yes, the client is still present in the table
3325  * to keep the latter consistent with the node TTVN
3326  */
3327 bool batadv_tt_local_client_is_roaming(struct batadv_priv *bat_priv,
3328                                        uint8_t *addr, unsigned short vid)
3329 {
3330         struct batadv_tt_local_entry *tt_local_entry;
3331         bool ret = false;
3332
3333         tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
3334         if (!tt_local_entry)
3335                 goto out;
3336
3337         ret = tt_local_entry->common.flags & BATADV_TT_CLIENT_ROAM;
3338         batadv_tt_local_entry_free_ref(tt_local_entry);
3339 out:
3340         return ret;
3341 }
3342
3343 bool batadv_tt_add_temporary_global_entry(struct batadv_priv *bat_priv,
3344                                           struct batadv_orig_node *orig_node,
3345                                           const unsigned char *addr,
3346                                           unsigned short vid)
3347 {
3348         bool ret = false;
3349
3350         if (!batadv_tt_global_add(bat_priv, orig_node, addr, vid,
3351                                   BATADV_TT_CLIENT_TEMP,
3352                                   atomic_read(&orig_node->last_ttvn)))
3353                 goto out;
3354
3355         batadv_dbg(BATADV_DBG_TT, bat_priv,
3356                    "Added temporary global client (addr: %pM, vid: %d, orig: %pM)\n",
3357                    addr, BATADV_PRINT_VID(vid), orig_node->orig);
3358         ret = true;
3359 out:
3360         return ret;
3361 }
3362
3363 /**
3364  * batadv_tt_local_resize_to_mtu - resize the local translation table fit the
3365  *  maximum packet size that can be transported through the mesh
3366  * @soft_iface: netdev struct of the mesh interface
3367  *
3368  * Remove entries older than 'timeout' and half timeout if more entries need
3369  * to be removed.
3370  */
3371 void batadv_tt_local_resize_to_mtu(struct net_device *soft_iface)
3372 {
3373         struct batadv_priv *bat_priv = netdev_priv(soft_iface);
3374         int packet_size_max = atomic_read(&bat_priv->packet_size_max);
3375         int table_size, timeout = BATADV_TT_LOCAL_TIMEOUT / 2;
3376         bool reduced = false;
3377
3378         spin_lock_bh(&bat_priv->tt.commit_lock);
3379
3380         while (true) {
3381                 table_size = batadv_tt_local_table_transmit_size(bat_priv);
3382                 if (packet_size_max >= table_size)
3383                         break;
3384
3385                 batadv_tt_local_purge(bat_priv, timeout);
3386                 batadv_tt_local_purge_pending_clients(bat_priv);
3387
3388                 timeout /= 2;
3389                 reduced = true;
3390                 net_ratelimited_function(batadv_info, soft_iface,
3391                                          "Forced to purge local tt entries to fit new maximum fragment MTU (%i)\n",
3392                                          packet_size_max);
3393         }
3394
3395         /* commit these changes immediately, to avoid synchronization problem
3396          * with the TTVN
3397          */
3398         if (reduced)
3399                 batadv_tt_local_commit_changes_nolock(bat_priv);
3400
3401         spin_unlock_bh(&bat_priv->tt.commit_lock);
3402 }
3403
3404 /**
3405  * batadv_tt_tvlv_ogm_handler_v1 - process incoming tt tvlv container
3406  * @bat_priv: the bat priv with all the soft interface information
3407  * @orig: the orig_node of the ogm
3408  * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags)
3409  * @tvlv_value: tvlv buffer containing the gateway data
3410  * @tvlv_value_len: tvlv buffer length
3411  */
3412 static void batadv_tt_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
3413                                           struct batadv_orig_node *orig,
3414                                           uint8_t flags, void *tvlv_value,
3415                                           uint16_t tvlv_value_len)
3416 {
3417         struct batadv_tvlv_tt_vlan_data *tt_vlan;
3418         struct batadv_tvlv_tt_change *tt_change;
3419         struct batadv_tvlv_tt_data *tt_data;
3420         uint16_t num_entries, num_vlan;
3421
3422         if (tvlv_value_len < sizeof(*tt_data))
3423                 return;
3424
3425         tt_data = (struct batadv_tvlv_tt_data *)tvlv_value;
3426         tvlv_value_len -= sizeof(*tt_data);
3427
3428         num_vlan = ntohs(tt_data->num_vlan);
3429
3430         if (tvlv_value_len < sizeof(*tt_vlan) * num_vlan)
3431                 return;
3432
3433         tt_vlan = (struct batadv_tvlv_tt_vlan_data *)(tt_data + 1);
3434         tt_change = (struct batadv_tvlv_tt_change *)(tt_vlan + num_vlan);
3435         tvlv_value_len -= sizeof(*tt_vlan) * num_vlan;
3436
3437         num_entries = batadv_tt_entries(tvlv_value_len);
3438
3439         batadv_tt_update_orig(bat_priv, orig, tt_vlan, num_vlan, tt_change,
3440                               num_entries, tt_data->ttvn);
3441 }
3442
3443 /**
3444  * batadv_tt_tvlv_unicast_handler_v1 - process incoming (unicast) tt tvlv
3445  *  container
3446  * @bat_priv: the bat priv with all the soft interface information
3447  * @src: mac address of tt tvlv sender
3448  * @dst: mac address of tt tvlv recipient
3449  * @tvlv_value: tvlv buffer containing the tt data
3450  * @tvlv_value_len: tvlv buffer length
3451  *
3452  * Returns NET_RX_DROP if the tt tvlv is to be re-routed, NET_RX_SUCCESS
3453  * otherwise.
3454  */
3455 static int batadv_tt_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
3456                                              uint8_t *src, uint8_t *dst,
3457                                              void *tvlv_value,
3458                                              uint16_t tvlv_value_len)
3459 {
3460         struct batadv_tvlv_tt_data *tt_data;
3461         uint16_t tt_vlan_len, tt_num_entries;
3462         char tt_flag;
3463         bool ret;
3464
3465         if (tvlv_value_len < sizeof(*tt_data))
3466                 return NET_RX_SUCCESS;
3467
3468         tt_data = (struct batadv_tvlv_tt_data *)tvlv_value;
3469         tvlv_value_len -= sizeof(*tt_data);
3470
3471         tt_vlan_len = sizeof(struct batadv_tvlv_tt_vlan_data);
3472         tt_vlan_len *= ntohs(tt_data->num_vlan);
3473
3474         if (tvlv_value_len < tt_vlan_len)
3475                 return NET_RX_SUCCESS;
3476
3477         tvlv_value_len -= tt_vlan_len;
3478         tt_num_entries = batadv_tt_entries(tvlv_value_len);
3479
3480         switch (tt_data->flags & BATADV_TT_DATA_TYPE_MASK) {
3481         case BATADV_TT_REQUEST:
3482                 batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_RX);
3483
3484                 /* If this node cannot provide a TT response the tt_request is
3485                  * forwarded
3486                  */
3487                 ret = batadv_send_tt_response(bat_priv, tt_data, src, dst);
3488                 if (!ret) {
3489                         if (tt_data->flags & BATADV_TT_FULL_TABLE)
3490                                 tt_flag = 'F';
3491                         else
3492                                 tt_flag = '.';
3493
3494                         batadv_dbg(BATADV_DBG_TT, bat_priv,
3495                                    "Routing TT_REQUEST to %pM [%c]\n",
3496                                    dst, tt_flag);
3497                         /* tvlv API will re-route the packet */
3498                         return NET_RX_DROP;
3499                 }
3500                 break;
3501         case BATADV_TT_RESPONSE:
3502                 batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX);
3503
3504                 if (batadv_is_my_mac(bat_priv, dst)) {
3505                         batadv_handle_tt_response(bat_priv, tt_data,
3506                                                   src, tt_num_entries);
3507                         return NET_RX_SUCCESS;
3508                 }
3509
3510                 if (tt_data->flags & BATADV_TT_FULL_TABLE)
3511                         tt_flag =  'F';
3512                 else
3513                         tt_flag = '.';
3514
3515                 batadv_dbg(BATADV_DBG_TT, bat_priv,
3516                            "Routing TT_RESPONSE to %pM [%c]\n", dst, tt_flag);
3517
3518                 /* tvlv API will re-route the packet */
3519                 return NET_RX_DROP;
3520         }
3521
3522         return NET_RX_SUCCESS;
3523 }
3524
3525 /**
3526  * batadv_roam_tvlv_unicast_handler_v1 - process incoming tt roam tvlv container
3527  * @bat_priv: the bat priv with all the soft interface information
3528  * @src: mac address of tt tvlv sender
3529  * @dst: mac address of tt tvlv recipient
3530  * @tvlv_value: tvlv buffer containing the tt data
3531  * @tvlv_value_len: tvlv buffer length
3532  *
3533  * Returns NET_RX_DROP if the tt roam tvlv is to be re-routed, NET_RX_SUCCESS
3534  * otherwise.
3535  */
3536 static int batadv_roam_tvlv_unicast_handler_v1(struct batadv_priv *bat_priv,
3537                                                uint8_t *src, uint8_t *dst,
3538                                                void *tvlv_value,
3539                                                uint16_t tvlv_value_len)
3540 {
3541         struct batadv_tvlv_roam_adv *roaming_adv;
3542         struct batadv_orig_node *orig_node = NULL;
3543
3544         /* If this node is not the intended recipient of the
3545          * roaming advertisement the packet is forwarded
3546          * (the tvlv API will re-route the packet).
3547          */
3548         if (!batadv_is_my_mac(bat_priv, dst))
3549                 return NET_RX_DROP;
3550
3551         if (tvlv_value_len < sizeof(*roaming_adv))
3552                 goto out;
3553
3554         orig_node = batadv_orig_hash_find(bat_priv, src);
3555         if (!orig_node)
3556                 goto out;
3557
3558         batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX);
3559         roaming_adv = (struct batadv_tvlv_roam_adv *)tvlv_value;
3560
3561         batadv_dbg(BATADV_DBG_TT, bat_priv,
3562                    "Received ROAMING_ADV from %pM (client %pM)\n",
3563                    src, roaming_adv->client);
3564
3565         batadv_tt_global_add(bat_priv, orig_node, roaming_adv->client,
3566                              ntohs(roaming_adv->vid), BATADV_TT_CLIENT_ROAM,
3567                              atomic_read(&orig_node->last_ttvn) + 1);
3568
3569 out:
3570         if (orig_node)
3571                 batadv_orig_node_free_ref(orig_node);
3572         return NET_RX_SUCCESS;
3573 }
3574
3575 /**
3576  * batadv_tt_init - initialise the translation table internals
3577  * @bat_priv: the bat priv with all the soft interface information
3578  *
3579  * Return 0 on success or negative error number in case of failure.
3580  */
3581 int batadv_tt_init(struct batadv_priv *bat_priv)
3582 {
3583         int ret;
3584
3585         /* synchronized flags must be remote */
3586         BUILD_BUG_ON(!(BATADV_TT_SYNC_MASK & BATADV_TT_REMOTE_MASK));
3587
3588         ret = batadv_tt_local_init(bat_priv);
3589         if (ret < 0)
3590                 return ret;
3591
3592         ret = batadv_tt_global_init(bat_priv);
3593         if (ret < 0)
3594                 return ret;
3595
3596         batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1,
3597                                      batadv_tt_tvlv_unicast_handler_v1,
3598                                      BATADV_TVLV_TT, 1, BATADV_NO_FLAGS);
3599
3600         batadv_tvlv_handler_register(bat_priv, NULL,
3601                                      batadv_roam_tvlv_unicast_handler_v1,
3602                                      BATADV_TVLV_ROAM, 1, BATADV_NO_FLAGS);
3603
3604         INIT_DELAYED_WORK(&bat_priv->tt.work, batadv_tt_purge);
3605         queue_delayed_work(batadv_event_workqueue, &bat_priv->tt.work,
3606                            msecs_to_jiffies(BATADV_TT_WORK_PERIOD));
3607
3608         return 1;
3609 }
3610
3611 /**
3612  * batadv_tt_global_is_isolated - check if a client is marked as isolated
3613  * @bat_priv: the bat priv with all the soft interface information
3614  * @addr: the mac address of the client
3615  * @vid: the identifier of the VLAN where this client is connected
3616  *
3617  * Returns true if the client is marked with the TT_CLIENT_ISOLA flag, false
3618  * otherwise
3619  */
3620 bool batadv_tt_global_is_isolated(struct batadv_priv *bat_priv,
3621                                   const uint8_t *addr, unsigned short vid)
3622 {
3623         struct batadv_tt_global_entry *tt;
3624         bool ret;
3625
3626         tt = batadv_tt_global_hash_find(bat_priv, addr, vid);
3627         if (!tt)
3628                 return false;
3629
3630         ret = tt->common.flags & BATADV_TT_CLIENT_ISOLA;
3631
3632         batadv_tt_global_entry_free_ref(tt);
3633
3634         return ret;
3635 }