Ignore:
Timestamp:
Apr 16, 2012 7:50:01 AM (12 years ago)
Author:
bennylp
Message:

Re #1474: merged r4042-r4053

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r3999 r4054  
    156156    pjsip_inv_session   *inv;       /* The invite session                   */ 
    157157    pj_bool_t            sdp_done;  /* SDP negotiation done for this tsx?   */ 
     158    pj_bool_t            retrying;  /* Resend (e.g. due to 401/407)         */ 
    158159    pj_str_t             done_tag;  /* To tag in RX response with answer    */ 
    159160    pj_bool_t            done_early;/* Negotiation was done for early med?  */ 
     
    29122913             
    29132914        } else { 
     2915            struct tsx_inv_data *tsx_inv_data; 
     2916 
     2917            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     2918            if (tsx_inv_data) 
     2919                tsx_inv_data->retrying = PJ_TRUE; 
     2920 
    29142921            /* Re-send BYE. */ 
    29152922            status = pjsip_inv_send_msg(inv, tdata); 
     
    30243031 * Handle incoming response to UAC UPDATE request. 
    30253032 */ 
    3026 static void inv_handle_update_response( pjsip_inv_session *inv, 
    3027                                         pjsip_event *e) 
     3033static pj_bool_t inv_handle_update_response( pjsip_inv_session *inv, 
     3034                                             pjsip_event *e) 
    30283035{ 
    30293036    pjsip_transaction *tsx = e->body.tsx_state.tsx; 
    3030     struct tsx_inv_data *tsx_inv_data = NULL; 
     3037    struct tsx_inv_data *tsx_inv_data; 
     3038    pj_bool_t handled = PJ_FALSE; 
    30313039    pj_status_t status = -1; 
     3040 
     3041    tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     3042    pj_assert(tsx_inv_data); 
    30323043 
    30333044    /* Handle 401/407 challenge. */ 
     
    30363047    { 
    30373048        pjsip_tx_data *tdata; 
    3038          
     3049 
    30393050        status = pjsip_auth_clt_reinit_req( &inv->dlg->auth_sess,  
    30403051                                            e->body.tsx_state.src.rdata, 
     
    30543065             
    30553066        } else { 
     3067            if (tsx_inv_data) 
     3068                tsx_inv_data->retrying = PJ_TRUE; 
     3069 
    30563070            /* Re-send request. */ 
    30573071            status = pjsip_inv_send_msg(inv, tdata); 
    30583072        } 
     3073 
     3074        handled = PJ_TRUE; 
    30593075    } 
    30603076 
     
    30653081        status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
    30663082                                       PJ_FALSE); 
     3083        handled = PJ_TRUE; 
    30673084    } 
    30683085 
     
    30763093        status = inv_check_sdp_in_incoming_msg(inv, tsx,  
    30773094                                             e->body.tsx_state.src.rdata); 
     3095        handled = PJ_TRUE; 
    30783096    } 
    30793097     
     
    30893107            status = handle_timer_response(inv, e->body.tsx_state.src.rdata, 
    30903108                                           PJ_FALSE); 
    3091         } 
    3092  
    3093         tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
    3094         if (tsx_inv_data == NULL) { 
    3095             tsx_inv_data=PJ_POOL_ZALLOC_T(tsx->pool, struct tsx_inv_data); 
    3096             tsx_inv_data->inv = inv; 
    3097             tsx->mod_data[mod_inv.mod.id] = tsx_inv_data; 
    3098         } 
    3099     } 
    3100  
    3101     /* Cancel the negotiation if we don't get successful negotiation by now */ 
     3109            handled = PJ_TRUE; 
     3110        } 
     3111    } 
     3112 
     3113    /* Cancel the negotiation if we don't get successful negotiation by now, 
     3114     * unless it's authentication challenge and the request is being retried. 
     3115     */ 
    31023116    if (pjmedia_sdp_neg_get_state(inv->neg) == 
    31033117                PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && 
    3104         tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE)  
     3118        tsx_inv_data && tsx_inv_data->sdp_done == PJ_FALSE && 
     3119        !tsx_inv_data->retrying) 
    31053120    { 
    31063121        pjmedia_sdp_neg_cancel_offer(inv->neg); 
     
    31093124        tsx_inv_data->sdp_done = PJ_TRUE; 
    31103125    } 
     3126 
     3127    return handled; 
    31113128} 
    31123129 
     
    33083325              tsx->status_code == PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED))  
    33093326    { 
    3310  
    33113327        pjsip_tx_data *tdata; 
    33123328        pj_status_t status; 
     
    33303346             
    33313347        } else { 
     3348            struct tsx_inv_data *tsx_inv_data; 
     3349 
     3350            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
     3351            if (tsx_inv_data) 
     3352                tsx_inv_data->retrying = PJ_TRUE; 
     3353 
    33323354            /* Re-send request. */ 
    33333355            status = pjsip_inv_send_msg(inv, tdata); 
     
    40064028         * Handle response to outgoing UPDATE request. 
    40074029         */ 
    4008         if (handle_uac_tsx_response(inv, e) == PJ_FALSE) 
    4009             inv_handle_update_response(inv, e); 
     4030        if (inv_handle_update_response(inv, e) == PJ_FALSE) 
     4031            handle_uac_tsx_response(inv, e); 
    40104032 
    40114033    } else if (tsx->role == PJSIP_ROLE_UAS && 
     
    43634385 
    43644386            pjmedia_sdp_neg_state neg_state; 
     4387            struct tsx_inv_data *tsx_inv_data; 
     4388 
     4389            tsx_inv_data = (struct tsx_inv_data*)tsx->mod_data[mod_inv.mod.id]; 
    43654390 
    43664391            /* Outgoing INVITE transaction has failed, cancel SDP nego */ 
    43674392            neg_state = pjmedia_sdp_neg_get_state(inv->neg); 
    4368             if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER) { 
     4393            if (neg_state == PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER && 
     4394                tsx_inv_data->retrying == PJ_FALSE) 
     4395            { 
    43694396                pjmedia_sdp_neg_cancel_offer(inv->neg); 
    43704397            } 
     
    43914418         * Handle response to outgoing UPDATE request. 
    43924419         */ 
    4393         if (handle_uac_tsx_response(inv, e) == PJ_FALSE) 
    4394             inv_handle_update_response(inv, e); 
     4420        if (inv_handle_update_response(inv, e) == PJ_FALSE) 
     4421            handle_uac_tsx_response(inv, e); 
    43954422 
    43964423    } else if (tsx->role == PJSIP_ROLE_UAS && 
Note: See TracChangeset for help on using the changeset viewer.