cidrToIPv6 static method

List<String>? cidrToIPv6(
  1. String cidr
)

Returns the IPv6 ranges for the cidr.

Implementation

static List<String>? cidrToIPv6(String cidr) {
  if (!cidr.contains('/')) return null;
  final arr = cidr.split('/');
  if (arr.length != 2 ||
      !isIPv6(arr[0]) ||
      !prefixPattern2.hasMatch(arr[1]) ||
      int.parse(arr[1]) > 128) {
    return null;
  }

  final prefix = int.parse(arr[1]);
  final parts = expandIPv6(arr[0])!.split(':');
  final bitStart = _repeat('1', prefix) + _repeat('0', 128 - prefix);
  final bitEnd = _repeat('0', prefix) + _repeat('1', 128 - prefix);
  final chunkSize = 16;

  final floors = [
    for (var i = 0; i < bitStart.length; i += chunkSize)
      bitStart.substring(i, i + chunkSize),
  ];
  final ceilings = [
    for (var i = 0; i < bitEnd.length; i += chunkSize)
      bitEnd.substring(i, i + chunkSize),
  ];

  final startIP = <String>[];
  final endIP = <String>[];

  for (var x = 0; x < 8; x++) {
    startIP.add(
      (int.parse(parts[x], radix: 16) & int.parse(floors[x], radix: 2))
          .toRadixString(16),
    );
    endIP.add(
      (int.parse(parts[x], radix: 16) | int.parse(ceilings[x], radix: 2))
          .toRadixString(16),
    );
  }

  final hexStart = expandIPv6(_joinStrings(startIP, ':'))!;
  final hexEnd = expandIPv6(_joinStrings(endIP, ':'))!;
  return [hexStart, hexEnd];
}