- moved the sctp specific code from core to a module to make it easy to
enable/disable sctp by loading/not loading the module instead of
recompiling
1 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,746 +0,0 @@ |
1 |
-/* |
|
2 |
- * $Id$ |
|
3 |
- * |
|
4 |
- * Copyright (C) 2008 iptelorg GmbH |
|
5 |
- * |
|
6 |
- * Permission to use, copy, modify, and distribute this software for any |
|
7 |
- * purpose with or without fee is hereby granted, provided that the above |
|
8 |
- * copyright notice and this permission notice appear in all copies. |
|
9 |
- * |
|
10 |
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 |
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 |
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 |
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 |
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 |
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 |
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 |
- */ |
|
18 |
-/* |
|
19 |
- * sctp options |
|
20 |
- */ |
|
21 |
-/* |
|
22 |
- * History: |
|
23 |
- * -------- |
|
24 |
- * 2008-08-07 initial version (andrei) |
|
25 |
- * 2009-05-26 runtime cfg support (andrei) |
|
26 |
- */ |
|
27 |
- |
|
28 |
-/*! |
|
29 |
- * \file |
|
30 |
- * \brief SIP-router core :: |
|
31 |
- * \ingroup core |
|
32 |
- * Module: \ref core |
|
33 |
- */ |
|
34 |
- |
|
35 |
-#include <string.h> |
|
36 |
-#include <sys/types.h> |
|
37 |
-#ifdef USE_SCTP |
|
38 |
-#include <sys/socket.h> |
|
39 |
-#include <netinet/in.h> |
|
40 |
-#include <netinet/in_systm.h> |
|
41 |
-#include <netinet/ip.h> |
|
42 |
-#include <netinet/sctp.h> |
|
43 |
-#endif /* USE_SCTP */ |
|
44 |
-#include <errno.h> |
|
45 |
- |
|
46 |
-#include "sctp_options.h" |
|
47 |
-#include "dprint.h" |
|
48 |
-#include "cfg/cfg.h" |
|
49 |
-#include "socket_info.h" |
|
50 |
-#include "sctp_server.h" |
|
51 |
- |
|
52 |
-struct cfg_group_sctp sctp_default_cfg; |
|
53 |
- |
|
54 |
- |
|
55 |
- |
|
56 |
-#ifdef USE_SCTP |
|
57 |
- |
|
58 |
-#include "sctp_sockopts.h" |
|
59 |
- |
|
60 |
-static int fix_autoclose(void* cfg_h, str* gname, str* name, void** val); |
|
61 |
-static void set_autoclose(str* gname, str* name); |
|
62 |
-static int fix_assoc_tracking(void* cfg_h, str* gname, str* name, void** val); |
|
63 |
-static int fix_assoc_reuse(void* cfg_h, str* gname, str* name, void** val); |
|
64 |
-static int fix_srto_initial(void* cfg_h, str* gname, str* name, void** val); |
|
65 |
-static void set_srto_initial(str* gname, str* name); |
|
66 |
-static int fix_srto_max(void* cfg_h, str* gname, str* name, void** val); |
|
67 |
-static void set_srto_max(str* gname, str* name); |
|
68 |
-static int fix_srto_min(void* cfg_h, str* gname, str* name, void** val); |
|
69 |
-static void set_srto_min(str* gname, str* name); |
|
70 |
-static int fix_asocmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
71 |
-static void set_asocmaxrxt(str* gname, str* name); |
|
72 |
-static int fix_sinit_max_init_timeo(void* cfg_h, str* gname, str* name, |
|
73 |
- void** val); |
|
74 |
-static void set_sinit_max_init_timeo(str* gname, str* name); |
|
75 |
-static int fix_sinit_max_attempts(void* cfg_h, str* gname, str* name, |
|
76 |
- void** val); |
|
77 |
-static void set_sinit_max_attempts(str* gname, str* name); |
|
78 |
-static int fix_hbinterval(void* cfg_h, str* gname, str* name, void** val); |
|
79 |
-static void set_hbinterval(str* gname, str* name); |
|
80 |
-static int fix_pathmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
81 |
-static void set_pathmaxrxt(str* gname, str* name); |
|
82 |
-static int fix_sack_delay(void* cfg_h, str* gname, str* name, void** val); |
|
83 |
-static void set_sack_delay(str* gname, str* name); |
|
84 |
-static int fix_sack_freq(void* cfg_h, str* gname, str* name, void** val); |
|
85 |
-static void set_sack_freq(str* gname, str* name); |
|
86 |
-static int fix_max_burst(void* cfg_h, str* gname, str* name, void** val); |
|
87 |
-static void set_max_burst(str* gname, str* name); |
|
88 |
- |
|
89 |
-/** cfg_group_sctp description (for the config framework). */ |
|
90 |
-static cfg_def_t sctp_cfg_def[] = { |
|
91 |
- /* name , type |input type| chg type, min, max, fixup, proc. cbk. |
|
92 |
- description */ |
|
93 |
- { "socket_rcvbuf", CFG_VAR_INT| CFG_READONLY, 512, 102400, 0, 0, |
|
94 |
- "socket receive buffer size (read-only)" }, |
|
95 |
- { "socket_sndbuf", CFG_VAR_INT| CFG_READONLY, 512, 102400, 0, 0, |
|
96 |
- "socket send buffer size (read-only)" }, |
|
97 |
- { "autoclose", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 1, 1<<30, |
|
98 |
- fix_autoclose, set_autoclose, |
|
99 |
- "seconds before closing and idle connection (must be non-zero)" }, |
|
100 |
- { "send_ttl", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, 0, 0, |
|
101 |
- "milliseconds before aborting a send" }, |
|
102 |
- { "send_retries", CFG_VAR_INT| CFG_ATOMIC, 0, MAX_SCTP_SEND_RETRIES, 0, 0, |
|
103 |
- "re-send attempts on failure" }, |
|
104 |
- { "assoc_tracking", CFG_VAR_INT| CFG_ATOMIC, 0, 1, fix_assoc_tracking, 0, |
|
105 |
- "connection/association tracking (see also assoc_reuse)" }, |
|
106 |
- { "assoc_reuse", CFG_VAR_INT| CFG_ATOMIC, 0, 1, fix_assoc_reuse, 0, |
|
107 |
- "connection/association reuse (for now used only for replies)" |
|
108 |
- ", depends on assoc_tracking being set"}, |
|
109 |
- { "max_assocs", CFG_VAR_INT| CFG_ATOMIC, 0, 0, 0, 0, |
|
110 |
- "maximum allowed open associations (-1 = disable, " |
|
111 |
- "as many as allowed by the OS)"}, |
|
112 |
- { "srto_initial", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
113 |
- fix_srto_initial, set_srto_initial, |
|
114 |
- "initial value of the retr. timeout, used in RTO calculations," |
|
115 |
- " in msecs" }, |
|
116 |
- { "srto_max", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
117 |
- fix_srto_max, set_srto_max, |
|
118 |
- "maximum value of the retransmission timeout (RTO), in msecs" }, |
|
119 |
- { "srto_min", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
120 |
- fix_srto_min, set_srto_min, |
|
121 |
- "minimum value of the retransmission timeout (RTO), in msecs" }, |
|
122 |
- { "asocmaxrxt", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
123 |
- fix_asocmaxrxt, set_asocmaxrxt, |
|
124 |
- "maximum retransmission attempts per association" }, |
|
125 |
- { "init_max_attempts", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
126 |
- fix_sinit_max_attempts, set_sinit_max_attempts, |
|
127 |
- "max INIT retransmission attempts" }, |
|
128 |
- { "init_max_timeo", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
129 |
- fix_sinit_max_init_timeo, set_sinit_max_init_timeo, |
|
130 |
- "max INIT retransmission timeout (RTO max for INIT), in msecs" }, |
|
131 |
- { "hbinterval", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
132 |
- fix_hbinterval, set_hbinterval, "heartbeat interval in msecs" }, |
|
133 |
- { "pathmaxrxt", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
134 |
- fix_pathmaxrxt, set_pathmaxrxt, |
|
135 |
- "maximum retransmission attempts per path" }, |
|
136 |
- { "sack_delay", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
137 |
- fix_sack_delay, set_sack_delay, |
|
138 |
- "time since the last received packet before sending a SACK, in msecs"}, |
|
139 |
- { "sack_freq", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
140 |
- fix_sack_freq, set_sack_freq, |
|
141 |
- "number of received packets that trigger the sending of a SACK"}, |
|
142 |
- { "max_burst", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
143 |
- fix_max_burst, set_max_burst, |
|
144 |
- "maximum burst of packets that can be emitted by an association"}, |
|
145 |
- {0, 0, 0, 0, 0, 0, 0} |
|
146 |
-}; |
|
147 |
- |
|
148 |
- |
|
149 |
- |
|
150 |
-void* sctp_cfg; /* sctp config handle */ |
|
151 |
- |
|
152 |
-#endif /* USE_SCTP */ |
|
153 |
- |
|
154 |
-void init_sctp_options() |
|
155 |
-{ |
|
156 |
-#ifdef USE_SCTP |
|
157 |
- sctp_get_os_defaults(&sctp_default_cfg); |
|
158 |
-#if 0 |
|
159 |
- sctp_default_cfg.so_rcvbuf=0; /* do nothing, use the kernel default */ |
|
160 |
- sctp_default_cfg.so_sndbuf=0; /* do nothing, use the kernel default */ |
|
161 |
-#endif |
|
162 |
- sctp_default_cfg.autoclose=DEFAULT_SCTP_AUTOCLOSE; /* in seconds */ |
|
163 |
- sctp_default_cfg.send_ttl=DEFAULT_SCTP_SEND_TTL; /* in milliseconds */ |
|
164 |
- sctp_default_cfg.send_retries=DEFAULT_SCTP_SEND_RETRIES; |
|
165 |
- sctp_default_cfg.max_assocs=-1; /* as much as possible by default */ |
|
166 |
-#ifdef SCTP_CONN_REUSE |
|
167 |
- sctp_default_cfg.assoc_tracking=1; /* on by default */ |
|
168 |
- sctp_default_cfg.assoc_reuse=1; /* on by default */ |
|
169 |
-#else |
|
170 |
- sctp_default_cfg.assoc_tracking=0; |
|
171 |
- sctp_default_cfg.assoc_reuse=0; |
|
172 |
-#endif /* SCTP_CONN_REUSE */ |
|
173 |
-#endif |
|
174 |
-} |
|
175 |
- |
|
176 |
- |
|
177 |
- |
|
178 |
-#define W_OPT_NSCTP(option) \ |
|
179 |
- if (sctp_default_cfg.option){\ |
|
180 |
- WARN("sctp_options: " #option \ |
|
181 |
- " cannot be enabled (sctp support not compiled-in)\n"); \ |
|
182 |
- sctp_default_cfg.option=0; \ |
|
183 |
- } |
|
184 |
- |
|
185 |
- |
|
186 |
- |
|
187 |
-void sctp_options_check() |
|
188 |
-{ |
|
189 |
-#ifndef USE_SCTP |
|
190 |
- W_OPT_NSCTP(autoclose); |
|
191 |
- W_OPT_NSCTP(send_ttl); |
|
192 |
- W_OPT_NSCTP(send_retries); |
|
193 |
- W_OPT_NSCTP(assoc_tracking); |
|
194 |
- W_OPT_NSCTP(assoc_reuse); |
|
195 |
- W_OPT_NSCTP(max_assocs); |
|
196 |
-#else /* USE_SCTP */ |
|
197 |
- if (sctp_default_cfg.send_retries>MAX_SCTP_SEND_RETRIES) { |
|
198 |
- WARN("sctp: sctp_send_retries too high (%d), setting it to %d\n", |
|
199 |
- sctp_default_cfg.send_retries, MAX_SCTP_SEND_RETRIES); |
|
200 |
- sctp_default_cfg.send_retries=MAX_SCTP_SEND_RETRIES; |
|
201 |
- } |
|
202 |
-#ifndef CONN_REUSE |
|
203 |
- if (sctp_default_cfg.assoc_tracking || sctp_default_cfg.assoc_reuse){ |
|
204 |
- WARN("sctp_options: assoc_tracking and assoc_reuse support cannnot" |
|
205 |
- " be enabled (CONN_REUSE support not compiled-in)\n"); |
|
206 |
- sctp_default_cfg.assoc_tracking=0; |
|
207 |
- sctp_default_cfg.assoc_reuse=0; |
|
208 |
- } |
|
209 |
-#else /* CONN_REUSE */ |
|
210 |
- if (sctp_default_cfg.assoc_reuse && sctp_default_cfg.assoc_tracking==0){ |
|
211 |
- sctp_default_cfg.assoc_tracking=1; |
|
212 |
- } |
|
213 |
-#endif /* CONN_REUSE */ |
|
214 |
-#endif /* USE_SCTP */ |
|
215 |
-} |
|
216 |
- |
|
217 |
- |
|
218 |
- |
|
219 |
-void sctp_options_get(struct cfg_group_sctp *s) |
|
220 |
-{ |
|
221 |
-#ifdef USE_SCTP |
|
222 |
- *s=*(struct cfg_group_sctp*)sctp_cfg; |
|
223 |
-#else |
|
224 |
- memset(s, 0, sizeof(*s)); |
|
225 |
-#endif /* USE_SCTP */ |
|
226 |
-} |
|
227 |
- |
|
228 |
- |
|
229 |
- |
|
230 |
-#ifdef USE_SCTP |
|
231 |
-/** register sctp config into the configuration framework. |
|
232 |
- * @return 0 on success, -1 on error */ |
|
233 |
-int sctp_register_cfg() |
|
234 |
-{ |
|
235 |
- if (cfg_declare("sctp", sctp_cfg_def, &sctp_default_cfg, cfg_sizeof(sctp), |
|
236 |
- &sctp_cfg)) |
|
237 |
- return -1; |
|
238 |
- if (sctp_cfg==0){ |
|
239 |
- BUG("null sctp cfg"); |
|
240 |
- return -1; |
|
241 |
- } |
|
242 |
- return 0; |
|
243 |
-} |
|
244 |
- |
|
245 |
- |
|
246 |
- |
|
247 |
-#define SCTP_SET_SOCKOPT_DECLS \ |
|
248 |
- int err; \ |
|
249 |
- struct socket_info* si |
|
250 |
- |
|
251 |
- |
|
252 |
-#define SCTP_SET_SOCKOPT_BODY_NRET(lev, opt_name, val, err_prefix) \ |
|
253 |
- err=0; \ |
|
254 |
- for (si=sctp_listen; si; si=si->next){ \ |
|
255 |
- err+=(sctp_setsockopt(si->socket, (lev), (opt_name), (void*)(&(val)), \ |
|
256 |
- sizeof((val)), (err_prefix))<0); \ |
|
257 |
- } |
|
258 |
- |
|
259 |
-#define SCTP_SET_SOCKOPT_BODY(lev, opt_name, val, err_prefix) \ |
|
260 |
- SCTP_SET_SOCKOPT_BODY_NRET(lev, opt_name, val, err_prefix) ; \ |
|
261 |
- return -(err!=0) |
|
262 |
- |
|
263 |
- |
|
264 |
-static int fix_autoclose(void*cfg_h, str* gname, str* name, void** val) |
|
265 |
-{ |
|
266 |
-#ifdef SCTP_AUTOCLOSE |
|
267 |
- return 0; |
|
268 |
-#else |
|
269 |
- ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n"); |
|
270 |
- return -1; |
|
271 |
-#endif /* SCTP_AUTOCLOSE */ |
|
272 |
-} |
|
273 |
- |
|
274 |
- |
|
275 |
-static void set_autoclose(str* gname, str* name) |
|
276 |
-{ |
|
277 |
-#ifdef SCTP_AUTOCLOSE |
|
278 |
- int optval; |
|
279 |
- SCTP_SET_SOCKOPT_DECLS; |
|
280 |
- |
|
281 |
- optval=cfg_get(sctp, sctp_cfg, autoclose); |
|
282 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_AUTOCLOSE, optval, |
|
283 |
- "cfg: setting SCTP_AUTOCLOSE"); |
|
284 |
-#else |
|
285 |
- ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n"); |
|
286 |
-#endif /* SCTP_AUTOCLOSE */ |
|
287 |
-} |
|
288 |
- |
|
289 |
- |
|
290 |
- |
|
291 |
-static int fix_assoc_tracking(void* cfg_h, str* gname, str* name, void** val) |
|
292 |
-{ |
|
293 |
- int optval; |
|
294 |
- |
|
295 |
- optval=(int)(long)(*val); |
|
296 |
-#ifndef SCTP_CONN_REUSE |
|
297 |
- if (optval!=0){ |
|
298 |
- ERR("no SCTP_CONN_REUSE support, please recompile with it enabled\n"); |
|
299 |
- return -1; |
|
300 |
- } |
|
301 |
-#else /* SCTP_CONN_REUSE */ |
|
302 |
- if (optval==0){ |
|
303 |
- /* turn tracking off */ |
|
304 |
- /* check if assoc_reuse is off */ |
|
305 |
- if (cfg_get(sctp, cfg_h, assoc_reuse)!=0){ |
|
306 |
- ERR("cannot turn sctp assoc_tracking off while assoc_reuse is" |
|
307 |
- " still on, please turn assoc_reuse off first\n"); |
|
308 |
- return -1; |
|
309 |
- } |
|
310 |
- sctp_con_tracking_flush(); |
|
311 |
- }else if (optval==1 && cfg_get(sctp, cfg_h, assoc_reuse)==0){ |
|
312 |
- /* turning from off to on, make sure we flush the tracked list |
|
313 |
- again, just incase the off flush was racing with a new connection*/ |
|
314 |
- sctp_con_tracking_flush(); |
|
315 |
- } |
|
316 |
-#endif /* SCTP_CONN_REUSE */ |
|
317 |
- return 0; |
|
318 |
-} |
|
319 |
- |
|
320 |
- |
|
321 |
- |
|
322 |
-static int fix_assoc_reuse(void* cfg_h, str* gname, str* name, void** val) |
|
323 |
-{ |
|
324 |
- int optval; |
|
325 |
- |
|
326 |
- optval=(int)(long)(*val); |
|
327 |
-#ifndef SCTP_CONN_REUSE |
|
328 |
- if (optval!=0){ |
|
329 |
- ERR("no SCTP_CONN_REUSE support, please recompile with it enabled\n"); |
|
330 |
- return -1; |
|
331 |
- } |
|
332 |
-#else /* SCTP_CONN_REUSE */ |
|
333 |
- if (optval==1 && cfg_get(sctp, cfg_h, assoc_tracking)==0){ |
|
334 |
- /* conn reuse on, but assoc_tracking off => not possible */ |
|
335 |
- ERR("cannot turn sctp assoc_reuse on while assoc_tracking is" |
|
336 |
- " off, please turn assoc_tracking on first\n"); |
|
337 |
- return -1; |
|
338 |
- } |
|
339 |
-#endif /* SCTP_CONN_REUSE */ |
|
340 |
- return 0; |
|
341 |
-} |
|
342 |
- |
|
343 |
- |
|
344 |
- |
|
345 |
-static int fix_srto_initial(void* cfg_h, str* gname, str* name, void** val) |
|
346 |
-{ |
|
347 |
-#ifdef SCTP_RTOINFO |
|
348 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
349 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, srto_initial); |
|
350 |
- } |
|
351 |
- return 0; |
|
352 |
-#else |
|
353 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
354 |
- return -1; |
|
355 |
-#endif /* SCTP_RTOINFO */ |
|
356 |
-} |
|
357 |
- |
|
358 |
- |
|
359 |
-static void set_srto_initial(str* gname, str* name) |
|
360 |
-{ |
|
361 |
-#ifdef SCTP_RTOINFO |
|
362 |
- struct sctp_rtoinfo rto; |
|
363 |
- int optval; |
|
364 |
- SCTP_SET_SOCKOPT_DECLS; |
|
365 |
- |
|
366 |
- optval=cfg_get(sctp, sctp_cfg, srto_initial); |
|
367 |
- memset(&rto, 0, sizeof(rto)); /* zero everything we don't care about */ |
|
368 |
- rto.srto_assoc_id=0; /* all */ |
|
369 |
- rto.srto_initial=optval; |
|
370 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_RTOINFO, rto, |
|
371 |
- "cfg: setting SCTP_RTOINFO"); |
|
372 |
-#else |
|
373 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
374 |
-#endif /* SCTP_RTOINFO */ |
|
375 |
-} |
|
376 |
- |
|
377 |
- |
|
378 |
- |
|
379 |
-static int fix_srto_max(void* cfg_h, str* gname, str* name, void** val) |
|
380 |
-{ |
|
381 |
-#ifdef SCTP_RTOINFO |
|
382 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
383 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, srto_max); |
|
384 |
- } |
|
385 |
- return 0; |
|
386 |
-#else |
|
387 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
388 |
- return -1; |
|
389 |
-#endif /* SCTP_RTOINFO */ |
|
390 |
-} |
|
391 |
- |
|
392 |
- |
|
393 |
-static void set_srto_max(str* gname, str* name) |
|
394 |
-{ |
|
395 |
-#ifdef SCTP_RTOINFO |
|
396 |
- struct sctp_rtoinfo rto; |
|
397 |
- SCTP_SET_SOCKOPT_DECLS; |
|
398 |
- |
|
399 |
- memset(&rto, 0, sizeof(rto)); /* zero everything we don't care about */ |
|
400 |
- rto.srto_assoc_id=0; /* all */ |
|
401 |
- rto.srto_max=cfg_get(sctp, sctp_cfg, srto_max); |
|
402 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_RTOINFO, rto, |
|
403 |
- "cfg: setting SCTP_RTOINFO"); |
|
404 |
-#else |
|
405 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
406 |
-#endif /* SCTP_RTOINFO */ |
|
407 |
-} |
|
408 |
- |
|
409 |
- |
|
410 |
- |
|
411 |
-static int fix_srto_min(void* cfg_h, str* gname, str* name, void** val) |
|
412 |
-{ |
|
413 |
-#ifdef SCTP_RTOINFO |
|
414 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
415 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, srto_min); |
|
416 |
- } |
|
417 |
- return 0; |
|
418 |
-#else |
|
419 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
420 |
- return -1; |
|
421 |
-#endif /* SCTP_RTOINFO */ |
|
422 |
-} |
|
423 |
- |
|
424 |
- |
|
425 |
-static void set_srto_min(str* gname, str* name) |
|
426 |
-{ |
|
427 |
-#ifdef SCTP_RTOINFO |
|
428 |
- struct sctp_rtoinfo rto; |
|
429 |
- SCTP_SET_SOCKOPT_DECLS; |
|
430 |
- |
|
431 |
- memset(&rto, 0, sizeof(rto)); /* zero everything we don't care about */ |
|
432 |
- rto.srto_assoc_id=0; /* all */ |
|
433 |
- rto.srto_min=cfg_get(sctp, sctp_cfg, srto_min); |
|
434 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_RTOINFO, rto, |
|
435 |
- "cfg: setting SCTP_RTOINFO"); |
|
436 |
-#else |
|
437 |
- ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n"); |
|
438 |
-#endif /* SCTP_RTOINFO */ |
|
439 |
-} |
|
440 |
- |
|
441 |
- |
|
442 |
- |
|
443 |
-static int fix_asocmaxrxt(void* cfg_h, str* gname, str* name, void** val) |
|
444 |
-{ |
|
445 |
-#ifdef SCTP_ASSOCINFO |
|
446 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
447 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, asocmaxrxt); |
|
448 |
- } |
|
449 |
- return 0; |
|
450 |
-#else |
|
451 |
- ERR("no SCTP_ASSOCINFO support, please upgrade your sctp library\n"); |
|
452 |
- return -1; |
|
453 |
-#endif /* SCTP_ASSOCINFO */ |
|
454 |
-} |
|
455 |
- |
|
456 |
- |
|
457 |
-static void set_asocmaxrxt(str* gname, str* name) |
|
458 |
-{ |
|
459 |
-#ifdef SCTP_ASSOCINFO |
|
460 |
- struct sctp_assocparams ap; |
|
461 |
- SCTP_SET_SOCKOPT_DECLS; |
|
462 |
- |
|
463 |
- memset(&ap, 0, sizeof(ap)); /* zero everything we don't care about */ |
|
464 |
- ap.sasoc_assoc_id=0; /* all */ |
|
465 |
- ap.sasoc_asocmaxrxt= cfg_get(sctp, sctp_cfg, asocmaxrxt); |
|
466 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_ASSOCINFO, ap, |
|
467 |
- "cfg: setting SCTP_ASSOCINFO"); |
|
468 |
-#else |
|
469 |
- ERR("no SCTP_ASSOCINFO support, please upgrade your sctp library\n"); |
|
470 |
-#endif /* SCTP_ASSOCINFO */ |
|
471 |
-} |
|
472 |
- |
|
473 |
- |
|
474 |
- |
|
475 |
-static int fix_sinit_max_init_timeo(void* cfg_h, str* gname, str* name, |
|
476 |
- void** val) |
|
477 |
-{ |
|
478 |
-#ifdef SCTP_INITMSG |
|
479 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
480 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, init_max_timeo); |
|
481 |
- } |
|
482 |
- return 0; |
|
483 |
-#else |
|
484 |
- ERR("no SCTP_INITMSG support, please upgrade your sctp library\n"); |
|
485 |
- return -1; |
|
486 |
-#endif /* SCTP_INITMSG */ |
|
487 |
-} |
|
488 |
- |
|
489 |
- |
|
490 |
-static void set_sinit_max_init_timeo(str* gname, str* name) |
|
491 |
-{ |
|
492 |
-#ifdef SCTP_INITMSG |
|
493 |
- struct sctp_initmsg im; |
|
494 |
- SCTP_SET_SOCKOPT_DECLS; |
|
495 |
- |
|
496 |
- memset(&im, 0, sizeof(im)); /* zero everything we don't care about */ |
|
497 |
- im.sinit_max_init_timeo=cfg_get(sctp, sctp_cfg, init_max_timeo); |
|
498 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_INITMSG, im, |
|
499 |
- "cfg: setting SCTP_INITMSG"); |
|
500 |
-#else |
|
501 |
- ERR("no SCTP_INITMSG support, please upgrade your sctp library\n"); |
|
502 |
-#endif /* SCTP_INITMSG */ |
|
503 |
-} |
|
504 |
- |
|
505 |
- |
|
506 |
- |
|
507 |
-static int fix_sinit_max_attempts(void* cfg_h, str* gname, str* name, |
|
508 |
- void** val) |
|
509 |
-{ |
|
510 |
-#ifdef SCTP_INITMSG |
|
511 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
512 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, init_max_attempts); |
|
513 |
- } |
|
514 |
- return 0; |
|
515 |
-#else |
|
516 |
- ERR("no SCTP_INITMSG support, please upgrade your sctp library\n"); |
|
517 |
- return -1; |
|
518 |
-#endif /* SCTP_INITMSG */ |
|
519 |
-} |
|
520 |
- |
|
521 |
- |
|
522 |
-static void set_sinit_max_attempts(str* gname, str* name) |
|
523 |
-{ |
|
524 |
-#ifdef SCTP_INITMSG |
|
525 |
- struct sctp_initmsg im; |
|
526 |
- SCTP_SET_SOCKOPT_DECLS; |
|
527 |
- |
|
528 |
- memset(&im, 0, sizeof(im)); /* zero everything we don't care about */ |
|
529 |
- im.sinit_max_attempts=cfg_get(sctp, sctp_cfg, init_max_attempts); |
|
530 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_INITMSG, im, |
|
531 |
- "cfg: setting SCTP_INITMSG"); |
|
532 |
-#else |
|
533 |
- ERR("no SCTP_INITMSG support, please upgrade your sctp library\n"); |
|
534 |
-#endif /* SCTP_INITMSG */ |
|
535 |
-} |
|
536 |
- |
|
537 |
- |
|
538 |
- |
|
539 |
-static int fix_hbinterval(void* cfg_h, str* gname, str* name, |
|
540 |
- void** val) |
|
541 |
-{ |
|
542 |
-#ifdef SCTP_PEER_ADDR_PARAMS |
|
543 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
544 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, hbinterval); |
|
545 |
- } |
|
546 |
- return 0; |
|
547 |
-#else |
|
548 |
- ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your" |
|
549 |
- " sctp library\n"); |
|
550 |
- return -1; |
|
551 |
-#endif /* SCTP_PEER_ADDR_PARAMS */ |
|
552 |
-} |
|
553 |
- |
|
554 |
- |
|
555 |
-static void set_hbinterval(str* gname, str* name) |
|
556 |
-{ |
|
557 |
-#ifdef SCTP_PEER_ADDR_PARAMS |
|
558 |
- struct sctp_paddrparams pp; |
|
559 |
- int optval; |
|
560 |
- SCTP_SET_SOCKOPT_DECLS; |
|
561 |
- |
|
562 |
- optval=cfg_get(sctp, sctp_cfg, hbinterval); |
|
563 |
- memset(&pp, 0, sizeof(pp)); /* zero everything we don't care about */ |
|
564 |
- if (optval!=-1){ |
|
565 |
- pp.spp_hbinterval=optval; |
|
566 |
- pp.spp_flags=SPP_HB_ENABLE; |
|
567 |
- }else{ |
|
568 |
- pp.spp_flags=SPP_HB_DISABLE; |
|
569 |
- } |
|
570 |
- err=0; |
|
571 |
- for (si=sctp_listen; si; si=si->next){ |
|
572 |
- /* set the AF, needed on older linux kernels even for INADDR_ANY */ |
|
573 |
- pp.spp_address.ss_family=si->address.af; |
|
574 |
- err+=(sctp_setsockopt(si->socket, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, |
|
575 |
- (void*)(&pp), sizeof(pp), |
|
576 |
- "cfg: setting SCTP_PEER_ADDR_PARAMS")<0); |
|
577 |
- } |
|
578 |
-#else |
|
579 |
- ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your" |
|
580 |
- " sctp library\n"); |
|
581 |
-#endif /* SCTP_PEER_ADDR_PARAMS */ |
|
582 |
-} |
|
583 |
- |
|
584 |
- |
|
585 |
- |
|
586 |
-static int fix_pathmaxrxt(void* cfg_h, str* gname, str* name, |
|
587 |
- void** val) |
|
588 |
-{ |
|
589 |
-#ifdef SCTP_PEER_ADDR_PARAMS |
|
590 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
591 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, pathmaxrxt); |
|
592 |
- } |
|
593 |
- return 0; |
|
594 |
-#else |
|
595 |
- ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your" |
|
596 |
- " sctp library\n"); |
|
597 |
- return -1; |
|
598 |
-#endif /* SCTP_PEER_ADDR_PARAMS */ |
|
599 |
-} |
|
600 |
- |
|
601 |
- |
|
602 |
-static void set_pathmaxrxt(str* gname, str* name) |
|
603 |
-{ |
|
604 |
-#ifdef SCTP_PEER_ADDR_PARAMS |
|
605 |
- struct sctp_paddrparams pp; |
|
606 |
- SCTP_SET_SOCKOPT_DECLS; |
|
607 |
- |
|
608 |
- memset(&pp, 0, sizeof(pp)); /* zero everything we don't care about */ |
|
609 |
- pp.spp_pathmaxrxt=cfg_get(sctp, sctp_cfg, pathmaxrxt); |
|
610 |
- err=0; |
|
611 |
- for (si=sctp_listen; si; si=si->next){ |
|
612 |
- /* set the AF, needed on older linux kernels even for INADDR_ANY */ |
|
613 |
- pp.spp_address.ss_family=si->address.af; |
|
614 |
- err+=(sctp_setsockopt(si->socket, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, |
|
615 |
- (void*)(&pp), sizeof(pp), |
|
616 |
- "cfg: setting SCTP_PEER_ADDR_PARAMS")<0); |
|
617 |
- } |
|
618 |
-#else |
|
619 |
- ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your" |
|
620 |
- " sctp library\n"); |
|
621 |
-#endif /* SCTP_PEER_ADDR_PARAMS */ |
|
622 |
-} |
|
623 |
- |
|
624 |
- |
|
625 |
- |
|
626 |
-static int fix_sack_delay(void* cfg_h, str* gname, str* name, void** val) |
|
627 |
-{ |
|
628 |
-#if defined SCTP_DELAYED_SACK || defined SCTP_DELAYED_ACK_TIME |
|
629 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
630 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, sack_delay); |
|
631 |
- } |
|
632 |
- return 0; |
|
633 |
-#else |
|
634 |
- ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n"); |
|
635 |
- return -1; |
|
636 |
-#endif /* SCTP_DELAYED_SACK | SCTP_DELAYED_ACK_TIME */ |
|
637 |
-} |
|
638 |
- |
|
639 |
- |
|
640 |
-static void set_sack_delay(str* gname, str* name) |
|
641 |
-{ |
|
642 |
-#if defined SCTP_DELAYED_SACK || defined SCTP_DELAYED_ACK_TIME |
|
643 |
-#ifdef SCTP_DELAYED_SACK |
|
644 |
- struct sctp_sack_info sack_info; |
|
645 |
-#endif /* SCTP_DELAYED_SACK */ |
|
646 |
-#ifdef SCTP_DELAYED_ACK_TIME |
|
647 |
- struct sctp_assoc_value sack_val; /* old version, sack delay only */ |
|
648 |
-#endif /* SCTP_DELAYED_ACK_TIME */ |
|
649 |
- SCTP_SET_SOCKOPT_DECLS; |
|
650 |
- |
|
651 |
-#ifdef SCTP_DELAYED_SACK |
|
652 |
- memset(&sack_info, 0, sizeof(sack_info)); /* zero everything we don't |
|
653 |
- care about */ |
|
654 |
- sack_info.sack_delay=cfg_get(sctp, sctp_cfg, sack_delay); |
|
655 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_DELAYED_SACK, sack_info, 0); |
|
656 |
- if (err==0){ |
|
657 |
- return; |
|
658 |
- }else |
|
659 |
-#endif /* SCTP_DELAYED_SACK */ |
|
660 |
- { |
|
661 |
- /* setting SCTP_DELAYED_SACK failed or no lib support for |
|
662 |
- SCTP_DELAYED_SACK => try the old obsolete SCTP_DELAYED_ACK_TIME */ |
|
663 |
-#ifdef SCTP_DELAYED_ACK_TIME |
|
664 |
- memset(&sack_val, 0, sizeof(sack_val)); /* zero everything we don't |
|
665 |
- care about */ |
|
666 |
- sack_val.assoc_value=cfg_get(sctp, sctp_cfg, sack_delay); |
|
667 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_DELAYED_ACK_TIME, |
|
668 |
- sack_val, |
|
669 |
- "cfg: setting SCTP_DELAYED_ACK_TIME"); |
|
670 |
- if (err==0) |
|
671 |
- return; |
|
672 |
-#else /* SCTP_DELAYED_ACK_TIME */ |
|
673 |
- /* no SCTP_DELAYED_ACK_TIME support and SCTP_DELAYED_SACK failed |
|
674 |
- => error */ |
|
675 |
- ERR("cfg: setting SCTP_DELAYED_SACK: %s [%d]\n", |
|
676 |
- strerror(errno), errno); |
|
677 |
-#endif /* SCTP_DELAYED_ACK_TIME */ |
|
678 |
- } |
|
679 |
-#else |
|
680 |
- ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n"); |
|
681 |
-#endif /* SCTP_DELAYED_SACK | SCTP_DELAYED_ACK_TIME */ |
|
682 |
-} |
|
683 |
- |
|
684 |
- |
|
685 |
- |
|
686 |
-static int fix_sack_freq(void* cfg_h, str* gname, str* name, void** val) |
|
687 |
-{ |
|
688 |
-#ifdef SCTP_DELAYED_SACK |
|
689 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
690 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, sack_freq); |
|
691 |
- } |
|
692 |
- return 0; |
|
693 |
-#else |
|
694 |
- ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n"); |
|
695 |
- return -1; |
|
696 |
-#endif /* SCTP_DELAYED_SACK */ |
|
697 |
-} |
|
698 |
- |
|
699 |
- |
|
700 |
-static void set_sack_freq(str* gname, str* name) |
|
701 |
-{ |
|
702 |
-#ifdef SCTP_DELAYED_SACK |
|
703 |
- struct sctp_sack_info sa; |
|
704 |
- SCTP_SET_SOCKOPT_DECLS; |
|
705 |
- |
|
706 |
- memset(&sa, 0, sizeof(sa)); /* zero everything we don't care about */ |
|
707 |
- sa.sack_freq=cfg_get(sctp, sctp_cfg, sack_freq); |
|
708 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_DELAYED_SACK, sa, |
|
709 |
- "cfg: setting SCTP_DELAYED_SACK"); |
|
710 |
-#else |
|
711 |
- ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n"); |
|
712 |
-#endif /* SCTP_DELAYED_SACK */ |
|
713 |
-} |
|
714 |
- |
|
715 |
- |
|
716 |
- |
|
717 |
-static int fix_max_burst(void* cfg_h, str* gname, str* name, void** val) |
|
718 |
-{ |
|
719 |
-#ifdef SCTP_MAX_BURST |
|
720 |
- if ((int)(long)(*val)==0){ /* do nothing for 0, keep the old value */ |
|
721 |
- *val=(void*)(long)cfg_get(sctp, cfg_h, max_burst); |
|
722 |
- } |
|
723 |
- return 0; |
|
724 |
-#else |
|
725 |
- ERR("no SCTP_MAX_BURST support, please upgrade your sctp library\n"); |
|
726 |
- return -1; |
|
727 |
-#endif /* SCTP_MAX_BURST */ |
|
728 |
-} |
|
729 |
- |
|
730 |
- |
|
731 |
-static void set_max_burst(str* gname, str* name) |
|
732 |
-{ |
|
733 |
-#ifdef SCTP_MAX_BURST |
|
734 |
- struct sctp_assoc_value av; |
|
735 |
- SCTP_SET_SOCKOPT_DECLS; |
|
736 |
- |
|
737 |
- memset(&av, 0, sizeof(av)); /* zero everything we don't care about */ |
|
738 |
- av.assoc_value=cfg_get(sctp, sctp_cfg, max_burst); |
|
739 |
- SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_MAX_BURST, av, |
|
740 |
- "cfg: setting SCTP_MAX_BURST"); |
|
741 |
-#else |
|
742 |
- ERR("no SCTP_MAX_BURST support, please upgrade your sctp library\n"); |
|
743 |
-#endif /* SCTP_MAX_BURST */ |
|
744 |
-} |
|
745 |
- |
|
746 |
-#endif /* USE_SCTP */ |
latest sr_3.0 fixes, after kamailio 3.0 release.
* origin/sr_3.0: (58 commits)
Backport of the changes (see previous commits).
kex: documented missing functions
kex: aliased avp_printf to pv_printf
auth_diameter(k): remove redundant declaration of find_credentials, now in core
- fix bug in encode_contact()
- fix bug when RURI was changed before and newuri will be used
- remove unused code
modules_k/nathelper: removed garbage from documentation (credits to Klaus)
modules_k/nathelper: improved handle_ruri_alias() documentation
modules/lcr and modules_k/nathelper: fixed compiler warnings
modules_k/nathelper: handle_uri_alias() alias handling fix
modules_k/usrloc: changed 'Kamailio' to 'SIP Router' in user agent string.
tm: safer handling for local transactions and drop_replies!=0
sctp: stats: don't increment ASSOC_SHUTDOWN on COMM_LOST
sctp: SCTP_STATS_ASSOC_SHUTDOWN
tm doc: local_ack_mode documentation
tm: new param: local_ack_mode
makefile: fix make bin & basedir
core: fix parsing for avps with the same name as a pv class
tls: name the certificates based on $MAIN_NAME
...
Conflicts:
modules/tm/README
modules_k/nathelper/rtpproxy_stream.c
pkg/debian/rules
- all the runtime cfg options that involve setting socket options
are now set using a per-child cfg callback with
CFG_CB_ONLY_ONCE and not in the value fixup function. This fixes
cfg.set_delayed* (up until now it did set these options
immediately and not after cfg.commit).
- init_max_timeo valid range fixed (from 0-1024 to 0-2^30).
... | ... |
@@ -50,22 +50,34 @@ struct cfg_group_sctp sctp_default_cfg; |
50 | 50 |
|
51 | 51 |
#include "sctp_sockopts.h" |
52 | 52 |
|
53 |
-static int set_autoclose(void* cfg_h, str* gname, str* name, void** val); |
|
54 |
-static int set_assoc_tracking(void* cfg_h, str* gname, str* name, void** val); |
|
55 |
-static int set_assoc_reuse(void* cfg_h, str* gname, str* name, void** val); |
|
56 |
-static int set_srto_initial(void* cfg_h, str* gname, str* name, void** val); |
|
57 |
-static int set_srto_max(void* cfg_h, str* gname, str* name, void** val); |
|
58 |
-static int set_srto_min(void* cfg_h, str* gname, str* name, void** val); |
|
59 |
-static int set_asocmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
60 |
-static int set_sinit_max_attempts(void* cfg_h, str* gname, str* name, |
|
53 |
+static int fix_autoclose(void* cfg_h, str* gname, str* name, void** val); |
|
54 |
+static void set_autoclose(str* gname, str* name); |
|
55 |
+static int fix_assoc_tracking(void* cfg_h, str* gname, str* name, void** val); |
|
56 |
+static int fix_assoc_reuse(void* cfg_h, str* gname, str* name, void** val); |
|
57 |
+static int fix_srto_initial(void* cfg_h, str* gname, str* name, void** val); |
|
58 |
+static void set_srto_initial(str* gname, str* name); |
|
59 |
+static int fix_srto_max(void* cfg_h, str* gname, str* name, void** val); |
|
60 |
+static void set_srto_max(str* gname, str* name); |
|
61 |
+static int fix_srto_min(void* cfg_h, str* gname, str* name, void** val); |
|
62 |
+static void set_srto_min(str* gname, str* name); |
|
63 |
+static int fix_asocmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
64 |
+static void set_asocmaxrxt(str* gname, str* name); |
|
65 |
+static int fix_sinit_max_init_timeo(void* cfg_h, str* gname, str* name, |
|
61 | 66 |
void** val); |
62 |
-static int set_sinit_max_init_timeo(void* cfg_h, str* gname, str* name, |
|
67 |
+static void set_sinit_max_init_timeo(str* gname, str* name); |
|
68 |
+static int fix_sinit_max_attempts(void* cfg_h, str* gname, str* name, |
|
63 | 69 |
void** val); |
64 |
-static int set_hbinterval(void* cfg_h, str* gname, str* name, void** val); |
|
65 |
-static int set_pathmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
66 |
-static int set_sack_freq(void* cfg_h, str* gname, str* name, void** val); |
|
67 |
-static int set_sack_delay(void* cfg_h, str* gname, str* name, void** val); |
|
68 |
-static int set_max_burst(void* cfg_h, str* gname, str* name, void** val); |
|
70 |
+static void set_sinit_max_attempts(str* gname, str* name); |
|
71 |
+static int fix_hbinterval(void* cfg_h, str* gname, str* name, void** val); |
|
72 |
+static void set_hbinterval(str* gname, str* name); |
|
73 |
+static int fix_pathmaxrxt(void* cfg_h, str* gname, str* name, void** val); |
|
74 |
+static void set_pathmaxrxt(str* gname, str* name); |
|
75 |
+static int fix_sack_delay(void* cfg_h, str* gname, str* name, void** val); |
|
76 |
+static void set_sack_delay(str* gname, str* name); |
|
77 |
+static int fix_sack_freq(void* cfg_h, str* gname, str* name, void** val); |
|
78 |
+static void set_sack_freq(str* gname, str* name); |
|
79 |
+static int fix_max_burst(void* cfg_h, str* gname, str* name, void** val); |
|
80 |
+static void set_max_burst(str* gname, str* name); |
|
69 | 81 |
|
70 | 82 |
/** cfg_group_sctp description (for the config framework). */ |
71 | 83 |
static cfg_def_t sctp_cfg_def[] = { |
... | ... |
@@ -75,43 +87,53 @@ static cfg_def_t sctp_cfg_def[] = { |
75 | 87 |
"socket receive buffer size (read-only)" }, |
76 | 88 |
{ "socket_sndbuf", CFG_VAR_INT| CFG_READONLY, 512, 102400, 0, 0, |
77 | 89 |
"socket send buffer size (read-only)" }, |
78 |
- { "autoclose", CFG_VAR_INT| CFG_ATOMIC, 1, 1<<30, set_autoclose, 0, |
|
90 |
+ { "autoclose", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 1, 1<<30, |
|
91 |
+ fix_autoclose, set_autoclose, |
|
79 | 92 |
"seconds before closing and idle connection (must be non-zero)" }, |
80 | 93 |
{ "send_ttl", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, 0, 0, |
81 | 94 |
"milliseconds before aborting a send" }, |
82 | 95 |
{ "send_retries", CFG_VAR_INT| CFG_ATOMIC, 0, MAX_SCTP_SEND_RETRIES, 0, 0, |
83 | 96 |
"re-send attempts on failure" }, |
84 |
- { "assoc_tracking", CFG_VAR_INT| CFG_ATOMIC, 0, 1, set_assoc_tracking, 0, |
|
97 |
+ { "assoc_tracking", CFG_VAR_INT| CFG_ATOMIC, 0, 1, fix_assoc_tracking, 0, |
|
85 | 98 |
"connection/association tracking (see also assoc_reuse)" }, |
86 |
- { "assoc_reuse", CFG_VAR_INT| CFG_ATOMIC, 0, 1, set_assoc_reuse, 0, |
|
99 |
+ { "assoc_reuse", CFG_VAR_INT| CFG_ATOMIC, 0, 1, fix_assoc_reuse, 0, |
|
87 | 100 |
"connection/association reuse (for now used only for replies)" |
88 | 101 |
", depends on assoc_tracking being set"}, |
89 | 102 |
{ "max_assocs", CFG_VAR_INT| CFG_ATOMIC, 0, 0, 0, 0, |
90 | 103 |
"maximum allowed open associations (-1 = disable, " |
91 | 104 |
"as many as allowed by the OS)"}, |
92 |
- { "srto_initial", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, set_srto_initial, 0, |
|
105 |
+ { "srto_initial", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
106 |
+ fix_srto_initial, set_srto_initial, |
|
93 | 107 |
"initial value of the retr. timeout, used in RTO calculations," |
94 | 108 |
" in msecs" }, |
95 |
- { "srto_max", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, set_srto_max, 0, |
|
109 |
+ { "srto_max", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
110 |
+ fix_srto_max, set_srto_max, |
|
96 | 111 |
"maximum value of the retransmission timeout (RTO), in msecs" }, |
97 |
- { "srto_min", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, set_srto_min, 0, |
|
112 |
+ { "srto_min", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
113 |
+ fix_srto_min, set_srto_min, |
|
98 | 114 |
"minimum value of the retransmission timeout (RTO), in msecs" }, |
99 |
- { "asocmaxrxt", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, set_asocmaxrxt, 0, |
|
115 |
+ { "asocmaxrxt", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
116 |
+ fix_asocmaxrxt, set_asocmaxrxt, |
|
100 | 117 |
"maximum retransmission attempts per association" }, |
101 |
- { "init_max_attempts", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, |
|
102 |
- set_sinit_max_attempts, 0, "max INIT retransmission attempts" }, |
|
103 |
- { "init_max_timeo", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, |
|
104 |
- set_sinit_max_init_timeo, 0, |
|
118 |
+ { "init_max_attempts", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
119 |
+ fix_sinit_max_attempts, set_sinit_max_attempts, |
|
120 |
+ "max INIT retransmission attempts" }, |
|
121 |
+ { "init_max_timeo", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
122 |
+ fix_sinit_max_init_timeo, set_sinit_max_init_timeo, |
|
105 | 123 |
"max INIT retransmission timeout (RTO max for INIT), in msecs" }, |
106 |
- { "hbinterval", CFG_VAR_INT| CFG_ATOMIC, 0, 0, set_hbinterval, 0, |
|
107 |
- "heartbeat interval in msecs" }, |
|
108 |
- { "pathmaxrxt", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, set_pathmaxrxt, 0, |
|
124 |
+ { "hbinterval", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
125 |
+ fix_hbinterval, set_hbinterval, "heartbeat interval in msecs" }, |
|
126 |
+ { "pathmaxrxt", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
127 |
+ fix_pathmaxrxt, set_pathmaxrxt, |
|
109 | 128 |
"maximum retransmission attempts per path" }, |
110 |
- { "sack_delay", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<30, set_sack_delay, 0, |
|
129 |
+ { "sack_delay", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<30, |
|
130 |
+ fix_sack_delay, set_sack_delay, |
|
111 | 131 |
"time since the last received packet before sending a SACK, in msecs"}, |
112 |
- { "sack_freq", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, set_sack_freq, 0, |
|
132 |
+ { "sack_freq", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
133 |
+ fix_sack_freq, set_sack_freq, |
|
113 | 134 |
"number of received packets that trigger the sending of a SACK"}, |
114 |
- { "max_burst", CFG_VAR_INT| CFG_ATOMIC, 0, 1<<10, set_max_burst, 0, |
|
135 |
+ { "max_burst", CFG_VAR_INT| CFG_CB_ONLY_ONCE, 0, 1<<10, |
|
136 |
+ fix_max_burst, set_max_burst, |
|
115 | 137 |
"maximum burst of packets that can be emitted by an association"}, |
116 | 138 |
{0, 0, 0, 0, 0, 0, 0} |
117 | 139 |
}; |
... | ... |
@@ -232,25 +254,34 @@ int sctp_register_cfg() |
232 | 254 |
return -(err!=0) |
233 | 255 |
|
234 | 256 |
|
257 |
+static int fix_autoclose(void*cfg_h, str* gname, str* name, void** val) |
|
258 |
+{ |
|
259 |
+#ifdef SCTP_AUTOCLOSE |
|
260 |
+ return 0; |
|
261 |
+#else |
|
262 |
+ ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n"); |
|
263 |
+ return -1; |
|
264 |
+#endif /* SCTP_AUTOCLOSE */ |
|
265 |
+} |
|
266 |
+ |
|
235 | 267 |
|
236 |
-static int set_autoclose(void* cfg_h, str* gname, str* name, void** val) |
|
268 |
+static void set_autoclose(str* gname, str* name) |
|
237 | 269 |
{ |
238 | 270 |
#ifdef SCTP_AUTOCLOSE |
239 | 271 |
int optval; |
240 | 272 |
SCTP_SET_SOCKOPT_DECLS; |
241 | 273 |
|
242 |
- optval=(int)(long)(*val); |
|
243 |
- SCTP_SET_SOCKOPT_BODY(IPPROTO_SCTP, SCTP_AUTOCLOSE, optval, |
|
244 |
- "cfg: setting SCTP_AUTOCLOSE"); |
|
274 |
+ optval=cfg_get(sctp, sctp_cfg, autoclose); |
|
275 |
+ SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_AUTOCLOSE, optval, |
|
276 |
+ "cfg: setting SCTP_AUTOCLOSE"); |
|
245 | 277 |
#else |
246 | 278 |
ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n"); |
247 |