Module: sip-router Branch: jason.penton/kamailio_ims_extensions Commit: 2b9eff8c3e4b90ae2dc7a43dd4b5ccbfa647d404 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2b9eff8c...
Author: Jason Penton jason.penton@gmail.com Committer: Jason Penton jason.penton@gmail.com Date: Thu Oct 20 14:09:50 2011 +0200
TM: Expose fake reply via api
- Allows to be able to send fake replies through TM api. Useful for terminating early dialogs
---
modules/tm/t_cancel.c | 6 ++++++ modules/tm/t_cancel.h | 2 ++ modules/tm/timer.c | 2 +- modules/tm/timer.h | 2 +- modules/tm/tm_load.c | 1 + modules/tm/tm_load.h | 1 + modules/tm/uac.h | 2 ++ 7 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/modules/tm/t_cancel.c b/modules/tm/t_cancel.c index c1b52be..ac1bf4f 100644 --- a/modules/tm/t_cancel.c +++ b/modules/tm/t_cancel.c @@ -65,6 +65,7 @@ #include "t_msgbuilder.h" #include "t_lookup.h" /* for t_lookup_callid in fifo_uac_cancel */ #include "t_hooks.h" +#include "timer.h"
/** Prepare to cancel a transaction. @@ -543,3 +544,8 @@ error3: }
+void w_fake_reply(struct cell *t, int branch, int code ) +{ + LOCK_REPLIES(t); + fake_reply(t, branch, code); +} diff --git a/modules/tm/t_cancel.h b/modules/tm/t_cancel.h index 874483c..8b44cc9 100644 --- a/modules/tm/t_cancel.h +++ b/modules/tm/t_cancel.h @@ -96,6 +96,8 @@ typedef int (*cancel_all_uacs_f)(struct cell *trans, int how); typedef void (*prepare_to_cancel_f)(struct cell *t, branch_bm_t *cancel_bm, branch_bm_t skip_branches);
+void w_fake_reply(struct cell *t, int branch, int code ); +
/** Check if one branch needs CANCEL-ing and prepare it if it does. * Can be called w/o REPLY_LOCK held diff --git a/modules/tm/timer.c b/modules/tm/timer.c index b834f11..768aa78 100644 --- a/modules/tm/timer.c +++ b/modules/tm/timer.c @@ -335,7 +335,7 @@ inline static ticks_t delete_cell( struct cell *p_cell, int unlock )
/* generate a fake reply * it assumes the REPLY_LOCK is already held and returns unlocked */ -static void fake_reply(struct cell *t, int branch, int code ) +void fake_reply(struct cell *t, int branch, int code ) { struct cancel_info cancel_data; short do_cancel_branch; diff --git a/modules/tm/timer.h b/modules/tm/timer.h index d506adb..9acddc1 100644 --- a/modules/tm/timer.h +++ b/modules/tm/timer.h @@ -148,7 +148,7 @@ extern struct msgid_var user_rt_t2_timeout_ms; extern struct msgid_var user_inv_max_lifetime; extern struct msgid_var user_noninv_max_lifetime;
- +void fake_reply(struct cell *t, int branch, int code ); /** * \brief fix timer values to ticks */ diff --git a/modules/tm/tm_load.c b/modules/tm/tm_load.c index d57fd45..cda04f0 100644 --- a/modules/tm/tm_load.c +++ b/modules/tm/tm_load.c @@ -115,6 +115,7 @@ int load_tm( struct tm_binds *tmb) tmb->send_prepared_request = send_prepared_request; tmb->dlg_add_extra = dlg_add_extra; tmb->t_cancel_uac = t_uac_cancel; + tmb->fake_reply = w_fake_reply;
#ifdef DIALOG_CALLBACKS tmb->register_new_dlg_cb=register_new_dlg_cb; diff --git a/modules/tm/tm_load.h b/modules/tm/tm_load.h index 370c2ef..58f0b70 100644 --- a/modules/tm/tm_load.h +++ b/modules/tm/tm_load.h @@ -91,6 +91,7 @@ struct tm_binds { cancel_all_uacs_f cancel_all_uacs; prepare_request_within_f prepare_request_within; send_prepared_request_f send_prepared_request; + fake_reply_f fake_reply; enum route_mode* route_mode; #ifdef DIALOG_CALLBACKS register_new_dlg_cb_f register_new_dlg_cb; diff --git a/modules/tm/uac.h b/modules/tm/uac.h index 619d43e..f10f0ab 100644 --- a/modules/tm/uac.h +++ b/modules/tm/uac.h @@ -96,6 +96,8 @@ typedef int (*prepare_request_within_f)(uac_req_t *uac_r, typedef void (*send_prepared_request_f)(struct retr_buf *request_dst); typedef void (*generate_fromtag_f)(str*, str*);
+typedef void (*fake_reply_f)(struct cell *cell, int branch, int code); + /* * Generate a fromtag based on given Call-ID */