Ignore:
Timestamp:
Dec 3, 2007 2:38:25 PM (16 years ago)
Author:
bennylp
Message:

Ticket #420: updated pjmedia SDP and media UDP transport to support IPv6

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/endpoint.c

    r1589 r1615  
    3535static const pj_str_t STR_IN = { "IN", 2 }; 
    3636static const pj_str_t STR_IP4 = { "IP4", 3}; 
     37static const pj_str_t STR_IP6 = { "IP6", 3}; 
    3738static const pj_str_t STR_RTP_AVP = { "RTP/AVP", 7 }; 
    3839static const pj_str_t STR_SDP_NAME = { "pjmedia", 7 }; 
     
    290291    pj_time_val tv; 
    291292    unsigned i; 
     293    const pj_sockaddr *addr0; 
    292294    pjmedia_sdp_session *sdp; 
    293295    pjmedia_sdp_media *m; 
     
    303305    /* Create and initialize basic SDP session */ 
    304306    sdp = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_session); 
     307 
     308    addr0 = &sock_info[0].rtp_addr_name; 
    305309 
    306310    pj_gettimeofday(&tv); 
     
    308312    sdp->origin.version = sdp->origin.id = tv.sec + 2208988800UL; 
    309313    sdp->origin.net_type = STR_IN; 
    310     sdp->origin.addr_type = STR_IP4; 
    311     pj_strdup2(pool, &sdp->origin.addr,  
    312                pj_inet_ntoa(sock_info[0].rtp_addr_name.sin_addr)); 
     314 
     315    if (addr0->addr.sa_family == pj_AF_INET()) { 
     316        sdp->origin.addr_type = STR_IP4; 
     317        pj_strdup2(pool, &sdp->origin.addr,  
     318                   pj_inet_ntoa(addr0->ipv4.sin_addr)); 
     319    } else if (addr0->addr.sa_family == pj_AF_INET6()) { 
     320        char tmp_addr[PJ_INET6_ADDRSTRLEN]; 
     321 
     322        sdp->origin.addr_type = STR_IP6; 
     323        pj_strdup2(pool, &sdp->origin.addr,  
     324                   pj_sockaddr_print(addr0, tmp_addr, sizeof(tmp_addr), 0)); 
     325 
     326    } else { 
     327        pj_assert(!"Invalid address family"); 
     328        return PJ_EAFNOTSUP; 
     329    } 
     330 
    313331    sdp->name = STR_SDP_NAME; 
    314332 
     
    317335     */ 
    318336    sdp->conn = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_conn); 
    319     sdp->conn->net_type = STR_IN; 
    320     sdp->conn->addr_type = STR_IP4; 
    321     pj_strdup2(pool, &sdp->conn->addr,  
    322                pj_inet_ntoa(sock_info[0].rtp_addr_name.sin_addr)); 
     337    sdp->conn->net_type = sdp->origin.net_type; 
     338    sdp->conn->addr_type = sdp->origin.addr_type; 
     339    sdp->conn->addr = sdp->origin.addr; 
    323340 
    324341 
     
    335352    /* Standard media info: */ 
    336353    pj_strdup(pool, &m->desc.media, &STR_AUDIO); 
    337     m->desc.port = pj_ntohs(sock_info[0].rtp_addr_name.sin_port); 
     354    m->desc.port = pj_sockaddr_get_port(addr0); 
    338355    m->desc.port_count = 1; 
    339356    pj_strdup (pool, &m->desc.transport, &STR_RTP_AVP); 
     
    345362    /* Add "rtcp" attribute */ 
    346363#if defined(PJMEDIA_HAS_RTCP_IN_SDP) && PJMEDIA_HAS_RTCP_IN_SDP!=0 
    347     if (sock_info->rtcp_addr_name.sin_family != 0) { 
     364    if (sock_info->rtcp_addr_name.addr.sa_family != 0) { 
     365        const pj_sockaddr *rtcp_addr = &sock_info->rtcp_addr_name; 
     366 
    348367        attr = PJ_POOL_ALLOC_T(pool, pjmedia_sdp_attr); 
    349368        attr->name = pj_str("rtcp"); 
    350369        attr->value.ptr = (char*) pj_pool_alloc(pool, 80); 
    351         attr->value.slen =  
    352             pj_ansi_snprintf(attr->value.ptr, 80, 
    353                             "%u IN IP4 %s", 
    354                             pj_ntohs(sock_info[0].rtcp_addr_name.sin_port), 
    355                             pj_inet_ntoa(sock_info[0].rtcp_addr_name.sin_addr)); 
     370        if (rtcp_addr->addr.sa_family == pj_AF_INET()) { 
     371            attr->value.slen =  
     372                pj_ansi_snprintf(attr->value.ptr, 80, 
     373                                "%u IN IP4 %s", 
     374                                pj_ntohs(rtcp_addr->ipv4.sin_port), 
     375                                pj_inet_ntoa(rtcp_addr->ipv4.sin_addr)); 
     376        } else if (rtcp_addr->addr.sa_family == pj_AF_INET6()) { 
     377            char tmp_addr[PJ_INET6_ADDRSTRLEN]; 
     378            attr->value.slen =  
     379                pj_ansi_snprintf(attr->value.ptr, 80, 
     380                                "%u IN IP6 %s", 
     381                                pj_sockaddr_get_port(rtcp_addr), 
     382                                pj_sockaddr_print(rtcp_addr, tmp_addr,  
     383                                                  sizeof(tmp_addr), 0)); 
     384 
     385        } else { 
     386            pj_assert(!"Unsupported address family"); 
     387            return PJ_EAFNOTSUP; 
     388        } 
    356389        pjmedia_sdp_attr_add(&m->attr_count, m->attr, attr); 
    357390    } 
Note: See TracChangeset for help on using the changeset viewer.