private async Task <StunResult5389> FilteringBehaviorTestBaseAsync(CancellationToken token) { // test I var result1 = await BindingTestBaseAsync(RemoteEndPoint, true, token); try { if (result1.BindingTestResult != BindingTestResult.Success) { return(result1); } if (result1.OtherEndPoint == null || Equals(result1.OtherEndPoint.Address, RemoteEndPoint.Address) || result1.OtherEndPoint.Port == RemoteEndPoint.Port) { result1.FilteringBehavior = FilteringBehavior.UnsupportedServer; return(result1); } // test II var test2 = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest, Attributes = new[] { AttributeExtensions.BuildChangeRequest(true, true) } }; var(response2, _, _) = await TestAsync(test2, RemoteEndPoint, result1.OtherEndPoint, token); if (response2 != null) { result1.FilteringBehavior = FilteringBehavior.EndpointIndependent; return(result1); } // test III var test3 = new StunMessage5389 { StunMessageType = StunMessageType.BindingRequest, Attributes = new[] { AttributeExtensions.BuildChangeRequest(false, true) } }; var(response3, remote3, _) = await TestAsync(test3, RemoteEndPoint, RemoteEndPoint, token); if (response3 == null) { result1.FilteringBehavior = FilteringBehavior.AddressAndPortDependent; return(result1); } if (Equals(remote3.Address, RemoteEndPoint.Address) && remote3.Port != RemoteEndPoint.Port) { result1.FilteringBehavior = FilteringBehavior.AddressAndPortDependent; } else { result1.FilteringBehavior = FilteringBehavior.UnsupportedServer; } return(result1); } finally { _filteringBehaviorSubj.OnNext(result1.FilteringBehavior); } }