Ignore:
Timestamp:
Oct 16, 2009 6:28:56 AM (15 years ago)
Author:
nanang
Message:

Ticket #954 (issue no 2): Updated session timer to process 2xx response in mod_inv state handlers (was in mod_inv_on_rx_response()).

File:
1 edited

Legend:

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

    r2879 r2951  
    109109                                   const pjmedia_sdp_session *local_sdp); 
    110110 
     111static pj_status_t handle_timer_response(pjsip_inv_session *inv, 
     112                                         const pjsip_rx_data *rdata, 
     113                                         pj_bool_t end_sess_on_failure); 
     114 
    111115static void (*inv_state_handler[])( pjsip_inv_session *inv, pjsip_event *e) =  
    112116{ 
     
    478482} 
    479483 
     484/* This function will process Session Timer headers in received  
     485 * 2xx or 422 response of INVITE/UPDATE request. 
     486 */ 
     487static pj_status_t handle_timer_response(pjsip_inv_session *inv, 
     488                                         const pjsip_rx_data *rdata, 
     489                                         pj_bool_t end_sess_on_failure) 
     490{ 
     491    pjsip_status_code st_code; 
     492    pj_status_t status; 
     493 
     494    status = pjsip_timer_process_resp(inv, rdata, &st_code); 
     495    if (status != PJ_SUCCESS && end_sess_on_failure) { 
     496        pjsip_tx_data *tdata; 
     497        pj_status_t status2; 
     498 
     499        status2 = pjsip_inv_end_session(inv, st_code, NULL, &tdata); 
     500        if (tdata && status2 == PJ_SUCCESS) 
     501            pjsip_inv_send_msg(inv, tdata); 
     502    } 
     503 
     504    return status; 
     505} 
     506 
    480507/* 
    481508 * Module on_rx_response(). 
     
    491518    pjsip_inv_session *inv; 
    492519    pjsip_msg *msg = rdata->msg_info.msg; 
    493     pj_status_t status; 
    494     pjsip_status_code st_code; 
    495520 
    496521    dlg = pjsip_rdata_get_dlg(rdata); 
     
    518543        return PJ_TRUE; 
    519544 
    520     } 
    521  
    522     /* Pass response to timer session module */ 
    523     status = pjsip_timer_process_resp(inv, rdata, &st_code); 
    524     if (status != PJ_SUCCESS) { 
    525         pjsip_event e; 
    526         pjsip_tx_data *tdata; 
    527  
    528         PJSIP_EVENT_INIT_RX_MSG(e, rdata); 
    529         inv_send_ack(inv, &e); 
    530  
    531         status = pjsip_inv_end_session(inv, st_code, NULL, &tdata); 
    532         if (tdata && status == PJ_SUCCESS) 
    533             pjsip_inv_send_msg(inv, tdata); 
    534  
    535         return PJ_TRUE; 
    536545    } 
    537546 
     
    27752784    /* Handle 401/407 challenge. */ 
    27762785    if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
    2777         (tsx->status_code == 401 || tsx->status_code == 407)) { 
    2778  
     2786        (tsx->status_code == 401 || tsx->status_code == 407)) 
     2787    { 
    27792788        pjsip_tx_data *tdata; 
    27802789         
     
    27992808            status = pjsip_inv_send_msg(inv, tdata); 
    28002809        } 
     2810    } 
     2811 
     2812    /* Process 422 response */ 
     2813    else if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
     2814             tsx->status_code == 422) 
     2815    { 
     2816        status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
     2817                                       PJ_FALSE); 
     2818    } 
    28012819 
    28022820    /* Process 2xx response */ 
    2803     } else if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
     2821    else if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
    28042822        tsx->status_code/100 == 2 && 
    28052823        e->body.tsx_state.src.rdata->msg_info.msg->body) 
    28062824    { 
     2825        status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
     2826                                       PJ_FALSE); 
    28072827        status = inv_check_sdp_in_incoming_msg(inv, tsx,  
    2808                                             e->body.tsx_state.src.rdata); 
    2809  
    2810     } else { 
    2811         /* Get/attach invite session's transaction data */ 
     2828                                             e->body.tsx_state.src.rdata); 
     2829    } 
     2830     
     2831    /* Get/attach invite session's transaction data */ 
     2832    else  
     2833    { 
    28122834        tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
    28132835        if (tsx_inv_data == NULL) { 
     
    29752997 *  - resend request on 401 or 407 response. 
    29762998 *  - terminate dialog on 408 and 481 response. 
     2999 *  - resend request on 422 response. 
    29773000 */ 
    29783001static pj_bool_t handle_uac_tsx_response(pjsip_inv_session *inv,  
     
    30553078 
    30563079        return PJ_TRUE; /* Handled */ 
     3080    } 
     3081 
     3082    /* Handle session timer 422 response. */ 
     3083    else if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
     3084             tsx->status_code == PJSIP_SC_SESSION_TIMER_TOO_SMALL)  
     3085    { 
     3086        handle_timer_response(inv, e->body.tsx_state.src.rdata,  
     3087                              PJ_FALSE); 
     3088 
     3089        return PJ_TRUE; /* Handled */ 
    30573090 
    30583091    } else { 
     
    31423175        } 
    31433176 
     3177    } else if (tsx->state == PJSIP_TSX_STATE_COMPLETED && 
     3178               tsx->status_code == PJSIP_SC_SESSION_TIMER_TOO_SMALL)  
     3179    { 
     3180        /* Handle session timer 422 response: 
     3181         * Resend the request with requested session timer setting. 
     3182         */ 
     3183        status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
     3184                                       PJ_TRUE); 
     3185 
    31443186    } else if (PJSIP_IS_STATUS_IN_CLASS(tsx->status_code, 600)) { 
    31453187        /* Global error */ 
     
    32133255        case PJSIP_TSX_STATE_COMPLETED: 
    32143256            if (tsx->status_code/100 == 2) { 
    3215                  
     3257 
    32163258                /* This should not happen. 
    32173259                 * When transaction receives 2xx, it should be terminated 
    32183260                 */ 
    32193261                pj_assert(0); 
     3262 
     3263                /* Process session timer response. */ 
     3264                status = handle_timer_response(inv, 
     3265                                               e->body.tsx_state.src.rdata, 
     3266                                               PJ_TRUE); 
     3267                if (status != PJ_SUCCESS) 
     3268                    break; 
     3269 
    32203270                inv_set_state(inv, PJSIP_INV_STATE_CONNECTING, e); 
    32213271     
     
    32353285            if (tsx->status_code/100 == 2) { 
    32363286                /* This must be receipt of 2xx response */ 
     3287 
     3288                /* Process session timer response. */ 
     3289                status = handle_timer_response(inv, 
     3290                                               e->body.tsx_state.src.rdata, 
     3291                                               PJ_TRUE); 
     3292                if (status != PJ_SUCCESS) 
     3293                    break; 
    32373294 
    32383295                /* Set state to CONNECTING */ 
     
    33873444                inv_set_state(inv, PJSIP_INV_STATE_CONNECTING, e); 
    33883445                if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG) { 
     3446                    pj_status_t status; 
     3447 
     3448                    /* Process session timer response. */ 
     3449                    status = handle_timer_response(inv,  
     3450                                                   e->body.tsx_state.src.rdata, 
     3451                                                   PJ_TRUE); 
     3452                    if (status != PJ_SUCCESS) 
     3453                        break; 
     3454 
    33893455                    inv_check_sdp_in_incoming_msg(inv, tsx,  
    33903456                                                  e->body.tsx_state.src.rdata); 
     
    34183484 
    34193485                if (e->body.tsx_state.type == PJSIP_EVENT_RX_MSG) { 
     3486                    pj_status_t status; 
     3487                     
     3488                    /* Process session timer response. */ 
     3489                    status = handle_timer_response(inv,  
     3490                                                   e->body.tsx_state.src.rdata, 
     3491                                                   PJ_TRUE); 
     3492                    if (status != PJ_SUCCESS) 
     3493                        break; 
     3494 
    34203495                    inv_check_sdp_in_incoming_msg(inv, tsx,  
    34213496                                                  e->body.tsx_state.src.rdata); 
     
    38863961                   tsx->status_code/100 == 2)  
    38873962        { 
     3963            pj_status_t status; 
    38883964 
    38893965            /* Re-INVITE was accepted. */ 
     3966 
     3967            /* Process session timer response. */ 
     3968            status = handle_timer_response(inv,  
     3969                                           e->body.tsx_state.src.rdata, 
     3970                                           PJ_TRUE); 
     3971            if (status != PJ_SUCCESS) 
     3972                return; 
    38903973 
    38913974            /* Process SDP */ 
     
    39464029    } else if (tsx->role == PJSIP_ROLE_UAC) { 
    39474030        /* 
    3948          * Handle 401/407/408/481 response 
     4031         * Handle 401/407/408/481/422 response 
    39494032         */ 
    39504033        handle_uac_tsx_response(inv, e); 
     
    39934076    } else if (tsx->role == PJSIP_ROLE_UAC) { 
    39944077        /* 
    3995          * Handle 401/407/408/481 response 
     4078         * Handle 401/407/408/481/422 response 
    39964079         */ 
    39974080        handle_uac_tsx_response(inv, e); 
Note: See TracChangeset for help on using the changeset viewer.