function cidrv4Merge
cidrv4Merge(cidrs: readonly Cidrv4[]): Cidrv4[]

Merges IPv4 CIDR blocks into the minimal covering set.

Takes an array of possibly overlapping, adjacent, or redundant CIDR blocks and returns the minimal set of non-overlapping CIDR prefix blocks covering the exact same address space.

The result matches the dialect of the inputs. When they disagree, it is in MaskedCidrv4 form (ADR 0006).

Examples

Compact a firewall allowlist

import { assertEquals } from "@std/assert";
import { cidrv4Merge, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4";

const rules = [
  parseCidrv4("10.0.1.0/24"),
  parseCidrv4("10.0.0.0/24"),
  parseCidrv4("10.0.0.128/25"),
];
const compacted = cidrv4Merge(rules);
assertEquals(compacted.map(stringifyCidrv4), ["10.0.0.0/23"]);

Aggregate routes

import { assertEquals } from "@std/assert";
import { cidrv4Merge, parseCidrv4, stringifyCidrv4 } from "@hertzg/ip/cidrv4";

const routes = [
  parseCidrv4("198.51.100.0/25"),
  parseCidrv4("198.51.100.128/26"),
  parseCidrv4("198.51.100.192/26"),
  parseCidrv4("203.0.113.0/24"),
];
assertEquals(cidrv4Merge(routes).map(stringifyCidrv4), [
  "198.51.100.0/24",
  "203.0.113.0/24",
]);

Masked blocks merge to masked blocks

import { assertEquals } from "@std/assert";
import { cidrv4Merge, stringifyCidrv4 } from "@hertzg/ip/cidrv4";

const halves = [
  { address: 167772160, mask: 0xFFFFFF80 },
  { address: 167772288, mask: 0xFFFFFF80 },
];
assertEquals(cidrv4Merge(halves).map(stringifyCidrv4), ["10.0.0.0/255.255.255.0"]);

Parameters

cidrs: readonly Cidrv4[]

The CIDR blocks to merge

Return Type

Minimal set of non-overlapping CIDR blocks, sorted by address