packetgen 3.1.0 → 3.1.1
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 +1 -1
- data/lib/packetgen/header/dhcp/option.rb +33 -5
- data/lib/packetgen/header/dhcp/options.rb +1 -1
- data/lib/packetgen/header/dns.rb +12 -6
- data/lib/packetgen/header/dns/opt.rb +6 -15
- data/lib/packetgen/header/dns/option.rb +25 -2
- data/lib/packetgen/header/dot11/element.rb +14 -3
- data/lib/packetgen/header/dot11/management.rb +1 -2
- data/lib/packetgen/header/dot11/sub_mngt.rb +30 -60
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +5 -1
- data/lib/packetgen/types/abstract_tlv.rb +33 -2
- data/lib/packetgen/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36578b725eb28ace342c6468423d781158b376c16bcc8b949e1df62262aba11a
|
4
|
+
data.tar.gz: 6e3bbdfc313f54611b05a19a31336438fa781cce24bc19867a2e72d91bbc8f9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64cfe76137b2f4f2ea1b75806019a28d63d32cb904fe3a22982d8cf5b090e3df74befd527606d250d49a2541842b2dba2c0e1060b61128ecd538b2c6c7e6d544
|
7
|
+
data.tar.gz: 9700b4a0f455d5b6918d8a0eac2309100e29db650eb2f88469a54241b8b5888d2605571883aaebe187d69db97c0e0e380ba35c4325a6bd420c492ec7dc619c55
|
data/README.md
CHANGED
@@ -164,7 +164,7 @@ PacketGen provides a plugin system (see [wiki](https://github.com/sdaubert/packe
|
|
164
164
|
Available plugins (available as gem) are:
|
165
165
|
|
166
166
|
* [packetgen-plugin-ipsec](https://github.com/sdaubert/packetgen-plugin-ipsec): add support for ESP and IKEv2 protocols. Before PacketGen3, these protocols were included in packetgen.
|
167
|
-
* [packetgen-plugin-smb](https://github.com/sdaubert/packetgen-plugin-smb): add
|
167
|
+
* [packetgen-plugin-smb](https://github.com/sdaubert/packetgen-plugin-smb): add support for SMB protocol suite.
|
168
168
|
|
169
169
|
## See also
|
170
170
|
|
@@ -56,19 +56,47 @@ module PacketGen
|
|
56
56
|
'end' => 255
|
57
57
|
}.freeze
|
58
58
|
|
59
|
-
#
|
59
|
+
# @!parse
|
60
|
+
# # Option class with string value. {#type #type} and {#length #length} are
|
61
|
+
# # {Types::Int8}.
|
62
|
+
# #
|
63
|
+
# # See also {IPAddrOption}, {Int8Option}, {Int16Option} and {Int32Option}.
|
64
|
+
# # @since 2.2.0
|
65
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
66
|
+
# class Option < Types::AbstractTLV; end
|
67
|
+
# @private
|
60
68
|
Option = Types::AbstractTLV.create
|
61
69
|
Option.define_type_enum DHCP_OPTIONS
|
62
|
-
#
|
70
|
+
# @!parse
|
71
|
+
# # {Option} class with IP address value
|
72
|
+
# # @since 2.2.0
|
73
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
74
|
+
# class IPAddrOption < Types::AbstractTLV; end
|
75
|
+
# @private
|
63
76
|
IPAddrOption = Types::AbstractTLV.create(value_class: IP::Addr)
|
64
77
|
IPAddrOption.define_type_enum DHCP_OPTIONS
|
65
|
-
#
|
78
|
+
# @!parse
|
79
|
+
# # {Option} class with int8 value
|
80
|
+
# # @since 2.2.0
|
81
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
82
|
+
# class Int8Option < Types::AbstractTLV; end
|
83
|
+
# @private
|
66
84
|
Int8Option = Types::AbstractTLV.create(value_class: Types::Int8)
|
67
85
|
Int8Option.define_type_enum DHCP_OPTIONS
|
68
|
-
#
|
86
|
+
# @!parse
|
87
|
+
# # {Option} class with int16 value
|
88
|
+
# # @since 2.2.0
|
89
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
90
|
+
# class Int16Option < Types::AbstractTLV; end
|
91
|
+
# @private
|
69
92
|
Int16Option = Types::AbstractTLV.create(value_class: Types::Int16)
|
70
93
|
Int16Option.define_type_enum DHCP_OPTIONS
|
71
|
-
#
|
94
|
+
# @!parse
|
95
|
+
# # {Option} class with int32 value
|
96
|
+
# # @since 2.2.0
|
97
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
98
|
+
# class Int32Option < Types::AbstractTLV; end
|
99
|
+
# @private
|
72
100
|
Int32Option = Types::AbstractTLV.create(value_class: Types::Int32)
|
73
101
|
Int32Option.define_type_enum DHCP_OPTIONS
|
74
102
|
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -43,10 +43,14 @@ module PacketGen
|
|
43
43
|
# == DNS attributes
|
44
44
|
# dns.id = 0x1234
|
45
45
|
# dns.qr = false
|
46
|
-
#
|
47
|
-
#
|
46
|
+
# # opcode may be set as an Integer (all values are possible)
|
47
|
+
# # or as a String (only keys from PacketGen::Header::DNS::OPCODES)
|
48
|
+
# dns.opcode = 0xe # set as integer, value not defined in standard
|
49
|
+
# dns.opcode = 'query' # set as string
|
48
50
|
# dns.aa = dns.tc = dns.rd = dns.ra = false
|
49
|
-
#
|
51
|
+
# # rcode may be set as an Integer (all values are possible)
|
52
|
+
# # or as a String (only keys from PacketGen::Header::DNS::RCODES)
|
53
|
+
# dns.rcode = 11
|
50
54
|
# dns.rcode = 'refused'
|
51
55
|
# dns.qdcount = 123
|
52
56
|
# dns.ancount = 0x1234
|
@@ -71,8 +75,8 @@ module PacketGen
|
|
71
75
|
# dns.qd.push({ rtype: 'Question', name: 'example.net', type: 'AAAA' })
|
72
76
|
#
|
73
77
|
# == Add a ressource record to a DNS section
|
74
|
-
# Adding a {RR} with {RRSection#<<} automagically increments section counter.
|
75
|
-
# To not modify it, use {RRSection#push}
|
78
|
+
# Adding a {RR} with {RRSection#<< RRSection#<<} automagically increments section counter.
|
79
|
+
# To not modify it, use {RRSection#push RRSection#push}
|
76
80
|
# # add a RR to answer section. Increment ancount
|
77
81
|
# dns.an << PacketGen::Header::DNS::RR.new(dns, name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton)
|
78
82
|
# # or
|
@@ -89,7 +93,9 @@ module PacketGen
|
|
89
93
|
# # or
|
90
94
|
# dns.ar << { rtype: 'OPT', udp_size: 4096, ext_rcode: 43 }
|
91
95
|
# # add an option to OPT record
|
92
|
-
# dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48,
|
96
|
+
# dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48, data: '12')
|
97
|
+
# # or
|
98
|
+
# dns.ar.last.options << { code: 48, data: '12' }
|
93
99
|
# @author Sylvain Daubert
|
94
100
|
# @since 1.3.0
|
95
101
|
class DNS < Base
|
@@ -14,9 +14,12 @@ module PacketGen
|
|
14
14
|
#
|
15
15
|
# a OPT record may contain zero or more {Option options} in its {#rdata}.
|
16
16
|
# @author Sylvain Daubert
|
17
|
+
# @since 1.3.0
|
18
|
+
# @since 3.1.1 {#options} is a {ArrayOfOptions}
|
17
19
|
class OPT < RR
|
18
|
-
#
|
19
|
-
|
20
|
+
# @!attribute options
|
21
|
+
# @return [ArrayOfOptions]
|
22
|
+
define_field_after :rdata, :options, ArrayOfOptions
|
20
23
|
|
21
24
|
# @param [DNS] dns
|
22
25
|
# @param [Hash] options
|
@@ -35,7 +38,6 @@ module PacketGen
|
|
35
38
|
def initialize(dns, options={})
|
36
39
|
opts = { name: '.', rrclass: 512, type: 41 }.merge!(options)
|
37
40
|
super dns, opts
|
38
|
-
@options = []
|
39
41
|
|
40
42
|
self.udp_size = options[:udp_size] if options[:udp_size]
|
41
43
|
self.ext_rcode = options[:ext_rcode] if options[:ext_rcode]
|
@@ -120,22 +122,11 @@ module PacketGen
|
|
120
122
|
do? ? 'do' : 'none'
|
121
123
|
end
|
122
124
|
|
123
|
-
# @return [String]
|
124
|
-
def human_options
|
125
|
-
str = @options.map(&:to_human).join(';')
|
126
|
-
str.empty? ? 'none' : str
|
127
|
-
end
|
128
|
-
|
129
125
|
# @return [String]
|
130
126
|
def to_human
|
131
127
|
"#{name} #{human_type} UDPsize:#{udp_size} " \
|
132
128
|
"extRCODE:#{ext_rcode} EDNSversion:#{version} flags:#{human_flags} " \
|
133
|
-
"options:#{
|
134
|
-
end
|
135
|
-
|
136
|
-
# @return [String]
|
137
|
-
def to_s
|
138
|
-
super + @options.map(&:to_s).join
|
129
|
+
"options:#{options.empty? ? 'none' : options.to_human}"
|
139
130
|
end
|
140
131
|
end
|
141
132
|
end
|
@@ -8,9 +8,32 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class DNS
|
11
|
-
#
|
11
|
+
# @!parse
|
12
|
+
# # DNS option is a TLV object:
|
13
|
+
# # * {#code} is a {Types::Int16},
|
14
|
+
# # * {#length #length} is a {Types::Int16},
|
15
|
+
# # * {#data} is a {Types::String}.
|
16
|
+
# #
|
17
|
+
# # @since 1.3.0
|
18
|
+
# # @since 3.1.0 defined with {Types::AbstractTLV}
|
19
|
+
# # @!parse class Option < Types::AbstractTLV; end
|
20
|
+
# # @!attribute code
|
21
|
+
# # Alias for {#type}
|
22
|
+
# # @return [Integer]
|
23
|
+
# # @!attribute data
|
24
|
+
# # Alias for {#value}
|
25
|
+
# # @return [Types::String]
|
26
|
+
# class Option < Types::AbstractTLV; end
|
27
|
+
# @private
|
12
28
|
Option = Types::AbstractTLV.create(type_class: Types::Int16,
|
13
|
-
length_class: Types::Int16
|
29
|
+
length_class: Types::Int16,
|
30
|
+
aliases: { code: :type, data: :value })
|
31
|
+
|
32
|
+
# Array of {Option}.
|
33
|
+
# @since 3.1.1
|
34
|
+
class ArrayOfOptions < Types::Array
|
35
|
+
set_of Option
|
36
|
+
end
|
14
37
|
end
|
15
38
|
end
|
16
39
|
end
|
@@ -9,9 +9,14 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class Dot11
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
12
|
+
# @!parse
|
13
|
+
# # IEEE 802.11 information element
|
14
|
+
# #
|
15
|
+
# # An {Element} is a piece of data contained in a Dot11 management frame.
|
16
|
+
# # @since 1.4.0
|
17
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
18
|
+
# class Element < Types::AbstractTLV; end
|
19
|
+
# @private
|
15
20
|
Element = Types::AbstractTLV.create
|
16
21
|
|
17
22
|
class Element
|
@@ -35,6 +40,12 @@ module PacketGen
|
|
35
40
|
}.freeze
|
36
41
|
end
|
37
42
|
Element.define_type_enum Element::TYPES.invert
|
43
|
+
|
44
|
+
# Array of {Element}.
|
45
|
+
# @since 3.1.1
|
46
|
+
class ArrayOfElements < Types::Array
|
47
|
+
set_of Element
|
48
|
+
end
|
38
49
|
end
|
39
50
|
end
|
40
51
|
end
|
@@ -54,8 +54,7 @@ module PacketGen
|
|
54
54
|
# @since 2.1.3
|
55
55
|
def add_element(type:, value:)
|
56
56
|
if self[:body].is_a? SubMngt
|
57
|
-
|
58
|
-
self[:body].elements << element
|
57
|
+
self[:body].elements << { type: type, value: value }
|
59
58
|
else
|
60
59
|
raise FormatError, 'Before adding an Element, you have to add a Dot11::SubMngt subclass instance'
|
61
60
|
end
|
@@ -19,61 +19,31 @@ module PacketGen
|
|
19
19
|
# @author Sylvain Daubert
|
20
20
|
class SubMngt < Base
|
21
21
|
# @return [Array<Element>]
|
22
|
-
|
23
|
-
|
24
|
-
# @param [Hash] options
|
25
|
-
# @see Base#initialize
|
26
|
-
def initialize(options={})
|
27
|
-
super
|
28
|
-
@elements = []
|
29
|
-
end
|
30
|
-
|
31
|
-
# Populate object from binary string
|
32
|
-
# @param [String] str
|
33
|
-
# @return [SubMngt] self
|
34
|
-
def read(str)
|
35
|
-
super
|
36
|
-
read_elements str[sz, str.size] || ''
|
37
|
-
self
|
38
|
-
end
|
39
|
-
|
40
|
-
# @return [String]
|
41
|
-
def to_s
|
42
|
-
super + @elements.map(&:to_s).join
|
43
|
-
end
|
22
|
+
define_field :elements, ArrayOfElements
|
44
23
|
|
45
24
|
# @return [String]
|
46
|
-
def inspect
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
25
|
+
#def inspect
|
26
|
+
# str = super
|
27
|
+
# str << Inspect.dashed_line('Dot11 Elements', 2)
|
28
|
+
# @elements.each do |el|
|
29
|
+
# str << Inspect.shift_level(2) << el.to_human << "\n"
|
30
|
+
# end
|
31
|
+
# str
|
32
|
+
#end
|
54
33
|
|
55
34
|
# Add an {Element} to header
|
56
35
|
# @param [Integer,String] type element type
|
57
36
|
# @param [Object] value element value
|
58
37
|
# @return [self]
|
59
38
|
# @since 2.1.3
|
39
|
+
# @since 3.1.1 #elements in no more an Array but an {ArrayOfElements}
|
40
|
+
# @deprecated Prefer use of +submngt.element << {type: type, value: value}+
|
60
41
|
def add_element(type:, value:)
|
42
|
+
Deprecation.deprecated(self.class, __method__, 'elements')
|
61
43
|
element = Element.new(type: type, value: value)
|
62
|
-
|
44
|
+
self.elements << element
|
63
45
|
self
|
64
46
|
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def read_elements(str)
|
69
|
-
start = 0
|
70
|
-
elsz = Element.new.sz
|
71
|
-
while str.size - start >= elsz
|
72
|
-
el = Element.new.read(str[start, str.size])
|
73
|
-
@elements << el
|
74
|
-
start += el.sz
|
75
|
-
end
|
76
|
-
end
|
77
47
|
end
|
78
48
|
|
79
49
|
# IEEE 802.11 Association Request frame
|
@@ -87,10 +57,10 @@ module PacketGen
|
|
87
57
|
class AssoReq < SubMngt
|
88
58
|
# @!attribute cap
|
89
59
|
# @return [Integer] 16-bit capabillities word
|
90
|
-
|
60
|
+
define_field_before :elements, :cap, Types::Int16le
|
91
61
|
# @!attribute listen_interval
|
92
62
|
# @return [Integer] 16-bit listen interval value
|
93
|
-
|
63
|
+
define_field_before :elements, :listen_interval, Types::Int16le, default: 0x00c8
|
94
64
|
end
|
95
65
|
Header.add_class AssoReq
|
96
66
|
Management.bind AssoReq, type: 0, subtype: 0
|
@@ -107,13 +77,13 @@ module PacketGen
|
|
107
77
|
class AssoResp < SubMngt
|
108
78
|
# @!attribute cap
|
109
79
|
# @return [Integer] 16-bit capabillities word
|
110
|
-
|
80
|
+
define_field_before :elements, :cap, Types::Int16le
|
111
81
|
# @!attribute status
|
112
82
|
# @return [Integer] 16-bit status word
|
113
|
-
|
83
|
+
define_field_before :elements, :status, Types::Int16le
|
114
84
|
# @!attribute aid
|
115
85
|
# @return [Integer] 16-bit AID word
|
116
|
-
|
86
|
+
define_field_before :elements, :aid, Types::Int16le
|
117
87
|
end
|
118
88
|
Header.add_class AssoResp
|
119
89
|
Management.bind AssoResp, type: 0, subtype: 1
|
@@ -130,7 +100,7 @@ module PacketGen
|
|
130
100
|
class ReAssoReq < AssoReq
|
131
101
|
# @!attribute current_ap
|
132
102
|
# @return [Eth::MAcAddr]
|
133
|
-
|
103
|
+
define_field_before :elements, :current_ap, Eth::MacAddr
|
134
104
|
end
|
135
105
|
Header.add_class ReAssoReq
|
136
106
|
Management.bind ReAssoReq, type: 0, subtype: 2
|
@@ -172,13 +142,13 @@ module PacketGen
|
|
172
142
|
class ProbeResp < SubMngt
|
173
143
|
# @!attribute timestamp
|
174
144
|
# @return [Integer] 64-bit timestamp
|
175
|
-
|
145
|
+
define_field_before :elements, :timestamp, Types::Int64le
|
176
146
|
# @!attribute beacon_interval
|
177
147
|
# @return [Integer] 16-bit beacon interval value
|
178
|
-
|
148
|
+
define_field_before :elements, :beacon_interval, Types::Int16le, default: 0x0064
|
179
149
|
# @!attribute cap
|
180
150
|
# @return [Integer] 16-bit capabillities word
|
181
|
-
|
151
|
+
define_field_before :elements, :cap, Types::Int16le
|
182
152
|
end
|
183
153
|
Header.add_class ProbeResp
|
184
154
|
Management.bind ProbeResp, type: 0, subtype: 5
|
@@ -195,13 +165,13 @@ module PacketGen
|
|
195
165
|
class Beacon < SubMngt
|
196
166
|
# @!attribute timestamp
|
197
167
|
# @return [Integer] 64-bit timestamp
|
198
|
-
|
168
|
+
define_field_before :elements, :timestamp, Types::Int64le
|
199
169
|
# @!attribute interval
|
200
170
|
# @return [Integer] 16-bit interval value
|
201
|
-
|
171
|
+
define_field_before :elements, :interval, Types::Int16le, default: 0x64
|
202
172
|
# @!attribute cap
|
203
173
|
# @return [Integer] 16-bit capabillities word
|
204
|
-
|
174
|
+
define_field_before :elements, :cap, Types::Int16le
|
205
175
|
end
|
206
176
|
Header.add_class Beacon
|
207
177
|
Management.bind Beacon, type: 0, subtype: 8
|
@@ -226,7 +196,7 @@ module PacketGen
|
|
226
196
|
class Disas < SubMngt
|
227
197
|
# @!attribute reason
|
228
198
|
# @return [Integer] 16-bit reason value
|
229
|
-
|
199
|
+
define_field_before :elements, :reason, Types::Int16le
|
230
200
|
end
|
231
201
|
Header.add_class Disas
|
232
202
|
Management.bind Disas, type: 0, subtype: 10
|
@@ -243,13 +213,13 @@ module PacketGen
|
|
243
213
|
class Auth < SubMngt
|
244
214
|
# @!attribute algo
|
245
215
|
# @return [Integer] 16-bit algo value
|
246
|
-
|
216
|
+
define_field_before :elements, :algo, Types::Int16le
|
247
217
|
# @!attribute seqnum
|
248
218
|
# @return [Integer] 16-bit seqnum value
|
249
|
-
|
219
|
+
define_field_before :elements, :seqnum, Types::Int16le
|
250
220
|
# @!attribute status
|
251
221
|
# @return [Integer] 16-bit status word
|
252
|
-
|
222
|
+
define_field_before :elements, :status, Types::Int16le
|
253
223
|
end
|
254
224
|
Header.add_class Auth
|
255
225
|
Management.bind Auth, type: 0, subtype: 11
|
@@ -264,7 +234,7 @@ module PacketGen
|
|
264
234
|
class DeAuth < SubMngt
|
265
235
|
# @!attribute reason
|
266
236
|
# @return [Integer] 16-bit reason value
|
267
|
-
|
237
|
+
define_field_before :elements, :reason, Types::Int16le
|
268
238
|
end
|
269
239
|
Header.add_class DeAuth
|
270
240
|
Management.bind DeAuth, type: 0, subtype: 12
|
@@ -8,7 +8,11 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class IPv6
|
11
|
-
#
|
11
|
+
# @!parse
|
12
|
+
# # Option for {HopByHop} IPv6 extension header.
|
13
|
+
# # @since 3.1.0 subclass of {Types::AbstractTLV}
|
14
|
+
# class Option <AbstractTLV; end
|
15
|
+
# @private
|
12
16
|
Option = Types::AbstractTLV.create
|
13
17
|
|
14
18
|
class Option
|
@@ -40,20 +40,40 @@ module PacketGen
|
|
40
40
|
# tlv = MyTLV.new(type: 1, value: '1.2.3.4')
|
41
41
|
# tlv.type #=> 1
|
42
42
|
# tlv.length #=> 4
|
43
|
-
# tlv.value #=>
|
43
|
+
# tlv.value #=> '1.2.3.4'
|
44
44
|
# tlv.to_s #=> "\x00\x01\x00\x04\x01\x02\x03\x04"
|
45
|
+
#
|
46
|
+
# Some aliases may also be defined. For example, to create a TLV type
|
47
|
+
# whose +type+ field should be named +code+:
|
48
|
+
# MyTLV = PacketGen::Types::AbstractTLV.create(type_class: PacketGen::Types::Int16,
|
49
|
+
# length_class: PacketGen::Types::Int16,
|
50
|
+
# aliases: { code: :type })
|
51
|
+
# tlv = MyTLV.new(code: 1, value: 'abcd')
|
52
|
+
# tlv.code #=> 1
|
53
|
+
# tlv.type #=> 1
|
54
|
+
# tlv.length #=> 4
|
55
|
+
# tlv.value #=> 'abcd'
|
56
|
+
#
|
45
57
|
# @author Sylvain Daubert
|
46
58
|
# @since 3.1.0
|
59
|
+
# @since 3.1.1 add +:aliases+ keyword to {#initialize}
|
47
60
|
class AbstractTLV < Types::Fields
|
61
|
+
class <<self
|
62
|
+
# @return [Hash]
|
63
|
+
attr_accessor :aliases
|
64
|
+
end
|
65
|
+
self.aliases = {}
|
66
|
+
|
48
67
|
# Generate a TLV class
|
49
68
|
# @param [Class] type_class Class to use for +type+
|
50
69
|
# @param [Class] length_class Class to use for +length+
|
51
70
|
# @param [Class] value_class Class to use for +value+
|
52
71
|
# @return [Class]
|
53
|
-
def self.create(type_class: Int8Enum, length_class: Int8, value_class: String)
|
72
|
+
def self.create(type_class: Int8Enum, length_class: Int8, value_class: String, aliases: {})
|
54
73
|
raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal? AbstractTLV
|
55
74
|
|
56
75
|
klass = Class.new(self)
|
76
|
+
klass.aliases = aliases
|
57
77
|
|
58
78
|
if type_class < Enum
|
59
79
|
klass.define_field :type, type_class, enum: {}
|
@@ -63,6 +83,13 @@ module PacketGen
|
|
63
83
|
klass.define_field :length, length_class
|
64
84
|
klass.define_field :value, value_class
|
65
85
|
|
86
|
+
aliases.each do |al, orig|
|
87
|
+
klass.instance_eval do
|
88
|
+
alias_method al, orig if klass.method_defined?(orig)
|
89
|
+
alias_method :"#{al}=", :"#{orig}=" if klass.method_defined?(:"#{orig}=")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
66
93
|
klass
|
67
94
|
end
|
68
95
|
# @!attribute type
|
@@ -90,6 +117,10 @@ module PacketGen
|
|
90
117
|
# @option options [Integer] :length
|
91
118
|
# @option options [Object] :value
|
92
119
|
def initialize(options={})
|
120
|
+
self.class.aliases.each do |al, orig|
|
121
|
+
options[orig] = options[al] if options.key?(al)
|
122
|
+
end
|
123
|
+
|
93
124
|
super
|
94
125
|
# used #value= defined below, which set length if needed
|
95
126
|
self.value = options[:value] if options[:value]
|
data/lib/packetgen/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.1.
|
4
|
+
version: 3.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: interfacez
|