diff --git a/src/modules/registrar/doc/registrar_admin.xml b/src/modules/registrar/doc/registrar_admin.xml index 461605f3d03..52559a638f2 100644 --- a/src/modules/registrar/doc/registrar_admin.xml +++ b/src/modules/registrar/doc/registrar_admin.xml @@ -535,6 +535,31 @@ modparam("registrar", "sock_hdr_name", "Sock-Info") +
+ <varname>use_advertised_address</varname> (integer) + + This parameter can be used to override value written into socket field when contact is saved. + If set to 1, advertised address will be written instead local listen socket. + + + This could be useful when kamailio is installed behind NAT and it is necessary to store its public IP + instead socket on which the register request was received. + + + + Default value is 0 (disabled). + + + + Set <varname>use_advertised_address</varname> parameter + +... +modparam("registrar", "use_advertised_address", 1) +... + + +
+
<varname>method_filtering</varname> (integer) diff --git a/src/modules/registrar/registrar.c b/src/modules/registrar/registrar.c index 11ebbdc8b94..7dae9b6ccb3 100644 --- a/src/modules/registrar/registrar.c +++ b/src/modules/registrar/registrar.c @@ -132,6 +132,8 @@ int reg_use_domain = 0; int sock_flag = -1; str sock_hdr_name = {0,0}; +int sock_advertise_enabled = 0; + /* where to go for event route ("usrloc:contact-expired") */ int reg_expire_event_rt = -1; /* default disabled */ str reg_event_callback = STR_NULL; @@ -249,6 +251,7 @@ static param_export_t params[] = { {"lookup_filter_mode", INT_PARAM, ®_lookup_filter_mode }, {"min_expires_mode", PARAM_INT, ®_min_expires_mode }, {"use_expired_contacts", INT_PARAM, &default_registrar_cfg.use_expired_contacts }, + {"use_advertised_address", PARAM_INT, &sock_advertise_enabled }, {0, 0, 0} }; diff --git a/src/modules/registrar/registrar.h b/src/modules/registrar/registrar.h index 411d83cf0af..0fbdbd5bd47 100644 --- a/src/modules/registrar/registrar.h +++ b/src/modules/registrar/registrar.h @@ -99,6 +99,7 @@ extern int reg_flow_timer; extern str sock_hdr_name; extern int sock_flag; +extern int sock_advertise_enabled; extern str reg_xavp_cfg; extern str reg_xavp_rcd; diff --git a/src/modules/registrar/save.c b/src/modules/registrar/save.c index d9741964b58..702499cfdd4 100644 --- a/src/modules/registrar/save.c +++ b/src/modules/registrar/save.c @@ -229,6 +229,7 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, static int received_found; static unsigned int allowed, allow_parsed; static struct sip_msg *m = 0; + static struct socket_info si = {0}; int_str val; if (_m!=0) { @@ -256,6 +257,10 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, ci.sock = get_sock_val(_m); if (ci.sock==0) ci.sock = _m->rcv.bind_address; + } else if (sock_advertise_enabled && _m->rcv.bind_address && _m->rcv.bind_address->useinfo.sock_str.len > 0) { + memset(&si, 0, sizeof(struct socket_info)); + si.sock_str = _m->rcv.bind_address->useinfo.sock_str; + ci.sock = &si; } else { ci.sock = _m->rcv.bind_address; } @@ -412,6 +417,7 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c, return &ci; error: + return 0; } @@ -559,7 +565,7 @@ static inline int insert_contacts(struct sip_msg* _m, udomain_t* _d, str* _a, in } else { /* No contacts found */ build_contact(_m, NULL, &u->host); } - + #ifdef USE_TCP if ( tcp_check && e_max>0 ) { e_max -= act_time; @@ -572,6 +578,7 @@ static inline int insert_contacts(struct sip_msg* _m, udomain_t* _d, str* _a, in error: if (r) ul.delete_urecord(_d, _a, r); + return -1; } @@ -816,6 +823,7 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r, int _mode, return rc; error: + return -1; }