Ignore:
Timestamp:
Aug 11, 2009 12:42:38 PM (15 years ago)
Author:
nanang
Message:

Ticket #833:

  • Initial version of Session Timers (RFC 4028).
  • Added new options in pjsua app to configure Session Timers settings.
  • Added python tests for Session Timers.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r2856 r2858  
    2020#include <pjsip-ua/sip_inv.h> 
    2121#include <pjsip-ua/sip_100rel.h> 
     22#include <pjsip-ua/sip_timer.h> 
    2223#include <pjsip/sip_module.h> 
    2324#include <pjsip/sip_endpoint.h> 
     
    232233        } 
    233234        pjsip_100rel_end_session(inv); 
     235        pjsip_timer_end_session(inv); 
    234236        pjsip_dlg_dec_session(inv->dlg, &mod_inv.mod); 
    235237    } 
     
    482484    pjsip_inv_session *inv; 
    483485    pjsip_msg *msg = rdata->msg_info.msg; 
     486    pj_status_t status; 
    484487 
    485488    dlg = pjsip_rdata_get_dlg(rdata); 
     
    507510        return PJ_TRUE; 
    508511 
     512    } 
     513 
     514    /* Pass response to timer session module */ 
     515    status = pjsip_timer_process_resp(inv, rdata); 
     516    if (status != PJ_SUCCESS) { 
     517        pjsip_event e; 
     518        pjsip_tx_data *tdata; 
     519 
     520        PJSIP_EVENT_INIT_RX_MSG(e, rdata); 
     521        inv_send_ack(inv, &e); 
     522 
     523        status = pjsip_inv_end_session(inv, PJSIP_ERRNO_TO_SIP_STATUS(status), 
     524                                       NULL, &tdata); 
     525        if (tdata && status == PJ_SUCCESS) 
     526            pjsip_inv_send_msg(inv, tdata); 
     527 
     528        return PJ_TRUE; 
    509529    } 
    510530 
     
    635655    if (options & PJSIP_INV_REQUIRE_100REL) 
    636656        options |= PJSIP_INV_SUPPORT_100REL; 
    637  
    638657    if (options & PJSIP_INV_REQUIRE_TIMER) 
    639658        options |= PJSIP_INV_SUPPORT_TIMER; 
     
    717736    if (*options & PJSIP_INV_REQUIRE_100REL) 
    718737        *options |= PJSIP_INV_SUPPORT_100REL; 
    719  
    720738    if (*options & PJSIP_INV_REQUIRE_TIMER) 
    721739        *options |= PJSIP_INV_SUPPORT_TIMER; 
     
    868886    if (sup_hdr) { 
    869887        unsigned i; 
    870         pj_str_t STR_100REL = { "100rel", 6}; 
    871         pj_str_t STR_TIMER = { "timer", 5 }; 
     888        const pj_str_t STR_100REL = { "100rel", 6}; 
     889        const pj_str_t STR_TIMER = { "timer", 5}; 
    872890 
    873891        for (i=0; i<sup_hdr->count; ++i) { 
    874892            if (pj_stricmp(&sup_hdr->values[i], &STR_100REL)==0) 
    875893                rem_option |= PJSIP_INV_SUPPORT_100REL; 
    876             else if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) 
     894            if (pj_stricmp(&sup_hdr->values[i], &STR_TIMER)==0) 
    877895                rem_option |= PJSIP_INV_SUPPORT_TIMER; 
    878896        } 
     
    885903        unsigned i; 
    886904        const pj_str_t STR_100REL = { "100rel", 6}; 
     905        const pj_str_t STR_REPLACES = { "replaces", 8 }; 
    887906        const pj_str_t STR_TIMER = { "timer", 5 }; 
    888         const pj_str_t STR_REPLACES = { "replaces", 8 }; 
    889907        unsigned unsupp_cnt = 0; 
    890908        pj_str_t unsupp_tags[PJSIP_GENERIC_ARRAY_MAX_COUNT]; 
     
    896914                rem_option |= PJSIP_INV_REQUIRE_100REL; 
    897915 
    898             } else if ((*options && PJSIP_INV_SUPPORT_TIMER) && 
    899                        pj_stricmp(&req_hdr->values[i], &STR_TIMER)==0) 
     916            } else if ((*options & PJSIP_INV_SUPPORT_TIMER) &&  
     917                pj_stricmp(&req_hdr->values[i], &STR_TIMER)==0) 
    900918            { 
    901919                rem_option |= PJSIP_INV_REQUIRE_TIMER; 
     
    957975    if ( ((*options & PJSIP_INV_REQUIRE_100REL)!=0 &&  
    958976          (rem_option & PJSIP_INV_SUPPORT_100REL)==0) || 
    959          ((*options & PJSIP_INV_REQUIRE_TIMER)!=0 && 
    960           (rem_option & PJSIP_INV_SUPPORT_TIMER)==0)) 
     977         ((*options & PJSIP_INV_REQUIRE_100REL)!=0 &&  
     978          (rem_option & PJSIP_INV_SUPPORT_100REL)==0)) 
    961979    { 
    962980        code = PJSIP_SC_EXTENSION_REQUIRED; 
     
    972990            if (*options & PJSIP_INV_REQUIRE_100REL) 
    973991                req_hdr->values[req_hdr->count++] = pj_str("100rel"); 
    974  
    975992            if (*options & PJSIP_INV_REQUIRE_TIMER) 
    976993                req_hdr->values[req_hdr->count++] = pj_str("timer"); 
     
    10981115    if (options & PJSIP_INV_REQUIRE_100REL) 
    10991116        options |= PJSIP_INV_SUPPORT_100REL; 
    1100  
    11011117    if (options & PJSIP_INV_REQUIRE_TIMER) 
    11021118        options |= PJSIP_INV_SUPPORT_TIMER; 
     
    11701186    /* Create 100rel handler */ 
    11711187    if (inv->options & PJSIP_INV_REQUIRE_100REL) { 
    1172             pjsip_100rel_attach(inv); 
     1188        pjsip_100rel_attach(inv); 
    11731189    } 
    11741190 
     
    13951411 
    13961412    /* Add Require header. */ 
    1397     if (inv->options & PJSIP_INV_REQUIRE_100REL) { 
    1398             const pj_str_t HREQ = { "Require", 7 }; 
    1399             const pj_str_t tag_100rel = { "100rel", 6 }; 
    1400             pjsip_generic_string_hdr *hreq; 
    1401  
    1402             hreq = pjsip_generic_string_hdr_create(tdata->pool, &HREQ,  
    1403                                                    &tag_100rel); 
    1404             pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); 
    1405     } 
     1413    if ((inv->options & PJSIP_INV_REQUIRE_100REL) || 
     1414        (inv->options & PJSIP_INV_REQUIRE_TIMER))  
     1415    { 
     1416        pjsip_require_hdr *hreq; 
     1417 
     1418        hreq = pjsip_require_hdr_create(tdata->pool); 
     1419 
     1420        if (inv->options & PJSIP_INV_REQUIRE_100REL) 
     1421            hreq->values[hreq->count++] = pj_str("100rel"); 
     1422        if (inv->options & PJSIP_INV_REQUIRE_TIMER) 
     1423            hreq->values[hreq->count++] = pj_str("timer"); 
     1424 
     1425        pjsip_msg_add_hdr(tdata->msg, (pjsip_hdr*) hreq); 
     1426    } 
     1427 
     1428    status = pjsip_timer_update_req(inv, tdata); 
     1429    if (status != PJ_SUCCESS) 
     1430        goto on_return; 
    14061431 
    14071432    /* Done. */ 
     
    17461771        goto on_return; 
    17471772 
     1773    /* Invoke Session Timers module */ 
     1774    status = pjsip_timer_process_req(inv, rdata); 
     1775    if (status != PJ_SUCCESS) { 
     1776        pj_status_t status2; 
     1777 
     1778        status2 = pjsip_dlg_modify_response(inv->dlg, tdata,  
     1779                                            PJSIP_ERRNO_TO_SIP_STATUS(status), 
     1780                                            NULL); 
     1781        if (status2 != PJ_SUCCESS) { 
     1782            pjsip_tx_data_dec_ref(tdata); 
     1783            goto on_return; 
     1784        } 
     1785        status2 = pjsip_timer_update_resp(inv, tdata); 
     1786        if (status2 == PJ_SUCCESS) 
     1787            *p_tdata = tdata; 
     1788        else 
     1789            pjsip_tx_data_dec_ref(tdata); 
     1790 
     1791        goto on_return; 
     1792    } 
     1793 
    17481794    /* Process SDP in answer */ 
    17491795    status = process_answer(inv, st_code, tdata, sdp); 
     
    17581804    PJ_LOG(5,(inv->dlg->obj_name, "Initial answer %s", 
    17591805              pjsip_tx_data_get_info(inv->last_answer))); 
     1806 
     1807    /* Invoke Session Timers */ 
     1808    pjsip_timer_update_resp(inv, tdata); 
    17601809 
    17611810    *p_tdata = tdata; 
     
    18091858    } 
    18101859 
     1860    /* Invoke Session Timers */ 
     1861    pjsip_timer_update_resp(inv, last_res); 
    18111862 
    18121863    *p_tdata = last_res; 
     
    19131964    case PJSIP_INV_STATE_CONNECTING: 
    19141965    case PJSIP_INV_STATE_CONFIRMED: 
     1966        /* End Session Timer */ 
     1967        pjsip_timer_end_session(inv); 
     1968 
    19151969        /* For established dialog, send BYE */ 
    19161970        status = pjsip_dlg_create_request(inv->dlg, pjsip_get_bye_method(),  
     
    23002354    /* Unlock dialog. */ 
    23012355    pjsip_dlg_dec_lock(inv->dlg); 
     2356 
     2357    status = pjsip_timer_update_req(inv, tdata); 
     2358    if (status != PJ_SUCCESS) 
     2359        goto on_error; 
    23022360 
    23032361    *p_tdata = tdata; 
     
    25822640    pjsip_tx_data *tdata = NULL; 
    25832641 
     2642    /* Invoke Session Timers module */ 
     2643    status = pjsip_timer_process_req(inv, rdata); 
     2644    if (status != PJ_SUCCESS) { 
     2645        status = pjsip_dlg_create_response(inv->dlg, rdata,  
     2646                                           PJSIP_ERRNO_TO_SIP_STATUS(status), 
     2647                                           NULL, &tdata); 
     2648        goto on_return; 
     2649    } 
     2650 
    25842651    neg_state = pjmedia_sdp_neg_get_state(inv->neg); 
    25852652 
     
    26342701        } 
    26352702    } 
     2703 
     2704on_return: 
     2705    /* Invoke Session Timers */ 
     2706    if (status == PJ_SUCCESS) 
     2707        status = pjsip_timer_update_resp(inv, tdata); 
    26362708 
    26372709    if (status != PJ_SUCCESS) { 
     
    36103682            inv->invite_tsx = tsx; 
    36113683 
     3684            /* Process session timers headers in the re-INVITE */ 
     3685            status = pjsip_timer_process_req(inv, rdata); 
     3686            if (status != PJ_SUCCESS) { 
     3687                status = pjsip_dlg_create_response(inv->dlg, rdata,  
     3688                                           PJSIP_ERRNO_TO_SIP_STATUS(status),  
     3689                                           NULL, &tdata); 
     3690                if (status != PJ_SUCCESS) 
     3691                    return; 
     3692 
     3693                pjsip_timer_update_resp(inv, tdata); 
     3694                status = pjsip_dlg_send_response(dlg, tsx, tdata); 
     3695                return; 
     3696            } 
     3697 
    36123698            /* Process SDP in incoming message. */ 
    36133699            status = inv_check_sdp_in_incoming_msg(inv, tsx, rdata); 
     
    37173803            } 
    37183804 
     3805            /* Invoke Session Timers */ 
     3806            pjsip_timer_update_resp(inv, tdata); 
     3807 
    37193808            /* Send 2xx regardless of the status of negotiation */ 
    37203809            status = pjsip_inv_send_msg(inv, tdata); 
Note: See TracChangeset for help on using the changeset viewer.