Module: sip-router Branch: master Commit: bd1a534515678f69385d00b08699b434e1fab8df URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=bd1a5345...
Author: Jason Penton jason.penton@smilecoms.com Committer: Jason Penton jason.penton@smilecoms.com Date: Mon Jun 24 15:24:49 2013 +0200
modules/ims_registrar_scscf: execute route block on async reply of unreg. SAR - changed this to make the use of saync CDP cleaner - fixes inconsistencies we are experienceing with async TM and not using route block
---
modules/ims_registrar_scscf/cxdx_sar.c | 6 +++- modules/ims_registrar_scscf/reg_mod.c | 37 +++++++++++++++++++++++++++---- modules/ims_registrar_scscf/save.c | 27 +++++++++++++++++++---- modules/ims_registrar_scscf/save.h | 2 +- 4 files changed, 59 insertions(+), 13 deletions(-)
diff --git a/modules/ims_registrar_scscf/cxdx_sar.c b/modules/ims_registrar_scscf/cxdx_sar.c index 3c67ce7..51dafdd 100644 --- a/modules/ims_registrar_scscf/cxdx_sar.c +++ b/modules/ims_registrar_scscf/cxdx_sar.c @@ -249,7 +249,8 @@ success: update_stat(accepted_registrations, 1);
done: - reg_send_reply_transactional(t->uas.request, data->contact_header, t); + if (data->sar_assignment_type != AVP_IMS_SAR_UNREGISTERED_USER) + reg_send_reply_transactional(t->uas.request, data->contact_header, t); LM_DBG("DBG:SAR Async CDP callback: ... Done resuming transaction\n"); set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &t->uri_avps_from); set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &t->uri_avps_to); @@ -274,7 +275,8 @@ done: return;
error: - reg_send_reply_transactional(t->uas.request, data->contact_header, t); + if (data->sar_assignment_type != AVP_IMS_SAR_UNREGISTERED_USER) + reg_send_reply_transactional(t->uas.request, data->contact_header, t);
error_no_send: //if we don't have the transaction then we can't send a transaction response update_stat(rejected_registrations, 1); diff --git a/modules/ims_registrar_scscf/reg_mod.c b/modules/ims_registrar_scscf/reg_mod.c index f948dcb..4e2a31e 100644 --- a/modules/ims_registrar_scscf/reg_mod.c +++ b/modules/ims_registrar_scscf/reg_mod.c @@ -108,12 +108,13 @@ static int mod_init(void); static int child_init(int); static void mod_destroy(void); static int w_save(struct sip_msg* _m, char* _d, char* mode, char* _cflags); -static int w_assign_server_unreg(struct sip_msg* _m, char* _d, char* _direction); +static int w_assign_server_unreg(struct sip_msg* _m, char* _route, char* _d, char* _direction); static int w_lookup(struct sip_msg* _m, char* _d, char* _p2);
/*! \brief Fixup functions */ static int domain_fixup(void** param, int param_no); static int assign_save_fixup3(void** param, int param_no); +static int assign_save_fixup3_async(void** param, int param_no); //static int save_fixup2(void** param, int param_no); //static int assign_fixup2(void** param, int param_no); static int unreg_fixup(void** param, int param_no); @@ -190,7 +191,7 @@ static cmd_export_t cmds[] = { {"lookup", (cmd_function) w_lookup, 1, domain_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE}, {"term_impu_registered", (cmd_function) term_impu_registered, 1, domain_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE}, {"impu_registered", (cmd_function) impu_registered, 1, domain_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE}, - {"assign_server_unreg", (cmd_function) w_assign_server_unreg, 2, assign_save_fixup3, 0, REQUEST_ROUTE}, + {"assign_server_unreg", (cmd_function) w_assign_server_unreg, 3, assign_save_fixup3_async, 0, REQUEST_ROUTE}, {"add_sock_hdr", (cmd_function) add_sock_hdr, 1, fixup_str_null, 0, REQUEST_ROUTE}, {"unregister", (cmd_function) unregister, 2, unreg_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE}, {"reg_fetch_contacts", (cmd_function) pv_fetch_contacts, 3, fetchc_fixup, 0, REQUEST_ROUTE | FAILURE_ROUTE}, @@ -515,13 +516,12 @@ static int w_save(struct sip_msg* _m, char* _d, char* mode, char* _cflags) { return save(_m, _d); }
-static int w_assign_server_unreg(struct sip_msg* _m, char* _d, char* _direction) { +static int w_assign_server_unreg(struct sip_msg* _m, char* _route, char* _d, char* _direction) { str direction;
direction.s = _direction; direction.len = strlen(_direction); - //return assign_server_unreg(_m, (udomain_t*)_d, &direction); - return assign_server_unreg(_m, _d, &direction); + return assign_server_unreg(_m, _d, &direction, _route);
}
@@ -599,6 +599,33 @@ static int assign_save_fixup3(void** param, int param_no) { return 0; }
+/* + * Convert the char* parameters + */ +static int assign_save_fixup3_async(void** param, int param_no) { + + if (strlen((char*) *param) <= 0) { + LM_ERR("empty parameter %d not allowed\n", param_no); + return -1; + } + + if (param_no == 1) { //route name - static or dynamic string (config vars) + if (fixup_spve_null(param, param_no) < 0) + return -1; + return 0; + } else if (param_no == 2) { + udomain_t* d; + + if (ul.register_udomain((char*) *param, &d) < 0) { + LM_ERR("Error doing fixup on assign save"); + return -1; + } + *param = (void*) d; + } + + return 0; +} + /*! \brief * Convert char* parameter to udomain_t* pointer * Convert char* parameter to pv_elem_t* pointer diff --git a/modules/ims_registrar_scscf/save.c b/modules/ims_registrar_scscf/save.c index 4eb8ab5..605fb76 100644 --- a/modules/ims_registrar_scscf/save.c +++ b/modules/ims_registrar_scscf/save.c @@ -926,20 +926,37 @@ error:
}
-int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction) { +int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction, char* route) { str private_identity = {0, 0}, public_identity = {0, 0}; int assignment_type = AVP_IMS_SAR_NO_ASSIGNMENT; int data_available = AVP_IMS_SAR_USER_DATA_NOT_AVAILABLE; int require_user_data = 1; rerrno = R_FINE; tm_cell_t *t = 0; + str route_name;
saved_transaction_t* saved_t; cfg_action_t* cfg_action;
- sar_param_t* ap = (sar_param_t*) str1; - cfg_action = ap->paction->next; - + udomain_t* _d = (udomain_t*) str1; + + if (fixup_get_svalue(_m, (gparam_t*) route, &route_name) != 0) { + LM_ERR("no async route block for assign_server_unreg\n"); + return -1; + } + + LM_DBG("Looking for route block [%.*s]\n", route_name.len, route_name.s); + int ri = route_get(&main_rt, route_name.s); + if (ri < 0) { + LM_ERR("unable to find route block [%.*s]\n", route_name.len, route_name.s); + return -1; + } + cfg_action = main_rt.rlist[ri]; + if (cfg_action == NULL) { + LM_ERR("empty action lists in route block [%.*s]\n", route_name.len, route_name.s); + return -1; + } + LM_DBG("Assigning unregistered user for direction [%.*s]\n", direction->len, direction->s);
enum cscf_dialog_direction dir = cscf_get_dialog_direction(direction->s); @@ -995,7 +1012,7 @@ int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction) { saved_t->expires = 1; //not a dereg as this is server_assign_unreg saved_t->require_user_data = require_user_data; saved_t->sar_assignment_type = assignment_type; - saved_t->domain = (udomain_t*) ap->param; + saved_t->domain = (udomain_t*) _d;
saved_t->contact_header = 0;
diff --git a/modules/ims_registrar_scscf/save.h b/modules/ims_registrar_scscf/save.h index 5ab4488..85ec2ce 100644 --- a/modules/ims_registrar_scscf/save.h +++ b/modules/ims_registrar_scscf/save.h @@ -56,7 +56,7 @@ /*! \brief * Process REGISTER request and save it's contacts */ -int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction); +int assign_server_unreg(struct sip_msg* _m, char* str1, str* direction, char* route);
int save(struct sip_msg* msg, char* str1);