Ignore:
Timestamp:
Feb 21, 2013 6:06:51 PM (6 years ago)
Author:
bennylp
Message:

Re #1624: fixed representation in ICE to make it more IPv6 ready

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjnath/src/pjnath/ice_session.c

    r4360 r4365  
    719719    pj_ice_sess_cand *lcand; 
    720720    pj_status_t status = PJ_SUCCESS; 
     721    char address[PJ_INET6_ADDRSTRLEN]; 
    721722 
    722723    PJ_ASSERT_RETURN(ice && comp_id &&  
     
    738739    pj_strdup(ice->pool, &lcand->foundation, foundation); 
    739740    lcand->prio = CALC_CAND_PRIO(ice, type, local_pref, lcand->comp_id); 
    740     pj_memcpy(&lcand->addr, addr, addr_len); 
    741     pj_memcpy(&lcand->base_addr, base_addr, addr_len); 
     741    pj_sockaddr_cp(&lcand->addr, addr); 
     742    pj_sockaddr_cp(&lcand->base_addr, base_addr); 
    742743    if (rel_addr == NULL) 
    743744        rel_addr = base_addr; 
    744745    pj_memcpy(&lcand->rel_addr, rel_addr, addr_len); 
    745746 
    746     pj_ansi_strcpy(ice->tmp.txt, pj_inet_ntoa(lcand->addr.ipv4.sin_addr)); 
     747    pj_ansi_strcpy(ice->tmp.txt, pj_sockaddr_print(&lcand->addr, address, 
     748                                                   sizeof(address), 0)); 
    747749    LOG4((ice->obj_name,  
    748750         "Candidate %d added: comp_id=%d, type=%s, foundation=%.*s, " 
     
    754756         lcand->foundation.ptr, 
    755757         ice->tmp.txt,  
    756          (int)pj_ntohs(lcand->addr.ipv4.sin_port), 
    757          pj_inet_ntoa(lcand->base_addr.ipv4.sin_addr), 
    758          (int)pj_htons(lcand->base_addr.ipv4.sin_port), 
     758          pj_sockaddr_get_port(&lcand->addr), 
     759          pj_sockaddr_print(&lcand->base_addr, address, sizeof(address), 0), 
     760          pj_sockaddr_get_port(&lcand->base_addr), 
    759761         lcand->prio, lcand->prio)); 
    760762 
     
    893895    const pj_ice_sess_cand *lcand = check->lcand; 
    894896    const pj_ice_sess_cand *rcand = check->rcand; 
    895     char laddr[PJ_INET6_ADDRSTRLEN]; 
     897    char laddr[PJ_INET6_ADDRSTRLEN], raddr[PJ_INET6_ADDRSTRLEN]; 
    896898    int len; 
    897899 
    898900    PJ_CHECK_STACK(); 
    899901 
    900     pj_ansi_strcpy(laddr, pj_inet_ntoa(lcand->addr.ipv4.sin_addr)); 
    901  
    902     if (lcand->addr.addr.sa_family == pj_AF_INET()) { 
    903         len = pj_ansi_snprintf(buffer, bufsize, 
    904                                "%d: [%d] %s:%d-->%s:%d", 
    905                                (int)GET_CHECK_ID(clist, check), 
    906                                check->lcand->comp_id, 
    907                                laddr, (int)pj_ntohs(lcand->addr.ipv4.sin_port), 
    908                                pj_inet_ntoa(rcand->addr.ipv4.sin_addr), 
    909                                (int)pj_ntohs(rcand->addr.ipv4.sin_port)); 
    910     } else { 
    911         len = pj_ansi_snprintf(buffer, bufsize, "IPv6->IPv6"); 
    912     } 
    913  
     902    pj_ansi_strcpy(laddr, pj_sockaddr_print(&lcand->addr, laddr, 
     903                                            sizeof(laddr), 0)); 
     904 
     905    len = pj_ansi_snprintf(buffer, bufsize, 
     906                           "%d: [%d] %s:%d-->%s:%d", 
     907                           (int)GET_CHECK_ID(clist, check), 
     908                           check->lcand->comp_id, 
     909                           pj_sockaddr_print(&lcand->addr, laddr, 
     910                                             sizeof(laddr), 0), 
     911                           pj_sockaddr_get_port(&lcand->addr), 
     912                           pj_sockaddr_print(&rcand->addr, raddr, 
     913                                             sizeof(raddr), 0), 
     914                           pj_sockaddr_get_port(&rcand->addr)); 
    914915 
    915916    if (len < 0) 
     
    10151016} 
    10161017 
    1017 enum  
    1018 {  
    1019     SOCKADDR_EQUAL = 0,  
    1020     SOCKADDR_NOT_EQUAL = 1  
    1021 }; 
    1022  
    1023 /* Utility: compare sockaddr. 
    1024  * Returns 0 if equal. 
    1025  */ 
    1026 static int sockaddr_cmp(const pj_sockaddr *a1, const pj_sockaddr *a2) 
    1027 { 
    1028     if (a1->addr.sa_family != a2->addr.sa_family) 
    1029         return SOCKADDR_NOT_EQUAL; 
    1030  
    1031     if (a1->addr.sa_family == pj_AF_INET()) { 
    1032         return !(a1->ipv4.sin_addr.s_addr == a2->ipv4.sin_addr.s_addr && 
    1033                  a1->ipv4.sin_port == a2->ipv4.sin_port); 
    1034     } else if (a1->addr.sa_family == pj_AF_INET6()) { 
    1035         return pj_memcmp(&a1->ipv6, &a2->ipv6, sizeof(a1->ipv6)); 
    1036     } else { 
    1037         pj_assert(!"Invalid address family!"); 
    1038         return SOCKADDR_NOT_EQUAL; 
    1039     } 
    1040 } 
    1041  
    1042  
    10431018/* Prune checklist, this must have been done after the checklist 
    10441019 * is sorted. 
     
    10721047                    continue; 
    10731048 
    1074                 if (sockaddr_cmp(&srflx->base_addr, &host->addr) == 0) { 
     1049                if (pj_sockaddr_cmp(&srflx->base_addr, &host->addr) == 0) { 
    10751050                    /* Replace this SRFLX with its BASE */ 
    10761051                    clist->checks[i].lcand = host; 
     
    10801055 
    10811056            if (j==ice->lcand_cnt) { 
     1057                char baddr[PJ_INET6_ADDRSTRLEN]; 
    10821058                /* Host candidate not found this this srflx! */ 
    10831059                LOG4((ice->obj_name,  
    10841060                      "Base candidate %s:%d not found for srflx candidate %d", 
    1085                       pj_inet_ntoa(srflx->base_addr.ipv4.sin_addr), 
    1086                       pj_ntohs(srflx->base_addr.ipv4.sin_port), 
     1061                      pj_sockaddr_print(&srflx->base_addr, baddr, 
     1062                                        sizeof(baddr), 0), 
     1063                      pj_sockaddr_get_port(&srflx->base_addr), 
    10871064                      GET_LCAND_ID(clist->checks[i].lcand))); 
    10881065                return PJNATH_EICENOHOSTCAND; 
     
    11121089                reason = "duplicate found"; 
    11131090            } else if ((rjcand == ricand) && 
    1114                        (sockaddr_cmp(&ljcand->base_addr,  
     1091                       (pj_sockaddr_cmp(&ljcand->base_addr,  
    11151092                                     &licand->base_addr)==0))  
    11161093            { 
     
    18401817    status = pj_stun_session_send_msg(comp->stun_sess, msg_data, PJ_FALSE,  
    18411818                                      PJ_TRUE, &rcand->addr,  
    1842                                       sizeof(pj_sockaddr_in), check->tdata); 
     1819                                      pj_sockaddr_get_len(&rcand->addr), 
     1820                                      check->tdata); 
    18431821    if (status != PJ_SUCCESS) { 
    18441822        check->tdata = NULL; 
     
    22932271     * Request was sent from. 
    22942272     */ 
    2295     if (sockaddr_cmp(&check->rcand->addr, (const pj_sockaddr*)src_addr) != 0) { 
     2273    if (pj_sockaddr_cmp(&check->rcand->addr, (const pj_sockaddr*)src_addr)!=0) 
     2274    { 
    22962275        status = PJNATH_EICEINSRCADDR; 
    22972276        LOG4((ice->obj_name,  
     
    23442323    pj_assert(lcand == NULL); 
    23452324    for (i=0; i<ice->lcand_cnt; ++i) { 
    2346         if (sockaddr_cmp(&xaddr->sockaddr, &ice->lcand[i].addr) == 0) { 
     2325        if (pj_sockaddr_cmp(&xaddr->sockaddr, &ice->lcand[i].addr) == 0) { 
    23472326            /* Match */ 
    23482327            lcand = &ice->lcand[i]; 
     
    23802359                                      &check->lcand->base_addr,  
    23812360                                      &check->lcand->base_addr, 
    2382                                       sizeof(pj_sockaddr_in), &cand_id); 
     2361                                      pj_sockaddr_get_len(&xaddr->sockaddr), 
     2362                                      &cand_id); 
    23832363        if (status != PJ_SUCCESS) { 
    23842364            check_set_state(ice, check, PJ_ICE_SESS_CHECK_STATE_FAILED,  
     
    26192599    rcheck->transport_id = ((pj_ice_msg_data*)token)->transport_id; 
    26202600    rcheck->src_addr_len = src_addr_len; 
    2621     pj_memcpy(&rcheck->src_addr, src_addr, src_addr_len); 
     2601    pj_sockaddr_cp(&rcheck->src_addr, src_addr); 
    26222602    rcheck->use_candidate = (uc_attr != NULL); 
    26232603    rcheck->priority = prio_attr->value; 
     
    26572637     */ 
    26582638    for (i=0; i<ice->rcand_cnt; ++i) { 
    2659         if (sockaddr_cmp(&rcheck->src_addr, &ice->rcand[i].addr)==0) 
     2639        if (pj_sockaddr_cmp(&rcheck->src_addr, &ice->rcand[i].addr)==0) 
    26602640            break; 
    26612641    } 
     
    26672647     */ 
    26682648    if (i == ice->rcand_cnt) { 
     2649        char raddr[PJ_INET6_ADDRSTRLEN]; 
    26692650        if (ice->rcand_cnt >= PJ_ICE_MAX_CAND) { 
    26702651            LOG4((ice->obj_name,  
     
    26782659        rcand->type = PJ_ICE_CAND_TYPE_PRFLX; 
    26792660        rcand->prio = rcheck->priority; 
    2680         pj_memcpy(&rcand->addr, &rcheck->src_addr, rcheck->src_addr_len); 
     2661        pj_sockaddr_cp(&rcand->addr, &rcheck->src_addr); 
    26812662 
    26822663        /* Foundation is random, unique from other foundation */ 
     
    26872668 
    26882669        LOG4((ice->obj_name,  
    2689              "Added new remote candidate from the request: %s:%d", 
    2690              pj_inet_ntoa(rcand->addr.ipv4.sin_addr), 
    2691              (int)pj_ntohs(rcand->addr.ipv4.sin_port))); 
     2670              "Added new remote candidate from the request: %s:%d", 
     2671              pj_sockaddr_print(&rcand->addr, raddr, sizeof(raddr), 0), 
     2672              pj_sockaddr_get_port(&rcand->addr))); 
    26922673 
    26932674    } else { 
     
    27062687        pj_ice_sess_check *c = &ice->clist.checks[i]; 
    27072688        if (/*c->lcand == lcand ||*/ 
    2708             sockaddr_cmp(&c->lcand->base_addr, &lcand->base_addr)==0) 
     2689            pj_sockaddr_cmp(&c->lcand->base_addr, &lcand->base_addr)==0) 
    27092690        { 
    27102691            lcand = c->lcand; 
     
    29552936                                  data, data_len,  
    29562937                                  &addr,  
    2957                                   sizeof(pj_sockaddr_in)); 
     2938                                  pj_sockaddr_get_len(&addr)); 
    29582939 
    29592940on_return: 
Note: See TracChangeset for help on using the changeset viewer.