PostgreSQL:如何将IPv6网络地址分成两半

时间:2014-05-19 13:48:06

标签: postgresql networking split ipv6 inet

在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;

1 个答案:

答案 0 :(得分: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)