class PacketFu::ICMPHeader
ICMPHeader is a complete ICMP struct, used in ICMPPacket. ICMP is typically used for network administration and connectivity testing.
For more on ICMP packets, see www.networksorcery.com/enp/protocol/icmp.htm
Header Definition¶ ↑
Int8 :icmp_type # Type Int8 :icmp_code # Code Int16 :icmp_sum Default: calculated # Checksum String :body
Public Class Methods
new(args={})
click to toggle source
Calls superclass method
# File lib/packetfu/protos/icmp/header.rb, line 18 def initialize(args={}) super( Int8.new(args[:icmp_type]), Int8.new(args[:icmp_code]), Int16.new(args[:icmp_sum] || icmp_calc_sum), StructFu::String.new.read(args[:body]) ) end
Public Instance Methods
icmp_calc_sum()
click to toggle source
Calculates and sets the checksum for the object.
# File lib/packetfu/protos/icmp/header.rb, line 58 def icmp_calc_sum checksum = (icmp_type.to_i << 8) + icmp_code.to_i chk_body = (body.to_s.size % 2 == 0 ? body.to_s : body.to_s + "\x00") if 1.respond_to? :ord chk_body.split("").each_slice(2).map { |x| (x[0].ord << 8) + x[1].ord }.each { |y| checksum += y } else chk_body.split("").each_slice(2).map { |x| (x[0] << 8) + x[1] }.each { |y| checksum += y } end checksum = checksum % 0xffff checksum = 0xffff - checksum checksum == 0 ? 0xffff : checksum end
icmp_code()
click to toggle source
Getter for the code.
# File lib/packetfu/protos/icmp/header.rb, line 50 def icmp_code; self[:icmp_code].to_i; end
icmp_code=(i)
click to toggle source
Setter for the code.
# File lib/packetfu/protos/icmp/header.rb, line 48 def icmp_code=(i); typecast i; end
icmp_recalc(arg=:all)
click to toggle source
Recalculates the calculatable fields for ICMP.
# File lib/packetfu/protos/icmp/header.rb, line 72 def icmp_recalc(arg=:all) # How silly is this, you can't intern a symbol in ruby 1.8.7pl72? # I'm this close to monkey patching Symbol so you can force it... arg = arg.intern if arg.respond_to? :intern case arg when :icmp_sum self.icmp_sum=icmp_calc_sum when :all self.icmp_sum=icmp_calc_sum else raise ArgumentError, "No such field `#{arg}'" end end
icmp_sum()
click to toggle source
Getter for the checksum.
# File lib/packetfu/protos/icmp/header.rb, line 55 def icmp_sum; self[:icmp_sum].to_i; end
icmp_sum=(i)
click to toggle source
Setter for the checksum. Note, this is calculated automatically with icmp_calc_sum.
# File lib/packetfu/protos/icmp/header.rb, line 53 def icmp_sum=(i); typecast i; end
icmp_sum_readable()
click to toggle source
Readability aliases
# File lib/packetfu/protos/icmp/header.rb, line 88 def icmp_sum_readable "0x%04x" % icmp_sum end
icmp_type()
click to toggle source
Getter for the type.
# File lib/packetfu/protos/icmp/header.rb, line 46 def icmp_type; self[:icmp_type].to_i; end
icmp_type=(i)
click to toggle source
Setter for the type.
# File lib/packetfu/protos/icmp/header.rb, line 44 def icmp_type=(i); typecast i; end
read(str)
click to toggle source
Reads a string to populate the object.
# File lib/packetfu/protos/icmp/header.rb, line 33 def read(str) force_binary(str) return self if str.nil? self[:icmp_type].read(str[0,1]) self[:icmp_code].read(str[1,1]) self[:icmp_sum].read(str[2,2]) self[:body].read(str[4,str.size]) self end
to_s()
click to toggle source
Returns the object in string form.
# File lib/packetfu/protos/icmp/header.rb, line 28 def to_s self.to_a.map {|x| x.to_s}.join end