在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;
答案 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)