Class: PacketGen::Header::DNS::OPT

Inherits:
RR show all
Defined in:
lib/packetgen/header/dns/opt.rb

Overview

OPT pseudo-RR. Used by Extended DNS (EDNS(0), cf. RFC 6891).

a OPT record may contain zero or more options in its RR#rdata.

Author:

  • Sylvain Daubert

Since:

  • 1.3.0

Constant Summary

Constants inherited from Question

Question::CLASSES, Question::TYPES

Instance Attribute Summary collapse

Attributes inherited from RR

#rdata, #rdlength, #ttl

Attributes inherited from Question

#name, #rrclass, #type

Instance Method Summary collapse

Methods inherited from RR

#human_rdata, #human_rrclass

Methods inherited from Question

#human_rrclass, #human_type, #type?

Methods inherited from Types::Fields

#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, fields, inherited, #inspect, #offset_of, #optional?, #optional_fields, #present?, #read, remove_bit_fields_on, remove_field, #sz, #to_h, update_field

Constructor Details

#initialize(dns, options = {}) ⇒ OPT

Returns a new instance of OPT.

Parameters:

  • dns (DNS)
  • options (Hash) (defaults to: {})

Options Hash (options):

  • :name (String)

    domain as a dotted string. Default to “.”

  • :type (Integer, String)

    see Question::TYPES. Default to ‘OPT’

  • :udp_size (Integer)

    UDP maximum size. Also :rrclass. Default to 512.

  • :ext_rcode (Integer)
  • :version (Integer)
  • :do (Boolean)

    DO bit

  • :ttl (Integer)

    set ext_rcode, version, do and z at once

  • :rdlength (Integer)

    if not provided, automatically set from :rdata length

  • :rdata (String)

Since:

  • 1.3.0



35
36
37
38
39
40
41
42
43
44
# File 'lib/packetgen/header/dns/opt.rb', line 35

def initialize(dns, options={})
  opts = { name: '.', rrclass: 512, type: 41 }.merge!(options)
  super dns, opts
  @options = []

  self.udp_size = options[:udp_size] if options[:udp_size]
  self.ext_rcode = options[:ext_rcode] if options[:ext_rcode]
  self.version = options[:version] if options[:version]
  self.do = options[:do] unless options[:do].nil?
end

Instance Attribute Details

#optionsArray<Option> (readonly)

Returns:

Since:

  • 1.3.0



19
20
21
# File 'lib/packetgen/header/dns/opt.rb', line 19

def options
  @options
end

Instance Method Details

#do=(value) ⇒ Boolean #do?Boolean Also known as: do?

Overloads:

  • #do=(value) ⇒ Boolean

    Setter EDNS do

    Parameters:

    • value (Boolean)

    Returns:

    • (Boolean)
  • #do?Boolean

    Getter for EDNS do

    Returns:

    • (Boolean)

Returns:

  • (Boolean)

Since:

  • 1.3.0



88
89
90
91
92
93
94
95
# File 'lib/packetgen/header/dns/opt.rb', line 88

def do=(value=nil)
  b = value ? 1 : 0
  unless value.nil?
    self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(1 << 15))
    self[:ttl].value |= (b & 1) << 15
  end
  ((self[:ttl].to_i >> 15) & 1) == 1
end

#ext_rcode=(value) ⇒ Integer #ext_rcodeInteger Also known as: ext_rcode

Overloads:

  • #ext_rcode=(value) ⇒ Integer

    Setter for upper 8 bits of extended 12-bit RCODE

    Parameters:

    • value (Integer)

    Returns:

    • (Integer)
  • #ext_rcodeInteger

    Getter for upper 8 bits of extended 12-bit RCODE

    Returns:

    • (Integer)

Returns:

  • (Integer)

Since:

  • 1.3.0



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

def ext_rcode=(value=nil)
  if value
    self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(0xff << 24))
    self[:ttl].value |= (value & 0xff) << 24
  end
  (self[:ttl].to_i >> 24) & 0xff
end

#human_flagsString

Returns:

  • (String)

Since:

  • 1.3.0



119
120
121
# File 'lib/packetgen/header/dns/opt.rb', line 119

def human_flags
  do? ? 'do' : 'none'
end

#human_optionsString

Returns:

  • (String)

Since:

  • 1.3.0



124
125
126
127
# File 'lib/packetgen/header/dns/opt.rb', line 124

def human_options
  str = @options.map(&:to_human).join(';')
  str.empty? ? 'none' : str
end

#to_humanString

Returns:

  • (String)

Since:

  • 1.3.0



130
131
132
133
134
# File 'lib/packetgen/header/dns/opt.rb', line 130

def to_human
  "#{name} #{human_type} UDPsize:#{udp_size} " \
  "extRCODE:#{ext_rcode} EDNSversion:#{version} flags:#{human_flags} " \
  "options:#{human_options}"
end

#to_sString

Returns:

  • (String)

Since:

  • 1.3.0



137
138
139
# File 'lib/packetgen/header/dns/opt.rb', line 137

def to_s
  super + @options.map(&:to_s).join
end

#version=(ver) ⇒ Integer #versionInteger Also known as: version

Overloads:

  • #version=(ver) ⇒ Integer

    Setter EDNS version

    Parameters:

    • ver (Integer)

    Returns:

    • (Integer)
  • #versionInteger

    Getter for EDNS version

    Returns:

    • (Integer)

Returns:

  • (Integer)

Since:

  • 1.3.0



71
72
73
74
75
76
77
# File 'lib/packetgen/header/dns/opt.rb', line 71

def version=(ver=nil)
  if ver
    self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(0xff << 16))
    self[:ttl].value |= (ver & 0xff) << 16
  end
  (self[:ttl].to_i >> 16) & 0xff
end

#z=(value) ⇒ Integer #zInteger Also known as: z

Overloads:

  • #z=(value) ⇒ Integer

    Parameters:

    • value (Integer)

    Returns:

    • (Integer)
  • #zInteger

    Returns:

    • (Integer)

Returns:

  • (Integer)

Since:

  • 1.3.0



104
105
106
107
108
109
110
# File 'lib/packetgen/header/dns/opt.rb', line 104

def z=(value=nil)
  if value
    self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~0x7fff)
    self[:ttl].value |= value & 0x7fff
  end
  self[:ttl].to_i & 0x7fff
end