cidrv6Subtract(): Cidrv6[]
Subtracts one IPv6 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 MaskedCidrv6 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 /48 from a /32
Carve a /48 from a /32
import { assertEquals } from "@std/assert"; import { cidrv6Subtract, parseCidrv6, stringifyCidrv6 } from "@hertzg/ip/cidrv6"; const result = cidrv6Subtract( parseCidrv6("2001:db8::/32"), parseCidrv6("2001:db8::/48"), ); assertEquals(result.length, 16); assertEquals(stringifyCidrv6(result[0]), "2001:db8:8000::/33");
No overlap -- original returned unchanged
No overlap -- original returned unchanged
import { assertEquals } from "@std/assert"; import { cidrv6Subtract, parseCidrv6, stringifyCidrv6 } from "@hertzg/ip/cidrv6"; const result = cidrv6Subtract( parseCidrv6("2001:db8::/32"), parseCidrv6("2001:db9::/32"), ); assertEquals(result.map(stringifyCidrv6), ["2001:db8::/32"]);
Full containment -- empty result
Full containment -- empty result
import { assertEquals } from "@std/assert"; import { cidrv6Subtract, parseCidrv6 } from "@hertzg/ip/cidrv6"; const result = cidrv6Subtract( parseCidrv6("2001:db8::/48"), parseCidrv6("2001:db8::/32"), ); assertEquals(result, []);
Mixed dialects subtract to masked blocks
Mixed dialects subtract to masked blocks
import { assertEquals } from "@std/assert"; import { cidrv6Subtract, parseCidrv6, stringifyCidrv6 } from "@hertzg/ip/cidrv6"; const result = cidrv6Subtract( parseCidrv6("2001:db8::/32"), { address: 0x20010db8n << 96n, mask: 0xFFFFFFFF800000000000000000000000n }, ); assertEquals(result.map(stringifyCidrv6), ["2001:db8:8000::/ffff:ffff:8000::"]);
Cidrv6[]
Array of CIDR blocks covering a minus b