Class: PacketGen::Header::ARP

Inherits:
Struct
  • Object
show all
Extended by:
HeaderClassMethods
Includes:
HeaderMethods, StructFu
Defined in:
lib/packetgen/header/arp.rb

Overview

An ARP header consists of:

Create a ARP header

# standalone
arp = PacketGen::Header::ARP.new
# in a packet
pkt = PacketGen.gen('Eth').add('ARP')
# access to ARP header
pkt.arp   # => PacketGen::Header::ARP

Author:

  • Sylvain Daubert

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from HeaderClassMethods

bind_header, define_bit_fields_on, known_headers

Methods included from HeaderMethods

#header_id, #inspect, #ip_header, #packet, #packet=, #protocol_name

Methods included from StructFu

#clone, #set_endianness, #sz, #to_s, #typecast

Methods inherited from Struct

#force_binary

Constructor Details

#initialize(options = {}) ⇒ ARP

Returns a new instance of ARP.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :hrd (Integer)

    network protocol type (default: 1)

  • :pro (Integer)

    internet protocol type (default: 0x800)

  • :hln (Integer)

    length of hardware addresses (default: 6)

  • :pln (Integer)

    length of internet addresses (default: 4)

  • :op (Integer)

    operation performing by sender (default: 1). known values are request (1) and reply (2)

  • :sha (String)

    sender hardware address

  • :spa (String)

    sender internet address

  • :tha (String)

    target hardware address

  • :tpa (String)

    targetr internet address



47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/packetgen/header/arp.rb', line 47

def initialize(options={})
  super Int16.new(options[:hrd] || options[:htype] || 1),
        Int16.new(options[:pro] || options[:ptype] || 0x800),
        Int8.new(options[:hln] || options[:hlen] || 6),
        Int8.new(options[:pln] || options[:plen] || 4),
        Int16.new(options[:op] || options[:opcode] || 1),
        Eth::MacAddr.new.from_human(options[:sha] || options[:src_mac]),
        IP::Addr.new.from_human(options[:spa] || options[:src_ip]),
        Eth::MacAddr.new.from_human(options[:tha] || options[:dst_mac]),
        IP::Addr.new.from_human(options[:tpa] || options[:dst_ip]),
        StructFu::String.new.read(options[:body])
end

Instance Attribute Details

#bodyObject

Returns the value of attribute body

Returns:

  • (Object)

    the current value of body



30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def body
  @body
end

#hlnInteger Also known as: hlen

Returns:

  • (Integer)


30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def hln
  @hln
end

#hrdInteger Also known as: htype

Returns:

  • (Integer)


30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def hrd
  @hrd
end

#opInteger Also known as: opcode

Returns:

  • (Integer)


30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def op
  @op
end

#plnInteger Also known as: plen

Returns:

  • (Integer)


30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def pln
  @pln
end

#proInteger Also known as: ptype

Returns:

  • (Integer)


30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def pro
  @pro
end

#shaString Also known as: src_mac

Returns:



30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def sha
  @sha
end

#spaString Also known as: src_ip

Returns:



30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def spa
  @spa
end

#thaString Also known as: dst_mac

Returns:



30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def tha
  @tha
end

#tpaString Also known as: dst_ip

Returns:



30
31
32
# File 'lib/packetgen/header/arp.rb', line 30

def tpa
  @tpa
end

Instance Method Details

#read(str) ⇒ self

Read a ARP header from a string

Parameters:

  • str (String)

    binary string

Returns:

  • (self)

Raises:



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/packetgen/header/arp.rb', line 63

def read(str)
  force_binary str
  raise ParseError, 'string too short for ARP' if str.size < self.sz
  self[:hrd].read str[0, 2]
  self[:pro].read str[2, 2]
  self[:hln].read str[4, 1]
  self[:pln].read str[5, 1]
  self[:op].read str[6, 2]
  self[:sha].read str[8, 6]
  self[:spa].read str[14, 4]
  self[:tha].read str[18, 6]
  self[:tpa].read str[24, 4]
  self[:body].read str[28..-1]
end