Ignore:
Timestamp:
Jun 8, 2016 2:49:56 AM (8 years ago)
Author:
nanang
Message:

Close #1926: Support IPv6 address resolution without DNS resolver.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r5322 r5337  
    382382                    pjsua_var.acc_cnt, i, &acc_id); 
    383383 
     384    if (acc_cfg->transport_id != PJSUA_INVALID_ID) 
     385        acc->tp_type = pjsua_var.tpdata[acc_cfg->transport_id].type; 
     386 
    384387    return PJ_SUCCESS; 
    385388} 
     
    513516    char transport_param[32]; 
    514517    char uri[PJSIP_MAX_URL_SIZE]; 
     518    pjsua_acc_id acc_id; 
     519    pj_status_t status; 
    515520 
    516521    /* ID must be valid */ 
     
    555560    cfg.id = pj_str(uri); 
    556561     
    557     return pjsua_acc_add(&cfg, is_default, p_acc_id); 
     562    status = pjsua_acc_add(&cfg, is_default, &acc_id); 
     563    if (status == PJ_SUCCESS) { 
     564        pjsua_var.acc[acc_id].tp_type = t->type; 
     565        if (p_acc_id) 
     566            *p_acc_id = acc_id; 
     567    } 
     568 
     569    return status; 
    558570} 
    559571 
     
    24812493} 
    24822494 
     2495pj_bool_t pjsua_sip_acc_is_using_ipv6(pjsua_acc_id acc_id) 
     2496{ 
     2497    pjsua_acc *acc = &pjsua_var.acc[acc_id]; 
     2498 
     2499    return (acc->tp_type & PJSIP_TRANSPORT_IPV6) == PJSIP_TRANSPORT_IPV6; 
     2500} 
     2501 
    24832502pj_bool_t pjsua_sip_acc_is_using_stun(pjsua_acc_id acc_id) 
    24842503{ 
     
    29202939 
    29212940        if (acc->valid && pj_stricmp(&acc->user_part, &sip_uri->user)==0) { 
    2922  
    2923             if (acc->cfg.transport_id != PJSUA_INVALID_ID) { 
    2924                 pjsip_transport_type_e type; 
    2925                 type = pjsip_transport_get_type_from_name(&sip_uri->transport_param); 
    2926                 if (type == PJSIP_TRANSPORT_UNSPECIFIED) 
    2927                     type = PJSIP_TRANSPORT_UDP; 
    2928  
    2929                 if (pjsua_var.tpdata[acc->cfg.transport_id].type != type) 
    2930                     continue; 
     2941            if (acc->tp_type != PJSIP_TRANSPORT_UNSPECIFIED && 
     2942                acc->tp_type != rdata->tp_info.transport->key.type) 
     2943            { 
     2944                continue; 
    29312945            } 
    29322946 
     
    31013115        return PJSIP_EUNSUPTRANSPORT; 
    31023116 
    3103     /* If destination URI specifies IPv6, then set transport type 
    3104      * to use IPv6 as well. 
     3117    /* If destination URI specifies IPv6 or account is configured to use IPv6, 
     3118     * then set transport type to use IPv6 as well. 
    31053119     */ 
    3106     if (pj_strchr(&sip_uri->host, ':')) 
     3120    if (pj_strchr(&sip_uri->host, ':') || pjsua_sip_acc_is_using_ipv6(acc_id)) 
    31073121        tp_type = (pjsip_transport_type_e)(((int)tp_type) | 
    31083122                  PJSIP_TRANSPORT_IPV6); 
     
    31673181        if (status == PJ_SUCCESS) { 
    31683182            unsigned cnt=1; 
    3169             int af; 
    3170  
    3171             af = (dinfo.type & PJSIP_TRANSPORT_IPV6)? PJ_AF_INET6 : PJ_AF_INET; 
     3183            int af = pj_AF_UNSPEC(); 
     3184 
     3185            if (pjsua_sip_acc_is_using_ipv6(acc_id) || 
     3186                (dinfo.type & PJSIP_TRANSPORT_IPV6)) 
     3187            { 
     3188                af = pj_AF_INET6(); 
     3189            } 
    31723190            status = pj_getaddrinfo(af, &dinfo.addr.host, &cnt, &ai); 
    3173             if (cnt == 0) status = PJ_ENOTSUP; 
     3191            if (cnt == 0) { 
     3192                status = PJ_ENOTSUP; 
     3193            } else if ((dinfo.type & PJSIP_TRANSPORT_IPV6)==0 && 
     3194                        ai.ai_addr.addr.sa_family == pj_AF_INET6()) 
     3195            { 
     3196                /* Destination is a hostname and account is not bound to IPv6, 
     3197                 * but hostname resolution reveals that it has IPv6 address, 
     3198                 * so let's use IPv6 transport type. 
     3199                 */ 
     3200                dinfo.type |= PJSIP_TRANSPORT_IPV6; 
     3201                tp_type |= PJSIP_TRANSPORT_IPV6; 
     3202            } 
    31743203        } 
    31753204 
     
    34173446        return PJSIP_EUNSUPTRANSPORT; 
    34183447 
    3419     /* If destination URI specifies IPv6, then set transport type 
    3420      * to use IPv6 as well. 
     3448    /* If destination URI specifies IPv6 or account is configured to use IPv6 
     3449     * or the transport being used to receive data is an IPv6 transport, 
     3450     * then set transport type to use IPv6 as well. 
    34213451     */ 
    3422     if (pj_strchr(&sip_uri->host, ':')) 
    3423         tp_type = (pjsip_transport_type_e)(((int)tp_type) + PJSIP_TRANSPORT_IPV6); 
     3452    if (pj_strchr(&sip_uri->host, ':') || 
     3453        pjsua_sip_acc_is_using_ipv6(acc_id) || 
     3454        (rdata->tp_info.transport->key.type & PJSIP_TRANSPORT_IPV6)) 
     3455    { 
     3456        tp_type = (pjsip_transport_type_e) 
     3457                  (((int)tp_type) | PJSIP_TRANSPORT_IPV6); 
     3458    } 
    34243459 
    34253460    flag = pjsip_transport_get_flag_from_type(tp_type); 
     
    35053540     
    35063541    acc->cfg.transport_id = tp_id; 
     3542    acc->tp_type = pjsua_var.tpdata[tp_id].type; 
    35073543 
    35083544    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.