private void SIPTCPMessageReceived(SIPChannel channel, SIPEndPoint remoteEndPoint, byte[] buffer) { if (m_connectionFailures.ContainsKey(remoteEndPoint.GetIPEndPoint().ToString())) { m_connectionFailures.Remove(remoteEndPoint.GetIPEndPoint().ToString()); } if (m_connectionFailureStrikes.ContainsKey(remoteEndPoint.GetIPEndPoint().ToString())) { m_connectionFailureStrikes.Remove(remoteEndPoint.GetIPEndPoint().ToString()); } SIPMessageReceived?.Invoke(channel, remoteEndPoint, buffer); }
public SIPURI(SIPSchemesEnum scheme, SIPEndPoint sipEndPoint) { Scheme = scheme; Host = sipEndPoint.GetIPEndPoint().ToString(); if (sipEndPoint.Protocol != SIPProtocolsEnum.udp) { Parameters.Set(m_uriParamTransportKey, sipEndPoint.Protocol.ToString()); } }
/// <summary> /// This constructor is used by server user agents or SIP elements acting in a server user agent role. When /// acting as a server user agent the local fields are contained in the To header and the remote fields are /// in the From header. /// </summary> public SIPDialogue( UASInviteTransaction uasInviteTransaction, string owner, string adminMemberId) { Id = Guid.NewGuid(); CallId = uasInviteTransaction.TransactionRequest.Header.CallId; RouteSet = (uasInviteTransaction.TransactionFinalResponse != null && uasInviteTransaction.TransactionFinalResponse.Header.RecordRoutes != null) ? uasInviteTransaction.TransactionFinalResponse.Header.RecordRoutes.Reversed() : null; LocalUserField = uasInviteTransaction.TransactionFinalResponse.Header.To.ToUserField; LocalTag = uasInviteTransaction.TransactionFinalResponse.Header.To.ToTag; RemoteUserField = uasInviteTransaction.TransactionFinalResponse.Header.From.FromUserField; RemoteTag = uasInviteTransaction.TransactionFinalResponse.Header.From.FromTag; CSeq = uasInviteTransaction.TransactionRequest.Header.CSeq; CDRId = uasInviteTransaction.CDR.CDRId; Owner = owner; AdminMemberId = adminMemberId; ContentType = uasInviteTransaction.TransactionFinalResponse.Header.ContentType; SDP = uasInviteTransaction.TransactionFinalResponse.Body; RemoteSDP = uasInviteTransaction.TransactionRequest.Body; Inserted = DateTimeOffset.UtcNow; Direction = SIPCallDirection.In; //DialogueId = GetDialogueId(CallId, LocalTag, RemoteTag); RemoteTarget = new SIPURI(uasInviteTransaction.TransactionRequest.URI.Scheme, SIPEndPoint.ParseSIPEndPoint(uasInviteTransaction.RemoteEndPoint.ToString())); ProxySendFrom = uasInviteTransaction.TransactionRequest.Header.ProxyReceivedOn; if (uasInviteTransaction.TransactionRequest.Header.Contact != null && uasInviteTransaction.TransactionRequest.Header.Contact.Count > 0) { RemoteTarget = uasInviteTransaction.TransactionRequest.Header.Contact[0].ContactURI.CopyOf(); if (!uasInviteTransaction.TransactionRequest.Header.ProxyReceivedFrom.IsNullOrBlank()) { // Setting the Proxy-ReceivedOn header is how an upstream proxy will let an agent know it should mangle the contact. // Don't mangle private contacts if there is a Record-Route header. If a proxy is putting private IP's in a Record-Route header that's its problem. if (RouteSet == null && IPSocket.IsPrivateAddress(RemoteTarget.Host)) { SIPEndPoint remoteUASSIPEndPoint = SIPEndPoint.ParseSIPEndPoint(uasInviteTransaction.TransactionRequest.Header.ProxyReceivedFrom); RemoteTarget.Host = remoteUASSIPEndPoint.GetIPEndPoint().ToString(); } } } }
public void Send2xxAckRequest(string content, string contentType) { var sipResponse = m_transactionFinalResponse; if (sipResponse.Header.To != null) { m_remoteTag = sipResponse.Header.To.ToTag; } SIPURI ackURI = m_transactionRequest.URI; if (sipResponse.Header.Contact != null && sipResponse.Header.Contact.Count > 0) { ackURI = sipResponse.Header.Contact[0].ContactURI; // Don't mangle private contacts if there is a Record-Route header. If a proxy is putting private IP's in a Record-Route header that's its problem. if ((sipResponse.Header.RecordRoutes == null || sipResponse.Header.RecordRoutes.Length == 0) && IPSocket.IsPrivateAddress(ackURI.Host) && !sipResponse.Header.ProxyReceivedFrom.IsNullOrBlank()) { // Setting the Proxy-ReceivedOn header is how an upstream proxy will let an agent know it should mangle the contact. SIPEndPoint remoteUASSIPEndPoint = SIPEndPoint.ParseSIPEndPoint(sipResponse.Header.ProxyReceivedFrom); ackURI.Host = remoteUASSIPEndPoint.GetIPEndPoint().ToString(); } } // ACK for 2xx response needs to be a new transaction and gets routed based on SIP request fields. var ackRequest = GetNewTransactionACKRequest(sipResponse, ackURI, LocalSIPEndPoint); if (content.NotNullOrBlank()) { ackRequest.Body = content; ackRequest.Header.ContentLength = ackRequest.Body.Length; ackRequest.Header.ContentType = contentType; } base.SendRequest(ackRequest); }
/// <summary> /// This constructor is used to create non-INVITE dialogues for example the dialogues used in SIP event interactions /// where the dialogue is created based on a SUBSCRIBE request. /// </summary> public SIPDialogue( SIPRequest nonInviteRequest, string owner, string adminMemberId, string toTag) { Id = Guid.NewGuid(); CallId = nonInviteRequest.Header.CallId; RouteSet = (nonInviteRequest.Header.RecordRoutes != null) ? nonInviteRequest.Header.RecordRoutes.Reversed() : null; RemoteUserField = nonInviteRequest.Header.From.FromUserField; RemoteTag = nonInviteRequest.Header.From.FromTag; LocalUserField = nonInviteRequest.Header.To.ToUserField; LocalUserField.Parameters.Set("tag", toTag); LocalTag = toTag; CSeq = nonInviteRequest.Header.CSeq; Owner = owner; AdminMemberId = adminMemberId; Inserted = DateTimeOffset.UtcNow; Direction = SIPCallDirection.Out; // Set the dialogue remote target and take care of mangling if an upstream proxy has indicated it's required. RemoteTarget = nonInviteRequest.Header.Contact[0].ContactURI; ProxySendFrom = nonInviteRequest.Header.ProxyReceivedOn; if (!nonInviteRequest.Header.ProxyReceivedFrom.IsNullOrBlank()) { // Setting the Proxy-ReceivedOn header is how an upstream proxy will let an agent know it should mangle the contact. // Don't mangle private contacts if there is a Record-Route header. If a proxy is putting private IP's in a Record-Route header that's its problem. if (RouteSet == null && IPSocket.IsPrivateAddress(RemoteTarget.Host)) { SIPEndPoint remoteUASIPEndPoint = SIPEndPoint.ParseSIPEndPoint(nonInviteRequest.Header.ProxyReceivedFrom); RemoteTarget.Host = remoteUASIPEndPoint.GetIPEndPoint().ToString(); } } }
public void AckRecognitionUnitTest() { SIPTransport clientTransport = null; SIPTransport serverTransport = null; try { SIPTransactionEngine clientEngine = new SIPTransactionEngine(); // Client side of the INVITE. SIPEndPoint clientEndPoint = new SIPEndPoint(SIPProtocolsEnum.udp, new IPEndPoint(IPAddress.Loopback, 12013)); clientTransport = new SIPTransport(MockSIPDNSManager.Resolve, clientEngine, new SIPUDPChannel(clientEndPoint.GetIPEndPoint()), false); SetTransportTraceEvents(clientTransport); SIPTransactionEngine serverEngine = new SIPTransactionEngine(); // Server side of the INVITE. UASInviteTransaction serverTransaction = null; SIPEndPoint serverEndPoint = new SIPEndPoint(new IPEndPoint(IPAddress.Loopback, 12014)); serverTransport = new SIPTransport(MockSIPDNSManager.Resolve, serverEngine, new SIPUDPChannel(serverEndPoint.GetIPEndPoint()), false); SetTransportTraceEvents(serverTransport); serverTransport.SIPTransportRequestReceived += (localEndPoint, remoteEndPoint, sipRequest) => { Console.WriteLine("Server Transport Request In: " + sipRequest.Method + "."); serverTransaction = serverTransport.CreateUASTransaction(sipRequest, remoteEndPoint, localEndPoint, null); SetTransactionTraceEvents(serverTransaction); serverTransaction.GotRequest(localEndPoint, remoteEndPoint, sipRequest); }; SIPURI dummyURI = SIPURI.ParseSIPURI("sip:dummy@" + serverEndPoint); SIPRequest inviteRequest = GetDummyINVITERequest(dummyURI); inviteRequest.LocalSIPEndPoint = clientTransport.GetDefaultTransportContact(SIPProtocolsEnum.udp); // Send the invite to the server side. UACInviteTransaction clientTransaction = new UACInviteTransaction(clientTransport, inviteRequest, serverEndPoint, clientEndPoint, null); SetTransactionTraceEvents(clientTransaction); clientEngine.AddTransaction(clientTransaction); clientTransaction.SendInviteRequest(serverEndPoint, inviteRequest); Thread.Sleep(500); Assert.IsTrue(clientTransaction.TransactionState == SIPTransactionStatesEnum.Completed, "Client transaction in incorrect state."); Assert.IsTrue(serverTransaction.TransactionState == SIPTransactionStatesEnum.Confirmed, "Server transaction in incorrect state."); } finally { if (clientTransport != null) { clientTransport.Shutdown(); } if (serverTransport != null) { serverTransport.Shutdown(); } } }