* killed lots of #ifdef ... #endif which make the source quite unreadable
[olsrd.git] / src / mpr_selector_set.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon(olsrd)
3  * Copyright (c) 2004, Andreas T√łnnesen(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
41
42 #include "ipcalc.h"
43 #include "defs.h"
44 #include "mpr_selector_set.h"
45 #include "olsr.h"
46 #include "scheduler.h"
47 #include "net_olsr.h"
48
49 static olsr_u16_t ansn;
50
51 /* MPR selector list */
52 static struct mpr_selector mprs_list;
53
54 /**
55  *Initialize MPR selector set
56  */
57
58 void
59 olsr_init_mprs_set(void)
60 {
61   OLSR_PRINTF(5, "MPRS: Init\n");
62
63   /* Initial values */
64   ansn = 0;
65
66   mprs_list.next = &mprs_list;
67   mprs_list.prev = &mprs_list;
68 }
69
70
71 olsr_u16_t 
72 get_local_ansn(void)
73 {
74   return ansn;
75 }
76
77 void
78 increase_local_ansn(void)
79 {
80   ansn++;
81 }
82
83 #if 0
84 /**
85  * Check if we(this node) is selected as a MPR by any
86  * neighbors. If the list is empty we are not MPR.
87  */
88 olsr_bool
89 olsr_is_mpr(void)
90 {
91     return ((mprs_list.next == &mprs_list) ? OLSR_FALSE : OLSR_TRUE);
92 }
93 #endif
94
95
96 /**
97  * Wrapper for the timer callback.
98  */
99 static void
100 olsr_expire_mpr_sel_entry(void *context)
101 {
102 #ifdef DEBUG
103   struct ipaddr_str buf;
104 #endif
105   struct mpr_selector *mpr_sel;
106
107   mpr_sel = (struct mpr_selector *)context;
108   mpr_sel->MS_timer = NULL;
109
110 #ifdef DEBUG
111   OLSR_PRINTF(1, "MPRS: Timing out %st\n",
112               olsr_ip_to_string(&buf, &mpr_sel->MS_main_addr));
113 #endif
114
115   DEQUEUE_ELEM(mpr_sel);
116
117   /* Delete entry */
118   free(mpr_sel);
119   signal_link_changes(OLSR_TRUE);
120 }
121
122
123 /**
124  * Set the mpr selector expiration timer.
125  *
126  * all timer setting shall be done using this function.
127  * The timer param is a relative timer expressed in milliseconds.
128  */
129 static void
130 olsr_set_mpr_sel_timer(struct mpr_selector *mpr_sel, olsr_reltime rel_timer)
131 {
132
133   olsr_set_timer(&mpr_sel->MS_timer, rel_timer, OLSR_MPR_SEL_JITTER,
134                  OLSR_TIMER_ONESHOT, &olsr_expire_mpr_sel_entry, mpr_sel, 0);
135 }
136
137
138 /**
139  *Add a MPR selector to the MPR selector set
140  *
141  *@param add address of the MPR selector
142  *@param vtime validity time for the new entry
143  *
144  *@return a pointer to the new entry
145  */
146 struct mpr_selector *
147 olsr_add_mpr_selector(const union olsr_ip_addr *addr, olsr_reltime vtime)
148 {
149   struct ipaddr_str buf;
150   struct mpr_selector *new_entry;
151
152   OLSR_PRINTF(1, "MPRS: adding %s\n", olsr_ip_to_string(&buf, addr));
153
154   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
155   /* Fill struct */
156   new_entry->MS_main_addr = *addr;
157   olsr_set_mpr_sel_timer(new_entry, vtime);
158   /* Queue */
159   QUEUE_ELEM(mprs_list, new_entry);
160   /*
161   new_entry->prev = &mprs_list;
162   new_entry->next = mprs_list.next;
163   mprs_list.next->prev = new_entry;
164   mprs_list.next = new_entry;
165   */
166   return new_entry;
167 }
168
169
170
171 /**
172  *Lookup an entry in the MPR selector table
173  *based on address
174  *
175  *@param addr the addres to check for
176  *
177  *@return a pointer to the entry or NULL
178  */
179 struct mpr_selector *
180 olsr_lookup_mprs_set(const union olsr_ip_addr *addr)
181 {
182   struct mpr_selector *mprs;
183
184   if(addr == NULL)
185     return NULL;
186   //OLSR_PRINTF(1, "MPRS: Lookup....");
187
188   for (mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) {
189     if(ipequal(&mprs->MS_main_addr, addr)) {
190       //OLSR_PRINTF(1, "MATCH\n");
191       return mprs;
192     }
193   }
194   //OLSR_PRINTF(1, "NO MACH\n");
195   return NULL;
196 }
197
198
199 /**
200  *Update a MPR selector entry or create an new
201  *one if it does not exist
202  *
203  *@param addr the address of the MPR selector
204  *@param vtime tha validity time of the entry
205  *
206  *@return 1 if a new entry was added 0 if not
207  */
208 int
209 olsr_update_mprs_set(const union olsr_ip_addr *addr, olsr_reltime vtime)
210 {
211   struct ipaddr_str buf;
212   struct mpr_selector *mprs = olsr_lookup_mprs_set(addr);
213
214   OLSR_PRINTF(5, "MPRS: Update %s\n", olsr_ip_to_string(&buf, addr));
215
216   if(mprs == NULL) {
217     olsr_add_mpr_selector(addr, vtime);
218     signal_link_changes(OLSR_TRUE);
219     return 1;
220   }
221   olsr_set_mpr_sel_timer(mprs, vtime);
222   return 0;
223 }
224
225
226 #if 0
227 /**
228  *Print the current MPR selector set to STDOUT
229  */
230 void
231 olsr_print_mprs_set(void)
232 {
233   struct mpr_selector *mprs;
234   OLSR_PRINTF(1, "MPR SELECTORS: ");
235   for(mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) {
236     struct ipaddr_str buf;
237     OLSR_PRINTF(1, "%s ", olsr_ip_to_string(&buf, &mprs->MS_main_addr));
238   }
239   OLSR_PRINTF(1, "\n");
240 }
241 #endif
242
243 /*
244  * Local Variables:
245  * c-basic-offset: 2
246  * End:
247  */