Module: IPAddrExtensions::ClassMethods
- Defined in:
- lib/ipaddr_extensions.rb
Instance Method Summary collapse
-
#generate_ULA(mac, subnet_id = 0, locally_assigned = true) ⇒ Object
Generate an IPv6 Unique Local Address using the supplied system MAC address.
-
#mask_by_default ⇒ Object
By default IPAddr masks a non all-ones prefix so that the “network address” is all that’s stored.
- #mask_by_default=(x) ⇒ Object
Instance Method Details
#generate_ULA(mac, subnet_id = 0, locally_assigned = true) ⇒ Object
Generate an IPv6 Unique Local Address using the supplied system MAC address. Note that the MAC address is just used as a source of randomness, so where you get it from is not important and doesn’t restrict this ULA to just that system. See RFC4193
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 |
# File 'lib/ipaddr_extensions.rb', line 495 def generate_ULA(mac, subnet_id = 0, locally_assigned=true) now = Time.now.utc ntp_time = ((now.to_i + 2208988800) << 32) + now.nsec # Convert time to an NTP timstamp. system_id = '::/64'.to_ip.eui_64(mac).to_i # Generate an EUI64 from the provided MAC address. key = [ ntp_time, system_id ].pack('QQ') # Pack the ntp timestamp and the system_id into a binary string global_id = Digest::SHA1.digest( key ).unpack('QQ').last & 0xffffffffff # Use only the last 40 bytes of the SHA1 digest. prefix = (126 << 121) + # 0xfc (bytes 0..6) ((locally_assigned ? 1 : 0) << 120) + # locally assigned? (byte 7) (global_id << 80) + # 40 bit global idenfitier (bytes 8..48) ((subnet_id & 0xffff) << 64) # 16 bit subnet_id (bytes 48..64) prefix.to_ip(Socket::AF_INET6).tap { |p| p.length = 64 } end |
#mask_by_default ⇒ Object
By default IPAddr masks a non all-ones prefix so that the “network address” is all that’s stored. This loses data for some applications and isn’t really necessary since anyone expecting that should use #first instead. This defaults to on to retain compatibility with the rubycore IPAddr class.
480 481 482 483 484 485 486 |
# File 'lib/ipaddr_extensions.rb', line 480 def mask_by_default # You can't use ||= for bools. if @mask_by_default.nil? @mask_by_default = true end @mask_by_default end |
#mask_by_default=(x) ⇒ Object
487 488 489 |
# File 'lib/ipaddr_extensions.rb', line 487 def mask_by_default=(x) @mask_by_default = !!x end |