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

Examples

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

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

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

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

Parameters

The CIDR block to subtract from

The CIDR block to subtract

Return Type

Array of CIDR blocks covering a minus b