cidrv4Subtract(): Cidrv4[]
Subtracts one IPv4 CIDR block from another.
Returns the minimal set of CIDR blocks representing all IP addresses
in a but not in b. The algorithm recursively splits a into two
halves at prefix+1, keeping the non-overlapping half and recursing
into the overlapping half.
The result matches the dialect of the inputs. When they disagree, it is
in MaskedCidrv4 form (ADR 0006). A non-contiguous mask on b
flows through unchecked (ADR 0006), and since no aligned block can then
contain or avoid it short of a single address, the result is a list of
up to one entry per address of a.
Carve a /28 from a /24
Carve a /28 from a /24
import { assertEquals } from "@std/assert"; import { cidrv4Subtract, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const result = cidrv4Subtract( parseCidrv4("192.168.1.0/24"), parseCidrv4("192.168.1.0/28"), ); assertEquals(result.map(stringifyCidrv4), [ "192.168.1.128/25", "192.168.1.64/26", "192.168.1.32/27", "192.168.1.16/28", ]);
No overlap -- original returned unchanged
No overlap -- original returned unchanged
import { assertEquals } from "@std/assert"; import { cidrv4Subtract, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const result = cidrv4Subtract( parseCidrv4("10.0.0.0/24"), parseCidrv4("172.16.0.0/24"), ); assertEquals(result.map(stringifyCidrv4), ["10.0.0.0/24"]);
Full containment -- empty result
Full containment -- empty result
import { assertEquals } from "@std/assert"; import { cidrv4Subtract, parseCidrv4 } from "@hertzg/ip/cidrv4"; const result = cidrv4Subtract( parseCidrv4("192.168.1.0/28"), parseCidrv4("192.168.1.0/24"), ); assertEquals(result, []);
Mixed dialects subtract to masked blocks
Mixed dialects subtract to masked blocks
import { assertEquals } from "@std/assert"; import { cidrv4Subtract, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4"; const result = cidrv4Subtract( parseCidrv4("192.168.1.0/25"), { address: 3232235776, mask: 0xFFFFFFC0 }, ); assertEquals(result.map(stringifyCidrv4), ["192.168.1.64/255.255.255.192"]);
Cidrv4[]
Array of CIDR blocks covering a minus b