Changeset 600


Ignore:
Timestamp:
Jul 10, 2006 9:37:53 PM (18 years ago)
Author:
bennylp
Message:

Fixed several bugs with TCP transport: (1) Handle crash in transaction, possibly because of transport error, (2) TCP accept() does not work correctly with IOCP because IOCP needs different buffer each time WSAAcceptEx() is called, (3) increase verbosity to warning on transport related errors in transaction

Location:
pjproject/trunk/pjsip/src/pjsip
Files:
3 edited

Legend:

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

    r575 r600  
    15231523            err =pj_strerror(-sent, errmsg, sizeof(errmsg)); 
    15241524 
    1525             PJ_LOG(4,(tsx->obj_name,  
     1525            PJ_LOG(2,(tsx->obj_name,  
    15261526                      "Failed to send %s! err=%d (%s)", 
    15271527                      pjsip_tx_data_get_info(send_state->tdata), -sent, 
     
    15461546            char errmsg[PJ_ERR_MSG_SIZE]; 
    15471547 
    1548             PJ_LOG(4,(tsx->obj_name,  
     1548            PJ_LOG(2,(tsx->obj_name,  
    15491549                      "Temporary failure in sending %s, " 
    15501550                      "will try next server. Err=%d (%s)", 
     
    15721572        err = pj_strerror(-sent, errmsg, sizeof(errmsg)); 
    15731573 
    1574         PJ_LOG(4,(tsx->obj_name, "Transport failed to send %s! Err=%d (%s)", 
     1574        PJ_LOG(2,(tsx->obj_name, "Transport failed to send %s! Err=%d (%s)", 
    15751575                  pjsip_tx_data_get_info(tdata), -sent, errmsg)); 
    15761576 
     
    16191619            char errmsg[PJ_ERR_MSG_SIZE]; 
    16201620 
    1621             PJ_LOG(4,(tsx->obj_name,  
     1621            PJ_LOG(2,(tsx->obj_name,  
    16221622                      "Error sending %s: Err=%d (%s)", 
    16231623                      pjsip_tx_data_get_info(tdata), status,  
     
    16641664        err = pj_strerror(status, errmsg, sizeof(errmsg)); 
    16651665 
    1666         PJ_LOG(4,(tsx->obj_name,  
     1666        PJ_LOG(2,(tsx->obj_name,  
    16671667                  "Transport error, terminating transaction. " 
    16681668                  "Err=%d (%s)", 
     
    24152415 
    24162416        /* Start Timer D with TD/T4 timer if unreliable transport is used. */ 
    2417         if (PJSIP_TRANSPORT_IS_RELIABLE(tsx->transport) == 0) { 
     2417        /* Note: tsx->transport may be NULL! */ 
     2418        if ((tsx->transport && PJSIP_TRANSPORT_IS_RELIABLE(tsx->transport)==0) 
     2419            || ((tsx->transport_flag & PJSIP_TRANSPORT_RELIABLE) == 0))  
     2420        { 
    24182421            if (tsx->method.id == PJSIP_INVITE_METHOD) { 
    24192422                timeout = td_timer_val; 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r596 r600  
    465465    if (tdata->is_pending) { 
    466466        pj_assert(!"Invalid operation step!"); 
     467        PJ_LOG(2,(THIS_FILE, "Unable to send %s: message is pending",  
     468                             pjsip_tx_data_get_info(tdata))); 
    467469        return PJSIP_EPENDINGTX; 
    468470    } 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c

    r582 r600  
    5454    pj_ioqueue_op_key_t      op_key; 
    5555    struct tcp_listener     *listener; 
     56    unsigned                 index; 
     57    pj_pool_t               *pool; 
    5658    pj_sock_t                new_sock; 
    5759    int                      addr_len; 
     
    7577    pj_ioqueue_key_t        *key; 
    7678    unsigned                 async_cnt; 
    77     struct pending_accept    accept_op[MAX_ASYNC_CNT]; 
     79    struct pending_accept   *accept_op[MAX_ASYNC_CNT]; 
    7880}; 
    7981 
     
    144146/* Common function to create and initialize transport */ 
    145147static pj_status_t tcp_create(struct tcp_listener *listener, 
     148                              pj_pool_t *pool, 
    146149                              pj_sock_t sock, pj_bool_t is_server, 
    147150                              const pj_sockaddr_in *local, 
     
    298301 
    299302    for (i=0; i<async_cnt; ++i) { 
    300         pj_ioqueue_op_key_init(&listener->accept_op[i].op_key,  
    301                                 sizeof(listener->accept_op[i].op_key)); 
    302         listener->accept_op[i].listener = listener; 
    303  
    304         on_accept_complete(listener->key, &listener->accept_op[i].op_key, 
     303        pj_pool_t *pool; 
     304 
     305        pool = pjsip_endpt_create_pool(endpt, "tcps%p", POOL_TP_INIT,  
     306                                       POOL_TP_INIT); 
     307        if (!pool) { 
     308            status = PJ_ENOMEM; 
     309            goto on_error; 
     310        } 
     311 
     312        listener->accept_op[i] = pj_pool_zalloc(pool,  
     313                                                sizeof(struct pending_accept)); 
     314        pj_ioqueue_op_key_init(&listener->accept_op[i]->op_key,  
     315                                sizeof(listener->accept_op[i]->op_key)); 
     316        listener->accept_op[i]->listener = listener; 
     317        listener->accept_op[i]->index = i; 
     318 
     319        on_accept_complete(listener->key, &listener->accept_op[i]->op_key, 
    305320                           listener->sock, PJ_EPENDING); 
    306321    } 
     
    326341{ 
    327342    struct tcp_listener *listener = (struct tcp_listener *)factory; 
     343    unsigned i; 
    328344 
    329345    if (listener->is_registered) { 
     
    346362        pj_lock_destroy(listener->factory.lock); 
    347363        listener->factory.lock = NULL; 
     364    } 
     365 
     366    for (i=0; i<PJ_ARRAY_SIZE(listener->accept_op); ++i) { 
     367        if (listener->accept_op[i] && listener->accept_op[i]->pool) { 
     368            pj_pool_release(listener->accept_op[i]->pool); 
     369            listener->accept_op[i]->pool = NULL; 
     370        } 
    348371    } 
    349372 
     
    409432 */ 
    410433static pj_status_t tcp_create( struct tcp_listener *listener, 
     434                               pj_pool_t *pool, 
    411435                               pj_sock_t sock, pj_bool_t is_server, 
    412436                               const pj_sockaddr_in *local, 
     
    415439{ 
    416440    struct tcp_transport *tcp; 
    417     pj_pool_t *pool; 
    418441    pj_ioqueue_t *ioqueue; 
    419442    pj_ioqueue_callback tcp_callback; 
     
    424447 
    425448 
    426     pool = pjsip_endpt_create_pool(listener->endpt, "tcp", 
    427                                    POOL_TP_INIT, POOL_TP_INC); 
    428     PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM); 
    429      
     449    if (pool == NULL) { 
     450        pool = pjsip_endpt_create_pool(listener->endpt, "tcp", 
     451                                       POOL_TP_INIT, POOL_TP_INC); 
     452        PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM); 
     453    }     
    430454 
    431455    /* 
     
    684708                             PJ_IOQUEUE_ALWAYS_ASYNC); 
    685709    if (status != PJ_SUCCESS && status != PJ_EPENDING) { 
    686         tcp_perror(tcp->base.obj_name, "ioqueue recv() error", status); 
     710        PJ_LOG(4, (tcp->base.obj_name, "ioqueue recv() error, status=%d",  
     711                   status)); 
    687712        return status; 
    688713    } 
     
    745770 
    746771    /* Create the transport descriptor */ 
    747     status = tcp_create(listener, sock, PJ_FALSE, &local_addr,  
     772    status = tcp_create(listener, NULL, sock, PJ_FALSE, &local_addr,  
    748773                        (pj_sockaddr_in*)rem_addr, &tcp); 
    749774    if (status != PJ_SUCCESS) 
     
    846871 
    847872        } else { 
     873            pj_pool_t *pool; 
     874            struct pending_accept *new_op; 
    848875 
    849876            if (sock == PJ_INVALID_SOCKET) { 
    850877                sock = accept_op->new_sock; 
    851                 PJ_LOG(4,(listener->obj_name,  
    852                           "Warning: ioqueue reports -1 in on_accept_complete()" 
    853                           " sock argument")); 
     878            } 
     879 
     880            if (sock == PJ_INVALID_SOCKET) { 
     881                pj_assert(!"Should not happen. status should be error"); 
     882                goto next_accept; 
    854883            } 
    855884 
     
    864893                      sock)); 
    865894 
     895            /* Create new accept_opt */ 
     896            pool = pjsip_endpt_create_pool(listener->endpt, "tcps%p",  
     897                                           POOL_TP_INIT, POOL_TP_INC); 
     898            new_op = pj_pool_zalloc(pool, sizeof(struct pending_accept)); 
     899            new_op->pool = pool; 
     900            new_op->listener = listener; 
     901            new_op->index = accept_op->index; 
     902            pj_ioqueue_op_key_init(&new_op->op_key, sizeof(new_op->op_key)); 
     903            listener->accept_op[accept_op->index] = new_op; 
     904 
    866905            /*  
    867906             * Incoming connections! 
    868907             * Create TCP transport for the new socket. 
    869908             */ 
    870             status = tcp_create( listener, sock, PJ_TRUE, 
     909            status = tcp_create( listener, accept_op->pool, sock, PJ_TRUE, 
    871910                                 &accept_op->local_addr,  
    872911                                 &accept_op->remote_addr, &tcp); 
     
    878917                } 
    879918            } 
     919 
     920            accept_op = new_op; 
    880921        } 
    881922 
     923next_accept: 
    882924        /* 
    883925         * Start the next asynchronous accept() operation. 
     
    11291171        { 
    11301172 
    1131             /* Report error to endpoint. */ 
    1132             PJSIP_ENDPT_LOG_ERROR((rdata->tp_info.transport->endpt, 
    1133                                    rdata->tp_info.transport->obj_name, 
    1134                                    -bytes_read, "TCP recv() error")); 
     1173            /* Socket error. */ 
    11351174 
    11361175            /* We can not destroy the transport since high level objects may 
     
    11731212 
    11741213        } else { 
    1175             /* Report error to endpoint */ 
    1176             PJSIP_ENDPT_LOG_ERROR((rdata->tp_info.transport->endpt, 
    1177                                    rdata->tp_info.transport->obj_name, 
    1178                                    status, "tcp recv() error")); 
     1214            /* Socket error */ 
    11791215 
    11801216            /* We can not destroy the transport since high level objects may 
Note: See TracChangeset for help on using the changeset viewer.