Licence change... man that was boring work...
[olsrd.git] / src / two_hop_neighbor_table.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: two_hop_neighbor_table.c,v 1.9 2004/11/21 11:28:56 kattemat Exp $
40  */
41
42
43
44 #include "defs.h"
45 #include "two_hop_neighbor_table.h"
46 #include "mid_set.h"
47 #include "mpr.h"
48
49
50 /**
51  *Initialize 2 hop neighbor table
52  */
53 int
54 olsr_init_two_hop_table()
55 {
56   int index;
57
58   for(index=0;index<HASHSIZE;index++)
59     {
60       two_hop_neighbortable[index].next = &two_hop_neighbortable[index];
61       two_hop_neighbortable[index].prev = &two_hop_neighbortable[index];
62     }
63   return 1;
64 }
65
66
67 /**
68  *Remove a one hop neighbor from a two hop neighbors
69  *one hop list.
70  *
71  *@param two_hop_entry the two hop neighbor to remove the 
72  *one hop neighbor from
73  *@param address the address of the one hop neighbor to remove
74  *
75  *@return nada
76  */
77
78 void
79 olsr_delete_neighbor_pointer(struct neighbor_2_entry *two_hop_entry, union olsr_ip_addr *address)
80 {
81  struct neighbor_list_entry *entry, *entry_to_delete;
82
83  entry = two_hop_entry->neighbor_2_nblist.next;
84
85
86  while(entry != &two_hop_entry->neighbor_2_nblist)
87    {
88      if(COMP_IP(&entry->neighbor->neighbor_main_addr, address))
89        {
90          entry_to_delete = entry;
91          entry = entry->next;
92
93          /* dequeue */
94          DEQUEUE_ELEM(entry_to_delete);
95
96          free(entry_to_delete);
97        }
98      else
99        entry = entry->next;
100      
101    }
102 }
103
104
105
106 /**
107  *Delete an entry from the two hop neighbor table.
108  *
109  *@param two_hop_neighbor the two hop neighbor to delete.
110  *
111  *@return nada
112  */
113 void
114 olsr_delete_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor)
115 {
116   struct neighbor_list_entry *one_hop_list, *entry_to_delete;
117   struct neighbor_entry      *one_hop_entry;
118   
119   one_hop_list = two_hop_neighbor->neighbor_2_nblist.next;
120   
121   /* Delete one hop links */
122   while(one_hop_list != &two_hop_neighbor->neighbor_2_nblist)
123     {
124       one_hop_entry = one_hop_list->neighbor;
125       olsr_delete_neighbor_2_pointer(one_hop_entry, &two_hop_neighbor->neighbor_2_addr);
126       
127       entry_to_delete = one_hop_list;
128       
129       one_hop_list = one_hop_list->next;
130       
131       /* no need to dequeue */
132
133       free(entry_to_delete);
134     }
135   
136   /* dequeue */
137   DEQUEUE_ELEM(two_hop_neighbor);
138   
139   free(two_hop_neighbor);
140 }
141
142
143
144 /**
145  *Insert a new entry to the two hop neighbor table.
146  *
147  *@param two_hop_neighbor the entry to insert
148  *
149  *@return nada
150  */
151 void
152 olsr_insert_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor)
153 {
154   olsr_u32_t              hash; 
155
156   //printf("Adding 2 hop neighbor %s\n", olsr_ip_to_string(&two_hop_neighbor->neighbor_2_addr));
157
158   hash = olsr_hashing(&two_hop_neighbor->neighbor_2_addr);
159
160   /* Queue */  
161   QUEUE_ELEM(two_hop_neighbortable[hash], two_hop_neighbor);
162 }
163
164
165 /**
166  *Look up an entry in the two hop neighbor table.
167  *
168  *@param dest the IP address of the entry to find
169  *
170  *@return a pointer to a neighbor_2_entry struct
171  *representing the two hop neighbor
172  */
173 struct neighbor_2_entry *
174 olsr_lookup_two_hop_neighbor_table(union olsr_ip_addr *dest)
175 {
176
177   struct neighbor_2_entry  *neighbor_2;
178   olsr_u32_t               hash;
179   struct addresses *adr;
180
181   //printf("LOOKING FOR %s\n", olsr_ip_to_string(dest));
182   hash = olsr_hashing(dest);
183
184   
185   for(neighbor_2 = two_hop_neighbortable[hash].next;
186       neighbor_2 != &two_hop_neighbortable[hash];
187       neighbor_2 = neighbor_2->next)
188     {
189       //printf("Checking %s\n", olsr_ip_to_string(dest));
190       if (COMP_IP(&neighbor_2->neighbor_2_addr, dest))
191         return neighbor_2;
192
193       adr = mid_lookup_aliases(&neighbor_2->neighbor_2_addr);
194
195       while(adr)
196         {
197           if(COMP_IP(&adr->address, dest))
198             return neighbor_2;
199           adr = adr->next;
200         } 
201     }
202
203   return NULL;
204 }
205
206
207
208 /**
209  *Look up an entry in the two hop neighbor table.
210  *NO CHECK FOR MAIN ADDRESS OR ALIASES!
211  *
212  *@param dest the IP address of the entry to find
213  *
214  *@return a pointer to a neighbor_2_entry struct
215  *representing the two hop neighbor
216  */
217 struct neighbor_2_entry *
218 olsr_lookup_two_hop_neighbor_table_mid(union olsr_ip_addr *dest)
219 {
220   struct neighbor_2_entry  *neighbor_2;
221   olsr_u32_t               hash;
222
223   //printf("LOOKING FOR %s\n", olsr_ip_to_string(dest));
224   hash = olsr_hashing(dest);
225   
226   for(neighbor_2 = two_hop_neighbortable[hash].next;
227       neighbor_2 != &two_hop_neighbortable[hash];
228       neighbor_2 = neighbor_2->next)
229     {
230       if (COMP_IP(&neighbor_2->neighbor_2_addr, dest))
231         return neighbor_2;
232     }
233
234   return NULL;
235 }
236
237
238
239 /**
240  *Print the two hop neighbor table to STDOUT.
241  *
242  *@return nada
243  */
244 void
245 olsr_print_two_hop_neighbor_table()
246 {
247   int i;
248   struct neighbor_2_entry *neigh2;
249   struct neighbor_list_entry *entry;
250   struct neighbor_entry *neigh;
251   olsr_bool first;
252   double total_lq;
253
254   olsr_printf(1, "\n--- %02d:%02d:%02d -------------------------- TWO-HOP NEIGHBORS\n\n",
255               nowtm->tm_hour,
256               nowtm->tm_min,
257               nowtm->tm_sec,
258               now.tv_usec);
259
260   olsr_printf(1, "IP addr (2-hop)  IP addr (1-hop)  TLQ\n");
261
262   for (i = 0; i < HASHSIZE; i++)
263     {
264       for (neigh2 = two_hop_neighbortable[i].next;
265            neigh2 != &two_hop_neighbortable[i]; neigh2 = neigh2->next)
266         {
267           first = OLSR_TRUE;
268
269           for (entry = neigh2->neighbor_2_nblist.next;
270                entry != &neigh2->neighbor_2_nblist; entry = entry->next)
271             {
272               neigh = entry->neighbor;
273
274               if (first)
275                 {
276                   olsr_printf(1, "%-15s  ",
277                               olsr_ip_to_string(&neigh2->neighbor_2_addr));
278                   first = OLSR_FALSE;
279                 }
280
281               else
282                 olsr_printf(1, "                 ");
283
284 #if defined USE_LINK_QUALITY
285               total_lq = entry->full_link_quality;
286 #else
287               total_lq = 0.0;
288 #endif
289               olsr_printf(1, "%-15s  %5.3f\n",
290                           olsr_ip_to_string(&neigh->neighbor_main_addr),
291                           total_lq);
292             }
293         }
294     }
295 }