mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-28 08:39:20 +00:00
fix: reuse stun discovered ip/port accross reinvites.
This commit is contained in:
parent
b94ed904fd
commit
b67d2dd4a7
3 changed files with 31 additions and 31 deletions
|
|
@ -193,6 +193,22 @@ static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, int bandw
|
|||
return l;
|
||||
}
|
||||
|
||||
static void update_media_description_from_stun(SalMediaDescription *md, const StunCandidate *ac, const StunCandidate *vc){
|
||||
if (ac->port!=0){
|
||||
strcpy(md->streams[0].rtp_addr,ac->addr);
|
||||
md->streams[0].rtp_port=ac->port;
|
||||
if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || md->nstreams==1){
|
||||
strcpy(md->addr,ac->addr);
|
||||
}
|
||||
}
|
||||
if (vc->port!=0){
|
||||
strcpy(md->streams[1].rtp_addr,vc->addr);
|
||||
md->streams[1].rtp_port=vc->port;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static SalMediaDescription *_create_local_media_description(LinphoneCore *lc, LinphoneCall *call, unsigned int session_id, unsigned int session_ver){
|
||||
MSList *l;
|
||||
PayloadType *pt;
|
||||
|
|
@ -257,7 +273,7 @@ static SalMediaDescription *_create_local_media_description(LinphoneCore *lc, Li
|
|||
ice_session_add_check_list(call->ice_session, ice_check_list_new());
|
||||
}
|
||||
}
|
||||
|
||||
update_media_description_from_stun(md,&call->ac,&call->vc);
|
||||
linphone_address_destroy(addr);
|
||||
return md;
|
||||
}
|
||||
|
|
@ -327,20 +343,6 @@ void linphone_call_init_stats(LinphoneCallStats *stats, int type) {
|
|||
stats->ice_state = LinphoneIceStateNotActivated;
|
||||
}
|
||||
|
||||
static void update_media_description_from_stun(SalMediaDescription *md, const StunCandidate *ac, const StunCandidate *vc){
|
||||
if (ac->port!=0){
|
||||
strcpy(md->streams[0].rtp_addr,ac->addr);
|
||||
md->streams[0].rtp_port=ac->port;
|
||||
if ((ac->addr[0]!='\0' && vc->addr[0]!='\0' && strcmp(ac->addr,vc->addr)==0) || md->nstreams==1){
|
||||
strcpy(md->addr,ac->addr);
|
||||
}
|
||||
}
|
||||
if (vc->port!=0){
|
||||
strcpy(md->streams[1].rtp_addr,vc->addr);
|
||||
md->streams[1].rtp_port=vc->port;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void discover_mtu(LinphoneCore *lc, const char *remote){
|
||||
int mtu;
|
||||
|
|
@ -355,12 +357,9 @@ static void discover_mtu(LinphoneCore *lc, const char *remote){
|
|||
}
|
||||
}
|
||||
|
||||
#define STUN_CANDIDATE_INIT {{0},0}
|
||||
|
||||
LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, const LinphoneCallParams *params)
|
||||
{
|
||||
LinphoneCall *call=ms_new0(LinphoneCall,1);
|
||||
StunCandidate ac=STUN_CANDIDATE_INIT,vc=STUN_CANDIDATE_INIT;
|
||||
int ping_time=-1;
|
||||
call->dir=LinphoneCallOutgoing;
|
||||
call->op=sal_op_new(lc->sal);
|
||||
|
|
@ -374,13 +373,12 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr
|
|||
ice_session_set_role(call->ice_session, IR_Controlling);
|
||||
}
|
||||
if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseStun) {
|
||||
ping_time=linphone_core_run_stun_tests(call->core,call,&ac, &vc);
|
||||
ping_time=linphone_core_run_stun_tests(call->core,call);
|
||||
}
|
||||
if (ping_time>=0) {
|
||||
linphone_core_adapt_to_network(lc,ping_time,&call->params);
|
||||
}
|
||||
call->localdesc=create_local_media_description(lc,call);
|
||||
update_media_description_from_stun(call->localdesc,&ac,&vc);
|
||||
call->camera_active=params->has_video;
|
||||
|
||||
discover_mtu(lc,linphone_address_get_domain (to));
|
||||
|
|
@ -395,7 +393,6 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
|
|||
LinphoneCall *call=ms_new0(LinphoneCall,1);
|
||||
char *from_str;
|
||||
int ping_time=-1;
|
||||
StunCandidate ac=STUN_CANDIDATE_INIT,vc=STUN_CANDIDATE_INIT;
|
||||
|
||||
call->dir=LinphoneCallIncoming;
|
||||
sal_op_set_user_pointer(op,call);
|
||||
|
|
@ -434,7 +431,7 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
|
|||
}
|
||||
break;
|
||||
case LinphonePolicyUseStun:
|
||||
ping_time=linphone_core_run_stun_tests(call->core,call,&ac, &vc);
|
||||
ping_time=linphone_core_run_stun_tests(call->core,call);
|
||||
/* No break to also destroy ice session in this case. */
|
||||
default:
|
||||
break;
|
||||
|
|
@ -443,7 +440,6 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro
|
|||
linphone_core_adapt_to_network(lc,ping_time,&call->params);
|
||||
};
|
||||
call->localdesc=create_local_media_description(lc,call);
|
||||
update_media_description_from_stun(call->localdesc,&ac,&vc);
|
||||
call->camera_active=call->params.has_video;
|
||||
|
||||
discover_mtu(lc,linphone_address_get_domain(from));
|
||||
|
|
|
|||
|
|
@ -467,8 +467,10 @@ static int recvStunResponse(ortp_socket_t sock, char *ipaddr, int *port, int *id
|
|||
}
|
||||
|
||||
/* this functions runs a simple stun test and return the number of milliseconds to complete the tests, or -1 if the test were failed.*/
|
||||
int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call, StunCandidate *ac, StunCandidate *vc){
|
||||
int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call){
|
||||
const char *server=linphone_core_get_stun_server(lc);
|
||||
StunCandidate *ac=&call->ac;
|
||||
StunCandidate *vc=&call->vc;
|
||||
|
||||
if (lc->sip_conf.ipv6_enabled){
|
||||
ms_warning("stun support is not implemented for ipv6");
|
||||
|
|
|
|||
|
|
@ -99,7 +99,13 @@ struct _LinphoneChatMessage {
|
|||
char* external_body_url;
|
||||
LinphoneAddress* from;
|
||||
};
|
||||
|
||||
|
||||
typedef struct StunCandidate{
|
||||
char addr[64];
|
||||
int port;
|
||||
}StunCandidate;
|
||||
|
||||
|
||||
struct _LinphoneCall
|
||||
{
|
||||
int magic; /*used to distinguish from proxy config*/
|
||||
|
|
@ -123,6 +129,7 @@ struct _LinphoneCall
|
|||
void * user_pointer;
|
||||
int audio_port;
|
||||
int video_port;
|
||||
StunCandidate ac,vc; /*audio video ip/port discovered by STUN*/
|
||||
struct _AudioStream *audiostream; /**/
|
||||
struct _VideoStream *videostream;
|
||||
MSAudioEndpoint *endpoint; /*used for conferencing*/
|
||||
|
|
@ -233,12 +240,7 @@ MSList *linphone_find_friend(MSList *fl, const LinphoneAddress *fri, LinphoneFri
|
|||
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc);
|
||||
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCall *call, const PayloadType *pt);
|
||||
|
||||
typedef struct StunCandidate{
|
||||
char addr[64];
|
||||
int port;
|
||||
}StunCandidate;
|
||||
|
||||
int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call, StunCandidate *ac, StunCandidate *vc);
|
||||
int linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
|
||||
void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, LinphoneCallParams *params);
|
||||
int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call);
|
||||
void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue