gateway: introduce and use removeGatewayFromList function
[olsrd.git] / src / mpr_selector_set.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
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 #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 uint16_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 uint16_t
71 get_local_ansn(void)
72 {
73   return ansn;
74 }
75
76 void
77 increase_local_ansn(void)
78 {
79   ansn++;
80 }
81
82 #if 0
83
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 bool
89 olsr_is_mpr(void)
90 {
91   return ((mprs_list.next == &mprs_list) ? false : true);
92 }
93 #endif /* 0 */
94
95 /**
96  * Wrapper for the timer callback.
97  */
98 static void
99 olsr_expire_mpr_sel_entry(void *context)
100 {
101 #ifdef DEBUG
102   struct ipaddr_str buf;
103 #endif /* DEBUG */
104   struct mpr_selector *mpr_sel;
105
106   mpr_sel = (struct mpr_selector *)context;
107   mpr_sel->MS_timer = NULL;
108
109 #ifdef DEBUG
110   OLSR_PRINTF(1, "MPRS: Timing out %st\n", olsr_ip_to_string(&buf, &mpr_sel->MS_main_addr));
111 #endif /* DEBUG */
112
113   DEQUEUE_ELEM(mpr_sel);
114
115   /* Delete entry */
116   free(mpr_sel);
117   signal_link_changes(true);
118 }
119
120 /**
121  * Set the mpr selector expiration timer.
122  *
123  * all timer setting shall be done using this function.
124  * The timer param is a relative timer expressed in milliseconds.
125  */
126 static void
127 olsr_set_mpr_sel_timer(struct mpr_selector *mpr_sel, olsr_reltime rel_timer)
128 {
129
130   olsr_set_timer(&mpr_sel->MS_timer, rel_timer, OLSR_MPR_SEL_JITTER, OLSR_TIMER_ONESHOT, &olsr_expire_mpr_sel_entry, mpr_sel, 0);
131 }
132
133 /**
134  *Add a MPR selector to the MPR selector set
135  *
136  *@param addr address of the MPR selector
137  *@param vtime validity time for the new entry
138  *
139  *@return a pointer to the new entry
140  */
141 struct mpr_selector *
142 olsr_add_mpr_selector(const union olsr_ip_addr *addr, olsr_reltime vtime)
143 {
144   struct ipaddr_str buf;
145   struct mpr_selector *new_entry;
146
147   OLSR_PRINTF(1, "MPRS: adding %s\n", olsr_ip_to_string(&buf, addr));
148
149   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
150   /* Fill struct */
151   new_entry->MS_main_addr = *addr;
152   olsr_set_mpr_sel_timer(new_entry, vtime);
153   /* Queue */
154   QUEUE_ELEM(mprs_list, new_entry);
155   /*
156      new_entry->prev = &mprs_list;
157      new_entry->next = mprs_list.next;
158      mprs_list.next->prev = new_entry;
159      mprs_list.next = new_entry;
160    */
161   return new_entry;
162 }
163
164 /**
165  *Lookup an entry in the MPR selector table
166  *based on address
167  *
168  *@param addr the addres to check for
169  *
170  *@return a pointer to the entry or NULL
171  */
172 struct mpr_selector *
173 olsr_lookup_mprs_set(const union olsr_ip_addr *addr)
174 {
175   struct mpr_selector *mprs;
176
177   if (addr == NULL)
178     return NULL;
179   //OLSR_PRINTF(1, "MPRS: Lookup....");
180
181   for (mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) {
182     if (ipequal(&mprs->MS_main_addr, addr)) {
183       //OLSR_PRINTF(1, "MATCH\n");
184       return mprs;
185     }
186   }
187   //OLSR_PRINTF(1, "NO MACH\n");
188   return NULL;
189 }
190
191 /**
192  *Update a MPR selector entry or create an new
193  *one if it does not exist
194  *
195  *@param addr the address of the MPR selector
196  *@param vtime tha validity time of the entry
197  *
198  *@return 1 if a new entry was added 0 if not
199  */
200 int
201 olsr_update_mprs_set(const union olsr_ip_addr *addr, olsr_reltime vtime)
202 {
203   struct ipaddr_str buf;
204   struct mpr_selector *mprs = olsr_lookup_mprs_set(addr);
205
206   OLSR_PRINTF(5, "MPRS: Update %s\n", olsr_ip_to_string(&buf, addr));
207
208   if (mprs == NULL) {
209     olsr_add_mpr_selector(addr, vtime);
210     signal_link_changes(true);
211     return 1;
212   }
213   olsr_set_mpr_sel_timer(mprs, vtime);
214   return 0;
215 }
216
217 #if 0
218
219 /**
220  *Print the current MPR selector set to STDOUT
221  */
222 void
223 olsr_print_mprs_set(void)
224 {
225   struct mpr_selector *mprs;
226   OLSR_PRINTF(1, "MPR SELECTORS: ");
227   for (mprs = mprs_list.next; mprs != &mprs_list; mprs = mprs->next) {
228     struct ipaddr_str buf;
229     OLSR_PRINTF(1, "%s ", olsr_ip_to_string(&buf, &mprs->MS_main_addr));
230   }
231   OLSR_PRINTF(1, "\n");
232 }
233 #endif /* 0 */
234
235 /*
236  * Local Variables:
237  * c-basic-offset: 2
238  * indent-tabs-mode: nil
239  * End:
240  */