Added CVS Id to all C and haeder files
[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 the olsr.org OLSR daemon.
6  *
7  * olsr.org 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  * olsr.org 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 olsr.org; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  * 
21  * 
22  * $Id: mpr_selector_set.c,v 1.5 2004/09/21 19:08:57 kattemat Exp $
23  *
24  */
25
26
27 #include "defs.h"
28 #include "mpr_selector_set.h"
29 #include "olsr.h"
30 #include "scheduler.h"
31
32 /**
33  *Initialize MPR selector set
34  */
35
36 int
37 olsr_init_mprs_set()
38 {
39   olsr_printf(5, "MPRS: Init\n");
40   /* Initial values */
41   mprs_count = 0;
42   ansn = 0;
43
44   olsr_register_timeout_function(&olsr_time_out_mprs_set);
45   
46   mprs_list.next = &mprs_list;
47   mprs_list.prev = &mprs_list;
48   
49
50   return 1;
51 }
52
53
54 /**
55  *Add a MPR selector to the MPR selector set
56  *
57  *@param add address of the MPR selector
58  *@param vtime validity time for the new entry
59  *
60  *@return a pointer to the new entry
61  */
62 struct mpr_selector *
63 olsr_add_mpr_selector(union olsr_ip_addr *addr, float vtime)
64 {
65   struct mpr_selector *new_entry;
66
67   olsr_printf(1, "MPRS: adding %s\n", olsr_ip_to_string(addr));
68
69   mprs_count++;
70
71   new_entry = olsr_malloc(sizeof(struct mpr_selector), "Add MPR selector");
72
73   /* Fill struct */
74   COPY_IP(&new_entry->MS_main_addr, addr);
75   olsr_get_timestamp((olsr_u32_t) vtime*1000, &new_entry->MS_time);
76
77   /* Queue */
78   QUEUE_ELEM(mprs_list, new_entry);
79   /*
80   new_entry->prev = &mprs_list;
81   new_entry->next = mprs_list.next;
82   mprs_list.next->prev = new_entry;
83   mprs_list.next = new_entry;
84   */
85
86   return new_entry;
87 }
88
89
90
91 /**
92  *Lookup an entry in the MPR selector table
93  *based on address
94  *
95  *@param addr the addres to check for
96  *
97  *@return a pointer to the entry or NULL
98  */
99 struct mpr_selector *
100 olsr_lookup_mprs_set(union olsr_ip_addr *addr)
101 {
102   struct mpr_selector *mprs;
103
104   if(addr == NULL)
105     return NULL;
106   //olsr_printf(1, "MPRS: Lookup....");
107
108   mprs = mprs_list.next;
109
110   while(mprs != &mprs_list)
111     {
112
113       if(COMP_IP(&mprs->MS_main_addr, addr))
114         {
115           //olsr_printf(1, "MATCH\n");
116           return mprs;
117         }
118       mprs = mprs->next;
119     }
120   
121   //olsr_printf(1, "NO MACH\n");
122   return NULL;
123 }
124
125
126 /**
127  *Update a MPR selector entry or create an new
128  *one if it does not exist
129  *
130  *@param addr the address of the MPR selector
131  *@param vtime tha validity time of the entry
132  *
133  *@return 1 if a new entry was added 0 if not
134  */
135 int
136 olsr_update_mprs_set(union olsr_ip_addr *addr, float vtime)
137 {
138   struct mpr_selector *mprs;
139   int retval;
140
141   olsr_printf(5, "MPRS: Update %s\n", olsr_ip_to_string(addr));
142
143   retval = 0;
144
145   if(NULL == (mprs = olsr_lookup_mprs_set(addr)))
146     {
147       olsr_add_mpr_selector(addr, vtime);
148       retval = 1;
149       changes = UP;
150     }
151   else
152     {
153       olsr_get_timestamp((olsr_u32_t) vtime*1000, &mprs->MS_time);
154     }
155   return retval;
156 }
157
158
159
160
161
162 /**
163  *Time out MPR selector entries
164  *
165  *@return nada
166  */
167 void
168 olsr_time_out_mprs_set()
169 {
170   struct mpr_selector *mprs, *mprs_to_delete;
171
172   mprs = mprs_list.next;
173
174   while(mprs != &mprs_list)
175     {
176
177       if(TIMED_OUT(&mprs->MS_time))
178         {
179           /* Dequeue */
180           mprs_to_delete = mprs;
181           mprs = mprs->next;
182
183           olsr_printf(1, "MPRS: Timing out %s\n", olsr_ip_to_string(&mprs_to_delete->MS_main_addr));
184
185           DEQUEUE_ELEM(mprs_to_delete);
186           //mprs_to_delete->prev->next = mprs_to_delete->next;
187           //mprs_to_delete->next->prev = mprs_to_delete->prev;
188
189           mprs_count--;
190
191           /* Delete entry */
192           free(mprs_to_delete);
193           changes = UP;
194         }
195       else
196         mprs = mprs->next;
197     }
198
199 }
200
201
202
203 /**
204  *Print the current MPR selector set to STDOUT
205  */
206 void
207 olsr_print_mprs_set()
208 {
209   struct mpr_selector *mprs;
210
211
212   mprs = mprs_list.next;
213   olsr_printf(1, "MPR SELECTORS: ");
214
215   while(mprs != &mprs_list)
216     {
217       olsr_printf(1, "%s ", olsr_ip_to_string(&mprs->MS_main_addr));
218       mprs = mprs->next;
219     }
220   olsr_printf(1, "\n");
221 }