class IPAddress::IPv6::Mapped

Overview

It is usually identified as a IPv4 mapped IPv6 address, a particular IPv6 address which aids the transition from IPv4 to IPv6. The structure of the address is

::ffff:w.y.x.z

where w.x.y.z is a normal IPv4 address. For example, the following is a mapped IPv6 address:

::ffff:192.168.100.1

IPAddress is very powerful in handling mapped IPv6 addresses, as the IPv4 portion is stored internally as a normal IPv4 object. Let's have a look at some examples. To create a new mapped address, just use the class builder itself

ip6 = IPAddress::IPv6::Mapped.new "::ffff:172.16.10.1/128"

or just use the wrapper method

ip6 = IPAddress.new "::ffff:172.16.10.1/128"

Let's check it's really a mapped address:

ip6.mapped?   # => true
ip6.to_string # => "::ffff:172.16.10.1/128"

Now with the ipv4 attribute, we can easily access the IPv4 portion of the mapped IPv6 address:

ip6.ipv4.address # => "172.16.10.1"

Internally, the IPv4 address is stored as two 16 bits groups. Therefore all the usual methods for an IPv6 address are working perfectly fine:

ip6.to_hex  # => "00000000000000000000ffffac100a01"
ip6.address # => "0000:0000:0000:0000:0000:ffff:ac10:0a01"

A mapped IPv6 can also be created just by specify the address in the following format:

ip6 = IPAddress.new "::172.16.10.1"

That is, two colons and the IPv4 address. However, as by RFC, the ffff group will be automatically added at the beginning

ip6.to_string # => "::ffff:172.16.10.1/128"

making it a mapped IPv6 compatible address.

Defined in:

ipaddress/ipv6_mapped.cr

Constructors

Instance Method Summary

Instance methods inherited from class IPAddress::IPv6

<=>(other : IPv6) <=>, ==(other : self) ==, [](index : Int32) : Int32 [], []=(index : Int32, value : Int32) : Nil []=, address : String address, bits : String bits, broadcast_u128 : BigInt broadcast_u128, compressed : String compressed, data : Bytes data, each(&) : Nil each, groups : Array(Int32) groups, hash(hasher) hash, hexs : Array(String) hexs, includes?(others : Array(IPv6))
includes?(other)
includes?(*others : IPv6)
includes?
, link_local? link_local?, literal : String literal, loopback? loopback?, mapped? mapped?, network : IPv6 network, network? network?, network_u128 : BigInt network_u128, pred : IPv6 pred, prefix : Prefix128 prefix, prefix=(prefix : Int32) : Prefix128 prefix=, reverse : String reverse, size : BigInt size, succ : IPv6 succ, to_big_i : BigInt to_big_i, to_hex : String to_hex, to_s(io : IO) to_s, to_string : String to_string, to_string_uncompressed : String to_string_uncompressed, unique_local? unique_local?, unspecified? unspecified?

Constructor methods inherited from class IPAddress::IPv6

new(addr : String, netmask = nil) new, parse_data(data : Bytes, prefix = 128) : IPv6 parse_data, parse_hex(hex : String, prefix = 128) : IPv6 parse_hex, parse_u128(u128 : BigInt, prefix = 128) : IPv6 parse_u128

Class methods inherited from class IPAddress::IPv6

compress(addr : String) : String compress, expand(addr : String) : String expand, groups(addr : String) : Array(Int32) groups, valid?(addr : String) valid?

Instance methods inherited from module IPAddress

ipv4? ipv4?, ipv6? ipv6?

Constructor methods inherited from module IPAddress

new(addr : String | Int) : IPAddress new, parse(addr : String | Int) : IPAddress parse

Class methods inherited from module IPAddress

aton(addr : String) : UInt32 aton, ntoa(uint : UInt32) : String
ntoa(int : Int) : String
ntoa
, valid?(addr : String) valid?, valid_ipv4?(addr : String) valid_ipv4?, valid_ipv4_netmask?(addr : String) valid_ipv4_netmask?, valid_ipv6?(addr : String) valid_ipv6?

Constructor Detail

def self.new(addr : String, netmask = nil) #

Creates a new IPv6 IPv4-mapped address.

ip6 = IPAddress::IPv6::Mapped.new "::ffff:172.16.10.1/128"
ipv6.ipv4.class # => IPAddress::IPv4

An IPv6 IPv4-mapped address can also be created using the IPv6 only format of the address:

ip6 = IPAddress::IPv6::Mapped.new "::0d01:4403"
ip6.to_string # => "::ffff:13.1.68.3"

[View source]

Instance Method Detail

def ipv4 : IPv4 #

Internal IPv4 address.


[View source]
def mapped? #

Returns true if the address is a mapped address.

ip6 = IPAddress.new "::ffff:172.16.10.1/128"
ip6.mapped? # => true

[View source]
def to_s(io : IO) #

Similar to IPv6#to_s(io), but appends the IPv4 address in dotted decimal format.

ip6 = IPAddress.new "::ffff:172.16.10.1/128"
ip6.to_s # => "::ffff:172.16.10.1"

[View source]
def to_string : String #

Similar to IPv6#to_string, but prints out the IPv4 address in dotted decimal format.

ip6 = IPAddress.new "::ffff:172.16.10.1/128"
ip6.to_string # => "::ffff:172.16.10.1/128"

[View source]