Module: PacketGen::Header

Defined in:
lib/packetgen/header.rb,
lib/packetgen/header/ip.rb,
lib/packetgen/header/arp.rb,
lib/packetgen/header/esp.rb,
lib/packetgen/header/eth.rb,
lib/packetgen/header/tcp.rb,
lib/packetgen/header/tcp.rb,
lib/packetgen/header/udp.rb,
lib/packetgen/header/icmp.rb,
lib/packetgen/header/ipv6.rb,
lib/packetgen/header/icmpv6.rb,
lib/packetgen/header/tcp/option.rb,
lib/packetgen/header/tcp/options.rb,
lib/packetgen/header/header_methods.rb,
lib/packetgen/header/header_class_methods.rb

Overview

Namespace for protocol header classes

Add a foreign header class

Since v1.1.0, PacketGen permits adding you own header classes. First, define the new header class. By example:

module MyModule
  class MyHeader < Struct.new(:field1, :field2)
    include PacketGen::StructFu
    include PacketGen::Header::HeaderMethods
    extend PacketGen::Header::HeaderClassMethods

    def initialize(options={})
      super Int32.new(options[:field1]), Int32.new(options[:field2])
    end

    def read(str)
      self[:field1].read str[0, 4]
      self[:field2].read str[4, 4]
    end
  end
 end

Then, class must be declared to PacketGen:

PacketGen::Header.add_class MyModule::MyHeader

Finally, bindings must be declared:

# bind MyHeader as IP protocol number 254 (needed by Packet#parse)
PacketGen::Header::IP.bind_header MyModule::MyHeader, protocol: 254

And use it:

pkt = Packet.gen('IP').add('MyHeader', field1: 0x12345678)
pkt.myheader.field2.read 0x01

Author:

  • Sylvain Daubert

Defined Under Namespace

Modules: HeaderClassMethods, HeaderMethods Classes: ARP, CipherError, ESP, Eth, ICMP, ICMPv6, IP, IPv6, TCP, UDP

Class Method Summary collapse

Class Method Details

.add_class(klass) ⇒ void

This method returns an undefined value.

Add a foreign header class to known header classes. This is needed by Packet.gen and Packet#add.

Parameters:

Since:

  • 1.1.0



54
55
56
57
58
# File 'lib/packetgen/header.rb', line 54

def self.add_class(klass)
  protocol_name = klass.to_s.sub(/.*::/, '')
  @added_header_classes[protocol_name] = klass
  @header_classes = nil
end

.allArray<Class>

Get known header classes

Returns:

  • (Array<Class>)


43
44
45
46
# File 'lib/packetgen/header.rb', line 43

def self.all
  return @header_classes if @header_classes
  @header_classes = @added_header_classes.values
end

.get_header_class_by_name(name) ⇒ Class?

Get header class from its name

Parameters:

  • name (String)

Returns:

  • (Class, nil)

Since:

  • 1.1.0



75
76
77
78
79
80
81
# File 'lib/packetgen/header.rb', line 75

def self.get_header_class_by_name(name)
  if Header.const_defined? name
    Header.const_get name
  else
    @added_header_classes[name]
  end
end

.remove_class(klass) ⇒ void

This method returns an undefined value.

Remove a foreign header (previously added by add_header_classà from known header classes.

Parameters:

  • klass (Class)

Since:

  • 1.1.0



65
66
67
68
69
# File 'lib/packetgen/header.rb', line 65

def self.remove_class(klass)
  protocol_name = klass.to_s.sub(/.*::/, '')
  @added_header_classes.delete protocol_name
  @header_classes = nil
end