Added CVS Id fields to all ca nd h files
[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 $
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   olsr_u8_t                  index;
232   struct neighbor_2_entry    *neighbor_2;
233
234   struct neighbor_list_entry *list_1=NULL;
235
236   printf("THE TWO HOP NEIGHBORS\n");
237
238   for(index=0;index<HASHSIZE;index++)
239     {
240
241       for(neighbor_2 = two_hop_neighbortable[index].next;
242           neighbor_2 != &two_hop_neighbortable[index];
243           neighbor_2 = neighbor_2->next)
244         {
245           
246           printf("ADDRESS TWO HOP NEIGHBORS\n");
247           printf("%s \n", olsr_ip_to_string(&neighbor_2->neighbor_2_addr)); 
248           printf("---------------------\n");
249           
250           printf("POINTED BY\n");
251           for(list_1 = neighbor_2->neighbor_2_nblist.next;
252               list_1 != &neighbor_2->neighbor_2_nblist;
253               list_1 = list_1->next)
254             {         
255               printf("%s \n", olsr_ip_to_string(&list_1->neighbor->neighbor_main_addr));
256             }
257           printf("---------------------\n");
258         }
259     }
260 }