Class: IPAddress::Prefix32

Inherits:
Prefix
  • Object
show all
Defined in:
lib/ipaddress/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

#+, #-, #<=>, #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


94
95
96
97
98
99
# File 'lib/ipaddress/prefix.rb', line 94

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


200
201
202
203
204
# File 'lib/ipaddress/prefix.rb', line 200

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


175
176
177
# File 'lib/ipaddress/prefix.rb', line 175

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"


123
124
125
# File 'lib/ipaddress/prefix.rb', line 123

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


110
111
112
# File 'lib/ipaddress/prefix.rb', line 110

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"


189
190
191
# File 'lib/ipaddress/prefix.rb', line 189

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]


149
150
151
# File 'lib/ipaddress/prefix.rb', line 149

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"


136
137
138
# File 'lib/ipaddress/prefix.rb', line 136

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


162
163
164
# File 'lib/ipaddress/prefix.rb', line 162

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