packetgen 3.3.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -22
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +14 -8
  6. data/lib/packetgen/header/arp.rb +17 -18
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +42 -40
  9. data/lib/packetgen/header/bootp.rb +35 -37
  10. data/lib/packetgen/header/dhcp/option.rb +21 -21
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +8 -9
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +83 -61
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
  17. data/lib/packetgen/header/dhcpv6.rb +17 -18
  18. data/lib/packetgen/header/dns/name.rb +21 -16
  19. data/lib/packetgen/header/dns/opt.rb +5 -2
  20. data/lib/packetgen/header/dns/option.rb +14 -14
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +7 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +6 -6
  25. data/lib/packetgen/header/dns.rb +103 -90
  26. data/lib/packetgen/header/dot11/control.rb +12 -12
  27. data/lib/packetgen/header/dot11/data.rb +25 -24
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +21 -18
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
  31. data/lib/packetgen/header/dot11.rb +117 -122
  32. data/lib/packetgen/header/dot1q.rb +12 -13
  33. data/lib/packetgen/header/dot1x.rb +13 -13
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +16 -8
  36. data/lib/packetgen/header/eap/tls.rb +18 -19
  37. data/lib/packetgen/header/eap/ttls.rb +22 -21
  38. data/lib/packetgen/header/eap.rb +73 -48
  39. data/lib/packetgen/header/eth.rb +41 -27
  40. data/lib/packetgen/header/gre.rb +33 -11
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +38 -29
  43. data/lib/packetgen/header/http/response.rb +35 -27
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +14 -14
  46. data/lib/packetgen/header/icmpv6.rb +10 -9
  47. data/lib/packetgen/header/igmp.rb +26 -15
  48. data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +5 -5
  51. data/lib/packetgen/header/igmpv3.rb +12 -11
  52. data/lib/packetgen/header/ip/addr.rb +19 -15
  53. data/lib/packetgen/header/ip/option.rb +47 -36
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +77 -95
  56. data/lib/packetgen/header/ipv6/addr.rb +28 -27
  57. data/lib/packetgen/header/ipv6/extension.rb +13 -11
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
  59. data/lib/packetgen/header/ipv6.rb +42 -35
  60. data/lib/packetgen/header/llc.rb +28 -21
  61. data/lib/packetgen/header/mdns.rb +10 -3
  62. data/lib/packetgen/header/mld.rb +15 -13
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
  64. data/lib/packetgen/header/mldv2/mlq.rb +22 -24
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/mldv2.rb +1 -1
  67. data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
  68. data/lib/packetgen/header/ospfv2/hello.rb +18 -17
  69. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  70. data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
  71. data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
  72. data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
  73. data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
  74. data/lib/packetgen/header/ospfv2.rb +49 -46
  75. data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
  76. data/lib/packetgen/header/ospfv3/hello.rb +17 -16
  77. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
  78. data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
  79. data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
  80. data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
  81. data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
  82. data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
  83. data/lib/packetgen/header/ospfv3.rb +54 -52
  84. data/lib/packetgen/header/sctp/chunk.rb +80 -56
  85. data/lib/packetgen/header/sctp/error.rb +174 -202
  86. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  87. data/lib/packetgen/header/sctp/parameter.rb +89 -136
  88. data/lib/packetgen/header/sctp.rb +19 -8
  89. data/lib/packetgen/header/snmp.rb +108 -7
  90. data/lib/packetgen/header/tcp/option.rb +52 -39
  91. data/lib/packetgen/header/tcp/options.rb +13 -5
  92. data/lib/packetgen/header/tcp.rb +83 -65
  93. data/lib/packetgen/header/tftp.rb +31 -25
  94. data/lib/packetgen/header/udp.rb +21 -19
  95. data/lib/packetgen/header.rb +23 -18
  96. data/lib/packetgen/headerable.rb +21 -5
  97. data/lib/packetgen/inspect.rb +3 -8
  98. data/lib/packetgen/packet.rb +146 -71
  99. data/lib/packetgen/pcap.rb +15 -4
  100. data/lib/packetgen/pcapng/block.rb +20 -18
  101. data/lib/packetgen/pcapng/epb.rb +13 -15
  102. data/lib/packetgen/pcapng/file.rb +44 -111
  103. data/lib/packetgen/pcapng/idb.rb +11 -12
  104. data/lib/packetgen/pcapng/shb.rb +15 -16
  105. data/lib/packetgen/pcapng/spb.rb +9 -11
  106. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  107. data/lib/packetgen/pcapng.rb +6 -4
  108. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  109. data/lib/packetgen/proto.rb +5 -1
  110. data/lib/packetgen/unknown_packet.rb +5 -5
  111. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  112. data/lib/packetgen/utils.rb +4 -3
  113. data/lib/packetgen/version.rb +1 -1
  114. data/lib/packetgen.rb +12 -5
  115. metadata +29 -38
  116. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  117. data/lib/packetgen/types/array.rb +0 -287
  118. data/lib/packetgen/types/cstring.rb +0 -109
  119. data/lib/packetgen/types/enum.rb +0 -171
  120. data/lib/packetgen/types/fieldable.rb +0 -66
  121. data/lib/packetgen/types/fields.rb +0 -622
  122. data/lib/packetgen/types/int.rb +0 -473
  123. data/lib/packetgen/types/int_string.rb +0 -102
  124. data/lib/packetgen/types/length_from.rb +0 -54
  125. data/lib/packetgen/types/oui.rb +0 -52
  126. data/lib/packetgen/types/string.rb +0 -97
  127. data/lib/packetgen/types/tlv.rb +0 -161
  128. data/lib/packetgen/types.rb +0 -26
@@ -11,19 +11,55 @@ module PacketGen
11
11
  class DNS
12
12
  # DNS Ressource Record
13
13
  # @author Sylvain Daubert
14
+ # @author LemonTree55
14
15
  class RR < Question
15
16
  # @!attribute ttl
16
17
  # 32-bit time to live
17
18
  # @return [Integer]
18
- define_field :ttl, Types::Int32
19
+ define_attr :ttl, BinStruct::Int32
19
20
  # @!attribute rdlength
20
21
  # 16-bit {#rdata} length
21
22
  # @return [Integer]
22
- define_field :rdlength, Types::Int16
23
+ define_attr :rdlength, BinStruct::Int16
23
24
  # @!attribute rdata
24
- # @return [Types::String]
25
- define_field :rdata, Types::String,
26
- builder: ->(rr, t) { t.new(length_from: rr[:rdlength]) }
25
+ # @return [BinStruct::String]
26
+ define_attr :rdata, BinStruct::String,
27
+ builder: ->(rr, t) { t.new(length_from: rr[:rdlength]) }
28
+
29
+ # @private RData struct
30
+ class RData < BinStruct::Struct
31
+ attr_accessor :dns
32
+
33
+ def initialize(options={})
34
+ @dns = options.delete(:dns)
35
+ super
36
+ end
37
+ end
38
+
39
+ # @private MX struct
40
+ class MX < RData
41
+ define_attr :pref, BinStruct::Int16
42
+ define_attr :exchange, Name, builder: ->(h, t) { t.new(dns: h.dns) }
43
+ end
44
+
45
+ # @private SOA struct
46
+ class SOA < RData
47
+ define_attr :mname, Name, builder: ->(h, t) { t.new(dns: h.dns) }
48
+ define_attr :rname, Name, builder: ->(h, t) { t.new(dns: h.dns) }
49
+ define_attr :serial, BinStruct::Int32
50
+ define_attr :refresh, BinStruct::Int32
51
+ define_attr :retryi, BinStruct::Int32
52
+ define_attr :expire, BinStruct::Int32
53
+ define_attr :minimum, BinStruct::Int32
54
+ end
55
+
56
+ # @private SRV struct
57
+ class SRV < RData
58
+ define_attr :priority, BinStruct::Int16
59
+ define_attr :weight, BinStruct::Int16
60
+ define_attr :port, BinStruct::Int16
61
+ define_attr :target, Name, builder: ->(h, t) { t.new(dns: h.dns) }
62
+ end
27
63
 
28
64
  # @param [DNS] dns
29
65
  # @param [Hash] options
@@ -47,8 +83,8 @@ module PacketGen
47
83
  # @param [String] data
48
84
  # @return [void]
49
85
  def rdata=(data)
50
- self[:rdlength].read data.size
51
- self[:rdata].read data
86
+ self[:rdlength].from_human(data.size)
87
+ self[:rdata].read(data)
52
88
  end
53
89
 
54
90
  # rubocop:disable Metrics/AbcSize
@@ -60,8 +96,7 @@ module PacketGen
60
96
 
61
97
  case type
62
98
  when TYPES['NS'], TYPES['PTR'], TYPES['CNAME']
63
- name = Name.new
64
- name.dns = self[:name].dns
99
+ name = Name.new(dns: self[:name].dns)
65
100
  str = name.read(self[:rdata]).to_human
66
101
  when TYPES['SOA']
67
102
  str = human_soa_rdata
@@ -78,9 +113,9 @@ module PacketGen
78
113
  # Get human readable class
79
114
  # @return [String]
80
115
  def human_rrclass
81
- if self[:name].dns.is_a? MDNS
116
+ if self[:name].dns.is_a?(MDNS)
82
117
  str = self.class::CLASSES.key(self.rrclass & 0x7fff) || '0x%04x' % (self.rrclass & 0x7fff)
83
- str += ' CACHE-FLUSH' if (self.rrclass & 0x8000).positive?
118
+ str += ' CACHE-FLUSH' if self.rrclass.anybits?(0x8000)
84
119
  str
85
120
  else
86
121
  self.class::CLASSES.key(self.rrclass) || '0x%04x' % self.rrclass
@@ -100,49 +135,27 @@ module PacketGen
100
135
 
101
136
  case type
102
137
  when TYPES['A'], TYPES['AAAA']
103
- IPAddr.new_ntoh(self[:rdata]).to_s
138
+ IPAddr.new_ntoh(self[:rdata].string).to_s
104
139
  end
105
140
  end
106
141
 
107
142
  def human_mx_data
108
- name = Name.new
109
- name.dns = self[:name].dns
110
-
111
- pref = Types::Int16.new.read(self[:rdata][0, 2])
112
- exchange = name.read(self[:rdata][2..]).to_human
113
-
114
- '%u %s' % [pref.to_i, exchange]
143
+ mx = MX.new(dns: self[:name].dns).read(self[:rdata])
144
+ "#{mx.pref} #{mx.exchange}"
115
145
  end
116
146
 
117
- # rubocop:disable Metrics/AbcSize
147
+ # /rubocop:disable Metrics/AbcSize
118
148
  def human_soa_rdata
119
- name = Name.new
120
- name.dns = self[:name].dns
121
- mname = name.read(self[:rdata]).dup
122
- rname = name.read(self[:rdata][mname.sz..])
123
-
124
- serial = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz, 4])
125
- refresh = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 4, 4])
126
- retryi = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 8, 4])
127
- expire = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 12, 4])
128
- minimum = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 16, 4])
129
-
130
- "#{mname.to_human} #{rname.to_human} #{serial.to_i} #{refresh.to_i} " \
131
- "#{retryi.to_i} #{expire.to_i} #{minimum.to_i}"
149
+ soa = SOA.new(dns: self[:name].dns).read(self[:rdata])
150
+
151
+ "#{soa.mname} #{soa.rname} #{soa.serial} #{soa.refresh} " \
152
+ "#{soa.retryi} #{soa.expire} #{soa.minimum}"
132
153
  end
133
154
 
134
155
  def human_srv_data
135
- name = Name.new
136
- name.dns = self[:name].dns
137
-
138
- priority = Types::Int16.new.read(self[:rdata][0, 2])
139
- weight = Types::Int16.new.read(self[:rdata][2, 2])
140
- port = Types::Int16.new.read(self[:rdata][4, 2])
141
- target = name.read(self[:rdata][6, self[:rdata].size]).to_human
142
-
143
- "#{priority.to_i} #{weight.to_i} #{port.to_i} #{target}"
156
+ srv = SRV.new(dns: self[:name].dns).read(self[:rdata])
157
+ "#{srv.priority} #{srv.weight} #{srv.port} #{srv.target}"
144
158
  end
145
- # rubocop:enable Metrics/AbcSize
146
159
  end
147
160
  end
148
161
  end
@@ -11,28 +11,28 @@ module PacketGen
11
11
  class DNS
12
12
  # Define a DNS Ressource Record Section
13
13
  # @author Sylvain Daubert
14
- class RRSection < Types::Array
14
+ class RRSection < BinStruct::Array
15
15
  # @api private
16
16
  # @param [DNS] dns
17
- # @param [Types::Int] counter
17
+ # @param [BinStruct::Int] counter
18
18
  def initialize(dns, counter)
19
19
  super(counter: counter)
20
20
  @dns = dns
21
21
  end
22
22
 
23
23
  # Read RR section from a string
24
- # @param [String] str binary string
24
+ # @param [String] str binary binary string
25
25
  # @return [RRSection] self
26
26
  def read(str)
27
27
  clear
28
28
  return self if str.nil?
29
29
 
30
- PacketGen.force_binary str
30
+ str = str.b unless str.encoding == Encoding::BINARY
31
31
  while !str.empty? && (self.size < @counter.to_i)
32
32
  rr = RR.new(@dns).read(str)
33
33
  rr = OPT.new(@dns).read(str) if rr.type?('OPT')
34
34
  str.slice!(0, rr.sz)
35
- push rr
35
+ push(rr)
36
36
  end
37
37
  self
38
38
  end
@@ -40,7 +40,7 @@ module PacketGen
40
40
  private
41
41
 
42
42
  def record_from_hash(hsh)
43
- if hsh.key? :rtype
43
+ if hsh.key?(:rtype)
44
44
  case hsh.delete(:rtype)
45
45
  when 'Question'
46
46
  Question.new(@dns, hsh)
@@ -33,70 +33,77 @@ module PacketGen
33
33
  # * {#ns}, authoritary section,
34
34
  # * {#ar}, additional information section.
35
35
  #
36
- # == Create a DNS header
37
- # # standalone
38
- # dns = PacketGen::Header::DNS.new
39
- # # in a IP packet
40
- # pkt = PacketGen.gen('IP').add('DNS')
41
- # # access to DNS header
42
- # pkt.dns # => PacketGen::Header::DNS
36
+ # @example Create a DNS header
37
+ # # standalone
38
+ # dns = PacketGen::Header::DNS.new
39
+ # # in a IP packet
40
+ # pkt = PacketGen.gen('IP').add('UDP').add('DNS')
41
+ # # access to DNS header
42
+ # pkt.dns.class # => PacketGen::Header::DNS
43
43
  #
44
- # == DNS attributes
45
- # dns.id = 0x1234
46
- # dns.qr = false
47
- # # opcode may be set as an Integer (all values are possible)
48
- # # or as a String (only keys from PacketGen::Header::DNS::OPCODES)
49
- # dns.opcode = 0xe # set as integer, value not defined in standard
50
- # dns.opcode = 'query' # set as string
51
- # dns.aa = dns.tc = dns.rd = dns.ra = false
52
- # # rcode may be set as an Integer (all values are possible)
53
- # # or as a String (only keys from PacketGen::Header::DNS::RCODES)
54
- # dns.rcode = 11
55
- # dns.rcode = 'refused'
56
- # dns.qdcount = 123
57
- # dns.ancount = 0x1234
58
- # dns.nscount = 1
59
- # dns.arcount = 0
60
- # One can also access to DNS sections:
61
- # dns.qd # => PacketGen::Header::DNS::QDSection
62
- # dns.an # => PacketGen::Header::DNS::RRSection
63
- # dns.ns # => PacketGen::Header::DNS::RRSection
64
- # dns.ar # => PacketGen::Header::DNS::RRSection
44
+ # @example DNS attributes
45
+ # dns = PacketGen::Header::DNS.new
46
+ # dns.id = 0x1234
47
+ # dns.qr = false
48
+ # # opcode may be set as an Integer (all values are possible)
49
+ # # or as a String (only keys from PacketGen::Header::DNS::OPCODES)
50
+ # dns.opcode = 0xe # set as integer, value not defined in standard
51
+ # dns.opcode = 'query' # set as string
52
+ # # Set flags
53
+ # dns.aa = dns.tc = dns.rd = dns.ra = false
54
+ # # rcode may be set as an Integer (all values are possible)
55
+ # # or as a String (only keys from PacketGen::Header::DNS::RCODES)
56
+ # dns.rcode = 11
57
+ # dns.rcode = 'refused'
58
+ # # Section counts may be set by hand. They also be set automatically when adding
59
+ # # an element to a section.
60
+ # dns.qdcount = 123
61
+ # dns.ancount = 0x1234
62
+ # dns.nscount = 1
63
+ # dns.arcount = 0
64
+ # # Access to DNS sections:
65
+ # dns.qd.class # => PacketGen::Header::DNS::QDSection
66
+ # dns.an.class # => PacketGen::Header::DNS::RRSection
67
+ # dns.ns.class # => PacketGen::Header::DNS::RRSection
68
+ # dns.ar.class # => PacketGen::Header::DNS::RRSection
65
69
  #
66
- # == Add a question to DNS question section
67
- # Adding a {Question} with {QDSection#<<} automagically increments {#qdcount}.
68
- # To not modify +qdcount+, use {QDSection#push}.
69
- # # add a question about example.net IP address. Increment qdcount
70
- # dns.qd << PacketGen::Header::DNS::Question.new(dns, name: 'example.net')
71
- # # or
72
- # dns.qd << { rtype: 'Question', name: 'example.net' }
73
- # # add a question about example.net IPv6 address. Dot not modify qdcount
74
- # dns.qd.push PacketGen::Header::DNS::Question.new(dns, name: 'example.net', type: 'AAAA')
75
- # # or
76
- # dns.qd.push({ rtype: 'Question', name: 'example.net', type: 'AAAA' })
70
+ # @example Add a question to DNS question section
71
+ # dns = PacketGen::Header::DNS.new
72
+ # # add a question about example.net IP address. Increment qdcount
73
+ # dns.qd << PacketGen::Header::DNS::Question.new(dns, name: 'example.net')
74
+ # # or
75
+ # dns.qd << { rtype: 'Question', name: 'example.net' }
76
+ # dns.qdcount #=> 2
77
+ # # add a question about example.net IPv6 address. Dot not modify qdcount
78
+ # dns.qd.push(PacketGen::Header::DNS::Question.new(dns, name: 'example.net', type: 'AAAA'))
79
+ # # or
80
+ # dns.qd.push(rtype: 'Question', name: 'example.net', type: 'AAAA')
81
+ # dns.qdcount #=> 2
77
82
  #
78
- # == Add a ressource record to a DNS section
79
- # Adding a {RR} with {RRSection#<< RRSection#<<} automagically increments section counter.
80
- # To not modify it, use {RRSection#push RRSection#push}
81
- # # add a RR to answer section. Increment ancount
82
- # dns.an << PacketGen::Header::DNS::RR.new(dns, name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton)
83
- # # or
84
- # dns.an << { rtype: 'RR', name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton }
85
- # # add a RR to NS section. Dot not modify nscount
86
- # rdata = PacketGen::Header::DNS::Name.new(dns).parse('dns.net')
87
- # dns.ns.push PacketGen::Header::DNS::RR.new(dns, name: 'example.net', type: 'NS', rdata: rdata)
88
- # # or
89
- # dns.ns.push(rtype: 'RR', name: 'example.net', type: 'NS', rdata: rdata)
83
+ # @example Add a ressource record to a DNS section
84
+ # dns = PacketGen::Header::DNS.new
85
+ # # add a RR to answer section. Increment ancount
86
+ # dns.an << PacketGen::Header::DNS::RR.new(dns, name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton)
87
+ # # or
88
+ # dns.an << { rtype: 'RR', name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton }
89
+ # dns.ancount #=> 2
90
+ # # add a RR to NS section. Dot not modify nscount
91
+ # rdata = PacketGen::Header::DNS::Name.new(dns: dns).from_human('dns.net')
92
+ # dns.ns.push(PacketGen::Header::DNS::RR.new(dns, name: 'example.net', type: 'NS', rdata: rdata))
93
+ # # or
94
+ # dns.ns.push(rtype: 'RR', name: 'example.net', type: 'NS', rdata: rdata)
95
+ # dns.nscount #=> 0
90
96
  #
91
- # == Extended DNS EDNS(0)
92
- # # Add an OPT to ar section
93
- # dns.ar << PacketGen::Header::DNS::OPT.new(dns, udp_size: 4096, ext_rcode: 43)
94
- # # or
95
- # dns.ar << { rtype: 'OPT', udp_size: 4096, ext_rcode: 43 }
96
- # # add an option to OPT record
97
- # dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48, data: '12')
98
- # # or
99
- # dns.ar.last.options << { code: 48, data: '12' }
97
+ # @example Extended DNS (EDNS(0)) options
98
+ # dns = PacketGen::Header::DNS.new
99
+ # # Add an OPT to ar section
100
+ # dns.ar << PacketGen::Header::DNS::OPT.new(dns, udp_size: 4096, ext_rcode: 43)
101
+ # # or
102
+ # dns.ar << { rtype: 'OPT', udp_size: 4096, ext_rcode: 43 }
103
+ # # add an option to OPT record
104
+ # dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48, data: '12')
105
+ # # or
106
+ # dns.ar.last.options << { code: 48, data: '12' }
100
107
  # @author Sylvain Daubert
101
108
  # @since 1.3.0
102
109
  class DNS < Base
@@ -140,36 +147,11 @@ module PacketGen
140
147
  }.freeze
141
148
 
142
149
  # @!attribute id
150
+ # 16-bit identifier to match up replies and queries
143
151
  # @return [Integer]
144
- define_field :id, Types::Int16
152
+ define_attr :id, BinStruct::Int16
145
153
  # @!attribute u16
146
154
  # @return [Integer]
147
- define_field :u16, Types::Int16
148
- # @!attribute qdcount
149
- # @return [Integer]
150
- define_field :qdcount, Types::Int16
151
- # @!attribute ancount
152
- # @return [Integer]
153
- define_field :ancount, Types::Int16
154
- # @!attribute nscount
155
- # @return [Integer]
156
- define_field :nscount, Types::Int16
157
- # @!attribute arcount
158
- # @return [Integer]
159
- define_field :arcount, Types::Int16
160
- # @!attribute qd
161
- # @return [QDSection]
162
- define_field :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
163
- # @!attribute an
164
- # @return [RRSection]
165
- define_field :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
166
- # @!attribute ns
167
- # @return [RRSection]
168
- define_field :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
169
- # @!attribute ar
170
- # @return [RRSection]
171
- define_field :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
172
-
173
155
  # @!attribute qr
174
156
  # @return [Boolean] query (+false+) or response (+true+)
175
157
  # @!attribute opcode
@@ -188,11 +170,42 @@ module PacketGen
188
170
  # @return [Boolean] Checking Disabled
189
171
  # @!attribute rcode
190
172
  # @return [Integer] Response code. See {RCODES}.
191
- define_bit_fields_on :u16, :qr, :opcode, 4, :aa, :tc, :rd, :ra, :z,
192
- :ad, :cd, :rcode, 4
193
-
173
+ define_bit_attr :u16, qr: 1, opcode: 4, aa: 1, tc: 1, rd: 1, ra: 1, z: 1, ad: 1, cd: 1, rcode: 4
194
174
  undef opcode=, rcode=
195
175
 
176
+ # @!attribute qdcount
177
+ # Number of entries in {#qd question section}
178
+ # @return [Integer]
179
+ define_attr :qdcount, BinStruct::Int16
180
+ # @!attribute ancount
181
+ # Number of ressource recors in {#an answer section}
182
+ # @return [Integer]
183
+ define_attr :ancount, BinStruct::Int16
184
+ # @!attribute nscount
185
+ # Number of name resource recors in {#ns authority records section}
186
+ # @return [Integer]
187
+ define_attr :nscount, BinStruct::Int16
188
+ # @!attribute arcount
189
+ # Number of ressources recors in {#ar additional records section}
190
+ # @return [Integer]
191
+ define_attr :arcount, BinStruct::Int16
192
+ # @!attribute qd
193
+ # Question section
194
+ # @return [QDSection]
195
+ define_attr :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
196
+ # @!attribute an
197
+ # Answer section
198
+ # @return [RRSection]
199
+ define_attr :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
200
+ # @!attribute ns
201
+ # Authority records section
202
+ # @return [RRSection]
203
+ define_attr :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
204
+ # @!attribute ar
205
+ # Additional record section
206
+ # @return [RRSection]
207
+ define_attr :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
208
+
196
209
  # Set opcode
197
210
  # @param [Integer,String] value
198
211
  # @return [Integer]
@@ -12,16 +12,16 @@ module PacketGen
12
12
  class Dot11
13
13
  # IEEE 802.11 control frame header
14
14
  #
15
- # This class make a {Dot11} header with {#type} set to +1+
15
+ # This class makes a {Dot11} header with {#type} set to +1+
16
16
  # (control frame).
17
17
  #
18
18
  # A IEEE 802.11 control header consists of:
19
- # * a {#frame_ctrl} ({Types::Int16}),
20
- # * a {#id}/duration ({Types::Int16le}),
19
+ # * a {#frame_ctrl} (+BinStruct::Int16+),
20
+ # * a {#id}/duration (+BinStruct::Int16le+),
21
21
  # * a {#mac1} ({Eth::MacAddr}).
22
22
  # * sometimes a {#mac2} ({Eth::MacAddr}),
23
- # * a {#body} (a {Types::String} or another {Base} class),
24
- # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
23
+ # * a {#body} (a +BinStruct::String+ or another {Headerable} class),
24
+ # * and a Frame check sequence ({#fcs}, of type +BinStruct::Int32le+).
25
25
  # @author Sylvain Daubert
26
26
  class Control < Dot11
27
27
  # Control subtypes
@@ -44,8 +44,8 @@ module PacketGen
44
44
  # @see Base#initialize
45
45
  def initialize(options={})
46
46
  super({ type: 1 }.merge!(options))
47
- @applicable_fields -= %i[mac3 sequence_ctrl mac4 qos_ctrl ht_ctrl]
48
- define_applicable_fields
47
+ @applicable_attributes -= %i[mac3 sequence_ctrl mac4 qos_ctrl ht_ctrl]
48
+ define_applicable_attributes
49
49
  end
50
50
 
51
51
  # Get human readable subtype
@@ -56,12 +56,12 @@ module PacketGen
56
56
 
57
57
  private
58
58
 
59
- def define_applicable_fields
59
+ def define_applicable_attributes
60
60
  super
61
- if @applicable_fields.include? :mac2
62
- @applicable_fields -= %i[mac2] unless SUBTYPES_WITH_MAC2.include? self.subtype
63
- elsif SUBTYPES_WITH_MAC2.include? self.subtype
64
- @applicable_fields[3, 0] = :mac2
61
+ if @applicable_attributes.include?(:mac2)
62
+ @applicable_attributes -= %i[mac2] unless SUBTYPES_WITH_MAC2.include?(self.subtype)
63
+ elsif SUBTYPES_WITH_MAC2.include?(self.subtype)
64
+ @applicable_attributes[3, 0] = :mac2
65
65
  end
66
66
  end
67
67
  end
@@ -16,23 +16,24 @@ module PacketGen
16
16
  # (data frame).
17
17
  #
18
18
  # A IEEE 802.11 data header consists of:
19
- # * a {#frame_ctrl} ({Types::Int16}),
20
- # * a {#id}/duration ({Types::Int16le}),
19
+ # * a {#frame_ctrl} (+BinStruct::Int16+),
20
+ # * a {#id}/duration (+BinStruct::Int16le+),
21
+ # * a {#mac1} ({Eth::MacAddr}),
21
22
  # * a {#mac2} ({Eth::MacAddr}),
22
23
  # * a {#mac3} ({Eth::MacAddr}),
23
- # * a {#sequence_ctrl} ({Types::Int16}),
24
+ # * a {#sequence_ctrl} (+BinStruct::Int16+),
24
25
  # * sometimes a {#mac4} ({Eth::MacAddr}),
25
- # * sometimes a {#qos_ctrl} ({Types::Int16}),
26
- # * a {#body} (a {Types::String} or another {Base} class),
27
- # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
26
+ # * sometimes a {#qos_ctrl} (+BinStruct::Int16+),
27
+ # * a {#body} (a +BinStruct::String+ or another {Headerable} class),
28
+ # * and a Frame check sequence ({#fcs}, of type +BinStruct::Int32le+).
28
29
  # @author Sylvain Daubert
29
30
  class Data < Dot11
30
31
  # @param [Hash] options
31
32
  # @see Base#initialize
32
33
  def initialize(options={})
33
34
  super({ type: 2 }.merge!(options))
34
- @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
35
- define_applicable_fields
35
+ @applicable_attributes -= %i[mac4 qos_ctrl ht_ctrl]
36
+ define_applicable_attributes
36
37
  end
37
38
 
38
39
  # Invert source and destination addresses (see Table 8-19 from
@@ -45,34 +46,34 @@ module PacketGen
45
46
  case ds
46
47
  when 0
47
48
  # MAC1: RA/DA, MAC2: TA/SA
48
- invert_mac :mac1, :mac2
49
+ invert_mac(:mac1, :mac2)
49
50
  when 1
50
51
  # MAC1: RA/BSSID, MAC2: TA/SA, MAC3: DA
51
- invert_mac :mac1, :mac2
52
+ invert_mac(:mac1, :mac2)
52
53
  self.to_ds = false
53
54
  self.from_ds = true
54
55
  when 2
55
56
  # MAC1: RA/DA, MAC2: BSSID, MAC3: SA or BSSID
56
- invert_mac :mac1, :mac2
57
+ invert_mac(:mac1, :mac2)
57
58
  self.to_ds = true
58
59
  self.from_ds = false
59
60
  when 3
60
61
  # MAC1: RA, MAC2: TA
61
- invert_mac :mac1, :mac2
62
+ invert_mac(:mac1, :mac2)
62
63
  # MAC3: DA, MAC4: SA
63
- invert_mac :mac3, :mac4
64
+ invert_mac(:mac3, :mac4)
64
65
  end
65
66
  self
66
67
  end
67
68
 
68
- # Get destination MAC address
69
+ # Get destination MAC address. {#from_ds} and {#to_ds} must be set before using these method.
69
70
  # @return [String]
70
71
  def dst
71
72
  _src_mac, dst_mac = src_dst_from_mac
72
73
  self.send(dst_mac)
73
74
  end
74
75
 
75
- # Set destination MAC address
76
+ # Set destination MAC address. {#from_ds} and {#to_ds} must be set before using these method.
76
77
  # @param [String] mac MAC address to set
77
78
  # @return [String]
78
79
  def dst=(mac)
@@ -80,14 +81,14 @@ module PacketGen
80
81
  self.send(:"#{dst_mac}=", mac)
81
82
  end
82
83
 
83
- # Get source MAC address
84
+ # Get source MAC address. {#from_ds} and {#to_ds} must be set before using these method.
84
85
  # @return [String]
85
86
  def src
86
87
  src_mac, = src_dst_from_mac
87
88
  self.send(src_mac)
88
89
  end
89
90
 
90
- # Set source MAC address
91
+ # Set source MAC address. {#from_ds} and {#to_ds} must be set before using these method.
91
92
  # @param [String] mac MAC address to set
92
93
  # @return [String]
93
94
  def src=(mac)
@@ -111,19 +112,19 @@ module PacketGen
111
112
  end
112
113
  end
113
114
 
114
- def define_applicable_fields
115
+ def define_applicable_attributes
115
116
  super
116
- if (subtype >= 8) && !@applicable_fields.include?(:qos_ctrl)
117
+ if (subtype >= 8) && !@applicable_attributes.include?(:qos_ctrl)
117
118
  # Insert after mac4, if present
118
119
  # else insert after sequence_ctrl
119
- if @applicable_fields.include? :mac4
120
- idx = @applicable_fields.index(:mac4)
121
- @applicable_fields[idx, 0] = :qos_ctrl
120
+ if @applicable_attributes.include? :mac4
121
+ idx = @applicable_attributes.index(:mac4)
122
+ @applicable_attributes[idx, 0] = :qos_ctrl
122
123
  else
123
- @applicable_fields[6, 0] = :qos_ctrl
124
+ @applicable_attributes[6, 0] = :qos_ctrl
124
125
  end
125
126
  elsif subtype < 8
126
- @applicable_fields -= %i[qos_ctrl]
127
+ @applicable_attributes -= %i[qos_ctrl]
127
128
  end
128
129
  end
129
130
 
@@ -15,10 +15,10 @@ module PacketGen
15
15
  # #
16
16
  # # An {Element} is a piece of data contained in a Dot11 management frame.
17
17
  # # @since 1.4.0
18
- # # @since 3.1.0 subclass of {Types::AbstractTLV}
19
- # class Element < Types::AbstractTLV; end
18
+ # # @since 3.1.0 subclass of +BinStruct::AbstractTLV+
19
+ # class Element < BinStruct::AbstractTLV; end
20
20
  # @private
21
- Element = Types::AbstractTLV.create
21
+ Element = BinStruct::AbstractTLV.create
22
22
 
23
23
  class Element
24
24
  # Known element types
@@ -44,7 +44,7 @@ module PacketGen
44
44
 
45
45
  # Array of {Element}.
46
46
  # @since 3.1.1
47
- class ArrayOfElements < Types::Array
47
+ class ArrayOfElements < BinStruct::Array
48
48
  set_of Element
49
49
  end
50
50
  end