Changeset 562


Ignore:
Timestamp:
Jun 28, 2006 4:23:23 PM (16 years ago)
Author:
bennylp
Message:

Enhancements and minor bug-fix in SIP UDP transport: (1) application may specify NULL address when creating the UDP transport, to allow the transport to choose arbitrary port, and (2) receive data buffers were not freed when UDP transport is closed

Location:
pjproject/trunk/pjsip
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip/sip_transport_udp.h

    r550 r562  
    4242 * 
    4343 * @param endpt         The SIP endpoint. 
    44  * @param local         Local address to bind. 
     44 * @param local         Optional local address to bind. If this argument 
     45 *                      is NULL, the UDP transport will be bound to arbitrary 
     46 *                      UDP port. 
    4547 * @param a_name        Published address (only the host and port portion is  
    4648 *                      used). If this argument is NULL, then the bound address 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c

    r550 r562  
    360360        if (cnt == 0) 
    361361            break; 
     362    } 
     363 
     364    /* Destroy rdata */ 
     365    for (i=0; i<tp->rdata_cnt; ++i) { 
     366        pj_pool_release(tp->rdata[i]->tp_info.pool); 
    362367    } 
    363368 
     
    577582    if (p_transport) 
    578583        *p_transport = &tp->base; 
     584 
     585    PJ_LOG(4,(tp->base.obj_name,  
     586              "SIP UDP transport started, published address is %.*s:%d", 
     587              (int)tp->base.local_name.host.slen, 
     588              tp->base.local_name.host.ptr, 
     589              tp->base.local_name.port)); 
     590 
    579591    return PJ_SUCCESS; 
    580592 
     
    590602 */ 
    591603PJ_DEF(pj_status_t) pjsip_udp_transport_start( pjsip_endpoint *endpt, 
    592                                                const pj_sockaddr_in *local, 
     604                                               const pj_sockaddr_in *local_a, 
    593605                                               const pjsip_host_port *a_name, 
    594606                                               unsigned async_cnt, 
     
    598610    pj_status_t status; 
    599611    char addr_buf[16]; 
     612    pj_sockaddr_in tmp_addr; 
    600613    pjsip_host_port bound_name; 
    601614 
    602     PJ_ASSERT_RETURN(local != NULL, PJ_EINVAL); 
     615    PJ_ASSERT_RETURN(endpt && async_cnt, PJ_EINVAL); 
    603616 
    604617    status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock); 
     
    606619        return status; 
    607620 
    608     status = pj_sock_bind(sock, local, sizeof(*local)); 
     621    if (local_a == NULL) { 
     622        pj_sockaddr_in_init(&tmp_addr, NULL, 0); 
     623        local_a = &tmp_addr; 
     624    } 
     625 
     626    status = pj_sock_bind(sock, local_a, sizeof(*local_a)); 
    609627    if (status != PJ_SUCCESS) { 
    610628        pj_sock_close(sock); 
     
    616634         * Build a name based on bound address. 
    617635         */ 
     636        int addr_len; 
     637 
     638        addr_len = sizeof(tmp_addr); 
     639        status = pj_sock_getsockname(sock, &tmp_addr, &addr_len); 
     640        if (status != PJ_SUCCESS) { 
     641            pj_sock_close(sock); 
     642            return status; 
     643        } 
     644 
    618645        a_name = &bound_name; 
    619646        bound_name.host.ptr = addr_buf; 
    620         bound_name.port = pj_ntohs(local->sin_port); 
     647        bound_name.port = pj_ntohs(tmp_addr.sin_port); 
    621648 
    622649        /* If bound address specifies "0.0.0.0", get the IP address 
    623650         * of local hostname. 
    624651         */ 
    625         if (local->sin_addr.s_addr == PJ_INADDR_ANY) { 
     652        if (tmp_addr.sin_addr.s_addr == PJ_INADDR_ANY) { 
    626653            pj_hostent he; 
    627654            const pj_str_t *hostname = pj_gethostname(); 
     
    635662        } else { 
    636663            /* Otherwise use bound address. */ 
    637             pj_strcpy2(&bound_name.host, pj_inet_ntoa(local->sin_addr)); 
     664            pj_strcpy2(&bound_name.host, pj_inet_ntoa(tmp_addr.sin_addr)); 
    638665        } 
    639666         
Note: See TracChangeset for help on using the changeset viewer.