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