Class: IPAddress::Prefix32

Inherits:
Prefix
  • Object
show all
Defined in:
lib/ipaddress_2/prefix.rb

Constant Summary collapse

IN4MASK =
0xffffffff

Instance Attribute Summary

Attributes inherited from Prefix

#prefix

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Prefix

#+, #-, #<=>, #coerce, #to_i, #to_s

Constructor Details

#initialize(num) ⇒ Prefix32

Creates a new prefix object for 32 bits IPv4 addresses

prefix = IPAddress::Prefix32.new 24
  #=> 24


114
115
116
117
118
119
# File 'lib/ipaddress_2/prefix.rb', line 114

def initialize(num)
  unless (0..32).include? num
    raise ArgumentError, "Prefix must be in range 0..32, got: #{num}"
  end
  super(num)
end

Class Method Details

.parse_netmask(netmask) ⇒ Object

Creates a new prefix by parsing a netmask in dotted decimal form

prefix = IPAddress::Prefix32::parse_netmask "255.255.255.0"
  #=> 24


220
221
222
223
224
# File 'lib/ipaddress_2/prefix.rb', line 220

def self.parse_netmask(netmask)
  octets = netmask.split(".").map{|i| i.to_i}
  num = octets.pack("C"*octets.size).unpack("B*").first.count "1"
  return self.new(num)
end

Instance Method Details

#[](index) ⇒ Object

Shortcut for the octecs in the dotted decimal representation

prefix = IPAddress::Prefix32.new 24

prefix[2]
  #=> 255


195
196
197
# File 'lib/ipaddress_2/prefix.rb', line 195

def [](index)
  octets[index]
end

#bitsObject

Transforms the prefix into a string of bits representing the netmask

prefix = IPAddress::Prefix32.new 24

prefix.bits 
  #=> "11111111111111111111111100000000"


143
144
145
# File 'lib/ipaddress_2/prefix.rb', line 143

def bits
  "%.32b" % to_u32
end

#host_prefixObject

Returns the length of the host portion of a netmask.

prefix = Prefix32.new 24

prefix.host_prefix
  #=> 8


130
131
132
# File 'lib/ipaddress_2/prefix.rb', line 130

def host_prefix
  32 - @prefix
end

#hostmaskObject

The hostmask is the contrary of the subnet mask, as it shows the bits that can change within the hosts

prefix = IPAddress::Prefix32.new 24

prefix.hostmask
  #=> "0.0.0.255"


209
210
211
# File 'lib/ipaddress_2/prefix.rb', line 209

def hostmask
  [~to_u32].pack("N").unpack("CCCC").join(".")
end

#octetsObject

An array of octets of the IPv4 dotted decimal format

prefix = IPAddress::Prefix32.new 24

prefix.octets
  #=> [255, 255, 255, 0]


169
170
171
# File 'lib/ipaddress_2/prefix.rb', line 169

def octets
  to_ip.split(".").map{|i| i.to_i}
end

#to_ipObject

Gives the prefix in IPv4 dotted decimal format, i.e. the canonical netmask we’re all used to

prefix = IPAddress::Prefix32.new 24

prefix.to_ip
  #=> "255.255.255.0"


156
157
158
# File 'lib/ipaddress_2/prefix.rb', line 156

def to_ip
  [bits].pack("B*").unpack("CCCC").join(".")
end

#to_u32Object

Unsigned 32 bits decimal number representing the prefix

prefix = IPAddress::Prefix32.new 24

prefix.to_u32
  #=> 4294967040


182
183
184
# File 'lib/ipaddress_2/prefix.rb', line 182

def to_u32
  (IN4MASK >> host_prefix) << host_prefix
end