Ignore:
Timestamp:
Nov 11, 2005 7:01:31 PM (18 years ago)
Author:
bennylp
Message:

First clean compile of pjsip

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/main/pjsip/src/pjsip/sip_transport.c

    • Property svn:keywords set to Id
    r3 r43  
    11/* $Id$ 
    2  * 
    32 */ 
    43#include <pjsip/sip_transport.h> 
     
    76#include <pjsip/sip_msg.h> 
    87#include <pjsip/sip_private.h> 
     8#include <pjsip/sip_errno.h> 
    99#include <pj/os.h> 
    1010#include <pj/log.h> 
     
    1313#include <pj/string.h> 
    1414#include <pj/pool.h> 
     15#include <pj/assert.h> 
    1516 
    1617#define MGR_IDLE_CHECK_INTERVAL 30 
     
    4546     *  listener list.  
    4647     */ 
    47     PJ_DECL_LIST_MEMBER(struct pjsip_transport_t) 
     48    PJ_DECL_LIST_MEMBER(struct pjsip_transport_t); 
    4849 
    4950    /** Transport's pool. */ 
     
    6768    /** I/O Queue key */ 
    6869    pj_ioqueue_key_t    *key; 
     70 
     71    /** Accept key. */ 
     72    pj_ioqueue_op_key_t  accept_op; 
    6973 
    7074    /** Receive data buffer */ 
     
    116120    pj_ioqueue_t    *ioqueue; 
    117121    pj_time_val      next_idle_check; 
     122    pj_size_t        send_buf_size; 
     123    pj_size_t        recv_buf_size; 
    118124    void           (*message_callback)(pjsip_endpoint*, pjsip_rx_data *rdata); 
    119125}; 
     
    145151struct transport_callback 
    146152{ 
    147     PJ_DECL_LIST_MEMBER(struct transport_callback) 
     153    PJ_DECL_LIST_MEMBER(struct transport_callback); 
    148154 
    149155    /** User defined token to be passed to the callback. */ 
     
    174180}; 
    175181 
    176 static void on_ioqueue_read(pj_ioqueue_key_t *key, pj_ssize_t bytes_read); 
    177 static void on_ioqueue_write(pj_ioqueue_key_t *key, pj_ssize_t bytes_sent); 
    178 static void on_ioqueue_accept(pj_ioqueue_key_t *key, int status); 
    179 static void on_ioqueue_connect(pj_ioqueue_key_t *key, int status); 
     182static void on_ioqueue_read(pj_ioqueue_key_t *key,  
     183                            pj_ioqueue_op_key_t *op_key,  
     184                            pj_ssize_t bytes_read); 
     185static void on_ioqueue_write(pj_ioqueue_key_t *key,  
     186                             pj_ioqueue_op_key_t *op_key,  
     187                             pj_ssize_t bytes_sent); 
     188static void on_ioqueue_accept(pj_ioqueue_key_t *key,  
     189                              pj_ioqueue_op_key_t *op_key,  
     190                              pj_sock_t newsock, 
     191                              int status); 
     192static void on_ioqueue_connect(pj_ioqueue_key_t *key,  
     193                               int status); 
    180194 
    181195static pj_ioqueue_callback ioqueue_transport_callback =  
     
    195209    key->type = (pj_uint8_t)tr->type; 
    196210    key->zero = 0; 
    197     key->addr = pj_sockaddr_get_addr(&tr->remote_addr); 
    198     key->port = pj_sockaddr_get_port(&tr->remote_addr); 
     211    key->addr = pj_sockaddr_in_get_addr(&tr->remote_addr).s_addr; 
     212    key->port = pj_sockaddr_in_get_port(&tr->remote_addr); 
    199213    /* 
    200214    if (key->port == 0) { 
    201         key->port = pj_sockaddr_get_port(&tr->local_addr); 
     215        key->port = pj_sockaddr_in_get_port(&tr->local_addr); 
    202216    } 
    203217    */ 
     
    213227    key->type = (pj_uint8_t)type; 
    214228    key->zero = 0; 
    215     key->addr = pj_sockaddr_get_addr(addr); 
    216     key->port = pj_sockaddr_get_port(addr); 
     229    key->addr = pj_sockaddr_in_get_addr(addr).s_addr; 
     230    key->port = pj_sockaddr_in_get_port(addr); 
    217231} 
    218232#endif 
     
    221235                          const pj_sockaddr_in *addr) 
    222236{ 
    223     PJ_UNUSED_ARG(addr) 
     237    PJ_UNUSED_ARG(addr); 
    224238 
    225239    /* This is to detect alignment problems. */ 
     
    237251        pj_sockaddr_in addr; 
    238252        pj_sockaddr_set_str_addr(&addr, &localaddr); 
    239         key->addr = pj_sockaddr_get_addr(&addr); 
     253        key->addr = pj_sockaddr_in_get_addr(&addr); 
    240254    } 
    241255#endif 
     
    298312 * Create new transmit buffer. 
    299313 */ 
    300 pjsip_tx_data* pjsip_tx_data_create( pjsip_transport_mgr *mgr ) 
     314pj_status_t pjsip_tx_data_create( pjsip_transport_mgr *mgr, 
     315                                  pjsip_tx_data **p_tdata ) 
    301316{ 
    302317    pj_pool_t *pool; 
    303318    pjsip_tx_data *tdata; 
     319    pj_status_t status; 
    304320 
    305321    PJ_LOG(5, ("", "pjsip_tx_data_create")); 
     322 
     323    PJ_ASSERT_RETURN(mgr && p_tdata, PJ_EINVAL); 
    306324 
    307325    pool = pjsip_endpt_create_pool( mgr->endpt, "ptdt%p", 
     
    309327                                    PJSIP_POOL_INC_TDATA ); 
    310328    if (!pool) { 
    311         return NULL; 
     329        return PJ_ENOMEM; 
    312330    } 
    313331    tdata = pj_pool_calloc(pool, 1, sizeof(pjsip_tx_data)); 
    314332    tdata->pool = pool; 
    315333    tdata->mgr = mgr; 
    316     sprintf(tdata->obj_name,"txd%p", tdata); 
    317  
    318     tdata->ref_cnt = pj_atomic_create(tdata->pool, 0); 
    319     if (!tdata->ref_cnt) { 
     334    pj_sprintf(tdata->obj_name,"txd%p", tdata); 
     335 
     336    status = pj_atomic_create(tdata->pool, 0, &tdata->ref_cnt); 
     337    if (status != PJ_SUCCESS) { 
    320338        pjsip_endpt_destroy_pool( mgr->endpt, tdata->pool ); 
    321         return NULL; 
     339        return status; 
    322340    } 
    323341     
    324     return tdata; 
     342    *p_tdata = tdata; 
     343    return PJ_SUCCESS; 
    325344} 
    326345 
     
    340359{ 
    341360    pj_assert( pj_atomic_get(tdata->ref_cnt) > 0); 
    342     if (pj_atomic_dec(tdata->ref_cnt) <= 0) { 
     361    if (pj_atomic_dec_and_get(tdata->ref_cnt) <= 0) { 
    343362        PJ_LOG(6,(tdata->obj_name, "destroying txdata")); 
    344363        pj_atomic_destroy( tdata->ref_cnt ); 
     
    376395    } else  
    377396#else 
    378     PJ_UNUSED_ARG(flag) 
     397    PJ_UNUSED_ARG(flag); 
    379398#endif 
    380399    { 
     
    453472{ 
    454473    pj_assert(tr->ref_cnt > 0); 
    455     if (pj_atomic_dec(tr->ref_cnt) == 0) { 
     474    if (pj_atomic_dec_and_get(tr->ref_cnt) == 0) { 
    456475        pj_gettimeofday(&tr->close_time); 
    457476        tr->close_time.sec += PJSIP_TRANSPORT_CLOSE_TIMEOUT; 
     
    462481 * Open the underlying transport. 
    463482 */ 
    464 static pj_sock_t create_socket( pjsip_transport_type_e type, 
    465                                 pj_sockaddr_in *local ) 
     483static pj_status_t create_socket( pjsip_transport_type_e type, 
     484                                  pj_sockaddr_in *local, 
     485                                  pj_sock_t *p_sock) 
    466486{ 
    467487    int sock_family; 
     
    469489    int sock_proto; 
    470490    int len; 
     491    pj_status_t status; 
    471492    pj_sock_t sock; 
    472493 
     
    484505#endif 
    485506    } else { 
    486         PJ_LOG(2,("", "create_socket: unsupported transport type %s", 
    487                   get_type_name(type))); 
    488         return PJ_INVALID_SOCKET; 
     507        return PJ_EINVAL; 
    489508    } 
    490509 
    491510    /* Create socket. */ 
    492     sock = pj_sock_socket( sock_family, sock_type, sock_proto, PJ_SOCK_ASYNC); 
    493     if (sock == PJ_INVALID_SOCKET) { 
    494         PJ_PERROR((THIS_FILE, "%s socket()", get_type_name(type))); 
    495         return PJ_INVALID_SOCKET; 
    496     } 
     511    status = pj_sock_socket( sock_family, sock_type, sock_proto, &sock); 
     512    if (status != PJ_SUCCESS) 
     513        return status; 
    497514 
    498515    /* Bind the socket to the requested address, or if no address is 
     
    501518    if (/*local->sin_addr.s_addr != 0 &&*/ local->sin_port != 0) { 
    502519        /* Bind to the requested address. */ 
    503         if (pj_sock_bind(sock, local, sizeof(*local)) != 0) { 
    504             PJ_PERROR((THIS_FILE, "bind() to %s %s:%d", 
    505                                   get_type_name(type), 
    506                                   pj_sockaddr_get_str_addr(local), 
    507                                   pj_sockaddr_get_port(local))); 
     520        status = pj_sock_bind(sock, local, sizeof(*local)); 
     521        if (status != PJ_SUCCESS) { 
    508522            pj_sock_close(sock); 
    509             return PJ_INVALID_SOCKET; 
     523            return status; 
    510524        } 
    511525    } else if (type == PJSIP_TRANSPORT_UDP) { 
     
    517531        pj_memset(local, 0, sizeof(*local)); 
    518532        local->sin_family = PJ_AF_INET; 
    519         if (pj_sock_bind(sock, local, sizeof(*local)) != 0) { 
    520             PJ_PERROR((THIS_FILE, "bind() to %s 0.0.0.0:0", get_type_name(type))); 
     533        status = pj_sock_bind(sock, local, sizeof(*local)); 
     534        if (status != PJ_SUCCESS) { 
    521535            pj_sock_close(sock); 
    522             return PJ_INVALID_SOCKET; 
     536            return status; 
    523537        } 
    524538 
    525539        /* Get the local address. */ 
    526540        len = sizeof(pj_sockaddr_in); 
    527         if (pj_sock_getsockname(sock, local, &len)) { 
    528             PJ_PERROR((THIS_FILE, "getsockname()")); 
     541        status = pj_sock_getsockname(sock, local, &len); 
     542        if (status != PJ_SUCCESS) { 
    529543            pj_sock_close(sock); 
    530             return -1; 
    531         } 
    532     } 
    533  
    534     return sock; 
     544            return status; 
     545        } 
     546    } 
     547 
     548    *p_sock = sock; 
     549    return PJ_SUCCESS; 
    535550} 
    536551 
     
    548563 * Create a new transport object. 
    549564 */ 
    550 static pjsip_transport_t* create_transport( pjsip_transport_mgr *mgr, 
    551                                             pjsip_transport_type_e type, 
    552                                             pj_sock_t sock_hnd, 
    553                                             const pj_sockaddr_in *local_addr, 
    554                                             const pj_sockaddr_in *addr_name) 
     565static pj_status_t create_transport( pjsip_transport_mgr *mgr, 
     566                                     pjsip_transport_type_e type, 
     567                                     pj_sock_t sock_hnd, 
     568                                     const pj_sockaddr_in *local_addr, 
     569                                     const pj_sockaddr_in *addr_name, 
     570                                     pjsip_transport_t **p_transport ) 
    555571{ 
    556572    pj_pool_t *tr_pool=NULL, *rdata_pool=NULL; 
    557573    pjsip_transport_t *tr = NULL; 
     574    pj_status_t status; 
    558575 
    559576    /* Allocate pool for transport from endpoint. */ 
     
    563580                                       PJSIP_POOL_INC_TRANSPORT ); 
    564581    if (!tr_pool) { 
     582        status = PJ_ENOMEM; 
    565583        goto on_error; 
    566584    } 
     
    572590                                             PJSIP_POOL_INC_RDATA ); 
    573591    if (!rdata_pool) { 
     592        status = PJ_ENOMEM; 
    574593        goto on_error; 
    575594    } 
     
    583602    pj_memcpy(&tr->local_addr, local_addr, sizeof(pj_sockaddr_in)); 
    584603    pj_list_init(&tr->cb_list); 
    585     sprintf(tr->obj_name, transport_get_name_format(type), tr); 
     604    pj_sprintf(tr->obj_name, transport_get_name_format(type), tr); 
    586605 
    587606    if (type != PJSIP_TRANSPORT_UDP) { 
     
    596615 
    597616    /* Create atomic */ 
    598     tr->ref_cnt = pj_atomic_create(tr_pool, 0); 
    599     if (!tr->ref_cnt) { 
     617    status = pj_atomic_create(tr_pool, 0, &tr->ref_cnt); 
     618    if (status != PJ_SUCCESS) 
    600619        goto on_error; 
    601     } 
    602620     
    603621    /* Init rdata in the transport. */ 
     
    608626     
    609627    /* Init transport mutex. */ 
    610     tr->tr_mutex = pj_mutex_create(tr_pool, "mtr%p", 0); 
    611     if (!tr->tr_mutex) { 
    612         PJ_PERROR((tr->obj_name, "pj_mutex_create()")); 
     628    status = pj_mutex_create_recursive(tr_pool, "mtr%p", &tr->tr_mutex); 
     629    if (status != PJ_SUCCESS) 
    613630        goto on_error; 
    614     } 
    615631 
    616632    /* Register to I/O Queue */ 
    617     tr->key = pj_ioqueue_register(tr_pool, mgr->ioqueue,  
    618                                   (pj_oshandle_t)tr->sock, tr, 
    619                                   &ioqueue_transport_callback); 
    620     if (tr->key == NULL) { 
    621         PJ_PERROR((tr->obj_name, "pj_ioqueue_register()")); 
     633    status = pj_ioqueue_register_sock( tr_pool, mgr->ioqueue,  
     634                                       tr->sock, tr, 
     635                                       &ioqueue_transport_callback, 
     636                                       &tr->key); 
     637    if (status != PJ_SUCCESS) 
    622638        goto on_error; 
    623     } 
    624  
    625     return tr; 
     639 
     640    *p_transport = tr; 
     641    return PJ_SUCCESS; 
    626642 
    627643on_error: 
     
    635651        pjsip_endpt_destroy_pool(mgr->endpt, rdata_pool); 
    636652    } 
    637     return NULL; 
     653    return status; 
    638654} 
    639655 
     
    641657 * Destroy transport. 
    642658 */ 
    643 static void destroy_transport( pjsip_transport_mgr *mgr, pjsip_transport_t *tr ) 
     659static void destroy_transport( pjsip_transport_mgr *mgr, pjsip_transport_t *tr) 
    644660{ 
    645661    transport_key hash_key; 
    646662 
    647663    /* Remove from I/O queue. */ 
    648     pj_ioqueue_unregister( mgr->ioqueue, tr->key ); 
     664    pj_ioqueue_unregister( tr->key ); 
    649665 
    650666    /* Remove from hash table */ 
     
    669685 
    670686 
    671 static int transport_send_msg( pjsip_transport_t *tr, pjsip_tx_data *tdata, 
    672                                const pj_sockaddr_in *addr) 
     687static pj_status_t transport_send_msg( pjsip_transport_t *tr,  
     688                                       pjsip_tx_data *tdata, 
     689                                       const pj_sockaddr_in *addr,  
     690                                       pj_ssize_t *p_sent) 
    673691{ 
    674692    const char *buf = tdata->buf.start; 
    675     int sent; 
    676     int len; 
     693    pj_ssize_t size; 
     694    pj_status_t status; 
     695 
     696    /* Can only send if tdata is not being sent! */ 
     697    if (pj_ioqueue_is_pending(tr->key, &tdata->op_key)) 
     698        return PJSIP_EPENDINGTX; 
    677699 
    678700    /* Allocate buffer if necessary. */ 
     
    685707    /* Print the message if it's not printed */ 
    686708    if (tdata->buf.cur <= tdata->buf.start) { 
    687         len = pjsip_msg_print(tdata->msg, tdata->buf.start,  
    688                               tdata->buf.end - tdata->buf.start); 
    689         if (len < 1) { 
    690             return len; 
    691         } 
    692         tdata->buf.cur += len; 
    693         tdata->buf.cur[len] = '\0'; 
    694     } 
    695  
    696     /* BUG BUG BUG */ 
    697     /* MUST CHECK THAT THE SOCKET IS READY TO SEND (IOQueue)! */ 
    698     PJ_TODO(BUG_BUG_BUG___SENDING_DATAGRAM_WHILE_SOCKET_IS_PENDING__) 
     709        size = pjsip_msg_print( tdata->msg, tdata->buf.start,  
     710                                tdata->buf.end - tdata->buf.start); 
     711        if (size < 0) { 
     712            return PJSIP_EMSGTOOLONG; 
     713        } 
     714        pj_assert(size != 0); 
     715        tdata->buf.cur += size; 
     716        tdata->buf.cur[size] = '\0'; 
     717    } 
    699718 
    700719    /* Send the message. */ 
    701720    buf = tdata->buf.start; 
    702     len = tdata->buf.cur - tdata->buf.start; 
     721    size = tdata->buf.cur - tdata->buf.start; 
    703722 
    704723    if (tr->type == PJSIP_TRANSPORT_UDP) { 
     
    707726                  "%s" 
    708727                  "------------ end msg -------------", 
    709                   pj_sockaddr_get_str_addr(addr),  
    710                   pj_sockaddr_get_port(addr), 
    711                   len, buf)); 
    712  
    713         sent = pj_ioqueue_sendto( tr->mgr->ioqueue, tr->key, 
    714                                   buf, len, addr, sizeof(*addr)); 
     728                  pj_inet_ntoa(addr->sin_addr),  
     729                  pj_sockaddr_in_get_port(addr), 
     730                  size, buf)); 
     731 
     732        status = pj_ioqueue_sendto( tr->key, &tdata->op_key, 
     733                                    buf, &size, 0, addr, sizeof(*addr)); 
    715734    }  
    716735#if PJ_HAS_TCP 
     
    720739                  "%s" 
    721740                  "------------ end msg -------------", 
    722                   len, buf)); 
    723  
    724         sent = pj_ioqueue_write (tr->mgr->ioqueue, tr->key, buf, len); 
     741                  size, buf)); 
     742 
     743        status = pj_ioqueue_send(tr->key, &tdata->op_key, buf, &size, 0); 
    725744    } 
    726745#else 
    727746    else { 
    728         pj_assert(0); 
    729         sent = -1; 
     747        pj_assert(!"Unsupported transport"); 
     748        status = PJSIP_EUNSUPTRANSPORT; 
    730749    } 
    731750#endif 
    732751 
    733     if (sent == len || sent == PJ_IOQUEUE_PENDING) { 
    734         return len; 
    735     } 
    736  
    737     /* On error, clear the flag. */ 
    738     PJ_PERROR((tr->obj_name, tr->type == PJSIP_TRANSPORT_UDP ? "pj_ioqueue_sendto()" : "pj_ioqueue_write()")); 
    739     return -1; 
     752    *p_sent = size; 
     753    return status; 
    740754} 
    741755 
     
    744758 * in the outgoing data. 
    745759 */ 
    746 PJ_DEF(int) pjsip_transport_send_msg( pjsip_transport_t *tr,  
    747                                       pjsip_tx_data *tdata, 
    748                                       const pj_sockaddr_in *addr) 
    749 { 
    750     int sent; 
    751  
     760PJ_DEF(pj_status_t) pjsip_transport_send_msg( pjsip_transport_t *tr, 
     761                                              pjsip_tx_data *tdata, 
     762                                              const pj_sockaddr_in *addr, 
     763                                              pj_ssize_t *sent) 
     764{ 
    752765    PJ_LOG(5, (tr->obj_name, "pjsip_transport_send_msg(tdata=%s)", tdata->obj_name)); 
    753766 
    754     sent = transport_send_msg(tr, tdata, addr ); 
    755     return sent; 
     767    return transport_send_msg(tr, tdata, addr, sent ); 
    756768} 
    757769 
     
    761773 * Create a new transport manager. 
    762774 */ 
    763 PJ_DEF(pjsip_transport_mgr*)  
    764 pjsip_transport_mgr_create( pj_pool_t *pool, 
    765                             pjsip_endpoint * endpt, 
    766                             void (*cb)(pjsip_endpoint*,pjsip_rx_data *) ) 
     775PJ_DEF(pj_status_t) pjsip_transport_mgr_create( pj_pool_t *pool, 
     776                                                pjsip_endpoint * endpt, 
     777                                                void (*cb)(pjsip_endpoint*, 
     778                                                           pjsip_rx_data *), 
     779                                                pjsip_transport_mgr **p_mgr) 
    767780{ 
    768781    pjsip_transport_mgr *mgr; 
     782    pj_status_t status; 
    769783 
    770784    PJ_LOG(5, (LOG_TRANSPORT_MGR, "pjsip_transport_mgr_create()")); 
     
    773787    mgr->endpt = endpt; 
    774788    mgr->message_callback = cb; 
    775      
     789    mgr->send_buf_size = DEFAULT_SO_SNDBUF; 
     790    mgr->recv_buf_size = DEFAULT_SO_RCVBUF; 
     791 
    776792    mgr->transport_table = pj_hash_create(pool, MGR_HASH_TABLE_SIZE); 
    777793    if (!mgr->transport_table) { 
    778         PJ_LOG(3, (LOG_TRANSPORT_MGR, "error creating transport manager hash table")); 
    779         return NULL; 
    780     } 
    781     mgr->ioqueue = pj_ioqueue_create(pool, PJSIP_MAX_TRANSPORTS); 
    782     if (!mgr->ioqueue) { 
    783         PJ_LOG(3, (LOG_TRANSPORT_MGR, "error creating IO queue")); 
    784         return NULL; 
    785     } 
    786     mgr->mutex = pj_mutex_create(pool, "tmgr%p", 0); 
    787     if (!mgr->mutex) { 
    788         PJ_LOG(3, (LOG_TRANSPORT_MGR, "error creating mutex")); 
     794        return PJ_ENOMEM; 
     795    } 
     796    status = pj_ioqueue_create(pool, PJSIP_MAX_TRANSPORTS, &mgr->ioqueue); 
     797    if (status != PJ_SUCCESS) { 
     798        return status; 
     799    } 
     800    status = pj_mutex_create_recursive(pool, "tmgr%p", &mgr->mutex); 
     801    if (status != PJ_SUCCESS) { 
    789802        pj_ioqueue_destroy(mgr->ioqueue); 
    790         return NULL; 
     803        return status; 
    791804    } 
    792805    pj_gettimeofday(&mgr->next_idle_check); 
    793806    mgr->next_idle_check.sec += MGR_IDLE_CHECK_INTERVAL; 
    794     return mgr; 
     807 
     808    *p_mgr = mgr; 
     809    return status; 
    795810} 
    796811 
     
    798813 * Destroy transport manager. 
    799814 */ 
    800 PJ_DEF(void) pjsip_transport_mgr_destroy( pjsip_transport_mgr *mgr ) 
     815PJ_DEF(pj_status_t) pjsip_transport_mgr_destroy( pjsip_transport_mgr *mgr ) 
    801816{ 
    802817    pj_hash_iterator_t itr_val; 
     
    824839 
    825840    pj_mutex_unlock(mgr->mutex); 
     841 
     842    return PJ_SUCCESS; 
    826843} 
    827844 
     
    837854    pjsip_transport_t *tr; 
    838855    struct transport_key *hash_key; 
    839     int opt_val; 
    840  
    841     opt_val = DEFAULT_SO_SNDBUF; 
    842     if (pj_sock_setsockopt( sock_hnd, SOL_SOCKET, SO_SNDBUF, &opt_val, sizeof(opt_val)) != PJ_SUCCESS) { 
    843         PJ_LOG(3, (LOG_TRANSPORT_MGR, "create listener: error setting SNDBUF to %d", DEFAULT_SO_SNDBUF)); 
    844         // Just ignore the error. 
    845     } 
    846  
    847     opt_val = DEFAULT_SO_RCVBUF; 
    848     if (pj_sock_setsockopt( sock_hnd, SOL_SOCKET, SO_RCVBUF, &opt_val, sizeof(opt_val)) != PJ_SUCCESS) { 
    849         PJ_LOG(3, (LOG_TRANSPORT_MGR, "create listener: error setting RCVBUF to %d", DEFAULT_SO_SNDBUF)); 
    850         // Just ignore the error 
    851     } 
    852  
    853     tr = create_transport(mgr, type, sock_hnd, local_addr, addr_name); 
    854     if (!tr) { 
     856    const pj_str_t loopback_addr = { "127.0.0.1", 9 }; 
     857    pj_status_t status; 
     858 
     859    if (mgr->send_buf_size != 0) { 
     860        int opt_val = mgr->send_buf_size; 
     861        status = pj_sock_setsockopt( sock_hnd, PJ_SOL_SOCKET,  
     862                                     PJ_SO_SNDBUF,  
     863                                     &opt_val, sizeof(opt_val)); 
     864 
     865        if (status != PJ_SUCCESS) { 
     866            return status; 
     867        } 
     868    } 
     869 
     870    if (mgr->recv_buf_size != 0) { 
     871        int opt_val = mgr->recv_buf_size; 
     872        status = pj_sock_setsockopt( sock_hnd, PJ_SOL_SOCKET,  
     873                                     PJ_SO_RCVBUF,  
     874                                     &opt_val, sizeof(opt_val)); 
     875        if (status != PJ_SUCCESS) { 
     876            return status; 
     877        } 
     878    } 
     879 
     880    status = create_transport(mgr, type, sock_hnd, local_addr, addr_name, &tr); 
     881    if (status != PJ_SUCCESS) { 
    855882        pj_sock_close(sock_hnd); 
    856         return -1; 
     883        return status; 
    857884    } 
    858885#if PJ_HAS_TCP 
    859886    if (type == PJSIP_TRANSPORT_TCP) { 
    860         pj_status_t status; 
    861  
    862         if (pj_sock_listen(tr->sock, BACKLOG) != 0) { 
    863             PJ_PERROR((tr->obj_name, "listen()")); 
     887 
     888        status = pj_sock_listen(tr->sock, BACKLOG); 
     889        if (status != 0) { 
    864890            destroy_transport(mgr, tr); 
    865             return -1; 
    866         } 
    867         tr->accept_data.addrlen = sizeof(tr->accept_data.local); 
    868         status = pj_ioqueue_accept(mgr->ioqueue, tr->key,  
    869                                    &tr->accept_data.sock,  
    870                                    &tr->accept_data.local,  
    871                                    &tr->accept_data.remote, 
    872                                    &tr->accept_data.addrlen); 
    873         if (status != PJ_IOQUEUE_PENDING) { 
    874             PJ_PERROR((tr->obj_name, "pj_ioqueue_accept()")); 
    875             destroy_transport(mgr, tr); 
    876             return -1; 
    877         } 
     891            return status; 
     892        } 
     893         
     894        /* Discard immediate connections. */ 
     895        do { 
     896            tr->accept_data.addrlen = sizeof(tr->accept_data.local); 
     897            status = pj_ioqueue_accept(tr->key, &tr->accept_op, 
     898                                       &tr->accept_data.sock,  
     899                                       &tr->accept_data.local,  
     900                                       &tr->accept_data.remote, 
     901                                       &tr->accept_data.addrlen); 
     902            if (status==PJ_SUCCESS) { 
     903                pj_sock_close(tr->accept_data.sock); 
     904            } else if (status != PJ_EPENDING) { 
     905                destroy_transport(mgr, tr); 
     906                return status; 
     907            } 
     908        } while (status==PJ_SUCCESS); 
    878909 
    879910    } else  
    880911#endif 
    881912    if (type == PJSIP_TRANSPORT_UDP) { 
    882         pj_status_t status; 
    883  
    884         tr->rdata->addr_len = sizeof(tr->rdata->addr); 
    885         status = pj_ioqueue_recvfrom( mgr->ioqueue, tr->key,  
    886                                       tr->rdata->packet, PJSIP_MAX_PKT_LEN, 
    887                                       &tr->rdata->addr,  
    888                                       &tr->rdata->addr_len); 
    889         if (status != PJ_IOQUEUE_PENDING) { 
    890             PJ_PERROR((tr->obj_name, "pj_ioqueue_recvfrom()")); 
    891             destroy_transport(mgr, tr); 
    892             return -1; 
    893         } 
     913        pj_ssize_t bytes; 
     914 
     915        /* Discard immediate data. */ 
     916        do { 
     917            tr->rdata->addr_len = sizeof(tr->rdata->addr); 
     918            bytes = PJSIP_MAX_PKT_LEN; 
     919            status = pj_ioqueue_recvfrom( tr->key, &tr->rdata->op_key, 
     920                                          tr->rdata->packet, &bytes, 0, 
     921                                          &tr->rdata->addr,  
     922                                          &tr->rdata->addr_len); 
     923            if (status == PJ_SUCCESS) { 
     924                ; 
     925            } else if (status != PJ_EPENDING) { 
     926                destroy_transport(mgr, tr); 
     927                return status; 
     928            } 
     929        } while (status == PJ_SUCCESS); 
    894930    } 
    895931 
     
    902938     * See further comments on struct pjsip_transport_t definition. 
    903939     */ 
    904     if (type == PJSIP_TRANSPORT_UDP && local_addr->sin_addr.s_addr == inet_addr("127.0.0.1")) { 
     940    if (type == PJSIP_TRANSPORT_UDP &&  
     941        local_addr->sin_addr.s_addr == pj_inet_addr(&loopback_addr).s_addr) 
     942    { 
    905943        pj_str_t localaddr = pj_str("127.0.0.1"); 
    906         pj_sockaddr_set_str_addr( &tr->remote_addr, &localaddr); 
     944        pj_sockaddr_in_set_str_addr( &tr->remote_addr, &localaddr); 
    907945    } 
    908946    hash_key = pj_pool_alloc(tr->pool, sizeof(transport_key)); 
     
    910948 
    911949    pj_mutex_lock(mgr->mutex); 
    912     pj_hash_set(tr->pool, mgr->transport_table, hash_key, sizeof(transport_key), tr); 
     950    pj_hash_set(tr->pool, mgr->transport_table,  
     951                hash_key, sizeof(transport_key), tr); 
    913952    pj_mutex_unlock(mgr->mutex); 
    914953 
    915954    PJ_LOG(4,(tr->obj_name, "Listening at %s %s:%d",  
    916955                         get_type_name(tr->type),  
    917                          pj_sockaddr_get_str_addr(&tr->local_addr), 
    918                          pj_sockaddr_get_port(&tr->local_addr))); 
     956                         pj_inet_ntoa(tr->local_addr.sin_addr), 
     957                         pj_sockaddr_in_get_port(&tr->local_addr))); 
    919958    PJ_LOG(4,(tr->obj_name, "Listener public address is at %s %s:%d",  
    920959                         get_type_name(tr->type),  
    921                          pj_sockaddr_get_str_addr(&tr->addr_name), 
    922                          pj_sockaddr_get_port(&tr->addr_name))); 
     960                         pj_inet_ntoa(tr->addr_name.sin_addr), 
     961                         pj_sockaddr_in_get_port(&tr->addr_name))); 
    923962    return PJ_SUCCESS; 
    924963} 
     
    933972{ 
    934973    pj_sock_t sock_hnd; 
     974    pj_status_t status; 
    935975 
    936976    PJ_LOG(5, (LOG_TRANSPORT_MGR, "pjsip_create_listener(type=%d)", type)); 
    937977 
    938     sock_hnd = create_socket(type, local_addr); 
    939     if (sock_hnd == PJ_INVALID_SOCKET) { 
    940         return -1; 
     978    status = create_socket(type, local_addr, &sock_hnd); 
     979    if (status != PJ_SUCCESS) { 
     980        return status; 
    941981    } 
    942982 
     
    952992{ 
    953993    pj_sockaddr_in local_addr; 
     994    pj_status_t status; 
    954995    int addrlen = sizeof(local_addr); 
    955996 
    956     if (pj_sock_getsockname(sock, (pj_sockaddr_t*)&local_addr, &addrlen) != 0) 
    957         return -1; 
    958  
    959     return create_listener(mgr, PJSIP_TRANSPORT_UDP, sock, &local_addr, addr_name); 
     997    status = pj_sock_getsockname(sock, (pj_sockaddr_t*)&local_addr, &addrlen); 
     998    if (status != PJ_SUCCESS) 
     999        return status; 
     1000 
     1001    return create_listener(mgr, PJSIP_TRANSPORT_UDP, sock,  
     1002                           &local_addr, addr_name); 
    9601003} 
    9611004 
     
    9741017    pjsip_transport_t *tr; 
    9751018    pj_sockaddr_in local; 
    976     int sock_hnd; 
     1019    pj_sock_t sock_hnd; 
    9771020    pj_status_t status; 
    9781021    struct transport_callback *cb_rec; 
     
    10301073    pj_memset(&local, 0, sizeof(local)); 
    10311074    local.sin_family = PJ_AF_INET; 
    1032     sock_hnd = create_socket(type, &local); 
    1033     if (sock_hnd == PJ_INVALID_SOCKET) { 
     1075    status = create_socket(type, &local, &sock_hnd); 
     1076    if (status != PJ_SUCCESS) { 
    10341077        pj_mutex_unlock(mgr->mutex); 
    1035         (*cb_rec->cb)(NULL, cb_rec->token, -1); 
     1078        (*cb_rec->cb)(NULL, cb_rec->token, status); 
    10361079        return; 
    10371080    } 
    1038     tr = create_transport(mgr, type, sock_hnd, &local, NULL); 
    1039     if (!tr) { 
     1081    status = create_transport(mgr, type, sock_hnd, &local, NULL, &tr); 
     1082    if (status != PJ_SUCCESS) { 
    10401083        pj_mutex_unlock(mgr->mutex); 
    1041         (*cb_rec->cb)(NULL, cb_rec->token, -1); 
     1084        (*cb_rec->cb)(NULL, cb_rec->token, status); 
    10421085        return; 
    10431086    } 
     
    10461089    if (type == PJSIP_TRANSPORT_TCP) { 
    10471090        pj_memcpy(&tr->remote_addr, remote, sizeof(pj_sockaddr_in)); 
    1048         status = pj_ioqueue_connect(mgr->ioqueue, tr->key,  
    1049                                     &tr->remote_addr, sizeof(pj_sockaddr_in)); 
     1091        status = pj_ioqueue_connect(tr->key, &tr->remote_addr,  
     1092                                    sizeof(pj_sockaddr_in)); 
    10501093        pj_assert(status != 0); 
    1051         if (status != PJ_IOQUEUE_PENDING) { 
    1052             PJ_PERROR((tr->obj_name, "pj_ioqueue_connect()")); 
     1094        if (status != PJ_EPENDING) { 
     1095            PJ_TODO(HANDLE_IMMEDIATE_CONNECT); 
    10531096            destroy_transport(mgr, tr); 
    10541097            pj_mutex_unlock(mgr->mutex); 
    1055             (*cb_rec->cb)(NULL, cb_rec->token, -1); 
     1098            (*cb_rec->cb)(NULL, cb_rec->token, status); 
    10561099            return; 
    10571100        } 
     
    10591102#endif 
    10601103    if (type == PJSIP_TRANSPORT_UDP) { 
    1061         int len; 
     1104        pj_ssize_t size; 
    10621105 
    10631106        do { 
    10641107            tr->rdata->addr_len = sizeof(tr->rdata->addr); 
    1065             len = pj_ioqueue_recvfrom( mgr->ioqueue, tr->key,  
    1066                                        tr->rdata->packet, PJSIP_MAX_PKT_LEN, 
    1067                                        &tr->rdata->addr,  
    1068                                        &tr->rdata->addr_len); 
    1069             pj_assert(len < 0); 
    1070             if (len != PJ_IOQUEUE_PENDING) { 
    1071                 PJ_PERROR((tr->obj_name, "pj_ioqueue_recvfrom()")); 
     1108            size = PJSIP_MAX_PKT_LEN; 
     1109            status = pj_ioqueue_recvfrom( tr->key, &tr->rdata->op_key, 
     1110                                          tr->rdata->packet, &size, 0, 
     1111                                          &tr->rdata->addr,  
     1112                                          &tr->rdata->addr_len); 
     1113            if (status == PJ_SUCCESS) 
     1114                ; 
     1115            else if (status != PJ_EPENDING) { 
    10721116                destroy_transport(mgr, tr); 
    10731117                pj_mutex_unlock(mgr->mutex); 
    1074                 (*cb_rec->cb)(NULL, cb_rec->token, -1); 
     1118                (*cb_rec->cb)(NULL, cb_rec->token, status); 
    10751119                return; 
    10761120            } 
     
    10831127            PJ_TODO(FIXED_BUG_ON_IMMEDIATE_TRANSPORT_DATA); 
    10841128 
    1085         } while (len != PJ_IOQUEUE_PENDING); 
     1129        } while (status == PJ_SUCCESS); 
    10861130 
    10871131        //Bug: cb will never be called! 
     
    10931137    } else { 
    10941138        pj_mutex_unlock(mgr->mutex); 
    1095         (*cb_rec->cb)(NULL, cb_rec->token, -1); 
     1139        (*cb_rec->cb)(NULL, cb_rec->token, PJSIP_EUNSUPTRANSPORT); 
    10961140        return; 
    10971141    } 
    10981142 
    1099     pj_assert(status==PJ_IOQUEUE_PENDING || status==PJ_SUCCESS); 
     1143    pj_assert(status==PJ_EPENDING || status==PJ_SUCCESS); 
    11001144    pj_mutex_lock(tr->tr_mutex); 
    11011145    hash_key = pj_pool_alloc(tr->pool, sizeof(transport_key)); 
    11021146    pj_memcpy(hash_key, &search_key, sizeof(transport_key)); 
    1103     pj_hash_set(tr->pool, mgr->transport_table, hash_key, sizeof(transport_key), tr); 
     1147    pj_hash_set(tr->pool, mgr->transport_table,  
     1148                hash_key, sizeof(transport_key), tr); 
    11041149    if (status == PJ_SUCCESS) { 
    11051150        pj_mutex_unlock(tr->tr_mutex); 
     
    11251170    pjsip_transport_t *tr; 
    11261171    transport_key *hash_key; 
     1172    pj_ssize_t size; 
    11271173 
    11281174    pj_assert (listener->type == PJSIP_TRANSPORT_TCP); 
    11291175 
    11301176    if (status != PJ_SUCCESS) { 
    1131         PJ_PERROR((listener->obj_name, "accept() returned error")); 
    1132         return; 
     1177        PJSIP_ENDPT_LOG_ERROR((mgr->endpt, listener->obj_name, status, 
     1178                               "Error in accept() completion")); 
     1179        goto on_return; 
    11331180    } 
    11341181 
    11351182    PJ_LOG(4,(listener->obj_name, "incoming tcp connection from %s:%d", 
    1136               pj_sockaddr_get_str_addr(&listener->accept_data.remote), 
    1137               pj_sockaddr_get_port(&listener->accept_data.remote))); 
    1138  
    1139     tr = create_transport(mgr, listener->type,  
    1140                           listener->accept_data.sock, 
    1141                           &listener->accept_data.local, 
    1142                           NULL); 
    1143     if (!tr) { 
     1183              pj_inet_ntoa(listener->accept_data.remote.sin_addr), 
     1184              pj_sockaddr_in_get_port(&listener->accept_data.remote))); 
     1185 
     1186    status = create_transport(mgr, listener->type,  
     1187                              listener->accept_data.sock, 
     1188                              &listener->accept_data.local, 
     1189                              NULL, &tr); 
     1190    if (status != PJ_SUCCESS) { 
     1191        PJSIP_ENDPT_LOG_ERROR((mgr->endpt, listener->obj_name, status, 
     1192                               "Error in creating new incoming TCP")); 
    11441193        goto on_return; 
    11451194    } 
     
    11551204    tr->rdata->addr_len = listener->accept_data.addrlen; 
    11561205 
    1157     status = pj_ioqueue_read (mgr->ioqueue, tr->key, tr->rdata->packet, PJSIP_MAX_PKT_LEN); 
    1158     if (status != PJ_IOQUEUE_PENDING) { 
    1159         PJ_PERROR((tr->obj_name, "pj_ioqueue_read()")); 
     1206    size = PJSIP_MAX_PKT_LEN; 
     1207    status = pj_ioqueue_recv(tr->key, &tr->rdata->op_key,  
     1208                             tr->rdata->packet, &size, 0); 
     1209    if (status != PJ_EPENDING) { 
     1210        PJSIP_ENDPT_LOG_ERROR((mgr->endpt, listener->obj_name, status, 
     1211                               "Error in receiving data")); 
     1212        PJ_TODO(IMMEDIATE_DATA); 
    11601213        destroy_transport(mgr, tr); 
    11611214        goto on_return; 
    11621215    } 
    11631216 
    1164     pj_memcpy(&tr->remote_addr, &listener->accept_data.remote, listener->accept_data.addrlen); 
     1217    pj_memcpy(&tr->remote_addr, &listener->accept_data.remote,  
     1218              listener->accept_data.addrlen); 
    11651219    hash_key = pj_pool_alloc(tr->pool, sizeof(transport_key)); 
    11661220    init_key_from_transport(hash_key, tr); 
    11671221 
    11681222    pj_mutex_lock(mgr->mutex); 
    1169     pj_hash_set(tr->pool, mgr->transport_table, hash_key, sizeof(transport_key), tr); 
     1223    pj_hash_set(tr->pool, mgr->transport_table, hash_key,  
     1224                sizeof(transport_key), tr); 
    11701225    pj_mutex_unlock(mgr->mutex); 
    11711226 
     
    11731228    /* Re-initiate asynchronous accept() */ 
    11741229    listener->accept_data.addrlen = sizeof(listener->accept_data.local); 
    1175     status = pj_ioqueue_accept(mgr->ioqueue, listener->key,  
     1230    status = pj_ioqueue_accept(listener->key, &listener->accept_op, 
    11761231                               &listener->accept_data.sock,  
    11771232                               &listener->accept_data.local,  
    11781233                               &listener->accept_data.remote, 
    11791234                               &listener->accept_data.addrlen); 
    1180     if (status != PJ_IOQUEUE_PENDING) { 
    1181         PJ_PERROR((listener->obj_name, "pj_ioqueue_accept()")); 
     1235    if (status != PJ_EPENDING) { 
     1236        PJSIP_ENDPT_LOG_ERROR((mgr->endpt, listener->obj_name, status, 
     1237                               "Error in receiving data")); 
     1238        PJ_TODO(IMMEDIATE_ACCEPT); 
    11821239        return; 
    11831240    } 
     
    11941251    struct transport_callback new_list; 
    11951252    struct transport_callback *cb_rec; 
    1196  
    1197     PJ_UNUSED_ARG(mgr) 
     1253    pj_ssize_t recv_size; 
     1254 
     1255    PJ_UNUSED_ARG(mgr); 
    11981256 
    11991257    /* On connect completion, we must call all registered callbacks in 
     
    12221280    if (status == PJ_SUCCESS) { 
    12231281        int addrlen = sizeof(tr->local_addr); 
    1224         int rc; 
    1225         if ((rc=pj_sock_getsockname(tr->sock, (pj_sockaddr_t*)&tr->local_addr, &addrlen)) == 0) { 
     1282         
     1283        status = pj_sock_getsockname(tr->sock,  
     1284                                     (pj_sockaddr_t*)&tr->local_addr,  
     1285                                     &addrlen); 
     1286        if (status == PJ_SUCCESS) { 
    12261287            pj_memcpy(&tr->addr_name, &tr->local_addr, sizeof(tr->addr_name)); 
    1227         } else { 
    1228             PJ_LOG(4,(tr->obj_name, "Unable to get local address (getsockname=%d)", rc)); 
    12291288        } 
    12301289    } 
     
    12451304    if (status != PJ_SUCCESS) { 
    12461305        destroy_transport(mgr, tr); 
     1306        PJ_TODO(WTF); 
    12471307        return; 
    12481308    } 
    12491309 
    12501310    /* Initiate read operation to socket. */ 
    1251     status = pj_ioqueue_read (mgr->ioqueue, tr->key, tr->rdata->packet, PJSIP_MAX_PKT_LEN); 
    1252     if (status != PJ_IOQUEUE_PENDING) { 
    1253         PJ_PERROR((tr->obj_name, "pj_ioqueue_read()")); 
     1311    recv_size = PJSIP_MAX_PKT_LEN; 
     1312    status = pj_ioqueue_recv( tr->key, &tr->rdata->op_key, tr->rdata->packet,  
     1313                              &recv_size, 0); 
     1314    if (status != PJ_EPENDING) { 
    12541315        destroy_transport(mgr, tr); 
     1316        PJ_TODO(IMMEDIATE_DATA); 
    12551317        return; 
    12561318    } 
     
    12701332{ 
    12711333    pjsip_msg *msg; 
    1272     pjsip_cid_hdr *call_id; 
    12731334    pjsip_rx_data *rdata = tr->rdata; 
    12741335    pj_pool_t *rdata_pool; 
     
    13161377 
    13171378    /* Get source address and port for logging purpose. */ 
    1318     src_addr = pj_sockaddr_get_str_addr(&rdata->addr); 
    1319     src_port = pj_sockaddr_get_port(&rdata->addr); 
     1379    src_addr = pj_inet_ntoa(rdata->addr.sin_addr); 
     1380    src_port = pj_sockaddr_in_get_port(&rdata->addr); 
    13201381 
    13211382    /* Print the whole data to the log. */ 
     
    13341395        /* For TCP transport, check if the whole message has been received. */ 
    13351396        if (tr->type != PJSIP_TRANSPORT_UDP) { 
    1336             pj_bool_t is_complete; 
    1337             is_complete = pjsip_find_msg(rdata->packet, rdata->len, PJ_FALSE, &msg_fragment_size); 
    1338             if (!is_complete) { 
     1397            pj_status_t msg_status; 
     1398            msg_status = pjsip_find_msg(rdata->packet, rdata->len, PJ_FALSE,  
     1399                                        &msg_fragment_size); 
     1400            if (msg_status != PJ_SUCCESS) { 
    13391401                if (rdata->len == PJSIP_MAX_PKT_LEN) { 
    1340                     PJ_LOG(1,(tr->obj_name,  
    1341                               "Transport buffer full (%d bytes) for TCP socket %s:%d " 
    1342                               "(probably too many invalid fragments received). " 
    1343                               "Buffer will be discarded.", 
    1344                               PJSIP_MAX_PKT_LEN, src_addr, src_port)); 
     1402                    PJSIP_ENDPT_LOG_ERROR((mgr->endpt, tr->obj_name,  
     1403                                           PJSIP_EOVERFLOW, 
     1404                                           "Buffer discarded for %s:%d", 
     1405                                           src_addr, src_port)); 
    13451406                    goto on_return; 
    13461407                } else { 
     
    13581419                src_addr, src_port)); 
    13591420 
    1360         msg = pjsip_parse_msg( rdata->pool, rdata->packet, msg_fragment_size,  
    1361                                &rdata->parse_err); 
     1421        msg = pjsip_parse_rdata( rdata->packet, msg_fragment_size, rdata); 
    13621422        if (msg == NULL) { 
    13631423            PJ_LOG(3,(tr->obj_name, "Bad message (%d bytes from %s:%d)", msg_fragment_size, 
     
    13661426        } 
    13671427 
    1368         /* Attach newly created message to rdata. */ 
    1369         rdata->msg = msg; 
    1370  
    1371         /* Extract Call-ID, From and To header and tags, topmost Via, and CSeq 
    1372         * header from the message. 
    1373         */ 
    1374         call_id = pjsip_msg_find_hdr( msg, PJSIP_H_CALL_ID, NULL); 
    1375         rdata->from = pjsip_msg_find_hdr( msg, PJSIP_H_FROM, NULL); 
    1376         rdata->to = pjsip_msg_find_hdr( msg, PJSIP_H_TO, NULL); 
    1377         rdata->via = pjsip_msg_find_hdr( msg, PJSIP_H_VIA, NULL); 
    1378         rdata->cseq = pjsip_msg_find_hdr( msg, PJSIP_H_CSEQ, NULL); 
    1379  
    1380         if (call_id == NULL || rdata->from == NULL || rdata->to == NULL || 
    1381             rdata->via == NULL || rdata->cseq == NULL)  
     1428        /* Perform basic header checking. */ 
     1429        if (rdata->call_id.ptr == NULL || rdata->from == NULL ||  
     1430            rdata->to == NULL || rdata->via == NULL || rdata->cseq == NULL)  
    13821431        { 
    13831432            PJ_LOG(3,(tr->obj_name, "Bad message from %s:%d: missing some header",  
     
    13851434            goto finish_process_fragment; 
    13861435        } 
    1387         rdata->call_id = call_id->id; 
    1388         rdata->from_tag = rdata->from->tag; 
    1389         rdata->to_tag = rdata->to->tag; 
    13901436 
    13911437        /* If message is received from address that's different from the sent-by, 
     
    14021448         */ 
    14031449        if (rdata->via->rport_param == 0) { 
    1404             rdata->via->rport_param = pj_sockaddr_get_port(&rdata->addr); 
     1450            rdata->via->rport_param = pj_sockaddr_in_get_port(&rdata->addr); 
    14051451        } 
    14061452 
     
    14091455        if (msg->type == PJSIP_RESPONSE_MSG) { 
    14101456            hdr = (pjsip_hdr*)rdata->via->next; 
    1411             if (hdr) { 
     1457            if (hdr != &rdata->msg->hdr) { 
    14121458                hdr = pjsip_msg_find_hdr(msg, PJSIP_H_VIA, hdr); 
    14131459                if (hdr) { 
     
    14461492    rdata->addr_len = sizeof(rdata->addr); 
    14471493    if (tr->type == PJSIP_TRANSPORT_UDP) { 
    1448         pj_ioqueue_recvfrom( tr->mgr->ioqueue, tr->key, 
    1449                             tr->rdata->packet, PJSIP_MAX_PKT_LEN, 
     1494        pj_ssize_t size = PJSIP_MAX_PKT_LEN; 
     1495        pj_ioqueue_recvfrom(tr->key, &tr->rdata->op_key, 
     1496                            tr->rdata->packet, &size, 0,  
    14501497                            &rdata->addr, &rdata->addr_len); 
     1498        PJ_TODO(HANDLE_IMMEDIATE_DATA); 
    14511499    } 
    14521500 
     
    14571505tcp_read_packet: 
    14581506    if (tr->type == PJSIP_TRANSPORT_TCP) { 
    1459         pj_ioqueue_read( tr->mgr->ioqueue, tr->key,  
     1507        pj_ssize_t size = PJSIP_MAX_PKT_LEN - tr->rdata->len; 
     1508        pj_ioqueue_recv( tr->key, &tr->rdata->op_key, 
    14601509                         tr->rdata->packet + tr->rdata->len, 
    1461                          PJSIP_MAX_PKT_LEN - tr->rdata->len); 
     1510                         &size, 0); 
     1511        PJ_TODO(HANDLE_IMMEDIATE_DATA_1); 
    14621512    } 
    14631513#endif 
     
    15081558} 
    15091559 
    1510 static void on_ioqueue_read(pj_ioqueue_key_t *key, pj_ssize_t bytes_read) 
     1560static void on_ioqueue_read(pj_ioqueue_key_t *key,  
     1561                            pj_ioqueue_op_key_t *op_key,  
     1562                            pj_ssize_t bytes_read) 
    15111563{ 
    15121564    pjsip_transport_t *t; 
     
    15161568} 
    15171569 
    1518 static void on_ioqueue_write(pj_ioqueue_key_t *key, pj_ssize_t bytes_sent) 
    1519 { 
    1520     PJ_UNUSED_ARG(key) 
    1521     PJ_UNUSED_ARG(bytes_sent) 
     1570static void on_ioqueue_write(pj_ioqueue_key_t *key,  
     1571                             pj_ioqueue_op_key_t *op_key,  
     1572                             pj_ssize_t bytes_sent) 
     1573{ 
     1574    PJ_UNUSED_ARG(key); 
     1575    PJ_UNUSED_ARG(bytes_sent); 
    15221576 
    15231577    /* Completion of write operation.  
     
    15261580} 
    15271581 
    1528 static void on_ioqueue_accept(pj_ioqueue_key_t *key, int status) 
     1582static void on_ioqueue_accept(pj_ioqueue_key_t *key,  
     1583                              pj_ioqueue_op_key_t *op_key,  
     1584                              pj_sock_t newsock, 
     1585                              int status) 
    15291586{ 
    15301587#if PJ_HAS_TCP 
     
    15341591    handle_new_connection( t->mgr, t, status ); 
    15351592#else 
    1536     PJ_UNUSED_ARG(key) 
    1537     PJ_UNUSED_ARG(status) 
     1593    PJ_UNUSED_ARG(key); 
     1594    PJ_UNUSED_ARG(status); 
    15381595#endif 
    15391596} 
     
    15471604    handle_connect_completion( t->mgr, t, status); 
    15481605#else 
    1549     PJ_UNUSED_ARG(key) 
    1550     PJ_UNUSED_ARG(status) 
     1606    PJ_UNUSED_ARG(key); 
     1607    PJ_UNUSED_ARG(status); 
    15511608#endif 
    15521609} 
Note: See TracChangeset for help on using the changeset viewer.