diff --git a/coreapi/bellesip_sal/sal_op_impl.c b/coreapi/bellesip_sal/sal_op_impl.c index aa1b7ca55..23a8ea4ed 100644 --- a/coreapi/bellesip_sal/sal_op_impl.c +++ b/coreapi/bellesip_sal/sal_op_impl.c @@ -342,6 +342,9 @@ static int _sal_op_send_request_with_contact(SalOp* op, belle_sip_request_t* req } #endif } + /*because in case of tunnel, transport can be changed*/ + transport=belle_sip_uri_get_transport_param(next_hop_uri); + if ((strcmp(method,"REGISTER")==0 || strcmp(method,"SUBSCRIBE")==0) && transport && (strcasecmp(transport,"TCP")==0 || strcasecmp(transport,"TLS")==0)){ /*RFC 5923: add 'alias' parameter to tell the server that we want it to keep the connection for future requests*/ diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 0ad4bb216..df44c3529 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -6514,14 +6514,7 @@ void sip_config_uninit(LinphoneCore *lc) lc->auth_info=bctbx_list_free_with_data(lc->auth_info,(void (*)(void*))linphone_auth_info_destroy); - /*now that we are unregisted, we no longer need the tunnel.*/ -#ifdef TUNNEL_ENABLED - if (lc->tunnel) { - linphone_tunnel_destroy(lc->tunnel); - lc->tunnel=NULL; - ms_message("Tunnel destroyed."); - } -#endif + if (lc->vcard_context) { linphone_vcard_context_destroy(lc->vcard_context); @@ -6537,9 +6530,20 @@ void sip_config_uninit(LinphoneCore *lc) belle_sip_object_unref(lc->http_crypto_config); lc->http_crypto_config=NULL; } + + /*now that we are unregisted, there is no more channel using tunnel socket we no longer need the tunnel.*/ +#ifdef TUNNEL_ENABLED + if (lc->tunnel) { + linphone_tunnel_destroy(lc->tunnel); + lc->tunnel=NULL; + ms_message("Tunnel destroyed."); + } +#endif + sal_iterate(lc->sal); /*make sure event are purged*/ sal_uninit(lc->sal); lc->sal=NULL; + if (lc->sip_conf.guessed_contact) ms_free(lc->sip_conf.guessed_contact); diff --git a/tester/tunnel_tester.c b/tester/tunnel_tester.c index cf02ff267..48bebd4cf 100644 --- a/tester/tunnel_tester.c +++ b/tester/tunnel_tester.c @@ -24,26 +24,21 @@ #include "liblinphone_tester.h" /* Retrieve the public IP from a given hostname */ -static const char* get_ip_from_hostname(const char * tunnel_hostname){ +int get_ip_from_hostname(const char * tunnel_hostname, char *ip, size_t ip_size){ struct addrinfo hints; - struct addrinfo *res = NULL, *it = NULL; - struct sockaddr_in *add; - char * output = NULL; + struct addrinfo *res = NULL; int err; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((err = getaddrinfo(tunnel_hostname, NULL, &hints, &res))){ ms_error("error while retrieving IP from %s: %s", tunnel_hostname, gai_strerror(err)); - return NULL; + return err; } - for (it=res; it!=NULL; it=it->ai_next){ - add = (struct sockaddr_in *) it->ai_addr; - output = inet_ntoa( add->sin_addr ); - } + bctbx_addrinfo_to_ip_address(res, ip, ip_size, NULL); freeaddrinfo(res); - return output; + return err; } static char* get_public_contact_ip(LinphoneCore* lc) { const LinphoneAddress * contact = linphone_proxy_config_get_contact(linphone_core_get_default_proxy_config(lc)); @@ -60,9 +55,10 @@ static void call_with_tunnel_base(LinphoneTunnelMode tunnel_mode, bool_t with_si LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(pauline->lc); LinphoneAddress *server_addr = linphone_address_new(linphone_proxy_config_get_server_addr(proxy)); LinphoneAddress *route = linphone_address_new(linphone_proxy_config_get_route(proxy)); - const char * tunnel_ip = get_ip_from_hostname("tunnel.linphone.org"); + char tunnel_ip[64]; char *public_ip, *public_ip2=NULL; - + BC_ASSERT_FALSE(get_ip_from_hostname("tunnel.linphone.org",tunnel_ip,sizeof(tunnel_ip))); + BC_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,1)); public_ip = get_public_contact_ip(pauline->lc); BC_ASSERT_STRING_NOT_EQUAL(public_ip, tunnel_ip); @@ -245,9 +241,10 @@ static void register_on_second_tunnel(void) { LinphoneTunnel *tunnel = linphone_core_get_tunnel(pauline->lc); LinphoneTunnelConfig *config1 = linphone_tunnel_config_new(); LinphoneTunnelConfig *config2 = linphone_tunnel_config_new(); - const char * tunnel_ip = get_ip_from_hostname("tunnel.linphone.org"); + char tunnel_ip[64]; char* public_ip; - + + BC_ASSERT_FALSE(get_ip_from_hostname("tunnel.linphone.org",tunnel_ip,sizeof(tunnel_ip))); linphone_tunnel_simulate_udp_loss(tunnel, TRUE); // add a first tunnel config with an invalid port