packetgen 3.3.2 → 4.0.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 +37 -21
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +7 -7
- data/lib/packetgen/header/arp.rb +13 -13
- data/lib/packetgen/header/asn1_base.rb +1 -1
- data/lib/packetgen/header/base.rb +17 -18
- data/lib/packetgen/header/bootp.rb +32 -34
- data/lib/packetgen/header/dhcp/option.rb +19 -19
- data/lib/packetgen/header/dhcp/options.rb +1 -1
- data/lib/packetgen/header/dhcp.rb +3 -3
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +53 -53
- data/lib/packetgen/header/dhcpv6/options.rb +1 -1
- data/lib/packetgen/header/dhcpv6/relay.rb +5 -5
- data/lib/packetgen/header/dhcpv6.rb +6 -6
- data/lib/packetgen/header/dns/name.rb +14 -10
- data/lib/packetgen/header/dns/opt.rb +2 -2
- data/lib/packetgen/header/dns/option.rb +11 -11
- data/lib/packetgen/header/dns/qdsection.rb +1 -1
- data/lib/packetgen/header/dns/question.rb +6 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +4 -4
- data/lib/packetgen/header/dns.rb +27 -30
- data/lib/packetgen/header/dot11/control.rb +11 -11
- data/lib/packetgen/header/dot11/data.rb +20 -20
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +8 -8
- data/lib/packetgen/header/dot11/sub_mngt.rb +39 -53
- data/lib/packetgen/header/dot11.rb +88 -93
- data/lib/packetgen/header/dot1q.rb +10 -12
- data/lib/packetgen/header/dot1x.rb +9 -9
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +6 -6
- data/lib/packetgen/header/eap/tls.rb +13 -15
- data/lib/packetgen/header/eap/ttls.rb +13 -15
- data/lib/packetgen/header/eap.rb +22 -22
- data/lib/packetgen/header/eth.rb +18 -18
- data/lib/packetgen/header/gre.rb +8 -10
- data/lib/packetgen/header/http/headers.rb +2 -2
- data/lib/packetgen/header/http/request.rb +17 -16
- data/lib/packetgen/header/http/response.rb +18 -17
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +8 -8
- data/lib/packetgen/header/icmpv6.rb +3 -3
- data/lib/packetgen/header/igmp.rb +8 -8
- data/lib/packetgen/header/igmpv3/group_record.rb +12 -12
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +4 -4
- data/lib/packetgen/header/igmpv3.rb +7 -7
- data/lib/packetgen/header/ip/addr.rb +13 -13
- data/lib/packetgen/header/ip/option.rb +31 -33
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +37 -72
- data/lib/packetgen/header/ipv6/addr.rb +14 -14
- data/lib/packetgen/header/ipv6/extension.rb +8 -8
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +9 -9
- data/lib/packetgen/header/ipv6.rb +20 -22
- data/lib/packetgen/header/llc.rb +17 -17
- data/lib/packetgen/header/mdns.rb +1 -1
- data/lib/packetgen/header/mld.rb +6 -6
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +11 -11
- data/lib/packetgen/header/mldv2/mlq.rb +21 -23
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/ospfv2/db_description.rb +11 -12
- data/lib/packetgen/header/ospfv2/hello.rb +11 -11
- data/lib/packetgen/header/ospfv2/ls_ack.rb +1 -1
- data/lib/packetgen/header/ospfv2/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv2/ls_update.rb +3 -3
- data/lib/packetgen/header/ospfv2/lsa.rb +54 -58
- data/lib/packetgen/header/ospfv2/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv2.rb +27 -29
- data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
- data/lib/packetgen/header/ospfv3/hello.rb +12 -12
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +17 -19
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -2
- data/lib/packetgen/header/ospfv3/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv3/ls_update.rb +4 -4
- data/lib/packetgen/header/ospfv3/lsa.rb +48 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv3.rb +25 -27
- data/lib/packetgen/header/sctp/chunk.rb +44 -41
- data/lib/packetgen/header/sctp/error.rb +52 -52
- data/lib/packetgen/header/sctp/parameter.rb +38 -38
- data/lib/packetgen/header/sctp.rb +5 -5
- data/lib/packetgen/header/snmp.rb +2 -2
- data/lib/packetgen/header/tcp/option.rb +45 -39
- data/lib/packetgen/header/tcp/options.rb +2 -2
- data/lib/packetgen/header/tcp.rb +55 -44
- data/lib/packetgen/header/tftp.rb +16 -16
- data/lib/packetgen/header/udp.rb +8 -8
- data/lib/packetgen/header.rb +9 -10
- data/lib/packetgen/headerable.rb +13 -3
- data/lib/packetgen/inspect.rb +2 -2
- data/lib/packetgen/packet.rb +54 -37
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +18 -17
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +3 -97
- data/lib/packetgen/pcapng/idb.rb +9 -11
- data/lib/packetgen/pcapng/shb.rb +13 -15
- data/lib/packetgen/pcapng/spb.rb +8 -10
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +4 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +1 -1
- data/lib/packetgen/unknown_packet.rb +2 -2
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +2 -2
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +4 -3
- metadata +34 -29
- 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
@@ -12,7 +12,7 @@ module PacketGen
|
|
12
12
|
# RFC 2131}
|
13
13
|
#
|
14
14
|
# A DHCP header is quite simple. It is composed of:
|
15
|
-
# * a {#magic} field ({
|
15
|
+
# * a {#magic} field ({BinStruct::Int32}) to retrieve it in a BOOTP header,
|
16
16
|
# * a, {#options} field ({Options} type, which is a collection of DHCP
|
17
17
|
# options).
|
18
18
|
#
|
@@ -50,10 +50,10 @@ module PacketGen
|
|
50
50
|
|
51
51
|
# @!attribute magic
|
52
52
|
# @return [Integer]
|
53
|
-
|
53
|
+
define_attr :magic, BinStruct::Int32, default: 0x63825563
|
54
54
|
# @!attribute options
|
55
55
|
# @return [DHCP::Options]
|
56
|
-
|
56
|
+
define_attr :options, DHCP::Options
|
57
57
|
|
58
58
|
# differentiate from BOOTP by checking presence of DHCP magic
|
59
59
|
# @return [Boolean]
|
@@ -11,8 +11,8 @@ module PacketGen
|
|
11
11
|
class DHCPv6
|
12
12
|
# @abstract Base class for DUID (DHCP Unique ID)
|
13
13
|
# @author Sylvain Daubert
|
14
|
-
class DUID <
|
15
|
-
include
|
14
|
+
class DUID < BinStruct::Struct
|
15
|
+
include BinStruct::Structable
|
16
16
|
|
17
17
|
TYPES = {
|
18
18
|
'DUID-LLT' => 1,
|
@@ -23,12 +23,12 @@ module PacketGen
|
|
23
23
|
# @!attribute type
|
24
24
|
# 16-bit DUID type
|
25
25
|
# @return [Integer]
|
26
|
-
|
26
|
+
define_attr :type, BinStruct::Int16Enum, enum: TYPES
|
27
27
|
# @!attribute body
|
28
|
-
# @abstract replaced by specific
|
28
|
+
# @abstract replaced by specific attributes.in subclasses
|
29
29
|
# DUID data.
|
30
30
|
# @return [String]
|
31
|
-
|
31
|
+
define_attr :body, BinStruct::String
|
32
32
|
|
33
33
|
alias private_read read
|
34
34
|
private :private_read
|
@@ -50,7 +50,7 @@ module PacketGen
|
|
50
50
|
self
|
51
51
|
end
|
52
52
|
else
|
53
|
-
private_read
|
53
|
+
private_read(str)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -72,7 +72,7 @@ module PacketGen
|
|
72
72
|
# DUID Based on Link-layer Address Plus Time
|
73
73
|
# @author Sylvain Daubert
|
74
74
|
class DUID_LLT < DUID
|
75
|
-
|
75
|
+
remove_attr :body
|
76
76
|
|
77
77
|
# Base time for time computation
|
78
78
|
BASE_TIME = Time.utc(2000, 1, 1)
|
@@ -80,14 +80,14 @@ module PacketGen
|
|
80
80
|
# @!attribute htype
|
81
81
|
# 16-bit hardware protocol type
|
82
82
|
# @return [Integer]
|
83
|
-
|
83
|
+
define_attr :htype, BinStruct::Int16, default: 1
|
84
84
|
# @!attribute time
|
85
85
|
# 32-bit time information
|
86
86
|
# @return [Time]
|
87
|
-
|
87
|
+
define_attr :time, BinStruct::Int32, default: (Time.now - BASE_TIME).to_i
|
88
88
|
# @!attribute link_addr
|
89
89
|
# @return [Eth::MacAddr]
|
90
|
-
|
90
|
+
define_attr :link_addr, Eth::MacAddr
|
91
91
|
|
92
92
|
undef time, time=
|
93
93
|
|
@@ -112,15 +112,15 @@ module PacketGen
|
|
112
112
|
# DUID Based on Enterprise Number
|
113
113
|
# @author Sylvain Daubert
|
114
114
|
class DUID_EN < DUID
|
115
|
-
|
115
|
+
remove_attr :body
|
116
116
|
|
117
117
|
# @!attribute en
|
118
118
|
# 32-bit entreprise number
|
119
119
|
# @return [Integer]
|
120
|
-
|
120
|
+
define_attr :en, BinStruct::Int32
|
121
121
|
# @!attribute identifier
|
122
122
|
# @return [String]
|
123
|
-
|
123
|
+
define_attr :identifier, BinStruct::String
|
124
124
|
|
125
125
|
# Get human-readable DUID description
|
126
126
|
# @return [String]
|
@@ -132,15 +132,15 @@ module PacketGen
|
|
132
132
|
# DUID Based on Link-layer
|
133
133
|
# @author Sylvain Daubert
|
134
134
|
class DUID_LL < DUID
|
135
|
-
|
135
|
+
remove_attr :body
|
136
136
|
|
137
137
|
# @!attribute htype
|
138
138
|
# 16-bit hardware protocol type
|
139
139
|
# @return [Integer]
|
140
|
-
|
140
|
+
define_attr :htype, BinStruct::Int16, default: 1
|
141
141
|
# @!attribute link_addr
|
142
142
|
# @return [Eth::MacAddr]
|
143
|
-
|
143
|
+
define_attr :link_addr, Eth::MacAddr
|
144
144
|
|
145
145
|
# Get human-readable DUID description
|
146
146
|
# @return [String]
|
@@ -10,29 +10,29 @@ module PacketGen
|
|
10
10
|
module Header
|
11
11
|
class DHCPv6
|
12
12
|
# A DHCPv6 consists of:
|
13
|
-
# * a {#type} ({
|
14
|
-
# * a {#length} ({
|
15
|
-
# * and a {#data} ({
|
13
|
+
# * a {#type} ({BinStruct::Int16}),
|
14
|
+
# * a {#length} ({BinStruct::Int16}),
|
15
|
+
# * and a {#data} ({BinStruct::String}).
|
16
16
|
#
|
17
17
|
# Subclasses handles known options. These subclasses may remove {#data}
|
18
18
|
# field to replace it by specific option field(s).
|
19
19
|
# @author Sylvain Daubert
|
20
|
-
class Option <
|
21
|
-
include
|
20
|
+
class Option < BinStruct::Struct
|
21
|
+
include BinStruct::Structable
|
22
22
|
|
23
23
|
# @!attribute type
|
24
24
|
# 16-bit option type
|
25
25
|
# @return [Integer]
|
26
|
-
|
26
|
+
define_attr :type, BinStruct::Int16
|
27
27
|
# @!attribute length
|
28
28
|
# 16-bit option length
|
29
29
|
# @return [Integer]
|
30
|
-
|
30
|
+
define_attr :length, BinStruct::Int16
|
31
31
|
# @!attribute data
|
32
32
|
# variable length option data.
|
33
33
|
# @return [String]
|
34
|
-
|
35
|
-
|
34
|
+
define_attr :data, BinStruct::String,
|
35
|
+
builder: ->(h, t) { t.new(length_from: h[:length]) }
|
36
36
|
|
37
37
|
class << self
|
38
38
|
# Get Option subclasses
|
@@ -63,7 +63,7 @@ module PacketGen
|
|
63
63
|
when String
|
64
64
|
if DHCPv6.const_defined?(options[:type])
|
65
65
|
klass = DHCPv6.const_get(options[:type])
|
66
|
-
options.delete
|
66
|
+
options.delete(:type)
|
67
67
|
klass.new(options) if klass < Option
|
68
68
|
end
|
69
69
|
else
|
@@ -96,7 +96,7 @@ module PacketGen
|
|
96
96
|
# Get a human-readable string for this option
|
97
97
|
# @return [String]
|
98
98
|
def to_human
|
99
|
-
str =
|
99
|
+
str = "#{human_type}:"
|
100
100
|
if respond_to?(:human_data) && !human_data.empty?
|
101
101
|
str << human_data
|
102
102
|
elsif !self[:data].nil?
|
@@ -111,12 +111,12 @@ module PacketGen
|
|
111
111
|
# DHCPv6 Client ID option
|
112
112
|
# @author Sylvain Daubert
|
113
113
|
class ClientID < Option
|
114
|
-
|
115
|
-
|
114
|
+
update_attr :type, default: 1
|
115
|
+
remove_attr :data
|
116
116
|
|
117
117
|
# @!attribute duid
|
118
118
|
# @return [DUID]
|
119
|
-
|
119
|
+
define_attr :duid, DUID
|
120
120
|
|
121
121
|
# Get human-readable data (DUID)
|
122
122
|
# @return [String]
|
@@ -128,32 +128,32 @@ module PacketGen
|
|
128
128
|
# DHCPv6 Server ID option
|
129
129
|
# @author Sylvain Daubert
|
130
130
|
class ServerID < ClientID
|
131
|
-
|
131
|
+
update_attr :type, default: 2
|
132
132
|
end
|
133
133
|
|
134
134
|
# DHCPv6 Identity Association for Non-temporary Addresses Option
|
135
135
|
# @author Sylvain Daubert
|
136
136
|
class IANA < Option
|
137
|
-
|
138
|
-
|
137
|
+
update_attr :type, default: 3
|
138
|
+
remove_attr :data
|
139
139
|
|
140
140
|
# @!attribute iaid
|
141
141
|
# 32-bit IAID field
|
142
142
|
# @return [Integer]
|
143
|
-
|
143
|
+
define_attr :iaid, BinStruct::Int32
|
144
144
|
# @!attribute t1
|
145
145
|
# 32-bit T1 field
|
146
146
|
# @return [Integer]
|
147
|
-
|
147
|
+
define_attr :t1, BinStruct::Int32
|
148
148
|
# @!attribute t2
|
149
149
|
# 32-bit T2 field
|
150
150
|
# @return [Integer]
|
151
|
-
|
151
|
+
define_attr :t2, BinStruct::Int32
|
152
152
|
# @!attribute options
|
153
153
|
# options field
|
154
154
|
# @return [String]
|
155
|
-
|
156
|
-
|
155
|
+
define_attr :options, BinStruct::String,
|
156
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 12 } }
|
157
157
|
|
158
158
|
# Get human-readable data (IAID, T1 and T2)
|
159
159
|
# @return [String]
|
@@ -165,18 +165,18 @@ module PacketGen
|
|
165
165
|
# DHCPv6 Identity Association for Temporary Addresses Option
|
166
166
|
# @author Sylvain Daubert
|
167
167
|
class IATA < Option
|
168
|
-
|
169
|
-
|
168
|
+
update_attr :type, default: 4
|
169
|
+
remove_attr :data
|
170
170
|
|
171
171
|
# @!attribute iaid
|
172
172
|
# 32-bit IAID field
|
173
173
|
# @return [Integer]
|
174
|
-
|
174
|
+
define_attr :iaid, BinStruct::Int32
|
175
175
|
# @!attribute options
|
176
176
|
# options field
|
177
177
|
# @return [String]
|
178
|
-
|
179
|
-
|
178
|
+
define_attr :options, BinStruct::String,
|
179
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 4 } }
|
180
180
|
|
181
181
|
# Get human-readable data (IAID)
|
182
182
|
# @return [String]
|
@@ -188,26 +188,26 @@ module PacketGen
|
|
188
188
|
# DHCPv6 IA Address option
|
189
189
|
# @author Sylvain Daubert
|
190
190
|
class IAAddr < Option
|
191
|
-
|
192
|
-
|
191
|
+
update_attr :type, default: 5
|
192
|
+
remove_attr :data
|
193
193
|
|
194
194
|
# @attribute ipv6
|
195
195
|
# IPv6 address
|
196
196
|
# @return [IPv6::Addr]
|
197
|
-
|
197
|
+
define_attr :ipv6, IPv6::Addr
|
198
198
|
# @attribute preferred_lifetime
|
199
199
|
# 32-bit preferred lifetime
|
200
200
|
# @return [Integer]
|
201
|
-
|
201
|
+
define_attr :preferred_lifetime, BinStruct::Int32
|
202
202
|
# @attribute valid_lifetime
|
203
203
|
# 32-bit valid lifetime
|
204
204
|
# @return [Integer]
|
205
|
-
|
205
|
+
define_attr :valid_lifetime, BinStruct::Int32
|
206
206
|
# @!attribute options
|
207
207
|
# options field
|
208
208
|
# @return [String]
|
209
|
-
|
210
|
-
|
209
|
+
define_attr :options, BinStruct::String,
|
210
|
+
builder: ->(h, t) { t.new length_from: -> { h[:length].to_i - 24 } }
|
211
211
|
|
212
212
|
# Get human-readable data (ipv6, preferred lifetime and valid lifetime)
|
213
213
|
# @return [String]
|
@@ -217,21 +217,21 @@ module PacketGen
|
|
217
217
|
end
|
218
218
|
|
219
219
|
# List of requested options for {ORO} option.
|
220
|
-
# Set of {
|
220
|
+
# Set of {BinStruct::Int16}
|
221
221
|
# @author Sylvain Daubert
|
222
|
-
class RequestedOptions <
|
223
|
-
set_of
|
222
|
+
class RequestedOptions < BinStruct::Array
|
223
|
+
set_of BinStruct::Int16
|
224
224
|
end
|
225
225
|
|
226
226
|
# DHCPv6 Option Request Option
|
227
227
|
# @author Sylvain Daubert
|
228
228
|
class ORO < Option
|
229
|
-
|
230
|
-
|
229
|
+
update_attr :type, default: 6
|
230
|
+
remove_attr :data
|
231
231
|
|
232
232
|
# @!attribute options
|
233
233
|
# @return [RequestedOptions]
|
234
|
-
|
234
|
+
define_attr :options, RequestedOptions, builder: ->(h, t) { t.new(length_from: h[:length]) }
|
235
235
|
|
236
236
|
# Get human-readable data
|
237
237
|
# @return [String]
|
@@ -243,13 +243,13 @@ module PacketGen
|
|
243
243
|
# DHCPv6 Preference option
|
244
244
|
# @author Sylvain Daubert
|
245
245
|
class Preference < Option
|
246
|
-
|
247
|
-
|
246
|
+
update_attr :type, default: 7
|
247
|
+
remove_attr :data
|
248
248
|
|
249
249
|
# @!attribute value
|
250
250
|
# 8-bit value
|
251
251
|
# @return [Integer]
|
252
|
-
|
252
|
+
define_attr :value, BinStruct::Int8
|
253
253
|
|
254
254
|
# Get human-readable data (value)
|
255
255
|
# @return [String]
|
@@ -261,13 +261,13 @@ module PacketGen
|
|
261
261
|
# DHCPv6 Elapsed Time option
|
262
262
|
# @author Sylvain Daubert
|
263
263
|
class ElapsedTime < Option
|
264
|
-
|
265
|
-
|
264
|
+
update_attr :type, default: 8
|
265
|
+
remove_attr :data
|
266
266
|
|
267
267
|
# @!attribute value
|
268
268
|
# 16-bit value
|
269
269
|
# @return [Integer]
|
270
|
-
|
270
|
+
define_attr :value, BinStruct::Int16
|
271
271
|
|
272
272
|
# Get human-readable data (value)
|
273
273
|
# @return [String]
|
@@ -279,19 +279,19 @@ module PacketGen
|
|
279
279
|
# DHCPv6 Relay Message option
|
280
280
|
# @author Sylvain Daubert
|
281
281
|
class RelayMessage < Option
|
282
|
-
|
282
|
+
update_attr :type, default: 9
|
283
283
|
end
|
284
284
|
|
285
285
|
# DHCPv6 Server Unicast option
|
286
286
|
# @author Sylvain Daubert
|
287
287
|
class ServerUnicast < Option
|
288
|
-
|
289
|
-
|
288
|
+
update_attr :type, default: 12
|
289
|
+
remove_attr :data
|
290
290
|
|
291
291
|
# @!attribute addr
|
292
292
|
# IPv6 server address
|
293
293
|
# @return [IPv6::Addr]
|
294
|
-
|
294
|
+
define_attr :addr, IPv6::Addr
|
295
295
|
|
296
296
|
# Get human-readable data (addr)
|
297
297
|
# @return [String]
|
@@ -303,14 +303,14 @@ module PacketGen
|
|
303
303
|
# DHCPv6 Status Code option
|
304
304
|
# @author Sylvain Daubert
|
305
305
|
class StatusCode < ElapsedTime
|
306
|
-
|
306
|
+
update_attr :type, default: 13
|
307
307
|
end
|
308
308
|
|
309
309
|
# DHCPv6 Rapid Commit option
|
310
310
|
# @author Sylvain Daubert
|
311
311
|
class RapidCommit < Option
|
312
|
-
|
313
|
-
|
312
|
+
update_attr :type, default: 14
|
313
|
+
remove_attr :data
|
314
314
|
end
|
315
315
|
end
|
316
316
|
end
|
@@ -19,7 +19,7 @@ module PacketGen
|
|
19
19
|
# duid = PacketGen::Header::DHCPv6::DUID_LL.new(link_addr: '08:00:27:fe:8f:95')
|
20
20
|
# options << { type: 1, duid: duid }
|
21
21
|
# @author Sylvain Daubert
|
22
|
-
class Options <
|
22
|
+
class Options < BinStruct::Array
|
23
23
|
set_of DHCPv6::Option
|
24
24
|
|
25
25
|
# Separator used in {#to_human}.
|
@@ -21,25 +21,25 @@ module PacketGen
|
|
21
21
|
# @!attribute msg_type
|
22
22
|
# 8-bit message type
|
23
23
|
# @return [Integer]
|
24
|
-
|
24
|
+
define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
|
25
25
|
# @!attribute hop_count
|
26
26
|
# 8-bit hop count (number of relay agents that have relayed
|
27
27
|
# this message)
|
28
28
|
# @return [Integer]
|
29
|
-
|
29
|
+
define_attr :hop_count, BinStruct::Int8
|
30
30
|
# @!attribute link
|
31
31
|
# Link address: address that will be used by the server to identify
|
32
32
|
# the link on which the client is located
|
33
33
|
# @return [IPv6::Addr]
|
34
|
-
|
34
|
+
define_attr :link, IPv6::Addr
|
35
35
|
# @!attribute peer
|
36
36
|
# Peer address: the address of the client or relay agent from which
|
37
37
|
# the message to be relayed was received
|
38
38
|
# @return [IPv6::Addr]
|
39
|
-
|
39
|
+
define_attr :peer, IPv6::Addr
|
40
40
|
# @!attribute options
|
41
41
|
# @return [DHCPv6::Options]
|
42
|
-
|
42
|
+
define_attr :options, DHCPv6::Options
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -22,8 +22,8 @@ module PacketGen
|
|
22
22
|
# | |
|
23
23
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
24
24
|
# A DHCPv6 header is made of:
|
25
|
-
# * a {#msg_type} field ({
|
26
|
-
# * a {#transaction_id} field ({
|
25
|
+
# * a {#msg_type} field ({BinStruct::Int8Enum}),
|
26
|
+
# * a {#transaction_id} field ({BinStruct::Int24}),
|
27
27
|
# * and an {#options} field ({DHCPv6::Options}).
|
28
28
|
#
|
29
29
|
# == Create a DHCPv6 header
|
@@ -72,20 +72,20 @@ module PacketGen
|
|
72
72
|
# @!attribute msg_type
|
73
73
|
# 8-bit message type
|
74
74
|
# @return [Integer]
|
75
|
-
|
75
|
+
define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
|
76
76
|
# @!attribute transaction_id
|
77
77
|
# 24-bit transaction ID
|
78
78
|
# @return [Integer]
|
79
|
-
|
79
|
+
define_attr :transaction_id, BinStruct::Int24
|
80
80
|
# @!attribute options
|
81
81
|
# @return [DHCPv6::Options]
|
82
|
-
|
82
|
+
define_attr :options, DHCPv6::Options
|
83
83
|
|
84
84
|
# Populate object from string
|
85
85
|
# @param [String] str
|
86
86
|
# @return [DHCPv6,DHCPv6::Relay]
|
87
87
|
def read(str)
|
88
|
-
msg_type =
|
88
|
+
msg_type = BinStruct::Int8.new.read(str)
|
89
89
|
|
90
90
|
case msg_type
|
91
91
|
when 12, 13
|
@@ -9,26 +9,30 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class DNS
|
12
|
-
# DNS Name, defined as a suite of labels. A label is of type {
|
12
|
+
# DNS Name, defined as a suite of labels. A label is of type {BinStruct::IntString}.
|
13
13
|
# @author Sylvain Daubert
|
14
|
-
|
14
|
+
# @author LemonTree55
|
15
|
+
class Name < BinStruct::Array
|
15
16
|
# Mask to decode a pointer on another label
|
16
17
|
POINTER_MASK = 0xc000
|
17
18
|
|
18
19
|
# @return [DNS]
|
19
20
|
attr_accessor :dns
|
20
21
|
|
21
|
-
|
22
|
+
# @param [Hash] options
|
23
|
+
# @option options [DNS] :dns
|
24
|
+
def initialize(options={})
|
25
|
+
@dns = options.delete(:dns)
|
22
26
|
super
|
23
27
|
@pointer = nil
|
24
28
|
@pointer_name = nil
|
25
29
|
end
|
26
30
|
|
27
31
|
# @!method push(label)
|
28
|
-
# @param [
|
32
|
+
# @param [BinStruct::IntString] label
|
29
33
|
# @return [Name] self
|
30
34
|
# @!method <<(label)
|
31
|
-
# @param [
|
35
|
+
# @param [BinStruct::IntString] label
|
32
36
|
# @return [Name] self
|
33
37
|
|
34
38
|
# Read a set of labels form a dotted string
|
@@ -39,9 +43,9 @@ module PacketGen
|
|
39
43
|
return self if str.nil?
|
40
44
|
|
41
45
|
str.split('.').each do |label|
|
42
|
-
self <<
|
46
|
+
self << BinStruct::IntString.new(value: label)
|
43
47
|
end
|
44
|
-
self <<
|
48
|
+
self << BinStruct::IntString.new
|
45
49
|
end
|
46
50
|
|
47
51
|
# Clear name
|
@@ -59,11 +63,11 @@ module PacketGen
|
|
59
63
|
clear
|
60
64
|
return self if str.nil?
|
61
65
|
|
62
|
-
PacketGen.force_binary
|
66
|
+
PacketGen.force_binary(str)
|
63
67
|
start = 0
|
64
68
|
loop do
|
65
69
|
index = str[start, 2].unpack1('n')
|
66
|
-
if pointer?
|
70
|
+
if pointer?(index)
|
67
71
|
# Pointer on another label
|
68
72
|
@pointer = str[start, 2]
|
69
73
|
break
|
@@ -119,7 +123,7 @@ module PacketGen
|
|
119
123
|
end
|
120
124
|
|
121
125
|
def add_label_from(str)
|
122
|
-
label =
|
126
|
+
label = BinStruct::IntString.new
|
123
127
|
label.read(str)
|
124
128
|
self << label
|
125
129
|
label
|
@@ -20,7 +20,7 @@ module PacketGen
|
|
20
20
|
class OPT < RR
|
21
21
|
# @!attribute options
|
22
22
|
# @return [ArrayOfOptions]
|
23
|
-
|
23
|
+
define_attr_after :rdata, :options, ArrayOfOptions
|
24
24
|
|
25
25
|
# @param [DNS] dns
|
26
26
|
# @param [Hash] options
|
@@ -94,7 +94,7 @@ module PacketGen
|
|
94
94
|
self[:ttl].value = self[:ttl].to_i & (0xffffffff & ~(1 << 15))
|
95
95
|
self[:ttl].value |= (b & 1) << 15
|
96
96
|
end
|
97
|
-
|
97
|
+
self[:ttl].to_i.anybits?(0x8000)
|
98
98
|
end
|
99
99
|
alias do? do=
|
100
100
|
|
@@ -11,28 +11,28 @@ module PacketGen
|
|
11
11
|
class DNS
|
12
12
|
# @!parse
|
13
13
|
# # DNS option is a TLV object:
|
14
|
-
# # * {#code} is a {
|
15
|
-
# # * {#length} is a {
|
16
|
-
# # * {#data} is a {
|
14
|
+
# # * {#code} is a {BinStruct::Int16},
|
15
|
+
# # * {#length} is a {BinStruct::Int16},
|
16
|
+
# # * {#data} is a {BinStruct::String}.
|
17
17
|
# #
|
18
18
|
# # @since 1.3.0
|
19
|
-
# # @since 3.1.0 defined with {
|
20
|
-
# # @!parse class Option <
|
19
|
+
# # @since 3.1.0 defined with {BinStruct::AbstractTLV}
|
20
|
+
# # @!parse class Option < BinStruct::AbstractTLV; end
|
21
21
|
# # @!attribute code
|
22
22
|
# # Alias for {#type}
|
23
23
|
# # @return [Integer]
|
24
24
|
# # @!attribute data
|
25
25
|
# # Alias for {#value}
|
26
|
-
# # @return [
|
27
|
-
# class Option <
|
26
|
+
# # @return [BinStruct::String]
|
27
|
+
# class Option < BinStruct::AbstractTLV; end
|
28
28
|
# @private
|
29
|
-
Option =
|
30
|
-
|
31
|
-
|
29
|
+
Option = BinStruct::AbstractTLV.create(type_class: BinStruct::Int16,
|
30
|
+
length_class: BinStruct::Int16,
|
31
|
+
aliases: { code: :type, data: :value })
|
32
32
|
|
33
33
|
# Array of {Option}.
|
34
34
|
# @since 3.1.1
|
35
|
-
class ArrayOfOptions <
|
35
|
+
class ArrayOfOptions < BinStruct::Array
|
36
36
|
set_of Option
|
37
37
|
end
|
38
38
|
end
|
@@ -11,8 +11,8 @@ module PacketGen
|
|
11
11
|
class DNS
|
12
12
|
# DNS Question
|
13
13
|
# @author Sylvain Daubert
|
14
|
-
class Question <
|
15
|
-
include
|
14
|
+
class Question < BinStruct::Struct
|
15
|
+
include BinStruct::Structable
|
16
16
|
|
17
17
|
# Ressource Record types
|
18
18
|
TYPES = {
|
@@ -59,15 +59,15 @@ module PacketGen
|
|
59
59
|
# @!attribute name
|
60
60
|
# Question domain name
|
61
61
|
# @return [String]
|
62
|
-
|
62
|
+
define_attr :name, Name, default: '.'
|
63
63
|
# @!attribute type
|
64
64
|
# 16-bit question type
|
65
65
|
# @return [Integer]
|
66
|
-
|
66
|
+
define_attr :type, BinStruct::Int16Enum, default: 1, enum: TYPES
|
67
67
|
# @!attribute rrclass
|
68
68
|
# 16-bit question class
|
69
69
|
# @return [Integer]
|
70
|
-
|
70
|
+
define_attr :rrclass, BinStruct::Int16Enum, default: 1, enum: CLASSES
|
71
71
|
|
72
72
|
# @param [DNS] dns
|
73
73
|
# @param [Hash] options
|
@@ -77,8 +77,6 @@ module PacketGen
|
|
77
77
|
def initialize(dns, options={})
|
78
78
|
super(options)
|
79
79
|
self[:name].dns = dns
|
80
|
-
self.type = options[:type] if options[:type]
|
81
|
-
self.rrclass = options[:rrclass] if options[:rrclass]
|
82
80
|
end
|
83
81
|
|
84
82
|
undef rrclass=
|
@@ -95,7 +93,7 @@ module PacketGen
|
|
95
93
|
end
|
96
94
|
raise ArgumentError, "unknown class #{val.inspect}" unless v
|
97
95
|
|
98
|
-
self[:rrclass].
|
96
|
+
self[:rrclass].from_human(v)
|
99
97
|
end
|
100
98
|
|
101
99
|
# Check type
|