packetgen 2.8.4 → 2.8.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/packetgen/deprecation.rb +6 -4
- data/lib/packetgen/header/dot11/data.rb +54 -0
- data/lib/packetgen/types/fields.rb +234 -221
- 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: 6763c9433901ae848d2186d92ec47e3894b493b951c048d68e3a01bd52504563
|
4
|
+
data.tar.gz: 68ec7d1ea6a27fa2101d8c7b72800083cdebe80cf8eec93d52255d459fbc5f73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8166a6b1fee9a6d8ed45af7f100368272576cc6242e367e1735b204362e75fe5b76839fb53b75046a42cb7e5e3518705142ee9ef2a4326f44ea080f9f70c35b
|
7
|
+
data.tar.gz: 7079595e88887e39e1bb5b2e6d24689710cc0edcf2399d67fcf20964fa160481654b3e0ce1375739844465d51428b7c3a67f55fa0e008c9e379cbddff8cf5847
|
@@ -4,15 +4,17 @@ module PacketGen
|
|
4
4
|
# @author Sylvain Daubert
|
5
5
|
# @api private
|
6
6
|
module Deprecation
|
7
|
-
def self.deprecated(klass, deprecated_method, new_method, klass_method: false, remove_version: '3.0.0')
|
7
|
+
def self.deprecated(klass, deprecated_method, new_method=nil, klass_method: false, remove_version: '3.0.0')
|
8
8
|
separator = klass_method ? '.' : '#'
|
9
9
|
base_name = klass.to_s + separator
|
10
10
|
complete_deprecated_method_name = base_name + deprecated_method.to_s
|
11
|
-
complete_new_method_name = base_name + new_method.to_s
|
11
|
+
complete_new_method_name = base_name + new_method.to_s unless new_method.nil?
|
12
12
|
|
13
13
|
file, line = caller(2).first.split(':')[0, 2]
|
14
|
-
|
15
|
-
|
14
|
+
message = +"#{file}:#{line}: #{complete_deprecated_method_name} is deprecated"
|
15
|
+
message << "in favor of #{complete_new_method_name}" unless new_method.nil?
|
16
|
+
message << ". It will be remove in PacketGen #{remove_version}."
|
17
|
+
warn message
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
@@ -64,6 +64,60 @@ module PacketGen
|
|
64
64
|
self
|
65
65
|
end
|
66
66
|
|
67
|
+
# Get destination MAC address
|
68
|
+
# @return [String]
|
69
|
+
def dst
|
70
|
+
ds = frame_ctrl & 3
|
71
|
+
case ds
|
72
|
+
when 0, 2
|
73
|
+
self.mac1
|
74
|
+
when 1, 3
|
75
|
+
self.mac3
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Set destination MAC address
|
80
|
+
# @param [String] mac MAC address to set
|
81
|
+
# @return [String]
|
82
|
+
def dst=(mac)
|
83
|
+
ds = frame_ctrl & 3
|
84
|
+
case ds
|
85
|
+
when 0, 2
|
86
|
+
self.mac1 = mac
|
87
|
+
when 1, 3
|
88
|
+
self.mac3 = mac
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get source MAC address
|
93
|
+
# @return [String]
|
94
|
+
def src
|
95
|
+
ds = frame_ctrl & 3
|
96
|
+
case ds
|
97
|
+
when 0, 1
|
98
|
+
self.mac2
|
99
|
+
when 2
|
100
|
+
self.mac3
|
101
|
+
when 3
|
102
|
+
self.mac4
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Set source MAC address
|
107
|
+
# @param [String] mac MAC address to set
|
108
|
+
# @return [String]
|
109
|
+
def src=(mac)
|
110
|
+
ds = frame_ctrl & 3
|
111
|
+
case ds
|
112
|
+
when 0, 1
|
113
|
+
self.mac2 = mac
|
114
|
+
when 2
|
115
|
+
self.mac3 = mac
|
116
|
+
when 3
|
117
|
+
self.mac4 = mac
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
67
121
|
private
|
68
122
|
|
69
123
|
def define_applicable_fields
|
@@ -94,249 +94,258 @@ module PacketGen
|
|
94
94
|
# offset subfield from +frag+ field.
|
95
95
|
# @author Sylvain Daubert
|
96
96
|
class Fields
|
97
|
-
# @private
|
97
|
+
# @private field names, ordered as they were declared
|
98
98
|
@ordered_fields = []
|
99
|
-
# @private
|
99
|
+
# @private field definitions
|
100
100
|
@field_defs = {}
|
101
|
-
# @private
|
101
|
+
# @private bit field definitions
|
102
102
|
@bit_fields = {}
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
field_defs
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
104
|
+
class <<self
|
105
|
+
# On inheritage, create +@field_defs+ class variable
|
106
|
+
# @param [Class] klass
|
107
|
+
# @return [void]
|
108
|
+
def inherited(klass)
|
109
|
+
field_defs = {}
|
110
|
+
@field_defs.each do |k, v|
|
111
|
+
field_defs[k] = v.clone
|
112
|
+
end
|
113
|
+
ordered = @ordered_fields.clone
|
114
|
+
bf = @bit_fields.clone
|
115
|
+
klass.class_eval do
|
116
|
+
@ordered_fields = ordered
|
117
|
+
@field_defs = field_defs
|
118
|
+
@bit_fields = bf
|
119
|
+
end
|
118
120
|
end
|
119
|
-
end
|
120
121
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
# # 16-bit value
|
126
|
-
# define_field :value2, Types::Int16
|
127
|
-
# # specific class, may use a specific constructor
|
128
|
-
# define_field :value3, MyClass, builder: ->(obj, type) { type.new(obj) }
|
129
|
-
# end
|
130
|
-
#
|
131
|
-
# bs = BinaryStruct.new
|
132
|
-
# bs[value1] # => Types::Int8
|
133
|
-
# bs.value1 # => Integer
|
134
|
-
# @param [Symbol] name field name
|
135
|
-
# @param [Object] type class or instance
|
136
|
-
# @param [Hash] options Unrecognized options are passed to object builder if
|
137
|
-
# +:builder+ option is not set.
|
138
|
-
# @option options [Object] :default default value. May be a proc. This lambda
|
139
|
-
# take one argument: the caller object.
|
140
|
-
# @option options [Lambda] :builder lambda to construct this field.
|
141
|
-
# Parameters to this lambda is the caller object and the field type class.
|
142
|
-
# @option options [Lambda] :optional define this field as optional. Given lambda
|
143
|
-
# is used to known if this field is present or not. Parameter to this lambda is
|
144
|
-
# the being defined Field object.
|
145
|
-
# @option options [Hash] :enum mandatory option for an {Enum} type.
|
146
|
-
# Define enumeration: hash's keys are +String+, and values are +Integer+.
|
147
|
-
# @return [void]
|
148
|
-
def self.define_field(name, type, options={})
|
149
|
-
define = []
|
150
|
-
if type < Types::Enum
|
151
|
-
define << "def #{name}; self[:#{name}].to_i; end"
|
152
|
-
define << "def #{name}=(val) self[:#{name}].value = val; end"
|
153
|
-
elsif type < Types::Int
|
154
|
-
define << "def #{name}; self[:#{name}].to_i; end"
|
155
|
-
define << "def #{name}=(val) self[:#{name}].read val; end"
|
156
|
-
elsif type.instance_methods.include?(:to_human) &&
|
157
|
-
type.instance_methods.include?(:from_human)
|
158
|
-
define << "def #{name}; self[:#{name}].to_human; end"
|
159
|
-
define << "def #{name}=(val) self[:#{name}].from_human val; end"
|
160
|
-
else
|
161
|
-
define << "def #{name}; self[:#{name}]; end\n"
|
162
|
-
define << "def #{name}=(val) self[:#{name}].read val; end"
|
122
|
+
# Get field names
|
123
|
+
# @return [Array<Symbol>]
|
124
|
+
def fields
|
125
|
+
@ordered_fields
|
163
126
|
end
|
164
127
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
128
|
+
# Define a field in class
|
129
|
+
# class BinaryStruct < PacketGen::Types::Fields
|
130
|
+
# # 8-bit value
|
131
|
+
# define_field :value1, Types::Int8
|
132
|
+
# # 16-bit value
|
133
|
+
# define_field :value2, Types::Int16
|
134
|
+
# # specific class, may use a specific constructor
|
135
|
+
# define_field :value3, MyClass, builder: ->(obj, type) { type.new(obj) }
|
136
|
+
# end
|
137
|
+
#
|
138
|
+
# bs = BinaryStruct.new
|
139
|
+
# bs[value1] # => Types::Int8
|
140
|
+
# bs.value1 # => Integer
|
141
|
+
# @param [Symbol] name field name
|
142
|
+
# @param [Object] type class or instance
|
143
|
+
# @param [Hash] options Unrecognized options are passed to object builder if
|
144
|
+
# +:builder+ option is not set.
|
145
|
+
# @option options [Object] :default default value. May be a proc. This lambda
|
146
|
+
# take one argument: the caller object.
|
147
|
+
# @option options [Lambda] :builder lambda to construct this field.
|
148
|
+
# Parameters to this lambda is the caller object and the field type class.
|
149
|
+
# @option options [Lambda] :optional define this field as optional. Given lambda
|
150
|
+
# is used to known if this field is present or not. Parameter to this lambda is
|
151
|
+
# the being defined Field object.
|
152
|
+
# @option options [Hash] :enum mandatory option for an {Enum} type.
|
153
|
+
# Define enumeration: hash's keys are +String+, and values are +Integer+.
|
154
|
+
# @return [void]
|
155
|
+
def define_field(name, type, options={})
|
156
|
+
define = []
|
157
|
+
if type < Types::Enum
|
158
|
+
define << "def #{name}; self[:#{name}].to_i; end"
|
159
|
+
define << "def #{name}=(val) self[:#{name}].value = val; end"
|
160
|
+
elsif type < Types::Int
|
161
|
+
define << "def #{name}; self[:#{name}].to_i; end"
|
162
|
+
define << "def #{name}=(val) self[:#{name}].read val; end"
|
163
|
+
elsif type.instance_methods.include?(:to_human) &&
|
164
|
+
type.instance_methods.include?(:from_human)
|
165
|
+
define << "def #{name}; self[:#{name}].to_human; end"
|
166
|
+
define << "def #{name}=(val) self[:#{name}].from_human val; end"
|
167
|
+
else
|
168
|
+
define << "def #{name}; self[:#{name}]; end\n"
|
169
|
+
define << "def #{name}=(val) self[:#{name}].read val; end"
|
170
|
+
end
|
191
171
|
|
192
|
-
|
193
|
-
|
172
|
+
define.delete(1) if type.instance_methods.include? "#{name}=".to_sym
|
173
|
+
define.delete(0) if type.instance_methods.include? name
|
174
|
+
class_eval define.join("\n")
|
175
|
+
@field_defs[name] = [type, options.delete(:default),
|
176
|
+
options.delete(:builder),
|
177
|
+
options.delete(:optional),
|
178
|
+
options.delete(:enum),
|
179
|
+
options]
|
180
|
+
fields << name
|
181
|
+
end
|
194
182
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
183
|
+
# Define a field, before another one
|
184
|
+
# @param [Symbol,nil] other field name to create a new one before. If +nil+,
|
185
|
+
# new field is appended.
|
186
|
+
# @param [Symbol] name field name to create
|
187
|
+
# @param [Object] type class or instance
|
188
|
+
# @param [Hash] options See {.define_field}.
|
189
|
+
# @return [void]
|
190
|
+
# @see .define_field
|
191
|
+
def define_field_before(other, name, type, options={})
|
192
|
+
define_field name, type, options
|
193
|
+
return if other.nil?
|
194
|
+
|
195
|
+
fields.delete name
|
196
|
+
idx = fields.index(other)
|
197
|
+
raise ArgumentError, "unknown #{other} field" if idx.nil?
|
198
|
+
|
199
|
+
fields[idx, 0] = name
|
200
|
+
end
|
206
201
|
|
207
|
-
|
208
|
-
|
209
|
-
|
202
|
+
# Define a field, after another one
|
203
|
+
# @param [Symbol,nil] other field name to create a new one after. If +nil+,
|
204
|
+
# new field is appended.
|
205
|
+
# @param [Symbol] name field name to create
|
206
|
+
# @param [Object] type class or instance
|
207
|
+
# @param [Hash] options See {.define_field}.
|
208
|
+
# @return [void]
|
209
|
+
# @see .define_field
|
210
|
+
def define_field_after(other, name, type, options={})
|
211
|
+
define_field name, type, options
|
212
|
+
return if other.nil?
|
213
|
+
|
214
|
+
fields.delete name
|
215
|
+
idx = fields.index(other)
|
216
|
+
raise ArgumentError, "unknown #{other} field" if idx.nil?
|
217
|
+
|
218
|
+
fields[idx + 1, 0] = name
|
219
|
+
end
|
210
220
|
|
211
|
-
|
212
|
-
|
221
|
+
# Remove a previously defined field
|
222
|
+
# @param [Symbol] name
|
223
|
+
# @return [void]
|
224
|
+
# @since 2.8.4
|
225
|
+
def remove_field(name)
|
226
|
+
fields.delete name
|
227
|
+
@field_defs.delete name
|
228
|
+
undef_method name
|
229
|
+
undef_method "#{name}="
|
230
|
+
end
|
213
231
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
end
|
232
|
+
# Delete a previously defined field
|
233
|
+
# @param [Symbol] name
|
234
|
+
# @return [void]
|
235
|
+
# @deprecated Use {.remove_field} instead.
|
236
|
+
# @since 2.8.4 deprecated
|
237
|
+
def delete_field(name)
|
238
|
+
Deprecation.deprecated(self, __method__, 'remove_field', klass_method: true)
|
239
|
+
remove_field name
|
240
|
+
end
|
224
241
|
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
def self.update_field(field, options)
|
242
|
-
raise ArgumentError, "unkown #{field} field for #{self}" unless @field_defs.key?(field)
|
243
|
-
|
244
|
-
@field_defs[field][1] = options.delete(:default) if options.key?(:default)
|
245
|
-
@field_defs[field][2] = options.delete(:builder) if options.key?(:builder)
|
246
|
-
@field_defs[field][3] = options.delete(:optional) if options.key?(:optional)
|
247
|
-
@field_defs[field][4] = options.delete(:enum) if options.key?(:enum)
|
248
|
-
@field_defs[field][5].merge!(options)
|
249
|
-
end
|
242
|
+
# Update a previously defined field
|
243
|
+
# @param [Symbol] field field name to create
|
244
|
+
# @param [Hash] options See {.define_field}.
|
245
|
+
# @return [void]
|
246
|
+
# @see .define_field
|
247
|
+
# @raise [ArgumentError] unknown +field+
|
248
|
+
# @since 2.8.4
|
249
|
+
def update_field(field, options)
|
250
|
+
raise ArgumentError, "unkown #{field} field for #{self}" unless @field_defs.key?(field)
|
251
|
+
|
252
|
+
@field_defs[field][1] = options.delete(:default) if options.key?(:default)
|
253
|
+
@field_defs[field][2] = options.delete(:builder) if options.key?(:builder)
|
254
|
+
@field_defs[field][3] = options.delete(:optional) if options.key?(:optional)
|
255
|
+
@field_defs[field][4] = options.delete(:enum) if options.key?(:enum)
|
256
|
+
@field_defs[field][5].merge!(options)
|
257
|
+
end
|
250
258
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
259
|
+
# Define a bitfield on given attribute
|
260
|
+
# class MyHeader < PacketGen::Types::Fields
|
261
|
+
# define_field :flags, Types::Int16
|
262
|
+
# # define a bit field on :flag attribute:
|
263
|
+
# # flag1, flag2 and flag3 are 1-bit fields
|
264
|
+
# # type and stype are 3-bit fields. reserved is a 6-bit field
|
265
|
+
# define_bit_fields_on :flags, :flag1, :flag2, :flag3, :type, 3, :stype, 3, :reserved, 7
|
266
|
+
# end
|
267
|
+
# A bitfield of size 1 bit defines 2 methods:
|
268
|
+
# * +#field?+ which returns a Boolean,
|
269
|
+
# * +#field=+ which takes and returns a Boolean.
|
270
|
+
# A bitfield of more bits defines 2 methods:
|
271
|
+
# * +#field+ which returns an Integer,
|
272
|
+
# * +#field=+ which takes and returns an Integer.
|
273
|
+
# @param [Symbol] attr attribute name (attribute should be a {Types::Int}
|
274
|
+
# subclass)
|
275
|
+
# @param [Array] args list of bitfield names. Name may be followed
|
276
|
+
# by bitfield size. If no size is given, 1 bit is assumed.
|
277
|
+
# @return [void]
|
278
|
+
def define_bit_fields_on(attr, *args)
|
279
|
+
attr_def = @field_defs[attr]
|
280
|
+
raise ArgumentError, "unknown #{attr} field" if attr_def.nil?
|
281
|
+
|
282
|
+
type = attr_def.first
|
283
|
+
unless type < Types::Int
|
284
|
+
raise TypeError, "#{attr} is not a PacketGen::Types::Int"
|
285
|
+
end
|
273
286
|
|
274
|
-
|
275
|
-
|
276
|
-
raise TypeError, "#{attr} is not a PacketGen::Types::Int"
|
277
|
-
end
|
287
|
+
total_size = type.new.width * 8
|
288
|
+
idx = total_size - 1
|
278
289
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
self[:#{attr}].value |= (v & #{2**size - 1}) << #{shift}
|
290
|
+
field = args.shift
|
291
|
+
while field
|
292
|
+
next unless field.is_a? Symbol
|
293
|
+
|
294
|
+
size = if args.first.is_a? Integer
|
295
|
+
args.shift
|
296
|
+
else
|
297
|
+
1
|
298
|
+
end
|
299
|
+
unless field == :_
|
300
|
+
shift = idx - (size - 1)
|
301
|
+
field_mask = (2**size - 1) << shift
|
302
|
+
clear_mask = (2**total_size - 1) & (~field_mask & (2**total_size - 1))
|
303
|
+
|
304
|
+
if size == 1
|
305
|
+
class_eval <<-METHODS
|
306
|
+
def #{field}?
|
307
|
+
val = (self[:#{attr}].to_i & #{field_mask}) >> #{shift}
|
308
|
+
val != 0
|
309
|
+
end
|
310
|
+
def #{field}=(v)
|
311
|
+
val = v ? 1 : 0
|
312
|
+
self[:#{attr}].value = self[:#{attr}].to_i & #{clear_mask}
|
313
|
+
self[:#{attr}].value |= val << #{shift}
|
314
|
+
end
|
315
|
+
METHODS
|
316
|
+
else
|
317
|
+
class_eval <<-METHODS
|
318
|
+
def #{field}
|
319
|
+
(self[:#{attr}].to_i & #{field_mask}) >> #{shift}
|
320
|
+
end
|
321
|
+
def #{field}=(v)
|
322
|
+
self[:#{attr}].value = self[:#{attr}].to_i & #{clear_mask}
|
323
|
+
self[:#{attr}].value |= (v & #{2**size - 1}) << #{shift}
|
324
|
+
end
|
325
|
+
METHODS
|
316
326
|
end
|
317
|
-
|
327
|
+
|
328
|
+
@bit_fields[attr] = {} if @bit_fields[attr].nil?
|
329
|
+
@bit_fields[attr][field] = size
|
318
330
|
end
|
319
331
|
|
320
|
-
|
321
|
-
|
332
|
+
idx -= size
|
333
|
+
field = args.shift
|
322
334
|
end
|
323
|
-
|
324
|
-
idx -= size
|
325
|
-
field = args.shift
|
326
335
|
end
|
327
|
-
end
|
328
336
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
337
|
+
# Remove all bit fields defined on +attr+
|
338
|
+
# @param [Symbol] attr attribute defining bit fields
|
339
|
+
# @return [void]
|
340
|
+
# @since 2.8.4
|
341
|
+
def remove_bit_fields_on(attr)
|
342
|
+
fields = @bit_fields.delete(attr)
|
343
|
+
return if fields.nil?
|
344
|
+
|
345
|
+
fields.each do |field, size|
|
346
|
+
undef_method "#{field}="
|
347
|
+
undef_method(size == 1 ? "#{field}?" : "#{field}")
|
348
|
+
end
|
340
349
|
end
|
341
350
|
end
|
342
351
|
|
@@ -405,7 +414,7 @@ module PacketGen
|
|
405
414
|
# Get all field names
|
406
415
|
# @return [Array<Symbol>]
|
407
416
|
def fields
|
408
|
-
|
417
|
+
self.class.fields
|
409
418
|
end
|
410
419
|
|
411
420
|
# Get all optional field name
|
@@ -435,6 +444,7 @@ module PacketGen
|
|
435
444
|
|
436
445
|
# Say if an optional field is present
|
437
446
|
# @return [Boolean]
|
447
|
+
# @deprecated Use {#present?} instead.
|
438
448
|
def is_present?(field)
|
439
449
|
Deprecation.deprecated(self.class, __method__, 'present?', klass_method: true)
|
440
450
|
present? field
|
@@ -507,7 +517,9 @@ module PacketGen
|
|
507
517
|
# @return [void]
|
508
518
|
# @raise [BodyError] no body on given object
|
509
519
|
# @raise [ArgumentError] cannot cram +body+ in +:body+ field
|
520
|
+
# @deprecated
|
510
521
|
def body=(value)
|
522
|
+
Deprecation.deprecated(self.class, __method__)
|
511
523
|
raise BodyError, 'no body field' unless @fields.key? :body
|
512
524
|
|
513
525
|
case body
|
@@ -525,6 +537,7 @@ module PacketGen
|
|
525
537
|
# Force str to binary encoding
|
526
538
|
# @param [String] str
|
527
539
|
# @return [String]
|
540
|
+
# @deprecated Will be a private method
|
528
541
|
def force_binary(str)
|
529
542
|
PacketGen.force_binary(str)
|
530
543
|
end
|
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: 2.8.
|
4
|
+
version: 2.8.5
|
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-10-
|
11
|
+
date: 2018-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: interfacez
|