if (proxy==NULL) return NULL;
host=linphone_address_get_domain (proxy);
if (host!=NULL){
- char localip[LINPHONE_IPADDR_SIZE];
+ int localport = -1;
+ char localip_tmp[LINPHONE_IPADDR_SIZE] = {'\0'};
+ const char *localip = NULL;
char *tmp;
LCSipTransports tr;
LinphoneAddress *contact;
- linphone_core_get_local_ip(obj->lc,host,localip);
contact=linphone_address_new(obj->reg_identity);
- linphone_address_set_domain (contact,localip);
- linphone_address_set_port_int(contact,linphone_core_get_sip_port(obj->lc));
+#ifdef BUILD_UPNP
+ if (obj->lc->upnp != NULL && linphone_core_get_firewall_policy(obj->lc)==LinphonePolicyUseUpnp &&
+ linphone_upnp_context_get_state(obj->lc->upnp) == LinphoneUpnpStateOk) {
+ localip = linphone_upnp_context_get_external_ipaddress(obj->lc->upnp);
+ localport = linphone_upnp_context_get_external_port(obj->lc->upnp);
+ }
+#endif //BUILD_UPNP
+ if(localip == NULL) {
+ localip = localip_tmp;
+ linphone_core_get_local_ip(obj->lc,host,localip_tmp);
+ }
+ if(localport == -1) {
+ localport = linphone_core_get_sip_port(obj->lc);
+ }
+ linphone_address_set_port_int(contact,localport);
+ linphone_address_set_domain(contact,localip);
linphone_address_set_display_name(contact,NULL);
linphone_core_get_sip_transports(obj->lc,&tr);
ms_free(lupnp);
}
-LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx) {
- return ctx->state;
+LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *lupnp) {
+ LinphoneUpnpState state;
+ ms_mutex_lock(&lupnp->mutex);
+ state = lupnp->state;
+ ms_mutex_unlock(&lupnp->mutex);
+ return state;
+}
+
+int linphone_upnp_context_get_external_port(UpnpContext *lupnp) {
+ int port = -1;
+ ms_mutex_lock(&lupnp->mutex);
+
+ /* Send port binding removes */
+ if(lupnp->sip_udp != NULL) {
+ if(lupnp->sip_udp->state == LinphoneUpnpStateOk)
+ port = lupnp->sip_udp->external_port;
+ } else if(lupnp->sip_tcp != NULL) {
+ if(lupnp->sip_tcp->state == LinphoneUpnpStateOk)
+ port = lupnp->sip_tcp->external_port;
+ } else if(lupnp->sip_tls != NULL) {
+ if(lupnp->sip_tls->state == LinphoneUpnpStateOk)
+ port = lupnp->sip_tls->external_port;
+ }
+
+ ms_mutex_unlock(&lupnp->mutex);
+ return port;
}
const char* linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx) {
return session->state;
}
+
/*
* uPnP Config
*/
void linphone_upnp_context_destroy(UpnpContext *ctx);
LinphoneUpnpState linphone_upnp_context_get_state(UpnpContext *ctx);
const char *linphone_upnp_context_get_external_ipaddress(UpnpContext *ctx);
+int linphone_upnp_context_get_external_port(UpnpContext *ctx);
void linphone_core_update_upnp_state_in_call_stats(LinphoneCall *call);
#endif //LINPHONE_UPNP_H