Module: sip-router Branch: hpw/branch_failure_route Commit: 54a98bc741daba4d0c14c587d22dddf3c01a2e30 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=54a98bc7...
Author: Hugh Waite hugh.waite@crocodile-rcs.com Committer: Hugh Waite hugh.waite@crocodile-rcs.com Date: Tue Mar 26 11:40:38 2013 +0000
modules/tm: Create branch-failure event route
---
modules/tm/t_reply.c | 41 +++++++++++++---------------------------- modules/tm/t_reply.h | 1 + modules/tm/tm.c | 37 ++++++++----------------------------- 3 files changed, 22 insertions(+), 57 deletions(-)
diff --git a/modules/tm/t_reply.c b/modules/tm/t_reply.c index 7314a21..7bf3a8f 100644 --- a/modules/tm/t_reply.c +++ b/modules/tm/t_reply.c @@ -173,7 +173,7 @@ char *tm_tag_suffix; /* where to go if there is no positive reply (>=300) */ static int goto_on_failure=0; /* where to go if a failure is returned on a branch */ -static int goto_on_branch_failure=0; +int goto_on_branch_failure=0; /* where to go on receipt of reply */ static int goto_on_reply=0; /* where to go on receipt of reply without transaction context */ @@ -264,20 +264,6 @@ void t_on_failure( unsigned int go_to ) }
-void t_on_branch_failure( unsigned int go_to ) -{ - struct cell *t = get_t(); - - /* in REPLY_ROUTE and FAILURE_ROUTE T will be set to current transaction; - * in REQUEST_ROUTE T will be set only if the transaction was already - * created; if not -> use the static variable */ - if (!t || t==T_UNDEFINED ) - goto_on_branch_failure=go_to; - else - t->on_branch_failure = go_to; -} - - void t_on_reply( unsigned int go_to ) { struct cell *t = get_t(); @@ -1067,20 +1053,18 @@ int run_branch_failure_handlers(struct cell *t, struct sip_msg *rpl, struct sip_msg *shmem_msg = t->uas.request; int on_branch_failure;
- on_branch_failure = t->uac[picked_branch].on_branch_failure; - /* failure_route for a local UAC? */ if (!shmem_msg) { LOG(L_WARN,"Warning: run_branch_failure_handlers: no UAC support (%d, %d) \n", - on_branch_failure, t->tmcb_hl.reg_types); + goto_on_branch_failure, t->tmcb_hl.reg_types); return 0; }
/* don't start faking anything if we don't have to */ - if (unlikely(!on_branch_failure && !has_tran_tmcbs( t, TMCB_ON_BRANCH_FAILURE))) { + if (unlikely(!goto_on_branch_failure && !has_tran_tmcbs( t, TMCB_ON_BRANCH_FAILURE))) { LOG(L_WARN, "Warning: run_failure_handlers: no branch_failure handler (%d, %d)\n", - on_branch_failure, t->tmcb_hl.reg_types); + goto_on_branch_failure, t->tmcb_hl.reg_types); return 1; }
@@ -1090,19 +1074,17 @@ int run_branch_failure_handlers(struct cell *t, struct sip_msg *rpl, } /* fake also the env. conforming to the fake msg */ faked_env( t, &faked_req); + set_route_type(BRANCH_FAILURE_ROUTE); + set_t(t, picked_branch); /* DONE with faking ;-) -> run the branch_failure handlers */
if (unlikely(has_tran_tmcbs( t, TMCB_ON_BRANCH_FAILURE)) ) { run_trans_callbacks( TMCB_ON_BRANCH_FAILURE, t, &faked_req, rpl, code); } - if (on_branch_failure) { - /* avoid recursion -- if branch_failure_route forwards, and does not - * set next branch failure route, branch_failure_route will not be reentered - * on branch failure */ - t->on_branch_failure=0; + if (goto_on_branch_failure) { if (exec_pre_script_cb(&faked_req, BRANCH_FAILURE_CB_TYPE)>0) { /* run a branch_failure_route action if some was marked */ - if (run_top_route(branch_failure_rt.rlist[on_branch_failure], &faked_req, 0)<0) + if (run_top_route(event_rt.rlist[goto_on_branch_failure], &faked_req, 0)<0) LOG(L_ERR, "ERROR: run_branch_failure_handlers: Error in run_top_route\n"); exec_post_script_cb(&faked_req, BRANCH_FAILURE_CB_TYPE); } @@ -1334,8 +1316,11 @@ static enum rps t_should_relay_response( struct cell *Trans , int new_code, Trans->uac[branch].last_received=new_code;
/* New branch failure route code */ - if (unlikely(has_tran_tmcbs( Trans, TMCB_ON_BRANCH_FAILURE_RO|TMCB_ON_BRANCH_FAILURE) - || Trans->uac[branch].on_branch_failure )) { + /* also append the current reply to the transaction to + * make it available in failure routes - a kind of "fake" + * save of the final reply per branch */ + Trans->uac[branch].reply = reply; + if (unlikely(Trans->uac[branch].on_branch_failure )) { extra_flags= ((Trans->uac[branch].request.flags & F_RB_TIMEOUT)? FL_TIMEOUT:0) | diff --git a/modules/tm/t_reply.h b/modules/tm/t_reply.h index 5717a8f..a3a3c68 100644 --- a/modules/tm/t_reply.h +++ b/modules/tm/t_reply.h @@ -61,6 +61,7 @@ enum rps { extern char tm_tags[TOTAG_VALUE_LEN]; extern char *tm_tag_suffix;
+extern int goto_on_branch_failure; extern int goto_on_sl_reply;
extern int failure_reply_mode; diff --git a/modules/tm/tm.c b/modules/tm/tm.c index 22d4156..e2790b3 100644 --- a/modules/tm/tm.c +++ b/modules/tm/tm.c @@ -190,7 +190,6 @@ MODULE_VERSION static int fixup_hostport2proxy(void** param, int param_no); static int fixup_proto_hostport2proxy(void** param, int param_no); static int fixup_on_failure(void** param, int param_no); -static int fixup_on_branch_failure(void** param, int param_no); static int fixup_on_reply(void** param, int param_no); static int fixup_on_branch(void** param, int param_no); static int fixup_t_reply(void** param, int param_no); @@ -273,7 +272,6 @@ inline static int w_t_forward_nonack_sctp(struct sip_msg*, char* str,char*); inline static int w_t_forward_nonack_to(struct sip_msg* msg, char* str,char*); inline static int w_t_relay_cancel(struct sip_msg *p_msg, char *_foo, char *_bar); inline static int w_t_on_failure(struct sip_msg* msg, char *go_to, char *foo); -inline static int w_t_on_branch_failure(struct sip_msg* msg, char *go_to, char *foo); inline static int w_t_on_branch(struct sip_msg* msg, char *go_to, char *foo); inline static int w_t_on_reply(struct sip_msg* msg, char *go_to, char *foo ); inline static int t_check_status(struct sip_msg* msg, char *match, char *foo); @@ -411,14 +409,12 @@ static cmd_export_t cmds[]={ REQUEST_ROUTE}, {"t_on_failure", w_t_on_failure, 1, fixup_on_failure, REQUEST_ROUTE | FAILURE_ROUTE | TM_ONREPLY_ROUTE | BRANCH_ROUTE }, - {"t_on_branch_failure",w_t_on_branch_failure, 1, fixup_on_branch_failure, - REQUEST_ROUTE | FAILURE_ROUTE | TM_ONREPLY_ROUTE | BRANCH_ROUTE }, {"t_on_reply", w_t_on_reply, 1, fixup_on_reply, REQUEST_ROUTE | FAILURE_ROUTE | TM_ONREPLY_ROUTE | BRANCH_ROUTE }, {"t_on_branch", w_t_on_branch, 1, fixup_on_branch, REQUEST_ROUTE | FAILURE_ROUTE }, {"t_check_status", t_check_status, 1, fixup_t_check_status, - REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE }, + REQUEST_ROUTE | FAILURE_ROUTE | ONREPLY_ROUTE | BRANCH_FAILURE_ROUTE}, {"t_write_req", t_write_req, 2, fixup_t_write, REQUEST_ROUTE | FAILURE_ROUTE }, {"t_write_unix", t_write_unix, 2, fixup_t_write, @@ -605,21 +601,6 @@ static int fixup_on_failure(void** param, int param_no) }
-static int fixup_on_branch_failure(void** param, int param_no) -{ - if (param_no==1){ - if(strlen((char*)*param)<=1 - && (*(char*)(*param)==0 || *(char*)(*param)=='0')) { - *param = (void*)0; - return 0; - } - return fixup_routes("t_on_branch_failure", &branch_failure_rt, param); - } - return 0; -} - - - static int fixup_on_reply(void** param, int param_no) { if (param_no==1){ @@ -751,7 +732,6 @@ static int script_init( struct sip_msg *foo, unsigned int flags, void *bar) message's t_on_failure value */ t_on_failure( 0 ); - t_on_branch_failure(0); t_on_reply(0); t_on_branch(0); /* reset the kr status */ @@ -874,6 +854,9 @@ static int mod_init(void) return -1; }
+ goto_on_branch_failure = route_lookup(&event_rt, "tm:branch-failure"); + if (goto_on_branch_failure >= 0 && event_rt.rlist[goto_on_branch_failure]==0) + goto_on_branch_failure = -1; /* disable */ #ifdef WITH_EVENT_LOCAL_REQUEST goto_on_local_req=route_lookup(&event_rt, "tm:local-request"); if (goto_on_local_req>=0 && event_rt.rlist[goto_on_local_req]==0) @@ -998,7 +981,10 @@ static int t_check_status(struct sip_msg* msg, char *p1, char *foo) } status = int2str( lowest_status , 0); break; - + case BRANCH_FAILURE_ROUTE: +#warning add the status for branch failure route + status = int2str(t->uac[get_t_branch()].last_received, 0); + break; default: LOG(L_ERR,"ERROR:t_check_status: unsupported route type %d\n", get_route_type()); @@ -1387,11 +1373,6 @@ inline static int w_t_on_failure( struct sip_msg* msg, char *go_to, char *foo) return 1; }
-inline static int w_t_on_branch_failure( struct sip_msg* msg, char *go_to, char *foo) -{ - t_on_branch_failure( (unsigned int )(long) go_to ); - return 1; -}
inline static int w_t_on_branch( struct sip_msg* msg, char *go_to, char *foo) { @@ -1435,7 +1416,6 @@ static int w_t_is_set(struct sip_msg* msg, char *target, char *foo ) else r = t->on_reply; break; -#warning need to add branch_failure_route } if(r) return 1; return -1; @@ -1449,7 +1429,6 @@ static int fixup_t_is_set(void** param, int param_no) if((len==13 && strncmp((char*)*param, "failure_route", 13)==0) || (len==13 && strncmp((char*)*param, "onreply_route", 13)==0) || (len==12 && strncmp((char*)*param, "branch_route", 12)==0)) { -#warning need to add branch_failure_route return 0; }