packetgen 3.3.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -21
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +7 -7
  6. data/lib/packetgen/header/arp.rb +13 -13
  7. data/lib/packetgen/header/asn1_base.rb +1 -1
  8. data/lib/packetgen/header/base.rb +17 -18
  9. data/lib/packetgen/header/bootp.rb +32 -34
  10. data/lib/packetgen/header/dhcp/option.rb +19 -19
  11. data/lib/packetgen/header/dhcp/options.rb +1 -1
  12. data/lib/packetgen/header/dhcp.rb +3 -3
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +53 -53
  15. data/lib/packetgen/header/dhcpv6/options.rb +1 -1
  16. data/lib/packetgen/header/dhcpv6/relay.rb +5 -5
  17. data/lib/packetgen/header/dhcpv6.rb +6 -6
  18. data/lib/packetgen/header/dns/name.rb +14 -10
  19. data/lib/packetgen/header/dns/opt.rb +2 -2
  20. data/lib/packetgen/header/dns/option.rb +11 -11
  21. data/lib/packetgen/header/dns/qdsection.rb +1 -1
  22. data/lib/packetgen/header/dns/question.rb +6 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +4 -4
  25. data/lib/packetgen/header/dns.rb +27 -30
  26. data/lib/packetgen/header/dot11/control.rb +11 -11
  27. data/lib/packetgen/header/dot11/data.rb +20 -20
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +8 -8
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +39 -53
  31. data/lib/packetgen/header/dot11.rb +88 -93
  32. data/lib/packetgen/header/dot1q.rb +10 -12
  33. data/lib/packetgen/header/dot1x.rb +9 -9
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +6 -6
  36. data/lib/packetgen/header/eap/tls.rb +13 -15
  37. data/lib/packetgen/header/eap/ttls.rb +13 -15
  38. data/lib/packetgen/header/eap.rb +22 -22
  39. data/lib/packetgen/header/eth.rb +18 -18
  40. data/lib/packetgen/header/gre.rb +8 -10
  41. data/lib/packetgen/header/http/headers.rb +2 -2
  42. data/lib/packetgen/header/http/request.rb +17 -16
  43. data/lib/packetgen/header/http/response.rb +18 -17
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +8 -8
  46. data/lib/packetgen/header/icmpv6.rb +3 -3
  47. data/lib/packetgen/header/igmp.rb +8 -8
  48. data/lib/packetgen/header/igmpv3/group_record.rb +12 -12
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +4 -4
  51. data/lib/packetgen/header/igmpv3.rb +7 -7
  52. data/lib/packetgen/header/ip/addr.rb +13 -13
  53. data/lib/packetgen/header/ip/option.rb +31 -33
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +37 -72
  56. data/lib/packetgen/header/ipv6/addr.rb +14 -14
  57. data/lib/packetgen/header/ipv6/extension.rb +8 -8
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +9 -9
  59. data/lib/packetgen/header/ipv6.rb +20 -22
  60. data/lib/packetgen/header/llc.rb +17 -17
  61. data/lib/packetgen/header/mdns.rb +1 -1
  62. data/lib/packetgen/header/mld.rb +6 -6
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +11 -11
  64. data/lib/packetgen/header/mldv2/mlq.rb +21 -23
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/ospfv2/db_description.rb +11 -12
  67. data/lib/packetgen/header/ospfv2/hello.rb +11 -11
  68. data/lib/packetgen/header/ospfv2/ls_ack.rb +1 -1
  69. data/lib/packetgen/header/ospfv2/ls_request.rb +9 -9
  70. data/lib/packetgen/header/ospfv2/ls_update.rb +3 -3
  71. data/lib/packetgen/header/ospfv2/lsa.rb +54 -58
  72. data/lib/packetgen/header/ospfv2/lsa_header.rb +9 -9
  73. data/lib/packetgen/header/ospfv2.rb +27 -29
  74. data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
  75. data/lib/packetgen/header/ospfv3/hello.rb +12 -12
  76. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +17 -19
  77. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -2
  78. data/lib/packetgen/header/ospfv3/ls_request.rb +9 -9
  79. data/lib/packetgen/header/ospfv3/ls_update.rb +4 -4
  80. data/lib/packetgen/header/ospfv3/lsa.rb +48 -51
  81. data/lib/packetgen/header/ospfv3/lsa_header.rb +9 -9
  82. data/lib/packetgen/header/ospfv3.rb +25 -27
  83. data/lib/packetgen/header/sctp/chunk.rb +44 -41
  84. data/lib/packetgen/header/sctp/error.rb +52 -52
  85. data/lib/packetgen/header/sctp/parameter.rb +38 -38
  86. data/lib/packetgen/header/sctp.rb +5 -5
  87. data/lib/packetgen/header/snmp.rb +2 -2
  88. data/lib/packetgen/header/tcp/option.rb +45 -39
  89. data/lib/packetgen/header/tcp/options.rb +2 -2
  90. data/lib/packetgen/header/tcp.rb +55 -44
  91. data/lib/packetgen/header/tftp.rb +16 -16
  92. data/lib/packetgen/header/udp.rb +8 -8
  93. data/lib/packetgen/header.rb +9 -10
  94. data/lib/packetgen/headerable.rb +13 -3
  95. data/lib/packetgen/inspect.rb +2 -2
  96. data/lib/packetgen/packet.rb +54 -37
  97. data/lib/packetgen/pcap.rb +15 -4
  98. data/lib/packetgen/pcapng/block.rb +18 -17
  99. data/lib/packetgen/pcapng/epb.rb +13 -15
  100. data/lib/packetgen/pcapng/file.rb +3 -97
  101. data/lib/packetgen/pcapng/idb.rb +9 -11
  102. data/lib/packetgen/pcapng/shb.rb +13 -15
  103. data/lib/packetgen/pcapng/spb.rb +8 -10
  104. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  105. data/lib/packetgen/pcapng.rb +4 -4
  106. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  107. data/lib/packetgen/proto.rb +1 -1
  108. data/lib/packetgen/unknown_packet.rb +2 -2
  109. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  110. data/lib/packetgen/utils.rb +2 -2
  111. data/lib/packetgen/version.rb +1 -1
  112. data/lib/packetgen.rb +4 -3
  113. metadata +34 -29
  114. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  115. data/lib/packetgen/types/array.rb +0 -287
  116. data/lib/packetgen/types/cstring.rb +0 -109
  117. data/lib/packetgen/types/enum.rb +0 -171
  118. data/lib/packetgen/types/fieldable.rb +0 -66
  119. data/lib/packetgen/types/fields.rb +0 -622
  120. data/lib/packetgen/types/int.rb +0 -473
  121. data/lib/packetgen/types/int_string.rb +0 -102
  122. data/lib/packetgen/types/length_from.rb +0 -54
  123. data/lib/packetgen/types/oui.rb +0 -52
  124. data/lib/packetgen/types/string.rb +0 -97
  125. data/lib/packetgen/types/tlv.rb +0 -161
  126. data/lib/packetgen/types.rb +0 -26
@@ -11,19 +11,55 @@ module PacketGen
11
11
  class DNS
12
12
  # DNS Ressource Record
13
13
  # @author Sylvain Daubert
14
+ # @author LemonTree55
14
15
  class RR < Question
15
16
  # @!attribute ttl
16
17
  # 32-bit time to live
17
18
  # @return [Integer]
18
- define_field :ttl, Types::Int32
19
+ define_attr :ttl, BinStruct::Int32
19
20
  # @!attribute rdlength
20
21
  # 16-bit {#rdata} length
21
22
  # @return [Integer]
22
- define_field :rdlength, Types::Int16
23
+ define_attr :rdlength, BinStruct::Int16
23
24
  # @!attribute rdata
24
- # @return [Types::String]
25
- define_field :rdata, Types::String,
26
- builder: ->(rr, t) { t.new(length_from: rr[:rdlength]) }
25
+ # @return [BinStruct::String]
26
+ define_attr :rdata, BinStruct::String,
27
+ builder: ->(rr, t) { t.new(length_from: rr[:rdlength]) }
28
+
29
+ # @private RData struct
30
+ class RData < BinStruct::Struct
31
+ attr_accessor :dns
32
+
33
+ def initialize(options={})
34
+ @dns = options.delete(:dns)
35
+ super
36
+ end
37
+ end
38
+
39
+ # @private MX struct
40
+ class MX < RData
41
+ define_attr :pref, BinStruct::Int16
42
+ define_attr :exchange, Name, builder: ->(h, t) { t.new(dns: h.dns) }
43
+ end
44
+
45
+ # @private SOA struct
46
+ class SOA < RData
47
+ define_attr :mname, Name, builder: ->(h, t) { t.new(dns: h.dns) }
48
+ define_attr :rname, Name, builder: ->(h, t) { t.new(dns: h.dns) }
49
+ define_attr :serial, BinStruct::Int32
50
+ define_attr :refresh, BinStruct::Int32
51
+ define_attr :retryi, BinStruct::Int32
52
+ define_attr :expire, BinStruct::Int32
53
+ define_attr :minimum, BinStruct::Int32
54
+ end
55
+
56
+ # @private SRV struct
57
+ class SRV < RData
58
+ define_attr :priority, BinStruct::Int16
59
+ define_attr :weight, BinStruct::Int16
60
+ define_attr :port, BinStruct::Int16
61
+ define_attr :target, Name, builder: ->(h, t) { t.new(dns: h.dns) }
62
+ end
27
63
 
28
64
  # @param [DNS] dns
29
65
  # @param [Hash] options
@@ -47,8 +83,8 @@ module PacketGen
47
83
  # @param [String] data
48
84
  # @return [void]
49
85
  def rdata=(data)
50
- self[:rdlength].read data.size
51
- self[:rdata].read data
86
+ self[:rdlength].from_human(data.size)
87
+ self[:rdata].read(data)
52
88
  end
53
89
 
54
90
  # rubocop:disable Metrics/AbcSize
@@ -60,8 +96,7 @@ module PacketGen
60
96
 
61
97
  case type
62
98
  when TYPES['NS'], TYPES['PTR'], TYPES['CNAME']
63
- name = Name.new
64
- name.dns = self[:name].dns
99
+ name = Name.new(dns: self[:name].dns)
65
100
  str = name.read(self[:rdata]).to_human
66
101
  when TYPES['SOA']
67
102
  str = human_soa_rdata
@@ -78,9 +113,9 @@ module PacketGen
78
113
  # Get human readable class
79
114
  # @return [String]
80
115
  def human_rrclass
81
- if self[:name].dns.is_a? MDNS
116
+ if self[:name].dns.is_a?(MDNS)
82
117
  str = self.class::CLASSES.key(self.rrclass & 0x7fff) || '0x%04x' % (self.rrclass & 0x7fff)
83
- str += ' CACHE-FLUSH' if (self.rrclass & 0x8000).positive?
118
+ str += ' CACHE-FLUSH' if self.rrclass.anybits?(0x8000)
84
119
  str
85
120
  else
86
121
  self.class::CLASSES.key(self.rrclass) || '0x%04x' % self.rrclass
@@ -100,49 +135,27 @@ module PacketGen
100
135
 
101
136
  case type
102
137
  when TYPES['A'], TYPES['AAAA']
103
- IPAddr.new_ntoh(self[:rdata]).to_s
138
+ IPAddr.new_ntoh(self[:rdata].string).to_s
104
139
  end
105
140
  end
106
141
 
107
142
  def human_mx_data
108
- name = Name.new
109
- name.dns = self[:name].dns
110
-
111
- pref = Types::Int16.new.read(self[:rdata][0, 2])
112
- exchange = name.read(self[:rdata][2..]).to_human
113
-
114
- '%u %s' % [pref.to_i, exchange]
143
+ mx = MX.new(dns: self[:name].dns).read(self[:rdata])
144
+ "#{mx.pref} #{mx.exchange}"
115
145
  end
116
146
 
117
- # rubocop:disable Metrics/AbcSize
147
+ # /rubocop:disable Metrics/AbcSize
118
148
  def human_soa_rdata
119
- name = Name.new
120
- name.dns = self[:name].dns
121
- mname = name.read(self[:rdata]).dup
122
- rname = name.read(self[:rdata][mname.sz..])
123
-
124
- serial = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz, 4])
125
- refresh = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 4, 4])
126
- retryi = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 8, 4])
127
- expire = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 12, 4])
128
- minimum = Types::Int32.new.read(self[:rdata][mname.sz + rname.sz + 16, 4])
129
-
130
- "#{mname.to_human} #{rname.to_human} #{serial.to_i} #{refresh.to_i} " \
131
- "#{retryi.to_i} #{expire.to_i} #{minimum.to_i}"
149
+ soa = SOA.new(dns: self[:name].dns).read(self[:rdata])
150
+
151
+ "#{soa.mname} #{soa.rname} #{soa.serial} #{soa.refresh} " \
152
+ "#{soa.retryi} #{soa.expire} #{soa.minimum}"
132
153
  end
133
154
 
134
155
  def human_srv_data
135
- name = Name.new
136
- name.dns = self[:name].dns
137
-
138
- priority = Types::Int16.new.read(self[:rdata][0, 2])
139
- weight = Types::Int16.new.read(self[:rdata][2, 2])
140
- port = Types::Int16.new.read(self[:rdata][4, 2])
141
- target = name.read(self[:rdata][6, self[:rdata].size]).to_human
142
-
143
- "#{priority.to_i} #{weight.to_i} #{port.to_i} #{target}"
156
+ srv = SRV.new(dns: self[:name].dns).read(self[:rdata])
157
+ "#{srv.priority} #{srv.weight} #{srv.port} #{srv.target}"
144
158
  end
145
- # rubocop:enable Metrics/AbcSize
146
159
  end
147
160
  end
148
161
  end
@@ -11,10 +11,10 @@ module PacketGen
11
11
  class DNS
12
12
  # Define a DNS Ressource Record Section
13
13
  # @author Sylvain Daubert
14
- class RRSection < Types::Array
14
+ class RRSection < BinStruct::Array
15
15
  # @api private
16
16
  # @param [DNS] dns
17
- # @param [Types::Int] counter
17
+ # @param [BinStruct::Int] counter
18
18
  def initialize(dns, counter)
19
19
  super(counter: counter)
20
20
  @dns = dns
@@ -32,7 +32,7 @@ module PacketGen
32
32
  rr = RR.new(@dns).read(str)
33
33
  rr = OPT.new(@dns).read(str) if rr.type?('OPT')
34
34
  str.slice!(0, rr.sz)
35
- push rr
35
+ push(rr)
36
36
  end
37
37
  self
38
38
  end
@@ -40,7 +40,7 @@ module PacketGen
40
40
  private
41
41
 
42
42
  def record_from_hash(hsh)
43
- if hsh.key? :rtype
43
+ if hsh.key?(:rtype)
44
44
  case hsh.delete(:rtype)
45
45
  when 'Question'
46
46
  Question.new(@dns, hsh)
@@ -141,35 +141,9 @@ module PacketGen
141
141
 
142
142
  # @!attribute id
143
143
  # @return [Integer]
144
- define_field :id, Types::Int16
144
+ define_attr :id, BinStruct::Int16
145
145
  # @!attribute u16
146
146
  # @return [Integer]
147
- define_field :u16, Types::Int16
148
- # @!attribute qdcount
149
- # @return [Integer]
150
- define_field :qdcount, Types::Int16
151
- # @!attribute ancount
152
- # @return [Integer]
153
- define_field :ancount, Types::Int16
154
- # @!attribute nscount
155
- # @return [Integer]
156
- define_field :nscount, Types::Int16
157
- # @!attribute arcount
158
- # @return [Integer]
159
- define_field :arcount, Types::Int16
160
- # @!attribute qd
161
- # @return [QDSection]
162
- define_field :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
163
- # @!attribute an
164
- # @return [RRSection]
165
- define_field :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
166
- # @!attribute ns
167
- # @return [RRSection]
168
- define_field :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
169
- # @!attribute ar
170
- # @return [RRSection]
171
- define_field :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
172
-
173
147
  # @!attribute qr
174
148
  # @return [Boolean] query (+false+) or response (+true+)
175
149
  # @!attribute opcode
@@ -188,11 +162,34 @@ module PacketGen
188
162
  # @return [Boolean] Checking Disabled
189
163
  # @!attribute rcode
190
164
  # @return [Integer] Response code. See {RCODES}.
191
- define_bit_fields_on :u16, :qr, :opcode, 4, :aa, :tc, :rd, :ra, :z,
192
- :ad, :cd, :rcode, 4
193
-
165
+ define_bit_attr :u16, qr: 1, opcode: 4, aa: 1, tc: 1, rd: 1, ra: 1, z: 1, ad: 1, cd: 1, rcode: 4
194
166
  undef opcode=, rcode=
195
167
 
168
+ # @!attribute qdcount
169
+ # @return [Integer]
170
+ define_attr :qdcount, BinStruct::Int16
171
+ # @!attribute ancount
172
+ # @return [Integer]
173
+ define_attr :ancount, BinStruct::Int16
174
+ # @!attribute nscount
175
+ # @return [Integer]
176
+ define_attr :nscount, BinStruct::Int16
177
+ # @!attribute arcount
178
+ # @return [Integer]
179
+ define_attr :arcount, BinStruct::Int16
180
+ # @!attribute qd
181
+ # @return [QDSection]
182
+ define_attr :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
183
+ # @!attribute an
184
+ # @return [RRSection]
185
+ define_attr :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
186
+ # @!attribute ns
187
+ # @return [RRSection]
188
+ define_attr :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
189
+ # @!attribute ar
190
+ # @return [RRSection]
191
+ define_attr :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
192
+
196
193
  # Set opcode
197
194
  # @param [Integer,String] value
198
195
  # @return [Integer]
@@ -16,12 +16,12 @@ module PacketGen
16
16
  # (control frame).
17
17
  #
18
18
  # A IEEE 802.11 control header consists of:
19
- # * a {#frame_ctrl} ({Types::Int16}),
20
- # * a {#id}/duration ({Types::Int16le}),
19
+ # * a {#frame_ctrl} ({BinStruct::Int16}),
20
+ # * a {#id}/duration ({BinStruct::Int16le}),
21
21
  # * a {#mac1} ({Eth::MacAddr}).
22
22
  # * sometimes a {#mac2} ({Eth::MacAddr}),
23
- # * a {#body} (a {Types::String} or another {Base} class),
24
- # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
23
+ # * a {#body} (a {BinStruct::String} or another {Base} class),
24
+ # * and a Frame check sequence ({#fcs}, of type {BinStruct::Int32le}).
25
25
  # @author Sylvain Daubert
26
26
  class Control < Dot11
27
27
  # Control subtypes
@@ -44,8 +44,8 @@ module PacketGen
44
44
  # @see Base#initialize
45
45
  def initialize(options={})
46
46
  super({ type: 1 }.merge!(options))
47
- @applicable_fields -= %i[mac3 sequence_ctrl mac4 qos_ctrl ht_ctrl]
48
- define_applicable_fields
47
+ @applicable_attributes -= %i[mac3 sequence_ctrl mac4 qos_ctrl ht_ctrl]
48
+ define_applicable_attributes
49
49
  end
50
50
 
51
51
  # Get human readable subtype
@@ -56,12 +56,12 @@ module PacketGen
56
56
 
57
57
  private
58
58
 
59
- def define_applicable_fields
59
+ def define_applicable_attributes
60
60
  super
61
- if @applicable_fields.include? :mac2
62
- @applicable_fields -= %i[mac2] unless SUBTYPES_WITH_MAC2.include? self.subtype
63
- elsif SUBTYPES_WITH_MAC2.include? self.subtype
64
- @applicable_fields[3, 0] = :mac2
61
+ if @applicable_attributes.include?(:mac2)
62
+ @applicable_attributes -= %i[mac2] unless SUBTYPES_WITH_MAC2.include?(self.subtype)
63
+ elsif SUBTYPES_WITH_MAC2.include?(self.subtype)
64
+ @applicable_attributes[3, 0] = :mac2
65
65
  end
66
66
  end
67
67
  end
@@ -16,23 +16,23 @@ module PacketGen
16
16
  # (data frame).
17
17
  #
18
18
  # A IEEE 802.11 data header consists of:
19
- # * a {#frame_ctrl} ({Types::Int16}),
20
- # * a {#id}/duration ({Types::Int16le}),
19
+ # * a {#frame_ctrl} ({BinStruct::Int16}),
20
+ # * a {#id}/duration ({BinStruct::Int16le}),
21
21
  # * a {#mac2} ({Eth::MacAddr}),
22
22
  # * a {#mac3} ({Eth::MacAddr}),
23
- # * a {#sequence_ctrl} ({Types::Int16}),
23
+ # * a {#sequence_ctrl} ({BinStruct::Int16}),
24
24
  # * sometimes a {#mac4} ({Eth::MacAddr}),
25
- # * sometimes a {#qos_ctrl} ({Types::Int16}),
26
- # * a {#body} (a {Types::String} or another {Base} class),
27
- # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
25
+ # * sometimes a {#qos_ctrl} ({BinStruct::Int16}),
26
+ # * a {#body} (a {BinStruct::String} or another {Base} class),
27
+ # * and a Frame check sequence ({#fcs}, of type {BinStruct::Int32le}).
28
28
  # @author Sylvain Daubert
29
29
  class Data < Dot11
30
30
  # @param [Hash] options
31
31
  # @see Base#initialize
32
32
  def initialize(options={})
33
33
  super({ type: 2 }.merge!(options))
34
- @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
35
- define_applicable_fields
34
+ @applicable_attributes -= %i[mac4 qos_ctrl ht_ctrl]
35
+ define_applicable_attributes
36
36
  end
37
37
 
38
38
  # Invert source and destination addresses (see Table 8-19 from
@@ -45,22 +45,22 @@ module PacketGen
45
45
  case ds
46
46
  when 0
47
47
  # MAC1: RA/DA, MAC2: TA/SA
48
- invert_mac :mac1, :mac2
48
+ invert_mac(:mac1, :mac2)
49
49
  when 1
50
50
  # MAC1: RA/BSSID, MAC2: TA/SA, MAC3: DA
51
- invert_mac :mac1, :mac2
51
+ invert_mac(:mac1, :mac2)
52
52
  self.to_ds = false
53
53
  self.from_ds = true
54
54
  when 2
55
55
  # MAC1: RA/DA, MAC2: BSSID, MAC3: SA or BSSID
56
- invert_mac :mac1, :mac2
56
+ invert_mac(:mac1, :mac2)
57
57
  self.to_ds = true
58
58
  self.from_ds = false
59
59
  when 3
60
60
  # MAC1: RA, MAC2: TA
61
- invert_mac :mac1, :mac2
61
+ invert_mac(:mac1, :mac2)
62
62
  # MAC3: DA, MAC4: SA
63
- invert_mac :mac3, :mac4
63
+ invert_mac(:mac3, :mac4)
64
64
  end
65
65
  self
66
66
  end
@@ -111,19 +111,19 @@ module PacketGen
111
111
  end
112
112
  end
113
113
 
114
- def define_applicable_fields
114
+ def define_applicable_attributes
115
115
  super
116
- if (subtype >= 8) && !@applicable_fields.include?(:qos_ctrl)
116
+ if (subtype >= 8) && !@applicable_attributes.include?(:qos_ctrl)
117
117
  # Insert after mac4, if present
118
118
  # else insert after sequence_ctrl
119
- if @applicable_fields.include? :mac4
120
- idx = @applicable_fields.index(:mac4)
121
- @applicable_fields[idx, 0] = :qos_ctrl
119
+ if @applicable_attributes.include? :mac4
120
+ idx = @applicable_attributes.index(:mac4)
121
+ @applicable_attributes[idx, 0] = :qos_ctrl
122
122
  else
123
- @applicable_fields[6, 0] = :qos_ctrl
123
+ @applicable_attributes[6, 0] = :qos_ctrl
124
124
  end
125
125
  elsif subtype < 8
126
- @applicable_fields -= %i[qos_ctrl]
126
+ @applicable_attributes -= %i[qos_ctrl]
127
127
  end
128
128
  end
129
129
 
@@ -15,10 +15,10 @@ module PacketGen
15
15
  # #
16
16
  # # An {Element} is a piece of data contained in a Dot11 management frame.
17
17
  # # @since 1.4.0
18
- # # @since 3.1.0 subclass of {Types::AbstractTLV}
19
- # class Element < Types::AbstractTLV; end
18
+ # # @since 3.1.0 subclass of {BinStruct::AbstractTLV}
19
+ # class Element < BinStruct::AbstractTLV; end
20
20
  # @private
21
- Element = Types::AbstractTLV.create
21
+ Element = BinStruct::AbstractTLV.create
22
22
 
23
23
  class Element
24
24
  # Known element types
@@ -44,7 +44,7 @@ module PacketGen
44
44
 
45
45
  # Array of {Element}.
46
46
  # @since 3.1.1
47
- class ArrayOfElements < Types::Array
47
+ class ArrayOfElements < BinStruct::Array
48
48
  set_of Element
49
49
  end
50
50
  end
@@ -16,14 +16,14 @@ module PacketGen
16
16
  # (management frame).
17
17
  #
18
18
  # A IEEE 802.11 management header consists of:
19
- # * a {#frame_ctrl} ({Types::Int16}),
20
- # * a {#id}/duration ({Types::Int16le}),
19
+ # * a {#frame_ctrl} ({BinStruct::Int16}),
20
+ # * a {#id}/duration ({BinStruct::Int16le}),
21
21
  # * a {#mac1} ({Eth::MacAddr}).
22
22
  # * a {#mac2} ({Eth::MacAddr}),
23
23
  # * a {#mac3} ({Eth::MacAddr}),
24
- # * a {#sequence_ctrl} ({Types::Int16}),
25
- # * a {#body} (a {Types::String} or another {Base} class),
26
- # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
24
+ # * a {#sequence_ctrl} ({BinStruct::Int16}),
25
+ # * a {#body} (a {BinStruct::String} or another {Base} class),
26
+ # * and a Frame check sequence ({#fcs}, of type {BinStruct::Int32le}).
27
27
  #
28
28
  # Management frames should be constructed with more headers from
29
29
  # {SubMngt} subclasses.
@@ -44,8 +44,8 @@ module PacketGen
44
44
  # @see Base#initialize
45
45
  def initialize(options={})
46
46
  super({ type: 0 }.merge!(options))
47
- @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
48
- define_applicable_fields
47
+ @applicable_attributes -= %i[mac4 qos_ctrl ht_ctrl]
48
+ define_applicable_attributes
49
49
  end
50
50
 
51
51
  # Add an {Element}
@@ -54,7 +54,7 @@ module PacketGen
54
54
  # @return [self]
55
55
  # @since 2.1.3
56
56
  def add_element(type:, value:)
57
- raise FormatError, 'Before adding an Element, you have to add a Dot11::SubMngt subclass instance' unless self[:body].is_a? SubMngt
57
+ raise FormatError, 'Before adding an Element, you have to add a Dot11::SubMngt subclass instance' unless self[:body].is_a?(SubMngt)
58
58
 
59
59
  self[:body].elements << { type: type, value: value }
60
60
  self
@@ -20,21 +20,7 @@ module PacketGen
20
20
  # @author Sylvain Daubert
21
21
  class SubMngt < Base
22
22
  # @return [Array<Element>]
23
- define_field :elements, ArrayOfElements
24
-
25
- # Add an {Element} to header
26
- # @param [Integer,String] type element type
27
- # @param [Object] value element value
28
- # @return [self]
29
- # @since 2.1.3
30
- # @since 3.1.1 #elements in no more an Array but an {ArrayOfElements}
31
- # @deprecated Prefer use of +submngt.element << {type: type, value: value}+
32
- def add_element(type:, value:)
33
- Deprecation.deprecated(self.class, __method__, 'elements')
34
- element = Element.new(type: type, value: value)
35
- self.elements << element
36
- self
37
- end
23
+ define_attr :elements, ArrayOfElements
38
24
  end
39
25
 
40
26
  # IEEE 802.11 Association Request frame
@@ -42,16 +28,16 @@ module PacketGen
42
28
  # Specialize {Dot11::Management} with +subtype+ set to 0.
43
29
  #
44
30
  # Add fields:
45
- # * {#cap} ({Types::Int16le}),
46
- # * {#listen_interval} ({Types::Int16le}).
31
+ # * {#cap} ({BinStruct::Int16le}),
32
+ # * {#listen_interval} ({BinStruct::Int16le}).
47
33
  # @author Sylvain Daubert
48
34
  class AssoReq < SubMngt
49
35
  # @!attribute cap
50
36
  # @return [Integer] 16-bit capabillities word
51
- define_field_before :elements, :cap, Types::Int16le
37
+ define_attr_before :elements, :cap, BinStruct::Int16le
52
38
  # @!attribute listen_interval
53
39
  # @return [Integer] 16-bit listen interval value
54
- define_field_before :elements, :listen_interval, Types::Int16le, default: 0x00c8
40
+ define_attr_before :elements, :listen_interval, BinStruct::Int16le, default: 0x00c8
55
41
  end
56
42
  Header.add_class AssoReq
57
43
  Management.bind AssoReq, type: 0, subtype: 0
@@ -61,20 +47,20 @@ module PacketGen
61
47
  # Specialize {Dot11::Management} with +subtype+ set to 1.
62
48
  #
63
49
  # Add fields:
64
- # * {#cap} ({Types::Int16le}),
65
- # * {#status} ({Types::Int16le}),
66
- # * {#aid} ({Types::Int16le}).
50
+ # * {#cap} ({BinStruct::Int16le}),
51
+ # * {#status} ({BinStruct::Int16le}),
52
+ # * {#aid} ({BinStruct::Int16le}).
67
53
  # @author Sylvain Daubert
68
54
  class AssoResp < SubMngt
69
55
  # @!attribute cap
70
56
  # @return [Integer] 16-bit capabillities word
71
- define_field_before :elements, :cap, Types::Int16le
57
+ define_attr_before :elements, :cap, BinStruct::Int16le
72
58
  # @!attribute status
73
59
  # @return [Integer] 16-bit status word
74
- define_field_before :elements, :status, Types::Int16le
60
+ define_attr_before :elements, :status, BinStruct::Int16le
75
61
  # @!attribute aid
76
62
  # @return [Integer] 16-bit AID word
77
- define_field_before :elements, :aid, Types::Int16le
63
+ define_attr_before :elements, :aid, BinStruct::Int16le
78
64
  end
79
65
  Header.add_class AssoResp
80
66
  Management.bind AssoResp, type: 0, subtype: 1
@@ -84,14 +70,14 @@ module PacketGen
84
70
  # Specialize {Dot11::Management} with +subtype+ set to 2.
85
71
  #
86
72
  # Add fields:
87
- # * {#cap} ({Types::Int16le}),
88
- # * {#listen_interval} ({Types::Int16le}),
73
+ # * {#cap} ({BinStruct::Int16le}),
74
+ # * {#listen_interval} ({BinStruct::Int16le}),
89
75
  # * {#current_ap} ({Eth::MacAddr}).
90
76
  # @author Sylvain Daubert
91
77
  class ReAssoReq < AssoReq
92
78
  # @!attribute current_ap
93
79
  # @return [Eth::MAcAddr]
94
- define_field_before :elements, :current_ap, Eth::MacAddr
80
+ define_attr_before :elements, :current_ap, Eth::MacAddr
95
81
  end
96
82
  Header.add_class ReAssoReq
97
83
  Management.bind ReAssoReq, type: 0, subtype: 2
@@ -101,9 +87,9 @@ module PacketGen
101
87
  # Specialize {Dot11::Management} with +subtype+ set to 3.
102
88
  #
103
89
  # Add fields:
104
- # * {#cap} ({Types::Int16le}),
105
- # * {#status} ({Types::Int16le}),
106
- # * {#aid} ({Types::Int16le}).
90
+ # * {#cap} ({BinStruct::Int16le}),
91
+ # * {#status} ({BinStruct::Int16le}),
92
+ # * {#aid} ({BinStruct::Int16le}).
107
93
  # @author Sylvain Daubert
108
94
  class ReAssoResp < AssoResp
109
95
  end
@@ -126,20 +112,20 @@ module PacketGen
126
112
  # Specialize {Dot11::Management} with +subtype+ set to 5.
127
113
  #
128
114
  # Add fields:
129
- # * {#timestamp} ({Types::Int64le}),
130
- # * {#beacon_interval} ({Types::Int16le}),
131
- # * {#cap} ({Types::Int16le}).
115
+ # * {#timestamp} ({BinStruct::Int64le}),
116
+ # * {#beacon_interval} ({BinStruct::Int16le}),
117
+ # * {#cap} ({BinStruct::Int16le}).
132
118
  # @author Sylvain Daubert
133
119
  class ProbeResp < SubMngt
134
120
  # @!attribute timestamp
135
121
  # @return [Integer] 64-bit timestamp
136
- define_field_before :elements, :timestamp, Types::Int64le
122
+ define_attr_before :elements, :timestamp, BinStruct::Int64le
137
123
  # @!attribute beacon_interval
138
124
  # @return [Integer] 16-bit beacon interval value
139
- define_field_before :elements, :beacon_interval, Types::Int16le, default: 0x0064
125
+ define_attr_before :elements, :beacon_interval, BinStruct::Int16le, default: 0x0064
140
126
  # @!attribute cap
141
127
  # @return [Integer] 16-bit capabillities word
142
- define_field_before :elements, :cap, Types::Int16le
128
+ define_attr_before :elements, :cap, BinStruct::Int16le
143
129
  end
144
130
  Header.add_class ProbeResp
145
131
  Management.bind ProbeResp, type: 0, subtype: 5
@@ -149,20 +135,20 @@ module PacketGen
149
135
  # Specialize {Dot11::Management} with +subtype+ set to 8.
150
136
  #
151
137
  # Add fields:
152
- # * {#timestamp} ({Types::Int64le}),
153
- # * {#interval} ({Types::Int16le}),
154
- # * {#cap} ({Types::Int16le}).
138
+ # * {#timestamp} ({BinStruct::Int64le}),
139
+ # * {#interval} ({BinStruct::Int16le}),
140
+ # * {#cap} ({BinStruct::Int16le}).
155
141
  # @author Sylvain Daubert
156
142
  class Beacon < SubMngt
157
143
  # @!attribute timestamp
158
144
  # @return [Integer] 64-bit timestamp
159
- define_field_before :elements, :timestamp, Types::Int64le
145
+ define_attr_before :elements, :timestamp, BinStruct::Int64le
160
146
  # @!attribute interval
161
147
  # @return [Integer] 16-bit interval value
162
- define_field_before :elements, :interval, Types::Int16le, default: 0x64
148
+ define_attr_before :elements, :interval, BinStruct::Int16le, default: 0x64
163
149
  # @!attribute cap
164
150
  # @return [Integer] 16-bit capabillities word
165
- define_field_before :elements, :cap, Types::Int16le
151
+ define_attr_before :elements, :cap, BinStruct::Int16le
166
152
  end
167
153
  Header.add_class Beacon
168
154
  Management.bind Beacon, type: 0, subtype: 8
@@ -182,12 +168,12 @@ module PacketGen
182
168
  # Specialize {Dot11::Management} with +subtype+ set to 10.
183
169
  #
184
170
  # Add fields:
185
- # * {#reason} ({Types::Int16le}).
171
+ # * {#reason} ({BinStruct::Int16le}).
186
172
  # @author Sylvain Daubert
187
173
  class Disas < SubMngt
188
174
  # @!attribute reason
189
175
  # @return [Integer] 16-bit reason value
190
- define_field_before :elements, :reason, Types::Int16le
176
+ define_attr_before :elements, :reason, BinStruct::Int16le
191
177
  end
192
178
  Header.add_class Disas
193
179
  Management.bind Disas, type: 0, subtype: 10
@@ -197,20 +183,20 @@ module PacketGen
197
183
  # Specialize {Dot11::Management} with +subtype+ set to 11.
198
184
  #
199
185
  # Add fields:
200
- # * {#algo} ({Types::Int16le}),
201
- # * {#seqnum} ({Types::Int16le}),
202
- # * {#status} ({Types::Int16le}).
186
+ # * {#algo} ({BinStruct::Int16le}),
187
+ # * {#seqnum} ({BinStruct::Int16le}),
188
+ # * {#status} ({BinStruct::Int16le}).
203
189
  # @author Sylvain Daubert
204
190
  class Auth < SubMngt
205
191
  # @!attribute algo
206
192
  # @return [Integer] 16-bit algo value
207
- define_field_before :elements, :algo, Types::Int16le
193
+ define_attr_before :elements, :algo, BinStruct::Int16le
208
194
  # @!attribute seqnum
209
195
  # @return [Integer] 16-bit seqnum value
210
- define_field_before :elements, :seqnum, Types::Int16le
196
+ define_attr_before :elements, :seqnum, BinStruct::Int16le
211
197
  # @!attribute status
212
198
  # @return [Integer] 16-bit status word
213
- define_field_before :elements, :status, Types::Int16le
199
+ define_attr_before :elements, :status, BinStruct::Int16le
214
200
  end
215
201
  Header.add_class Auth
216
202
  Management.bind Auth, type: 0, subtype: 11
@@ -220,12 +206,12 @@ module PacketGen
220
206
  # Specialize {Dot11::Management} with +subtype+ set to 12.
221
207
  #
222
208
  # Add fields:
223
- # * {#reason} ({Types::Int16le}).
209
+ # * {#reason} ({BinStruct::Int16le}).
224
210
  # @author Sylvain Daubert
225
211
  class DeAuth < SubMngt
226
212
  # @!attribute reason
227
213
  # @return [Integer] 16-bit reason value
228
- define_field_before :elements, :reason, Types::Int16le
214
+ define_attr_before :elements, :reason, BinStruct::Int16le
229
215
  end
230
216
  Header.add_class DeAuth
231
217
  Management.bind DeAuth, type: 0, subtype: 12