function cidrv6Subtract
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.

Examples

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

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

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

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::"]);

Parameters

The CIDR block to subtract from

The CIDR block to subtract

Return Type

Array of CIDR blocks covering a minus b