f27ed38599d8bf31d880a8c0256195f7826deedd
[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   struct timer_entry *nbr2_list_timer;
60 };
61
62 AVLNODE2STRUCT(nbr2_list_node_to_nbr2_list, struct nbr2_list_entry, nbr2_list_node);
63
64 #define OLSR_NBR2_LIST_JITTER 5 /* percent */
65
66 struct nbr_entry {
67   struct avl_node nbr_node;            /* nbr keyed by ip address */
68   union olsr_ip_addr neighbor_main_addr;
69   unsigned int status:3;
70   unsigned int willingness:3;
71   unsigned int is_mpr:1;
72   unsigned int was_mpr:1;              /* Used to detect changes in MPR */
73   unsigned int skip:1;
74   int neighbor_2_nocov;
75   unsigned int linkcount;
76   struct avl_tree nbr2_list_tree;      /* subtree for nbr2 pointers */
77 } __attribute__ ((packed));
78
79 AVLNODE2STRUCT(nbr_node_to_nbr, struct nbr_entry, nbr_node);
80
81 /*
82  * macros for traversing neighbors and neighbor2 ref lists.
83  * it is recommended to use this because it hides all the internal
84  * datastructure from the callers.
85  *
86  * the loop prefetches the next node in order to not loose context if
87  * for example the caller wants to delete the current entry.
88  */
89 #define OLSR_FOR_ALL_NBR_ENTRIES(nbr) \
90 { \
91   struct avl_node *nbr_tree_node, *next_nbr_tree_node; \
92   for (nbr_tree_node = avl_walk_first(&nbr_tree); \
93     nbr_tree_node; nbr_tree_node = next_nbr_tree_node) { \
94     next_nbr_tree_node = avl_walk_next(nbr_tree_node); \
95     nbr = nbr_node_to_nbr(nbr_tree_node);
96 #define OLSR_FOR_ALL_NBR_ENTRIES_END(nbr) }}
97
98 #define OLSR_FOR_ALL_NBR2_LIST_ENTRIES(nbr, nbr2_list) \
99 { \
100   struct avl_node *nbr2_list_node, *next_nbr2_list_node; \
101   for (nbr2_list_node = avl_walk_first(&nbr->nbr2_list_tree); \
102     nbr2_list_node; nbr2_list_node = next_nbr2_list_node) { \
103     next_nbr2_list_node = avl_walk_next(nbr2_list_node); \
104     nbr2_list = nbr2_list_node_to_nbr2_list(nbr2_list_node);
105 #define OLSR_FOR_ALL_NBR2_LIST_ENTRIES_END(nbr, nbr2_list) }}
106
107 /*
108  * The one hop neighbor tree
109  */
110 extern struct avl_tree EXPORT(nbr_tree);
111 extern struct olsr_cookie_info *nbr2_list_timer_cookie;
112
113 void olsr_init_neighbor_table(void);
114 bool olsr_delete_nbr2_list_entry_by_addr(struct nbr_entry *, union olsr_ip_addr *);
115 struct nbr2_list_entry *olsr_lookup_nbr2_list_entry(struct nbr_entry *, const union olsr_ip_addr *);
116 struct nbr2_list_entry *olsr_add_nbr2_list_entry(struct nbr_entry *, struct neighbor_2_entry *, float);
117 bool olsr_delete_nbr_entry(const union olsr_ip_addr *);
118 void olsr_link_nbr_nbr2(struct nbr_entry *, struct neighbor_2_entry *, float);
119 struct nbr_entry *olsr_add_nbr_entry(const union olsr_ip_addr *);
120 struct nbr_entry *olsr_lookup_nbr_entry(const union olsr_ip_addr *);
121 struct nbr_entry *olsr_lookup_nbr_entry_alias(const union olsr_ip_addr *);
122 void olsr_time_out_two_hop_neighbors(struct nbr_entry *);
123 void olsr_expire_nbr2_list(void *);
124 void olsr_print_neighbor_table(void);
125 int olsr_update_nbr_status(struct nbr_entry *, int);
126
127 #endif /* OLSR_NEIGH_TBL */
128
129 /*
130  * Local Variables:
131  * c-basic-offset: 2
132  * indent-tabs-mode: nil
133  * End:
134  */