Class: PacketGen::Header::Base Abstract
- Inherits:
-
BinStruct::Struct
- Object
- BinStruct::Struct
- 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 attributes to forge a response.
Base class defines Base.bind method, to bind headers to outer ones.
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{Headerable => Bindings}
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 inheritance, 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
Methods included from PacketGen::Headerable
#added_to_packet, included, #method_name, #packet, #packet=, #parse?, #protocol_name, #read, #to_s
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 Attribute Details
.known_headers ⇒ Hash{Headerable => Bindings} (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
153 154 155 |
# File 'lib/packetgen/header/base.rb', line 153 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.
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/packetgen/header/base.rb', line 187 def bind(header_klass, args={}) bindings = @known_headers[header_klass] if bindings.nil? bindings = Bindings.new @known_headers[header_klass] = bindings 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.
208 209 210 211 212 213 214 215 |
# File 'lib/packetgen/header/base.rb', line 208 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 inheritance, create @known_header class variable
144 145 146 147 |
# File 'lib/packetgen/header/base.rb', line 144 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
229 230 231 232 233 234 235 236 |
# File 'lib/packetgen/header/base.rb', line 229 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
244 245 246 247 248 249 250 |
# File 'lib/packetgen/header/base.rb', line 244 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 nor IPv6 header in packet' if iph.nil? iph end |
#ll_header(header) ⇒ Header
258 259 260 261 262 263 264 |
# File 'lib/packetgen/header/base.rb', line 258 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 |