Class: Xlat::AddressTranslators::Rfc6052

Inherits:
Object
  • Object
show all
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

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