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); }
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); }
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); }