Пример #1
0
        private static Exception?TryParseStartEndFormat(string str, int separatorPos, out IPAddressRange result)
        {
            result = None;

            var s = str.Substring(0, separatorPos).Trim();

            if (!IPAddressUtility.TryParse(s, out var startAddress))
            {
                return(InvalidStartAddress());
            }

            s = str.Substring(separatorPos + 1).Trim();
            if (!IPAddressUtility.TryParse(s, out var endAddress))
            {
                return(InvalidEndAddress());
            }

            var addressFamily = startAddress.AddressFamily;

            if (endAddress.AddressFamily != addressFamily)
            {
                return(MismatchedStartEndFamily());
            }

            var start = new IPAddressValue(startAddress);
            var end   = new IPAddressValue(endAddress);

            if (end.CompareTo(start) < 0)
            {
                return(EndLowerThanStart());
            }

            result = new IPAddressRange(start, end, addressFamily == AddressFamily.InterNetworkV6, 0);
            return(null);
        }
Пример #2
0
        private static Exception?TryParseSingleAddressFormat(string str, out IPAddressRange result)
        {
            result = None;

            if (!IPAddressUtility.TryParse(str, out var address))
            {
                return(InvalidIPAddress());
            }

            var addressValue = new IPAddressValue(address);

            result = new IPAddressRange(addressValue, addressValue, address.AddressFamily == AddressFamily.InterNetworkV6, 0);
            return(null);
        }
Пример #3
0
        private static Exception?TryParseCidrOrAddressNetmaskFormat(string str, int separatorPos, out IPAddressRange result)
        {
            result = None;

            var s = str.Substring(0, separatorPos).Trim();

            if (!IPAddressUtility.TryParse(s, out var address))
            {
                return(InvalidIPAddress());
            }

            var addressValue = new IPAddressValue(address);

            s = str.Substring(separatorPos + 1).Trim();
            if (byte.TryParse(s, NumberStyles.None, CultureInfo.InvariantCulture, out var prefixLength))
            {
                var maxPrefixLength = address.AddressFamily == AddressFamily.InterNetworkV6 ? 128 : 32;
                if (prefixLength < 1 || prefixLength > maxPrefixLength)
                {
                    return(InvalidPrefixLength());
                }

                if (!addressValue.IsStartOfSubnet(prefixLength))
                {
                    return(InvalidSubnetBaseAddress());
                }

                result = new IPAddressRange(addressValue, addressValue.GetEndOfSubnet(prefixLength), address.AddressFamily == AddressFamily.InterNetworkV6, prefixLength);
                return(null);
            }

            // Only accept a netmask for IPv4
            if (address.AddressFamily != AddressFamily.InterNetwork)
            {
                return(InvalidPrefixLength());
            }

            if (!IPAddressUtility.TryParse(s, out var netmask))
            {
                return(InvalidPrefixLengthOrNetmask());
            }

            var addressFamily = address.AddressFamily;

            if (netmask.AddressFamily != addressFamily)
            {
                return(MismatchedNetmaskAddressFamily());
            }

            var netmaskBytes = netmask.GetAddressBytes();

            if (!TryNetmaskToCidrPrefixLength(netmaskBytes, out prefixLength))
            {
                return(InvalidNetmask());
            }

            if (!addressValue.IsStartOfSubnet(prefixLength))
            {
                return(InvalidSubnetBaseAddress());
            }

            result = new IPAddressRange(addressValue, addressValue.GetEndOfSubnet(prefixLength), false, prefixLength);
            return(null);
        }