Ignore:
Timestamp:
Dec 26, 2005 12:52:19 PM (18 years ago)
Author:
bennylp
Message:

Modify transport to use generic sockaddr address

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c

    r65 r105  
    4141 
    4242/* 
    43  * on_read_complete() 
     43 * udp_on_read_complete() 
    4444 * 
    4545 * This is callback notification from ioqueue that a pending recvfrom() 
    4646 * operation has completed. 
    4747 */ 
    48 static void on_read_complete( pj_ioqueue_key_t *key,  
    49                               pj_ioqueue_op_key_t *op_key,  
    50                               pj_ssize_t bytes_read) 
     48static void udp_on_read_complete( pj_ioqueue_key_t *key,  
     49                                  pj_ioqueue_op_key_t *op_key,  
     50                                  pj_ssize_t bytes_read) 
    5151{ 
    5252    enum { MAX_IMMEDIATE_PACKET = 10 }; 
     
    7373        if (bytes_read > 0) { 
    7474            pj_size_t size_eaten; 
    75  
     75            const pj_sockaddr_in *src_addr =  
     76                (pj_sockaddr_in*)&rdata->pkt_info.src_addr; 
     77 
     78            /* Init pkt_info part. */ 
    7679            rdata->pkt_info.len = bytes_read; 
    7780            rdata->pkt_info.zero = 0; 
    7881            pj_gettimeofday(&rdata->pkt_info.timestamp); 
     82            pj_native_strcpy(rdata->pkt_info.src_name, 
     83                             pj_inet_ntoa(src_addr->sin_addr)); 
     84            rdata->pkt_info.src_port = pj_ntohs(src_addr->sin_port); 
    7985 
    8086            size_eaten =  
     
    110116        /* Read next packet. */ 
    111117        bytes_read = sizeof(rdata->pkt_info.packet); 
    112         rdata->pkt_info.addr_len = sizeof(rdata->pkt_info.addr); 
     118        rdata->pkt_info.src_addr_len = sizeof(rdata->pkt_info.src_addr); 
    113119        status = pj_ioqueue_recvfrom(key, op_key,  
    114120                                     rdata->pkt_info.packet, 
    115121                                     &bytes_read, flags, 
    116                                      &rdata->pkt_info.addr,  
    117                                      &rdata->pkt_info.addr_len); 
     122                                     &rdata->pkt_info.src_addr,  
     123                                     &rdata->pkt_info.src_addr_len); 
    118124 
    119125        if (status == PJ_SUCCESS) { 
     
    150156 
    151157/* 
    152  * on_write_complete() 
     158 * udp_on_write_complete() 
    153159 * 
    154160 * This is callback notification from ioqueue that a pending sendto() 
    155161 * operation has completed. 
    156162 */ 
    157 static void on_write_complete( pj_ioqueue_key_t *key,  
    158                                pj_ioqueue_op_key_t *op_key, 
    159                                pj_ssize_t bytes_sent) 
     163static void udp_on_write_complete( pj_ioqueue_key_t *key,  
     164                                   pj_ioqueue_op_key_t *op_key, 
     165                                   pj_ssize_t bytes_sent) 
    160166{ 
    161167    struct udp_transport *tp = pj_ioqueue_get_user_data(key); 
     
    170176 
    171177/* 
    172  * transport_send_msg() 
     178 * udp_send_msg() 
    173179 * 
    174180 * This function is called by transport manager (by transport->send_msg()) 
    175181 * to send outgoing message. 
    176182 */ 
    177 static pj_status_t transport_send_msg( pjsip_transport *transport, 
    178                                        pjsip_tx_data *tdata, 
    179                                        const pj_sockaddr_in *rem_addr, 
    180                                        void *token, 
    181                                        void (*callback)(pjsip_transport*, 
    182                                                         void *token, 
    183                                                         pj_ssize_t)) 
     183static pj_status_t udp_send_msg( pjsip_transport *transport, 
     184                                 pjsip_tx_data *tdata, 
     185                                 const pj_sockaddr_t *rem_addr, 
     186                                 int addr_len, 
     187                                 void *token, 
     188                                 void (*callback)(pjsip_transport*, 
     189                                                  void *token, 
     190                                                  pj_ssize_t)) 
    184191{ 
    185192    struct udp_transport *tp = (struct udp_transport*)transport; 
     
    198205    return pj_ioqueue_sendto(tp->key, (pj_ioqueue_op_key_t*)&tdata->op_key, 
    199206                             tdata->buf.start, &size, 0, 
    200                              rem_addr, (rem_addr ? sizeof(pj_sockaddr_in):0)); 
    201 } 
    202  
    203 /* 
    204  * transport_destroy() 
     207                             rem_addr, addr_len); 
     208} 
     209 
     210/* 
     211 * udp_destroy() 
    205212 * 
    206213 * This function is called by transport manager (by transport->destroy()). 
    207214 */ 
    208 static pj_status_t transport_destroy( pjsip_transport *transport ) 
     215static pj_status_t udp_destroy( pjsip_transport *transport ) 
    209216{ 
    210217    struct udp_transport *tp = (struct udp_transport*)transport; 
     
    250257PJ_DEF(pj_status_t) pjsip_udp_transport_attach( pjsip_endpoint *endpt, 
    251258                                                pj_sock_t sock, 
    252                                                 const pj_sockaddr_in *pub_addr, 
     259                                                const pjsip_host_port *a_name, 
    253260                                                unsigned async_cnt, 
    254261                                                pjsip_transport **p_transport) 
     
    259266    pj_ioqueue_callback ioqueue_cb; 
    260267    unsigned i; 
    261     int addrlen; 
    262268    pj_status_t status; 
    263269 
    264270    /* Create pool. */ 
    265271    pool = pjsip_endpt_create_pool(endpt, "udp%p", PJSIP_POOL_LEN_TRANSPORT,  
    266                                PJSIP_POOL_INC_TRANSPORT); 
     272                                   PJSIP_POOL_INC_TRANSPORT); 
    267273    if (!pool) 
    268274        return PJ_ENOMEM; 
    269275 
     276    /* Create the UDP transport object. */ 
    270277    tp = pj_pool_zalloc(pool, sizeof(struct udp_transport)); 
     278 
     279    /* Save pool. */ 
    271280    tp->base.pool = pool; 
    272     tp->base.endpt = endpt; 
    273  
    274     /* Init type, type_name, and flag */ 
    275     tp->base.type = PJSIP_TRANSPORT_UDP; 
    276     pj_native_strcpy(tp->base.type_name, "UDP"); 
    277     tp->base.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP); 
    278  
    279     /* Init addresses. */ 
    280     addrlen = sizeof(tp->base.local_addr); 
    281     status = pj_sock_getsockname(sock, &tp->base.local_addr, &addrlen); 
    282     if (status != PJ_SUCCESS) { 
    283         pjsip_endpt_destroy_pool(endpt, pool); 
    284         return status; 
    285     } 
    286     pj_memcpy(&tp->base.public_addr, pub_addr, sizeof(pj_sockaddr_in)); 
    287     tp->base.rem_addr.sin_family = PJ_AF_INET; 
     281 
     282    /* Object name. */ 
     283    pj_sprintf(tp->base.obj_name, "udp%p", tp); 
    288284 
    289285    /* Init reference counter. */ 
     
    296292    if (status != PJ_SUCCESS) 
    297293        goto on_error; 
     294 
     295    /* Set type. */ 
     296    tp->base.key.type = PJSIP_TRANSPORT_UDP; 
     297 
     298    /* Remote address is left zero (except the family) */ 
     299    tp->base.key.rem_addr.sa_family = PJ_AF_INET; 
     300 
     301    /* Type name. */ 
     302    tp->base.type_name = "UDP"; 
     303 
     304    /* Transport flag */ 
     305    tp->base.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP); 
     306 
     307 
     308    /* Length of addressess. */ 
     309    tp->base.addr_len = sizeof(pj_sockaddr_in); 
     310 
     311    /* Init local address. */ 
     312    status = pj_sock_getsockname(sock, &tp->base.local_addr,  
     313                                 &tp->base.addr_len); 
     314    if (status != PJ_SUCCESS) 
     315        goto on_error; 
     316 
     317    /* Init address name (published address) */ 
     318    pj_strdup_with_null(pool, &tp->base.local_name.host, &a_name->host); 
     319    tp->base.local_name.port = a_name->port; 
     320 
     321    /* Init remote name. */ 
     322    tp->base.remote_name.host = pj_str("0.0.0.0"); 
     323    tp->base.remote_name.port = 0; 
     324 
     325    /* Transport info. */ 
     326    tp->base.info = pj_pool_alloc(pool, 80); 
     327    pj_sprintf(tp->base.info, "udp %s:%d [published as %s:%d]", 
     328                              pj_inet_ntoa(((pj_sockaddr_in*)&tp->base.local_addr)->sin_addr), 
     329                              pj_ntohs(((pj_sockaddr_in*)&tp->base.local_addr)->sin_port), 
     330                              tp->base.local_name.host, 
     331                              tp->base.local_name.port); 
     332 
     333    /* Set endpoint. */ 
     334    tp->base.endpt = endpt; 
     335 
     336    /* Transport manager and timer will be initialized by tpmgr */ 
    298337 
    299338    /* Attach socket. */ 
     
    303342    ioqueue = pjsip_endpt_get_ioqueue(endpt); 
    304343    pj_memset(&ioqueue_cb, 0, sizeof(ioqueue_cb)); 
    305     ioqueue_cb.on_read_complete = &on_read_complete; 
    306     ioqueue_cb.on_write_complete = &on_write_complete; 
     344    ioqueue_cb.on_read_complete = &udp_on_read_complete; 
     345    ioqueue_cb.on_write_complete = &udp_on_write_complete; 
    307346    status = pj_ioqueue_register_sock(pool, ioqueue, tp->sock, tp,  
    308347                                      &ioqueue_cb, &tp->key); 
     
    311350 
    312351    /* Set functions. */ 
    313     tp->base.send_msg = &transport_send_msg; 
    314     tp->base.destroy = &transport_destroy; 
     352    tp->base.send_msg = &udp_send_msg; 
     353    tp->base.destroy = &udp_destroy; 
    315354 
    316355    /* This is a permanent transport, so we initialize the ref count 
     
    331370    for (i=0; i<async_cnt; ++i) { 
    332371        pj_pool_t *rdata_pool = pjsip_endpt_create_pool(endpt, "rtd%p",  
    333                                                         PJSIP_POOL_LEN_RDATA, 
    334                                                         PJSIP_POOL_INC_RDATA); 
     372                                                        PJSIP_POOL_RDATA_LEN, 
     373                                                        PJSIP_POOL_RDATA_INC); 
    335374        if (!rdata_pool) { 
    336375            pj_atomic_set(tp->base.ref_cnt, 0); 
     
    340379 
    341380        tp->rdata[i] = pj_pool_zalloc(rdata_pool, sizeof(pjsip_rx_data)); 
     381 
     382        /* Init tp_info part. */ 
    342383        tp->rdata[i]->tp_info.pool = rdata_pool; 
    343384        tp->rdata[i]->tp_info.transport = &tp->base; 
     
    353394 
    354395        size = sizeof(tp->rdata[i]->pkt_info.packet); 
    355         tp->rdata[i]->pkt_info.addr_len = sizeof(tp->rdata[i]->pkt_info.addr); 
     396        tp->rdata[i]->pkt_info.src_addr_len = sizeof(tp->rdata[i]->pkt_info.src_addr); 
    356397        status = pj_ioqueue_recvfrom(tp->key,  
    357398                                     &tp->rdata[i]->tp_info.op_key.op_key, 
    358399                                     tp->rdata[i]->pkt_info.packet, 
    359400                                     &size, PJ_IOQUEUE_ALWAYS_ASYNC, 
    360                                      &tp->rdata[i]->pkt_info.addr, 
    361                                      &tp->rdata[i]->pkt_info.addr_len); 
     401                                     &tp->rdata[i]->pkt_info.src_addr, 
     402                                     &tp->rdata[i]->pkt_info.src_addr_len); 
    362403        if (status == PJ_SUCCESS) { 
    363404            pj_assert(!"Shouldn't happen because PJ_IOQUEUE_ALWAYS_ASYNC!"); 
    364             on_read_complete(tp->key, &tp->rdata[i]->tp_info.op_key.op_key,  
    365                             size); 
     405            udp_on_read_complete(tp->key, &tp->rdata[i]->tp_info.op_key.op_key, 
     406                                size); 
    366407        } else if (status != PJ_EPENDING) { 
    367408            /* Error! */ 
     
    376417 
    377418on_error: 
    378     transport_destroy((pjsip_transport*)tp); 
     419    udp_destroy((pjsip_transport*)tp); 
    379420    return status; 
    380421} 
     
    383424 * pjsip_udp_transport_start() 
    384425 * 
    385  * Start an UDP transport/listener. 
     426 * Create a UDP socket in the specified address and start a transport. 
    386427 */ 
    387428PJ_DEF(pj_status_t) pjsip_udp_transport_start( pjsip_endpoint *endpt, 
    388429                                               const pj_sockaddr_in *local, 
    389                                                const pj_sockaddr_in *pub_addr, 
     430                                               const pjsip_host_port *a_name, 
    390431                                               unsigned async_cnt, 
    391432                                               pjsip_transport **p_transport) 
     
    393434    pj_sock_t sock; 
    394435    pj_status_t status; 
     436    char addr_buf[16]; 
     437    pjsip_host_port bound_name; 
    395438 
    396439    status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock); 
     
    404447    } 
    405448 
    406     return pjsip_udp_transport_attach( endpt, sock, pub_addr, async_cnt,  
     449    if (a_name == NULL) { 
     450        a_name = &bound_name; 
     451        bound_name.host.ptr = addr_buf; 
     452        pj_strcpy2(&bound_name.host, pj_inet_ntoa(local->sin_addr)); 
     453        bound_name.port = pj_ntohs(local->sin_port); 
     454    } 
     455 
     456    return pjsip_udp_transport_attach( endpt, sock, a_name, async_cnt,  
    407457                                       p_transport ); 
    408458} 
Note: See TracChangeset for help on using the changeset viewer.