]> sjero.net Git - linphone/commitdiff
fix: reuse stun discovered ip/port accross reinvites.
authorSimon Morlat <simon.morlat@linphone.org>
Thu, 20 Sep 2012 19:30:42 +0000 (21:30 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Thu, 20 Sep 2012 19:31:19 +0000 (21:31 +0200)
coreapi/linphonecall.c
coreapi/misc.c
coreapi/private.h

index 7166d1c13a8de1801397f9fd735a1952eb305cd2..7f11028ab28b18a4613757115ae05d43d402c3f8 100644 (file)
@@ -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));
index 8cdf2bb27b94934e55ade9a6b3afa8acdcfe0ded..15fc5374c53bde478f6c2f2468a7f0a3e664130a 100644 (file)
@@ -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");
index f0b3b2c302e54b0d394344027864846786426609..1e93c19d786b22c55da3d12646c3ca826022da28 100644 (file)
@@ -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);