Initial import
[olsrd.git] / src / mpr_selector_set.c
1 /*
2  * OLSR ad-hoc routing table management protocol
3  * Copyright (C) 2004 Andreas T√łnnesen (andreto@ifi.uio.no)
4  *
5  * This file is part of olsrd-unik.
6  *
7  * UniK olsrd is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * UniK olsrd is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with olsrd-unik; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  */
22
23
24 #include "defs.h"
25 #include "mpr_selector_set.h"
26 #include "olsr.h"
27 #include "scheduler.h"
28
29 /**
30  *Initialize MPR selector set
31  */
32
33 int
34 olsr_init_mprs_set()
35 {
36   olsr_printf(5, "MPRS: Init\n");
37   /* Initial values */
38   mprs_count = 0;
39   ansn = 0;
40
41   olsr_register_timeout_function(&olsr_time_out_mprs_set);
42   
43   mprs_list.next = &mprs_list;
44   mprs_list.prev = &mprs_list;
45   
46
47   return 1;
48 }
49
50
51 /**
52  *Add a MPR selector to the MPR selector set
53  *
54  *@param add address of the MPR selector
55  *@param vtime validity time for the new entry
56  *
57  *@return a pointer to the new entry
58  */
59 struct mpr_selector *
60 olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime)
61 {
62   struct mpr_selector *new_entry;
63
64   olsr_printf(1, "MPRS: adding %s\n", olsr_ip_to_string(addr));
65
66   mprs_count++;
67
68   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
69
70   /* Fill struct */
71   COPY_IP(&new_entry->MS_main_addr, addr);
72   olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_entry->MS_time);
73
74   /* Queue */
75   QUEUE_ELEM(mprs_list, new_entry);
76   /*
77   new_entry->prev = &mprs_list;
78   new_entry->next = mprs_list.next;
79   mprs_list.next->prev = new_entry;
80   mprs_list.next = new_entry;
81   */
82
83   return new_entry;
84 }
85
86
87
88 /**
89  *Lookup an entry in the MPR selector table
90  *based on address
91  *
92  *@param addr the addres to check for
93  *
94  *@return a pointer to the entry or NULL
95  */
96 struct mpr_selector *
97 olsr_lookup_mprs_set(union olsr_ip_addr *addr)
98 {
99   struct mpr_selector *mprs;
100
101   if(addr == NULL)
102     return NULL;
103   //olsr_printf(1, "MPRS: Lookup....");
104
105   mprs = mprs_list.next;
106
107   while(mprs != &mprs_list)
108     {
109
110       if(COMP_IP(&mprs->MS_main_addr, addr))
111         {
112           //olsr_printf(1, "MATCH\n");
113           return mprs;
114         }
115       mprs = mprs->next;
116     }
117   
118   //olsr_printf(1, "NO MACH\n");
119   return NULL;
120 }
121
122
123 /**
124  *Update a MPR selector entry or create an new
125  *one if it does not exist
126  *
127  *@param addr the address of the MPR selector
128  *@param vtime tha validity time of the entry
129  *
130  *@return 1 if a new entry was added 0 if not
131  */
132 int
133 olsr_update_mprs_set(union olsr_ip_addr *addr, float vtime)
134 {
135   struct mpr_selector *mprs;
136   int retval;
137
138   olsr_printf(5, "MPRS: Update %s\n", olsr_ip_to_string(addr));
139
140   retval = 0;
141
142   if(NULL == (mprs = olsr_lookup_mprs_set(addr)))
143     {
144       olsr_add_mpr_selector(addr, vtime);
145       retval = 1;
146       changes = UP;
147     }
148   else
149     {
150       olsr_get_timestamp((olsr_u32_t) vtime*1000, &mprs->MS_time);
151     }
152   return retval;
153 }
154
155
156
157
158
159 /**
160  *Time out MPR selector entries
161  *
162  *@return nada
163  */
164 void
165 olsr_time_out_mprs_set()
166 {
167   struct mpr_selector *mprs, *mprs_to_delete;
168
169   mprs = mprs_list.next;
170
171   while(mprs != &mprs_list)
172     {
173
174       if(TIMED_OUT(&mprs->MS_time))
175         {
176           /* Dequeue */
177           mprs_to_delete = mprs;
178           mprs = mprs->next;
179
180           olsr_printf(1, "MPRS: Timing out %s\n", olsr_ip_to_string(&mprs_to_delete->MS_main_addr));
181
182           DEQUEUE_ELEM(mprs_to_delete);
183           //mprs_to_delete->prev->next = mprs_to_delete->next;
184           //mprs_to_delete->next->prev = mprs_to_delete->prev;
185
186           mprs_count--;
187
188           /* Delete entry */
189           free(mprs_to_delete);
190           changes = UP;
191         }
192       else
193         mprs = mprs->next;
194     }
195
196 }
197
198
199
200 /**
201  *Print the current MPR selector set to STDOUT
202  */
203 void
204 olsr_print_mprs_set()
205 {
206   struct mpr_selector *mprs;
207
208
209   mprs = mprs_list.next;
210   olsr_printf(1, "MPR SELECTORS: ");
211
212   while(mprs != &mprs_list)
213     {
214       olsr_printf(1, "%s ", olsr_ip_to_string(&mprs->MS_main_addr));
215       mprs = mprs->next;
216     }
217   olsr_printf(1, "\n");
218 }