Ignore:
Timestamp:
Aug 11, 2009 4:26:20 PM (15 years ago)
Author:
nanang
Message:

Ticket #833:

  • Renamed pjsip_timer_default_setting() to pjsip_timer_setting_default().
  • Updated session timer settings in pjsua-lib as whole session timer setting struct (pyhton version remains using se & min_se).
  • Added output param SIP status code in pjsip_timer_process_resp() and pjsip_timer_process_req() to specify the corresponding SIP status code when function returning non-PJ_SUCCESS.
  • Fixed print header functions in sip_timer.c to have buffer check.
  • Added PJSIP_SESS_TIMER_DEF_SE setting to specify the default value of session timer interval.
  • Fixed role reference of the refresher, it is transaction role, not dialog role.
File:
1 edited

Legend:

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

    r2858 r2859  
    2828 
    2929 
    30 /* Constant values of Session Timers */ 
     30/* Constant of Session Timers */ 
    3131#define ABS_MIN_SE              90      /* Absolute Min-SE, in seconds      */ 
    32 #define DEF_SE                  1800    /* Default SE, in seconds           */ 
    3332 
    3433 
     
    6160    pj_bool_t                    use_update;    /**< Use UPDATE method to 
    6261                                                     refresh the session    */ 
     62    pjsip_role_e                 role;          /**< Role in last INVITE/ 
     63                                                     UPDATE transaction.    */ 
    6364 
    6465} pjsip_timer; 
     
    121122    const pj_str_t *hname = pjsip_use_compact_form? &hdr->sname : &hdr->name; 
    122123 
     124    /* Print header name and value */ 
     125    if ((endbuf - p) < (hname->slen + 16)) 
     126        return -1; 
     127 
    123128    copy_advance(p, (*hname)); 
    124129    *p++ = ':'; 
     
    128133    p += printed; 
    129134 
    130     if (hdr->refresher.slen && (endbuf-p) > (hdr->refresher.slen + 2)) 
     135    /* Print 'refresher' param */ 
     136    if (hdr->refresher.slen) 
    131137    { 
     138        if  ((endbuf - p) < (STR_REFRESHER.slen + 2 + hdr->refresher.slen)) 
     139            return -1; 
     140 
    132141        *p++ = ';'; 
    133142        copy_advance(p, STR_REFRESHER); 
     
    136145    } 
    137146 
     147    /* Print generic params */ 
    138148    printed = pjsip_param_print_on(&hdr->other_param, p, endbuf-p, 
    139149                                   &pc->pjsip_TOKEN_SPEC,  
     
    177187    const pjsip_parser_const_t *pc = pjsip_parser_const(); 
    178188 
     189    /* Print header name and value */ 
     190    if ((endbuf - p) < (hdr->name.slen + 16)) 
     191        return -1; 
     192 
    179193    copy_advance(p, hdr->name); 
    180194    *p++ = ':'; 
     
    184198    p += printed; 
    185199 
     200    /* Print generic params */ 
    186201    printed = pjsip_param_print_on(&hdr->other_param, p, endbuf-p, 
    187202                                   &pc->pjsip_TOKEN_SPEC,  
     
    324339    /* Check our role */ 
    325340    as_refresher =  
    326         (inv->timer->refresher == TR_UAC && inv->role == PJSIP_ROLE_UAC) || 
    327         (inv->timer->refresher == TR_UAS && inv->role == PJSIP_ROLE_UAS); 
     341        (inv->timer->refresher == TR_UAC && inv->timer->role == PJSIP_ROLE_UAC) || 
     342        (inv->timer->refresher == TR_UAS && inv->timer->role == PJSIP_ROLE_UAS); 
    328343 
    329344    /* Do action based on role, refresher or refreshee */ 
     
    418433     
    419434    /* Set delay based on role, refresher or refreshee */ 
    420     if ((timer->refresher == TR_UAC && inv->role == PJSIP_ROLE_UAC) || 
    421         (timer->refresher == TR_UAS && inv->role == PJSIP_ROLE_UAS)) 
     435    if ((timer->refresher == TR_UAC && inv->timer->role == PJSIP_ROLE_UAC) || 
     436        (timer->refresher == TR_UAS && inv->timer->role == PJSIP_ROLE_UAS)) 
    422437    { 
    423438        /* Next refresh, the delay is half of session expire */ 
     
    488503 * Initialize Session Timers setting with default values. 
    489504 */ 
    490 PJ_DEF(pj_status_t) pjsip_timer_default_setting(pjsip_timer_setting *setting) 
     505PJ_DEF(pj_status_t) pjsip_timer_setting_default(pjsip_timer_setting *setting) 
    491506{ 
    492507    pj_bzero(setting, sizeof(pjsip_timer_setting)); 
    493508 
    494     setting->sess_expires = DEF_SE; 
     509    setting->sess_expires = PJSIP_SESS_TIMER_DEF_SE; 
    495510    setting->min_se = ABS_MIN_SE; 
    496511 
     
    527542        pj_memcpy(s, setting, sizeof(*s)); 
    528543    } else { 
    529         pjsip_timer_default_setting(s); 
     544        pjsip_timer_setting_default(s); 
    530545    } 
    531546 
     
    605620 */ 
    606621PJ_DEF(pj_status_t) pjsip_timer_process_resp(pjsip_inv_session *inv, 
    607                                              const pjsip_rx_data *rdata) 
     622                                             const pjsip_rx_data *rdata, 
     623                                             pjsip_status_code *st_code) 
    608624{ 
    609625    const pjsip_msg *msg; 
    610626 
    611     PJ_ASSERT_RETURN(inv && rdata, PJ_EINVAL); 
     627    PJ_ASSERT_ON_FAIL(inv && rdata, 
     628        {if(st_code)*st_code=PJSIP_SC_INTERNAL_SERVER_ERROR;return PJ_EINVAL;}); 
    612629 
    613630    /* Check if Session Timers is supported */ 
     
    705722             */ 
    706723            if (inv->options & PJSIP_INV_REQUIRE_TIMER) { 
     724                if (st_code) 
     725                    *st_code = PJSIP_SC_EXTENSION_REQUIRED; 
    707726                pjsip_timer_end_session(inv); 
    708727                return PJSIP_ERRNO_FROM_SIP_STATUS( 
     
    727746            se_hdr->sess_expires < inv->timer->setting.min_se) 
    728747        { 
     748            if (st_code) 
     749                *st_code = PJSIP_SC_SESSION_TIMER_TOO_SMALL; 
    729750            pjsip_timer_end_session(inv); 
    730751            return PJSIP_ERRNO_FROM_SIP_STATUS( 
     
    758779        PJ_TODO(CHECK_IF_REMOTE_SUPPORT_UPDATE); 
    759780 
     781        /* Remember our role in this transaction */ 
     782        inv->timer->role = PJSIP_ROLE_UAC; 
     783 
    760784        /* Finally, set active flag and start the Session Timers */ 
    761785        inv->timer->active = PJ_TRUE; 
     
    770794 */ 
    771795PJ_DEF(pj_status_t) pjsip_timer_process_req(pjsip_inv_session *inv, 
    772                                             const pjsip_rx_data *rdata) 
     796                                            const pjsip_rx_data *rdata, 
     797                                            pjsip_status_code *st_code) 
    773798{ 
    774799    pjsip_min_se_hdr *min_se_hdr; 
     
    777802    unsigned min_se; 
    778803 
    779     PJ_ASSERT_RETURN(inv && rdata, PJ_EINVAL); 
     804    PJ_ASSERT_ON_FAIL(inv && rdata, 
     805        {if(st_code)*st_code=PJSIP_SC_INTERNAL_SERVER_ERROR;return PJ_EINVAL;}); 
    780806 
    781807    /* Check if Session Timers is supported */ 
     
    828854     * (or 90 seconds if Min-SE is not set). 
    829855     */ 
    830     if (se_hdr && se_hdr->sess_expires < min_se) 
     856    if (se_hdr && se_hdr->sess_expires < min_se) { 
     857        if (st_code) 
     858            *st_code = PJSIP_SC_SESSION_TIMER_TOO_SMALL; 
    831859        return PJSIP_ERRNO_FROM_SIP_STATUS(PJSIP_SC_SESSION_TIMER_TOO_SMALL); 
     860    } 
    832861 
    833862    /* Update SE. Note that there is a case that SE is not available in the 
     
    882911    if (msg->line.status.code/100 == 2) 
    883912    { 
    884         /* Add Session-Expires header and start the timer */ 
    885913        if (inv->timer && inv->timer->active) { 
     914            /* Remember our role in this transaction */ 
     915            inv->timer->role = PJSIP_ROLE_UAS; 
     916 
     917            /* Add Session-Expires header and start the timer */ 
    886918            add_timer_headers(inv, tdata, PJ_TRUE, PJ_FALSE); 
    887919            start_timer(inv); 
Note: See TracChangeset for help on using the changeset viewer.