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

  1. Pass an IPv4 subnet mask (e.g. 255.255.255.0).
  2. Derive the mask from an IPv4 CIDR (e.g. 24 -> 255.255.255.0).
  3. 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

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


AI-assisted analysis of TechnitiumSoftware/DnsServer@d0484b6c1e (2026-08-13). Data as JSON: /api/errors/59f047e5938e9b05. Report an issue: GitHub.