Class: Xlat::AddressTranslators::Rfc6052
- Inherits:
-
Object
- Object
- Xlat::AddressTranslators::Rfc6052
- Includes:
- Xlat::AddressTranslation
- Defined in:
- lib/xlat/address_translators/rfc6052.rb
Overview
RFC 6052 based IPv4/IPv6 address translator. Accepts Pref64n::/96.
www.rfc-editor.org/info/rfc6052 datatracker.ietf.org/doc/html/rfc6052
Instance Method Summary collapse
-
#initialize(pref64n_string) ⇒ Rfc6052
constructor
A new instance of Rfc6052.
- #translate_address_to_ipv4(ipv6_address, buffer, offset = 0) ⇒ Object
- #translate_address_to_ipv6(ipv4_address, buffer, offset = 0) ⇒ Object
Constructor Details
#initialize(pref64n_string) ⇒ Rfc6052
Returns a new instance of Rfc6052.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/xlat/address_translators/rfc6052.rb', line 15 def initialize(pref64n_string) @pref64n = IPAddr.new(pref64n_string, Socket::AF_INET6) unless @pref64n.prefix == 96 raise ArgumentError, "#{self.class.name} only supports Pref64::/96" end @pref64n_prefix = IO::Buffer.for(@pref64n.hton).slice(0, 12) unless @pref64n_prefix.get_value(:U8, 8) == 0 raise ArgumentError, "Bits 64-71 in Pref64::/96 must be all zeroes" end @cs_delta = Xlat::Common.sum16be(@pref64n_prefix) @cs_delta = 0 if @cs_delta % 0xffff == 0 # checksum neutrality @negative_cs_delta = -@cs_delta end |
Instance Method Details
#translate_address_to_ipv4(ipv6_address, buffer, offset = 0) ⇒ Object
31 32 33 34 35 36 |
# File 'lib/xlat/address_translators/rfc6052.rb', line 31 def translate_address_to_ipv4(ipv6_address,buffer,offset = 0) return unless (ipv6_address.slice(0, @pref64n_prefix.size) <=> @pref64n_prefix) == 0 buffer.copy(ipv6_address, offset, 4, 12) @negative_cs_delta end |
#translate_address_to_ipv6(ipv4_address, buffer, offset = 0) ⇒ Object
38 39 40 41 42 43 |
# File 'lib/xlat/address_translators/rfc6052.rb', line 38 def translate_address_to_ipv6(ipv4_address,buffer,offset = 0) buffer.copy(@pref64n_prefix, offset, 12) buffer.copy(ipv4_address, offset + 12, 4) @cs_delta end |