public static IPEndPoint GetChangedAddressAttribute(StunMessage5389 response)
        {
            var changedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);

            if (changedAddressAttribute == null)
            {
                return(null);
            }

            var address = (ChangedAddressAttribute)changedAddressAttribute.Value;

            return(new IPEndPoint(address.Address, address.Port));
        }
        public static IPEndPoint GetMappedAddressAttribute(StunMessage5389 response)
        {
            var mappedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);

            if (mappedAddressAttribute == null)
            {
                return(null);
            }

            var mapped = (MappedAddressAttribute)mappedAddressAttribute.Value;

            return(new IPEndPoint(mapped.Address, mapped.Port));
        }
        public static IPEndPoint?GetXorMappedAddressAttribute(this StunMessage5389 response)
        {
            var mappedAddressAttribute =
                response.Attributes.FirstOrDefault(t => t.Type == AttributeType.XorMappedAddress) ??
                response.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);

            if (mappedAddressAttribute is null)
            {
                return(null);
            }

            var mapped = (AddressStunAttributeValue)mappedAddressAttribute.Value;

            return(new IPEndPoint(mapped.Address !, mapped.Port));
        }
        public static IPEndPoint?GetOtherAddressAttribute(this StunMessage5389 response)
        {
            var addressAttribute =
                response.Attributes.FirstOrDefault(t => t.Type == AttributeType.OtherAddress) ??
                response.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);

            if (addressAttribute is null)
            {
                return(null);
            }

            var address = (AddressStunAttributeValue)addressAttribute.Value;

            return(new IPEndPoint(address.Address !, address.Port));
        }
Example #5
0
        private async Task <StunResult5389> BindingTestBaseAsync(IPEndPoint remote, bool notifyChanged, CancellationToken token)
        {
            BindingTestResult res;
            var test = new StunMessage5389 {
                StunMessageType = StunMessageType.BindingRequest
            };

            var(response1, _, local1) = await TestAsync(test, remote, remote, token);

            var mappedAddress1 = AttributeExtensions.GetXorMappedAddressAttribute(response1);
            var otherAddress   = AttributeExtensions.GetOtherAddressAttribute(response1);
            var local          = local1 == null ? null : new IPEndPoint(local1, LocalEndPoint.Port);

            if (response1 == null)
            {
                res = BindingTestResult.Fail;
            }
            else if (mappedAddress1 == null)
            {
                res = BindingTestResult.UnsupportedServer;
            }
            else
            {
                res = BindingTestResult.Success;
            }

            if (notifyChanged)
            {
                _bindingSubj.OnNext(res);
                PubSubj.OnNext(mappedAddress1);
            }
            LocalSubj.OnNext(LocalEndPoint);

            return(new StunResult5389
            {
                BindingTestResult = res,
                LocalEndPoint = local,
                PublicEndPoint = mappedAddress1,
                OtherEndPoint = otherAddress
            });
        }
Example #6
0
        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);
            }
        }