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")
+
+ use_advertised_address (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 use_advertised_address parameter
+
+...
+modparam("registrar", "use_advertised_address", 1)
+...
+
+
+
+
method_filtering (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;
}