Class: PacketGen::Header::IP

Inherits:
Base show all
Defined in:
lib/packetgen/header/ip.rb

Overview

A IP header consists of:

Create a IP header

# standalone
ip = PacketGen::Header::IP.new
# in a packet
pkt = PacketGen.gen('IP')
# access to IP header
pkt.ip   # => PacketGen::Header::IP

IP attributes

ip.u8 = 0x45
# the same as
ip.version = 4
ip.ihl = 5

ip.length = 0x43
ip.id = 0x1234

ip.frag = 0x2031
# the same as:
ip.flag_mf = true
ip.fragment_offset = 0x31

ip.flag_rsv?  # => Boolean
ip.flag_df?   # => Boolean
ip.flag_mf?   # => Boolean

ip.ttl = 0x40
ip.protocol = 6
ip.checksum = 0xffff
ip.src = '127.0.0.1'
ip.src                # => "127.0.0.1"
ip[:src]              # => PacketGen::Header::IP::Addr
ip.dst = '127.0.0.2'
ip.body.read 'this is a body'

Defined Under Namespace

Classes: Addr

Constant Summary collapse

ETHERTYPE =

IP Ether type

0x0800

Instance Attribute Summary collapse

Attributes inherited from Base

#packet

Instance Method Summary collapse

Methods inherited from Base

bind_header, #header_id, inherited, #ip_header, known_headers, #protocol_name

Methods inherited from Types::Fields

#[], #[]=, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, #force_binary, inherited, #initialize, #read, #sz, #to_h, #to_s

Constructor Details

This class inherits a constructor from PacketGen::Types::Fields

Instance Attribute Details

#bodyTypes::String, Header::Base



146
# File 'lib/packetgen/header/ip.rb', line 146

define_field :body, Types::String

#checksumInteger

Returns 16-bit IP header checksum.

Returns:

  • (Integer)

    16-bit IP header checksum



137
# File 'lib/packetgen/header/ip.rb', line 137

define_field :checksum, Types::Int16, default: 0

#dstAddr

Returns destination IP address.

Returns:

  • (Addr)

    destination IP address



143
# File 'lib/packetgen/header/ip.rb', line 143

define_field :dst, Addr, default: '127.0.0.1'

#flag_dfBoolean

Returns Don’t Fragment flag.

Returns:

  • (Boolean)

    Don’t Fragment flag



162
# File 'lib/packetgen/header/ip.rb', line 162

define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13

#flag_mfBoolean

Returns More Fragment flags.

Returns:

  • (Boolean)

    More Fragment flags



162
# File 'lib/packetgen/header/ip.rb', line 162

define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13

#flag_rsvBoolean

Returns reserved bit from flags.

Returns:

  • (Boolean)

    reserved bit from flags



162
# File 'lib/packetgen/header/ip.rb', line 162

define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13

#fragInteger

Returns 16-bit frag word.

Returns:

  • (Integer)

    16-bit frag word



128
# File 'lib/packetgen/header/ip.rb', line 128

define_field :frag, Types::Int16, default: 0

#fragment_offsetInteger

Returns 13-bit fragment offset.

Returns:

  • (Integer)

    13-bit fragment offset



162
# File 'lib/packetgen/header/ip.rb', line 162

define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13

#idInteger

Returns 16-bit ID.

Returns:

  • (Integer)

    16-bit ID



125
# File 'lib/packetgen/header/ip.rb', line 125

define_field :id, Types::Int16, default: -> { rand(65535) }

#ihlInteger

Returns 4-bit IP header length attribute.

Returns:

  • (Integer)

    4-bit IP header length attribute



152
# File 'lib/packetgen/header/ip.rb', line 152

define_bit_fields_on :u8, :version, 4, :ihl, 4

#lengthInteger

Returns 16-bit IP total length.

Returns:

  • (Integer)

    16-bit IP total length



122
# File 'lib/packetgen/header/ip.rb', line 122

define_field :length, Types::Int16, default: 20

#protocolInteger

Returns 8-bit upper protocol value.

Returns:

  • (Integer)

    8-bit upper protocol value



134
# File 'lib/packetgen/header/ip.rb', line 134

define_field :protocol, Types::Int8

#srcAddr

Returns source IP address.

Returns:

  • (Addr)

    source IP address



140
# File 'lib/packetgen/header/ip.rb', line 140

define_field :src, Addr, default: '127.0.0.1'

#tosInteger

Returns 8-bit Type of Service value.

Returns:

  • (Integer)

    8-bit Type of Service value



119
# File 'lib/packetgen/header/ip.rb', line 119

define_field :tos, Types::Int8, default: 0

#ttlInteger

Returns 8-bit Time To Live value.

Returns:

  • (Integer)

    8-bit Time To Live value



131
# File 'lib/packetgen/header/ip.rb', line 131

define_field :ttl, Types::Int8, default: 64

#u8Integer

First byte of IP header. May be accessed through #version and #ihl.

Returns:

  • (Integer)

    first byte of IP header.



116
# File 'lib/packetgen/header/ip.rb', line 116

define_field :u8, Types::Int8, default: 0x45

#versionInteger

Returns 4-bit version attribute.

Returns:

  • (Integer)

    4-bit version attribute



152
# File 'lib/packetgen/header/ip.rb', line 152

define_bit_fields_on :u8, :version, 4, :ihl, 4

Instance Method Details

#calc_checksumInteger

Compute checksum and set checksum field

Returns:

  • (Integer)


166
167
168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/packetgen/header/ip.rb', line 166

def calc_checksum
  checksum = (self[:u8].to_i << 8) | self.tos
  checksum += self.length
  checksum += self.id
  checksum += self.frag
  checksum += (self.ttl << 8) | self.protocol
  checksum += (self[:src].to_i >> 16)
  checksum += (self[:src].to_i & 0xffff)
  checksum += self[:dst].to_i >> 16
  checksum += self[:dst].to_i & 0xffff
  checksum = (checksum & 0xffff) + (checksum >> 16)
  checksum = ~(checksum % 0xffff ) & 0xffff
  self[:checksum].value = (checksum == 0) ? 0xffff : checksum
end

#calc_lengthInteger

Compute length and set length field

Returns:

  • (Integer)


183
184
185
# File 'lib/packetgen/header/ip.rb', line 183

def calc_length
  self[:length].value = self.sz
end

#inspectString

Returns:

  • (String)


207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/packetgen/header/ip.rb', line 207

def inspect
  str = Inspect.dashed_line(self.class, 2)
  shift = Inspect.shift_level(2)
  to_h.each do |attr, value|
    next if attr == :body
    str << Inspect.inspect_attribute(attr, value, 2)
    if attr == :u8
      str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'version', version]
      str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'ihl', ihl]
    elsif attr == :frag
      flags = flag_rsv? ? %w(RSV) : []
      flags << 'DF' if flag_df?
      flags << 'MF' if flag_mf?
      flags_str = flags.empty? ? 'none' : flags.join(',')
      str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'flags', flags_str]
      foff = Inspect.int_dec_hex(fragment_offset, 4)
      str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'frag_offset', foff]
    end
  end
  str
end

#parse?Boolean

Check version field

Returns:

  • (Boolean)

See Also:

  • PacketGen::Header::IP.[Base[Base#parse?]


231
232
233
# File 'lib/packetgen/header/ip.rb', line 231

def parse?
  version == 4
end

#pseudo_header_checksumInteger

Get IP part of pseudo header checksum.

Returns:

  • (Integer)


189
190
191
192
# File 'lib/packetgen/header/ip.rb', line 189

def pseudo_header_checksum
  checksum = self[:src].to_i + self[:dst].to_i
  (checksum >> 16) + (checksum & 0xffff)
end

#to_w(iface = nil) ⇒ void

This method returns an undefined value.

Send IP packet on wire.

When sending packet at IP level, checksum and length fields are set by kernel, so bad IP packets cannot be sent this way. To do so, use Eth#to_w.

Parameters:

  • iface (String, nil) (defaults to: nil)

    interface name. Not used



200
201
202
203
204
# File 'lib/packetgen/header/ip.rb', line 200

def to_w(iface=nil)
  sock = Socket.new(Socket::AF_INET, Socket::SOCK_RAW, Socket::IPPROTO_RAW)
  sockaddrin = Socket.sockaddr_in(0, dst)
  sock.send to_s, 0, sockaddrin
end