Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/ipaddr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -478,17 +478,26 @@ def set(addr, *family)
if addr < 0 || addr > IN4MASK
raise InvalidAddressError, "invalid address: #{@addr}"
end
if @family == Socket::AF_INET6
mask = @mask_addr & IN4MASK
end
when Socket::AF_INET6
if addr < 0 || addr > IN6MASK
raise InvalidAddressError, "invalid address: #{@addr}"
end
if @family == Socket::AF_INET
mask = (IN6MASK ^ IN4MASK) | @mask_addr
end
else
raise AddressFamilyError, "unsupported address family"
end
@addr = addr
if family[0]
@family = family[0]
end
if mask
@mask_addr = mask
end
return self
end

Expand Down
28 changes: 28 additions & 0 deletions test/test_ipaddr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -129,11 +129,25 @@ def test_ipv4_compat
assert_equal("192.168.1.2", b.to_s)
assert_equal(Socket::AF_INET, b.family)
assert_equal(false, b.ipv4_compat?)
assert_equal(32, b.prefix)

a = IPAddr.new("::192.168.0.0/112")
b = a.native
assert_equal("192.168.0.0", b.to_s)
assert_equal(Socket::AF_INET, b.family)
assert_equal(16, b.prefix)

a = IPAddr.new("192.168.1.2")
b = a.ipv4_compat
assert_equal("::192.168.1.2", b.to_s)
assert_equal(Socket::AF_INET6, b.family)
assert_equal(128, b.prefix)

a = IPAddr.new("192.168.0.0/16")
b = a.ipv4_compat
assert_equal("::192.168.0.0", b.to_s)
assert_equal(Socket::AF_INET6, b.family)
assert_equal(112, b.prefix)
end

def test_ipv4_mapped
Expand All @@ -146,11 +160,25 @@ def test_ipv4_mapped
assert_equal("192.168.1.2", b.to_s)
assert_equal(Socket::AF_INET, b.family)
assert_equal(false, b.ipv4_mapped?)
assert_equal(32, b.prefix)

a = IPAddr.new("::ffff:192.168.0.0/112")
b = a.native
assert_equal("192.168.0.0", b.to_s)
assert_equal(Socket::AF_INET, b.family)
assert_equal(16, b.prefix)

a = IPAddr.new("192.168.1.2")
b = a.ipv4_mapped
assert_equal("::ffff:192.168.1.2", b.to_s)
assert_equal(Socket::AF_INET6, b.family)
assert_equal(128, b.prefix)

a = IPAddr.new("192.168.0.0/16")
b = a.ipv4_mapped
assert_equal("::ffff:192.168.0.0", b.to_s)
assert_equal(Socket::AF_INET6, b.family)
assert_equal(112, b.prefix)
end

def test_reverse
Expand Down