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