1

在 PostgreSQL 中,我需要找到一种方法将 IPv6 子网分成两半,即。计算共同构成输入子网的两个 IPv6 地址,如下所示:

"1::/64" should give "1::/65" and "1:0:0:0:8000::/65"

知道怎么做吗?我有这个用于 IPv4 的函数,但它使用的算法不适用于 128 位数字(net_ip 是要拆分的子网地址):

SELECT * INTO STRICT net_old FROM subnet WHERE subnet_i = _subnet_i;
mask := masklen(net_old.net_ip);
nsize := 2^(31 - mask);
_addr_new_1 := set_masklen(net_old.net_ip, mask + 1);
_addr_new_2 := set_masklen(net_old.net_ip, mask + 1) + nsize;
4

1 回答 1

0

我想我在 PgPL/SQL 中找到了一个解决方案,完整的功能,它适用于 IPv4 和 IPv6:

CREATE OR REPLACE FUNCTION cidr_split_subnet(
  _subnet cidr,
  OUT _addr_low cidr,
  OUT _addr_hi cidr
) AS $$

BEGIN

_addr_low := set_masklen(_subnet, masklen(_subnet) + 1);
_addr_hi  := set_masklen(_subnet | ~netmask(_addr_low) - 1 , masklen(_addr_low));

END;

$$ LANGUAGE 'plpgsql';

例子:

=> SELECT cidr_split_subnet('1::/64');
     cidr_split_subnet     
---------------------------
 (1::/65,1::8000:0:0:0/65)

=> SELECT cidr_split_subnet('192.168/16');
         cidr_split_subnet         
-----------------------------------
 (192.168.0.0/17,192.168.128.0/17)
于 2014-05-22T08:03:37.493 回答