a706e6d4c983e740f2578dc4ac4f33512ebedb34
[olsrd.git] / lib / netjson / src / olsrd_netjson_helpers.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 "olsrd_netjson_helpers.h"
47
48 #include "olsr.h"
49 #include <unistd.h>
50
51 struct node_entry * netjson_constructMidSelf(struct mid_entry *mid) {
52   struct node_entry * node;
53   struct olsr_if *ifs;
54
55   memset(mid, 0, sizeof(*mid));
56   mid->main_addr = olsr_cnf->main_addr;
57
58   node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - self");
59   node->avl.key = &mid->main_addr;
60   node->isAlias = false;
61   node->mid = mid;
62   node->link = NULL;
63   node->neighbor = NULL;
64
65   for (ifs = olsr_cnf->interfaces; ifs != NULL ; ifs = ifs->next) {
66     struct node_entry * node_self_alias;
67     union olsr_ip_addr *addr = NULL;
68
69     if (!ifs->configured) {
70       continue;
71     }
72
73     if (ifs->host_emul) {
74       addr = &ifs->hemu_ip;
75     } else {
76       struct interface_olsr *iface = ifs->interf;
77       if (!iface) {
78         continue;
79       }
80
81       if (olsr_cnf->ip_version == AF_INET) {
82         addr = (union olsr_ip_addr *) &iface->ip_addr.v4;
83       } else {
84         addr = (union olsr_ip_addr *) &iface->int6_addr.sin6_addr;
85       }
86     }
87
88     node_self_alias = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - self alias");
89     node_self_alias->avl.key = addr;
90     node_self_alias->isAlias = true;
91     node_self_alias->mid = mid;
92     node_self_alias->link = NULL;
93     node_self_alias->neighbor = NULL;
94
95     {
96       bool is_self_main = (olsr_cnf->ip_version == AF_INET) //
97           ? ip4equal(&mid->main_addr.v4, &addr->v4) //
98               : ip6equal(&mid->main_addr.v6, &addr->v6);
99       if (!is_self_main) {
100         struct mid_address *alias = olsr_malloc(sizeof(struct mid_address), "netjson NetworkGraph node - MID - self alias");
101         struct mid_address *aliases_saved;
102
103         alias->alias = *addr;
104         alias->main_entry = mid;
105         alias->next_alias = NULL;
106         alias->vtime = 0;
107
108         aliases_saved = mid->aliases;
109         mid->aliases = alias;
110         alias->next_alias = aliases_saved;
111       }
112     }
113   }
114
115   return node;
116 }
117
118 void netjson_cleanup_mid_self(struct node_entry *node_entry) {
119   struct mid_address *alias = node_entry->mid->aliases;
120   while (alias) {
121     struct mid_address *alias_to_free = alias;
122     alias = alias->next_alias;
123     free(alias_to_free);
124   }
125   node_entry->mid->aliases = NULL;
126 }
127
128 void netjson_midIntoNodesTree(struct avl_tree *nodes, struct mid_entry *mid) {
129   struct mid_address * alias = mid->aliases;
130   struct node_entry * node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - main");
131   node->avl.key = &mid->main_addr;
132   node->isAlias = false;
133   node->mid = mid;
134   node->link = NULL;
135   node->neighbor = NULL;
136   if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
137     /* duplicate */
138     free(node);
139   }
140
141   if (alias) {
142     while (alias) {
143       node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - MID - alias");
144       node->avl.key = &alias->alias;
145       node->isAlias = true;
146       node->mid = mid;
147       node->link = NULL;
148       node->neighbor = NULL;
149       if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
150         /* duplicate */
151         free(node);
152       }
153
154       alias = alias->next_alias;
155     }
156   }
157 }
158
159 void netjson_linkIntoNodesTree(struct avl_tree *nodes, struct link_entry *link, union olsr_ip_addr *addr) {
160   struct avl_node *avlnode;
161   struct node_entry *node;
162
163   avlnode = avl_find(nodes, addr);
164   if (!avlnode) {
165     /* the IP address is not yet known */
166     node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - link");
167
168     node->avl.key = addr;
169     node->isAlias = false;
170     node->mid = NULL;
171     node->link = link;
172     node->neighbor = NULL;
173     if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
174       /* duplicate */
175       free(node);
176     }
177   }
178 }
179
180 void netjson_neighborIntoNodesTree(struct avl_tree *nodes, struct neighbor_entry *neighbor) {
181   struct avl_node *avlnode;
182   struct node_entry *node;
183
184   union olsr_ip_addr *addr = &neighbor->neighbor_main_addr;
185   avlnode = avl_find(nodes, addr);
186   if (!avlnode) {
187     /* the IP address is not yet known */
188     node = olsr_malloc(sizeof(struct node_entry), "netjson NetworkGraph node - neighbor");
189
190     node->avl.key = addr;
191     node->isAlias = false;
192     node->mid = NULL;
193     node->link = NULL;
194     node->neighbor = neighbor;
195     if (avl_insert(nodes, &node->avl, AVL_DUP_NO) == -1) {
196       /* duplicate */
197       free(node);
198     }
199   }
200 }