Module: sip-router
Branch: ser_core_cvs
Commit: 31fd952ba8af48122876ded631446e210f1634f8
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=31fd952…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Wed Mar 4 20:56:00 2009 +0000
sctp: connection reuse & connection tracking
- support for sctp connection tracking and true sctp connection
reuse for replies.
We need this to support …
[View More]reply connection reuse with asymmetric
sctp peers (while there is no reason not to use the same port on
sctp for sending and receiving messages and it should be
strongly discouraged to do so, we never now with what
implementation we'll have to deal).
What makes this particularly complex is the not-yet-complete
sctp API, the slight but important behaviour
differences between its linux, freebsd and solaris
implementations and the fact that is more geared towards serial
single threaded application rather then parallel-processing
multi-process or multi-threaded ones.
- keep track of the number of active and tracked sctp connections
- blacklist moved into sctp_handles_assoc_change()
---
forward.c | 11 +-
main.c | 8 +
msg_translator.c | 20 +-
sctp_server.c | 1274 +++++++++++++++++++++++++++++++++++++++++++++++++++---
sctp_server.h | 11 +
5 files changed, 1266 insertions(+), 58 deletions(-)
Diff: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=31f…
[View Less]
Module: sip-router
Branch: ser_core_cvs
Commit: de223f0173f640973cfda1f3b4ffc4dde5b6b5d4
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=de223f0…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Mar 5 17:21:30 2009 +0000
tcp: config option to disable active connects
- added new config option to disable active connects. If set ser
will only accept new connection, it will not …
[View More]actively open new
ones.
The option can be set both in ser.cfg (tcp_no_connect=yes) or
at runtime (sercmd cfg.set_now_int tcp no_connect 1).
---
NEWS | 8 +++++++-
cfg.lex | 3 +++
cfg.y | 9 +++++++++
core_cmd.c | 3 ++-
tcp_main.c | 3 +++
tcp_options.c | 2 ++
tcp_options.h | 1 +
7 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/NEWS b/NEWS
index ad12ca4..e889550 100644
--- a/NEWS
+++ b/NEWS
@@ -209,12 +209,15 @@ modules:
- t_set_retr(t1, t2) - changes the retransmissions
intervals on the fly, on a per transaction basis.
core:
+ - most tcp config vars migrated to the dynamic config framework
+ (can be changed at runtime, e.g.
+ sercmd cfg.set_now_int tcp connection_lifetime 180 )
- fallback to tcp or other congestion controlled transport
protocol if a forwarded udp sip request is greater then
udp_mtu (config). Default off. See udp_mtu and
udp_mtu_try_proto.
- sctp support (one-to-many, work in progress, for now linux
- only with no fallback to one-to-one on full send buffers)
+ and freebsd only)
- partial cygwin (windows) support revived: core+static modules,
no ipv6, no tcp, no dynamic modules
- most of the config variables can now be changed on the fly,
@@ -233,6 +236,9 @@ core:
between the short name and long name in cache as CNAME record
new config variables:
+ tcp_no_connect = yes/no - disable connects, ser will only accept new
+ connections, it will never try to open new ones.
+ Default: no, can be changed at runtime.
udp_mtu = number - fallback to another protocol (udp_mtu_try_proto must be
set also either globally or per packet) if the constructed
request size is greater then udp_mtu.
diff --git a/cfg.lex b/cfg.lex
index e36a625..b8d2877 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -298,6 +298,7 @@ TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
TCP_CON_LIFETIME "tcp_connection_lifetime"
TCP_POLL_METHOD "tcp_poll_method"
TCP_MAX_CONNECTIONS "tcp_max_connections"
+TCP_NO_CONNECT "tcp_no_connect"
TCP_SOURCE_IPV4 "tcp_source_ipv4"
TCP_SOURCE_IPV6 "tcp_source_ipv6"
TCP_OPT_FD_CACHE "tcp_fd_cache"
@@ -592,6 +593,8 @@ EAT_ABLE [\ \t\b\r]
return TCP_POLL_METHOD; }
<INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
return TCP_MAX_CONNECTIONS; }
+<INITIAL>{TCP_NO_CONNECT} { count(); yylval.strval=yytext;
+ return TCP_NO_CONNECT; }
<INITIAL>{TCP_SOURCE_IPV4} { count(); yylval.strval=yytext;
return TCP_SOURCE_IPV4; }
<INITIAL>{TCP_SOURCE_IPV6} { count(); yylval.strval=yytext;
diff --git a/cfg.y b/cfg.y
index 1523af1..04d5d3e 100644
--- a/cfg.y
+++ b/cfg.y
@@ -351,6 +351,7 @@ static void free_socket_id_lst(struct socket_id* i);
%token TCP_CON_LIFETIME
%token TCP_POLL_METHOD
%token TCP_MAX_CONNECTIONS
+%token TCP_NO_CONNECT
%token TCP_SOURCE_IPV4
%token TCP_SOURCE_IPV6
%token TCP_OPT_FD_CACHE
@@ -839,6 +840,14 @@ assign_stm:
#endif
}
| TCP_MAX_CONNECTIONS EQUAL error { yyerror("number expected"); }
+ | TCP_NO_CONNECT EQUAL NUMBER {
+ #ifdef USE_TCP
+ tcp_default_cfg.no_connect=$3;
+ #else
+ warn("tcp support not compiled in");
+ #endif
+ }
+ | TCP_NO_CONNECT EQUAL error { yyerror("boolean value expected"); }
| TCP_SOURCE_IPV4 EQUAL ipv4 {
#ifdef USE_TCP
if (tcp_set_src_addr($3)<0)
diff --git a/core_cmd.c b/core_cmd.c
index d2d7aed..c22e59e 100644
--- a/core_cmd.c
+++ b/core_cmd.c
@@ -565,11 +565,12 @@ static void core_tcp_options(rpc_t* rpc, void* c)
if (!tcp_disable){
tcp_options_get(&t);
rpc->add(c, "{", &handle);
- rpc->struct_add(handle, "dddddddddddddddddddddd",
+ rpc->struct_add(handle, "ddddddddddddddddddddddd",
"connect_timeout", t.connect_timeout_s,
"send_timeout", t.send_timeout_s,
"connection_lifetime", t.con_lifetime_s,
"max_connections(soft)", t.max_connections,
+ "no_connect", t.no_connect,
"fd_cache", t.fd_cache,
"async", t.async,
"connect_wait", t.tcp_connect_wait,
diff --git a/tcp_main.c b/tcp_main.c
index 86fedb7..ecf9ebf 100644
--- a/tcp_main.c
+++ b/tcp_main.c
@@ -1659,6 +1659,9 @@ int tcp_send(struct dest_info* dst, union sockaddr_union* from,
}
no_id:
if (unlikely(c==0)){
+ /* check if connect() is disabled */
+ if (cfg_get(tcp, tcp_cfg, no_connect))
+ return -1;
DBG("tcp_send: no open tcp connection found, opening new one\n");
/* create tcp connection */
if (likely(from==0)){
diff --git a/tcp_options.c b/tcp_options.c
index f66a7ae..21591d1 100644
--- a/tcp_options.c
+++ b/tcp_options.c
@@ -88,6 +88,8 @@ static cfg_def_t tcp_cfg_def[] = {
{ "max_connections", CFG_VAR_INT | CFG_ATOMIC, 0, (1U<<31)-1,
fix_max_conns, 0,
"maximum connection number, soft limit"},
+ { "no_connect", CFG_VAR_INT | CFG_ATOMIC, 0, 1, 0, 0,
+ "if set only accept new connections, never actively open new ones"},
{ "fd_cache", CFG_VAR_INT | CFG_READONLY, 0, 1, 0, 0,
"file descriptor cache for tcp_send"},
/* tcp async options */
diff --git a/tcp_options.h b/tcp_options.h
index 7a05e59..24df41e 100644
--- a/tcp_options.h
+++ b/tcp_options.h
@@ -115,6 +115,7 @@ struct cfg_group_tcp{
int send_timeout_s; /* in s */
int con_lifetime_s; /* in s */
int max_connections;
+ int no_connect; /* do not open any new tcp connection (but accept them) */
int fd_cache; /* on /off */
/* tcp async options */
int async; /* on / off */
[View Less]
Module: sip-router
Branch: ser_core_cvs
Commit: 7a6f43c829df5d3d2febe828581a0902fc4c10f1
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7a6f43c…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Wed Mar 4 20:55:44 2009 +0000
sctp: empty sctp_handle_assoc_change added
---
sctp_server.c | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/…
[View More]sctp_server.c b/sctp_server.c
index 9b8688f..2a7a85d 100644
--- a/sctp_server.c
+++ b/sctp_server.c
@@ -663,6 +663,24 @@ static int sctp_handle_send_failed(struct socket_info* si,
+/* handle SCTP_ASOC_CHANGE notifications: map ser global sctp ids
+ * to kernel asoc_ids. The global ids are needed because the kernel ones
+ * might get reused after a close and so they are not unique for ser's
+ * lifetime. We need a unique id to match replies to the association on
+ * which we received the corresponding request (so that we can send them
+ * back on the same asoc & socket if still opened).
+ * returns 0 on success, -1 on failure
+ */
+static int sctp_handle_assoc_change(struct socket_info* si,
+ union sockaddr_union* su,
+ int state,
+ int assoc_id)
+{
+ return -1; /* failure, not implemented */
+}
+
+
+
static int sctp_handle_notification(struct socket_info* si,
union sockaddr_union* su,
char* buf, unsigned len)
@@ -764,6 +782,8 @@ static int sctp_handle_notification(struct socket_info* si,
}
}
#endif /* USE_DST_BLACKLIST */
+ sctp_handle_assoc_change(si, su, snp->sn_assoc_change.sac_state,
+ snp->sn_assoc_change.sac_assoc_id);
break;
#ifdef SCTP_ADAPTION_INDICATION
case SCTP_ADAPTION_INDICATION:
[View Less]