4
* Copyright (C) 2008 iptelorg GmbH
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.
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.
24
* 2008-08-07 initial version (andrei)
25
* 2009-05-26 runtime cfg support (andrei)
30
* \brief SIP-router core ::
36
#include <sys/types.h>
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>
46
#include "sctp_options.h"
49
#include "socket_info.h"
50
#include "sctp_server.h"
52
struct cfg_group_sctp sctp_default_cfg;
58
#include "sctp_sockopts.h"
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,
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,
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);
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.
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,"
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}
150
void* sctp_cfg; /* sctp config handle */
152
#endif /* USE_SCTP */
154
void init_sctp_options()
157
sctp_get_os_defaults(&sctp_default_cfg);
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 */
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 */
170
sctp_default_cfg.assoc_tracking=0;
171
sctp_default_cfg.assoc_reuse=0;
172
#endif /* SCTP_CONN_REUSE */
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; \
187
void sctp_options_check()
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);
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;
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;
209
#else /* CONN_REUSE */
210
if (sctp_default_cfg.assoc_reuse && sctp_default_cfg.assoc_tracking==0){
211
sctp_default_cfg.assoc_tracking=1;
213
#endif /* CONN_REUSE */
214
#endif /* USE_SCTP */
219
void sctp_options_get(struct cfg_group_sctp *s)
222
*s=*(struct cfg_group_sctp*)sctp_cfg;
224
memset(s, 0, sizeof(*s));
225
#endif /* USE_SCTP */
231
/** register sctp config into the configuration framework.
232
* @return 0 on success, -1 on error */
233
int sctp_register_cfg()
235
if (cfg_declare("sctp", sctp_cfg_def, &sctp_default_cfg, cfg_sizeof(sctp),
239
BUG("null sctp cfg");
247
#define SCTP_SET_SOCKOPT_DECLS \
249
struct socket_info* si
252
#define SCTP_SET_SOCKOPT_BODY_NRET(lev, opt_name, val, err_prefix) \
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); \
259
#define SCTP_SET_SOCKOPT_BODY(lev, opt_name, val, err_prefix) \
260
SCTP_SET_SOCKOPT_BODY_NRET(lev, opt_name, val, err_prefix) ; \
264
static int fix_autoclose(void*cfg_h, str* gname, str* name, void** val)
266
#ifdef SCTP_AUTOCLOSE
269
ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n");
271
#endif /* SCTP_AUTOCLOSE */
275
static void set_autoclose(str* gname, str* name)
277
#ifdef SCTP_AUTOCLOSE
279
SCTP_SET_SOCKOPT_DECLS;
281
optval=cfg_get(sctp, sctp_cfg, autoclose);
282
SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_AUTOCLOSE, optval,
283
"cfg: setting SCTP_AUTOCLOSE");
285
ERR("no SCTP_AUTOCLOSE support, please upgrade your sctp library\n");
286
#endif /* SCTP_AUTOCLOSE */
291
static int fix_assoc_tracking(void* cfg_h, str* gname, str* name, void** val)
295
optval=(int)(long)(*val);
296
#ifndef SCTP_CONN_REUSE
298
ERR("no SCTP_CONN_REUSE support, please recompile with it enabled\n");
301
#else /* SCTP_CONN_REUSE */
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");
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();
316
#endif /* SCTP_CONN_REUSE */
322
static int fix_assoc_reuse(void* cfg_h, str* gname, str* name, void** val)
326
optval=(int)(long)(*val);
327
#ifndef SCTP_CONN_REUSE
329
ERR("no SCTP_CONN_REUSE support, please recompile with it enabled\n");
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");
339
#endif /* SCTP_CONN_REUSE */
345
static int fix_srto_initial(void* cfg_h, str* gname, str* name, void** val)
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);
353
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
355
#endif /* SCTP_RTOINFO */
359
static void set_srto_initial(str* gname, str* name)
362
struct sctp_rtoinfo rto;
364
SCTP_SET_SOCKOPT_DECLS;
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");
373
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
374
#endif /* SCTP_RTOINFO */
379
static int fix_srto_max(void* cfg_h, str* gname, str* name, void** val)
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);
387
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
389
#endif /* SCTP_RTOINFO */
393
static void set_srto_max(str* gname, str* name)
396
struct sctp_rtoinfo rto;
397
SCTP_SET_SOCKOPT_DECLS;
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");
405
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
406
#endif /* SCTP_RTOINFO */
411
static int fix_srto_min(void* cfg_h, str* gname, str* name, void** val)
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);
419
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
421
#endif /* SCTP_RTOINFO */
425
static void set_srto_min(str* gname, str* name)
428
struct sctp_rtoinfo rto;
429
SCTP_SET_SOCKOPT_DECLS;
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");
437
ERR("no SCTP_RTOINFO support, please upgrade your sctp library\n");
438
#endif /* SCTP_RTOINFO */
443
static int fix_asocmaxrxt(void* cfg_h, str* gname, str* name, void** val)
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);
451
ERR("no SCTP_ASSOCINFO support, please upgrade your sctp library\n");
453
#endif /* SCTP_ASSOCINFO */
457
static void set_asocmaxrxt(str* gname, str* name)
459
#ifdef SCTP_ASSOCINFO
460
struct sctp_assocparams ap;
461
SCTP_SET_SOCKOPT_DECLS;
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");
469
ERR("no SCTP_ASSOCINFO support, please upgrade your sctp library\n");
470
#endif /* SCTP_ASSOCINFO */
475
static int fix_sinit_max_init_timeo(void* cfg_h, str* gname, str* name,
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);
484
ERR("no SCTP_INITMSG support, please upgrade your sctp library\n");
486
#endif /* SCTP_INITMSG */
490
static void set_sinit_max_init_timeo(str* gname, str* name)
493
struct sctp_initmsg im;
494
SCTP_SET_SOCKOPT_DECLS;
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");
501
ERR("no SCTP_INITMSG support, please upgrade your sctp library\n");
502
#endif /* SCTP_INITMSG */
507
static int fix_sinit_max_attempts(void* cfg_h, str* gname, str* name,
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);
516
ERR("no SCTP_INITMSG support, please upgrade your sctp library\n");
518
#endif /* SCTP_INITMSG */
522
static void set_sinit_max_attempts(str* gname, str* name)
525
struct sctp_initmsg im;
526
SCTP_SET_SOCKOPT_DECLS;
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");
533
ERR("no SCTP_INITMSG support, please upgrade your sctp library\n");
534
#endif /* SCTP_INITMSG */
539
static int fix_hbinterval(void* cfg_h, str* gname, str* name,
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);
548
ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your"
551
#endif /* SCTP_PEER_ADDR_PARAMS */
555
static void set_hbinterval(str* gname, str* name)
557
#ifdef SCTP_PEER_ADDR_PARAMS
558
struct sctp_paddrparams pp;
560
SCTP_SET_SOCKOPT_DECLS;
562
optval=cfg_get(sctp, sctp_cfg, hbinterval);
563
memset(&pp, 0, sizeof(pp)); /* zero everything we don't care about */
565
pp.spp_hbinterval=optval;
566
pp.spp_flags=SPP_HB_ENABLE;
568
pp.spp_flags=SPP_HB_DISABLE;
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);
579
ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your"
581
#endif /* SCTP_PEER_ADDR_PARAMS */
586
static int fix_pathmaxrxt(void* cfg_h, str* gname, str* name,
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);
595
ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your"
598
#endif /* SCTP_PEER_ADDR_PARAMS */
602
static void set_pathmaxrxt(str* gname, str* name)
604
#ifdef SCTP_PEER_ADDR_PARAMS
605
struct sctp_paddrparams pp;
606
SCTP_SET_SOCKOPT_DECLS;
608
memset(&pp, 0, sizeof(pp)); /* zero everything we don't care about */
609
pp.spp_pathmaxrxt=cfg_get(sctp, sctp_cfg, pathmaxrxt);
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);
619
ERR("no SCTP_PEER_ADDR_PARAMS support, please upgrade your"
621
#endif /* SCTP_PEER_ADDR_PARAMS */
626
static int fix_sack_delay(void* cfg_h, str* gname, str* name, void** val)
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);
634
ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n");
636
#endif /* SCTP_DELAYED_SACK | SCTP_DELAYED_ACK_TIME */
640
static void set_sack_delay(str* gname, str* name)
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;
651
#ifdef SCTP_DELAYED_SACK
652
memset(&sack_info, 0, sizeof(sack_info)); /* zero everything we don't
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);
659
#endif /* SCTP_DELAYED_SACK */
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
666
sack_val.assoc_value=cfg_get(sctp, sctp_cfg, sack_delay);
667
SCTP_SET_SOCKOPT_BODY_NRET(IPPROTO_SCTP, SCTP_DELAYED_ACK_TIME,
669
"cfg: setting SCTP_DELAYED_ACK_TIME");
672
#else /* SCTP_DELAYED_ACK_TIME */
673
/* no SCTP_DELAYED_ACK_TIME support and SCTP_DELAYED_SACK failed
675
ERR("cfg: setting SCTP_DELAYED_SACK: %s [%d]\n",
676
strerror(errno), errno);
677
#endif /* SCTP_DELAYED_ACK_TIME */
680
ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n");
681
#endif /* SCTP_DELAYED_SACK | SCTP_DELAYED_ACK_TIME */
686
static int fix_sack_freq(void* cfg_h, str* gname, str* name, void** val)
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);
694
ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n");
696
#endif /* SCTP_DELAYED_SACK */
700
static void set_sack_freq(str* gname, str* name)
702
#ifdef SCTP_DELAYED_SACK
703
struct sctp_sack_info sa;
704
SCTP_SET_SOCKOPT_DECLS;
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");
711
ERR("no SCTP_DELAYED_SACK support, please upgrade your sctp library\n");
712
#endif /* SCTP_DELAYED_SACK */
717
static int fix_max_burst(void* cfg_h, str* gname, str* name, void** val)
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);
725
ERR("no SCTP_MAX_BURST support, please upgrade your sctp library\n");
727
#endif /* SCTP_MAX_BURST */
731
static void set_max_burst(str* gname, str* name)
733
#ifdef SCTP_MAX_BURST
734
struct sctp_assoc_value av;
735
SCTP_SET_SOCKOPT_DECLS;
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");
742
ERR("no SCTP_MAX_BURST support, please upgrade your sctp library\n");
743
#endif /* SCTP_MAX_BURST */
746
#endif /* USE_SCTP */