Skip to content
Snippets Groups Projects
Commit a172928b authored by Francis Luong (Franco)'s avatar Francis Luong (Franco) Committed by GitHub
Browse files

Merge pull request #83 from icy-arctic-fox/link-local

Add detection of link-local addresses
parents f16c587a 548f0071
No related branches found
No related tags found
No related merge requests found
...@@ -650,6 +650,20 @@ module IPAddress; ...@@ -650,6 +650,20 @@ module IPAddress;
[self.class.new("127.0.0.0/8")].any? {|i| i.include? self} [self.class.new("127.0.0.0/8")].any? {|i| i.include? self}
end end
#
# Checks if an IPv4 address objects belongs
# to a link-local network RFC3927
#
# Example:
#
# ip = IPAddress "169.254.0.1"
# ip.link_local?
# #=> true
#
def link_local?
[self.class.new("169.254.0.0/16")].any? {|i| i.include? self}
end
# #
# Returns the IP address in in-addr.arpa format # Returns the IP address in in-addr.arpa format
# for DNS lookups # for DNS lookups
......
...@@ -423,6 +423,34 @@ module IPAddress; ...@@ -423,6 +423,34 @@ module IPAddress;
@prefix == 128 and @compressed == "::1" @prefix == 128 and @compressed == "::1"
end end
#
# Checks if an IPv6 address objects belongs
# to a link-local network RFC4291
#
# Example:
#
# ip = IPAddress "fe80::1"
# ip.link_local?
# #=> true
#
def link_local?
[self.class.new("fe80::/64")].any? {|i| i.include? self}
end
#
# Checks if an IPv6 address objects belongs
# to a unique-local network RFC4193
#
# Example:
#
# ip = IPAddress "fc00::1"
# ip.unique_local?
# #=> true
#
def unique_local?
[self.class.new("fc00::/7")].any? {|i| i.include? self}
end
# #
# Returns true if the address is a mapped address # Returns true if the address is a mapped address
# #
......
...@@ -74,6 +74,22 @@ class IPv4Test < Minitest::Test ...@@ -74,6 +74,22 @@ class IPv4Test < Minitest::Test
"10.32.0.1" => ["10.32.0.253", 253], "10.32.0.1" => ["10.32.0.253", 253],
"192.0.0.0" => ["192.1.255.255", 131072] "192.0.0.0" => ["192.1.255.255", 131072]
} }
@link_local = [
"169.254.0.0",
"169.254.255.255",
"169.254.12.34",
"169.254.0.0/16",
"169.254.0.0/17"]
@not_link_local = [
"127.0.0.1",
"127.0.1.1",
"192.168.0.100",
"169.255.0.0",
"169.254.0.0/15",
"0.0.0.0",
"255.255.255.255"]
end end
...@@ -310,6 +326,15 @@ class IPv4Test < Minitest::Test ...@@ -310,6 +326,15 @@ class IPv4Test < Minitest::Test
assert_equal false, @klass.new("192.0.0.2/24").private? assert_equal false, @klass.new("192.0.0.2/24").private?
end end
def test_method_link_local?
@link_local.each do |addr|
assert_equal true, @klass.new(addr).link_local?
end
@not_link_local.each do |addr|
assert_equal false, @klass.new(addr).link_local?
end
end
def test_method_octet def test_method_octet
assert_equal 172, @ip[0] assert_equal 172, @ip[0]
assert_equal 16, @ip[1] assert_equal 16, @ip[1]
......
...@@ -42,6 +42,37 @@ class IPv6Test < Minitest::Test ...@@ -42,6 +42,37 @@ class IPv6Test < Minitest::Test
@network = @klass.new "2001:db8:8:800::/64" @network = @klass.new "2001:db8:8:800::/64"
@arr = [8193,3512,0,0,8,2048,8204,16762] @arr = [8193,3512,0,0,8,2048,8204,16762]
@hex = "20010db80000000000080800200c417a" @hex = "20010db80000000000080800200c417a"
@link_local = [
"fe80::",
"fe80::1",
"fe80::208:74ff:feda:625c",
"fe80::/64",
"fe80::/65"]
@not_link_local = [
"::",
"::1",
"ff80:03:02:01::",
"2001:db8::8:800:200c:417a",
"fe80::/63"]
@unique_local = [
"fc00::/7",
"fc00::/8",
"fd00::/8",
"fd12:3456:789a:1::1",
"fd12:3456:789a:1::/64",
"fc00::1"]
@not_unique_local = [
"fc00::/6",
"::",
"::1",
"fe80::",
"fe80::1",
"fe80::/64"]
end end
def test_attribute_address def test_attribute_address
...@@ -215,6 +246,24 @@ class IPv6Test < Minitest::Test ...@@ -215,6 +246,24 @@ class IPv6Test < Minitest::Test
assert_equal false, @ip.loopback? assert_equal false, @ip.loopback?
end end
def test_method_link_local?
@link_local.each do |addr|
assert_equal true, @klass.new(addr).link_local?
end
@not_link_local.each do |addr|
assert_equal false, @klass.new(addr).link_local?
end
end
def test_method_unique_local?
@unique_local.each do |addr|
assert_equal true, @klass.new(addr).unique_local?
end
@not_unique_local.each do |addr|
assert_equal false, @klass.new(addr).unique_local?
end
end
def test_method_network def test_method_network
@networks.each do |addr,net| @networks.each do |addr,net|
ip = @klass.new addr ip = @klass.new addr
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment