Remove the olsr-specific duplicated types
[olsrd.git] / src / mpr_selector_set.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions 
8  * are met:
9  *
10  * * Redistributions of source code must retain the above copyright 
11  *   notice, this list of conditions and the following disclaimer.
12  * * Redistributions in binary form must reproduce the above copyright 
13  *   notice, this list of conditions and the following disclaimer in 
14  *   the documentation and/or other materials provided with the 
15  *   distribution.
16  * * Neither the name of olsr.org, olsrd nor the names of its 
17  *   contributors may be used to endorse or promote products derived 
18  *   from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
24  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
28  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
30  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  * Visit http://www.olsr.org for more information.
34  *
35  * If you find this software useful feel free to make a donation
36  * to the project. For more information see the website or contact
37  * the copyright holders.
38  *
39  */
40 #include "mpr_selector_set.h"
41 #include "link_set.h"
42 #include "olsr.h"
43
44 #define OLSR_MPR_SEL_JITTER 5 /* percent */
45
46 uint16_t ansn = 0;
47
48 static struct olsr_cookie_info *mpr_sel_timer_cookie;
49
50 /* MPR selector list */
51 static struct list_node mprs_list_head;
52
53 /* inline to recast from link_list back to link_entry */
54 LISTNODE2STRUCT(list2mpr, struct mpr_selector, mprs_list);
55
56 #define FOR_ALL_MPRS_ENTRIES(elem)      \
57 { \
58   struct list_node *elem_node, *next_elem_node; \
59   for (elem_node = mprs_list_head.next;                  \
60        elem_node != &mprs_list_head; /* circular list */ \
61        elem_node = next_elem_node) { \
62     next_elem_node = elem_node->next; \
63     elem = list2mpr(elem_node);
64
65 #define FOR_ALL_MPRS_ENTRIES_END(elem) }}
66
67
68 void
69 olsr_init_mprs(void)
70 {
71   list_head_init(&mprs_list_head);
72
73   /*
74    * Get some cookies for getting stats to ease troubleshooting.
75    */
76   mpr_sel_timer_cookie =
77     olsr_alloc_cookie("MPR Selector", OLSR_COOKIE_TYPE_TIMER);
78 }
79
80 #if 0
81 /**
82  * Check if we(this node) is selected as a MPR by any
83  * neighbors. If the list is empty we are not MPR.
84  */
85 bool
86 olsr_is_mpr(void)
87 {
88     return mprs_list.next == &mprs_list ? false : true;
89 }
90 #endif
91
92
93 /**
94  * Wrapper for the timer callback.
95  */
96 static void
97 olsr_expire_mpr_sel_entry(void *context)
98 {
99   struct mpr_selector *mpr_sel = context;
100 #ifdef DEBUG
101   struct ipaddr_str buf;
102   OLSR_PRINTF(1, "MPRS: Timing out %st\n",
103               olsr_ip_to_string(&buf, &mpr_sel->MS_main_addr));
104 #endif
105   mpr_sel->MS_timer = NULL;
106
107   list_remove(&mpr_sel->mprs_list);
108
109   /* Delete entry */
110   free(mpr_sel);
111   signal_link_changes(true);
112 }
113
114 /**
115  * Lookup an entry in the MPR selector table
116  * based on address
117  *
118  * @param addr the addres to check for
119  *
120  * @return a pointer to the entry or NULL
121  */
122 struct mpr_selector *
123 olsr_lookup_mprs_set(const union olsr_ip_addr *addr)
124 {
125   struct mpr_selector *mprs;
126
127   if (addr == NULL) {
128     return NULL;
129   }
130   //OLSR_PRINTF(1, "MPRS: Lookup....");
131   FOR_ALL_MPRS_ENTRIES(mprs) {
132     if (ipequal(&mprs->MS_main_addr, addr)) {
133       //OLSR_PRINTF(1, "MATCH\n");
134       return mprs;
135     }
136   } FOR_ALL_MPRS_ENTRIES_END(mprs);
137   //OLSR_PRINTF(1, "NO MACH\n");
138   return NULL;
139 }
140
141
142 /**
143  * Update a MPR selector entry or create an new
144  * one if it does not exist
145  *
146  * @param addr the address of the MPR selector
147  * @param vtime tha validity time of the entry
148  *
149  * @return 1 if a new entry was added 0 if not
150  */
151 int
152 olsr_update_mprs_set(const union olsr_ip_addr *addr, olsr_reltime vtime)
153 {
154   int rv;
155   struct ipaddr_str buf;
156   struct mpr_selector *mprs = olsr_lookup_mprs_set(addr);
157
158   if (mprs == NULL) {
159     mprs = olsr_malloc(sizeof(*mprs), "Add MPR selector");
160
161     OLSR_PRINTF(1, "MPRS: adding %s\n", olsr_ip_to_string(&buf, addr));
162
163     /* Fill struct */
164     mprs->MS_main_addr = *addr;
165
166     /* Queue */
167     list_add_before(&mprs_list_head, &mprs->mprs_list);
168
169     signal_link_changes(true);
170     rv = 1;
171   } else {
172     OLSR_PRINTF(5, "MPRS: Update %s\n", olsr_ip_to_string(&buf, addr));
173     rv = 0;
174   }
175   olsr_set_timer(&mprs->MS_timer,
176                  vtime,
177                  OLSR_MPR_SEL_JITTER,
178                  OLSR_TIMER_ONESHOT,
179                  &olsr_expire_mpr_sel_entry,
180                  mprs,
181                  mpr_sel_timer_cookie->ci_id);
182   return rv;
183 }
184
185
186 #if 0
187 /**
188  *Print the current MPR selector set to STDOUT
189  */
190 void
191 olsr_print_mprs_set(void)
192 {
193   struct mpr_selector *mprs;
194   OLSR_PRINTF(1, "MPR SELECTORS: ");
195   FOR_ALL_MPRS_ENTRIES(mprs) {
196     struct ipaddr_str buf;
197     OLSR_PRINTF(1, "%s ", olsr_ip_to_string(&buf, &mprs->MS_main_addr));
198   } FOR_ALL_MPRS_ENTRIES_END(mprs);
199   OLSR_PRINTF(1, "\n");
200 }
201 #endif
202
203 /*
204  * Local Variables:
205  * c-basic-offset: 2
206  * indent-tabs-mode: nil
207  * End:
208  */