Module: sip-router
Branch: master
Commit: e008edb9772c08bb0a34dd719516f2a9b7b46115
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e008edb…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Fri Oct 17 11:04:23 2014 +0200
core: new parameter - max_branches
- the maximum number of uac branches can be set via config
- default value is 12 (old static value for MAX_BRNACHES)
- the upper limit is 31, it has to be at least 1
- example:
max_branches=16
---
cfg.lex | 2 ++
cfg.y | 2 ++
config.h | 3 ++-
dns_cache.h | 6 ++----
dset.c | 24 +++++++++++++++++++++---
dset.h | 2 ++
globals.h | 2 ++
main.c | 7 +++++++
8 files changed, 40 insertions(+), 8 deletions(-)
diff --git a/cfg.lex b/cfg.lex
index 1d5e40a..15cd19d 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -489,6 +489,7 @@ VERSION_TABLE_CFG "version_table"
SERVER_ID "server_id"
MAX_RECURSIVE_LEVEL "max_recursive_level"
+MAX_BRANCHES_PARAM "max_branches"|"max_branches"
LATENCY_LOG latency_log
LATENCY_LIMIT_DB latency_limit_db
@@ -936,6 +937,7 @@ IMPORTFILE "import_file"
<INITIAL>{VERSION_TABLE_CFG} { count(); yylval.strval=yytext; return
VERSION_TABLE_CFG;}
<INITIAL>{SERVER_ID} { count(); yylval.strval=yytext; return SERVER_ID;}
<INITIAL>{MAX_RECURSIVE_LEVEL} { count(); yylval.strval=yytext; return
MAX_RECURSIVE_LEVEL;}
+<INITIAL>{MAX_BRANCHES_PARAM} { count(); yylval.strval=yytext; return
MAX_BRANCHES_PARAM;}
<INITIAL>{LATENCY_LOG} { count(); yylval.strval=yytext; return LATENCY_LOG;}
<INITIAL>{MSG_TIME} { count(); yylval.strval=yytext; return MSG_TIME;}
<INITIAL>{ONSEND_RT_REPLY} { count(); yylval.strval=yytext; return ONSEND_RT_REPLY;
}
diff --git a/cfg.y b/cfg.y
index 6a85292..7184191 100644
--- a/cfg.y
+++ b/cfg.y
@@ -543,6 +543,7 @@ extern char *default_routename;
%token CFG_DESCRIPTION
%token SERVER_ID
%token MAX_RECURSIVE_LEVEL
+%token MAX_BRANCHES_PARAM
%token LATENCY_LOG
%token LATENCY_LIMIT_DB
%token LATENCY_LIMIT_ACTION
@@ -1572,6 +1573,7 @@ assign_stm:
| HTTP_REPLY_PARSE EQUAL error { yyerror("boolean value expected"); }
| SERVER_ID EQUAL NUMBER { server_id=$3; }
| MAX_RECURSIVE_LEVEL EQUAL NUMBER { set_max_recursive_level($3); }
+ | MAX_BRANCHES_PARAM EQUAL NUMBER { sr_dst_max_branches = $3; }
| LATENCY_LOG EQUAL NUMBER { default_core_cfg.latency_log=$3; }
| LATENCY_LOG EQUAL error { yyerror("number expected"); }
| LATENCY_LIMIT_DB EQUAL NUMBER { default_core_cfg.latency_limit_db=$3; }
diff --git a/config.h b/config.h
index 172ee7d..23880a0 100644
--- a/config.h
+++ b/config.h
@@ -169,7 +169,8 @@
#define MAX_RECEIVED_SIZE 59 /*!< forwarding -- Via buffer dimensioning - Received
header */
#define MAX_RPORT_SIZE 13 /*!< forwarding -- Via buffer dimensioning - Rport */
-#define MAX_BRANCHES 12 /*!< maximum number of branches per transaction */
+#define MAX_BRANCHES_DEFAULT 12 /*!< default maximum number of branches per
transaction */
+#define MAX_BRANCHES_LIMIT 32 /*!< limit of maximum number of branches per
transaction */
#define MAX_PRINT_TEXT 256 /*!< max length of the text of fifo 'print'
command */
diff --git a/dns_cache.h b/dns_cache.h
index e93b59b..b697b7c 100644
--- a/dns_cache.h
+++ b/dns_cache.h
@@ -166,10 +166,8 @@ struct dns_hash_entry{
};
-#if MAX_BRANCHES < 16
-/* forking is limited by tm to 12 by default */
-typedef unsigned short srv_flags_t;
-#elif MAX_BRANCHES < 32
+/* to fit in the limit of MAX_BRANCHES */
+#if MAX_BRANCHES_LIMIT < 32
typedef unsigned int srv_flags_t;
#else
typedef unsigned long long srv_flags_t;
diff --git a/dset.c b/dset.c
index 8e7410e..43e28db 100644
--- a/dset.c
+++ b/dset.c
@@ -39,6 +39,7 @@
#include "parser/parser_f.h"
#include "parser/parse_uri.h"
#include "parser/msg_parser.h"
+#include "globals.h"
#include "ut.h"
#include "hash_func.h"
#include "error.h"
@@ -58,9 +59,9 @@
/*
* Where we store URIs of additional transaction branches
- * (-1 because of the default branch, #0)
+ * (sr_dst_max_branches - 1 : because of the default branch for r-uri, #0 in tm)
*/
-static struct branch branches[MAX_BRANCHES - 1];
+static struct branch *branches = NULL;
/* how many of them we have */
unsigned int nr_branches = 0;
@@ -78,6 +79,23 @@ static qvalue_t ruri_q = Q_UNSPECIFIED;
static flag_t ruri_bflags;
+int init_dst_set(void)
+{
+ if(sr_dst_max_branches<=0 || sr_dst_max_branches>=MAX_BRANCHES_LIMIT) {
+ LM_ERR("invalid value for max branches parameter: %u\n",
+ sr_dst_max_branches);
+ return -1;
+ }
+ /* sr_dst_max_branches - 1 : because of the default branch for r-uri, #0 in tm */
+ branches = (branch_t*)pkg_malloc((sr_dst_max_branches-1)*sizeof(branch_t));
+ if(branches==NULL) {
+ LM_ERR("not enough memory to initialize destination branches\n");
+ return -1;
+ }
+ memset(branches, 0, (sr_dst_max_branches-1)*sizeof(branch_t));
+ return 0;
+}
+
/*! \brief
* Return pointer to branch[idx] structure
* @param idx - branch index
@@ -333,7 +351,7 @@ int append_branch(struct sip_msg* msg, str* uri, str* dst_uri, str*
path,
/* if we have already set up the maximum number
* of branches, don't try new ones
*/
- if (unlikely(nr_branches == MAX_BRANCHES - 1)) {
+ if (unlikely(nr_branches == sr_dst_max_branches - 1)) {
LM_ERR("max nr of branches exceeded\n");
ser_error = E_TOO_MANY_BRANCHES;
return -1;
diff --git a/dset.h b/dset.h
index ff7e838..d90ce61 100644
--- a/dset.h
+++ b/dset.h
@@ -258,4 +258,6 @@ int setbflagsval(unsigned int branch, flag_t val);
int uri_add_rcv_alias(sip_msg_t *msg, str *uri, str *nuri);
int uri_restore_rcv_alias(str *uri, str *nuri, str *suri);
+int init_dst_set(void);
+
#endif /* _DSET_H */
diff --git a/globals.h b/globals.h
index 0a62d3e..1dc4194 100644
--- a/globals.h
+++ b/globals.h
@@ -50,6 +50,8 @@ extern int config_check;
extern char* stat_file;
extern unsigned short port_no;
+extern unsigned int sr_dst_max_branches; /* max number of branches per transaction */
+
extern time_t up_since;
extern pid_t creator_pid; /* pid of first process before daemonization */
extern int uid;
diff --git a/main.c b/main.c
index 5aebc79..2e9d9fc 100644
--- a/main.c
+++ b/main.c
@@ -424,6 +424,9 @@ int sock_mode= S_IRUSR| S_IWUSR| S_IRGRP| S_IWGRP; /* rw-rw---- */
int server_id = 0; /* Configurable unique ID of the server */
+/* maximum number of branches for transaction */
+unsigned int sr_dst_max_branches = MAX_BRANCHES_DEFAULT;
+
/* set timeval for each received sip message */
int sr_msg_time = 1;
@@ -2119,6 +2122,10 @@ try_again:
pp_ifdef_level_check();
print_rls();
+ if(init_dst_set()<0) {
+ LM_ERR("failed to initialize destination set structure\n");
+ goto error;
+ }
/* options with higher priority than cfg file */
optind = 1; /* reset getopt */
while((c=getopt(argc,argv,options))!=-1) {