{"record":{"id":"59f047e5938e9b05","repo":"TechnitiumSoftware/DnsServer","slug":"the-address-must-be-an-ipv4-address-subnetmask","errorCode":null,"errorMessage":"The address must be an IPv4 address: {subnetMask}","messagePattern":"The address must be an IPv4 address: (.+?)","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"DnsServerCore/Dhcp/Scope.cs","lineNumber":1441,"sourceCode":"                _lastModified = utcNow;\n\n            return expiredLeases;\n        }\n\n        #endregion\n\n        #region public\n\n        public void ChangeNetwork(IPAddress startingAddress, IPAddress endingAddress, IPAddress subnetMask)\n        {\n            if (startingAddress.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + startingAddress.ToString(), nameof(startingAddress));\n\n            if (endingAddress.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + endingAddress.ToString(), nameof(endingAddress));\n\n            if (subnetMask.AddressFamily != AddressFamily.InterNetwork)\n                throw new ArgumentException(\"The address must be an IPv4 address: \" + subnetMask.ToString(), nameof(subnetMask));\n\n            uint startingAddressNumber = startingAddress.ConvertIpToNumber();\n            uint endingAddressNumber = endingAddress.ConvertIpToNumber();\n\n            if (startingAddressNumber >= endingAddressNumber)\n                throw new ArgumentException(\"Ending address must be greater than starting address.\");\n\n            _startingAddress = startingAddress;\n            _endingAddress = endingAddress;\n            _subnetMask = subnetMask;\n\n            //compute other parameters\n            uint subnetMaskNumber = _subnetMask.ConvertIpToNumber();\n            uint networkAddressNumber = startingAddressNumber & subnetMaskNumber;\n            uint broadcastAddressNumber = networkAddressNumber | ~subnetMaskNumber;\n\n            if (networkAddressNumber == startingAddressNumber)\n                throw new ArgumentException(\"Starting address cannot be same as the network address.\");","sourceCodeStart":1423,"sourceCodeEnd":1459,"githubUrl":"https://github.com/TechnitiumSoftware/DnsServer/blob/d0484b6c1e7439cdc53d67d81e9c876cda2ad756/DnsServerCore/Dhcp/Scope.cs#L1423-L1459","documentation":"Third guard in ChangeNetwork: subnetMask must be IPv4. Throws ArgumentException(nameof(subnetMask)) when its AddressFamily != InterNetwork.","triggerScenarios":"Calling scope.ChangeNetwork(...) with a subnetMask that is not IPv4 (e.g. an IPv6 prefix).","commonSituations":"Passing an IPv6 prefix length/address as the mask. Mistakenly supplying the prefix bits as an IPv6 address. Mismatched family between addresses and mask.","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."],"exampleFix":"// before\nscope.ChangeNetwork(Parse('192.168.1.100'), Parse('192.168.1.200'), IPAddress.Parse('ffff:ffff:ffff:ffff::'));\n// after\nscope.ChangeNetwork(Parse('192.168.1.100'), Parse('192.168.1.200'), IPAddress.Parse('255.255.255.0'));","handlingStrategy":"validation","validationCode":"if (subnetMask.AddressFamily != AddressFamily.InterNetwork)\n    throw new ArgumentException(\"subnetMask must be IPv4\", nameof(subnetMask));","typeGuard":"static bool IsIPv4Mask(IPAddress a) => a.AddressFamily == AddressFamily.InterNetwork;","tryCatchPattern":"try { scope.ChangeNetwork(start, end, mask); }\ncatch (ArgumentException ex) when (ex.ParamName == \"subnetMask\")\n{ /* supply an IPv4 mask (e.g. 255.255.255.0), retry */ }","preventionTips":["Convert CIDR prefix to an IPv4 mask before calling.","Keep all three ChangeNetwork arguments IPv4.","Reject mixed-family configs at import time."],"tags":["dhcp","scope","ipv4","validation"],"backgroundTag":null,"analyzedSha":"d0484b6c1e7439cdc53d67d81e9c876cda2ad756","analyzedAt":"2026-08-13T22:57:35.508Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}