Module: sip-router Branch: master Commit: 214b161e644c2d7468d9ac3ea13ad0be5196d143 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=214b161e...
Author: Lucian Balaceanu lucian.balaceanu@1and1.ro Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sun Oct 12 10:28:29 2014 +0200
core: execute onsend_route for replies before sending out
- control execution of onsend_route block for replies via parameter onsend_route_reply
---
cfg.lex | 3 ++- cfg.y | 3 +++ forward.c | 22 ++++++++++++++++------ globals.h | 3 +++ main.c | 3 +++ onsend.h | 1 + 6 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/cfg.lex b/cfg.lex index 10766b2..1d5e40a 100644 --- a/cfg.lex +++ b/cfg.lex @@ -495,7 +495,7 @@ LATENCY_LIMIT_DB latency_limit_db LATENCY_LIMIT_ACTION latency_limit_action
MSG_TIME msg_time - +ONSEND_RT_REPLY "onsend_route_reply" CFG_DESCRIPTION "description"|"descr"|"desc"
LOADMODULE loadmodule @@ -938,6 +938,7 @@ IMPORTFILE "import_file" <INITIAL>{MAX_RECURSIVE_LEVEL} { count(); yylval.strval=yytext; return MAX_RECURSIVE_LEVEL;} <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; } <INITIAL>{LATENCY_LIMIT_DB} { count(); yylval.strval=yytext; return LATENCY_LIMIT_DB;} <INITIAL>{LATENCY_LIMIT_ACTION} { count(); yylval.strval=yytext; return LATENCY_LIMIT_ACTION;} <INITIAL>{CFG_DESCRIPTION} { count(); yylval.strval=yytext; return CFG_DESCRIPTION; } diff --git a/cfg.y b/cfg.y index 2e7a6b4..6a85292 100644 --- a/cfg.y +++ b/cfg.y @@ -547,6 +547,7 @@ extern char *default_routename; %token LATENCY_LIMIT_DB %token LATENCY_LIMIT_ACTION %token MSG_TIME +%token ONSEND_RT_REPLY
%token FLAGS_DECL %token AVPFLAGS_DECL @@ -1579,6 +1580,8 @@ assign_stm: | LATENCY_LIMIT_ACTION EQUAL error { yyerror("number expected"); } | MSG_TIME EQUAL NUMBER { sr_msg_time=$3; } | MSG_TIME EQUAL error { yyerror("number expected"); } + | ONSEND_RT_REPLY EQUAL NUMBER { onsend_route_reply=$3; } + | ONSEND_RT_REPLY EQUAL error { yyerror("int value expected"); } | UDP_MTU EQUAL NUMBER { default_core_cfg.udp_mtu=$3; } | UDP_MTU EQUAL error { yyerror("number expected"); } | FORCE_RPORT EQUAL NUMBER diff --git a/forward.c b/forward.c index 3d50988..81e39fe 100644 --- a/forward.c +++ b/forward.c @@ -758,6 +758,7 @@ static int do_forward_reply(struct sip_msg* msg, int mode) struct dest_info dst; unsigned int new_len; int r; + struct ip_addr ip; #ifdef USE_TCP char* s; int len; @@ -836,11 +837,6 @@ static int do_forward_reply(struct sip_msg* msg, int mode)
apply_force_send_socket(&dst, msg);
- if (msg_send(&dst, new_buf, new_len)<0) - { - STATS_RPL_FWD_DROP(); - goto error; - } /* call onsend_route */ if(dst.send_sock == NULL) { dst.send_sock=get_send_socket(msg, &dst.to, dst.proto); @@ -849,7 +845,21 @@ static int do_forward_reply(struct sip_msg* msg, int mode) goto done; } } - run_onsend(msg, &dst, new_buf, new_len); + if (onsend_route_enabled(SIP_REPLY)){ + if (run_onsend(msg, &dst, new_buf, new_len)==0){ + su2ip_addr(&ip, &(dst.to)); + LOG(L_ERR, "forward_reply: reply to %s:%d(%d) dropped" + " (onsend_route)\n", ip_addr2a(&ip), + su_getport(&(dst.to)), dst.proto); + goto error; /* error ? */ + } + } + + if (msg_send(&dst, new_buf, new_len)<0) + { + STATS_RPL_FWD_DROP(); + goto error; + }
done: #ifdef STATS diff --git a/globals.h b/globals.h index 76e7f35..0a62d3e 100644 --- a/globals.h +++ b/globals.h @@ -198,6 +198,9 @@ extern int open_files_limit; extern int shm_force_alloc; extern int mlock_pages;
+/* execute onsend_route for replies */ +extern int onsend_route_reply; + /* real time stuff */ extern int real_time; extern int rt_prio; diff --git a/main.c b/main.c index dabac0b..5aebc79 100644 --- a/main.c +++ b/main.c @@ -427,6 +427,9 @@ int server_id = 0; /* Configurable unique ID of the server */ /* set timeval for each received sip message */ int sr_msg_time = 1;
+/* onsend_route is executed for replies*/ +int onsend_route_reply = 0; + /* more config stuff */ int disable_core_dump=0; /* by default enabled */ int open_files_limit=-1; /* don't touch it by default */ diff --git a/onsend.h b/onsend.h index 0b2eb08..a8a4e6e 100644 --- a/onsend.h +++ b/onsend.h @@ -104,5 +104,6 @@ static inline int run_onsend(struct sip_msg* orig_msg, struct dest_info* dst, return ret; }
+#define onsend_route_enabled(rtype) (onsend_rt.rlist[DEFAULT_RT]?((rtype==SIP_REPLY)?onsend_route_reply:1):0)
#endif