Class: PacketGen::Header::Base Abstract
- Inherits:
-
Types::Fields
- Object
- Types::Fields
- PacketGen::Header::Base
- Includes:
- PacketGen::Headerable
- Defined in:
- lib/packetgen/header/base.rb
Overview
Base class for all header types. Subclasses may define magic methods:
-
#calc_checksum, which computes header checksum, -
#calc_length, which computes header length, -
#reply!, which inverts needed fields to forge a response.
Direct Known Subclasses
ARP, BOOTP, DHCP, DHCPv6, DHCPv6::Relay, DNS, Dot11, Dot11::SubMngt, Dot1q, Dot1x, EAP, Eth, GRE, HTTP::Request, HTTP::Response, ICMP, IGMP, IGMPv3::MQ, IGMPv3::MR, IP, IPv6, IPv6::Extension, LLC, MLD, MLDv2::MLR, OSPFv2, OSPFv2::DbDescription, OSPFv2::Hello, OSPFv2::LSAck, OSPFv2::LSRequest, OSPFv2::LSUpdate, OSPFv3, OSPFv3::DbDescription, OSPFv3::Hello, OSPFv3::LSAck, OSPFv3::LSRequest, OSPFv3::LSUpdate, PPI, RadioTap, SNAP, TCP, TFTP, UDP
Defined Under Namespace
Classes: Binding, Bindings, ProcBinding
Class Method Summary collapse
-
.bind(header_klass, args = {}) ⇒ void
Bind a upper header to current one.
-
.calculate_and_set_length(hdr, header_in_size: true) ⇒ Object
Helper method to calculate length of
hdrand set itslengthfield. -
.inherited(klass) ⇒ void
On inheritage, create @known_header class variable.
-
.known_headers ⇒ Hash
private
Get known headers.
Instance Method Summary collapse
-
#header_id(header) ⇒ Integer
private
Get
headerid in Packet#headers array. -
#initialize(options = {}) ⇒ Base
constructor
A new instance of Base.
- #ip_header(header) ⇒ Header private
-
#ll_header(header) ⇒ Header
private
Get link layer header from given header.
Methods included from PacketGen::Headerable
#added_to_packet, included, #method_name, #packet, #packet=, #parse?, #protocol_name, #read
Methods inherited from Types::Fields
#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, fields, #fields, #inspect, #offset_of, #optional?, #optional_fields, #present?, #read, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field
Constructor Details
#initialize(options = {}) ⇒ Base
Returns a new instance of Base.
219 220 221 222 |
# File 'lib/packetgen/header/base.rb', line 219 def initialize(={}) @packet = .delete(:packet) if .key?(:packet) super end |
Class Method Details
.bind(header_klass, args = {}) ⇒ void
This method returns an undefined value.
Bind a upper header to current one.
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/packetgen/header/base.rb', line 179 def self.bind(header_klass, args={}) if @known_headers[header_klass].nil? bindings = Bindings.new @known_headers[header_klass] = bindings else bindings = @known_headers[header_klass] end bindings.new_set args.each do |key, value| bindings << if key == :procs ProcBinding.new(value) else Binding.new(key, value) end end end |
.calculate_and_set_length(hdr, header_in_size: true) ⇒ Object
Helper method to calculate length of hdr and set its length field. To be used by #calc_length in Base subclasses.
202 203 204 205 206 207 208 209 |
# File 'lib/packetgen/header/base.rb', line 202 def self.calculate_and_set_length(hdr, header_in_size: true) length = if header_in_size hdr.sz else hdr[:body].sz end hdr.length = length end |
.inherited(klass) ⇒ void
This method returns an undefined value.
On inheritage, create @known_header class variable
142 143 144 145 |
# File 'lib/packetgen/header/base.rb', line 142 def self.inherited(klass) super klass.class_eval { @known_headers = {} } end |
.known_headers ⇒ Hash
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get known headers
214 215 216 |
# File 'lib/packetgen/header/base.rb', line 214 def self.known_headers @known_headers end |
Instance Method Details
#header_id(header) ⇒ Integer
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get header id in Packet#headers array
230 231 232 233 234 235 236 237 |
# File 'lib/packetgen/header/base.rb', line 230 def header_id(header) raise FormatError, "header of type #{header.class} not in a packet" if packet.nil? id = packet.headers.index(header) raise FormatError, "header of type #{header.class} not in packet #{packet}" if id.nil? id end |
#ip_header(header) ⇒ Header
245 246 247 248 249 250 251 |
# File 'lib/packetgen/header/base.rb', line 245 def ip_header(header) hid = header_id(header) iph = packet.headers[0...hid].reverse.find { |h| h.is_a?(IP) || h.is_a?(IPv6) } raise FormatError, 'no IP or IPv6 header in packet' if iph.nil? iph end |
#ll_header(header) ⇒ Header
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Get link layer header from given header
259 260 261 262 263 264 265 |
# File 'lib/packetgen/header/base.rb', line 259 def ll_header(header) hid = header_id(header) llh = packet.headers[0...hid].reverse.find { |h| h.is_a?(Eth) || h.is_a?(Dot11) } raise FormatError, 'no link layer header in packet' if llh.nil? llh end |