Repository navigation
Bitvantage.InternetProtocol.IPNetworkExtensions 1.1.0
Adds subnet sizing, variable-length subnet masking (VLSM) allocation, and ContainsStrict, an address test that gives the same answer on every version of .NET. The release only adds members, so code written for 1.0.0 builds unchanged.
dotnet add package Bitvantage.InternetProtocol.IPNetworkExtensions --version 1.1.0Address planning
IPNetwork.GetPrefixLengthForAddressesgives the longest prefix length whose networks hold a number of addresses. It counts every address, whereGetPrefixLengthForHostsleaves out the ones a host can't use, which differ between IPv4 and IPv6: 256 addresses need a /24 or a /120, and 256 hosts a /23 or a /119.IPNetwork.GetPrefixLengthForSubnetssizes a network for a number of subnets of one prefix length, such as 300 /64s, which need a /55, or for one subnet of each of several prefix lengths, such as a /23, a /24 and a /26, which need a /22.AllocateSubnetsandTryAllocateSubnetslay out a VLSM plan inside a network, around any networks already allocated, and return the subnets in the order requested. Each subnet goes in the smallest free block that holds it, so the subnets fit whenever any arrangement of them fits. A subnet never moves once it is placed, so a plan grows by passing back the subnets it already has.
var block = IPNetwork.ParseStrict("10.0.0.0/22");
var vlans = block.AllocateSubnets([26, 24, 23]); // 10.0.0.0/26, 10.0.1.0/24, 10.0.2.0/23
var added = block.AllocateSubnets([25], vlans); // 10.0.0.128/25IPv4-mapped addresses
ContainsStricttests whether an address is in a network while keeping IPv4 and IPv6 apart, as the subnet and supernet tests do, with the same answer on every version of .NET. The built-inIPNetwork.Containskeeps them apart on .NET 8 and maps IPv4-mapped IPv6 addresses such as::ffff:10.1.2.3to IPv4 from .NET 9 on. On .NET 9 and .NET 10 it also tests them wrongly against IPv6 networks (dotnet/runtime#131861, fixed in .NET 11), so the public client::ffff:1.2.3.4is infc00::/7, one of the private networks.Unmap()on a network converts an IPv4-mapped IPv6 network, such as::ffff:10.0.0.0/104, to the IPv4 network10.0.0.0/8. It is the network form ofIPAddress.Unmap.
Fixes
- The migration guide mapped
NetworkPrefix.Contains(IPAddress)to the built-inIPNetwork.Contains.NetworkPrefixkept IPv4 and IPv6 apart and the built-in does not from .NET 9 on, so code migrated that way compiles but can match an IPv4-mapped address against IPv4 networks. The guide now maps it toContainsStrict. If you migrated fromNetworkPrefixwith 1.0.0, check your calls toContains(IPAddress).