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 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.
216 217 218 219 |
# File 'lib/packetgen/header/base.rb', line 216 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
149 150 151 |
# File 'lib/packetgen/header/base.rb', line 149 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.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/packetgen/header/base.rb', line 183 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.
205 206 207 208 209 210 211 212 |
# File 'lib/packetgen/header/base.rb', line 205 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
140 141 142 143 |
# File 'lib/packetgen/header/base.rb', line 140 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
226 227 228 229 230 231 232 233 |
# File 'lib/packetgen/header/base.rb', line 226 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
241 242 243 244 245 246 247 |
# File 'lib/packetgen/header/base.rb', line 241 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
255 256 257 258 259 260 261 |
# File 'lib/packetgen/header/base.rb', line 255 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 |