General cleanups in header files
[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  * $Id: mpr_selector_set.c,v 1.12 2005/02/20 18:52:18 kattemat Exp $
40  */
41
42
43 #include "defs.h"
44 #include "mpr_selector_set.h"
45 #include "olsr.h"
46 #include "scheduler.h"
47
48 static olsr_u16_t ansn;
49
50 /* MPR selector list */
51 static struct mpr_selector mprs_list;
52
53 /**
54  *Initialize MPR selector set
55  */
56
57 int
58 olsr_init_mprs_set()
59 {
60   olsr_printf(5, "MPRS: Init\n");
61   /* Initial values */
62   ansn = 0;
63
64   olsr_register_timeout_function(&olsr_time_out_mprs_set);
65   
66   mprs_list.next = &mprs_list;
67   mprs_list.prev = &mprs_list;
68   
69
70   return 1;
71 }
72
73
74 olsr_u16_t 
75 get_local_ansn()
76 {
77   return ansn;
78 }
79
80 void
81 increase_local_ansn()
82 {
83   ansn++;
84 }
85
86 /**
87  *Add a MPR selector to the MPR selector set
88  *
89  *@param add address of the MPR selector
90  *@param vtime validity time for the new entry
91  *
92  *@return a pointer to the new entry
93  */
94 struct mpr_selector *
95 olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime)
96 {
97   struct mpr_selector *new_entry;
98
99   olsr_printf(1, "MPRS: adding %s\n", olsr_ip_to_string(addr));
100
101   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
102
103   /* Fill struct */
104   COPY_IP(&new_entry->MS_main_addr, addr);
105   new_entry->MS_time = GET_TIMESTAMP(vtime*1000);
106
107   /* Queue */
108   QUEUE_ELEM(mprs_list, new_entry);
109   /*
110   new_entry->prev = &mprs_list;
111   new_entry->next = mprs_list.next;
112   mprs_list.next->prev = new_entry;
113   mprs_list.next = new_entry;
114   */
115
116   return new_entry;
117 }
118
119
120
121 /**
122  *Lookup an entry in the MPR selector table
123  *based on address
124  *
125  *@param addr the addres to check for
126  *
127  *@return a pointer to the entry or NULL
128  */
129 struct mpr_selector *
130 olsr_lookup_mprs_set(union olsr_ip_addr *addr)
131 {
132   struct mpr_selector *mprs;
133
134   if(addr == NULL)
135     return NULL;
136   //olsr_printf(1, "MPRS: Lookup....");
137
138   mprs = mprs_list.next;
139
140   while(mprs != &mprs_list)
141     {
142
143       if(COMP_IP(&mprs->MS_main_addr, addr))
144         {
145           //olsr_printf(1, "MATCH\n");
146           return mprs;
147         }
148       mprs = mprs->next;
149     }
150   
151   //olsr_printf(1, "NO MACH\n");
152   return NULL;
153 }
154
155
156 /**
157  *Update a MPR selector entry or create an new
158  *one if it does not exist
159  *
160  *@param addr the address of the MPR selector
161  *@param vtime tha validity time of the entry
162  *
163  *@return 1 if a new entry was added 0 if not
164  */
165 int
166 olsr_update_mprs_set(union olsr_ip_addr *addr, float vtime)
167 {
168   struct mpr_selector *mprs;
169   int retval;
170
171   olsr_printf(5, "MPRS: Update %s\n", olsr_ip_to_string(addr));
172
173   retval = 0;
174
175   if(NULL == (mprs = olsr_lookup_mprs_set(addr)))
176     {
177       olsr_add_mpr_selector(addr, vtime);
178       retval = 1;
179       changes = OLSR_TRUE;
180     }
181   else
182     {
183       mprs->MS_time = GET_TIMESTAMP(vtime*1000);
184     }
185   return retval;
186 }
187
188
189
190
191
192 /**
193  *Time out MPR selector entries
194  *
195  *@return nada
196  */
197 void
198 olsr_time_out_mprs_set()
199 {
200   struct mpr_selector *mprs;
201
202   mprs = mprs_list.next;
203
204   while(mprs != &mprs_list)
205     {
206
207       if(TIMED_OUT(mprs->MS_time))
208         {
209           /* Dequeue */
210           struct mpr_selector *mprs_to_delete = mprs;
211           mprs = mprs->next;
212
213           olsr_printf(1, "MPRS: Timing out %s\n", olsr_ip_to_string(&mprs_to_delete->MS_main_addr));
214
215           DEQUEUE_ELEM(mprs_to_delete);
216
217           /* Delete entry */
218           free(mprs_to_delete);
219           changes = OLSR_TRUE;
220         }
221       else
222         mprs = mprs->next;
223     }
224
225 }
226
227
228
229 /**
230  *Print the current MPR selector set to STDOUT
231  */
232 void
233 olsr_print_mprs_set()
234 {
235   struct mpr_selector *mprs;
236
237
238   mprs = mprs_list.next;
239   olsr_printf(1, "MPR SELECTORS: ");
240
241   while(mprs != &mprs_list)
242     {
243       olsr_printf(1, "%s ", olsr_ip_to_string(&mprs->MS_main_addr));
244       mprs = mprs->next;
245     }
246   olsr_printf(1, "\n");
247 }