packetgen 2.4.0 → 2.5.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 +5 -5
- data/.travis.yml +13 -4
- data/lib/packetgen.rb +3 -1
- data/lib/packetgen/capture.rb +2 -0
- data/lib/packetgen/config.rb +1 -0
- data/lib/packetgen/header.rb +5 -0
- data/lib/packetgen/header/arp.rb +2 -0
- data/lib/packetgen/header/asn1_base.rb +2 -0
- data/lib/packetgen/header/base.rb +16 -0
- data/lib/packetgen/header/bootp.rb +2 -0
- data/lib/packetgen/header/crypto.rb +2 -0
- data/lib/packetgen/header/dhcp.rb +2 -0
- data/lib/packetgen/header/dhcp/option.rb +3 -0
- data/lib/packetgen/header/dhcp/options.rb +2 -0
- data/lib/packetgen/header/dhcpv6.rb +109 -0
- data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
- data/lib/packetgen/header/dhcpv6/option.rb +391 -0
- data/lib/packetgen/header/dhcpv6/options.rb +29 -0
- data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
- data/lib/packetgen/header/dns.rb +10 -2
- data/lib/packetgen/header/dns/name.rb +7 -0
- data/lib/packetgen/header/dns/opt.rb +6 -0
- data/lib/packetgen/header/dns/option.rb +7 -0
- data/lib/packetgen/header/dns/qdsection.rb +7 -1
- data/lib/packetgen/header/dns/question.rb +7 -0
- data/lib/packetgen/header/dns/rr.rb +7 -0
- data/lib/packetgen/header/dns/rrsection.rb +7 -0
- data/lib/packetgen/header/dot11.rb +4 -2
- data/lib/packetgen/header/dot11/control.rb +2 -0
- data/lib/packetgen/header/dot11/data.rb +2 -0
- data/lib/packetgen/header/dot11/element.rb +2 -0
- data/lib/packetgen/header/dot11/management.rb +2 -0
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
- data/lib/packetgen/header/dot1q.rb +2 -0
- data/lib/packetgen/header/dot1x.rb +3 -1
- data/lib/packetgen/header/eap.rb +3 -1
- data/lib/packetgen/header/eap/fast.rb +2 -0
- data/lib/packetgen/header/eap/md5.rb +2 -0
- data/lib/packetgen/header/eap/tls.rb +2 -0
- data/lib/packetgen/header/eap/ttls.rb +2 -0
- data/lib/packetgen/header/esp.rb +7 -0
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/gre.rb +4 -9
- data/lib/packetgen/header/http/headers.rb +2 -0
- data/lib/packetgen/header/http/request.rb +3 -1
- data/lib/packetgen/header/http/response.rb +3 -1
- data/lib/packetgen/header/icmp.rb +4 -11
- data/lib/packetgen/header/icmpv6.rb +4 -11
- data/lib/packetgen/header/igmp.rb +4 -11
- data/lib/packetgen/header/igmpv3.rb +4 -11
- data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/igmpv3/mr.rb +2 -0
- data/lib/packetgen/header/ike.rb +13 -6
- data/lib/packetgen/header/ike/auth.rb +2 -0
- data/lib/packetgen/header/ike/cert.rb +2 -0
- data/lib/packetgen/header/ike/certreq.rb +2 -0
- data/lib/packetgen/header/ike/id.rb +2 -0
- data/lib/packetgen/header/ike/ke.rb +2 -0
- data/lib/packetgen/header/ike/nonce.rb +2 -0
- data/lib/packetgen/header/ike/notify.rb +7 -0
- data/lib/packetgen/header/ike/payload.rb +9 -0
- data/lib/packetgen/header/ike/sa.rb +11 -4
- data/lib/packetgen/header/ike/sk.rb +7 -0
- data/lib/packetgen/header/ike/ts.rb +2 -0
- data/lib/packetgen/header/ike/vendor_id.rb +2 -0
- data/lib/packetgen/header/ip.rb +48 -11
- data/lib/packetgen/header/ip/addr.rb +8 -0
- data/lib/packetgen/header/ip/option.rb +2 -0
- data/lib/packetgen/header/ip/options.rb +2 -0
- data/lib/packetgen/header/ipv6.rb +5 -3
- data/lib/packetgen/header/ipv6/addr.rb +8 -0
- data/lib/packetgen/header/ipv6/extension.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
- data/lib/packetgen/header/llc.rb +2 -0
- data/lib/packetgen/header/mld.rb +2 -0
- data/lib/packetgen/header/mldv2.rb +4 -2
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/mldv2/mlr.rb +4 -2
- data/lib/packetgen/header/ospfv2.rb +249 -0
- data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
- data/lib/packetgen/header/ospfv2/hello.rb +104 -0
- data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
- data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
- data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
- data/lib/packetgen/header/ospfv3.rb +216 -0
- data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
- data/lib/packetgen/header/ospfv3/hello.rb +104 -0
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
- data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
- data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
- data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
- data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +14 -14
- data/lib/packetgen/header/tcp/option.rb +7 -1
- data/lib/packetgen/header/tcp/options.rb +7 -0
- data/lib/packetgen/header/tftp.rb +2 -0
- data/lib/packetgen/header/udp.rb +6 -14
- data/lib/packetgen/inspect.rb +5 -1
- data/lib/packetgen/packet.rb +3 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/pcapng/block.rb +2 -0
- data/lib/packetgen/pcapng/epb.rb +2 -0
- data/lib/packetgen/pcapng/file.rb +2 -0
- data/lib/packetgen/pcapng/idb.rb +2 -0
- data/lib/packetgen/pcapng/shb.rb +2 -0
- data/lib/packetgen/pcapng/spb.rb +2 -0
- data/lib/packetgen/pcapng/unknown_block.rb +2 -0
- data/lib/packetgen/proto.rb +2 -0
- data/lib/packetgen/types/array.rb +3 -0
- data/lib/packetgen/types/cstring.rb +3 -1
- data/lib/packetgen/types/enum.rb +2 -0
- data/lib/packetgen/types/fields.rb +8 -4
- data/lib/packetgen/types/int.rb +3 -1
- data/lib/packetgen/types/int_string.rb +2 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +3 -0
- data/lib/packetgen/types/tlv.rb +8 -0
- data/lib/packetgen/utils.rb +6 -4
- data/lib/packetgen/utils/arp_spoofer.rb +2 -0
- data/lib/packetgen/version.rb +3 -1
- metadata +25 -3
@@ -0,0 +1,391 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
class DHCPv6
|
11
|
+
|
12
|
+
# A DHCPv6 consists of:
|
13
|
+
# * a {#type} ({Types::Int16}),
|
14
|
+
# * a {#length} ({Types::Int16}),
|
15
|
+
# * and a {#data} ({Types::String}).
|
16
|
+
#
|
17
|
+
# Subclasses handles known options. These subclasses may remove {#data}
|
18
|
+
# field to replace it by specific option field(s).
|
19
|
+
# @author Sylvain Daubert
|
20
|
+
class Option < Types::Fields
|
21
|
+
|
22
|
+
# @!attribute type
|
23
|
+
# 16-bit option type
|
24
|
+
# @return [Integer]
|
25
|
+
define_field :type, Types::Int16
|
26
|
+
# @!attribute length
|
27
|
+
# 16-bit option length
|
28
|
+
# @return [Integer]
|
29
|
+
define_field :length, Types::Int16
|
30
|
+
# @!attribute data
|
31
|
+
# variable length option data.
|
32
|
+
# @return [String]
|
33
|
+
define_field :data, Types::String,
|
34
|
+
builder: ->(h,t) { t.new(length_from: h[:length]) }
|
35
|
+
|
36
|
+
class << self
|
37
|
+
# Get Option subclasses
|
38
|
+
# @return [Hash]
|
39
|
+
def subclasses
|
40
|
+
return @klasses if defined? @klasses
|
41
|
+
@klasses = []
|
42
|
+
DHCPv6.constants.each do |cst|
|
43
|
+
klass = DHCPv6.const_get(cst)
|
44
|
+
next unless klass.is_a?(Class) and klass < Option
|
45
|
+
@klasses[klass.new.type] = klass
|
46
|
+
end
|
47
|
+
@klasses
|
48
|
+
end
|
49
|
+
|
50
|
+
# Create a new Option object (or a subclass)
|
51
|
+
# @param [Hash] options
|
52
|
+
# @return [Option]
|
53
|
+
def new(options={})
|
54
|
+
if self == Option
|
55
|
+
case options[:type]
|
56
|
+
when Integer
|
57
|
+
klass = Option.subclasses[options[:type]]
|
58
|
+
klass.new(options) if klass
|
59
|
+
when String
|
60
|
+
if DHCPv6.const_defined?(options[:type])
|
61
|
+
klass = DHCPv6.const_get(options[:type])
|
62
|
+
options.delete :type
|
63
|
+
klass.new(options) if klass < Option
|
64
|
+
end
|
65
|
+
else
|
66
|
+
super
|
67
|
+
end
|
68
|
+
else
|
69
|
+
super
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Create an Option
|
75
|
+
# @param [Hash] options
|
76
|
+
def initialize(options={})
|
77
|
+
if self.class.const_defined?(:TYPE) and options[:type].nil?
|
78
|
+
options[:type] = self.class.const_get(:TYPE)
|
79
|
+
end
|
80
|
+
if options[:data]
|
81
|
+
options[:length] = options[:data].to_s.size
|
82
|
+
end
|
83
|
+
super
|
84
|
+
if options[:data].nil?
|
85
|
+
self.length = self.sz - 4
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
alias private_read read
|
90
|
+
private :private_read
|
91
|
+
|
92
|
+
# Populate object from binary string
|
93
|
+
# @param [String] str
|
94
|
+
# @return [Option]
|
95
|
+
def read(str)
|
96
|
+
if self.class == Option
|
97
|
+
return self if str.nil?
|
98
|
+
PacketGen.force_binary str
|
99
|
+
type = Types::Int16.new.read(str).to_i
|
100
|
+
klass = Option.subclasses[type]
|
101
|
+
if klass
|
102
|
+
klass.new.read(str)
|
103
|
+
else
|
104
|
+
private_read str
|
105
|
+
end
|
106
|
+
else
|
107
|
+
private_read str
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get human-readable {#type}
|
112
|
+
# @return [String]
|
113
|
+
def human_type
|
114
|
+
if self.class == Option
|
115
|
+
"option#{type}"
|
116
|
+
else
|
117
|
+
self.class.to_s.sub(/.*::/, '')
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Get a human-readable string for this option
|
122
|
+
# @return [String]
|
123
|
+
def to_human
|
124
|
+
str = "#{human_type}:".dup
|
125
|
+
if respond_to? :human_data and human_data.size > 0
|
126
|
+
str << human_data
|
127
|
+
elsif !self[:data].nil?
|
128
|
+
str << data.inspect
|
129
|
+
else
|
130
|
+
# No data: only give option name
|
131
|
+
human_type
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# DHCPv6 Client ID option
|
137
|
+
# @author Sylvain Daubert
|
138
|
+
class ClientID < Option
|
139
|
+
# Option type value
|
140
|
+
TYPE = 1
|
141
|
+
|
142
|
+
delete_field :data
|
143
|
+
undef data
|
144
|
+
undef data=
|
145
|
+
|
146
|
+
# @!attribute duid
|
147
|
+
# @return [DUID]
|
148
|
+
define_field :duid, DUID
|
149
|
+
|
150
|
+
# Get human-readable data (DUID)
|
151
|
+
# @return [String]
|
152
|
+
def human_data
|
153
|
+
self[:duid].to_human
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# DHCPv6 Server ID option
|
158
|
+
# @author Sylvain Daubert
|
159
|
+
class ServerID < ClientID
|
160
|
+
# Option type value
|
161
|
+
TYPE = 2
|
162
|
+
end
|
163
|
+
|
164
|
+
# DHCPv6 Identity Association for Non-temporary Addresses Option
|
165
|
+
# @author Sylvain Daubert
|
166
|
+
class IANA < Option
|
167
|
+
# Option type value
|
168
|
+
TYPE = 3
|
169
|
+
|
170
|
+
delete_field :data
|
171
|
+
undef data
|
172
|
+
undef data=
|
173
|
+
|
174
|
+
# @!attribute iaid
|
175
|
+
# 32-bit IAID field
|
176
|
+
# @return [Integer]
|
177
|
+
define_field :iaid, Types::Int32
|
178
|
+
# @!attribute t1
|
179
|
+
# 32-bit T1 field
|
180
|
+
# @return [Integer]
|
181
|
+
define_field :t1, Types::Int32
|
182
|
+
# @!attribute t2
|
183
|
+
# 32-bit T2 field
|
184
|
+
# @return [Integer]
|
185
|
+
define_field :t2, Types::Int32
|
186
|
+
# @!attribute options
|
187
|
+
# options field
|
188
|
+
# @return [String]
|
189
|
+
define_field :options, Types::String,
|
190
|
+
builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 12 } }
|
191
|
+
|
192
|
+
# Get human-readable data (IAID, T1 and T2)
|
193
|
+
# @return [String]
|
194
|
+
def human_data
|
195
|
+
"%#x,%u,%u" % [iaid, t1, t2]
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
# DHCPv6 Identity Association for Temporary Addresses Option
|
200
|
+
# @author Sylvain Daubert
|
201
|
+
class IATA < Option
|
202
|
+
# Option type value
|
203
|
+
TYPE = 4
|
204
|
+
|
205
|
+
delete_field :data
|
206
|
+
undef data
|
207
|
+
undef data=
|
208
|
+
|
209
|
+
# @!attribute iaid
|
210
|
+
# 32-bit IAID field
|
211
|
+
# @return [Integer]
|
212
|
+
define_field :iaid, Types::Int32
|
213
|
+
# @!attribute options
|
214
|
+
# options field
|
215
|
+
# @return [String]
|
216
|
+
define_field :options, Types::String,
|
217
|
+
builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 4 } }
|
218
|
+
|
219
|
+
# Get human-readable data (IAID)
|
220
|
+
# @return [String]
|
221
|
+
def human_data
|
222
|
+
"%#x" % iaid
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# DHCPv6 IA Address option
|
227
|
+
# @author Sylvain Daubert
|
228
|
+
class IAAddr < Option
|
229
|
+
# Option type value
|
230
|
+
TYPE = 5
|
231
|
+
|
232
|
+
delete_field :data
|
233
|
+
undef data
|
234
|
+
undef data=
|
235
|
+
|
236
|
+
# @attribute ipv6
|
237
|
+
# IPv6 address
|
238
|
+
# @return [IPv6::Addr]
|
239
|
+
define_field :ipv6, IPv6::Addr
|
240
|
+
# @attribute preferred_lifetime
|
241
|
+
# 32-bit preferred lifetime
|
242
|
+
# @return [Integer]
|
243
|
+
define_field :preferred_lifetime, Types::Int32
|
244
|
+
# @attribute valid_lifetime
|
245
|
+
# 32-bit valid lifetime
|
246
|
+
# @return [Integer]
|
247
|
+
define_field :valid_lifetime, Types::Int32
|
248
|
+
# @!attribute options
|
249
|
+
# options field
|
250
|
+
# @return [String]
|
251
|
+
define_field :options, Types::String,
|
252
|
+
builder: ->(h,t) { t.new length_from: ->() { h[:length].to_i - 24 } }
|
253
|
+
|
254
|
+
# Get human-readable data (ipv6, preferred lifetime and valid lifetime)
|
255
|
+
# @return [String]
|
256
|
+
def human_data
|
257
|
+
"#{ipv6},#{preferred_lifetime},#{valid_lifetime}"
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
# List of requested options for {ORO} option.
|
262
|
+
# Set of {Types::Int16}
|
263
|
+
# @author Sylvain Daubert
|
264
|
+
class RequestedOptions < Types::Array
|
265
|
+
set_of Types::Int16
|
266
|
+
end
|
267
|
+
|
268
|
+
# DHCPv6 Option Request Option
|
269
|
+
# @author Sylvain Daubert
|
270
|
+
class ORO < Option
|
271
|
+
# Option type value
|
272
|
+
TYPE = 6
|
273
|
+
|
274
|
+
delete_field :data
|
275
|
+
undef data
|
276
|
+
undef data=
|
277
|
+
|
278
|
+
# @!attribute options
|
279
|
+
# @return [RequestedOptions]
|
280
|
+
define_field :options, RequestedOptions
|
281
|
+
|
282
|
+
# Populate object from +str+
|
283
|
+
# @param [String] str
|
284
|
+
# @return [self]
|
285
|
+
def read(str)
|
286
|
+
self[:type].read str[0, 2]
|
287
|
+
self[:length].read str[2, 2]
|
288
|
+
self[:options].read str[4, self.length]
|
289
|
+
self
|
290
|
+
end
|
291
|
+
|
292
|
+
# Get human-readable data
|
293
|
+
# @return [String]
|
294
|
+
def human_data
|
295
|
+
self[:options].to_human
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
# DHCPv6 Preference option
|
300
|
+
# @author Sylvain Daubert
|
301
|
+
class Preference < Option
|
302
|
+
# Option type value
|
303
|
+
TYPE = 7
|
304
|
+
|
305
|
+
delete_field :data
|
306
|
+
undef data
|
307
|
+
undef data=
|
308
|
+
|
309
|
+
# @!attribute value
|
310
|
+
# 8-bit value
|
311
|
+
# @return [Integer]
|
312
|
+
define_field :value, Types::Int8
|
313
|
+
|
314
|
+
# Get human-readable data (value)
|
315
|
+
# @return [String]
|
316
|
+
def human_data
|
317
|
+
value.to_s
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
# DHCPv6 Elapsed Time option
|
322
|
+
# @author Sylvain Daubert
|
323
|
+
class ElapsedTime < Option
|
324
|
+
# Option type value
|
325
|
+
TYPE = 8
|
326
|
+
|
327
|
+
delete_field :data
|
328
|
+
undef data
|
329
|
+
undef data=
|
330
|
+
|
331
|
+
# @!attribute value
|
332
|
+
# 16-bit value
|
333
|
+
# @return [Integer]
|
334
|
+
define_field :value, Types::Int16
|
335
|
+
|
336
|
+
# Get human-readable data (value)
|
337
|
+
# @return [String]
|
338
|
+
def human_data
|
339
|
+
value.to_s
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
# DHCPv6 Relay Message option
|
344
|
+
# @author Sylvain Daubert
|
345
|
+
class RelayMessage < Option
|
346
|
+
# Option type value
|
347
|
+
TYPE = 9
|
348
|
+
end
|
349
|
+
|
350
|
+
# DHCPv6 Server Unicast option
|
351
|
+
# @author Sylvain Daubert
|
352
|
+
class ServerUnicast < Option
|
353
|
+
# Option type value
|
354
|
+
TYPE = 12
|
355
|
+
|
356
|
+
delete_field :data
|
357
|
+
undef data
|
358
|
+
undef data=
|
359
|
+
|
360
|
+
# @!attribute addr
|
361
|
+
# IPv6 server address
|
362
|
+
# @return [IPv6::Addr]
|
363
|
+
define_field :addr, IPv6::Addr
|
364
|
+
|
365
|
+
# Get human-readable data (addr)
|
366
|
+
# @return [String]
|
367
|
+
def human_data
|
368
|
+
addr
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# DHCPv6 Status Code option
|
373
|
+
# @author Sylvain Daubert
|
374
|
+
class StatusCode < ElapsedTime
|
375
|
+
# Option type value
|
376
|
+
TYPE = 13
|
377
|
+
end
|
378
|
+
|
379
|
+
# DHCPv6 Rapid Commit option
|
380
|
+
# @author Sylvain Daubert
|
381
|
+
class RapidCommit < Option
|
382
|
+
# Option type value
|
383
|
+
TYPE = 14
|
384
|
+
|
385
|
+
delete_field :data
|
386
|
+
undef data
|
387
|
+
undef data=
|
388
|
+
end
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
class DHCPv6
|
11
|
+
# Container class for DHCPv6 {Option options}.
|
12
|
+
#
|
13
|
+
# == Add DHCPv6 options to an +Options+ instance
|
14
|
+
# options = PacketGen::Header::DHCP::Options.new
|
15
|
+
# # Add an ElapsedTime option
|
16
|
+
# options << { type: 'ElapsedTime', value: 3600 }
|
17
|
+
# # Add a ClientID. Here, use integer type
|
18
|
+
# duid = PacketGen::Header::DHCPv6::DUID_LL.new(link_addr: '08:00:27:fe:8f:95')
|
19
|
+
# options << { type: 1, duid: duid }
|
20
|
+
# @author Sylvain Daubert
|
21
|
+
class Options < Types::Array
|
22
|
+
set_of DHCPv6::Option
|
23
|
+
|
24
|
+
# Separator used in {#to_human}.
|
25
|
+
HUMAN_SEPARATOR = ';'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
class DHCPv6
|
11
|
+
# DHCPv6 Relay agent / server header
|
12
|
+
# @author Sylvain Daubert
|
13
|
+
class Relay < Base
|
14
|
+
# DHCPv6 Relay message types
|
15
|
+
MESSAGE_TYPES = {
|
16
|
+
'RELAY-FORW' => 12,
|
17
|
+
'RELAY-REPL' => 13
|
18
|
+
}
|
19
|
+
|
20
|
+
# @!attribute msg_type
|
21
|
+
# 8-bit message type
|
22
|
+
# @return [Integer]
|
23
|
+
define_field :msg_type, Types::Int8Enum, enum: MESSAGE_TYPES
|
24
|
+
# @!attribute hop_count
|
25
|
+
# 8-bit hop count (number of relay agents that have relayed
|
26
|
+
# this message)
|
27
|
+
# @return [Integer]
|
28
|
+
define_field :hop_count, Types::Int8
|
29
|
+
# @!attribute link
|
30
|
+
# Link address: address that will be used by the server to identify
|
31
|
+
# the link on which the client is located
|
32
|
+
# @return [IPv6::Addr]
|
33
|
+
define_field :link, IPv6::Addr
|
34
|
+
# @!attribute peer
|
35
|
+
# Peer address: the address of the client or relay agent from which
|
36
|
+
# the message to be relayed was received
|
37
|
+
# @return [IPv6::Addr]
|
38
|
+
define_field :peer, IPv6::Addr
|
39
|
+
# @!attribute options
|
40
|
+
# @return [DHCPv6::Options]
|
41
|
+
define_field :options, DHCPv6::Options
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
UDP.bind_header DHCPv6::Relay, sport: DHCPv6::UDP_CLIENT_PORT, dport: DHCPv6::UDP_SERVER_PORT
|
46
|
+
UDP.bind_header DHCPv6::Relay, sport: DHCPv6::UDP_SERVER_PORT, dport: DHCPv6::UDP_CLIENT_PORT
|
47
|
+
end
|
48
|
+
end
|