bool WaitingForInvite::InviteRequest( DialogTracker& impl, SipMessage& request, TransactionDirectionality direction, const char* address, int port ) const { bool bTrackRequestResponse = false; impl.setTransactionDirectionality( direction ); // check is another sipX is already taking care of NAT traversing this session. if( !impl.isRequestAlreadyHandledByOther( request ) ) { bTrackRequestResponse = true; impl.markRequestAsHandledByUs( request ); // check if the INVITE contains an SDP offer if( request.hasSdpBody() ) { // request contains an SDP offer. Check if the SDP or the or the actual // location of the two endpoints impose the use of a media relay. if( impl.doesEndpointsLocationImposeMediaRelay() ) { OsSysLog::add(FAC_NAT,PRI_DEBUG,"'%s:%s' - Media relay required", impl.name(), impl.GetCurrentState()->name() ); impl.setMediaRelayRequiredFlag(); } else { OsSysLog::add(FAC_NAT,PRI_DEBUG,"'%s:%s' - Media relay not required", impl.name(), impl.GetCurrentState()->name() ); impl.clearMediaRelayRequiredFlag(); } impl.ProcessMediaOffer( request, INITIAL_OFFER_ANSWER ); ChangeState( impl, impl.pWaitingForMediaAnswer ); } else { // request does contains an SDP offer. This INVITE may be used to set up a 3PCC // call. Play it safe and impose the use of a media relay to guarantee speechpath impl.setMediaRelayRequiredFlag(); ChangeState( impl, impl.pWaitingForMediaOffer ); } } else { // this particular session is already being handled by another sipX i nthe network. // That sipX is taking care of overcoming the NATs that separate the endpoints involved // in that session. There isn't much value we can add here so just bail on tracking that // session. ChangeState( impl, impl.pMoribund ); } return bTrackRequestResponse; }
bool DialogTrackerState::InviteRequest( DialogTracker& impl, SipMessage& request, TransactionDirectionality direction, const char* address, int port ) const { if( !impl.isRequestAlreadyHandledByOther( request ) ) { impl.markRequestAsHandledByUs( request ); } if( impl.isARetransmittedRequest( request ) ) { impl.restoreSdpBodyOfRetransmittedRequest( request ); } else { OsSysLog::add(FAC_NAT,PRI_WARNING,"'%s': Received unexpected event InviteRequest while in state '%s'", impl.name(), impl.GetCurrentState()->name() ); } return true; }