@@ -3525,7 +3525,6 @@ int nua_update_server_init(nua_server_request_t *sr)
3525
3525
if (sr -> sr_sdp ) { /* Check for overlap */
3526
3526
nua_client_request_t * cr ;
3527
3527
nua_server_request_t * sr0 ;
3528
- int overlap = 0 ;
3529
3528
3530
3529
/*
3531
3530
A UAS that receives an UPDATE before it has generated a final
@@ -3542,18 +3541,29 @@ int nua_update_server_init(nua_server_request_t *sr)
3542
3541
reject the UPDATE with a 500 response, and MUST include a Retry-After
3543
3542
header field with a randomly chosen value between 0 and 10 seconds.
3544
3543
*/
3545
- for (cr = nh -> nh_ds -> ds_cr ; cr ; cr = cr -> cr_next )
3546
- if ((overlap = cr -> cr_offer_sent && !cr -> cr_answer_recv ))
3544
+ for (sr0 = nh -> nh_ds -> ds_sr ; sr0 ; sr0 = sr0 -> sr_next ) {
3545
+ /* Previous INVITE has not been ACKed */
3546
+ if (sr0 -> sr_method == sip_method_invite )
3547
+ break ;
3548
+ /* Or we have sent offer but have not received an answer */
3549
+ if (sr -> sr_sdp && sr0 -> sr_offer_sent && !sr0 -> sr_answer_recv )
3547
3550
break ;
3551
+ /* Or we have received request with offer but not sent an answer */
3552
+ if (sr -> sr_sdp && sr0 -> sr_offer_recv && !sr0 -> sr_answer_sent )
3553
+ break ;
3554
+ }
3548
3555
3549
- if (!overlap )
3550
- for (sr0 = nh -> nh_ds -> ds_sr ; sr0 ; sr0 = sr0 -> sr_next )
3551
- if ((overlap = sr0 -> sr_offer_recv && !sr0 -> sr_answer_sent ))
3552
- break ;
3556
+ if (sr0 ) {
3557
+ /* Overlapping invites - RFC 3261 14.2 */
3558
+ return nua_server_retry_after (sr , 500 , "Overlapping Requests" , 0 , 10 );
3559
+ }
3560
+
3561
+ for (cr = nh -> nh_ds -> ds_cr ; cr ; cr = cr -> cr_next ) {
3562
+ if (cr -> cr_usage == sr -> sr_usage && cr -> cr_orq && cr -> cr_offer_sent )
3563
+ /* Glare - RFC 3261 14.2 and RFC 3311 section 5.2 */
3564
+ return SR_STATUS1 (sr , SIP_491_REQUEST_PENDING );
3565
+ }
3553
3566
3554
- if (nh -> nh_soa && overlap ) {
3555
- return nua_server_retry_after (sr , 500 , "Overlapping Offer/Answer" , 1 , 9 );
3556
- }
3557
3567
3558
3568
if (nh -> nh_soa &&
3559
3569
soa_set_remote_sdp (nh -> nh_soa , NULL , sr -> sr_sdp , sr -> sr_sdp_len ) < 0 ) {
0 commit comments