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.
- checksums.yaml +4 -4
- data/README.md +38 -22
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +14 -8
- data/lib/packetgen/header/arp.rb +17 -18
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +42 -40
- data/lib/packetgen/header/bootp.rb +35 -37
- data/lib/packetgen/header/dhcp/option.rb +21 -21
- data/lib/packetgen/header/dhcp/options.rb +3 -3
- data/lib/packetgen/header/dhcp.rb +8 -9
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +83 -61
- data/lib/packetgen/header/dhcpv6/options.rb +4 -4
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
- data/lib/packetgen/header/dhcpv6.rb +17 -18
- data/lib/packetgen/header/dns/name.rb +21 -16
- data/lib/packetgen/header/dns/opt.rb +5 -2
- data/lib/packetgen/header/dns/option.rb +14 -14
- data/lib/packetgen/header/dns/qdsection.rb +3 -3
- data/lib/packetgen/header/dns/question.rb +7 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +6 -6
- data/lib/packetgen/header/dns.rb +103 -90
- data/lib/packetgen/header/dot11/control.rb +12 -12
- data/lib/packetgen/header/dot11/data.rb +25 -24
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +21 -18
- data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
- data/lib/packetgen/header/dot11.rb +117 -122
- data/lib/packetgen/header/dot1q.rb +12 -13
- data/lib/packetgen/header/dot1x.rb +13 -13
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +16 -8
- data/lib/packetgen/header/eap/tls.rb +18 -19
- data/lib/packetgen/header/eap/ttls.rb +22 -21
- data/lib/packetgen/header/eap.rb +73 -48
- data/lib/packetgen/header/eth.rb +41 -27
- data/lib/packetgen/header/gre.rb +33 -11
- data/lib/packetgen/header/http/headers.rb +7 -6
- data/lib/packetgen/header/http/request.rb +38 -29
- data/lib/packetgen/header/http/response.rb +35 -27
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +14 -14
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +26 -15
- data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +5 -5
- data/lib/packetgen/header/igmpv3.rb +12 -11
- data/lib/packetgen/header/ip/addr.rb +19 -15
- data/lib/packetgen/header/ip/option.rb +47 -36
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +77 -95
- data/lib/packetgen/header/ipv6/addr.rb +28 -27
- data/lib/packetgen/header/ipv6/extension.rb +13 -11
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
- data/lib/packetgen/header/ipv6.rb +42 -35
- data/lib/packetgen/header/llc.rb +28 -21
- data/lib/packetgen/header/mdns.rb +10 -3
- data/lib/packetgen/header/mld.rb +15 -13
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
- data/lib/packetgen/header/mldv2/mlq.rb +22 -24
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
- data/lib/packetgen/header/ospfv2/hello.rb +18 -17
- data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
- data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
- data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
- data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv2.rb +49 -46
- data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
- data/lib/packetgen/header/ospfv3/hello.rb +17 -16
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
- data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
- data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
- data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv3.rb +54 -52
- data/lib/packetgen/header/sctp/chunk.rb +80 -56
- data/lib/packetgen/header/sctp/error.rb +174 -202
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +89 -136
- data/lib/packetgen/header/sctp.rb +19 -8
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +52 -39
- data/lib/packetgen/header/tcp/options.rb +13 -5
- data/lib/packetgen/header/tcp.rb +83 -65
- data/lib/packetgen/header/tftp.rb +31 -25
- data/lib/packetgen/header/udp.rb +21 -19
- data/lib/packetgen/header.rb +23 -18
- data/lib/packetgen/headerable.rb +21 -5
- data/lib/packetgen/inspect.rb +3 -8
- data/lib/packetgen/packet.rb +146 -71
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +20 -18
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +44 -111
- data/lib/packetgen/pcapng/idb.rb +11 -12
- data/lib/packetgen/pcapng/shb.rb +15 -16
- data/lib/packetgen/pcapng/spb.rb +9 -11
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +6 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +5 -1
- data/lib/packetgen/unknown_packet.rb +5 -5
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +4 -3
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +12 -5
- metadata +29 -38
- data/lib/packetgen/types/abstract_tlv.rb +0 -278
- data/lib/packetgen/types/array.rb +0 -287
- data/lib/packetgen/types/cstring.rb +0 -109
- data/lib/packetgen/types/enum.rb +0 -171
- data/lib/packetgen/types/fieldable.rb +0 -66
- data/lib/packetgen/types/fields.rb +0 -622
- data/lib/packetgen/types/int.rb +0 -473
- data/lib/packetgen/types/int_string.rb +0 -102
- data/lib/packetgen/types/length_from.rb +0 -54
- data/lib/packetgen/types/oui.rb +0 -52
- data/lib/packetgen/types/string.rb +0 -97
- data/lib/packetgen/types/tlv.rb +0 -161
- 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
|
-
|
19
|
+
define_attr :ttl, BinStruct::Int32
|
19
20
|
# @!attribute rdlength
|
20
21
|
# 16-bit {#rdata} length
|
21
22
|
# @return [Integer]
|
22
|
-
|
23
|
+
define_attr :rdlength, BinStruct::Int16
|
23
24
|
# @!attribute rdata
|
24
|
-
# @return [
|
25
|
-
|
26
|
-
|
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].
|
51
|
-
self[:rdata].read
|
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?
|
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
|
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
|
-
|
109
|
-
|
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
|
-
|
120
|
-
|
121
|
-
mname
|
122
|
-
|
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
|
-
|
136
|
-
|
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 <
|
14
|
+
class RRSection < BinStruct::Array
|
15
15
|
# @api private
|
16
16
|
# @param [DNS] dns
|
17
|
-
# @param [
|
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
|
-
|
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
|
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?
|
43
|
+
if hsh.key?(:rtype)
|
44
44
|
case hsh.delete(:rtype)
|
45
45
|
when 'Question'
|
46
46
|
Question.new(@dns, hsh)
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -33,70 +33,77 @@ module PacketGen
|
|
33
33
|
# * {#ns}, authoritary section,
|
34
34
|
# * {#ar}, additional information section.
|
35
35
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
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
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
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
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
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
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
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
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
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
|
-
|
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
|
-
|
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
|
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} (
|
20
|
-
# * a {#id}/duration (
|
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
|
24
|
-
# * and a Frame check sequence ({#fcs}, of type
|
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
|
-
@
|
48
|
-
|
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
|
59
|
+
def define_applicable_attributes
|
60
60
|
super
|
61
|
-
if @
|
62
|
-
@
|
63
|
-
elsif SUBTYPES_WITH_MAC2.include?
|
64
|
-
@
|
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} (
|
20
|
-
# * a {#id}/duration (
|
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} (
|
24
|
+
# * a {#sequence_ctrl} (+BinStruct::Int16+),
|
24
25
|
# * sometimes a {#mac4} ({Eth::MacAddr}),
|
25
|
-
# * sometimes a {#qos_ctrl} (
|
26
|
-
# * a {#body} (a
|
27
|
-
# * and a Frame check sequence ({#fcs}, of type
|
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
|
-
@
|
35
|
-
|
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
|
49
|
+
invert_mac(:mac1, :mac2)
|
49
50
|
when 1
|
50
51
|
# MAC1: RA/BSSID, MAC2: TA/SA, MAC3: DA
|
51
|
-
invert_mac
|
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
|
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
|
62
|
+
invert_mac(:mac1, :mac2)
|
62
63
|
# MAC3: DA, MAC4: SA
|
63
|
-
invert_mac
|
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
|
115
|
+
def define_applicable_attributes
|
115
116
|
super
|
116
|
-
if (subtype >= 8) && !@
|
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 @
|
120
|
-
idx = @
|
121
|
-
@
|
120
|
+
if @applicable_attributes.include? :mac4
|
121
|
+
idx = @applicable_attributes.index(:mac4)
|
122
|
+
@applicable_attributes[idx, 0] = :qos_ctrl
|
122
123
|
else
|
123
|
-
@
|
124
|
+
@applicable_attributes[6, 0] = :qos_ctrl
|
124
125
|
end
|
125
126
|
elsif subtype < 8
|
126
|
-
@
|
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
|
19
|
-
# class Element <
|
18
|
+
# # @since 3.1.0 subclass of +BinStruct::AbstractTLV+
|
19
|
+
# class Element < BinStruct::AbstractTLV; end
|
20
20
|
# @private
|
21
|
-
Element =
|
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 <
|
47
|
+
class ArrayOfElements < BinStruct::Array
|
48
48
|
set_of Element
|
49
49
|
end
|
50
50
|
end
|