packetgen 3.3.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -22
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +14 -8
  6. data/lib/packetgen/header/arp.rb +17 -18
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +42 -40
  9. data/lib/packetgen/header/bootp.rb +35 -37
  10. data/lib/packetgen/header/dhcp/option.rb +21 -21
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +8 -9
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +83 -61
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
  17. data/lib/packetgen/header/dhcpv6.rb +17 -18
  18. data/lib/packetgen/header/dns/name.rb +21 -16
  19. data/lib/packetgen/header/dns/opt.rb +5 -2
  20. data/lib/packetgen/header/dns/option.rb +14 -14
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +7 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +6 -6
  25. data/lib/packetgen/header/dns.rb +103 -90
  26. data/lib/packetgen/header/dot11/control.rb +12 -12
  27. data/lib/packetgen/header/dot11/data.rb +25 -24
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +21 -18
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
  31. data/lib/packetgen/header/dot11.rb +117 -122
  32. data/lib/packetgen/header/dot1q.rb +12 -13
  33. data/lib/packetgen/header/dot1x.rb +13 -13
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +16 -8
  36. data/lib/packetgen/header/eap/tls.rb +18 -19
  37. data/lib/packetgen/header/eap/ttls.rb +22 -21
  38. data/lib/packetgen/header/eap.rb +73 -48
  39. data/lib/packetgen/header/eth.rb +41 -27
  40. data/lib/packetgen/header/gre.rb +33 -11
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +38 -29
  43. data/lib/packetgen/header/http/response.rb +35 -27
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +14 -14
  46. data/lib/packetgen/header/icmpv6.rb +10 -9
  47. data/lib/packetgen/header/igmp.rb +26 -15
  48. data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +5 -5
  51. data/lib/packetgen/header/igmpv3.rb +12 -11
  52. data/lib/packetgen/header/ip/addr.rb +19 -15
  53. data/lib/packetgen/header/ip/option.rb +47 -36
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +77 -95
  56. data/lib/packetgen/header/ipv6/addr.rb +28 -27
  57. data/lib/packetgen/header/ipv6/extension.rb +13 -11
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
  59. data/lib/packetgen/header/ipv6.rb +42 -35
  60. data/lib/packetgen/header/llc.rb +28 -21
  61. data/lib/packetgen/header/mdns.rb +10 -3
  62. data/lib/packetgen/header/mld.rb +15 -13
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
  64. data/lib/packetgen/header/mldv2/mlq.rb +22 -24
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/mldv2.rb +1 -1
  67. data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
  68. data/lib/packetgen/header/ospfv2/hello.rb +18 -17
  69. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  70. data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
  71. data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
  72. data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
  73. data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
  74. data/lib/packetgen/header/ospfv2.rb +49 -46
  75. data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
  76. data/lib/packetgen/header/ospfv3/hello.rb +17 -16
  77. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
  78. data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
  79. data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
  80. data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
  81. data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
  82. data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
  83. data/lib/packetgen/header/ospfv3.rb +54 -52
  84. data/lib/packetgen/header/sctp/chunk.rb +80 -56
  85. data/lib/packetgen/header/sctp/error.rb +174 -202
  86. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  87. data/lib/packetgen/header/sctp/parameter.rb +89 -136
  88. data/lib/packetgen/header/sctp.rb +19 -8
  89. data/lib/packetgen/header/snmp.rb +108 -7
  90. data/lib/packetgen/header/tcp/option.rb +52 -39
  91. data/lib/packetgen/header/tcp/options.rb +13 -5
  92. data/lib/packetgen/header/tcp.rb +83 -65
  93. data/lib/packetgen/header/tftp.rb +31 -25
  94. data/lib/packetgen/header/udp.rb +21 -19
  95. data/lib/packetgen/header.rb +23 -18
  96. data/lib/packetgen/headerable.rb +21 -5
  97. data/lib/packetgen/inspect.rb +3 -8
  98. data/lib/packetgen/packet.rb +146 -71
  99. data/lib/packetgen/pcap.rb +15 -4
  100. data/lib/packetgen/pcapng/block.rb +20 -18
  101. data/lib/packetgen/pcapng/epb.rb +13 -15
  102. data/lib/packetgen/pcapng/file.rb +44 -111
  103. data/lib/packetgen/pcapng/idb.rb +11 -12
  104. data/lib/packetgen/pcapng/shb.rb +15 -16
  105. data/lib/packetgen/pcapng/spb.rb +9 -11
  106. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  107. data/lib/packetgen/pcapng.rb +6 -4
  108. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  109. data/lib/packetgen/proto.rb +5 -1
  110. data/lib/packetgen/unknown_packet.rb +5 -5
  111. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  112. data/lib/packetgen/utils.rb +4 -3
  113. data/lib/packetgen/version.rb +1 -1
  114. data/lib/packetgen.rb +12 -5
  115. metadata +29 -38
  116. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  117. data/lib/packetgen/types/array.rb +0 -287
  118. data/lib/packetgen/types/cstring.rb +0 -109
  119. data/lib/packetgen/types/enum.rb +0 -171
  120. data/lib/packetgen/types/fieldable.rb +0 -66
  121. data/lib/packetgen/types/fields.rb +0 -622
  122. data/lib/packetgen/types/int.rb +0 -473
  123. data/lib/packetgen/types/int_string.rb +0 -102
  124. data/lib/packetgen/types/length_from.rb +0 -54
  125. data/lib/packetgen/types/oui.rb +0 -52
  126. data/lib/packetgen/types/string.rb +0 -97
  127. data/lib/packetgen/types/tlv.rb +0 -161
  128. data/lib/packetgen/types.rb +0 -26
@@ -16,45 +16,48 @@ 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 {Headerable} 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
- # {SubMngt} subclasses.
29
+ # {SubMngt} subclasses. Some frames also need to have {Element}.
30
30
  #
31
- # By example, build a {DeAuth} frame:
31
+ # @example Build a {DeAuth} frame:
32
32
  # PacketGen.gen('Dot11::Management').add('Dot11::DeAuth')
33
33
  #
34
- # Some frames need to have {Element}. By example a {Beacon} frame:
35
- # pkt = PacketGen.gen('Dot11::Management', mac1: broadcast, mac2: bssid, mac3: bssid).
36
- # add('Dot11::Beacon')
37
- # pkt.dot11_beacon.add_elements(type: 'SSID', value: ssid)
38
- # pkt.dot11_beacon.add_elements(type: 'Rates', value: "\x82\x84\x8b\x96\x12\x24\x48\x6c")
39
- # pkt.dot11_beacon.add_elements(type: 'DSset', value: "\x06")
40
- # pkt.dot11_beacon.add_elements(type: 'TIM', value: "\x00\x01\x00\x00")
34
+ # @example a {Beacon} frame with elements:
35
+ # bssid = '00:01:02:03:04:05'
36
+ # pkt = PacketGen.gen('Dot11::Management', mac1: 'ff:ff:ff:ff:ff:ff', mac2: bssid, mac3: bssid)
37
+ # .add('Dot11::Beacon')
38
+ # # Directly add elements to Beacon
39
+ # pkt.dot11_beacon.elements << { type: 'SSID', value: "SSIDSSID" }
40
+ # pkt.dot11_beacon.elements << { type: 'Rates', value: "\x82\x84\x8b\x96\x12\x24\x48\x6c" }
41
+ # # Add elements to beacon through management header
42
+ # pkt.dot11_management.add_element(type: 'DSset', value: "\x06")
43
+ # pkt.dot11_management.add_element(type: 'TIM', value: "\x00\x01\x00\x00")
41
44
  # @author Sylvain Daubert
42
45
  class Management < Dot11
43
46
  # @param [Hash] options
44
47
  # @see Base#initialize
45
48
  def initialize(options={})
46
49
  super({ type: 0 }.merge!(options))
47
- @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
48
- define_applicable_fields
50
+ @applicable_attributes -= %i[mac4 qos_ctrl ht_ctrl]
51
+ define_applicable_attributes
49
52
  end
50
53
 
51
- # Add an {Element}
54
+ # Add an {Element} to header in body (for example, a {Dot11::Beacon})
52
55
  # @param [Integer,String] type element type
53
56
  # @param [Object] value element value
54
57
  # @return [self]
55
58
  # @since 2.1.3
56
59
  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
60
+ raise FormatError, 'Before adding an Element, you have to add a Dot11::SubMngt subclass instance' unless self[:body].is_a?(SubMngt)
58
61
 
59
62
  self[:body].elements << { type: type, value: value }
60
63
  self
@@ -19,22 +19,9 @@ module PacketGen
19
19
  # may be accessed through {#elements}.
20
20
  # @author Sylvain Daubert
21
21
  class SubMngt < Base
22
+ # Elements of submngt header
22
23
  # @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
24
+ define_attr :elements, ArrayOfElements
38
25
  end
39
26
 
40
27
  # IEEE 802.11 Association Request frame
@@ -42,16 +29,16 @@ module PacketGen
42
29
  # Specialize {Dot11::Management} with +subtype+ set to 0.
43
30
  #
44
31
  # Add fields:
45
- # * {#cap} ({Types::Int16le}),
46
- # * {#listen_interval} ({Types::Int16le}).
32
+ # * {#cap} (+BinStruct::Int16le+),
33
+ # * {#listen_interval} (+BinStruct::Int16le+).
47
34
  # @author Sylvain Daubert
48
35
  class AssoReq < SubMngt
49
36
  # @!attribute cap
50
37
  # @return [Integer] 16-bit capabillities word
51
- define_field_before :elements, :cap, Types::Int16le
38
+ define_attr_before :elements, :cap, BinStruct::Int16le
52
39
  # @!attribute listen_interval
53
40
  # @return [Integer] 16-bit listen interval value
54
- define_field_before :elements, :listen_interval, Types::Int16le, default: 0x00c8
41
+ define_attr_before :elements, :listen_interval, BinStruct::Int16le, default: 0x00c8
55
42
  end
56
43
  Header.add_class AssoReq
57
44
  Management.bind AssoReq, type: 0, subtype: 0
@@ -61,20 +48,20 @@ module PacketGen
61
48
  # Specialize {Dot11::Management} with +subtype+ set to 1.
62
49
  #
63
50
  # Add fields:
64
- # * {#cap} ({Types::Int16le}),
65
- # * {#status} ({Types::Int16le}),
66
- # * {#aid} ({Types::Int16le}).
51
+ # * {#cap} (+BinStruct::Int16le+),
52
+ # * {#status} (+BinStruct::Int16le+),
53
+ # * {#aid} (+BinStruct::Int16le+).
67
54
  # @author Sylvain Daubert
68
55
  class AssoResp < SubMngt
69
56
  # @!attribute cap
70
57
  # @return [Integer] 16-bit capabillities word
71
- define_field_before :elements, :cap, Types::Int16le
58
+ define_attr_before :elements, :cap, BinStruct::Int16le
72
59
  # @!attribute status
73
60
  # @return [Integer] 16-bit status word
74
- define_field_before :elements, :status, Types::Int16le
61
+ define_attr_before :elements, :status, BinStruct::Int16le
75
62
  # @!attribute aid
76
63
  # @return [Integer] 16-bit AID word
77
- define_field_before :elements, :aid, Types::Int16le
64
+ define_attr_before :elements, :aid, BinStruct::Int16le
78
65
  end
79
66
  Header.add_class AssoResp
80
67
  Management.bind AssoResp, type: 0, subtype: 1
@@ -84,14 +71,14 @@ module PacketGen
84
71
  # Specialize {Dot11::Management} with +subtype+ set to 2.
85
72
  #
86
73
  # Add fields:
87
- # * {#cap} ({Types::Int16le}),
88
- # * {#listen_interval} ({Types::Int16le}),
74
+ # * {#cap} (+BinStruct::Int16le+),
75
+ # * {#listen_interval} (+BinStruct::Int16le+),
89
76
  # * {#current_ap} ({Eth::MacAddr}).
90
77
  # @author Sylvain Daubert
91
78
  class ReAssoReq < AssoReq
92
79
  # @!attribute current_ap
93
80
  # @return [Eth::MAcAddr]
94
- define_field_before :elements, :current_ap, Eth::MacAddr
81
+ define_attr_before :elements, :current_ap, Eth::MacAddr
95
82
  end
96
83
  Header.add_class ReAssoReq
97
84
  Management.bind ReAssoReq, type: 0, subtype: 2
@@ -101,9 +88,9 @@ module PacketGen
101
88
  # Specialize {Dot11::Management} with +subtype+ set to 3.
102
89
  #
103
90
  # Add fields:
104
- # * {#cap} ({Types::Int16le}),
105
- # * {#status} ({Types::Int16le}),
106
- # * {#aid} ({Types::Int16le}).
91
+ # * {#cap} (+BinStruct::Int16le+),
92
+ # * {#status} (+BinStruct::Int16le+),
93
+ # * {#aid} (+BinStruct::Int16le+).
107
94
  # @author Sylvain Daubert
108
95
  class ReAssoResp < AssoResp
109
96
  end
@@ -126,20 +113,20 @@ module PacketGen
126
113
  # Specialize {Dot11::Management} with +subtype+ set to 5.
127
114
  #
128
115
  # Add fields:
129
- # * {#timestamp} ({Types::Int64le}),
130
- # * {#beacon_interval} ({Types::Int16le}),
131
- # * {#cap} ({Types::Int16le}).
116
+ # * {#timestamp} (+BinStruct::Int64le+),
117
+ # * {#beacon_interval} (+BinStruct::Int16le+),
118
+ # * {#cap} (+BinStruct::Int16le+).
132
119
  # @author Sylvain Daubert
133
120
  class ProbeResp < SubMngt
134
121
  # @!attribute timestamp
135
122
  # @return [Integer] 64-bit timestamp
136
- define_field_before :elements, :timestamp, Types::Int64le
123
+ define_attr_before :elements, :timestamp, BinStruct::Int64le
137
124
  # @!attribute beacon_interval
138
125
  # @return [Integer] 16-bit beacon interval value
139
- define_field_before :elements, :beacon_interval, Types::Int16le, default: 0x0064
126
+ define_attr_before :elements, :beacon_interval, BinStruct::Int16le, default: 0x0064
140
127
  # @!attribute cap
141
128
  # @return [Integer] 16-bit capabillities word
142
- define_field_before :elements, :cap, Types::Int16le
129
+ define_attr_before :elements, :cap, BinStruct::Int16le
143
130
  end
144
131
  Header.add_class ProbeResp
145
132
  Management.bind ProbeResp, type: 0, subtype: 5
@@ -149,20 +136,20 @@ module PacketGen
149
136
  # Specialize {Dot11::Management} with +subtype+ set to 8.
150
137
  #
151
138
  # Add fields:
152
- # * {#timestamp} ({Types::Int64le}),
153
- # * {#interval} ({Types::Int16le}),
154
- # * {#cap} ({Types::Int16le}).
139
+ # * {#timestamp} (+BinStruct::Int64le+),
140
+ # * {#interval} (+BinStruct::Int16le+),
141
+ # * {#cap} (+BinStruct::Int16le+).
155
142
  # @author Sylvain Daubert
156
143
  class Beacon < SubMngt
157
144
  # @!attribute timestamp
158
145
  # @return [Integer] 64-bit timestamp
159
- define_field_before :elements, :timestamp, Types::Int64le
146
+ define_attr_before :elements, :timestamp, BinStruct::Int64le
160
147
  # @!attribute interval
161
148
  # @return [Integer] 16-bit interval value
162
- define_field_before :elements, :interval, Types::Int16le, default: 0x64
149
+ define_attr_before :elements, :interval, BinStruct::Int16le, default: 0x64
163
150
  # @!attribute cap
164
151
  # @return [Integer] 16-bit capabillities word
165
- define_field_before :elements, :cap, Types::Int16le
152
+ define_attr_before :elements, :cap, BinStruct::Int16le
166
153
  end
167
154
  Header.add_class Beacon
168
155
  Management.bind Beacon, type: 0, subtype: 8
@@ -182,12 +169,12 @@ module PacketGen
182
169
  # Specialize {Dot11::Management} with +subtype+ set to 10.
183
170
  #
184
171
  # Add fields:
185
- # * {#reason} ({Types::Int16le}).
172
+ # * {#reason} (+BinStruct::Int16le+).
186
173
  # @author Sylvain Daubert
187
174
  class Disas < SubMngt
188
175
  # @!attribute reason
189
176
  # @return [Integer] 16-bit reason value
190
- define_field_before :elements, :reason, Types::Int16le
177
+ define_attr_before :elements, :reason, BinStruct::Int16le
191
178
  end
192
179
  Header.add_class Disas
193
180
  Management.bind Disas, type: 0, subtype: 10
@@ -197,20 +184,20 @@ module PacketGen
197
184
  # Specialize {Dot11::Management} with +subtype+ set to 11.
198
185
  #
199
186
  # Add fields:
200
- # * {#algo} ({Types::Int16le}),
201
- # * {#seqnum} ({Types::Int16le}),
202
- # * {#status} ({Types::Int16le}).
187
+ # * {#algo} (+BinStruct::Int16le+),
188
+ # * {#seqnum} (+BinStruct::Int16le+),
189
+ # * {#status} (+BinStruct::Int16le+).
203
190
  # @author Sylvain Daubert
204
191
  class Auth < SubMngt
205
192
  # @!attribute algo
206
193
  # @return [Integer] 16-bit algo value
207
- define_field_before :elements, :algo, Types::Int16le
194
+ define_attr_before :elements, :algo, BinStruct::Int16le
208
195
  # @!attribute seqnum
209
196
  # @return [Integer] 16-bit seqnum value
210
- define_field_before :elements, :seqnum, Types::Int16le
197
+ define_attr_before :elements, :seqnum, BinStruct::Int16le
211
198
  # @!attribute status
212
199
  # @return [Integer] 16-bit status word
213
- define_field_before :elements, :status, Types::Int16le
200
+ define_attr_before :elements, :status, BinStruct::Int16le
214
201
  end
215
202
  Header.add_class Auth
216
203
  Management.bind Auth, type: 0, subtype: 11
@@ -220,12 +207,12 @@ module PacketGen
220
207
  # Specialize {Dot11::Management} with +subtype+ set to 12.
221
208
  #
222
209
  # Add fields:
223
- # * {#reason} ({Types::Int16le}).
210
+ # * {#reason} (+BinStruct::Int16le+).
224
211
  # @author Sylvain Daubert
225
212
  class DeAuth < SubMngt
226
213
  # @!attribute reason
227
214
  # @return [Integer] 16-bit reason value
228
- define_field_before :elements, :reason, Types::Int16le
215
+ define_attr_before :elements, :reason, BinStruct::Int16le
229
216
  end
230
217
  Header.add_class DeAuth
231
218
  Management.bind DeAuth, type: 0, subtype: 12