ICMPPacket is used to construct ICMP Packets. They contain an EthHeader, an IPHeader, and a ICMPHeader.

Example

 icmp_pkt.new
 icmp_pkt.icmp_type = 8
 icmp_pkt.icmp_code = 0
 icmp_pkt.payload = "ABC, easy as 123. As simple as do-re-mi. ABC, 123, baby, you and me!"

 icmp_pkt.ip_saddr="1.2.3.4"
 icmp_pkt.ip_daddr="5.6.7.8"

 icmp_pkt.recalc
 icmp_pkt.to_f('/tmp/icmp.pcap')

Parameters

 :eth
  A pre-generated EthHeader object.
 :ip
  A pre-generated IPHeader object.
 :flavor
  TODO: Sets the "flavor" of the ICMP packet. Pings, in particular, often betray their true
  OS.
 :config
  A hash of return address details, often the output of Utils.whoami?
Methods
C
N
P
R
Attributes
[RW] eth_header
[RW] ip_header
[RW] icmp_header
Class Public methods
can_parse?(str)
# File lib/packetfu/protos/icmp.rb, line 125
                def self.can_parse?(str)
                        return false unless str.size >= 54
                        return false unless EthPacket.can_parse? str
                        return false unless IPPacket.can_parse? str
                        return false unless str[23,1] == "\x01"
                        return true
                end
new(args={})
# File lib/packetfu/protos/icmp.rb, line 144
                def initialize(args={})
                        @eth_header = EthHeader.new(args).read(args[:eth])
                        @ip_header = IPHeader.new(args).read(args[:ip])
                        @ip_header.ip_proto = 1
                        @icmp_header = ICMPHeader.new(args).read(args[:icmp])

                        @ip_header.body = @icmp_header
                        @eth_header.body = @ip_header

                        @headers = [@eth_header, @ip_header, @icmp_header]
                        super
                end
Instance Public methods
peek_format()

Peek provides summary data on packet contents.

# File lib/packetfu/protos/icmp.rb, line 158
                def peek_format
                        peek_data = ["IC "] # I is taken by IP
                        peek_data << "%-5d" % self.to_s.size
                        type = case self.icmp_type.to_i
                                                 when 8
                                                         "ping"
                                                 when 0
                                                         "pong"
                                                 else
                                                         "%02x-%02x" % [self.icmp_type, self.icmp_code]
                                                 end
                        peek_data << "%-21s" % "#{self.ip_saddr}:#{type}"
                        peek_data << "->"
                        peek_data << "%21s" % "#{self.ip_daddr}"
                        peek_data << "%23s" % "I:"
                        peek_data << "%04x" % self.ip_id
                        peek_data.join
                end
read(str=nil, args={})
# File lib/packetfu/protos/icmp.rb, line 133
                def read(str=nil, args={})
                        raise "Cannot parse `#{str}'" unless self.class.can_parse?(str)
                        @eth_header.read(str)
                        @ip_header.read(str[14,str.size])
                        @eth_header.body = @ip_header
                        @icmp_header.read(str[14+(@ip_header.ip_hlen),str.size])
                        @ip_header.body = @icmp_header
                        super(args)
                        self
                end