Sha256: 7b6c4b76d98e341f8f1541ec3e51b55886e638b7aae69abce3f63c83a9bbdb9d

Contents?: true

Size: 1.92 KB

Versions: 15

Compression:

Stored size: 1.92 KB

Contents

# This file is part of PacketGen
# See https://github.com/sdaubert/packetgen for more informations
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
# This program is published under MIT license.

module PacketGen
  module Header

    # A ICMP header consists of:
    # * a {#type} field ({Types::Int8} type),
    # * a {#code} field ({Types::Int8} type),
    # * a {#checksum} field ({Types::Int16} type),
    # * and a {#body}.
    #
    # == Create a ICMP header
    #  # standalone
    #  icmp = PacketGen::Header::ICMP.new
    #  # in a packet
    #  pkt = PacketGen.gen('IP').add('ICMP')
    #  # access to ICMP header
    #  pkt.icmp     # => PacketGen::Header::ICMP
    #
    # == ICMP attributes
    #  icmp.code = 0
    #  icmp.type = 200
    #  icmp.checksum = 0x248a
    #  icmp.body.read 'this is a body'
    # @author Sylvain Daubert
    class ICMP < Base

      # ICMP internet protocol number
      IP_PROTOCOL = 1

      # @!attribute type
      #  8-bit ICMP type
      #  @return [Integer]
      define_field :type, Types::Int8
      # @!attribute code
      #  8-bit ICMP code
      #  @return [Integer]
      define_field :code, Types::Int8
      # @!attribute checksum
      #  16-bit ICMP checksum
      #  @return [Integer]
      define_field :checksum, Types::Int16
      # @!attribute body
      #  @return [Types::String,Header::Base]
      define_field :body, Types::String

      # Compute checksum and set +checksum+ field
      # @return [Integer]
      def calc_checksum
        sum = (type << 8) | code

        payload = body.to_s
        payload << "\x00" unless payload.size % 2 == 0
        payload.unpack('n*').each { |x| sum += x }

        while sum > 0xffff do
          sum = (sum & 0xffff) + (sum >> 16)
        end
        sum = ~sum & 0xffff
        self[:checksum].value = (sum == 0) ? 0xffff : sum
      end
    end

    self.add_class ICMP

    IP.bind_header ICMP, protocol: ICMP::IP_PROTOCOL
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
packetgen-2.4.0 lib/packetgen/header/icmp.rb
packetgen-2.3.0 lib/packetgen/header/icmp.rb
packetgen-2.2.0 lib/packetgen/header/icmp.rb
packetgen-2.1.4 lib/packetgen/header/icmp.rb
packetgen-2.1.3 lib/packetgen/header/icmp.rb
packetgen-2.1.2 lib/packetgen/header/icmp.rb
packetgen-2.1.1 lib/packetgen/header/icmp.rb
packetgen-2.1.0 lib/packetgen/header/icmp.rb
packetgen-2.0.1 lib/packetgen/header/icmp.rb
packetgen-2.0.0 lib/packetgen/header/icmp.rb
packetgen-1.4.3 lib/packetgen/header/icmp.rb
packetgen-1.4.2 lib/packetgen/header/icmp.rb
packetgen-1.4.1 lib/packetgen/header/icmp.rb
packetgen-1.4.0 lib/packetgen/header/icmp.rb
packetgen-1.3.0 lib/packetgen/header/icmp.rb