<div dir="ltr">Hi,<div><br></div><div>I am confused by the TM reply processing logic in a particular scenario. For example, if an INVITE transaction has had a final reply (let's assume 500 Error in this case). Now, if a 200 OK comes through the proxy to accept the call then according to the code below, the relay will be relayed to the calling party.... why? This will also cause the tm transaction state to change from state 5 (deleted) to state (4) confirmed.... Is this correct? (a result of this scenario is that the A UAC will receive a 500 followed by a 200....)</div>
<div><br></div><div><br></div><div><div>static enum rps t_should_relay_response( struct cell *Trans , int new_code,</div><div><span class="" style="white-space:pre">     </span>int branch , int *should_store, int *should_relay,</div>
<div><span class="" style="white-space:pre">    </span>struct cancel_info *cancel_data, struct sip_msg *reply )</div><div>{</div><div><span class="" style="white-space:pre">   </span>int branch_cnt;</div><div><span class="" style="white-space:pre">    </span>int picked_code;</div>
<div><span class="" style="white-space:pre">    </span>int new_branch;</div><div><span class="" style="white-space:pre">    </span>int inv_through;</div><div><span class="" style="white-space:pre">   </span>int extra_flags;</div>
<div><span class="" style="white-space:pre">    </span>int i;</div><div><span class="" style="white-space:pre">     </span>int replies_dropped;</div><div><br></div><div><span class="" style="white-space:pre">      </span>/* note: this code never lets replies to CANCEL go through;</div>
<div><span class="" style="white-space:pre">    </span>   we generate always a local 200 for CANCEL; 200s are</div><div><span class="" style="white-space:pre">    </span>   not relayed because it's not an INVITE transaction;</div>
<div><span class="" style="white-space:pre">    </span>   >= 300 are not relayed because 200 was already sent</div><div><span class="" style="white-space:pre"> </span>   out</div><div><span class="" style="white-space:pre">    </span>*/</div>
<div><span class="" style="white-space:pre">    </span>DBG("->>>>>>>>> T_code=%d, new_code=%d\n",Trans->uas.status,new_code);</div><div><span class="" style="white-space:pre">     </span><font style="background-color:rgb(255,0,0)" color="#000000">inv_through=new_code>=200 && new_code<300 && is_invite(Trans);</font></div>
<div><span class="" style="white-space:pre">    </span><span style="background-color:rgb(255,0,0)">/* if final response sent out, allow only INVITE 2xx  */</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">     </span>if ( Trans->uas.status >= 200 ) {</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>if (inv_through) {</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>DBG("DBG: t_should_relay_response: 200 INV after final sent\n");</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>*should_store=0;</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                  </span>Trans->uac[branch].last_received=new_code;</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>*should_relay=branch;</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                     </span>return RPS_PUSHED_AFTER_COMPLETION;</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>}</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">         </span>/* except the exception above, too late  messages will</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>   be discarded */</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">               </span>goto discard;</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">        </span>}</span></div><div><span style="background-color:rgb(255,0,0)"><br></span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">       </span>/* if final response received at this branch, allow only INVITE 2xx */</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">        </span>if (Trans->uac[branch].last_received>=200</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                   </span>&& !(inv_through && Trans->uac[branch].last_received<300)) {</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>/* don't report on retransmissions */</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">         </span>if (Trans->uac[branch].last_received==new_code) {</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>DBG("DEBUG: final reply retransmission\n");</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                     </span>goto discard;</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>}</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">         </span>/* if you FR-timed-out, faked a local 408  and 487 came or</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span> *  faked a CANCEL on a non-replied branch don't</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">             </span> * report on it either */</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>if ((Trans->uac[branch].last_received==487) || </span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                               </span>(Trans->uac[branch].last_received==408 && new_code==487)) {</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>DBG("DEBUG: %d came for a %d branch (ignored)\n",</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                                       </span>new_code, Trans->uac[branch].last_received);</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>goto discard;</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">             </span>}</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>/* this looks however how a very strange status rewrite attempt;</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">          </span> * report on it */</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                </span>LOG(L_ERR, "ERROR: t_should_relay_response: status rewrite by UAS: "</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                    </span>"stored: %d, received: %d\n",</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">                        </span>Trans->uac[branch].last_received, new_code );</span></div><div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">          </span>goto discard;</span></div>
<div><span style="background-color:rgb(255,0,0)"><span class="" style="white-space:pre">        </span>}</span></div><div><br></div><div><br></div><div><span class="" style="white-space:pre">   </span>/* no final response sent yet */</div>
</div></div>