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, SCTP, SCTP::BaseChunk, SNAP, TCP, TFTP, UDP
Defined Under Namespace
Classes: Binding, Bindings, ProcBinding
Class Attribute Summary collapse
-
.known_headers ⇒ Hash
readonly
private
Get known headers.
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
hdr
and set itslength
field. -
.inherited(klass) ⇒ void
On inheritage, create @known_header class variable.
Instance Method Summary collapse
-
#header_id(header) ⇒ Integer
private
Get
header
id 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.
217 218 219 220 |
# File 'lib/packetgen/header/base.rb', line 217 def initialize(={}) @packet = .delete(:packet) if .key?(:packet) super end |
Class Attribute Details
.known_headers ⇒ Hash (readonly)
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
150 151 152 |
# File 'lib/packetgen/header/base.rb', line 150 def known_headers @known_headers end |
Class Method Details
.bind(header_klass, args = {}) ⇒ void
This method returns an undefined value.
Bind a upper header to current one.
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/packetgen/header/base.rb', line 184 def 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.
206 207 208 209 210 211 212 213 |
# File 'lib/packetgen/header/base.rb', line 206 def 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
141 142 143 144 |
# File 'lib/packetgen/header/base.rb', line 141 def self.inherited(klass) super klass.class_eval { @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
227 228 229 230 231 232 233 234 |
# File 'lib/packetgen/header/base.rb', line 227 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
242 243 244 245 246 247 248 |
# File 'lib/packetgen/header/base.rb', line 242 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
256 257 258 259 260 261 262 |
# File 'lib/packetgen/header/base.rb', line 256 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 |