FIX: segfault during neightable timer cleanup
[olsrd.git] / src / neighbor_table.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42
43 #ifndef _OLSR_NEIGH_TBL
44 #define _OLSR_NEIGH_TBL
45
46 #include "defs.h"
47 #include "olsr_types.h"
48 #include "common/avl.h"
49
50 /*
51  * This is a neighbor2 list entry.
52  * It is used to describe a set of references to two-hop neighbors.
53  * This AVL tree node is hanging off an nbr_entry.
54  */
55 struct nbr2_list_entry {
56   struct avl_node nbr2_list_node;
57   struct nbr_entry *nbr2_nbr;          /* backpointer to owning nbr entry */
58   struct neighbor_2_entry *neighbor_2;
59 };
60
61 AVLNODE2STRUCT(nbr2_list_node_to_nbr2_list, struct nbr2_list_entry, nbr2_list_node);
62
63 #define OLSR_NBR2_LIST_JITTER 5 /* percent */
64
65 struct nbr_entry {
66   struct avl_node nbr_node;            /* nbr keyed by ip address */
67   union olsr_ip_addr neighbor_main_addr;
68   unsigned int status:3;
69   unsigned int willingness:3;
70   unsigned int is_mpr:1;
71   unsigned int was_mpr:1;              /* Used to detect changes in MPR */
72   unsigned int skip:1;
73   int neighbor_2_nocov;
74   unsigned int linkcount;
75   struct avl_tree nbr2_list_tree;      /* subtree for nbr2 pointers */
76 } __attribute__ ((packed));
77
78 AVLNODE2STRUCT(nbr_node_to_nbr, struct nbr_entry, nbr_node);
79
80 /*
81  * macros for traversing neighbors and neighbor2 ref lists.
82  * it is recommended to use this because it hides all the internal
83  * datastructure from the callers.
84  *
85  * the loop prefetches the next node in order to not loose context if
86  * for example the caller wants to delete the current entry.
87  */
88 #define OLSR_FOR_ALL_NBR_ENTRIES(nbr) \
89 { \
90   struct avl_node *nbr_tree_node, *next_nbr_tree_node; \
91   for (nbr_tree_node = avl_walk_first(&nbr_tree); \
92     nbr_tree_node; nbr_tree_node = next_nbr_tree_node) { \
93     next_nbr_tree_node = avl_walk_next(nbr_tree_node); \
94     nbr = nbr_node_to_nbr(nbr_tree_node);
95 #define OLSR_FOR_ALL_NBR_ENTRIES_END(nbr) }}
96
97 #define OLSR_FOR_ALL_NBR2_LIST_ENTRIES(nbr, nbr2_list) \
98 { \
99   struct avl_node *nbr2_list_node, *next_nbr2_list_node; \
100   for (nbr2_list_node = avl_walk_first(&nbr->nbr2_list_tree); \
101     nbr2_list_node; nbr2_list_node = next_nbr2_list_node) { \
102     next_nbr2_list_node = avl_walk_next(nbr2_list_node); \
103     nbr2_list = nbr2_list_node_to_nbr2_list(nbr2_list_node);
104 #define OLSR_FOR_ALL_NBR2_LIST_ENTRIES_END(nbr, nbr2_list) }}
105
106 /*
107  * The one hop neighbor tree
108  */
109 extern struct avl_tree EXPORT(nbr_tree);
110 extern struct olsr_cookie_info *nbr2_list_timer_cookie;
111
112 void olsr_init_neighbor_table(void);
113 bool olsr_delete_nbr2_list_entry_by_addr(struct nbr_entry *, union olsr_ip_addr *);
114 struct nbr2_list_entry *olsr_lookup_nbr2_list_entry(struct nbr_entry *, const union olsr_ip_addr *);
115 struct nbr2_list_entry *olsr_add_nbr2_list_entry(struct nbr_entry *, struct neighbor_2_entry *, float);
116 bool olsr_delete_nbr_entry(const union olsr_ip_addr *);
117 void olsr_link_nbr_nbr2(struct nbr_entry *, struct neighbor_2_entry *, float);
118 struct nbr_entry *olsr_add_nbr_entry(const union olsr_ip_addr *);
119 struct nbr_entry *olsr_lookup_nbr_entry(const union olsr_ip_addr *);
120 struct nbr_entry *olsr_lookup_nbr_entry_alias(const union olsr_ip_addr *);
121 void olsr_time_out_two_hop_neighbors(struct nbr_entry *);
122 void olsr_expire_nbr2_list(void *);
123 void olsr_print_neighbor_table(void);
124 int olsr_update_nbr_status(struct nbr_entry *, int);
125
126 #endif /* OLSR_NEIGH_TBL */
127
128 /*
129  * Local Variables:
130  * c-basic-offset: 2
131  * indent-tabs-mode: nil
132  * End:
133  */