Licence change... man that was boring work...
[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.8 2004/11/21 11:28:56 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 /**
49  *Initialize MPR selector set
50  */
51
52 int
53 olsr_init_mprs_set()
54 {
55   olsr_printf(5, "MPRS: Init\n");
56   /* Initial values */
57   mprs_count = 0;
58   ansn = 0;
59
60   olsr_register_timeout_function(&olsr_time_out_mprs_set);
61   
62   mprs_list.next = &mprs_list;
63   mprs_list.prev = &mprs_list;
64   
65
66   return 1;
67 }
68
69
70 /**
71  *Add a MPR selector to the MPR selector set
72  *
73  *@param add address of the MPR selector
74  *@param vtime validity time for the new entry
75  *
76  *@return a pointer to the new entry
77  */
78 struct mpr_selector *
79 olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime)
80 {
81   struct mpr_selector *new_entry;
82
83   olsr_printf(1, "MPRS: adding %s\n", olsr_ip_to_string(addr));
84
85   mprs_count++;
86
87   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
88
89   /* Fill struct */
90   COPY_IP(&new_entry->MS_main_addr, addr);
91   olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_entry->MS_time);
92
93   /* Queue */
94   QUEUE_ELEM(mprs_list, new_entry);
95   /*
96   new_entry->prev = &mprs_list;
97   new_entry->next = mprs_list.next;
98   mprs_list.next->prev = new_entry;
99   mprs_list.next = new_entry;
100   */
101
102   return new_entry;
103 }
104
105
106
107 /**
108  *Lookup an entry in the MPR selector table
109  *based on address
110  *
111  *@param addr the addres to check for
112  *
113  *@return a pointer to the entry or NULL
114  */
115 struct mpr_selector *
116 olsr_lookup_mprs_set(union olsr_ip_addr *addr)
117 {
118   struct mpr_selector *mprs;
119
120   if(addr == NULL)
121     return NULL;
122   //olsr_printf(1, "MPRS: Lookup....");
123
124   mprs = mprs_list.next;
125
126   while(mprs != &mprs_list)
127     {
128
129       if(COMP_IP(&mprs->MS_main_addr, addr))
130         {
131           //olsr_printf(1, "MATCH\n");
132           return mprs;
133         }
134       mprs = mprs->next;
135     }
136   
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(union olsr_ip_addr *addr, float vtime)
153 {
154   struct mpr_selector *mprs;
155   int retval;
156
157   olsr_printf(5, "MPRS: Update %s\n", olsr_ip_to_string(addr));
158
159   retval = 0;
160
161   if(NULL == (mprs = olsr_lookup_mprs_set(addr)))
162     {
163       olsr_add_mpr_selector(addr, vtime);
164       retval = 1;
165       changes = OLSR_TRUE;
166     }
167   else
168     {
169       olsr_get_timestamp((olsr_u32_t) vtime*1000, &mprs->MS_time);
170     }
171   return retval;
172 }
173
174
175
176
177
178 /**
179  *Time out MPR selector entries
180  *
181  *@return nada
182  */
183 void
184 olsr_time_out_mprs_set()
185 {
186   struct mpr_selector *mprs, *mprs_to_delete;
187
188   mprs = mprs_list.next;
189
190   while(mprs != &mprs_list)
191     {
192
193       if(TIMED_OUT(&mprs->MS_time))
194         {
195           /* Dequeue */
196           mprs_to_delete = mprs;
197           mprs = mprs->next;
198
199           olsr_printf(1, "MPRS: Timing out %s\n", olsr_ip_to_string(&mprs_to_delete->MS_main_addr));
200
201           DEQUEUE_ELEM(mprs_to_delete);
202           //mprs_to_delete->prev->next = mprs_to_delete->next;
203           //mprs_to_delete->next->prev = mprs_to_delete->prev;
204
205           mprs_count--;
206
207           /* Delete entry */
208           free(mprs_to_delete);
209           changes = OLSR_TRUE;
210         }
211       else
212         mprs = mprs->next;
213     }
214
215 }
216
217
218
219 /**
220  *Print the current MPR selector set to STDOUT
221  */
222 void
223 olsr_print_mprs_set()
224 {
225   struct mpr_selector *mprs;
226
227
228   mprs = mprs_list.next;
229   olsr_printf(1, "MPR SELECTORS: ");
230
231   while(mprs != &mprs_list)
232     {
233       olsr_printf(1, "%s ", olsr_ip_to_string(&mprs->MS_main_addr));
234       mprs = mprs->next;
235     }
236   olsr_printf(1, "\n");
237 }