1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
--- a/lib/httpinfo/src/olsrd_httpinfo.c
+++ b/lib/httpinfo/src/olsrd_httpinfo.c
@@ -687,9 +687,16 @@
void
olsr_plugin_exit(void)
{
+ struct allowed_net *a, *next;
if (http_socket >= 0) {
CLOSE(http_socket);
}
+
+ for (a = allowed_nets; a != NULL; a = next) {
+ next = a->next;
+
+ free(a);
+ }
}
static void
--- a/src/interfaces.h
+++ b/src/interfaces.h
@@ -187,6 +187,7 @@
extern struct interface *ifnet;
int ifinit(void);
+void olsr_delete_interfaces(void);
void run_ifchg_cbs(struct interface *, int);
--- a/src/linux/kernel_routes.c
+++ b/src/linux/kernel_routes.c
@@ -85,6 +85,8 @@
OLSR_PRINTF(1,"could not create rtnetlink socket! %d",sock);
}
else {
+ memset(&addr, 0, sizeof(addr));
+
addr.nl_family = AF_NETLINK;
addr.nl_pid = 0; //kernel will assign appropiate number instead of pid (which is already used by primaray rtnetlink socket to add/delete routes)
addr.nl_groups = rtnl_mgrp;
--- a/src/main.c
+++ b/src/main.c
@@ -57,6 +57,7 @@
#include "net_os.h"
#include "build_msg.h"
#include "net_olsr.h"
+#include "mid_set.h"
#if LINUX_POLICY_ROUTING
#include <linux/types.h>
@@ -526,6 +527,7 @@
#endif
{
struct interface *ifn;
+ int exit_value;
OLSR_PRINTF(1, "Received signal %d - shutting down\n", (int)signo);
@@ -542,6 +544,12 @@
olsr_delete_all_kernel_routes();
+ olsr_delete_all_tc_entries();
+
+ olsr_delete_all_mid_entries();
+
+ olsr_destroy_parser();
+
OLSR_PRINTF(1, "Closing sockets...\n");
/* front-end IPC socket */
@@ -551,7 +559,6 @@
}
#endif /* SVEN_OLA_UNBLOAT */
- /* OLSR sockets */
for (ifn = ifnet; ifn; ifn = ifn->int_next)
close(ifn->olsr_socket);
@@ -581,13 +588,17 @@
#endif
/* Free cookies and memory pools attached. */
+ OLSR_PRINTF(0, "Free all memory...\n");
olsr_delete_all_cookies();
olsr_syslog(OLSR_LOG_INFO, "%s stopped", olsrd_version);
OLSR_PRINTF(1, "\n <<<< %s - terminating >>>>\n http://www.olsr.org\n", olsrd_version);
- exit(olsr_cnf->exit_value);
+ exit_value = olsr_cnf->exit_value;
+ free (olsr_cnf);
+
+ exit(exit_value);
}
/**
--- a/src/mid_set.c
+++ b/src/mid_set.c
@@ -38,6 +38,7 @@
* the copyright holders.
*
*/
+#include <assert.h>
#include "ipcalc.h"
#include "defs.h"
@@ -79,6 +80,15 @@
return 1;
}
+void olsr_delete_all_mid_entries(void) {
+ int hash;
+
+ for (hash = 0; hash < HASHSIZE; hash++) {
+ while (mid_set[hash].next != &mid_set[hash]) {
+ olsr_delete_mid_entry(mid_set[hash].next);
+ }
+ }
+}
/**
* Wrapper for the timer callback.
*/
@@ -124,10 +134,10 @@
*
* @param m_addr the main address of the node
* @param alias the alias address to insert
- * @return nada
+ * @return false if mid_address is unnecessary, true otherwise
*/
-void
+static bool
insert_mid_tuple(union olsr_ip_addr *m_addr, struct mid_address *alias, olsr_reltime vtime)
{
struct mid_entry *tmp;
@@ -147,9 +157,8 @@
/* Check if alias is already registered with m_addr */
registered_m_addr = mid_lookup_main_addr(&alias->alias);
if (registered_m_addr != NULL && ipequal(registered_m_addr, m_addr)) {
-
/* Alias is already registered with main address. Nothing to do here. */
- return;
+ return false;
}
/*
@@ -223,6 +232,7 @@
}
tmp_adr = tmp_adr->next_alias;
}
+ return true;
}
/**
@@ -284,7 +294,9 @@
}
}
- insert_mid_tuple(main_add, adr, vtime);
+ if (!insert_mid_tuple(main_add, adr, vtime)) {
+ free(adr);
+ }
/*
*Recalculate topology
--- a/src/mid_set.h
+++ b/src/mid_set.h
@@ -75,7 +75,7 @@
struct mid_alias;
int olsr_init_mid_set(void);
-void insert_mid_tuple(union olsr_ip_addr *, struct mid_address *, olsr_reltime);
+void olsr_delete_all_mid_entries(void);
void insert_mid_alias(union olsr_ip_addr *, const union olsr_ip_addr *, olsr_reltime);
union olsr_ip_addr *mid_lookup_main_addr(const union olsr_ip_addr *);
struct mid_address *mid_lookup_aliases(const union olsr_ip_addr *);
--- a/src/parser.c
+++ b/src/parser.c
@@ -104,6 +104,26 @@
}
void
+olsr_destroy_parser(void) {
+ struct parse_function_entry *pe, *pe_next;
+ struct preprocessor_function_entry *ppe, *ppe_next;
+ struct packetparser_function_entry *pae, *pae_next;
+
+ for (pe = parse_functions; pe; pe = pe_next) {
+ pe_next = pe->next;
+ free (pe);
+ }
+ for (ppe = preprocessor_functions; ppe; ppe = ppe_next) {
+ ppe_next = ppe->next;
+ free (ppe);
+ }
+ for (pae = packetparser_functions; pae; pae = pae_next) {
+ pae_next = pae->next;
+ free(pae);
+ }
+}
+
+void
olsr_parser_add_function(parse_function * function, uint32_t type)
{
struct parse_function_entry *new_entry;
--- a/src/parser.h
+++ b/src/parser.h
@@ -74,6 +74,8 @@
void olsr_init_parser(void);
+void olsr_destroy_parser(void);
+
void olsr_input(int);
void olsr_input_hostemu(int);
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -40,6 +40,8 @@
*
*/
+#include <assert.h>
+
#include "defs.h"
#include "scheduler.h"
#include "log.h"
--- a/src/tc_set.c
+++ b/src/tc_set.c
@@ -205,6 +205,14 @@
tc_myself = olsr_add_tc_entry(&olsr_cnf->main_addr);
}
+void olsr_delete_all_tc_entries(void) {
+ struct tc_entry *tc;
+
+ OLSR_FOR_ALL_TC_ENTRIES(tc) {
+ olsr_delete_tc_entry(tc);
+ } OLSR_FOR_ALL_TC_ENTRIES_END(tc)
+}
+
/**
* The main ip address has changed.
* Do the needful.
--- a/src/tc_set.h
+++ b/src/tc_set.h
@@ -142,6 +142,7 @@
extern struct tc_entry *tc_myself;
void olsr_init_tc(void);
+void olsr_delete_all_tc_entries(void);
void olsr_change_myself_tc(void);
void olsr_print_tc_table(void);
void olsr_time_out_tc_set(void);
|