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