packetgen 2.6.0 → 2.7.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +28 -0
  4. data/Rakefile +6 -6
  5. data/bin/pgconsole +6 -6
  6. data/lib/packetgen.rb +4 -3
  7. data/lib/packetgen/capture.rb +5 -7
  8. data/lib/packetgen/config.rb +3 -3
  9. data/lib/packetgen/deprecation.rb +17 -0
  10. data/lib/packetgen/header.rb +40 -38
  11. data/lib/packetgen/header/arp.rb +46 -31
  12. data/lib/packetgen/header/asn1_base.rb +8 -8
  13. data/lib/packetgen/header/base.rb +108 -36
  14. data/lib/packetgen/header/bootp.rb +28 -19
  15. data/lib/packetgen/header/crypto.rb +6 -8
  16. data/lib/packetgen/header/dhcp.rb +4 -5
  17. data/lib/packetgen/header/dhcp/option.rb +46 -34
  18. data/lib/packetgen/header/dhcp/options.rb +0 -1
  19. data/lib/packetgen/header/dhcpv6.rb +10 -10
  20. data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
  21. data/lib/packetgen/header/dhcpv6/option.rb +16 -21
  22. data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
  23. data/lib/packetgen/header/dns.rb +13 -11
  24. data/lib/packetgen/header/dns/name.rb +4 -6
  25. data/lib/packetgen/header/dns/opt.rb +31 -31
  26. data/lib/packetgen/header/dns/option.rb +0 -2
  27. data/lib/packetgen/header/dns/qdsection.rb +1 -2
  28. data/lib/packetgen/header/dns/question.rb +19 -13
  29. data/lib/packetgen/header/dns/rr.rb +11 -14
  30. data/lib/packetgen/header/dns/rrsection.rb +5 -7
  31. data/lib/packetgen/header/dot11.rb +45 -29
  32. data/lib/packetgen/header/dot11/control.rb +3 -5
  33. data/lib/packetgen/header/dot11/data.rb +34 -6
  34. data/lib/packetgen/header/dot11/element.rb +0 -1
  35. data/lib/packetgen/header/dot11/management.rb +9 -5
  36. data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
  37. data/lib/packetgen/header/dot1q.rb +2 -2
  38. data/lib/packetgen/header/dot1x.rb +3 -4
  39. data/lib/packetgen/header/eap.rb +62 -53
  40. data/lib/packetgen/header/eap/fast.rb +0 -1
  41. data/lib/packetgen/header/eap/md5.rb +1 -2
  42. data/lib/packetgen/header/eap/tls.rb +9 -10
  43. data/lib/packetgen/header/eap/ttls.rb +9 -10
  44. data/lib/packetgen/header/esp.rb +33 -33
  45. data/lib/packetgen/header/eth.rb +11 -8
  46. data/lib/packetgen/header/gre.rb +5 -6
  47. data/lib/packetgen/header/http/headers.rb +11 -14
  48. data/lib/packetgen/header/http/request.rb +20 -20
  49. data/lib/packetgen/header/http/response.rb +16 -18
  50. data/lib/packetgen/header/http/verbs.rb +5 -5
  51. data/lib/packetgen/header/icmp.rb +1 -3
  52. data/lib/packetgen/header/icmpv6.rb +1 -3
  53. data/lib/packetgen/header/igmp.rb +5 -6
  54. data/lib/packetgen/header/igmpv3.rb +5 -9
  55. data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
  56. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  57. data/lib/packetgen/header/igmpv3/mr.rb +4 -3
  58. data/lib/packetgen/header/ike.rb +33 -8
  59. data/lib/packetgen/header/ike/auth.rb +4 -6
  60. data/lib/packetgen/header/ike/cert.rb +0 -2
  61. data/lib/packetgen/header/ike/certreq.rb +1 -3
  62. data/lib/packetgen/header/ike/id.rb +1 -3
  63. data/lib/packetgen/header/ike/ke.rb +0 -2
  64. data/lib/packetgen/header/ike/nonce.rb +0 -2
  65. data/lib/packetgen/header/ike/notify.rb +22 -24
  66. data/lib/packetgen/header/ike/payload.rb +198 -199
  67. data/lib/packetgen/header/ike/sa.rb +21 -30
  68. data/lib/packetgen/header/ike/sk.rb +16 -17
  69. data/lib/packetgen/header/ike/ts.rb +22 -24
  70. data/lib/packetgen/header/ike/vendor_id.rb +0 -2
  71. data/lib/packetgen/header/ip.rb +30 -23
  72. data/lib/packetgen/header/ip/addr.rb +5 -6
  73. data/lib/packetgen/header/ip/option.rb +11 -15
  74. data/lib/packetgen/header/ip/options.rb +1 -2
  75. data/lib/packetgen/header/ipv6.rb +27 -12
  76. data/lib/packetgen/header/ipv6/addr.rb +2 -2
  77. data/lib/packetgen/header/ipv6/extension.rb +1 -1
  78. data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
  79. data/lib/packetgen/header/llc.rb +4 -3
  80. data/lib/packetgen/header/mdns.rb +11 -5
  81. data/lib/packetgen/header/mld.rb +4 -4
  82. data/lib/packetgen/header/mldv2.rb +4 -3
  83. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
  84. data/lib/packetgen/header/mldv2/mlq.rb +3 -4
  85. data/lib/packetgen/header/mldv2/mlr.rb +4 -3
  86. data/lib/packetgen/header/netbios.rb +18 -5
  87. data/lib/packetgen/header/ospfv2.rb +6 -7
  88. data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
  89. data/lib/packetgen/header/ospfv2/hello.rb +2 -3
  90. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
  91. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
  92. data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
  93. data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
  94. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
  95. data/lib/packetgen/header/ospfv3.rb +3 -4
  96. data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
  97. data/lib/packetgen/header/ospfv3/hello.rb +2 -3
  98. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
  99. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
  100. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
  101. data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
  102. data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
  103. data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
  104. data/lib/packetgen/header/snmp.rb +45 -32
  105. data/lib/packetgen/header/tcp.rb +13 -9
  106. data/lib/packetgen/header/tcp/option.rb +16 -11
  107. data/lib/packetgen/header/tcp/options.rb +3 -4
  108. data/lib/packetgen/header/tftp.rb +15 -17
  109. data/lib/packetgen/header/udp.rb +10 -4
  110. data/lib/packetgen/inspect.rb +7 -9
  111. data/lib/packetgen/packet.rb +44 -22
  112. data/lib/packetgen/pcapng.rb +1 -5
  113. data/lib/packetgen/pcapng/block.rb +17 -11
  114. data/lib/packetgen/pcapng/epb.rb +6 -11
  115. data/lib/packetgen/pcapng/file.rb +37 -44
  116. data/lib/packetgen/pcapng/idb.rb +17 -22
  117. data/lib/packetgen/pcapng/shb.rb +7 -10
  118. data/lib/packetgen/pcapng/spb.rb +21 -17
  119. data/lib/packetgen/pcapng/unknown_block.rb +17 -13
  120. data/lib/packetgen/proto.rb +1 -2
  121. data/lib/packetgen/types/array.rb +119 -34
  122. data/lib/packetgen/types/cstring.rb +1 -5
  123. data/lib/packetgen/types/enum.rb +8 -10
  124. data/lib/packetgen/types/fields.rb +34 -28
  125. data/lib/packetgen/types/int.rb +11 -13
  126. data/lib/packetgen/types/int_string.rb +6 -8
  127. data/lib/packetgen/types/oui.rb +3 -6
  128. data/lib/packetgen/types/string.rb +4 -6
  129. data/lib/packetgen/types/tlv.rb +11 -14
  130. data/lib/packetgen/utils.rb +15 -23
  131. data/lib/packetgen/utils/arp_spoofer.rb +12 -18
  132. data/lib/packetgen/version.rb +1 -1
  133. data/packetgen.gemspec +9 -8
  134. metadata +19 -17
@@ -9,7 +9,6 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class Dot11
12
-
13
12
  # IEEE 802.11 information element
14
13
  #
15
14
  # An {Element} is a piece of data contained in a Dot11 management frame.
@@ -9,7 +9,6 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class Dot11
12
-
13
12
  # IEEE 802.11 management frame header
14
13
  #
15
14
  # This class make a {Dot11} header with {#type} set to +0+
@@ -25,7 +24,7 @@ module PacketGen
25
24
  # * a {#body} (a {Types::String} or another {Base} class),
26
25
  # * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
27
26
  #
28
- # Management frames should be constructed with more headers from
27
+ # Management frames should be constructed with more headers from
29
28
  # {SubMngt} subclasses.
30
29
  #
31
30
  # By example, build a {DeAuth} frame:
@@ -40,12 +39,11 @@ module PacketGen
40
39
  # pkt.dot11_beacon.add_elements(type: 'TIM', value: "\x00\x01\x00\x00")
41
40
  # @author Sylvain Daubert
42
41
  class Management < Dot11
43
-
44
42
  # @param [Hash] options
45
43
  # @see Base#initialize
46
44
  def initialize(options={})
47
- super({type: 0}.merge!(options))
48
- @applicable_fields -= %i(mac4 qos_ctrl ht_ctrl)
45
+ super({ type: 0 }.merge!(options))
46
+ @applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
49
47
  define_applicable_fields
50
48
  end
51
49
 
@@ -64,6 +62,12 @@ module PacketGen
64
62
 
65
63
  self
66
64
  end
65
+
66
+ # Invert mac1 and mac2 (resp. destination address and source address).
67
+ # @return [self]
68
+ def reply!
69
+ self[:mac1], self[:mac2] = self[:mac2], self[:mac1]
70
+ end
67
71
  end
68
72
  end
69
73
  end
@@ -9,7 +9,6 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class Dot11
12
-
13
12
  # @abstract Base class for all subtype management frames
14
13
  # Subclasses of this class are used to specialize {Management}. A
15
14
  # +SubMngt+ class set +subtype+ field in Dot11 header and may add some
@@ -52,7 +51,7 @@ module PacketGen
52
51
  end
53
52
  str
54
53
  end
55
-
54
+
56
55
  # Add an {Element} to header
57
56
  # @param [Integer,String] type element type
58
57
  # @param [Object] value element value
@@ -69,7 +68,7 @@ module PacketGen
69
68
  def read_elements(str)
70
69
  start = 0
71
70
  elsz = Element.new.sz
72
- while str.size - start >= elsz do
71
+ while str.size - start >= elsz
73
72
  el = Element.new.read(str[start, str.size])
74
73
  @elements << el
75
74
  start += el.sz
@@ -94,7 +93,7 @@ module PacketGen
94
93
  define_field :listen_interval, Types::Int16le, default: 0x00c8
95
94
  end
96
95
  Header.add_class AssoReq
97
- Management.bind_header AssoReq, op: :and, type: 0, subtype: 0
96
+ Management.bind AssoReq, type: 0, subtype: 0
98
97
 
99
98
  # IEEE 802.11 Association Response frame
100
99
  #
@@ -117,7 +116,7 @@ module PacketGen
117
116
  define_field :aid, Types::Int16le
118
117
  end
119
118
  Header.add_class AssoResp
120
- Management.bind_header AssoResp, op: :and, type: 0, subtype: 1
119
+ Management.bind AssoResp, type: 0, subtype: 1
121
120
 
122
121
  # IEEE 802.11 ReAssociation Request frame
123
122
  #
@@ -134,7 +133,7 @@ module PacketGen
134
133
  define_field :current_ap, Eth::MacAddr
135
134
  end
136
135
  Header.add_class ReAssoReq
137
- Management.bind_header ReAssoReq, op: :and, type: 0, subtype: 2
136
+ Management.bind ReAssoReq, type: 0, subtype: 2
138
137
 
139
138
  # IEEE 802.11 ReAssociation Response frame
140
139
  #
@@ -148,7 +147,7 @@ module PacketGen
148
147
  class ReAssoResp < AssoResp
149
148
  end
150
149
  Header.add_class ReAssoResp
151
- Management.bind_header ReAssoResp, op: :and, type: 0, subtype: 3
150
+ Management.bind ReAssoResp, type: 0, subtype: 3
152
151
 
153
152
  # IEEE 802.11 Probe Request frame
154
153
  #
@@ -159,7 +158,7 @@ module PacketGen
159
158
  class ProbeReq < SubMngt
160
159
  end
161
160
  Header.add_class ProbeReq
162
- Management.bind_header ProbeReq, op: :and, type: 0, subtype: 4
161
+ Management.bind ProbeReq, type: 0, subtype: 4
163
162
 
164
163
  # IEEE 802.11 Probe Response frame
165
164
  #
@@ -182,7 +181,7 @@ module PacketGen
182
181
  define_field :cap, Types::Int16le
183
182
  end
184
183
  Header.add_class ProbeResp
185
- Management.bind_header ProbeResp, op: :and, type: 0, subtype: 5
184
+ Management.bind ProbeResp, type: 0, subtype: 5
186
185
 
187
186
  # IEEE 802.11 Beacon frame
188
187
  #
@@ -205,7 +204,7 @@ module PacketGen
205
204
  define_field :cap, Types::Int16le
206
205
  end
207
206
  Header.add_class Beacon
208
- Management.bind_header Beacon, op: :and, type: 0, subtype: 8
207
+ Management.bind Beacon, type: 0, subtype: 8
209
208
 
210
209
  # IEEE 802.11 ATIM frame
211
210
  #
@@ -215,7 +214,7 @@ module PacketGen
215
214
  # @author Sylvain Daubert
216
215
  class ATIM < SubMngt; end
217
216
  Header.add_class ATIM
218
- Management.bind_header ATIM, op: :and, type: 0, subtype: 9
217
+ Management.bind ATIM, type: 0, subtype: 9
219
218
 
220
219
  # IEEE 802.11 Disassociation frame
221
220
  #
@@ -230,7 +229,7 @@ module PacketGen
230
229
  define_field :reason, Types::Int16le
231
230
  end
232
231
  Header.add_class Disas
233
- Management.bind_header Disas, op: :and, type: 0, subtype: 10
232
+ Management.bind Disas, type: 0, subtype: 10
234
233
 
235
234
  # IEEE 802.11 Authentication frame
236
235
  #
@@ -253,7 +252,7 @@ module PacketGen
253
252
  define_field :status, Types::Int16le
254
253
  end
255
254
  Header.add_class Auth
256
- Management.bind_header Auth, op: :and, type: 0, subtype: 11
255
+ Management.bind Auth, type: 0, subtype: 11
257
256
 
258
257
  # IEEE 802.11 Deauthentication frame
259
258
  #
@@ -268,7 +267,7 @@ module PacketGen
268
267
  define_field :reason, Types::Int16le
269
268
  end
270
269
  Header.add_class DeAuth
271
- Management.bind_header DeAuth, op: :and, type: 0, subtype: 12
270
+ Management.bind DeAuth, type: 0, subtype: 12
272
271
  end
273
272
  end
274
273
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # IEEE 802.1Q VLAN tagging
12
11
  #
13
12
  # A VLAN tag consists of:
@@ -19,6 +18,7 @@ module PacketGen
19
18
  # # Create a IP packet in VLAN #43
20
19
  # pkt = PacketGen.gen('Eth').add('Dot1q', vid: 43).add('IP')
21
20
  # @author Sylvain Daubert
21
+ # @since 1.4.0
22
22
  class Dot1q < Base
23
23
  # @!attribute tci
24
24
  # @return [Integer] 16-bit Tag Control Information
@@ -39,6 +39,6 @@ module PacketGen
39
39
  define_bit_fields_on :tci, :pcp, 3, :dei, :vid, 12
40
40
  end
41
41
 
42
- Eth.bind_header Dot1q, ethertype: 0x8100
42
+ Eth.bind Dot1q, ethertype: 0x8100
43
43
  end
44
44
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # IEEE 802.1X / EAPOL
12
11
  #
13
12
  # A IEEE 802.1X header consists of:
@@ -21,8 +20,8 @@ module PacketGen
21
20
  # pkt2.dot1x.type = 'EAP Packet'
22
21
  # pkt2.dot1x.body.read 'body'
23
22
  # @author Sylvain Daubert
23
+ # @since 1.4.0
24
24
  class Dot1x < Base
25
-
26
25
  # IEEE 802.1x Ether type
27
26
  ETHERTYPE = 0x888e
28
27
 
@@ -74,7 +73,7 @@ module PacketGen
74
73
  end
75
74
  end
76
75
 
77
- Eth.bind_header Dot1x, ethertype: Dot1x::ETHERTYPE
78
- SNAP.bind_header Dot1x, proto_id: Dot1x::ETHERTYPE
76
+ Eth.bind Dot1x, ethertype: Dot1x::ETHERTYPE
77
+ SNAP.bind Dot1x, proto_id: Dot1x::ETHERTYPE
79
78
  end
80
79
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # Extensible Authentication Protocol (EAP),
12
11
  # {https://tools.ietf.org/html/rfc3748 RFC 3748}
13
12
  #
@@ -57,15 +56,14 @@ module PacketGen
57
56
  # @author Sylvain Daubert
58
57
  # @since 2.1.4
59
58
  class EAP < Base
60
-
61
59
  # EAP known codes
62
60
  CODES = {
63
61
  'Request' => 1,
64
62
  'Response' => 2,
65
63
  'Success' => 3,
66
64
  'Failure' => 4
67
- }
68
-
65
+ }.freeze
66
+
69
67
  # EAP known request/response types
70
68
  TYPES = {
71
69
  'Identity' => 1,
@@ -79,7 +77,7 @@ module PacketGen
79
77
  'EAP-FAST' => 43,
80
78
  'Expanded Types' => 254,
81
79
  'Experimental Use' => 255
82
- }
80
+ }.freeze
83
81
 
84
82
  # @!attribute code
85
83
  # @return [Integer] 8-bit EAP code
@@ -92,70 +90,65 @@ module PacketGen
92
90
  # @!attribute length
93
91
  # @return [Integer] 16-bit length of EAP packet
94
92
  define_field :length, Types::Int16, default: 4
95
-
93
+
96
94
  # @!attribute type
97
95
  # This field is present only for Request or Response packets,
98
96
  # with type different from Expanded Types (254).
99
97
  # @return [Integer] 8-bit request or response type
100
- define_field :type, Types::Int8Enum, enum: TYPES,
101
- optional: ->(eap) { eap.has_type? }
102
-
98
+ define_field :type, Types::Int8Enum, enum: TYPES,
99
+ optional: ->(eap) { eap.type? }
100
+
103
101
  # @!attribute vendor_id
104
102
  # This field is present only for Request or Response packets,
105
103
  # with type equal to +Expanded Types+ (254).
106
104
  # @return [Integer] 24-bit vendor ID
107
105
  define_field :vendor_id, Types::Int24,
108
- optional: ->(eap) { eap.has_type? and eap.type == 254 }
109
-
106
+ optional: ->(eap) { eap.type? && (eap.type == 254) }
107
+
110
108
  # @!attribute vendor_type
111
109
  # This field is present only for Request or Response packets,
112
110
  # with type equal to +Expanded Types+ (254).
113
111
  # @return [Integer] 32-bit vendor type
114
112
  define_field :vendor_type, Types::Int32,
115
- optional: ->(eap) { eap.has_type? and eap.type == 254 }
113
+ optional: ->(eap) { eap.type? && (eap.type == 254) }
116
114
 
117
115
  # @!attribute body
118
116
  # @return [Types::String, Header::Base]
119
117
  define_field :body, Types::String
120
-
118
+
121
119
  # @return [EAP]
122
120
  def initialize(options={})
123
121
  super
124
122
  calc_length if options[:length].nil?
125
123
  end
126
-
124
+
127
125
  # @private
128
126
  alias old_read read
129
-
127
+
130
128
  # Populate object from a binary string
131
129
  # @param [String] str
132
130
  # @return [Dot11] may return a subclass object if a more specific class
133
131
  # may be determined
134
132
  def read(str)
135
- if self.class == EAP
136
- super str
137
-
138
- if has_type?
139
- obj = case self.type
140
- when 4
141
- EAP::MD5.new.read(str)
142
- when 13
143
- EAP::TLS.new.read(str)
144
- when 21
145
- EAP::TTLS.new.read(str)
146
- when 43
147
- EAP::FAST.new.read(str)
148
- else
149
- self
150
- end
151
- return obj
152
- else
153
- return self
154
- end
133
+ super str
134
+ return self unless self.class == EAP
135
+ if type?
136
+ obj = case self.type
137
+ when 4
138
+ EAP::MD5.new.read(str)
139
+ when 13
140
+ EAP::TLS.new.read(str)
141
+ when 21
142
+ EAP::TTLS.new.read(str)
143
+ when 43
144
+ EAP::FAST.new.read(str)
145
+ else
146
+ self
147
+ end
148
+ obj
155
149
  else
156
- super str
150
+ self
157
151
  end
158
- self
159
152
  end
160
153
 
161
154
  # Get human readable code
@@ -163,49 +156,47 @@ module PacketGen
163
156
  def human_code
164
157
  self[:code].to_human
165
158
  end
166
-
159
+
167
160
  # Get human readable type
168
161
  # @return [String]
169
162
  # @raise [ParseError] not a Request nor a Response packet
170
163
  def human_type
171
- raise ParseError, 'not a Request nor a Response' unless has_type?
164
+ raise ParseError, 'not a Request nor a Response' unless type?
172
165
  self[:type].to_human
173
166
  end
174
-
167
+
175
168
  # Is packet a request?
176
169
  # @return [Boolean]
177
170
  def request?
178
171
  code == CODES['Request']
179
172
  end
180
-
173
+
181
174
  # Is packet a response?
182
175
  # @return [Boolean]
183
176
  def response?
184
177
  code == CODES['Response']
185
178
  end
186
-
179
+
187
180
  # Is packet a success?
188
181
  # @return [Boolean]
189
182
  def success?
190
183
  code == CODES['Success']
191
184
  end
192
-
185
+
193
186
  # Is packet a failure?
194
187
  # @return [Boolean]
195
188
  def failure?
196
189
  code == CODES['Failure']
197
190
  end
198
-
191
+
199
192
  # Return an array of desired authentication types from a Nak packet
200
193
  # @return [Array<Integer>]
201
194
  # @raise [ParseError] not a Nak packet
202
195
  def desired_auth_type
203
- if code != 2 and type != 3
204
- raise ParseError, 'not a Nak response'
205
- end
196
+ raise ParseError, 'not a Nak response' if (code != 2) && (type != 3)
206
197
  body.to_s.unpack('C*')
207
198
  end
208
-
199
+
209
200
  # Calculate length field from content
210
201
  # @return [Integer]
211
202
  def calc_length
@@ -214,8 +205,16 @@ module PacketGen
214
205
 
215
206
  # Say is this EAP header has {#type} field
216
207
  # @return [Boolean]
208
+ # @since 2.7.0
209
+ def type?
210
+ [1, 2].include?(self.code)
211
+ end
212
+
213
+ # @deprecated Use {#type?} instead.
214
+ # @return [Boolean]
217
215
  def has_type?
218
- [1,2].include?(self.code)
216
+ Deprecation.deprecated(self.class, __method__, 'type?')
217
+ type?
219
218
  end
220
219
 
221
220
  # Callback called when a EAP header is added to a packet
@@ -224,13 +223,23 @@ module PacketGen
224
223
  # @param [Packet] packet
225
224
  # @return [void]
226
225
  def added_to_packet(packet)
227
- unless packet.respond_to? :eap
228
- packet.instance_eval("def eap(arg=nil); header(#{self.class}, arg); end")
226
+ return if packet.respond_to? :eap
227
+ packet.instance_eval("def eap(arg=nil); header(#{self.class}, arg); end")
228
+ end
229
+
230
+ # Invert between a request and a response packet. Not action for
231
+ # others codes.
232
+ # @return [self]
233
+ def reply!
234
+ case self.code
235
+ when 1 then self.code = 2
236
+ when 2 then self.code = 1
229
237
  end
238
+ self
230
239
  end
231
240
  end
232
-
233
- Dot1x.bind_header EAP, type: 0
241
+
242
+ Dot1x.bind EAP, type: 0
234
243
  end
235
244
  end
236
245