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/session.c

    r1448 r1615  
    5353static const pj_str_t ID_IN = { "IN", 2 }; 
    5454static const pj_str_t ID_IP4 = { "IP4", 3}; 
    55 static const pj_str_t ID_RTP_AVP = { "RTP/AVP", 7 }; 
    56 static const pj_str_t ID_SDP_NAME = { "pjmedia", 7 }; 
     55static const pj_str_t ID_IP6 = { "IP6", 3}; 
     56/*static const pj_str_t ID_RTP_AVP = { "RTP/AVP", 7 };*/ 
     57/*static const pj_str_t ID_SDP_NAME = { "pjmedia", 7 };*/ 
    5758static const pj_str_t ID_RTPMAP = { "rtpmap", 6 }; 
    5859static const pj_str_t ID_TELEPHONE_EVENT = { "telephone-event", 15 }; 
     
    130131    const pjmedia_sdp_conn *local_conn; 
    131132    const pjmedia_sdp_conn *rem_conn; 
     133    int rem_af, local_af; 
     134    pj_sockaddr local_addr; 
    132135    pjmedia_sdp_rtpmap *rtpmap; 
    133136    int local_fmtp_mode = 0, rem_fmtp_mode = 0; 
     
    186189    } 
    187190 
     191    /* Check address family in remote SDP */ 
     192    rem_af = pj_AF_UNSPEC(); 
     193    if (pj_stricmp(&rem_conn->net_type, &ID_IN)==0) { 
     194        if (pj_stricmp(&rem_conn->addr_type, &ID_IP4)==0) { 
     195            rem_af = pj_AF_INET(); 
     196        } else if (pj_stricmp(&rem_conn->addr_type, &ID_IP6)==0) { 
     197            rem_af = pj_AF_UNSPEC(); 
     198        } 
     199    } 
     200 
     201    if (rem_af==pj_AF_UNSPEC()) { 
     202        /* Unsupported address family */ 
     203        return PJ_EAFNOTSUP; 
     204    } 
     205 
     206    /* Set remote address: */ 
     207    status = pj_sockaddr_init(rem_af, &si->rem_addr, &rem_conn->addr,  
     208                              rem_m->desc.port); 
     209    if (status != PJ_SUCCESS) { 
     210        /* Invalid IP address. */ 
     211        return PJMEDIA_EINVALIDIP; 
     212    } 
     213 
     214    /* Check address family of local info */ 
     215    local_af = pj_AF_UNSPEC(); 
     216    if (pj_stricmp(&local_conn->net_type, &ID_IN)==0) { 
     217        if (pj_stricmp(&local_conn->addr_type, &ID_IP4)==0) { 
     218            local_af = pj_AF_INET(); 
     219        } else if (pj_stricmp(&local_conn->addr_type, &ID_IP6)==0) { 
     220            local_af = pj_AF_UNSPEC(); 
     221        } 
     222    } 
     223 
     224    if (local_af==pj_AF_UNSPEC()) { 
     225        /* Unsupported address family */ 
     226        return PJ_EAFNOTSUP; 
     227    } 
     228 
     229    /* Set remote address: */ 
     230    status = pj_sockaddr_init(local_af, &local_addr, &local_conn->addr,  
     231                              local_m->desc.port); 
     232    if (status != PJ_SUCCESS) { 
     233        /* Invalid IP address. */ 
     234        return PJMEDIA_EINVALIDIP; 
     235    } 
     236 
     237    /* Local and remote address family must match */ 
     238    if (local_af != rem_af) 
     239        return PJ_EAFNOTSUP; 
     240 
    188241    /* Media direction: */ 
    189242 
    190243    if (local_m->desc.port == 0 ||  
    191         pj_inet_addr(&local_conn->addr).s_addr==0 || 
    192         pj_inet_addr(&rem_conn->addr).s_addr==0 || 
     244        pj_sockaddr_has_addr(&local_addr)==PJ_FALSE || 
     245        pj_sockaddr_has_addr(&si->rem_addr)==PJ_FALSE || 
    193246        pjmedia_sdp_media_find_attr(local_m, &STR_INACTIVE, NULL)!=NULL) 
    194247    { 
     
    215268        si->dir = PJMEDIA_DIR_ENCODING_DECODING; 
    216269 
    217     } 
    218  
    219  
    220     /* Set remote address: */ 
    221     status = pj_sockaddr_in_init(&si->rem_addr, &rem_conn->addr,  
    222                                  rem_m->desc.port); 
    223     if (status != PJ_SUCCESS) { 
    224         /* Invalid IP address. */ 
    225         return PJMEDIA_EINVALIDIP; 
    226270    } 
    227271 
     
    236280        if (status == PJ_SUCCESS) { 
    237281            if (rtcp.addr.slen) { 
    238                 status = pj_sockaddr_in_init(&si->rem_rtcp, &rtcp.addr, 
    239                                              (pj_uint16_t)rtcp.port); 
     282                status = pj_sockaddr_init(rem_af, &si->rem_rtcp, &rtcp.addr, 
     283                                          (pj_uint16_t)rtcp.port); 
    240284            } else { 
    241                 pj_sockaddr_in_init(&si->rem_rtcp, NULL,  
    242                                     (pj_uint16_t)rtcp.port); 
    243                 si->rem_rtcp.sin_addr.s_addr = si->rem_addr.sin_addr.s_addr; 
     285                pj_sockaddr_init(rem_af, &si->rem_rtcp, NULL,  
     286                                 (pj_uint16_t)rtcp.port); 
     287                pj_memcpy(pj_sockaddr_get_addr(&si->rem_rtcp), 
     288                          pj_sockaddr_get_addr(&si->rem_addr), 
     289                          pj_sockaddr_get_addr_len(&si->rem_addr)); 
    244290            } 
    245291        } 
    246292    } 
    247293     
    248     if (si->rem_rtcp.sin_addr.s_addr == 0) { 
     294    if (!pj_sockaddr_has_addr(&si->rem_rtcp) == 0) { 
    249295        int rtcp_port; 
    250296 
    251         pj_memcpy(&si->rem_rtcp, &si->rem_addr, sizeof(pj_sockaddr_in)); 
    252         rtcp_port = pj_ntohs(si->rem_addr.sin_port) + 1; 
    253         si->rem_rtcp.sin_port = pj_htons((pj_uint16_t)rtcp_port); 
     297        pj_memcpy(&si->rem_rtcp, &si->rem_addr, sizeof(pj_sockaddr)); 
     298        rtcp_port = pj_sockaddr_get_port(&si->rem_addr) + 1; 
     299        pj_sockaddr_set_port(&si->rem_rtcp, (pj_uint16_t)rtcp_port); 
    254300    } 
    255301 
Note: See TracChangeset for help on using the changeset viewer.