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

    r80 r105  
    4747}; 
    4848 
    49  
    50  
    5149/***************************************************************************** 
    5250 * 
     
    8280    unsigned i; 
    8381 
     82    /* Sanity check.  
     83     * Check that transport_names[] are indexed on transport type.  
     84     */ 
     85    PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
     86                     PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 
     87 
     88    /* Get transport type from name. */ 
    8489    for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 
    8590        if (pj_stricmp(name, &transport_names[i].name) == 0) { 
     
    101106    unsigned i; 
    102107 
     108    /* Sanity check.  
     109     * Check that transport_names[] are indexed on transport type.  
     110     */ 
     111    PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
     112                     PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED); 
     113 
     114    /* Get the transport type for the specified flags. */ 
    103115    for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 
    104116        if (transport_names[i].flag == flag) { 
     
    114126pjsip_transport_get_flag_from_type( pjsip_transport_type_e type ) 
    115127{ 
     128    /* Sanity check.  
     129     * Check that transport_names[] are indexed on transport type.  
     130     */ 
     131    PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
     132                     PJSIP_TRANSPORT_UDP, 0); 
     133 
     134    /* Check that argument is valid. */ 
    116135    PJ_ASSERT_RETURN(type < PJ_ARRAY_SIZE(transport_names), 0); 
     136 
     137    /* Return transport flag. */ 
    117138    return transport_names[type].flag; 
    118139} 
     
    124145pjsip_transport_get_default_port_for_type(pjsip_transport_type_e type) 
    125146{ 
     147    /* Sanity check.  
     148     * Check that transport_names[] are indexed on transport type.  
     149     */ 
     150    PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 
     151                     PJSIP_TRANSPORT_UDP, 0); 
     152 
     153    /* Check that argument is valid. */ 
    126154    PJ_ASSERT_RETURN(type < PJ_ARRAY_SIZE(transport_names), 5060); 
     155 
     156    /* Return the port. */ 
    127157    return transport_names[type].port; 
    128158} 
     
    225255 *****************************************************************************/ 
    226256 
    227 /* 
    228  * Transport key for indexing in the hash table. 
    229  */ 
    230 typedef struct transport_key 
    231 { 
    232     pj_uint8_t  type; 
    233     pj_uint8_t  zero; 
    234     pj_uint16_t port; 
    235     pj_uint32_t addr; 
    236 } transport_key; 
    237  
    238257 
    239258/***************************************************************************** 
     
    270289PJ_DEF(pj_status_t) pjsip_transport_send(  pjsip_transport *tr,  
    271290                                           pjsip_tx_data *tdata, 
    272                                            const pj_sockaddr_in *addr, 
     291                                           const pj_sockaddr *addr, 
     292                                           int addr_len, 
    273293                                           void *token, 
    274294                                           void (*cb)(void *token,  
     
    318338 
    319339    /* Send to transport. */ 
    320     status = (*tr->send_msg)(tr, tdata,  addr, (void*)tdata,  
     340    status = (*tr->send_msg)(tr, tdata,  addr, addr_len, (void*)tdata,  
    321341                             &transport_send_callback); 
    322342 
     
    396416                                              pjsip_transport *tp ) 
    397417{ 
    398     transport_key key; 
     418    int key_len; 
    399419 
    400420    /* Init. */ 
     
    407427     * Register to hash table. 
    408428     */ 
    409     key.type = (pj_uint8_t)tp->type; 
    410     key.zero = 0; 
    411     key.addr = pj_ntohl(tp->rem_addr.sin_addr.s_addr); 
    412     key.port = pj_ntohs(tp->rem_addr.sin_port); 
    413  
     429    key_len = sizeof(tp->key.type) + tp->addr_len; 
    414430    pj_lock_acquire(mgr->lock); 
    415     pj_hash_set(tp->pool, mgr->table, &key, sizeof(key), tp); 
     431    pj_hash_set(tp->pool, mgr->table, &tp->key, key_len, tp); 
    416432    pj_lock_release(mgr->lock); 
    417433 
     
    426442                                                pjsip_transport *tp) 
    427443{ 
    428     transport_key key; 
    429  
     444    int key_len; 
     445 
     446    /* Must have no user. */ 
    430447    PJ_ASSERT_RETURN(pj_atomic_get(tp->ref_cnt) == 0, PJSIP_EBUSY); 
    431448 
     
    445462     * Unregister from hash table. 
    446463     */ 
    447     key.type = (pj_uint8_t)tp->type; 
    448     key.zero = 0; 
    449     key.addr = pj_ntohl(tp->rem_addr.sin_addr.s_addr); 
    450     key.port = pj_ntohs(tp->rem_addr.sin_port); 
    451  
    452     pj_hash_set(tp->pool, mgr->table, &key, sizeof(key), NULL); 
     464    key_len = sizeof(tp->key.type) + tp->addr_len; 
     465    pj_hash_set(tp->pool, mgr->table, &tp->key, key_len, NULL); 
    453466 
    454467    pj_lock_release(mgr->lock); 
     
    602615{ 
    603616    pjsip_transport *tr = rdata->tp_info.transport; 
    604     pj_str_t s; 
    605617 
    606618    char *current_pkt; 
     
    683695         * MUST add received parameter to the via. 
    684696         */ 
    685         s = pj_str(pj_inet_ntoa(rdata->pkt_info.addr.sin_addr)); 
    686         if (pj_strcmp(&s, &rdata->msg_info.via->sent_by.host) != 0) { 
    687             pj_strdup(rdata->tp_info.pool,  
    688                       &rdata->msg_info.via->recvd_param, &s); 
     697        if (pj_strcmp2(&rdata->msg_info.via->sent_by.host,  
     698                       rdata->pkt_info.src_name) != 0)  
     699        { 
     700            pj_strdup2(rdata->tp_info.pool,  
     701                       &rdata->msg_info.via->recvd_param,  
     702                       rdata->pkt_info.src_name); 
    689703        } 
    690704 
     
    693707         */ 
    694708        if (rdata->msg_info.via->rport_param == 0) { 
    695             rdata->msg_info.via->rport_param =  
    696                 pj_ntohs(rdata->pkt_info.addr.sin_port); 
     709            rdata->msg_info.via->rport_param = rdata->pkt_info.src_port; 
    697710        } 
    698711 
     
    736749PJ_DEF(pj_status_t) pjsip_tpmgr_alloc_transport( pjsip_tpmgr *mgr, 
    737750                                                 pjsip_transport_type_e type, 
    738                                                  const pj_sockaddr_in *remote, 
     751                                                 const pj_sockaddr_t *remote, 
     752                                                 int addr_len, 
    739753                                                 pjsip_transport **p_transport) 
    740754{ 
    741     transport_key key; 
     755    struct transport_key 
     756    { 
     757        pjsip_transport_type_e  type; 
     758        pj_sockaddr             addr; 
     759    } key; 
     760    int key_len; 
    742761    pjsip_transport *transport; 
    743762    pjsip_tpfactory *factory; 
     
    746765    pj_lock_acquire(mgr->lock); 
    747766 
     767    key_len = sizeof(key.type) + addr_len; 
     768 
    748769    /* First try to get exact destination. */ 
    749     key.type = (pj_uint8_t)type; 
    750     key.zero = 0; 
    751     key.addr = pj_ntohl(remote->sin_addr.s_addr); 
    752     key.port = pj_ntohs(remote->sin_port); 
    753  
    754     transport = pj_hash_get(mgr->table, &key, sizeof(key)); 
    755     if (transport != NULL) { 
     770    key.type = type; 
     771    pj_memcpy(&key.addr, remote, addr_len); 
     772 
     773    transport = pj_hash_get(mgr->table, &key, key_len); 
     774    if (transport == NULL) { 
    756775        unsigned flag = pjsip_transport_get_flag_from_type(type); 
    757          
    758         /* For datagram transports, try lookup with zero address. */ 
    759         if (flag & PJSIP_TRANSPORT_DATAGRAM) { 
    760             key.addr = 0; 
    761             key.port = 0; 
    762  
    763             transport = pj_hash_get(mgr->table, &key, sizeof(key)); 
     776        const pj_sockaddr *remote_addr = (const pj_sockaddr*)remote; 
     777 
     778        /* For datagram transports, try lookup with zero address.  
     779         */ 
     780        if ( (flag & PJSIP_TRANSPORT_DATAGRAM) &&  
     781             (remote_addr->sa_family == PJ_AF_INET))  
     782        { 
     783            pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr; 
     784 
     785            pj_memset(addr, 0, sizeof(pj_sockaddr_in)); 
     786            addr->sin_family = PJ_AF_INET; 
     787            addr->sin_addr.s_addr = 0; 
     788            addr->sin_port = 0; 
     789 
     790            key_len = sizeof(key.type) + sizeof(pj_sockaddr_in); 
     791            transport = pj_hash_get(mgr->table, &key, key_len); 
    764792        } 
    765793    } 
     
    816844 
    817845        do { 
    818             char src_addr[128], dst_addr[128]; 
    819             int src_port, dst_port; 
    820             pjsip_transport *t; 
    821  
    822             t = pj_hash_this(mgr->table, itr); 
    823             pj_native_strcpy(src_addr, pj_inet_ntoa(t->local_addr.sin_addr)); 
    824             src_port = pj_ntohs(t->local_addr.sin_port); 
    825  
    826             pj_native_strcpy(dst_addr, pj_inet_ntoa(t->rem_addr.sin_addr)); 
    827             dst_port = pj_ntohs(t->rem_addr.sin_port); 
    828  
    829             PJ_LOG(3, (THIS_FILE, "  %s %s %s:%d --> %s:%d (refcnt=%d)",  
    830                        t->type_name, 
     846            pjsip_transport *t = pj_hash_this(mgr->table, itr); 
     847 
     848            PJ_LOG(3, (THIS_FILE, "  %s %s (refcnt=%d)",  
    831849                       t->obj_name, 
    832                        src_addr, src_port, 
    833                        dst_addr, dst_port, 
     850                       t->info, 
    834851                       pj_atomic_get(t->ref_cnt))); 
    835852 
Note: See TracChangeset for help on using the changeset viewer.