TechnitiumSoftware/DnsServer · error · ArgumentException
The address must be an IPv4 address: {subnetMask}
Error message
The address must be an IPv4 address: {subnetMask} What it means
Third guard in ChangeNetwork: subnetMask must be IPv4. Throws ArgumentException(nameof(subnetMask)) when its AddressFamily != InterNetwork.
Source
Thrown at DnsServerCore/Dhcp/Scope.cs:1441
_lastModified = utcNow;
return expiredLeases;
}
#endregion
#region public
public void ChangeNetwork(IPAddress startingAddress, IPAddress endingAddress, IPAddress subnetMask)
{
if (startingAddress.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("The address must be an IPv4 address: " + startingAddress.ToString(), nameof(startingAddress));
if (endingAddress.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("The address must be an IPv4 address: " + endingAddress.ToString(), nameof(endingAddress));
if (subnetMask.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("The address must be an IPv4 address: " + subnetMask.ToString(), nameof(subnetMask));
uint startingAddressNumber = startingAddress.ConvertIpToNumber();
uint endingAddressNumber = endingAddress.ConvertIpToNumber();
if (startingAddressNumber >= endingAddressNumber)
throw new ArgumentException("Ending address must be greater than starting address.");
_startingAddress = startingAddress;
_endingAddress = endingAddress;
_subnetMask = subnetMask;
//compute other parameters
uint subnetMaskNumber = _subnetMask.ConvertIpToNumber();
uint networkAddressNumber = startingAddressNumber & subnetMaskNumber;
uint broadcastAddressNumber = networkAddressNumber | ~subnetMaskNumber;
if (networkAddressNumber == startingAddressNumber)
throw new ArgumentException("Starting address cannot be same as the network address.");View on GitHub (pinned to d0484b6c1e)
Solutions
- Pass an IPv4 subnet mask (e.g. 255.255.255.0).
- Derive the mask from an IPv4 CIDR (e.g. 24 -> 255.255.255.0).
- Ensure all three ChangeNetwork arguments are AddressFamily.InterNetwork.
Example fix
// before
scope.ChangeNetwork(Parse('192.168.1.100'), Parse('192.168.1.200'), IPAddress.Parse('ffff:ffff:ffff:ffff::'));
// after
scope.ChangeNetwork(Parse('192.168.1.100'), Parse('192.168.1.200'), IPAddress.Parse('255.255.255.0')); Defensive patterns
Strategy: validation
Validate before calling
if (subnetMask.AddressFamily != AddressFamily.InterNetwork)
throw new ArgumentException("subnetMask must be IPv4", nameof(subnetMask)); Type guard
static bool IsIPv4Mask(IPAddress a) => a.AddressFamily == AddressFamily.InterNetwork;
Try / catch
try { scope.ChangeNetwork(start, end, mask); }
catch (ArgumentException ex) when (ex.ParamName == "subnetMask")
{ /* supply an IPv4 mask (e.g. 255.255.255.0), retry */ } Prevention
- Convert CIDR prefix to an IPv4 mask before calling.
- Keep all three ChangeNetwork arguments IPv4.
- Reject mixed-family configs at import time.
When it happens
Trigger: Calling scope.ChangeNetwork(...) with a subnetMask that is not IPv4 (e.g. an IPv6 prefix).
Common situations: Passing an IPv6 prefix length/address as the mask. Mistakenly supplying the prefix bits as an IPv6 address. Mismatched family between addresses and mask.
Related errors
- The address must be an IPv4 address: {startingAddress}
- The address must be an IPv4 address: {endingAddress}
- Ending address must be greater than starting address.
- Starting address cannot be same as the network address.
- Ending address cannot be same as the broadcast address.
AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13).
Data as JSON: /api/errors/59f047e5938e9b05.
Report an issue: GitHub.