packetgen 2.6.0 → 2.7.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- metadata +19 -17
@@ -7,8 +7,7 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
|
-
# Dynamic Host Configuration Protocol for IPv6, {https://tools.ietf.org/html/rfc3315
|
10
|
+
# Dynamic Host Configuration Protocol for IPv6, {https://tools.ietf.org/html/rfc3315
|
12
11
|
# RFC 3315}
|
13
12
|
#
|
14
13
|
# 0 1 2 3
|
@@ -41,13 +40,14 @@ module PacketGen
|
|
41
40
|
# dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
|
42
41
|
# dhcpv6.options << { type: 'Preference', value: 1 }
|
43
42
|
# @author Sylvain Daubert
|
44
|
-
|
43
|
+
# @since 2.5.0
|
44
|
+
class DHCPv6 < Base; end
|
45
45
|
|
46
46
|
require_relative 'dhcpv6/duid'
|
47
47
|
require_relative 'dhcpv6/option'
|
48
48
|
require_relative 'dhcpv6/options'
|
49
49
|
|
50
|
-
class DHCPv6
|
50
|
+
class DHCPv6
|
51
51
|
# DHCPv6 UDP client port
|
52
52
|
UDP_CLIENT_PORT = 546
|
53
53
|
# DHCPv6 UDP client port
|
@@ -65,9 +65,9 @@ module PacketGen
|
|
65
65
|
'RELEASE' => 8,
|
66
66
|
'DECLINE' => 9,
|
67
67
|
'RECONFIGURE' => 10,
|
68
|
-
'INFORMATION-REQUEST' =>
|
69
|
-
}
|
70
|
-
|
68
|
+
'INFORMATION-REQUEST' => 11
|
69
|
+
}.freeze
|
70
|
+
|
71
71
|
# @!attribute msg_type
|
72
72
|
# 8-bit message type
|
73
73
|
# @return [Integer]
|
@@ -85,7 +85,7 @@ module PacketGen
|
|
85
85
|
# @return [DHCPv6,DHCPv6::Relay]
|
86
86
|
def read(str)
|
87
87
|
msg_type = Types::Int8.new.read(str)
|
88
|
-
|
88
|
+
|
89
89
|
case msg_type
|
90
90
|
when 12, 13
|
91
91
|
DHCPv6::Relay.new.read(str)
|
@@ -101,8 +101,8 @@ module PacketGen
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
UDP.
|
105
|
-
UDP.
|
104
|
+
UDP.bind DHCPv6, sport: DHCPv6::UDP_CLIENT_PORT, dport: DHCPv6::UDP_SERVER_PORT
|
105
|
+
UDP.bind DHCPv6, sport: DHCPv6::UDP_SERVER_PORT, dport: DHCPv6::UDP_CLIENT_PORT
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
@@ -11,12 +11,11 @@ module PacketGen
|
|
11
11
|
# @abstract Base class for DUID (DHCP Unique ID)
|
12
12
|
# @author Sylvain Daubert
|
13
13
|
class DUID < Types::Fields
|
14
|
-
|
15
14
|
TYPES = {
|
16
15
|
'DUID-LLT' => 1,
|
17
16
|
'DUID-EN' => 2,
|
18
17
|
'DUID-LL' => 3
|
19
|
-
}
|
18
|
+
}.freeze
|
20
19
|
|
21
20
|
# @!attribute type
|
22
21
|
# 16-bit DUID type
|
@@ -117,7 +116,7 @@ module PacketGen
|
|
117
116
|
# Get human-readable DUID description
|
118
117
|
# @return [String]
|
119
118
|
def to_human
|
120
|
-
|
119
|
+
'DUID_EN<%#x,%s>' % [en, identifier]
|
121
120
|
end
|
122
121
|
end
|
123
122
|
|
@@ -8,7 +8,6 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class DHCPv6
|
11
|
-
|
12
11
|
# A DHCPv6 consists of:
|
13
12
|
# * a {#type} ({Types::Int16}),
|
14
13
|
# * a {#length} ({Types::Int16}),
|
@@ -18,7 +17,6 @@ module PacketGen
|
|
18
17
|
# field to replace it by specific option field(s).
|
19
18
|
# @author Sylvain Daubert
|
20
19
|
class Option < Types::Fields
|
21
|
-
|
22
20
|
# @!attribute type
|
23
21
|
# 16-bit option type
|
24
22
|
# @return [Integer]
|
@@ -31,7 +29,7 @@ module PacketGen
|
|
31
29
|
# variable length option data.
|
32
30
|
# @return [String]
|
33
31
|
define_field :data, Types::String,
|
34
|
-
builder: ->(h,t) { t.new(length_from: h[:length]) }
|
32
|
+
builder: ->(h, t) { t.new(length_from: h[:length]) }
|
35
33
|
|
36
34
|
class << self
|
37
35
|
# Get Option subclasses
|
@@ -41,7 +39,7 @@ module PacketGen
|
|
41
39
|
@klasses = []
|
42
40
|
DHCPv6.constants.each do |cst|
|
43
41
|
klass = DHCPv6.const_get(cst)
|
44
|
-
next unless klass.is_a?(Class)
|
42
|
+
next unless klass.is_a?(Class) && (klass < Option)
|
45
43
|
@klasses[klass.new.type] = klass
|
46
44
|
end
|
47
45
|
@klasses
|
@@ -74,16 +72,13 @@ module PacketGen
|
|
74
72
|
# Create an Option
|
75
73
|
# @param [Hash] options
|
76
74
|
def initialize(options={})
|
77
|
-
if self.class.const_defined?(:TYPE)
|
75
|
+
if self.class.const_defined?(:TYPE) && options[:type].nil?
|
78
76
|
options[:type] = self.class.const_get(:TYPE)
|
79
77
|
end
|
80
|
-
|
81
|
-
|
82
|
-
end
|
78
|
+
|
79
|
+
options[:length] = options[:data].to_s.size if options[:data]
|
83
80
|
super
|
84
|
-
if options[:data].nil?
|
85
|
-
self.length = self.sz - 4
|
86
|
-
end
|
81
|
+
self.length = self.sz - 4 if options[:data].nil?
|
87
82
|
end
|
88
83
|
|
89
84
|
alias private_read read
|
@@ -122,7 +117,7 @@ module PacketGen
|
|
122
117
|
# @return [String]
|
123
118
|
def to_human
|
124
119
|
str = "#{human_type}:".dup
|
125
|
-
if respond_to?
|
120
|
+
if respond_to?(:human_data) && !human_data.empty?
|
126
121
|
str << human_data
|
127
122
|
elsif !self[:data].nil?
|
128
123
|
str << data.inspect
|
@@ -146,7 +141,7 @@ module PacketGen
|
|
146
141
|
# @!attribute duid
|
147
142
|
# @return [DUID]
|
148
143
|
define_field :duid, DUID
|
149
|
-
|
144
|
+
|
150
145
|
# Get human-readable data (DUID)
|
151
146
|
# @return [String]
|
152
147
|
def human_data
|
@@ -187,12 +182,12 @@ module PacketGen
|
|
187
182
|
# options field
|
188
183
|
# @return [String]
|
189
184
|
define_field :options, Types::String,
|
190
|
-
builder: ->(h,t) { t.new length_from: ->
|
185
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 12 } }
|
191
186
|
|
192
187
|
# Get human-readable data (IAID, T1 and T2)
|
193
188
|
# @return [String]
|
194
189
|
def human_data
|
195
|
-
|
190
|
+
'%#x,%u,%u' % [iaid, t1, t2]
|
196
191
|
end
|
197
192
|
end
|
198
193
|
|
@@ -214,12 +209,12 @@ module PacketGen
|
|
214
209
|
# options field
|
215
210
|
# @return [String]
|
216
211
|
define_field :options, Types::String,
|
217
|
-
builder: ->(h,t) { t.new length_from: ->
|
212
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 4 } }
|
218
213
|
|
219
214
|
# Get human-readable data (IAID)
|
220
215
|
# @return [String]
|
221
216
|
def human_data
|
222
|
-
|
217
|
+
'%#x' % iaid
|
223
218
|
end
|
224
219
|
end
|
225
220
|
|
@@ -249,7 +244,7 @@ module PacketGen
|
|
249
244
|
# options field
|
250
245
|
# @return [String]
|
251
246
|
define_field :options, Types::String,
|
252
|
-
builder: ->(h,t) { t.new length_from: ->
|
247
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 24 } }
|
253
248
|
|
254
249
|
# Get human-readable data (ipv6, preferred lifetime and valid lifetime)
|
255
250
|
# @return [String]
|
@@ -295,7 +290,7 @@ module PacketGen
|
|
295
290
|
self[:options].to_human
|
296
291
|
end
|
297
292
|
end
|
298
|
-
|
293
|
+
|
299
294
|
# DHCPv6 Preference option
|
300
295
|
# @author Sylvain Daubert
|
301
296
|
class Preference < Option
|
@@ -317,7 +312,7 @@ module PacketGen
|
|
317
312
|
value.to_s
|
318
313
|
end
|
319
314
|
end
|
320
|
-
|
315
|
+
|
321
316
|
# DHCPv6 Elapsed Time option
|
322
317
|
# @author Sylvain Daubert
|
323
318
|
class ElapsedTime < Option
|
@@ -339,7 +334,7 @@ module PacketGen
|
|
339
334
|
value.to_s
|
340
335
|
end
|
341
336
|
end
|
342
|
-
|
337
|
+
|
343
338
|
# DHCPv6 Relay Message option
|
344
339
|
# @author Sylvain Daubert
|
345
340
|
class RelayMessage < Option
|
@@ -15,8 +15,8 @@ module PacketGen
|
|
15
15
|
MESSAGE_TYPES = {
|
16
16
|
'RELAY-FORW' => 12,
|
17
17
|
'RELAY-REPL' => 13
|
18
|
-
}
|
19
|
-
|
18
|
+
}.freeze
|
19
|
+
|
20
20
|
# @!attribute msg_type
|
21
21
|
# 8-bit message type
|
22
22
|
# @return [Integer]
|
@@ -42,7 +42,9 @@ module PacketGen
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
UDP.
|
46
|
-
UDP.
|
45
|
+
UDP.bind DHCPv6::Relay, sport: DHCPv6::UDP_CLIENT_PORT
|
46
|
+
UDP.bind DHCPv6::Relay, dport: DHCPv6::UDP_SERVER_PORT
|
47
|
+
UDP.bind DHCPv6::Relay, sport: DHCPv6::UDP_SERVER_PORT
|
48
|
+
UDP.bind DHCPv6::Relay, dport: DHCPv6::UDP_CLIENT_PORT
|
47
49
|
end
|
48
50
|
end
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
|
-
|
12
11
|
# DNS: Domain Name Service
|
13
12
|
#
|
14
13
|
# A DNS packet consists of a header:
|
@@ -92,6 +91,7 @@ module PacketGen
|
|
92
91
|
# # add an option to OPT record
|
93
92
|
# dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48, length: 2, data: "12")
|
94
93
|
# @author Sylvain Daubert
|
94
|
+
# @since 1.3.0
|
95
95
|
class DNS < Base
|
96
96
|
end
|
97
97
|
end
|
@@ -119,7 +119,7 @@ module PacketGen
|
|
119
119
|
'status' => 2,
|
120
120
|
'notify' => 4,
|
121
121
|
'update' => 5
|
122
|
-
}
|
122
|
+
}.freeze
|
123
123
|
|
124
124
|
# DNS Response codes
|
125
125
|
RCODES = {
|
@@ -130,7 +130,7 @@ module PacketGen
|
|
130
130
|
'name-error' => 3,
|
131
131
|
'not-implemented' => 4,
|
132
132
|
'refused' => 5
|
133
|
-
}
|
133
|
+
}.freeze
|
134
134
|
|
135
135
|
# @!attribute id
|
136
136
|
# @return [Integer]
|
@@ -152,16 +152,16 @@ module PacketGen
|
|
152
152
|
define_field :arcount, Types::Int16
|
153
153
|
# @!attribute qd
|
154
154
|
# @return [QDSection]
|
155
|
-
define_field :qd, QDSection, builder: ->(h,t) { t.new(h, h[:qdcount]) }
|
155
|
+
define_field :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
|
156
156
|
# @!attribute an
|
157
157
|
# @return [RRSection]
|
158
|
-
define_field :an, RRSection, builder: ->(h,t) { t.new(h, h[:ancount]) }
|
158
|
+
define_field :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
|
159
159
|
# @!attribute ns
|
160
160
|
# @return [RRSection]
|
161
|
-
define_field :ns, RRSection, builder: ->(h,t) { t.new(h, h[:nscount]) }
|
161
|
+
define_field :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
|
162
162
|
# @!attribute ar
|
163
163
|
# @return [RRSection]
|
164
|
-
define_field :ar, RRSection, builder: ->(h,t) { t.new(h, h[:arcount]) }
|
164
|
+
define_field :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
|
165
165
|
|
166
166
|
# @!attribute qr
|
167
167
|
# @return [Boolean] query (+false+) or response (+true+)
|
@@ -253,8 +253,8 @@ module PacketGen
|
|
253
253
|
str = Inspect.dashed_line(self.class, 2)
|
254
254
|
fields.each do |attr|
|
255
255
|
if attr == :u16
|
256
|
-
flags = [
|
257
|
-
|
256
|
+
flags = %i[qr aa tc rd ra].select! { |flag| send "#{flag}?" }
|
257
|
+
.map(&:to_s).join(',')
|
258
258
|
str << Inspect.shift_level(2)
|
259
259
|
str << Inspect::FMT_ATTR % ['Flags', 'flags', flags]
|
260
260
|
opcode = '%-10s (%u)' % [OPCODES.key(self.opcode), self.opcode]
|
@@ -272,7 +272,9 @@ module PacketGen
|
|
272
272
|
end
|
273
273
|
|
274
274
|
self.add_class DNS
|
275
|
-
UDP.
|
276
|
-
|
275
|
+
UDP.bind DNS, dport: DNS::UDP_PORT
|
276
|
+
UDP.bind DNS, sport: DNS::UDP_PORT
|
277
|
+
TCP.bind DNS, dport: DNS::TCP_PORT
|
278
|
+
TCP.bind DNS, sport: DNS::TCP_PORT
|
277
279
|
end
|
278
280
|
end
|
@@ -8,11 +8,9 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class DNS
|
11
|
-
|
12
11
|
# DNS Name, defined as a suite of labels. A label is of type {Types::IntString}.
|
13
12
|
# @author Sylvain Daubert
|
14
13
|
class Name < Types::Array
|
15
|
-
|
16
14
|
# Mask to decode a pointer on another label
|
17
15
|
POINTER_MASK = 0xc000
|
18
16
|
|
@@ -56,7 +54,7 @@ module PacketGen
|
|
56
54
|
|
57
55
|
force_binary str
|
58
56
|
start = 0
|
59
|
-
|
57
|
+
loop do
|
60
58
|
index = str[start, 2].unpack('n').first
|
61
59
|
if pointer? index
|
62
60
|
# Pointer on another label
|
@@ -67,7 +65,7 @@ module PacketGen
|
|
67
65
|
label.read(str[start..-1])
|
68
66
|
start += label.sz
|
69
67
|
self << label
|
70
|
-
break if label.length
|
68
|
+
break if label.length.zero? || str[start..-1].length.zero?
|
71
69
|
end
|
72
70
|
end
|
73
71
|
# force resolution of compressed names
|
@@ -101,7 +99,7 @@ module PacketGen
|
|
101
99
|
def name_from_pointer
|
102
100
|
return nil unless @pointer
|
103
101
|
return @pointer_name if @pointer_name
|
104
|
-
|
102
|
+
|
105
103
|
index = @pointer.unpack('n').first
|
106
104
|
mask = ~POINTER_MASK & 0xffff
|
107
105
|
ptr = index & mask
|
@@ -110,7 +108,7 @@ module PacketGen
|
|
110
108
|
@pointer_name = name.read(self.dns.to_s[ptr..-1]).to_human
|
111
109
|
end
|
112
110
|
|
113
|
-
def record_from_hash(
|
111
|
+
def record_from_hash(_hsh)
|
114
112
|
raise NotImplementedError, "not supported by #{self.class}"
|
115
113
|
end
|
116
114
|
end
|
@@ -4,12 +4,12 @@
|
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
6
|
# frozen_string_literal: true
|
7
|
+
|
7
8
|
require_relative 'option'
|
8
9
|
|
9
10
|
module PacketGen
|
10
11
|
module Header
|
11
12
|
class DNS
|
12
|
-
|
13
13
|
# OPT pseudo-RR. Used by Extended DNS (EDNS(0), cf. RFC 6891).
|
14
14
|
#
|
15
15
|
# a OPT record may contain zero or more {Option options} in its {#rdata}.
|
@@ -43,68 +43,68 @@ module PacketGen
|
|
43
43
|
self.do = options[:do] unless options[:do].nil?
|
44
44
|
end
|
45
45
|
|
46
|
-
# @overload ext_rcode=(
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
46
|
+
# @overload ext_rcode=(value)
|
47
|
+
# Setter for upper 8 bits of extended 12-bit RCODE
|
48
|
+
# @param [Integer] value
|
49
|
+
# @return [Integer]
|
50
50
|
# @overload ext_rcode
|
51
|
-
#
|
52
|
-
#
|
51
|
+
# Getter for upper 8 bits of extended 12-bit RCODE
|
52
|
+
# @return [Integer]
|
53
53
|
# @return [Integer]
|
54
|
-
def ext_rcode=(
|
55
|
-
if
|
54
|
+
def ext_rcode=(value=nil)
|
55
|
+
if value
|
56
56
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(0xff << 24))
|
57
|
-
self[:ttl].value |= (
|
57
|
+
self[:ttl].value |= (value & 0xff) << 24
|
58
58
|
end
|
59
59
|
(self[:ttl].to_i >> 24) & 0xff
|
60
60
|
end
|
61
61
|
alias ext_rcode ext_rcode=
|
62
62
|
|
63
|
-
# @overload version=(
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
63
|
+
# @overload version=(ver)
|
64
|
+
# Setter EDNS version
|
65
|
+
# @param [Integer] ver
|
66
|
+
# @return [Integer]
|
67
67
|
# @overload version
|
68
|
-
#
|
69
|
-
#
|
68
|
+
# Getter for EDNS version
|
69
|
+
# @return [Integer]
|
70
70
|
# @return [Integer]
|
71
|
-
def version=(
|
72
|
-
if
|
71
|
+
def version=(ver=nil)
|
72
|
+
if ver
|
73
73
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(0xff << 16))
|
74
|
-
self[:ttl].value |= (
|
74
|
+
self[:ttl].value |= (ver & 0xff) << 16
|
75
75
|
end
|
76
76
|
(self[:ttl].to_i >> 16) & 0xff
|
77
77
|
end
|
78
78
|
alias version version=
|
79
79
|
|
80
|
-
# @overload do=(
|
80
|
+
# @overload do=(value)
|
81
81
|
# Setter EDNS do
|
82
|
-
# @param [Boolean]
|
82
|
+
# @param [Boolean] value
|
83
83
|
# @return [Boolean]
|
84
84
|
# @overload do?
|
85
85
|
# Getter for EDNS do
|
86
86
|
# @return [Boolean]
|
87
87
|
# @return [Boolean]
|
88
|
-
def do=(
|
89
|
-
b =
|
90
|
-
unless
|
88
|
+
def do=(value=nil)
|
89
|
+
b = value ? 1 : 0
|
90
|
+
unless value.nil?
|
91
91
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(1 << 15))
|
92
92
|
self[:ttl].value |= (b & 1) << 15
|
93
93
|
end
|
94
|
-
((self[:ttl].to_i >> 15) & 1) == 1
|
94
|
+
((self[:ttl].to_i >> 15) & 1) == 1
|
95
95
|
end
|
96
|
-
alias
|
96
|
+
alias do? do=
|
97
97
|
|
98
|
-
# @overload z=(
|
99
|
-
# @param [Integer]
|
98
|
+
# @overload z=(value)
|
99
|
+
# @param [Integer] value
|
100
100
|
# @return [Integer]
|
101
101
|
# @overload z
|
102
102
|
# @return [Integer]
|
103
103
|
# @return [Integer]
|
104
|
-
def z=(
|
105
|
-
if
|
104
|
+
def z=(value=nil)
|
105
|
+
if value
|
106
106
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~0x7fff)
|
107
|
-
self[:ttl].value |=
|
107
|
+
self[:ttl].value |= value & 0x7fff
|
108
108
|
end
|
109
109
|
self[:ttl].to_i & 0x7fff
|
110
110
|
end
|