|
@@ -101,10 +101,9 @@ int reg_outbound_mode = 0;
|
|
int reg_regid_mode = 0;
|
|
int reg_regid_mode = 0;
|
|
int reg_flow_timer = 0;
|
|
int reg_flow_timer = 0;
|
|
|
|
|
|
-/* Populate this AVP if testing for specific registration instance. */
|
|
|
|
-char *reg_callid_avp_param = 0;
|
|
|
|
-unsigned short reg_callid_avp_type = 0;
|
|
|
|
-int_str reg_callid_avp_name;
|
|
|
|
|
|
+str match_callid_name = str_init("match_callid");
|
|
|
|
+str match_received_name = str_init("match_received");
|
|
|
|
+str match_contact_name = str_init("match_contact");
|
|
|
|
|
|
char* rcv_avp_param = 0;
|
|
char* rcv_avp_param = 0;
|
|
unsigned short rcv_avp_type = 0;
|
|
unsigned short rcv_avp_type = 0;
|
|
@@ -164,6 +163,10 @@ static cmd_export_t cmds[] = {
|
|
REQUEST_ROUTE | FAILURE_ROUTE },
|
|
REQUEST_ROUTE | FAILURE_ROUTE },
|
|
{"registered", (cmd_function)w_registered, 2, domain_uri_fixup, 0,
|
|
{"registered", (cmd_function)w_registered, 2, domain_uri_fixup, 0,
|
|
REQUEST_ROUTE | FAILURE_ROUTE },
|
|
REQUEST_ROUTE | FAILURE_ROUTE },
|
|
|
|
+ {"registered", (cmd_function)w_registered3, 3, registered_fixup, 0,
|
|
|
|
+ REQUEST_ROUTE | FAILURE_ROUTE },
|
|
|
|
+ {"registered", (cmd_function)w_registered4, 4, registered_fixup, 0,
|
|
|
|
+ REQUEST_ROUTE | FAILURE_ROUTE },
|
|
{"add_sock_hdr", (cmd_function)add_sock_hdr, 1, fixup_str_null, 0,
|
|
{"add_sock_hdr", (cmd_function)add_sock_hdr, 1, fixup_str_null, 0,
|
|
REQUEST_ROUTE },
|
|
REQUEST_ROUTE },
|
|
{"unregister", (cmd_function)w_unregister, 2, unreg_fixup, 0,
|
|
{"unregister", (cmd_function)w_unregister, 2, unreg_fixup, 0,
|
|
@@ -200,7 +203,6 @@ static param_export_t params[] = {
|
|
{"max_expires", INT_PARAM, &default_registrar_cfg.max_expires },
|
|
{"max_expires", INT_PARAM, &default_registrar_cfg.max_expires },
|
|
{"received_param", PARAM_STR, &rcv_param },
|
|
{"received_param", PARAM_STR, &rcv_param },
|
|
{"received_avp", PARAM_STRING, &rcv_avp_param },
|
|
{"received_avp", PARAM_STRING, &rcv_avp_param },
|
|
- {"reg_callid_avp", PARAM_STRING, ®_callid_avp_param },
|
|
|
|
{"max_contacts", INT_PARAM, &default_registrar_cfg.max_contacts },
|
|
{"max_contacts", INT_PARAM, &default_registrar_cfg.max_contacts },
|
|
{"retry_after", INT_PARAM, &default_registrar_cfg.retry_after },
|
|
{"retry_after", INT_PARAM, &default_registrar_cfg.retry_after },
|
|
{"sock_flag", INT_PARAM, &sock_flag },
|
|
{"sock_flag", INT_PARAM, &sock_flag },
|
|
@@ -209,7 +211,7 @@ static param_export_t params[] = {
|
|
{"use_path", INT_PARAM, &path_enabled },
|
|
{"use_path", INT_PARAM, &path_enabled },
|
|
{"path_mode", INT_PARAM, &path_mode },
|
|
{"path_mode", INT_PARAM, &path_mode },
|
|
{"path_use_received", INT_PARAM, &path_use_params },
|
|
{"path_use_received", INT_PARAM, &path_use_params },
|
|
- {"path_check_local", INT_PARAM, &path_check_local },
|
|
|
|
|
|
+ {"path_check_local", INT_PARAM, &path_check_local },
|
|
{"xavp_cfg", PARAM_STR, ®_xavp_cfg },
|
|
{"xavp_cfg", PARAM_STR, ®_xavp_cfg },
|
|
{"xavp_rcd", PARAM_STR, ®_xavp_rcd },
|
|
{"xavp_rcd", PARAM_STR, ®_xavp_rcd },
|
|
{"gruu_enabled", INT_PARAM, ®_gruu_enabled },
|
|
{"gruu_enabled", INT_PARAM, ®_gruu_enabled },
|
|
@@ -306,24 +308,6 @@ static int mod_init(void)
|
|
rcv_avp_type = 0;
|
|
rcv_avp_type = 0;
|
|
}
|
|
}
|
|
|
|
|
|
- if (reg_callid_avp_param && *reg_callid_avp_param) {
|
|
|
|
- s.s = reg_callid_avp_param; s.len = strlen(s.s);
|
|
|
|
- if (pv_parse_spec(&s, &avp_spec)==0
|
|
|
|
- || avp_spec.type!=PVT_AVP) {
|
|
|
|
- LM_ERR("malformed or non AVP %s AVP definition\n", reg_callid_avp_param);
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if(pv_get_avp_name(0, &avp_spec.pvp, ®_callid_avp_name, ®_callid_avp_type)!=0)
|
|
|
|
- {
|
|
|
|
- LM_ERR("[%s]- invalid AVP definition\n", reg_callid_avp_param);
|
|
|
|
- return -1;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- reg_callid_avp_name.n = 0;
|
|
|
|
- reg_callid_avp_type = 0;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
|
|
bind_usrloc = (bind_usrloc_t)find_export("ul_bind_usrloc", 1, 0);
|
|
if (!bind_usrloc) {
|
|
if (!bind_usrloc) {
|
|
LM_ERR("can't bind usrloc\n");
|
|
LM_ERR("can't bind usrloc\n");
|
|
@@ -488,6 +472,46 @@ static int w_registered(struct sip_msg* _m, char* _d, char* _uri)
|
|
return registered(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL);
|
|
return registered(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int w_registered3(struct sip_msg* _m, char* _d, char* _uri, char* _flags)
|
|
|
|
+{
|
|
|
|
+ str uri = {0};
|
|
|
|
+ int flags = 0;
|
|
|
|
+ if(_uri!=NULL && (fixup_get_svalue(_m, (gparam_p)_uri, &uri)!=0 || uri.len<=0))
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("invalid uri parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ if(_flags!=NULL && (fixup_get_ivalue(_m, (fparam_t*)_flags, &flags)) < 0)
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("invalid flags parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ return registered3(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL, flags);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int w_registered4(struct sip_msg* _m, char* _d, char* _uri, char* _flags, char* _actionflags)
|
|
|
|
+{
|
|
|
|
+ str uri = {0};
|
|
|
|
+ int flags = 0;
|
|
|
|
+ int actionflags = 0;
|
|
|
|
+ if(_uri!=NULL && (fixup_get_svalue(_m, (gparam_p)_uri, &uri)!=0 || uri.len<=0))
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("invalid uri parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ if(_flags!=NULL && (fixup_get_ivalue(_m, (fparam_t*)_flags, &flags)) < 0)
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("invalid flags parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ if(_actionflags!=NULL && (fixup_get_ivalue(_m, (fparam_t*)_actionflags, &actionflags)) < 0)
|
|
|
|
+ {
|
|
|
|
+ LM_ERR("invalid action flag parameter\n");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+ return registered4(_m, (udomain_t*)_d, (uri.len>0)?&uri:NULL, flags, actionflags);
|
|
|
|
+}
|
|
|
|
+
|
|
static int w_unregister(struct sip_msg* _m, char* _d, char* _uri)
|
|
static int w_unregister(struct sip_msg* _m, char* _d, char* _uri)
|
|
{
|
|
{
|
|
str uri = {0};
|
|
str uri = {0};
|
|
@@ -550,6 +574,19 @@ static int domain_uri_fixup(void** param, int param_no)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int registered_fixup(void** param, int param_no)
|
|
|
|
+{
|
|
|
|
+ if (param_no == 1) {
|
|
|
|
+ return domain_fixup(param, 1);
|
|
|
|
+ } else if (param_no == 2) {
|
|
|
|
+ return fixup_spve_null(param, 1);
|
|
|
|
+ } else if (param_no == 3) {
|
|
|
|
+ return fixup_igp_null(param, 1);
|
|
|
|
+ } else if (param_no == 4) {
|
|
|
|
+ return fixup_igp_null(param, 1);
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
|
|
/*! \brief
|
|
/*! \brief
|
|
* Convert char* parameter to udomain_t* pointer
|
|
* Convert char* parameter to udomain_t* pointer
|