diff options
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_media.c')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 7a8404c8..524915c7 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -393,11 +393,37 @@ static pj_status_t create_rtp_rtcp_sock(pjsua_call_media *call_med, if (status != PJ_SUCCESS && pjsua_var.ua_cfg.stun_srv_cnt > 1 && ((acc->cfg.media_stun_use & PJSUA_STUN_RETRY_ON_FAILURE)!=0)) { - PJ_LOG(4,(THIS_FILE, "Failed to get STUN mapped address, " - "retrying other STUN servers")); + pj_str_t srv = + pjsua_var.ua_cfg.stun_srv[pjsua_var.stun_srv_idx]; + + PJ_LOG(4,(THIS_FILE, "Failed to get STUN mapped address, " + "retrying other STUN servers")); + + if (pjsua_var.stun_srv_idx < pjsua_var.ua_cfg.stun_srv_cnt-1) { + PJSUA_LOCK(); + /* Move the unusable STUN server to the last position + * as the least prioritize. + */ + pj_array_erase(pjsua_var.ua_cfg.stun_srv, + sizeof(pj_str_t), + pjsua_var.ua_cfg.stun_srv_cnt, + pjsua_var.stun_srv_idx); + + pj_array_insert(pjsua_var.ua_cfg.stun_srv, + sizeof(pj_str_t), + pjsua_var.ua_cfg.stun_srv_cnt-1, + pjsua_var.ua_cfg.stun_srv_cnt-1, + &srv); + + PJSUA_UNLOCK(); + } status=pjsua_update_stun_servers(pjsua_var.ua_cfg.stun_srv_cnt, pjsua_var.ua_cfg.stun_srv, - PJ_TRUE); + PJ_FALSE); + + if (status == PJ_SUCCESS) + status = resolve_stun_server(PJ_TRUE); + if (status == PJ_SUCCESS) { if (pjsua_var.stun_srv.addr.sa_family != 0) { pj_ansi_strcpy(ip_addr, |