packetgen 3.3.0 → 3.3.2

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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +7 -7
  4. data/lib/packetgen/capture.rb +2 -1
  5. data/lib/packetgen/config.rb +2 -1
  6. data/lib/packetgen/header/arp.rb +2 -1
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +4 -3
  9. data/lib/packetgen/header/bootp.rb +2 -1
  10. data/lib/packetgen/header/dhcp/option.rb +2 -1
  11. data/lib/packetgen/header/dhcp/options.rb +2 -1
  12. data/lib/packetgen/header/dhcp.rb +2 -1
  13. data/lib/packetgen/header/dhcpv6/duid.rb +2 -1
  14. data/lib/packetgen/header/dhcpv6/option.rb +2 -1
  15. data/lib/packetgen/header/dhcpv6/options.rb +2 -1
  16. data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
  17. data/lib/packetgen/header/dhcpv6.rb +2 -1
  18. data/lib/packetgen/header/dns/name.rb +2 -1
  19. data/lib/packetgen/header/dns/opt.rb +3 -2
  20. data/lib/packetgen/header/dns/option.rb +3 -2
  21. data/lib/packetgen/header/dns/qdsection.rb +2 -1
  22. data/lib/packetgen/header/dns/question.rb +2 -1
  23. data/lib/packetgen/header/dns/rr.rb +2 -1
  24. data/lib/packetgen/header/dns/rrsection.rb +2 -1
  25. data/lib/packetgen/header/dns.rb +3 -2
  26. data/lib/packetgen/header/dot11/control.rb +2 -1
  27. data/lib/packetgen/header/dot11/data.rb +4 -3
  28. data/lib/packetgen/header/dot11/element.rb +2 -1
  29. data/lib/packetgen/header/dot11/management.rb +2 -1
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +2 -1
  31. data/lib/packetgen/header/dot11.rb +2 -1
  32. data/lib/packetgen/header/dot1q.rb +2 -1
  33. data/lib/packetgen/header/dot1x.rb +2 -1
  34. data/lib/packetgen/header/eap/fast.rb +2 -1
  35. data/lib/packetgen/header/eap/md5.rb +2 -1
  36. data/lib/packetgen/header/eap/tls.rb +3 -2
  37. data/lib/packetgen/header/eap/ttls.rb +3 -2
  38. data/lib/packetgen/header/eap.rb +3 -2
  39. data/lib/packetgen/header/eth.rb +3 -2
  40. data/lib/packetgen/header/gre.rb +2 -1
  41. data/lib/packetgen/header/http/headers.rb +4 -3
  42. data/lib/packetgen/header/http/request.rb +2 -1
  43. data/lib/packetgen/header/http/response.rb +2 -1
  44. data/lib/packetgen/header/http/verbs.rb +2 -1
  45. data/lib/packetgen/header/http.rb +2 -1
  46. data/lib/packetgen/header/icmp.rb +2 -1
  47. data/lib/packetgen/header/icmpv6.rb +2 -1
  48. data/lib/packetgen/header/igmp.rb +2 -1
  49. data/lib/packetgen/header/igmpv3/group_record.rb +2 -1
  50. data/lib/packetgen/header/igmpv3/mq.rb +2 -1
  51. data/lib/packetgen/header/igmpv3/mr.rb +2 -1
  52. data/lib/packetgen/header/igmpv3.rb +2 -1
  53. data/lib/packetgen/header/ip/addr.rb +2 -1
  54. data/lib/packetgen/header/ip/option.rb +3 -2
  55. data/lib/packetgen/header/ip/options.rb +2 -1
  56. data/lib/packetgen/header/ip.rb +3 -2
  57. data/lib/packetgen/header/ipv6/addr.rb +2 -1
  58. data/lib/packetgen/header/ipv6/extension.rb +2 -1
  59. data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -1
  60. data/lib/packetgen/header/ipv6.rb +2 -1
  61. data/lib/packetgen/header/llc.rb +2 -1
  62. data/lib/packetgen/header/mdns.rb +2 -1
  63. data/lib/packetgen/header/mld.rb +2 -1
  64. data/lib/packetgen/header/mldv2/mcast_address_record.rb +2 -1
  65. data/lib/packetgen/header/mldv2/mlq.rb +2 -1
  66. data/lib/packetgen/header/mldv2/mlr.rb +2 -1
  67. data/lib/packetgen/header/mldv2.rb +2 -1
  68. data/lib/packetgen/header/ospfv2/db_description.rb +2 -1
  69. data/lib/packetgen/header/ospfv2/hello.rb +2 -1
  70. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -1
  71. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -1
  72. data/lib/packetgen/header/ospfv2/ls_update.rb +2 -1
  73. data/lib/packetgen/header/ospfv2/lsa.rb +2 -1
  74. data/lib/packetgen/header/ospfv2/lsa_header.rb +2 -1
  75. data/lib/packetgen/header/ospfv2.rb +2 -1
  76. data/lib/packetgen/header/ospfv3/db_description.rb +2 -1
  77. data/lib/packetgen/header/ospfv3/hello.rb +2 -1
  78. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +2 -1
  79. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -1
  80. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -1
  81. data/lib/packetgen/header/ospfv3/ls_update.rb +2 -1
  82. data/lib/packetgen/header/ospfv3/lsa.rb +2 -1
  83. data/lib/packetgen/header/ospfv3/lsa_header.rb +2 -1
  84. data/lib/packetgen/header/ospfv3.rb +2 -1
  85. data/lib/packetgen/header/sctp/chunk.rb +547 -0
  86. data/lib/packetgen/header/sctp/error.rb +347 -0
  87. data/lib/packetgen/header/sctp/padded32.rb +34 -0
  88. data/lib/packetgen/header/sctp/parameter.rb +229 -0
  89. data/lib/packetgen/header/sctp.rb +96 -0
  90. data/lib/packetgen/header/snmp.rb +3 -2
  91. data/lib/packetgen/header/tcp/option.rb +2 -1
  92. data/lib/packetgen/header/tcp/options.rb +2 -1
  93. data/lib/packetgen/header/tcp.rb +3 -2
  94. data/lib/packetgen/header/tftp.rb +2 -1
  95. data/lib/packetgen/header/udp.rb +2 -1
  96. data/lib/packetgen/header.rb +4 -2
  97. data/lib/packetgen/headerable.rb +2 -1
  98. data/lib/packetgen/inject.rb +2 -1
  99. data/lib/packetgen/inspect.rb +2 -1
  100. data/lib/packetgen/packet.rb +4 -3
  101. data/lib/packetgen/pcap.rb +2 -1
  102. data/lib/packetgen/pcapng/block.rb +3 -2
  103. data/lib/packetgen/pcapng/epb.rb +2 -1
  104. data/lib/packetgen/pcapng/file.rb +2 -1
  105. data/lib/packetgen/pcapng/idb.rb +2 -1
  106. data/lib/packetgen/pcapng/shb.rb +2 -1
  107. data/lib/packetgen/pcapng/spb.rb +2 -1
  108. data/lib/packetgen/pcapng/unknown_block.rb +2 -1
  109. data/lib/packetgen/pcapng.rb +2 -1
  110. data/lib/packetgen/pcaprub_wrapper.rb +2 -1
  111. data/lib/packetgen/proto.rb +2 -1
  112. data/lib/packetgen/types/abstract_tlv.rb +146 -56
  113. data/lib/packetgen/types/array.rb +20 -3
  114. data/lib/packetgen/types/cstring.rb +2 -1
  115. data/lib/packetgen/types/enum.rb +3 -2
  116. data/lib/packetgen/types/fieldable.rb +3 -2
  117. data/lib/packetgen/types/fields.rb +8 -7
  118. data/lib/packetgen/types/int.rb +114 -13
  119. data/lib/packetgen/types/int_string.rb +2 -1
  120. data/lib/packetgen/types/length_from.rb +2 -1
  121. data/lib/packetgen/types/oui.rb +2 -1
  122. data/lib/packetgen/types/string.rb +2 -1
  123. data/lib/packetgen/types/tlv.rb +2 -1
  124. data/lib/packetgen/types.rb +2 -1
  125. data/lib/packetgen/unknown_packet.rb +3 -2
  126. data/lib/packetgen/utils/arp_spoofer.rb +4 -3
  127. data/lib/packetgen/utils.rb +2 -1
  128. data/lib/packetgen/version.rb +3 -2
  129. data/lib/packetgen.rb +2 -1
  130. metadata +27 -16
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -60,65 +61,125 @@ module PacketGen
60
61
  class AbstractTLV < Types::Fields
61
62
  include Fieldable
62
63
 
64
+ # @private
65
+ FIELD_TYPES = { 'T' => :type, 'L' => :length, 'V' => :value }.freeze
66
+
63
67
  class << self
64
68
  # @return [Hash]
65
69
  attr_accessor :aliases
70
+ # @deprecated
66
71
  attr_accessor :header_in_length
67
- end
68
- self.aliases = {}
69
-
70
- # Generate a TLV class
71
- # @param [Class] type_class Class to use for +type+
72
- # @param [Class] length_class Class to use for +length+
73
- # @param [Class] value_class Class to use for +value+
74
- # @param [Boolean] header_in_length if +true +, +type+ and +length+ fields are
75
- # included in length
76
- # @return [Class]
77
- # @since 3.1.4 Add +header_in_length+ parameter
78
- def self.create(type_class: Int8Enum, length_class: Int8, value_class: String,
79
- aliases: {}, header_in_length: false)
80
- raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal? AbstractTLV
81
-
82
- klass = Class.new(self)
83
- klass.aliases = aliases
84
- klass.header_in_length = header_in_length
85
-
86
- if type_class < Enum
87
- klass.define_field :type, type_class, enum: {}
88
- else
89
- klass.define_field :type, type_class
90
- end
91
- klass.define_field :length, length_class
92
- klass.define_field :value, value_class
72
+ # @private
73
+ attr_accessor :field_in_length
74
+
75
+ # rubocop:disable Metrics/ParameterLists
93
76
 
94
- aliases.each do |al, orig|
95
- klass.instance_eval do
96
- alias_method al, orig if klass.method_defined?(orig)
97
- alias_method :"#{al}=", :"#{orig}=" if klass.method_defined?(:"#{orig}=")
77
+ # Generate a TLV class
78
+ # @param [Class] type_class Class to use for +type+
79
+ # @param [Class] length_class Class to use for +length+
80
+ # @param [Class] value_class Class to use for +value+
81
+ # @param [Boolean] header_in_length if +true +, +type+ and +length+ fields are
82
+ # included in length. Deprecated, use +field_in_length+ instead.
83
+ # @param [String] field_order give field order. Each character in [T,L,V] MUST be present once, in the desired order.
84
+ # @param [String] field_in_length give fields to compute length on.
85
+ # @return [Class]
86
+ # @since 3.1.4 Add +header_in_length+ parameter
87
+ # @since 3.3.1 Add +field_order+ and +field_in_length' parameters. Deprecate +header_in_length+ parameter.
88
+ def create(type_class: Int8Enum, length_class: Int8, value_class: String,
89
+ aliases: {}, header_in_length: false, field_order: 'TLV', field_in_length: 'V')
90
+ Deprecation.deprecated_option(self, 'create', 'header_in_length', klass_method: true) if header_in_length
91
+ raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal?(AbstractTLV)
92
+
93
+ klass = Class.new(self)
94
+ klass.aliases = aliases
95
+ klass.header_in_length = header_in_length
96
+ klass.field_in_length = field_in_length
97
+
98
+ check_field_in_length(field_in_length)
99
+ check_field_order(field_order)
100
+ generate_fields(klass, field_order, type_class, length_class, value_class)
101
+
102
+ aliases.each do |al, orig|
103
+ klass.instance_eval do
104
+ alias_method al, orig if klass.method_defined?(orig)
105
+ alias_method :"#{al}=", :"#{orig}=" if klass.method_defined?(:"#{orig}=")
106
+ end
98
107
  end
108
+
109
+ klass
110
+ end
111
+ # rubocop:enable Metrics/ParameterLists
112
+
113
+ # @!attribute type
114
+ # @abstract Type attribute for real TLV class
115
+ # @return [Integer]
116
+ # @!attribute length
117
+ # @abstract Length attribute for real TLV class
118
+ # @return [Integer]
119
+ # @!attribute value
120
+ # @abstract Value attribute for real TLV class
121
+ # @return [Object]
122
+
123
+ # @abstract Should only be called on real TLV classes, created by {.create}.
124
+ # Set enum hash for {#type} field.
125
+ # @param [Hash{String, Symbol => Integer}] hsh enum hash
126
+ # @return [void]
127
+ def define_type_enum(hsh)
128
+ field_defs[:type][:enum].clear
129
+ field_defs[:type][:enum].merge!(hsh)
130
+ end
131
+
132
+ # @abstract Should only be called on real TLV classes, created by {.create}.
133
+ # Set default value for {#type} field.
134
+ # @param [Integer,String,Symbol,nil] default default value from +hsh+ for type
135
+ # @return [void]
136
+ # @since 3.4.0
137
+ def define_type_default(default)
138
+ field_defs[:type][:default] = default
139
+ end
140
+
141
+ private
142
+
143
+ def check_field_in_length(field_in_length)
144
+ return if /^[TLV]{1,3}$/.match?(field_in_length)
145
+
146
+ raise 'field_in_length must only contain T, L and/or V characters'
147
+ end
148
+
149
+ def check_field_order(field_order)
150
+ return if field_order.match(/^[TLV]{3,3}$/) && (field_order[0] != field_order[1]) && (field_order[0] != field_order[2]) && (field_order[1] != field_order[2])
151
+
152
+ raise 'field_order must contain all three letters TLV, each once'
99
153
  end
100
154
 
101
- klass
155
+ def generate_fields(klass, field_order, type_class, length_class, value_class)
156
+ field_order.each_char do |field_type|
157
+ case field_type
158
+ when 'T'
159
+ if type_class < Enum
160
+ klass.define_field(:type, type_class, enum: {})
161
+ else
162
+ klass.define_field(:type, type_class)
163
+ end
164
+ when 'L'
165
+ klass.define_field(:length, length_class)
166
+ when 'V'
167
+ klass.define_field(:value, value_class)
168
+ end
169
+ end
170
+ end
102
171
  end
172
+
103
173
  # @!attribute type
104
- # @abstract Type attribute for real TLV class
174
+ # @abstract Type attribute
105
175
  # @return [Integer]
106
176
  # @!attribute length
107
- # @abstract Length attribute for real TLV class
177
+ # @abstract Length
108
178
  # @return [Integer]
109
179
  # @!attribute value
110
- # @abstract Value attribute for real TLV class
180
+ # @abstract Value attribute
111
181
  # @return [Object]
112
182
 
113
- # @abstract Should only be called on real TLV classes, created by {.create}.
114
- # Set enum hash for {#type} field.
115
- # @param [Hash] hsh enum hash
116
- # @return [void]
117
- def self.define_type_enum(hsh)
118
- field_defs[:type][:enum].clear
119
- field_defs[:type][:enum].merge!(hsh)
120
- end
121
-
122
183
  # @abstract Should only be called on real TLV classes, created by {.create}.
123
184
  # @param [Hash] options
124
185
  # @option options [Integer] :type
@@ -126,6 +187,7 @@ module PacketGen
126
187
  # @option options [Object] :value
127
188
  def initialize(options={})
128
189
  @header_in_length = self.class.header_in_length
190
+ @field_in_length = self.class.field_in_length
129
191
  self.class.aliases.each do |al, orig|
130
192
  options[orig] = options[al] if options.key?(al)
131
193
  end
@@ -133,30 +195,41 @@ module PacketGen
133
195
  super
134
196
  # used #value= defined below, which set length if needed
135
197
  self.value = options[:value] if options[:value]
198
+ calc_length unless options.key?(:length)
136
199
  end
137
200
 
138
201
  # @abstract Should only be called on real TLV class instances.
139
202
  # Populate object from a binary string
140
- # @param [String] str
203
+ # @param [String,nil] str
141
204
  # @return [Fields] self
142
205
  def read(str)
206
+ return self if str.nil?
207
+
143
208
  idx = 0
144
- self[:type].read str[idx, self[:type].sz]
145
- idx += self[:type].sz
146
- self[:length].read str[idx, self[:length].sz]
147
- idx += self[:length].sz
148
- self[:value].read str[idx, real_length]
209
+ fields.each do |field_name|
210
+ field = self[field_name]
211
+ length = field_name == :value ? real_length : field.sz
212
+ field.read(str[idx, length])
213
+ idx += field.sz
214
+ end
215
+
149
216
  self
150
217
  end
151
218
 
152
219
  # @abstract Should only be called on real TLV class instances.
153
220
  # Set +value+. May set +length+ if value is a {Types::String}.
154
- # @param [::String,Integer] val
155
- # @return [::String,Integer]
221
+ # @param [Object] val
222
+ # @return [Object]
223
+ # @since 3.4.0 Base on field's +#from_human+ method
156
224
  def value=(val)
157
- self[:value].from_human val
158
- self.length = self[:value].sz
159
- self.length += self[:type].sz + self[:length].sz if @header_in_length
225
+ if val.is_a?(self[:value].class)
226
+ self[:value] = val
227
+ elsif self[:value].respond_to?(:from_human)
228
+ self[:value].from_human(val)
229
+ else
230
+ self[:value].read(val)
231
+ end
232
+ calc_length
160
233
  val
161
234
  end
162
235
 
@@ -174,13 +247,30 @@ module PacketGen
174
247
  'type:%s,length:%u,value:%s' % [human_type, length, my_value]
175
248
  end
176
249
 
250
+ # Calculate length
251
+ # @return [void]
252
+ # @since 3.4.0
253
+ def calc_length
254
+ fil = @field_in_length
255
+ fil = 'TLV' if @header_in_length
256
+
257
+ length = 0
258
+ fil.each_char do |field_type|
259
+ length += self[FIELD_TYPES[field_type]].sz
260
+ end
261
+ self.length = length
262
+ end
263
+
177
264
  private
178
265
 
179
266
  def real_length
180
267
  if @header_in_length
181
268
  self.length - self[:type].sz - self[:length].sz
182
269
  else
183
- self.length
270
+ length = self.length
271
+ length -= self[:type].sz if @field_in_length.include?('T')
272
+ length -= self[:length].sz if @field_in_length.include?('L')
273
+ length
184
274
  end
185
275
  end
186
276
  end
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  require 'forwardable'
@@ -225,8 +226,8 @@ module PacketGen
225
226
  klass == obj_klass ? obj : klass.new(hsh)
226
227
  end
227
228
 
228
- def real_type(obj)
229
- obj.class
229
+ def real_type(_obj)
230
+ self.class.set_of_klass
230
231
  end
231
232
 
232
233
  def create_object_from_str(str)
@@ -242,28 +243,44 @@ module PacketGen
242
243
  end
243
244
  end
244
245
 
246
+ # @private
247
+ module ArrayOfIntMixin
248
+ def read_from_array(ary)
249
+ return self if ary.empty?
250
+
251
+ ary.each do |i|
252
+ self << self.class.set_of_klass.new(i)
253
+ end
254
+ end
255
+ end
256
+
245
257
  # Specialized array to handle serie of {Int8}.
246
258
  class ArrayOfInt8 < Array
259
+ include ArrayOfIntMixin
247
260
  set_of Int8
248
261
  end
249
262
 
250
263
  # Specialized array to handle serie of {Int16}.
251
264
  class ArrayOfInt16 < Array
265
+ include ArrayOfIntMixin
252
266
  set_of Int16
253
267
  end
254
268
 
255
269
  # Specialized array to handle serie of {Int16le}.
256
270
  class ArrayOfInt16le < Array
271
+ include ArrayOfIntMixin
257
272
  set_of Int16le
258
273
  end
259
274
 
260
275
  # Specialized array to handle serie of {Int32}.
261
276
  class ArrayOfInt32 < Types::Array
277
+ include ArrayOfIntMixin
262
278
  set_of Types::Int32
263
279
  end
264
280
 
265
281
  # Specialized array to handle serie of {Int32le}.
266
282
  class ArrayOfInt32le < Types::Array
283
+ include ArrayOfIntMixin
267
284
  set_of Types::Int32le
268
285
  end
269
286
  end
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  require 'forwardable'
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -14,7 +15,7 @@ module PacketGen
14
15
  # and named values.
15
16
  #
16
17
  # == Simple example
17
- # enum = Int8Enum.new(0, 'low' => 0, 'medium' => 1, 'high' => 2})
18
+ # enum = Int8Enum.new('low' => 0, 'medium' => 1, 'high' => 2})
18
19
  # In this example, +enum+ is a 8-bit field which may take one
19
20
  # among three values: +low+, +medium+ or +high+:
20
21
  # enum.value = 'high'
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -55,7 +56,7 @@ module PacketGen
55
56
 
56
57
  # rubocop:enable Lint/UselessMethodDefinition
57
58
 
58
- # Format object when inspecting a {Field} object
59
+ # Format object when inspecting a {Fields} object
59
60
  # @return [String]
60
61
  def format_inspect
61
62
  to_human
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  # rubocop:disable Metrics/ClassLength
@@ -236,7 +237,7 @@ module PacketGen
236
237
  fields.delete name
237
238
  @field_defs.delete name
238
239
  undef_method name if method_defined?(name)
239
- undef_method "#{name}=" if method_defined?("#{name}=")
240
+ undef_method :"#{name}=" if method_defined?(:"#{name}=")
240
241
  end
241
242
 
242
243
  # Update a previously defined field
@@ -309,7 +310,7 @@ module PacketGen
309
310
  return if fields.nil?
310
311
 
311
312
  fields.each do |field, size|
312
- undef_method "#{field}="
313
+ undef_method :"#{field}="
313
314
  undef_method(size == 1 ? "#{field}?" : field)
314
315
  end
315
316
  end
@@ -332,7 +333,7 @@ module PacketGen
332
333
  # rubocop:enable Layout/LineContinuationLeadingSpace
333
334
  end
334
335
 
335
- define.delete_at(1) if instance_methods.include? "#{name}=".to_sym
336
+ define.delete_at(1) if instance_methods.include?(:"#{name}=")
336
337
  define.delete_at(0) if instance_methods.include? name
337
338
  class_eval define.join("\n")
338
339
  end
@@ -393,7 +394,7 @@ module PacketGen
393
394
  end
394
395
 
395
396
  def field_defs_property_from(field, property, options)
396
- field_defs[field].send("#{property}=", options.delete(property)) if options.key?(property)
397
+ field_defs[field].send(:"#{property}=", options.delete(property)) if options.key?(property)
397
398
  end
398
399
 
399
400
  def size_from(args)
@@ -422,9 +423,9 @@ module PacketGen
422
423
  initialize_optional field
423
424
  end
424
425
 
425
- self.class.bit_fields.each do |_, hsh|
426
+ self.class.bit_fields.each_value do |hsh|
426
427
  hsh.each_key do |bit_field|
427
- self.send "#{bit_field}=", options[bit_field] if options[bit_field]
428
+ self.send(:"#{bit_field}=", options[bit_field]) if options[bit_field]
428
429
  end
429
430
  end
430
431
  end
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -11,6 +12,7 @@ module PacketGen
11
12
  # Base integer class to handle binary integers
12
13
  # @abstract
13
14
  # @author Sylvain Daubert
15
+ # @since 3.3.1 support native endianess
14
16
  class Int
15
17
  include Fieldable
16
18
 
@@ -18,7 +20,8 @@ module PacketGen
18
20
  # @return [Integer]
19
21
  attr_accessor :value
20
22
  # Integer endianness
21
- # @return [:little,:big]
23
+ # @return [:little,:big,:native]
24
+ # @since 3.3.1 add :native
22
25
  attr_accessor :endian
23
26
  # Integer size, in bytes
24
27
  # @return [Integer]
@@ -128,10 +131,10 @@ module PacketGen
128
131
  # @author Sylvain Daubert
129
132
  class Int16 < Int
130
133
  # @param [Integer,nil] value
131
- # @param [:big, :little] endian
134
+ # @param [:big, :little, :native] endian
132
135
  def initialize(value=nil, endian=:big)
133
136
  super(value, endian, 2)
134
- @packstr = { big: 'n', little: 'v' }
137
+ @packstr = { big: 'n', little: 'v', native: 'S' }
135
138
  end
136
139
  end
137
140
 
@@ -153,6 +156,19 @@ module PacketGen
153
156
  end
154
157
  end
155
158
 
159
+ # native endian 2-byte unsigned integer
160
+ # @author Sylvain Daubert
161
+ # @since 3.3.1
162
+ class Int16n < Int16
163
+ # @param [Integer,nil] value
164
+ undef endian=
165
+
166
+ # @param [Integer, nil] value
167
+ def initialize(value=nil)
168
+ super(value, :native)
169
+ end
170
+ end
171
+
156
172
  # 2-byte signed integer
157
173
  # @author Sylvain Daubert
158
174
  # @since 2.8.2
@@ -161,7 +177,7 @@ module PacketGen
161
177
  # @param [:big, :little] endian
162
178
  def initialize(value=nil, endian=:big)
163
179
  super
164
- @packstr = { big: 's>', little: 's<' }
180
+ @packstr = { big: 's>', little: 's<', native: 's' }
165
181
  end
166
182
  end
167
183
 
@@ -185,13 +201,33 @@ module PacketGen
185
201
  end
186
202
  end
187
203
 
204
+ # native endian 2-byte signed integer
205
+ # @author Sylvain Daubert
206
+ # @since 3.3.1
207
+ class SInt16n < SInt16
208
+ # @param [Integer,nil] value
209
+ undef endian=
210
+
211
+ # @param [Integer, nil] value
212
+ def initialize(value=nil)
213
+ super(value, :native)
214
+ end
215
+ end
216
+
188
217
  # 3-byte unsigned integer
189
218
  # @author Sylvain Daubert
190
219
  # @since 2.1.4
191
220
  class Int24 < Int
192
221
  # @param [Integer,nil] value
193
- # @param [:big, :little] endian
222
+ # @param [:big, :little, :native] endian
194
223
  def initialize(value=nil, endian=:big)
224
+ if endian == :native
225
+ endian = if [1].pack('S').unpack1('n') == 1
226
+ :big
227
+ else
228
+ :little
229
+ end
230
+ end
195
231
  super(value, endian, 3)
196
232
  end
197
233
 
@@ -247,14 +283,27 @@ module PacketGen
247
283
  end
248
284
  end
249
285
 
286
+ # native endian 3-byte unsigned integer
287
+ # @author Sylvain Daubert
288
+ # @since 3.3.1
289
+ class Int24n < Int24
290
+ # @param [Integer,nil] value
291
+ undef endian=
292
+
293
+ # @param [Integer, nil] value
294
+ def initialize(value=nil)
295
+ super(value, :native)
296
+ end
297
+ end
298
+
250
299
  # 4-byte unsigned integer
251
300
  # @author Sylvain Daubert
252
301
  class Int32 < Int
253
302
  # @param [Integer,nil] value
254
- # @param [:big, :little] endian
303
+ # @param [:big, :little, :native] endian
255
304
  def initialize(value=nil, endian=:big)
256
305
  super(value, endian, 4)
257
- @packstr = { big: 'N', little: 'V' }
306
+ @packstr = { big: 'N', little: 'V', native: 'L' }
258
307
  end
259
308
  end
260
309
 
@@ -276,6 +325,19 @@ module PacketGen
276
325
  end
277
326
  end
278
327
 
328
+ # native endian 4-byte unsigned integer
329
+ # @author Sylvain Daubert
330
+ # @since 3.3.1
331
+ class Int32n < Int32
332
+ # @param [Integer,nil] value
333
+ undef endian=
334
+
335
+ # @param [Integer, nil] value
336
+ def initialize(value=nil)
337
+ super(value, :native)
338
+ end
339
+ end
340
+
279
341
  # 4-byte unsigned integer
280
342
  # @author Sylvain Daubert
281
343
  # @since 2.8.2
@@ -284,7 +346,7 @@ module PacketGen
284
346
  # @param [:big, :little] endian
285
347
  def initialize(value=nil, endian=:big)
286
348
  super
287
- @packstr = { big: 'l>', little: 'l<' }
349
+ @packstr = { big: 'l>', little: 'l<', native: 'l' }
288
350
  end
289
351
  end
290
352
 
@@ -308,14 +370,27 @@ module PacketGen
308
370
  end
309
371
  end
310
372
 
373
+ # native endian 4-byte unsigned integer
374
+ # @author Sylvain Daubert
375
+ # @since 3.3.1
376
+ class SInt32n < SInt32
377
+ # @param [Integer,nil] value
378
+ undef endian=
379
+
380
+ # @param [Integer, nil] value
381
+ def initialize(value=nil)
382
+ super(value, :native)
383
+ end
384
+ end
385
+
311
386
  # 8-byte unsigned integer
312
387
  # @author Sylvain Daubert
313
388
  class Int64 < Int
314
389
  # @param [Integer,nil] value
315
- # @param [:big, :little] endian
390
+ # @param [:big, :little, :native] endian
316
391
  def initialize(value=nil, endian=:big)
317
392
  super(value, endian, 8)
318
- @packstr = { big: 'Q>', little: 'Q<' }
393
+ @packstr = { big: 'Q>', little: 'Q<', native: 'Q' }
319
394
  end
320
395
  end
321
396
 
@@ -337,15 +412,28 @@ module PacketGen
337
412
  end
338
413
  end
339
414
 
415
+ # native endian 8-byte unsigned integer
416
+ # @author Sylvain Daubert
417
+ # @since 3.3.1
418
+ class Int64n < Int64
419
+ # @param [Integer,nil] value
420
+ undef endian=
421
+
422
+ # @param [Integer, nil] value
423
+ def initialize(value=nil)
424
+ super(value, :native)
425
+ end
426
+ end
427
+
340
428
  # 8-byte unsigned integer
341
429
  # @author Sylvain Daubert
342
430
  # @since 2.8.2
343
431
  class SInt64 < Int64
344
432
  # @param [Integer,nil] value
345
- # @param [:big, :little] endian
433
+ # @param [:big, :little, :native] endian
346
434
  def initialize(value=nil, endian=:big)
347
435
  super
348
- @packstr = { big: 'q>', little: 'q<' }
436
+ @packstr = { big: 'q>', little: 'q<', native: 'q' }
349
437
  end
350
438
  end
351
439
 
@@ -368,5 +456,18 @@ module PacketGen
368
456
  super(value, :little)
369
457
  end
370
458
  end
459
+
460
+ # native endian 8-byte unsigned integer
461
+ # @author Sylvain Daubert
462
+ # @since 3.3.1
463
+ class SInt64n < SInt64
464
+ # @param [Integer,nil] value
465
+ undef endian=
466
+
467
+ # @param [Integer, nil] value
468
+ def initialize(value=nil)
469
+ super(value, :native)
470
+ end
471
+ end
371
472
  end
372
473
  end