From 2093cebc1d28a76d711ca64afa6bcc890db96845 Mon Sep 17 00:00:00 2001 From: Taketo Takashima Date: Tue, 9 Aug 2022 00:50:44 +0900 Subject: [PATCH] Added IPAddr#wildcard_mask --- lib/ipaddr.rb | 14 ++++++++++++++ test/test_ipaddr.rb | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb index 459b847..43f40ee 100644 --- a/lib/ipaddr.rb +++ b/lib/ipaddr.rb @@ -464,6 +464,20 @@ def netmask _to_string(@mask_addr) end + # Returns the wildcard mask in string format e.g. 0.0.255.255 + def wildcard_mask + case @family + when Socket::AF_INET + mask = IN4MASK ^ @mask_addr + when Socket::AF_INET6 + mask = IN6MASK ^ @mask_addr + else + raise AddressFamilyError, "unsupported address family" + end + + _to_string(mask) + end + # Returns the IPv6 zone identifier, if present. # Raises InvalidAddressError if not an IPv6 address. def zone_id diff --git a/test/test_ipaddr.rb b/test/test_ipaddr.rb index c07ee2a..7ed569d 100644 --- a/test/test_ipaddr.rb +++ b/test/test_ipaddr.rb @@ -244,6 +244,29 @@ def test_netmask assert_equal(a.netmask, "255.255.255.0") end + def test_wildcard_mask + a = IPAddr.new("192.168.1.2/1") + assert_equal(a.wildcard_mask, "127.255.255.255") + + a = IPAddr.new("192.168.1.2/8") + assert_equal(a.wildcard_mask, "0.255.255.255") + + a = IPAddr.new("192.168.1.2/16") + assert_equal(a.wildcard_mask, "0.0.255.255") + + a = IPAddr.new("192.168.1.2/24") + assert_equal(a.wildcard_mask, "0.0.0.255") + + a = IPAddr.new("192.168.1.2/32") + assert_equal(a.wildcard_mask, "0.0.0.0") + + a = IPAddr.new("3ffe:505:2::/48") + assert_equal(a.wildcard_mask, "0000:0000:0000:ffff:ffff:ffff:ffff:ffff") + + a = IPAddr.new("3ffe:505:2::/128") + assert_equal(a.wildcard_mask, "0000:0000:0000:0000:0000:0000:0000:0000") + end + def test_zone_id a = IPAddr.new("192.168.1.2") assert_raise(IPAddr::InvalidAddressError) { a.zone_id = '%ab0' }