Update version after release of v0.6.5.2
[olsrd.git] / src / two_hop_neighbor_table.c
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004, Andreas Tonnesen(andreto@olsr.org)
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #include "two_hop_neighbor_table.h"
43 #include "ipcalc.h"
44 #include "defs.h"
45 #include "mid_set.h"
46 #include "neighbor_table.h"
47 #include "net_olsr.h"
48 #include "scheduler.h"
49
50 struct neighbor_2_entry two_hop_neighbortable[HASHSIZE];
51
52 /**
53  *Initialize 2 hop neighbor table
54  */
55 void
56 olsr_init_two_hop_table(void)
57 {
58   int idx;
59   for (idx = 0; idx < HASHSIZE; idx++) {
60     two_hop_neighbortable[idx].next = &two_hop_neighbortable[idx];
61     two_hop_neighbortable[idx].prev = &two_hop_neighbortable[idx];
62   }
63 }
64
65 /**
66  *Remove a one hop neighbor from a two hop neighbors
67  *one hop list.
68  *
69  *@param two_hop_entry the two hop neighbor to remove the
70  *one hop neighbor from
71  *@param neigh address the address of the one hop neighbor to remove
72  *
73  *@return nada
74  */
75
76 void
77 olsr_delete_neighbor_pointer(struct neighbor_2_entry *two_hop_entry, struct neighbor_entry *neigh)
78 {
79   struct neighbor_list_entry *entry = two_hop_entry->neighbor_2_nblist.next;
80   while (entry != &two_hop_entry->neighbor_2_nblist) {
81     if (entry->neighbor == neigh) {
82       struct neighbor_list_entry *entry_to_delete = entry;
83       entry = entry->next;
84
85       /* dequeue */
86       DEQUEUE_ELEM(entry_to_delete);
87
88       free(entry_to_delete);
89     } else {
90       entry = entry->next;
91     }
92   }
93 }
94
95 /**
96  *Delete an entry from the two hop neighbor table.
97  *
98  *@param two_hop_neighbor the two hop neighbor to delete.
99  *
100  *@return nada
101  */
102 void
103 olsr_delete_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor)
104 {
105   struct neighbor_list_entry *one_hop_list;
106
107   one_hop_list = two_hop_neighbor->neighbor_2_nblist.next;
108
109   /* Delete one hop links */
110   while (one_hop_list != &two_hop_neighbor->neighbor_2_nblist) {
111     struct neighbor_entry *one_hop_entry = one_hop_list->neighbor;
112     struct neighbor_list_entry *entry_to_delete = one_hop_list;
113
114     olsr_delete_neighbor_2_pointer(one_hop_entry, two_hop_neighbor);
115     one_hop_list = one_hop_list->next;
116     /* no need to dequeue */
117     free(entry_to_delete);
118   }
119
120   /* dequeue */
121   DEQUEUE_ELEM(two_hop_neighbor);
122   free(two_hop_neighbor);
123 }
124
125 /**
126  *Insert a new entry to the two hop neighbor table.
127  *
128  *@param two_hop_neighbor the entry to insert
129  *
130  *@return nada
131  */
132 void
133 olsr_insert_two_hop_neighbor_table(struct neighbor_2_entry *two_hop_neighbor)
134 {
135   uint32_t hash = olsr_ip_hashing(&two_hop_neighbor->neighbor_2_addr);
136
137   /* Queue */
138   QUEUE_ELEM(two_hop_neighbortable[hash], two_hop_neighbor);
139 }
140
141 /**
142  *Look up an entry in the two hop neighbor table.
143  *
144  *@param dest the IP address of the entry to find
145  *
146  *@return a pointer to a neighbor_2_entry struct
147  *representing the two hop neighbor
148  */
149 struct neighbor_2_entry *
150 olsr_lookup_two_hop_neighbor_table(const union olsr_ip_addr *dest)
151 {
152
153   struct neighbor_2_entry *neighbor_2;
154   uint32_t hash = olsr_ip_hashing(dest);
155
156   /* printf("LOOKING FOR %s\n", olsr_ip_to_string(&buf, dest)); */
157   for (neighbor_2 = two_hop_neighbortable[hash].next; neighbor_2 != &two_hop_neighbortable[hash]; neighbor_2 = neighbor_2->next) {
158     struct mid_address *adr;
159
160     /* printf("Checking %s\n", olsr_ip_to_string(&buf, dest)); */
161     if (ipequal(&neighbor_2->neighbor_2_addr, dest))
162       return neighbor_2;
163
164     adr = mid_lookup_aliases(&neighbor_2->neighbor_2_addr);
165
166     while (adr) {
167       if (ipequal(&adr->alias, dest))
168         return neighbor_2;
169       adr = adr->next_alias;
170     }
171   }
172
173   return NULL;
174 }
175
176 /**
177  *Look up an entry in the two hop neighbor table.
178  *NO CHECK FOR MAIN ADDRESS OR ALIASES!
179  *
180  *@param dest the IP address of the entry to find
181  *
182  *@return a pointer to a neighbor_2_entry struct
183  *representing the two hop neighbor
184  */
185 struct neighbor_2_entry *
186 olsr_lookup_two_hop_neighbor_table_mid(const union olsr_ip_addr *dest)
187 {
188   struct neighbor_2_entry *neighbor_2;
189   uint32_t hash;
190
191   /* printf("LOOKING FOR %s\n", olsr_ip_to_string(&buf, dest)); */
192   hash = olsr_ip_hashing(dest);
193
194   for (neighbor_2 = two_hop_neighbortable[hash].next; neighbor_2 != &two_hop_neighbortable[hash]; neighbor_2 = neighbor_2->next) {
195     if (ipequal(&neighbor_2->neighbor_2_addr, dest))
196       return neighbor_2;
197   }
198
199   return NULL;
200 }
201
202 /**
203  *Print the two hop neighbor table to STDOUT.
204  *
205  *@return nada
206  */
207 #ifndef NODEBUG
208 void
209 olsr_print_two_hop_neighbor_table(void)
210 {
211   /* The whole function makes no sense without it. */
212   int i;
213   const int ipwidth = olsr_cnf->ip_version == AF_INET ? (INET_ADDRSTRLEN - 1) : (INET6_ADDRSTRLEN - 1);
214
215   OLSR_PRINTF(1, "\n--- %s ----------------------- TWO-HOP NEIGHBORS\n\n" "IP addr (2-hop)  IP addr (1-hop)  Total cost\n",
216               olsr_wallclock_string());
217
218   for (i = 0; i < HASHSIZE; i++) {
219     struct neighbor_2_entry *neigh2;
220     for (neigh2 = two_hop_neighbortable[i].next; neigh2 != &two_hop_neighbortable[i]; neigh2 = neigh2->next) {
221       struct neighbor_list_entry *entry;
222       bool first = true;
223
224       for (entry = neigh2->neighbor_2_nblist.next; entry != &neigh2->neighbor_2_nblist; entry = entry->next) {
225         struct ipaddr_str buf;
226         struct lqtextbuffer lqbuffer;
227         if (first) {
228           OLSR_PRINTF(1, "%-*s  ", ipwidth, olsr_ip_to_string(&buf, &neigh2->neighbor_2_addr));
229           first = false;
230         } else {
231           OLSR_PRINTF(1, "                 ");
232         }
233         OLSR_PRINTF(1, "%-*s  %s\n", ipwidth, olsr_ip_to_string(&buf, &entry->neighbor->neighbor_main_addr),
234                     get_linkcost_text(entry->path_linkcost, false, &lqbuffer));
235       }
236     }
237   }
238 }
239 #endif /* NODEBUG */
240
241 /*
242  * Local Variables:
243  * c-basic-offset: 2
244  * indent-tabs-mode: nil
245  * End:
246  */