Changeset 175 for pjproject


Ignore:
Timestamp:
Feb 10, 2006 2:04:05 PM (19 years ago)
Author:
bennylp
Message:

Added more logging, and fixed bug when ACK is responded!

Location:
pjproject/trunk/pjsip
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/build

    • Property svn:ignore
      •  

        old new  
        55.pj* 
        66*.swp 
         7*.log 
  • pjproject/trunk/pjsip/include/pjsip-ua/sip_inv.h

    r169 r175  
    167167struct pjsip_inv_session 
    168168{ 
    169     pj_pool_t           *pool; 
    170     pjsip_inv_state      state; 
    171     pjsip_dialog        *dlg; 
    172     pjsip_role_e         role; 
    173     unsigned             options; 
    174     pjmedia_sdp_neg     *neg; 
    175     pjsip_transaction   *invite_tsx; 
    176     void                *mod_data[PJSIP_MAX_MODULE]; 
     169    char                 obj_name[PJ_MAX_OBJ_NAME]; /**< Log identification. */ 
     170    pj_pool_t           *pool;                      /**< Dialog's pool.     */ 
     171    pjsip_inv_state      state;                     /**< Invite sess state. */ 
     172    pjsip_dialog        *dlg;                       /**< Underlying dialog. */ 
     173    pjsip_role_e         role;                      /**< Invite role.       */ 
     174    unsigned             options;                   /**< Options in use.    */ 
     175    pjmedia_sdp_neg     *neg;                       /**< Negotiator.        */ 
     176    pjsip_transaction   *invite_tsx;                /**< 1st invite tsx.    */ 
     177    void                *mod_data[PJSIP_MAX_MODULE];/**< Modules data.      */ 
    177178}; 
    178179 
  • pjproject/trunk/pjsip/include/pjsip/sip_dialog.h

    r160 r175  
    184184 * (after created) the dialog has the session counter set to zero. 
    185185 */ 
    186 PJ_DECL(pj_status_t) pjsip_dlg_inc_session( pjsip_dialog *dlg ); 
     186PJ_DECL(pj_status_t) pjsip_dlg_inc_session( pjsip_dialog *dlg, 
     187                                            pjsip_module *mod); 
    187188 
    188189 
     
    193194 * if there is no pending transaction when this function is called. 
    194195 */ 
    195 PJ_DECL(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg ); 
     196PJ_DECL(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg, 
     197                                            pjsip_module *mod); 
    196198 
    197199/** 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r171 r175  
    131131 
    132132    if (inv->state == PJSIP_INV_STATE_DISCONNECTED) 
    133         pjsip_dlg_dec_session(inv->dlg); 
     133        pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); 
    134134} 
    135135 
     
    142142    pjsip_tx_data *tdata; 
    143143    pj_status_t status; 
     144 
     145    PJ_LOG(5,(inv->obj_name, "Received %s, sending ACK", 
     146              pjsip_rx_data_get_info(rdata))); 
    144147 
    145148    status = pjsip_dlg_create_request(inv->dlg, &pjsip_ack_method,  
     
    371374    inv->options = options; 
    372375 
     376    /* Object name will use the same dialog pointer. */ 
     377    pj_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); 
     378 
    373379    /* Create negotiator if local_sdp is specified. */ 
    374380    if (local_sdp) { 
     
    385391 
    386392    /* Increment dialog session */ 
    387     pjsip_dlg_inc_session(dlg); 
     393    pjsip_dlg_inc_session(dlg, &mod_inv.mod); 
    388394 
    389395    /* Done */ 
    390396    *p_inv = inv; 
     397 
     398    PJ_LOG(5,(inv->obj_name, "UAC invite session created for dialog %s", 
     399              dlg->obj_name)); 
     400 
    391401    return PJ_SUCCESS; 
    392402} 
     
    760770    inv->options = options; 
    761771 
     772    /* Object name will use the same dialog pointer. */ 
     773    pj_snprintf(inv->obj_name, PJ_MAX_OBJ_NAME, "inv%p", dlg); 
     774 
    762775    /* Parse SDP in message body, if present. */ 
    763776    if (msg->body) { 
     
    795808 
    796809    /* Increment session in the dialog. */ 
    797     pjsip_dlg_inc_session(dlg); 
     810    pjsip_dlg_inc_session(dlg, &mod_inv.mod); 
    798811 
    799812    /* Save the invite transaction. */ 
     
    808821    /* Done */ 
    809822    *p_inv = inv; 
     823 
     824    PJ_LOG(5,(inv->obj_name, "UAS invite session created for dialog %s", 
     825              dlg->obj_name)); 
     826 
    810827    return PJ_SUCCESS; 
    811828} 
     
    912929 
    913930    status = pjmedia_sdp_neg_negotiate(inv->pool, inv->neg, 0); 
     931 
     932    PJ_LOG(5,(inv->obj_name, "SDP negotiation done, status=%d", status)); 
    914933 
    915934    if (mod_inv.cb.on_media_update) 
     
    9821001        /* This is an offer. */ 
    9831002 
     1003        PJ_LOG(5,(inv->obj_name, "Got SDP offer in %s",  
     1004                  pjsip_rx_data_get_info(rdata))); 
     1005 
    9841006        if (inv->neg == NULL) { 
    9851007            status=pjmedia_sdp_neg_create_w_remote_offer(inv->pool, NULL,  
     
    10091031         * Process and negotiate remote answer. 
    10101032         */ 
     1033 
     1034        PJ_LOG(5,(inv->obj_name, "Got SDP answer in %s",  
     1035                  pjsip_rx_data_get_info(rdata))); 
    10111036 
    10121037        status = pjmedia_sdp_neg_set_remote_answer(inv->pool, inv->neg, sdp); 
     
    12601285    /* Verify arguments. */ 
    12611286    PJ_ASSERT_RETURN(inv && tdata, PJ_EINVAL); 
     1287 
     1288    PJ_LOG(5,(inv->obj_name, "Sending %s",  
     1289              pjsip_tx_data_get_info(tdata))); 
    12621290 
    12631291    if (tdata->msg->type == PJSIP_REQUEST_MSG) { 
     
    15821610            break; 
    15831611        } 
     1612 
     1613    } else if (inv->role == PJSIP_ROLE_UAC && 
     1614               tsx->role == PJSIP_ROLE_UAC && 
     1615               tsx->method.id == PJSIP_CANCEL_METHOD) 
     1616    { 
     1617        /* 
     1618         * Handle case when outgoing CANCEL is answered with 481 (Call/ 
     1619         * Transaction Does Not Exist), 408, or when it's timed out. In these 
     1620         * cases, disconnect session (i.e. dialog usage only). 
     1621         */ 
     1622        if (tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST || 
     1623            tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || 
     1624            tsx->status_code == PJSIP_SC_TSX_TIMEOUT || 
     1625            PJSIP_SC_TSX_TRANSPORT_ERROR) 
     1626        { 
     1627            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
     1628        } 
    15841629    } 
    15851630} 
     
    17381783        inv_respond_incoming_cancel(inv, tsx, e->body.tsx_state.src.rdata); 
    17391784 
     1785    } else if (inv->role == PJSIP_ROLE_UAC && 
     1786               tsx->role == PJSIP_ROLE_UAC && 
     1787               tsx->method.id == PJSIP_CANCEL_METHOD) 
     1788    { 
     1789        /* 
     1790         * Handle case when outgoing CANCEL is answered with 481 (Call/ 
     1791         * Transaction Does Not Exist), 408, or when it's timed out. In these 
     1792         * cases, disconnect session (i.e. dialog usage only). 
     1793         */ 
     1794        if (tsx->status_code == PJSIP_SC_CALL_TSX_DOES_NOT_EXIST || 
     1795            tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || 
     1796            tsx->status_code == PJSIP_SC_TSX_TIMEOUT || 
     1797            PJSIP_SC_TSX_TRANSPORT_ERROR) 
     1798        { 
     1799            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
     1800        } 
    17401801    } 
    17411802} 
  • pjproject/trunk/pjsip/src/pjsip/sip_dialog.c

    r169 r175  
    201201    *p_dlg = dlg; 
    202202 
     203 
     204    PJ_LOG(5,(dlg->obj_name, "UAC dialog created")); 
     205 
    203206    return PJ_SUCCESS; 
    204207 
     
    381384    /* Done. */ 
    382385    *p_dlg = dlg; 
     386    PJ_LOG(5,(dlg->obj_name, "UAS dialog created")); 
    383387    return PJ_SUCCESS; 
    384388 
     
    496500    *new_dlg = dlg; 
    497501 
     502    PJ_LOG(5,(dlg->obj_name, "Forked dialog created")); 
    498503    return PJ_SUCCESS; 
    499504 
     
    577582 * Increment session counter. 
    578583 */ 
    579 PJ_DEF(pj_status_t) pjsip_dlg_inc_session( pjsip_dialog *dlg ) 
    580 { 
    581     PJ_ASSERT_RETURN(dlg, PJ_EINVAL); 
     584PJ_DEF(pj_status_t) pjsip_dlg_inc_session( pjsip_dialog *dlg, 
     585                                           pjsip_module *mod ) 
     586{ 
     587    PJ_ASSERT_RETURN(dlg && mod, PJ_EINVAL); 
    582588 
    583589    pj_mutex_lock(dlg->mutex); 
     
    585591    pj_mutex_unlock(dlg->mutex); 
    586592 
     593    PJ_LOG(5,(dlg->obj_name, "Session count inc to %d by %.*s", 
     594              dlg->sess_count, (int)mod->name.slen, mod->name.ptr)); 
     595 
    587596    return PJ_SUCCESS; 
    588597} 
     
    591600 * Decrement session counter. 
    592601 */ 
    593 PJ_DEF(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg ) 
     602PJ_DEF(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg, 
     603                                           pjsip_module *mod) 
    594604{ 
    595605    pj_status_t status; 
    596606 
    597607    PJ_ASSERT_RETURN(dlg, PJ_EINVAL); 
     608 
     609    PJ_LOG(5,(dlg->obj_name, "Session count dec to %d by %.*s", 
     610              dlg->sess_count-1, (int)mod->name.slen, mod->name.ptr)); 
    598611 
    599612    pj_mutex_lock(dlg->mutex); 
     
    626639                     PJ_EINVAL); 
    627640    PJ_ASSERT_RETURN(dlg->usage_cnt < PJSIP_MAX_MODULE, PJ_EBUG); 
     641 
     642    PJ_LOG(5,(dlg->obj_name, "Module %.*s added as dialog usage", 
     643              (int)mod->name.slen, mod->name.ptr)); 
    628644 
    629645    pj_mutex_lock(dlg->mutex); 
     
    795811                     PJSIP_ENOTREQUESTMSG); 
    796812 
     813    PJ_LOG(5,(dlg->obj_name, "Sending %s", 
     814              pjsip_tx_data_get_info(tdata))); 
     815 
    797816    /* Update CSeq */ 
    798817    pj_mutex_lock(dlg->mutex); 
     
    10241043    PJ_ASSERT_RETURN(tsx->mod_data[dlg->ua->id] == dlg, PJ_EINVALIDOP); 
    10251044 
     1045    PJ_LOG(5,(dlg->obj_name, "Sending %s", 
     1046              pjsip_tx_data_get_info(tdata))); 
     1047 
    10261048    /* Check that transaction method and cseq match the response.  
    10271049     * This operation is sloooww (search CSeq header twice), that's why 
     
    10781100    pjsip_transaction *tsx = NULL; 
    10791101    unsigned i; 
     1102 
     1103    PJ_LOG(5,(dlg->obj_name, "Received %s", 
     1104              pjsip_rx_data_get_info(rdata))); 
    10801105 
    10811106    /* Lock the dialog. */ 
     
    11441169    int res_code; 
    11451170 
     1171    PJ_LOG(5,(dlg->obj_name, "Received %s", 
     1172              pjsip_rx_data_get_info(rdata))); 
     1173 
    11461174    /* Lock the dialog. */ 
    11471175    pj_mutex_lock(dlg->mutex); 
     
    12501278    unsigned i; 
    12511279 
     1280    PJ_LOG(5,(dlg->obj_name, "Transaction %s state changed to %s", 
     1281              tsx->obj_name, pjsip_tsx_state_str(tsx->state))); 
     1282 
    12521283    /* Lock the dialog. */ 
    12531284    pj_mutex_lock(dlg->mutex); 
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r162 r175  
    882882    if (tsx->transport_flag & TSX_HAS_PENDING_TRANSPORT) { 
    883883        tsx->transport_flag |= TSX_HAS_PENDING_DESTROY; 
    884         PJ_LOG(5,(tsx->obj_name, "Will destroy later because transport is " 
     884        PJ_LOG(4,(tsx->obj_name, "Will destroy later because transport is " 
    885885                                 "in progress")); 
    886886        return; 
     
    915915    PJ_UNUSED_ARG(theap); 
    916916 
    917     PJ_LOG(6,(tsx->obj_name, "%s timer event",  
     917    PJ_LOG(5,(tsx->obj_name, "%s timer event",  
    918918             (entry->id==TSX_TIMER_RETRANSMISSION ? "Retransmit":"Timeout"))); 
    919919 
     
    12861286{ 
    12871287    struct tsx_lock_data lck; 
     1288 
     1289    PJ_LOG(5,(tsx->obj_name, "Request to terminate transaction")); 
    12881290 
    12891291    PJ_ASSERT_RETURN(tsx != NULL, PJ_EINVAL); 
  • pjproject/trunk/pjsip/src/pjsip/sip_ua_layer.c

    r169 r175  
    497497        pj_mutex_unlock(mod_ua.mutex); 
    498498 
    499         /* Respond with 481 . */ 
    500         pjsip_endpt_respond_stateless( mod_ua.endpt, rdata, 481, NULL, NULL, 
    501                                        NULL ); 
     499        if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD) { 
     500            PJ_LOG(5,(THIS_FILE,  
     501                      "Unable to find dialogset for %s, answering with 481", 
     502                      pjsip_rx_data_get_info(rdata))); 
     503 
     504            /* Respond with 481 . */ 
     505            pjsip_endpt_respond_stateless( mod_ua.endpt, rdata, 481, NULL,  
     506                                           NULL, NULL ); 
     507        } 
    502508        return PJ_TRUE; 
    503509    } 
     
    518524    /* Dialog MUST be found! */ 
    519525    if (dlg == (pjsip_dialog*)&dlg_set->dlg_list) { 
     526 
    520527        /* Not found. Mulfunction UAC? */ 
    521528        pj_mutex_unlock(mod_ua.mutex); 
     529 
     530        PJ_LOG(5,(THIS_FILE,  
     531                  "Unable to find dialog for %s, answering with 481", 
     532                  pjsip_rx_data_get_info(rdata))); 
     533 
    522534        pjsip_endpt_respond_stateless(mod_ua.endpt, rdata, 
    523535                                      PJSIP_SC_CALL_TSX_DOES_NOT_EXIST,  
     
    662674            ((st_code/100==1 && st_code!=100) || st_code/100==2))  
    663675        { 
     676 
     677            PJ_LOG(5,(THIS_FILE,  
     678                      "Received forked %s for existing dialog %s", 
     679                      pjsip_rx_data_get_info(rdata),  
     680                      dlg_set->dlg_list.next->obj_name)); 
     681 
    664682            /* Report to application about forked condition. 
    665683             * Application can either create a dialog or ignore the response. 
  • pjproject/trunk/pjsip/src/pjsip/sip_util.c

    r174 r175  
    357357    req_msg = rdata->msg_info.msg; 
    358358    pj_assert(req_msg->type == PJSIP_REQUEST_MSG); 
     359 
     360    /* Request MUST NOT be ACK request! */ 
     361    PJ_ASSERT_RETURN(req_msg->line.req.method.id != PJSIP_ACK_METHOD, 
     362                     PJ_EINVALIDOP); 
    359363 
    360364    /* Create a new transmit buffer. */ 
  • pjproject/trunk/pjsip/src/pjsua/pjsua_core.c

    r173 r175  
    487487    status = init_sockets(); 
    488488    if (status != PJ_SUCCESS) { 
    489         pj_caching_pool_destroy(&pjsua.cp); 
    490489        pjsua_perror("init_sockets() has returned error", status); 
    491490        return status; 
     
    621620                pj_thread_destroy(pjsua.threads[i]); 
    622621            } 
    623             pj_caching_pool_destroy(&pjsua.cp); 
    624622            return status; 
    625623        } 
     
    666664    pjsua.quit_flag = 1; 
    667665 
    668     /* Destroy sound framework: */ 
     666    /* Destroy sound framework:  
     667     * (this should be done in pjmedia_shutdown()) 
     668     */ 
    669669    pj_snd_deinit(); 
    670670 
     
    673673    for (i=0; i<pjsua.thread_cnt; ++i) { 
    674674         
    675         pj_thread_join(pjsua.threads[i]); 
    676         pj_thread_destroy(pjsua.threads[i]); 
     675        if (pjsua.threads[i]) { 
     676            pj_thread_join(pjsua.threads[i]); 
     677            pj_thread_destroy(pjsua.threads[i]); 
     678            pjsua.threads[i] = NULL; 
     679        } 
    677680    } 
    678681 
Note: See TracChangeset for help on using the changeset viewer.