batman-adv: Fix potential synchronization issues in mcast tvlv handler
[cascardo/linux.git] / net / batman-adv / originator.c
1 /* Copyright (C) 2009-2015 B.A.T.M.A.N. contributors:
2  *
3  * Marek Lindner, Simon Wunderlich
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 "originator.h"
19 #include "main.h"
20
21 #include <linux/errno.h>
22 #include <linux/etherdevice.h>
23 #include <linux/fs.h>
24 #include <linux/jiffies.h>
25 #include <linux/kernel.h>
26 #include <linux/list.h>
27 #include <linux/lockdep.h>
28 #include <linux/netdevice.h>
29 #include <linux/seq_file.h>
30 #include <linux/slab.h>
31 #include <linux/spinlock.h>
32 #include <linux/workqueue.h>
33
34 #include "distributed-arp-table.h"
35 #include "fragmentation.h"
36 #include "gateway_client.h"
37 #include "hard-interface.h"
38 #include "hash.h"
39 #include "multicast.h"
40 #include "network-coding.h"
41 #include "routing.h"
42 #include "translation-table.h"
43
44 /* hash class keys */
45 static struct lock_class_key batadv_orig_hash_lock_class_key;
46
47 static void batadv_purge_orig(struct work_struct *work);
48
49 /* returns 1 if they are the same originator */
50 int batadv_compare_orig(const struct hlist_node *node, const void *data2)
51 {
52         const void *data1 = container_of(node, struct batadv_orig_node,
53                                          hash_entry);
54
55         return batadv_compare_eth(data1, data2);
56 }
57
58 /**
59  * batadv_orig_node_vlan_get - get an orig_node_vlan object
60  * @orig_node: the originator serving the VLAN
61  * @vid: the VLAN identifier
62  *
63  * Returns the vlan object identified by vid and belonging to orig_node or NULL
64  * if it does not exist.
65  */
66 struct batadv_orig_node_vlan *
67 batadv_orig_node_vlan_get(struct batadv_orig_node *orig_node,
68                           unsigned short vid)
69 {
70         struct batadv_orig_node_vlan *vlan = NULL, *tmp;
71
72         rcu_read_lock();
73         list_for_each_entry_rcu(tmp, &orig_node->vlan_list, list) {
74                 if (tmp->vid != vid)
75                         continue;
76
77                 if (!atomic_inc_not_zero(&tmp->refcount))
78                         continue;
79
80                 vlan = tmp;
81
82                 break;
83         }
84         rcu_read_unlock();
85
86         return vlan;
87 }
88
89 /**
90  * batadv_orig_node_vlan_new - search and possibly create an orig_node_vlan
91  *  object
92  * @orig_node: the originator serving the VLAN
93  * @vid: the VLAN identifier
94  *
95  * Returns NULL in case of failure or the vlan object identified by vid and
96  * belonging to orig_node otherwise. The object is created and added to the list
97  * if it does not exist.
98  *
99  * The object is returned with refcounter increased by 1.
100  */
101 struct batadv_orig_node_vlan *
102 batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
103                           unsigned short vid)
104 {
105         struct batadv_orig_node_vlan *vlan;
106
107         spin_lock_bh(&orig_node->vlan_list_lock);
108
109         /* first look if an object for this vid already exists */
110         vlan = batadv_orig_node_vlan_get(orig_node, vid);
111         if (vlan)
112                 goto out;
113
114         vlan = kzalloc(sizeof(*vlan), GFP_ATOMIC);
115         if (!vlan)
116                 goto out;
117
118         atomic_set(&vlan->refcount, 2);
119         vlan->vid = vid;
120
121         list_add_rcu(&vlan->list, &orig_node->vlan_list);
122
123 out:
124         spin_unlock_bh(&orig_node->vlan_list_lock);
125
126         return vlan;
127 }
128
129 /**
130  * batadv_orig_node_vlan_free_ref - decrement the refcounter and possibly free
131  *  the originator-vlan object
132  * @orig_vlan: the originator-vlan object to release
133  */
134 void batadv_orig_node_vlan_free_ref(struct batadv_orig_node_vlan *orig_vlan)
135 {
136         if (atomic_dec_and_test(&orig_vlan->refcount))
137                 kfree_rcu(orig_vlan, rcu);
138 }
139
140 int batadv_originator_init(struct batadv_priv *bat_priv)
141 {
142         if (bat_priv->orig_hash)
143                 return 0;
144
145         bat_priv->orig_hash = batadv_hash_new(1024);
146
147         if (!bat_priv->orig_hash)
148                 goto err;
149
150         batadv_hash_set_lock_class(bat_priv->orig_hash,
151                                    &batadv_orig_hash_lock_class_key);
152
153         INIT_DELAYED_WORK(&bat_priv->orig_work, batadv_purge_orig);
154         queue_delayed_work(batadv_event_workqueue,
155                            &bat_priv->orig_work,
156                            msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
157
158         return 0;
159
160 err:
161         return -ENOMEM;
162 }
163
164 /**
165  * batadv_neigh_ifinfo_free_rcu - free the neigh_ifinfo object
166  * @rcu: rcu pointer of the neigh_ifinfo object
167  */
168 static void batadv_neigh_ifinfo_free_rcu(struct rcu_head *rcu)
169 {
170         struct batadv_neigh_ifinfo *neigh_ifinfo;
171
172         neigh_ifinfo = container_of(rcu, struct batadv_neigh_ifinfo, rcu);
173
174         if (neigh_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
175                 batadv_hardif_free_ref_now(neigh_ifinfo->if_outgoing);
176
177         kfree(neigh_ifinfo);
178 }
179
180 /**
181  * batadv_neigh_ifinfo_free_now - decrement the refcounter and possibly free
182  *  the neigh_ifinfo (without rcu callback)
183  * @neigh_ifinfo: the neigh_ifinfo object to release
184  */
185 static void
186 batadv_neigh_ifinfo_free_ref_now(struct batadv_neigh_ifinfo *neigh_ifinfo)
187 {
188         if (atomic_dec_and_test(&neigh_ifinfo->refcount))
189                 batadv_neigh_ifinfo_free_rcu(&neigh_ifinfo->rcu);
190 }
191
192 /**
193  * batadv_neigh_ifinfo_free_ref - decrement the refcounter and possibly free
194  *  the neigh_ifinfo
195  * @neigh_ifinfo: the neigh_ifinfo object to release
196  */
197 void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo)
198 {
199         if (atomic_dec_and_test(&neigh_ifinfo->refcount))
200                 call_rcu(&neigh_ifinfo->rcu, batadv_neigh_ifinfo_free_rcu);
201 }
202
203 /**
204  * batadv_neigh_node_free_rcu - free the neigh_node
205  * @rcu: rcu pointer of the neigh_node
206  */
207 static void batadv_neigh_node_free_rcu(struct rcu_head *rcu)
208 {
209         struct hlist_node *node_tmp;
210         struct batadv_neigh_node *neigh_node;
211         struct batadv_neigh_ifinfo *neigh_ifinfo;
212         struct batadv_algo_ops *bao;
213
214         neigh_node = container_of(rcu, struct batadv_neigh_node, rcu);
215         bao = neigh_node->orig_node->bat_priv->bat_algo_ops;
216
217         hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
218                                   &neigh_node->ifinfo_list, list) {
219                 batadv_neigh_ifinfo_free_ref_now(neigh_ifinfo);
220         }
221
222         if (bao->bat_neigh_free)
223                 bao->bat_neigh_free(neigh_node);
224
225         batadv_hardif_free_ref_now(neigh_node->if_incoming);
226
227         kfree(neigh_node);
228 }
229
230 /**
231  * batadv_neigh_node_free_ref_now - decrement the neighbors refcounter
232  *  and possibly free it (without rcu callback)
233  * @neigh_node: neigh neighbor to free
234  */
235 static void
236 batadv_neigh_node_free_ref_now(struct batadv_neigh_node *neigh_node)
237 {
238         if (atomic_dec_and_test(&neigh_node->refcount))
239                 batadv_neigh_node_free_rcu(&neigh_node->rcu);
240 }
241
242 /**
243  * batadv_neigh_node_free_ref - decrement the neighbors refcounter
244  *  and possibly free it
245  * @neigh_node: neigh neighbor to free
246  */
247 void batadv_neigh_node_free_ref(struct batadv_neigh_node *neigh_node)
248 {
249         if (atomic_dec_and_test(&neigh_node->refcount))
250                 call_rcu(&neigh_node->rcu, batadv_neigh_node_free_rcu);
251 }
252
253 /**
254  * batadv_orig_node_get_router - router to the originator depending on iface
255  * @orig_node: the orig node for the router
256  * @if_outgoing: the interface where the payload packet has been received or
257  *  the OGM should be sent to
258  *
259  * Returns the neighbor which should be router for this orig_node/iface.
260  *
261  * The object is returned with refcounter increased by 1.
262  */
263 struct batadv_neigh_node *
264 batadv_orig_router_get(struct batadv_orig_node *orig_node,
265                        const struct batadv_hard_iface *if_outgoing)
266 {
267         struct batadv_orig_ifinfo *orig_ifinfo;
268         struct batadv_neigh_node *router = NULL;
269
270         rcu_read_lock();
271         hlist_for_each_entry_rcu(orig_ifinfo, &orig_node->ifinfo_list, list) {
272                 if (orig_ifinfo->if_outgoing != if_outgoing)
273                         continue;
274
275                 router = rcu_dereference(orig_ifinfo->router);
276                 break;
277         }
278
279         if (router && !atomic_inc_not_zero(&router->refcount))
280                 router = NULL;
281
282         rcu_read_unlock();
283         return router;
284 }
285
286 /**
287  * batadv_orig_ifinfo_get - find the ifinfo from an orig_node
288  * @orig_node: the orig node to be queried
289  * @if_outgoing: the interface for which the ifinfo should be acquired
290  *
291  * Returns the requested orig_ifinfo or NULL if not found.
292  *
293  * The object is returned with refcounter increased by 1.
294  */
295 struct batadv_orig_ifinfo *
296 batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node,
297                        struct batadv_hard_iface *if_outgoing)
298 {
299         struct batadv_orig_ifinfo *tmp, *orig_ifinfo = NULL;
300
301         rcu_read_lock();
302         hlist_for_each_entry_rcu(tmp, &orig_node->ifinfo_list,
303                                  list) {
304                 if (tmp->if_outgoing != if_outgoing)
305                         continue;
306
307                 if (!atomic_inc_not_zero(&tmp->refcount))
308                         continue;
309
310                 orig_ifinfo = tmp;
311                 break;
312         }
313         rcu_read_unlock();
314
315         return orig_ifinfo;
316 }
317
318 /**
319  * batadv_orig_ifinfo_new - search and possibly create an orig_ifinfo object
320  * @orig_node: the orig node to be queried
321  * @if_outgoing: the interface for which the ifinfo should be acquired
322  *
323  * Returns NULL in case of failure or the orig_ifinfo object for the if_outgoing
324  * interface otherwise. The object is created and added to the list
325  * if it does not exist.
326  *
327  * The object is returned with refcounter increased by 1.
328  */
329 struct batadv_orig_ifinfo *
330 batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
331                        struct batadv_hard_iface *if_outgoing)
332 {
333         struct batadv_orig_ifinfo *orig_ifinfo = NULL;
334         unsigned long reset_time;
335
336         spin_lock_bh(&orig_node->neigh_list_lock);
337
338         orig_ifinfo = batadv_orig_ifinfo_get(orig_node, if_outgoing);
339         if (orig_ifinfo)
340                 goto out;
341
342         orig_ifinfo = kzalloc(sizeof(*orig_ifinfo), GFP_ATOMIC);
343         if (!orig_ifinfo)
344                 goto out;
345
346         if (if_outgoing != BATADV_IF_DEFAULT &&
347             !atomic_inc_not_zero(&if_outgoing->refcount)) {
348                 kfree(orig_ifinfo);
349                 orig_ifinfo = NULL;
350                 goto out;
351         }
352
353         reset_time = jiffies - 1;
354         reset_time -= msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
355         orig_ifinfo->batman_seqno_reset = reset_time;
356         orig_ifinfo->if_outgoing = if_outgoing;
357         INIT_HLIST_NODE(&orig_ifinfo->list);
358         atomic_set(&orig_ifinfo->refcount, 2);
359         hlist_add_head_rcu(&orig_ifinfo->list,
360                            &orig_node->ifinfo_list);
361 out:
362         spin_unlock_bh(&orig_node->neigh_list_lock);
363         return orig_ifinfo;
364 }
365
366 /**
367  * batadv_neigh_ifinfo_get - find the ifinfo from an neigh_node
368  * @neigh_node: the neigh node to be queried
369  * @if_outgoing: the interface for which the ifinfo should be acquired
370  *
371  * The object is returned with refcounter increased by 1.
372  *
373  * Returns the requested neigh_ifinfo or NULL if not found
374  */
375 struct batadv_neigh_ifinfo *
376 batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh,
377                         struct batadv_hard_iface *if_outgoing)
378 {
379         struct batadv_neigh_ifinfo *neigh_ifinfo = NULL,
380                                    *tmp_neigh_ifinfo;
381
382         rcu_read_lock();
383         hlist_for_each_entry_rcu(tmp_neigh_ifinfo, &neigh->ifinfo_list,
384                                  list) {
385                 if (tmp_neigh_ifinfo->if_outgoing != if_outgoing)
386                         continue;
387
388                 if (!atomic_inc_not_zero(&tmp_neigh_ifinfo->refcount))
389                         continue;
390
391                 neigh_ifinfo = tmp_neigh_ifinfo;
392                 break;
393         }
394         rcu_read_unlock();
395
396         return neigh_ifinfo;
397 }
398
399 /**
400  * batadv_neigh_ifinfo_new - search and possibly create an neigh_ifinfo object
401  * @neigh_node: the neigh node to be queried
402  * @if_outgoing: the interface for which the ifinfo should be acquired
403  *
404  * Returns NULL in case of failure or the neigh_ifinfo object for the
405  * if_outgoing interface otherwise. The object is created and added to the list
406  * if it does not exist.
407  *
408  * The object is returned with refcounter increased by 1.
409  */
410 struct batadv_neigh_ifinfo *
411 batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
412                         struct batadv_hard_iface *if_outgoing)
413 {
414         struct batadv_neigh_ifinfo *neigh_ifinfo;
415
416         spin_lock_bh(&neigh->ifinfo_lock);
417
418         neigh_ifinfo = batadv_neigh_ifinfo_get(neigh, if_outgoing);
419         if (neigh_ifinfo)
420                 goto out;
421
422         neigh_ifinfo = kzalloc(sizeof(*neigh_ifinfo), GFP_ATOMIC);
423         if (!neigh_ifinfo)
424                 goto out;
425
426         if (if_outgoing && !atomic_inc_not_zero(&if_outgoing->refcount)) {
427                 kfree(neigh_ifinfo);
428                 neigh_ifinfo = NULL;
429                 goto out;
430         }
431
432         INIT_HLIST_NODE(&neigh_ifinfo->list);
433         atomic_set(&neigh_ifinfo->refcount, 2);
434         neigh_ifinfo->if_outgoing = if_outgoing;
435
436         hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list);
437
438 out:
439         spin_unlock_bh(&neigh->ifinfo_lock);
440
441         return neigh_ifinfo;
442 }
443
444 /**
445  * batadv_neigh_node_new - create and init a new neigh_node object
446  * @hard_iface: the interface where the neighbour is connected to
447  * @neigh_addr: the mac address of the neighbour interface
448  * @orig_node: originator object representing the neighbour
449  *
450  * Allocates a new neigh_node object and initialises all the generic fields.
451  * Returns the new object or NULL on failure.
452  */
453 struct batadv_neigh_node *
454 batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,
455                       const uint8_t *neigh_addr,
456                       struct batadv_orig_node *orig_node)
457 {
458         struct batadv_neigh_node *neigh_node;
459
460         neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC);
461         if (!neigh_node)
462                 goto out;
463
464         INIT_HLIST_NODE(&neigh_node->list);
465         INIT_HLIST_HEAD(&neigh_node->ifinfo_list);
466         spin_lock_init(&neigh_node->ifinfo_lock);
467
468         ether_addr_copy(neigh_node->addr, neigh_addr);
469         neigh_node->if_incoming = hard_iface;
470         neigh_node->orig_node = orig_node;
471
472         /* extra reference for return */
473         atomic_set(&neigh_node->refcount, 2);
474
475 out:
476         return neigh_node;
477 }
478
479 /**
480  * batadv_neigh_node_get - retrieve a neighbour from the list
481  * @orig_node: originator which the neighbour belongs to
482  * @hard_iface: the interface where this neighbour is connected to
483  * @addr: the address of the neighbour
484  *
485  * Looks for and possibly returns a neighbour belonging to this originator list
486  * which is connected through the provided hard interface.
487  * Returns NULL if the neighbour is not found.
488  */
489 struct batadv_neigh_node *
490 batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
491                       const struct batadv_hard_iface *hard_iface,
492                       const uint8_t *addr)
493 {
494         struct batadv_neigh_node *tmp_neigh_node, *res = NULL;
495
496         rcu_read_lock();
497         hlist_for_each_entry_rcu(tmp_neigh_node, &orig_node->neigh_list, list) {
498                 if (!batadv_compare_eth(tmp_neigh_node->addr, addr))
499                         continue;
500
501                 if (tmp_neigh_node->if_incoming != hard_iface)
502                         continue;
503
504                 if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
505                         continue;
506
507                 res = tmp_neigh_node;
508                 break;
509         }
510         rcu_read_unlock();
511
512         return res;
513 }
514
515 /**
516  * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object
517  * @rcu: rcu pointer of the orig_ifinfo object
518  */
519 static void batadv_orig_ifinfo_free_rcu(struct rcu_head *rcu)
520 {
521         struct batadv_orig_ifinfo *orig_ifinfo;
522         struct batadv_neigh_node *router;
523
524         orig_ifinfo = container_of(rcu, struct batadv_orig_ifinfo, rcu);
525
526         if (orig_ifinfo->if_outgoing != BATADV_IF_DEFAULT)
527                 batadv_hardif_free_ref_now(orig_ifinfo->if_outgoing);
528
529         /* this is the last reference to this object */
530         router = rcu_dereference_protected(orig_ifinfo->router, true);
531         if (router)
532                 batadv_neigh_node_free_ref_now(router);
533         kfree(orig_ifinfo);
534 }
535
536 /**
537  * batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly free
538  *  the orig_ifinfo (without rcu callback)
539  * @orig_ifinfo: the orig_ifinfo object to release
540  */
541 static void
542 batadv_orig_ifinfo_free_ref_now(struct batadv_orig_ifinfo *orig_ifinfo)
543 {
544         if (atomic_dec_and_test(&orig_ifinfo->refcount))
545                 batadv_orig_ifinfo_free_rcu(&orig_ifinfo->rcu);
546 }
547
548 /**
549  * batadv_orig_ifinfo_free_ref - decrement the refcounter and possibly free
550  *  the orig_ifinfo
551  * @orig_ifinfo: the orig_ifinfo object to release
552  */
553 void batadv_orig_ifinfo_free_ref(struct batadv_orig_ifinfo *orig_ifinfo)
554 {
555         if (atomic_dec_and_test(&orig_ifinfo->refcount))
556                 call_rcu(&orig_ifinfo->rcu, batadv_orig_ifinfo_free_rcu);
557 }
558
559 static void batadv_orig_node_free_rcu(struct rcu_head *rcu)
560 {
561         struct hlist_node *node_tmp;
562         struct batadv_neigh_node *neigh_node;
563         struct batadv_orig_node *orig_node;
564         struct batadv_orig_ifinfo *orig_ifinfo;
565
566         orig_node = container_of(rcu, struct batadv_orig_node, rcu);
567
568         spin_lock_bh(&orig_node->neigh_list_lock);
569
570         /* for all neighbors towards this originator ... */
571         hlist_for_each_entry_safe(neigh_node, node_tmp,
572                                   &orig_node->neigh_list, list) {
573                 hlist_del_rcu(&neigh_node->list);
574                 batadv_neigh_node_free_ref_now(neigh_node);
575         }
576
577         hlist_for_each_entry_safe(orig_ifinfo, node_tmp,
578                                   &orig_node->ifinfo_list, list) {
579                 hlist_del_rcu(&orig_ifinfo->list);
580                 batadv_orig_ifinfo_free_ref_now(orig_ifinfo);
581         }
582         spin_unlock_bh(&orig_node->neigh_list_lock);
583
584         batadv_mcast_purge_orig(orig_node);
585
586         /* Free nc_nodes */
587         batadv_nc_purge_orig(orig_node->bat_priv, orig_node, NULL);
588
589         batadv_frag_purge_orig(orig_node, NULL);
590
591         if (orig_node->bat_priv->bat_algo_ops->bat_orig_free)
592                 orig_node->bat_priv->bat_algo_ops->bat_orig_free(orig_node);
593
594         kfree(orig_node->tt_buff);
595         kfree(orig_node);
596 }
597
598 /**
599  * batadv_orig_node_free_ref - decrement the orig node refcounter and possibly
600  * schedule an rcu callback for freeing it
601  * @orig_node: the orig node to free
602  */
603 void batadv_orig_node_free_ref(struct batadv_orig_node *orig_node)
604 {
605         if (atomic_dec_and_test(&orig_node->refcount))
606                 call_rcu(&orig_node->rcu, batadv_orig_node_free_rcu);
607 }
608
609 /**
610  * batadv_orig_node_free_ref_now - decrement the orig node refcounter and
611  * possibly free it (without rcu callback)
612  * @orig_node: the orig node to free
613  */
614 void batadv_orig_node_free_ref_now(struct batadv_orig_node *orig_node)
615 {
616         if (atomic_dec_and_test(&orig_node->refcount))
617                 batadv_orig_node_free_rcu(&orig_node->rcu);
618 }
619
620 void batadv_originator_free(struct batadv_priv *bat_priv)
621 {
622         struct batadv_hashtable *hash = bat_priv->orig_hash;
623         struct hlist_node *node_tmp;
624         struct hlist_head *head;
625         spinlock_t *list_lock; /* spinlock to protect write access */
626         struct batadv_orig_node *orig_node;
627         uint32_t i;
628
629         if (!hash)
630                 return;
631
632         cancel_delayed_work_sync(&bat_priv->orig_work);
633
634         bat_priv->orig_hash = NULL;
635
636         for (i = 0; i < hash->size; i++) {
637                 head = &hash->table[i];
638                 list_lock = &hash->list_locks[i];
639
640                 spin_lock_bh(list_lock);
641                 hlist_for_each_entry_safe(orig_node, node_tmp,
642                                           head, hash_entry) {
643                         hlist_del_rcu(&orig_node->hash_entry);
644                         batadv_orig_node_free_ref(orig_node);
645                 }
646                 spin_unlock_bh(list_lock);
647         }
648
649         batadv_hash_destroy(hash);
650 }
651
652 /**
653  * batadv_orig_node_new - creates a new orig_node
654  * @bat_priv: the bat priv with all the soft interface information
655  * @addr: the mac address of the originator
656  *
657  * Creates a new originator object and initialise all the generic fields.
658  * The new object is not added to the originator list.
659  * Returns the newly created object or NULL on failure.
660  */
661 struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
662                                               const uint8_t *addr)
663 {
664         struct batadv_orig_node *orig_node;
665         struct batadv_orig_node_vlan *vlan;
666         unsigned long reset_time;
667         int i;
668
669         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
670                    "Creating new originator: %pM\n", addr);
671
672         orig_node = kzalloc(sizeof(*orig_node), GFP_ATOMIC);
673         if (!orig_node)
674                 return NULL;
675
676         INIT_HLIST_HEAD(&orig_node->neigh_list);
677         INIT_LIST_HEAD(&orig_node->vlan_list);
678         INIT_HLIST_HEAD(&orig_node->ifinfo_list);
679         spin_lock_init(&orig_node->bcast_seqno_lock);
680         spin_lock_init(&orig_node->neigh_list_lock);
681         spin_lock_init(&orig_node->tt_buff_lock);
682         spin_lock_init(&orig_node->tt_lock);
683         spin_lock_init(&orig_node->vlan_list_lock);
684
685         batadv_nc_init_orig(orig_node);
686
687         /* extra reference for return */
688         atomic_set(&orig_node->refcount, 2);
689
690         orig_node->bat_priv = bat_priv;
691         ether_addr_copy(orig_node->orig, addr);
692         batadv_dat_init_orig_node_addr(orig_node);
693         atomic_set(&orig_node->last_ttvn, 0);
694         orig_node->tt_buff = NULL;
695         orig_node->tt_buff_len = 0;
696         orig_node->last_seen = jiffies;
697         reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
698         orig_node->bcast_seqno_reset = reset_time;
699
700 #ifdef CONFIG_BATMAN_ADV_MCAST
701         orig_node->mcast_flags = BATADV_NO_FLAGS;
702         INIT_HLIST_NODE(&orig_node->mcast_want_all_unsnoopables_node);
703         INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv4_node);
704         INIT_HLIST_NODE(&orig_node->mcast_want_all_ipv6_node);
705         spin_lock_init(&orig_node->mcast_handler_lock);
706 #endif
707
708         /* create a vlan object for the "untagged" LAN */
709         vlan = batadv_orig_node_vlan_new(orig_node, BATADV_NO_FLAGS);
710         if (!vlan)
711                 goto free_orig_node;
712         /* batadv_orig_node_vlan_new() increases the refcounter.
713          * Immediately release vlan since it is not needed anymore in this
714          * context
715          */
716         batadv_orig_node_vlan_free_ref(vlan);
717
718         for (i = 0; i < BATADV_FRAG_BUFFER_COUNT; i++) {
719                 INIT_HLIST_HEAD(&orig_node->fragments[i].head);
720                 spin_lock_init(&orig_node->fragments[i].lock);
721                 orig_node->fragments[i].size = 0;
722         }
723
724         return orig_node;
725 free_orig_node:
726         kfree(orig_node);
727         return NULL;
728 }
729
730 /**
731  * batadv_purge_neigh_ifinfo - purge obsolete ifinfo entries from neighbor
732  * @bat_priv: the bat priv with all the soft interface information
733  * @neigh: orig node which is to be checked
734  */
735 static void
736 batadv_purge_neigh_ifinfo(struct batadv_priv *bat_priv,
737                           struct batadv_neigh_node *neigh)
738 {
739         struct batadv_neigh_ifinfo *neigh_ifinfo;
740         struct batadv_hard_iface *if_outgoing;
741         struct hlist_node *node_tmp;
742
743         spin_lock_bh(&neigh->ifinfo_lock);
744
745         /* for all ifinfo objects for this neighinator */
746         hlist_for_each_entry_safe(neigh_ifinfo, node_tmp,
747                                   &neigh->ifinfo_list, list) {
748                 if_outgoing = neigh_ifinfo->if_outgoing;
749
750                 /* always keep the default interface */
751                 if (if_outgoing == BATADV_IF_DEFAULT)
752                         continue;
753
754                 /* don't purge if the interface is not (going) down */
755                 if ((if_outgoing->if_status != BATADV_IF_INACTIVE) &&
756                     (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) &&
757                     (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED))
758                         continue;
759
760                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
761                            "neighbor/ifinfo purge: neighbor %pM, iface: %s\n",
762                            neigh->addr, if_outgoing->net_dev->name);
763
764                 hlist_del_rcu(&neigh_ifinfo->list);
765                 batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
766         }
767
768         spin_unlock_bh(&neigh->ifinfo_lock);
769 }
770
771 /**
772  * batadv_purge_orig_ifinfo - purge obsolete ifinfo entries from originator
773  * @bat_priv: the bat priv with all the soft interface information
774  * @orig_node: orig node which is to be checked
775  *
776  * Returns true if any ifinfo entry was purged, false otherwise.
777  */
778 static bool
779 batadv_purge_orig_ifinfo(struct batadv_priv *bat_priv,
780                          struct batadv_orig_node *orig_node)
781 {
782         struct batadv_orig_ifinfo *orig_ifinfo;
783         struct batadv_hard_iface *if_outgoing;
784         struct hlist_node *node_tmp;
785         bool ifinfo_purged = false;
786
787         spin_lock_bh(&orig_node->neigh_list_lock);
788
789         /* for all ifinfo objects for this originator */
790         hlist_for_each_entry_safe(orig_ifinfo, node_tmp,
791                                   &orig_node->ifinfo_list, list) {
792                 if_outgoing = orig_ifinfo->if_outgoing;
793
794                 /* always keep the default interface */
795                 if (if_outgoing == BATADV_IF_DEFAULT)
796                         continue;
797
798                 /* don't purge if the interface is not (going) down */
799                 if ((if_outgoing->if_status != BATADV_IF_INACTIVE) &&
800                     (if_outgoing->if_status != BATADV_IF_NOT_IN_USE) &&
801                     (if_outgoing->if_status != BATADV_IF_TO_BE_REMOVED))
802                         continue;
803
804                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
805                            "router/ifinfo purge: originator %pM, iface: %s\n",
806                            orig_node->orig, if_outgoing->net_dev->name);
807
808                 ifinfo_purged = true;
809
810                 hlist_del_rcu(&orig_ifinfo->list);
811                 batadv_orig_ifinfo_free_ref(orig_ifinfo);
812                 if (orig_node->last_bonding_candidate == orig_ifinfo) {
813                         orig_node->last_bonding_candidate = NULL;
814                         batadv_orig_ifinfo_free_ref(orig_ifinfo);
815                 }
816         }
817
818         spin_unlock_bh(&orig_node->neigh_list_lock);
819
820         return ifinfo_purged;
821 }
822
823 /**
824  * batadv_purge_orig_neighbors - purges neighbors from originator
825  * @bat_priv: the bat priv with all the soft interface information
826  * @orig_node: orig node which is to be checked
827  *
828  * Returns true if any neighbor was purged, false otherwise
829  */
830 static bool
831 batadv_purge_orig_neighbors(struct batadv_priv *bat_priv,
832                             struct batadv_orig_node *orig_node)
833 {
834         struct hlist_node *node_tmp;
835         struct batadv_neigh_node *neigh_node;
836         bool neigh_purged = false;
837         unsigned long last_seen;
838         struct batadv_hard_iface *if_incoming;
839
840         spin_lock_bh(&orig_node->neigh_list_lock);
841
842         /* for all neighbors towards this originator ... */
843         hlist_for_each_entry_safe(neigh_node, node_tmp,
844                                   &orig_node->neigh_list, list) {
845                 last_seen = neigh_node->last_seen;
846                 if_incoming = neigh_node->if_incoming;
847
848                 if ((batadv_has_timed_out(last_seen, BATADV_PURGE_TIMEOUT)) ||
849                     (if_incoming->if_status == BATADV_IF_INACTIVE) ||
850                     (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
851                     (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED)) {
852                         if ((if_incoming->if_status == BATADV_IF_INACTIVE) ||
853                             (if_incoming->if_status == BATADV_IF_NOT_IN_USE) ||
854                             (if_incoming->if_status == BATADV_IF_TO_BE_REMOVED))
855                                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
856                                            "neighbor purge: originator %pM, neighbor: %pM, iface: %s\n",
857                                            orig_node->orig, neigh_node->addr,
858                                            if_incoming->net_dev->name);
859                         else
860                                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
861                                            "neighbor timeout: originator %pM, neighbor: %pM, last_seen: %u\n",
862                                            orig_node->orig, neigh_node->addr,
863                                            jiffies_to_msecs(last_seen));
864
865                         neigh_purged = true;
866
867                         hlist_del_rcu(&neigh_node->list);
868                         batadv_neigh_node_free_ref(neigh_node);
869                 } else {
870                         /* only necessary if not the whole neighbor is to be
871                          * deleted, but some interface has been removed.
872                          */
873                         batadv_purge_neigh_ifinfo(bat_priv, neigh_node);
874                 }
875         }
876
877         spin_unlock_bh(&orig_node->neigh_list_lock);
878         return neigh_purged;
879 }
880
881 /**
882  * batadv_find_best_neighbor - finds the best neighbor after purging
883  * @bat_priv: the bat priv with all the soft interface information
884  * @orig_node: orig node which is to be checked
885  * @if_outgoing: the interface for which the metric should be compared
886  *
887  * Returns the current best neighbor, with refcount increased.
888  */
889 static struct batadv_neigh_node *
890 batadv_find_best_neighbor(struct batadv_priv *bat_priv,
891                           struct batadv_orig_node *orig_node,
892                           struct batadv_hard_iface *if_outgoing)
893 {
894         struct batadv_neigh_node *best = NULL, *neigh;
895         struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
896
897         rcu_read_lock();
898         hlist_for_each_entry_rcu(neigh, &orig_node->neigh_list, list) {
899                 if (best && (bao->bat_neigh_cmp(neigh, if_outgoing,
900                                                 best, if_outgoing) <= 0))
901                         continue;
902
903                 if (!atomic_inc_not_zero(&neigh->refcount))
904                         continue;
905
906                 if (best)
907                         batadv_neigh_node_free_ref(best);
908
909                 best = neigh;
910         }
911         rcu_read_unlock();
912
913         return best;
914 }
915
916 /**
917  * batadv_purge_orig_node - purges obsolete information from an orig_node
918  * @bat_priv: the bat priv with all the soft interface information
919  * @orig_node: orig node which is to be checked
920  *
921  * This function checks if the orig_node or substructures of it have become
922  * obsolete, and purges this information if that's the case.
923  *
924  * Returns true if the orig_node is to be removed, false otherwise.
925  */
926 static bool batadv_purge_orig_node(struct batadv_priv *bat_priv,
927                                    struct batadv_orig_node *orig_node)
928 {
929         struct batadv_neigh_node *best_neigh_node;
930         struct batadv_hard_iface *hard_iface;
931         bool changed_ifinfo, changed_neigh;
932
933         if (batadv_has_timed_out(orig_node->last_seen,
934                                  2 * BATADV_PURGE_TIMEOUT)) {
935                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
936                            "Originator timeout: originator %pM, last_seen %u\n",
937                            orig_node->orig,
938                            jiffies_to_msecs(orig_node->last_seen));
939                 return true;
940         }
941         changed_ifinfo = batadv_purge_orig_ifinfo(bat_priv, orig_node);
942         changed_neigh = batadv_purge_orig_neighbors(bat_priv, orig_node);
943
944         if (!changed_ifinfo && !changed_neigh)
945                 return false;
946
947         /* first for NULL ... */
948         best_neigh_node = batadv_find_best_neighbor(bat_priv, orig_node,
949                                                     BATADV_IF_DEFAULT);
950         batadv_update_route(bat_priv, orig_node, BATADV_IF_DEFAULT,
951                             best_neigh_node);
952         if (best_neigh_node)
953                 batadv_neigh_node_free_ref(best_neigh_node);
954
955         /* ... then for all other interfaces. */
956         rcu_read_lock();
957         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
958                 if (hard_iface->if_status != BATADV_IF_ACTIVE)
959                         continue;
960
961                 if (hard_iface->soft_iface != bat_priv->soft_iface)
962                         continue;
963
964                 best_neigh_node = batadv_find_best_neighbor(bat_priv,
965                                                             orig_node,
966                                                             hard_iface);
967                 batadv_update_route(bat_priv, orig_node, hard_iface,
968                                     best_neigh_node);
969                 if (best_neigh_node)
970                         batadv_neigh_node_free_ref(best_neigh_node);
971         }
972         rcu_read_unlock();
973
974         return false;
975 }
976
977 static void _batadv_purge_orig(struct batadv_priv *bat_priv)
978 {
979         struct batadv_hashtable *hash = bat_priv->orig_hash;
980         struct hlist_node *node_tmp;
981         struct hlist_head *head;
982         spinlock_t *list_lock; /* spinlock to protect write access */
983         struct batadv_orig_node *orig_node;
984         uint32_t i;
985
986         if (!hash)
987                 return;
988
989         /* for all origins... */
990         for (i = 0; i < hash->size; i++) {
991                 head = &hash->table[i];
992                 list_lock = &hash->list_locks[i];
993
994                 spin_lock_bh(list_lock);
995                 hlist_for_each_entry_safe(orig_node, node_tmp,
996                                           head, hash_entry) {
997                         if (batadv_purge_orig_node(bat_priv, orig_node)) {
998                                 batadv_gw_node_delete(bat_priv, orig_node);
999                                 hlist_del_rcu(&orig_node->hash_entry);
1000                                 batadv_tt_global_del_orig(orig_node->bat_priv,
1001                                                           orig_node, -1,
1002                                                           "originator timed out");
1003                                 batadv_orig_node_free_ref(orig_node);
1004                                 continue;
1005                         }
1006
1007                         batadv_frag_purge_orig(orig_node,
1008                                                batadv_frag_check_entry);
1009                 }
1010                 spin_unlock_bh(list_lock);
1011         }
1012
1013         batadv_gw_node_purge(bat_priv);
1014         batadv_gw_election(bat_priv);
1015 }
1016
1017 static void batadv_purge_orig(struct work_struct *work)
1018 {
1019         struct delayed_work *delayed_work;
1020         struct batadv_priv *bat_priv;
1021
1022         delayed_work = container_of(work, struct delayed_work, work);
1023         bat_priv = container_of(delayed_work, struct batadv_priv, orig_work);
1024         _batadv_purge_orig(bat_priv);
1025         queue_delayed_work(batadv_event_workqueue,
1026                            &bat_priv->orig_work,
1027                            msecs_to_jiffies(BATADV_ORIG_WORK_PERIOD));
1028 }
1029
1030 void batadv_purge_orig_ref(struct batadv_priv *bat_priv)
1031 {
1032         _batadv_purge_orig(bat_priv);
1033 }
1034
1035 int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
1036 {
1037         struct net_device *net_dev = (struct net_device *)seq->private;
1038         struct batadv_priv *bat_priv = netdev_priv(net_dev);
1039         struct batadv_hard_iface *primary_if;
1040
1041         primary_if = batadv_seq_print_text_primary_if_get(seq);
1042         if (!primary_if)
1043                 return 0;
1044
1045         seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n",
1046                    BATADV_SOURCE_VERSION, primary_if->net_dev->name,
1047                    primary_if->net_dev->dev_addr, net_dev->name,
1048                    bat_priv->bat_algo_ops->name);
1049
1050         batadv_hardif_free_ref(primary_if);
1051
1052         if (!bat_priv->bat_algo_ops->bat_orig_print) {
1053                 seq_puts(seq,
1054                          "No printing function for this routing protocol\n");
1055                 return 0;
1056         }
1057
1058         bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq,
1059                                                BATADV_IF_DEFAULT);
1060
1061         return 0;
1062 }
1063
1064 /**
1065  * batadv_orig_hardif_seq_print_text - writes originator infos for a specific
1066  *  outgoing interface
1067  * @seq: debugfs table seq_file struct
1068  * @offset: not used
1069  *
1070  * Returns 0
1071  */
1072 int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset)
1073 {
1074         struct net_device *net_dev = (struct net_device *)seq->private;
1075         struct batadv_hard_iface *hard_iface;
1076         struct batadv_priv *bat_priv;
1077
1078         hard_iface = batadv_hardif_get_by_netdev(net_dev);
1079
1080         if (!hard_iface || !hard_iface->soft_iface) {
1081                 seq_puts(seq, "Interface not known to B.A.T.M.A.N.\n");
1082                 goto out;
1083         }
1084
1085         bat_priv = netdev_priv(hard_iface->soft_iface);
1086         if (!bat_priv->bat_algo_ops->bat_orig_print) {
1087                 seq_puts(seq,
1088                          "No printing function for this routing protocol\n");
1089                 goto out;
1090         }
1091
1092         if (hard_iface->if_status != BATADV_IF_ACTIVE) {
1093                 seq_puts(seq, "Interface not active\n");
1094                 goto out;
1095         }
1096
1097         seq_printf(seq, "[B.A.T.M.A.N. adv %s, IF/MAC: %s/%pM (%s %s)]\n",
1098                    BATADV_SOURCE_VERSION, hard_iface->net_dev->name,
1099                    hard_iface->net_dev->dev_addr,
1100                    hard_iface->soft_iface->name, bat_priv->bat_algo_ops->name);
1101
1102         bat_priv->bat_algo_ops->bat_orig_print(bat_priv, seq, hard_iface);
1103
1104 out:
1105         if (hard_iface)
1106                 batadv_hardif_free_ref(hard_iface);
1107         return 0;
1108 }
1109
1110 int batadv_orig_hash_add_if(struct batadv_hard_iface *hard_iface,
1111                             int max_if_num)
1112 {
1113         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
1114         struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
1115         struct batadv_hashtable *hash = bat_priv->orig_hash;
1116         struct hlist_head *head;
1117         struct batadv_orig_node *orig_node;
1118         uint32_t i;
1119         int ret;
1120
1121         /* resize all orig nodes because orig_node->bcast_own(_sum) depend on
1122          * if_num
1123          */
1124         for (i = 0; i < hash->size; i++) {
1125                 head = &hash->table[i];
1126
1127                 rcu_read_lock();
1128                 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1129                         ret = 0;
1130                         if (bao->bat_orig_add_if)
1131                                 ret = bao->bat_orig_add_if(orig_node,
1132                                                            max_if_num);
1133                         if (ret == -ENOMEM)
1134                                 goto err;
1135                 }
1136                 rcu_read_unlock();
1137         }
1138
1139         return 0;
1140
1141 err:
1142         rcu_read_unlock();
1143         return -ENOMEM;
1144 }
1145
1146 int batadv_orig_hash_del_if(struct batadv_hard_iface *hard_iface,
1147                             int max_if_num)
1148 {
1149         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
1150         struct batadv_hashtable *hash = bat_priv->orig_hash;
1151         struct hlist_head *head;
1152         struct batadv_hard_iface *hard_iface_tmp;
1153         struct batadv_orig_node *orig_node;
1154         struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
1155         uint32_t i;
1156         int ret;
1157
1158         /* resize all orig nodes because orig_node->bcast_own(_sum) depend on
1159          * if_num
1160          */
1161         for (i = 0; i < hash->size; i++) {
1162                 head = &hash->table[i];
1163
1164                 rcu_read_lock();
1165                 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1166                         ret = 0;
1167                         if (bao->bat_orig_del_if)
1168                                 ret = bao->bat_orig_del_if(orig_node,
1169                                                            max_if_num,
1170                                                            hard_iface->if_num);
1171                         if (ret == -ENOMEM)
1172                                 goto err;
1173                 }
1174                 rcu_read_unlock();
1175         }
1176
1177         /* renumber remaining batman interfaces _inside_ of orig_hash_lock */
1178         rcu_read_lock();
1179         list_for_each_entry_rcu(hard_iface_tmp, &batadv_hardif_list, list) {
1180                 if (hard_iface_tmp->if_status == BATADV_IF_NOT_IN_USE)
1181                         continue;
1182
1183                 if (hard_iface == hard_iface_tmp)
1184                         continue;
1185
1186                 if (hard_iface->soft_iface != hard_iface_tmp->soft_iface)
1187                         continue;
1188
1189                 if (hard_iface_tmp->if_num > hard_iface->if_num)
1190                         hard_iface_tmp->if_num--;
1191         }
1192         rcu_read_unlock();
1193
1194         hard_iface->if_num = -1;
1195         return 0;
1196
1197 err:
1198         rcu_read_unlock();
1199         return -ENOMEM;
1200 }