pio 0.18.2 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +40 -344
  4. data/Rakefile +32 -0
  5. data/bin/_guard-core +16 -0
  6. data/bin/byebug +16 -0
  7. data/bin/cc-tddium-post-worker +16 -0
  8. data/bin/cdiff +16 -0
  9. data/bin/coderay +16 -0
  10. data/bin/colortab +16 -0
  11. data/bin/coveralls +16 -0
  12. data/bin/cucumber +16 -0
  13. data/bin/decolor +16 -0
  14. data/bin/flay +16 -0
  15. data/bin/flog +16 -0
  16. data/bin/guard +16 -0
  17. data/bin/htmldiff +16 -0
  18. data/bin/inch +16 -0
  19. data/bin/ldiff +16 -0
  20. data/bin/listen +16 -0
  21. data/bin/minitar +16 -0
  22. data/bin/pry +16 -0
  23. data/bin/rake +16 -0
  24. data/bin/reek +16 -0
  25. data/bin/relish +16 -0
  26. data/bin/restclient +16 -0
  27. data/bin/rspec +16 -0
  28. data/bin/rubocop +16 -0
  29. data/bin/ruby-parse +16 -0
  30. data/bin/ruby-rewrite +16 -0
  31. data/bin/ruby_parse +16 -0
  32. data/bin/ruby_parse_extract_error +16 -0
  33. data/bin/sparkr +16 -0
  34. data/bin/term_display +16 -0
  35. data/bin/term_mandel +16 -0
  36. data/bin/thor +16 -0
  37. data/bin/unparser +16 -0
  38. data/bin/yard +16 -0
  39. data/bin/yardoc +16 -0
  40. data/bin/yri +16 -0
  41. data/features/arp.feature +61 -0
  42. data/features/dhcp.feature +4 -0
  43. data/features/icmp.feature +130 -0
  44. data/features/lldp.feature +47 -0
  45. data/features/open_flow10/echo_reply.feature +95 -0
  46. data/features/open_flow10/echo_request.feature +95 -0
  47. data/features/open_flow10/exact_match.feature +36 -0
  48. data/features/{features_read.feature → open_flow10/features_reply.feature} +54 -17
  49. data/features/open_flow10/features_request.feature +79 -0
  50. data/features/{flow_mod_read.feature → open_flow10/flow_mod.feature} +16 -21
  51. data/features/open_flow10/hello.feature +79 -0
  52. data/features/open_flow10/packet_in.feature +58 -0
  53. data/features/{packet_out_read.feature → open_flow10/packet_out.feature} +4 -5
  54. data/features/open_flow10/port_status.feature +23 -0
  55. data/features/open_flow13/echo_reply.feature +115 -0
  56. data/features/open_flow13/echo_request.feature +115 -0
  57. data/features/open_flow13/hello.feature +74 -0
  58. data/features/packet_data/echo13_reply_body.raw +0 -0
  59. data/features/packet_data/echo13_reply_no_body.raw +0 -0
  60. data/features/packet_data/echo13_request_body.raw +0 -0
  61. data/features/packet_data/echo13_request_no_body.raw +0 -0
  62. data/features/packet_data/hello13_no_version_bitmap.raw +0 -0
  63. data/features/packet_data/hello13_version_bitmap.raw +0 -0
  64. data/features/packet_data/udp_no_payload.raw +0 -0
  65. data/features/packet_data/udp_with_payload.raw +0 -0
  66. data/features/step_definitions/packet_data_steps.rb +49 -29
  67. data/features/support/env.rb +3 -0
  68. data/features/{udp_read.feature → udp.feature} +3 -4
  69. data/lib/pio.rb +1 -0
  70. data/lib/pio/echo.rb +67 -0
  71. data/lib/pio/hello13.rb +111 -0
  72. data/lib/pio/open_flow/message.rb +2 -1
  73. data/lib/pio/open_flow/open_flow_header.rb +21 -38
  74. data/lib/pio/open_flow/transaction_id.rb +25 -0
  75. data/lib/pio/version.rb +1 -1
  76. data/pio.gemspec +9 -14
  77. data/spec/pio/flow_mod_spec.rb +1 -1
  78. data/spec/pio/hello13_spec.rb +114 -0
  79. metadata +182 -138
  80. data/examples/arp_new.rb +0 -16
  81. data/examples/arp_read.rb +0 -4
  82. data/examples/dhcp_new.rb +0 -34
  83. data/examples/dhcp_read.rb +0 -4
  84. data/examples/echo_new.rb +0 -9
  85. data/examples/echo_read.rb +0 -4
  86. data/examples/features_new.rb +0 -28
  87. data/examples/features_read.rb +0 -4
  88. data/examples/flow_mod_new.rb +0 -13
  89. data/examples/flow_mod_read.rb +0 -6
  90. data/examples/hello_new.rb +0 -4
  91. data/examples/hello_read.rb +0 -4
  92. data/examples/icmp_new.rb +0 -21
  93. data/examples/icmp_read.rb +0 -4
  94. data/examples/lldp_new.rb +0 -4
  95. data/examples/lldp_read.rb +0 -4
  96. data/examples/packet_in_new.rb +0 -17
  97. data/examples/packet_in_read.rb +0 -5
  98. data/examples/packet_out_new.rb +0 -18
  99. data/examples/packet_out_read.rb +0 -6
  100. data/features/arp_read.feature +0 -10
  101. data/features/dhcp_read.feature +0 -6
  102. data/features/echo_read.feature +0 -29
  103. data/features/exact_match.feature +0 -38
  104. data/features/hello_read.feature +0 -14
  105. data/features/icmp_read.feature +0 -55
  106. data/features/lldp_read.feature +0 -26
  107. data/features/packet_in_read.feature +0 -22
  108. data/features/port_status_read.feature +0 -24
  109. data/features/step_definitions/pending_steps.rb +0 -3
  110. data/spec/pio/echo/reply_spec.rb +0 -135
  111. data/spec/pio/echo/request_spec.rb +0 -137
  112. data/spec/pio/features/reply_spec.rb +0 -137
  113. data/spec/pio/features/request_spec.rb +0 -112
  114. data/spec/pio/hello_spec.rb +0 -106
  115. data/spec/pio/lldp_spec.rb +0 -244
  116. data/spec/pio/packet_in_spec.rb +0 -146
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8f3d25e89b140718eea14e7bf453d0da621b3b5b
4
- data.tar.gz: 085b56cba5a30481ad2ff833b67600b480f58299
3
+ metadata.gz: d398d469faa1ab4517f72921247962e703371504
4
+ data.tar.gz: 2861613dfbf72b3a32a7eab8020f1120ecdbfd9e
5
5
  SHA512:
6
- metadata.gz: 0f5344001a2d27f5757f9dfa971d2fa64a65e1aaabe2f8c74b94620c96ae9e19dd77200fad1e41ad70378ff2aa276792a5b50b57a3cf2f6348730f1865689e2b
7
- data.tar.gz: 47f511b27dce773a818e49883b9fe07f93411dd5bcff8d1e1a3f942fcf16c56a74775aabdc316ba94d425c0fbea98f0180e91db4454a04f43824624c16dfd8d1
6
+ metadata.gz: 2510e49704a383db42c738e2b34e41b19b232ace5392a5f3f2e107b917abde8280eb892e001a7e0e3e7aad4ece7d4440f55b1edf68f7ac1bd544854a9d3285f0
7
+ data.tar.gz: ae229fe4badbb4a0fc24bb8cf58ead7e1e667632a47f031f5d42c09de0d60309ce10df5cf50b15bfc43049ab0d0b65a565889a7e7e3768bb3282373bdb55673b
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Changelog
2
2
 
3
3
  ## develop (unreleased)
4
+ ### New features
5
+ * [#132](https://github.com/trema/pio/pull/132): Add new class `Pio::Hello13`.
6
+ * [#136](https://github.com/trema/pio/pull/136): Add new class `Pio::Echo13::Request` and `Pio::Echo13::Reply`.
4
7
 
5
8
 
6
9
  ## 0.18.2 (3/12/2015)
data/README.md CHANGED
@@ -13,345 +13,36 @@
13
13
  Pio is a ruby gem to easily parse and generate network packets. It
14
14
  supports the following packet formats:
15
15
 
16
- - ICMP
17
- - ARP
18
- - LLDP
19
- - DHCP
20
- - OpenFlow 1.0
21
- - Hello
22
- - Echo
23
- - Features
24
- - Packet-In
25
- - Packet-Out
26
- - Flow Mod
27
- - Port Status
28
- - (…currently there are just a few formats supported but I'm sure this list will grow)
16
+ - [ICMP](https://relishapp.com/trema/pio/docs/misc/icmp)
17
+ - [ARP](https://relishapp.com/trema/pio/docs/misc/arp)
18
+ - [LLDP](https://relishapp.com/trema/pio/docs/misc/lldp)
19
+ - [DHCP](https://relishapp.com/trema/pio/docs/misc/dhcp)
20
+ - [UDP](https://relishapp.com/trema/pio/docs/misc/udp)
21
+ - OpenFlow 1.0
22
+ - [Hello](https://relishapp.com/trema/pio/docs/open-flow10/hello)
23
+ - [Echo Request](https://relishapp.com/trema/pio/docs/open-flow10/echo-request)
24
+ - [Echo Reply](https://relishapp.com/trema/pio/docs/open-flow10/echo-reply)
25
+ - [Features Request](https://relishapp.com/trema/pio/docs/open-flow10/features-request)
26
+ - [Features Reply](https://relishapp.com/trema/pio/docs/open-flow10/features-reply)
27
+ - [Packet In](https://relishapp.com/trema/pio/docs/open-flow10/packet-in)
28
+ - [Packet Out](https://relishapp.com/trema/pio/docs/open-flow10/packet-out)
29
+ - [Flow Mod](https://relishapp.com/trema/pio/docs/open-flow10/flow-mod)
30
+ - [Port Status](https://relishapp.com/trema/pio/docs/open-flow10/port-status)
31
+ - [Exact Match](https://relishapp.com/trema/pio/docs/open-flow10/exact-match)
32
+ - OpenFlow 1.3
33
+ - [Hello](https://relishapp.com/trema/pio/docs/open-flow13/hello)
34
+ - [Echo Request](https://relishapp.com/trema/pio/docs/open-flow13/echo-request)
35
+ - [Echo Reply](https://relishapp.com/trema/pio/docs/open-flow13/echo-reply)
29
36
 
30
37
  ## Features Overview
31
38
 
32
- - Pure Ruby. No additional dependency on other external tools to
33
- parse/generate packets.
34
- - Multi-Platform. Runs on major operating systems (recent Windows,
35
- Linux, and MacOSX).
36
- - Clean Code. Pio is built on [BinData](https://github.com/dmendel/bindata)'s declarative binary format DSL
37
- so that it is easy to read and debug by human beings.
38
-
39
- ## Examples
40
-
41
- Its usage is dead simple.
42
-
43
- ### ICMP
44
-
45
- To parse an ICMP frame, use the API `Pio::Icmp.read` and you can
46
- access each field of the parsed ICMP frame.
47
-
48
- require 'pio'
49
-
50
- icmp = Pio::Icmp.read(binary_data)
51
- icmp.source_mac.to_s # => '00:26:82:eb:ea:d1'
52
-
53
- Also you can use `Pio::Icmp::Request#new` or `Pio::Icmp::Reply#new` to
54
- generate an Icmp Request/Reply frame like below:
55
-
56
- require 'pio'
57
-
58
- request = Pio::Icmp::Request.new(
59
- source_mac: '00:16:9d:1d:9c:c4',
60
- destination_mac: '00:26:82:eb:ea:d1',
61
- ip_source_address: '192.168.83.3',
62
- ip_destination_address: '192.168.83.254'
63
- )
64
- request.to_binary # => ICMP Request frame in binary format.
65
-
66
- reply = Pio::Icmp::Reply.new(
67
- source_mac: '00:26:82:eb:ea:d1',
68
- destination_mac: '00:16:9d:1d:9c:c4',
69
- ip_source_address: '192.168.83.254',
70
- ip_destination_address: '192.168.83.3',
71
- # The ICMP Identifier and the ICMP Sequence number
72
- # should be same as those of the request.
73
- identifier: request.icmp_identifier,
74
- sequence_number: request.icmp_sequence_number
75
- )
76
- reply.to_binary # => ICMP Reply frame in binary format.
77
-
78
- ### ARP
79
-
80
- To parse an ARP frame, use the API `Pio::Arp.read` and you can access
81
- each field of the parsed ARP frame.
82
-
83
- require 'pio'
84
-
85
- arp = Pio::Arp.read(binary_data)
86
- arp.source_mac.to_s # => '00:26:82:eb:ea:d1'
87
-
88
- Also you can use `Pio::Arp::Request#new` or `Pio::Arp::Reply#new` to
89
- generate an Arp Request/Reply frame like below:
90
-
91
- require 'pio'
92
-
93
- request = Pio::Arp::Request.new(
94
- source_mac: '00:26:82:eb:ea:d1',
95
- sender_protocol_address: '192.168.83.3',
96
- target_protocol_address: '192.168.83.254'
97
- )
98
- request.to_binary # => Arp Request frame in binary format.
99
-
100
- reply = Pio::Arp::Reply.new(
101
- source_mac: '00:16:9d:1d:9c:c4',
102
- destination_mac: '00:26:82:eb:ea:d1',
103
- sender_protocol_address: '192.168.83.254',
104
- target_protocol_address: '192.168.83.3'
105
- )
106
- reply.to_binary # => Arp Reply frame in binary format.
107
-
108
- ### LLDP
109
-
110
- To parse an LLDP frame, use the API `Pio::Lldp.read` and you can
111
- access each field of the parsed LLDP frame.
112
-
113
- require 'pio'
114
-
115
- lldp = Pio::Lldp.read(binary_data)
116
- lldp.ttl # => 120
117
-
118
- Also you can use `Pio::Lldp#new` to generate an LLDP frame like below:
119
-
120
- require 'pio'
121
-
122
- lldp = Pio::Lldp.new(dpid: 0x123, port_number: 12)
123
- lldp.to_binary # => LLDP frame in binary format.
124
-
125
- ### DHCP
126
-
127
- To parse a DHCP frame, use the API `Pio::Dhcp.read` and you can access
128
- each field of the parsed DHCP frame.
129
-
130
- require 'pio'
131
-
132
- dhcp = Pio::Dhcp.read(binary_data)
133
- dhcp.destination_mac.to_s # => 'ff:ff:ff:ff:ff:ff'
134
-
135
- Also you can use `Pio::Dhcp::Discover#new`,
136
- `Pio::Dhcp::Offer#new`, `Pio::Dhcp::Request#new` and
137
- `Pio::Dhcp::Ack#new` to generate a DHCP frame like below:
138
-
139
- require 'pio'
140
-
141
- dhcp_client_mac_address = '24:db:ac:41:e5:5b'
142
-
143
- dhcp_server_options =
144
- {
145
- source_mac: '00:26:82:eb:ea:d1',
146
- destination_mac: '24:db:ac:41:e5:5b',
147
- ip_source_address: '192.168.0.100',
148
- ip_destination_address: '192.168.0.1'
149
- }
150
-
151
- # Client side
152
- discover = Pio::Dhcp::Discover.new(source_mac: dhcp_client_mac_address)
153
- discover.to_binary # => DHCP Discover frame in binary format
154
-
155
- # Server side
156
- offer = Pio::Dhcp::Offer.new(dhcp_server_options
157
- .merge(transaction_id: discover.transaction_id))
158
- offer.to_binary # => DHCP Offer frame in binary format
159
-
160
- # Client side
161
- request = Pio::Dhcp::Request.new(
162
- source_mac: dhcp_client_mac_address,
163
- server_identifier: dhcp_server_options[:ip_source_address],
164
- requested_ip_address: dhcp_server_options[:ip_destination_address],
165
- transaction_id: offer.transaction_id
166
- )
167
- request.to_binary # => DHCP Request frame in binary format
168
-
169
- # Server side
170
- ack = Pio::Dhcp::Ack.new(dhcp_server_options
171
- .merge(transaction_id: request.transaction_id))
172
- ack.to_binary # => DHCP Ack frame in binary format
173
-
174
- ### Hello
175
-
176
- To parse an OpenFlow 1.0 Hello message, use the API `Pio::Hello.read`
177
- and you can access each field of the parsed Hello message.
178
-
179
- require 'pio'
180
-
181
- hello = Pio::Hello.read(binary_data)
182
- hello.transaction_id # => 123
183
-
184
- Also you can use `Pio::Hello#new` to generate a Hello message like
185
- below:
186
-
187
- require 'pio'
188
-
189
- hello = Pio::Hello.new(transaction_id: 123)
190
- hello.to_binary # => HELLO message in binary format.
191
-
192
- ### Echo
193
-
194
- To parse an OpenFlow 1.0 Echo message, use the API `Pio::Echo.read`
195
- and you can access each field of the parsed Echo message.
196
-
197
- require 'pio'
198
-
199
- echo = Pio::Echo::Request.read(binary_data)
200
- echo.xid # => 123
201
-
202
- Also you can use `Pio::Echo::Request#new` or `Pio::Echo::Reply#new` to
203
- generate an Echo Request/Reply message like below:
204
-
205
- require 'pio'
206
-
207
- request = Pio::Echo::Request.new
208
- request.to_binary # => ECHO Request message in binary format.
209
-
210
- # The ECHO xid (transaction_id)
211
- # should be same as that of the request.
212
- reply = Pio::Echo::Reply.new(xid: request.xid)
213
- reply.to_binary # => ECHO Reply message in binary format.
214
-
215
- ### Features
216
-
217
- To parse an OpenFlow 1.0 Features message, use the API
218
- `Pio::Features.read` and you can access each field of the parsed
219
- Features message.
220
-
221
- require 'pio'
222
-
223
- features = Pio::Features::Request.read(binary_data)
224
- features.xid # => 123
225
-
226
- Also you can use `Pio::Features::Request#new` or `Pio::Features::Reply#new` to
227
- generate an Features Request/Reply message like below:
228
-
229
- require 'pio'
230
-
231
- request = Pio::Features::Request.new
232
- request.to_binary # => Features Request message in binary format.
233
-
234
- # The Features xid (transaction_id)
235
- # should be same as that of the request.
236
- reply =
237
- Pio::Features::Reply.new(xid: request.xid,
238
- dpid: 0x123,
239
- n_buffers: 0x100,
240
- n_tables: 0xfe,
241
- capabilities: [:flow_stats, :table_stats,
242
- :port_stats, :queue_stats,
243
- :arp_match_ip],
244
- actions: [:output, :set_vlan_vid,
245
- :set_vlan_pcp, :strip_vlan,
246
- :set_dl_src, :set_dl_dst,
247
- :set_nw_src, :set_nw_dst,
248
- :set_nw_tos, :set_tp_src,
249
- :set_tp_dst, :enqueue],
250
- ports: [{ port_no: 1,
251
- hardware_address: '11:22:33:44:55:66',
252
- name: 'port123',
253
- config: [:port_down],
254
- state: [:link_down],
255
- curr: [:port_10gb_fd, :port_copper] }])
256
- reply.to_binary # => Features Reply message in binary format.
257
-
258
- ### Packet-In
259
-
260
- To parse an OpenFlow 1.0 Packet-In message, use the API
261
- `Pio::PacketIn.read` and you can access each field of the parsed
262
- Packet-In message.
263
-
264
- require 'pio'
265
-
266
- packet_in = Pio::PacketIn.read(binary_data)
267
- packet_in.in_port # => 1
268
- packet_in.buffer_id # => 4294967040
269
-
270
- Also you can use `Pio::PacketIn#new` to generate a Packet-In message
271
- like below:
272
-
273
- require 'pio'
274
-
275
- data_dump = [
276
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x5d, 0x10, 0x31, 0x37,
277
- 0x79, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01,
278
- 0xac, 0x5d, 0x10, 0x31, 0x37, 0x79, 0xc0, 0xa8, 0x02, 0xfe, 0xff,
279
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa8, 0x02, 0x05, 0x00, 0x00,
280
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281
- 0x00, 0x00, 0x00, 0x00, 0x00
282
- ].pack('C*')
283
-
284
- packet_in = Pio::PacketIn.new(transaction_id: 0,
285
- buffer_id: 0xffffff00,
286
- in_port: 1,
287
- reason: :no_match,
288
- raw_data: data_dump)
289
- packet_in.to_binary # => Packet-In message in binary format.
290
-
291
- ### Packet-Out
292
-
293
- To parse an OpenFlow 1.0 Packet-Out message, use the API
294
- `Pio::PacketOut.read` and you can access each field of the parsed
295
- Packet-Out message.
296
-
297
- require 'pio'
298
-
299
- packet_out = Pio::PacketOut.read(binary_data)
300
- packet_out.actions.length # => 1
301
- packet_out.actions[0] # => Pio::SendOutPort
302
- packet_out.actions[0].port_number # => 2
303
-
304
- Also you can use `Pio::PacketOut#new` to generate a Packet-Out message
305
- like below:
306
-
307
- require 'pio'
308
-
309
- data_dump = [
310
- 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, 0x01, 0x02, 0x03, 0x04,
311
- 0x05, 0x06, 0x88, 0xcc, 0x02, 0x09, 0x07, 0x00, 0x00, 0x00,
312
- 0x00, 0x00, 0x00, 0x01, 0x23, 0x04, 0x05, 0x07, 0x00, 0x00,
313
- 0x00, 0x0c, 0x06, 0x02, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
314
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
315
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316
- 0x00, 0x00, 0x00, 0x00
317
- ].pack('C*')
318
-
319
- packet_out = Pio::PacketOut.new(transaction_id: 0x16,
320
- buffer_id: 0xffffffff,
321
- in_port: 0xffff,
322
- actions: Pio::SendOutPort.new(2),
323
- raw_data: data_dump)
324
- packet_out.to_binary # => Packet-Out message in binary format.
325
-
326
- ### Flow Mod
327
-
328
- To parse an OpenFlow 1.0 flow mod message, use the API
329
- `Pio::FlowMod.read` and you can access each field of the parsed
330
- flow mod message.
331
-
332
- require 'pio'
333
-
334
- flow_mod = Pio::FlowMod.read(binary_data)
335
- flow_mod.match.in_port # => 1
336
- flow_mod.match.dl_src # => '00:00:00:00:00:0a'
337
- # ...
338
-
339
- Also you can use `Pio::FlowMod#new` and `Pio::Match#new` to generate a
340
- flow mod message like below:
341
-
342
- require 'pio'
343
-
344
- flow_mod = Pio::FlowMod.new(transaction_id: 0x15,
345
- buffer_id: 0xffffffff,
346
- match: Pio::Match.new(in_port: 1),
347
- cookie: 1,
348
- command: :add,
349
- priority: 0xffff,
350
- out_port: 2,
351
- flags: [:send_flow_rem, :check_overwrap],
352
- actions: Pio::SendOutPort.new(2))
353
-
354
- flow_mod.to_binary # => Flow mod message in binary format.
39
+ - Pure Ruby. No additional dependency on other external tools to
40
+ parse/generate packets.
41
+ - Multi-Platform. Runs on major operating systems (recent Windows,
42
+ Linux, and MacOSX).
43
+ - Clean Code. Pio is built on
44
+ [BinData](https://github.com/dmendel/bindata)'s declarative binary
45
+ format DSL so that it is easy to read and debug by human beings.
355
46
 
356
47
  ## Installation
357
48
 
@@ -359,20 +50,24 @@ The simplest way to install Pio is to use [Bundler](http://gembundler.com/).
359
50
 
360
51
  Add Pio to your `Gemfile`:
361
52
 
362
- gem 'pio'
53
+ ```ruby
54
+ gem 'pio'
55
+ ```
363
56
 
364
57
  and install it by running Bundler:
365
58
 
366
- prompt> bundle
59
+ ```bash
60
+ bundle
61
+ ```
367
62
 
368
63
  ## Documents
369
64
 
370
- - [API document generated with YARD](http://rubydoc.info/github/trema/pio/frames/file/README.md)
65
+ - [API document generated with YARD](http://rubydoc.info/github/trema/pio/frames/file/README.md)
371
66
 
372
67
  ## Team
373
68
 
374
- - [Yasuhito Takamiya](https://github.com/yasuhito) ([@yasuhito](https://twitter.com/yasuhito))
375
- - [Eishun Kondoh](https://github.com/shun159) ([@Eishun\_Kondoh](https://twitter.com/Eishun_Kondoh))
69
+ - [Yasuhito Takamiya](https://github.com/yasuhito) ([@yasuhito](https://twitter.com/yasuhito))
70
+ - [Eishun Kondoh](https://github.com/shun159) ([@Eishun\_Kondoh](https://twitter.com/Eishun_Kondoh))
376
71
 
377
72
  ### Contributors
378
73
 
@@ -380,10 +75,11 @@ and install it by running Bundler:
380
75
 
381
76
  ## Alternatives
382
77
 
383
- - PacketFu: <https://github.com/todb/packetfu>
384
- - Racket: <http://spoofed.org/files/racket/>
78
+ - PacketFu: <https://github.com/todb/packetfu>
79
+ - Racket: <http://spoofed.org/files/racket/>
385
80
 
386
81
  ## License
387
82
 
388
83
  Pio is released under the GNU General Public License version 3.0:
389
- - <http://www.gnu.org/licenses/gpl.html>
84
+
85
+ - <http://www.gnu.org/licenses/gpl.html>
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
2
 
3
+ RELISH_PROJECT = 'trema/pio'
4
+
3
5
  # rubocop:disable HashSyntax
4
6
 
5
7
  task :default => :travis
@@ -12,3 +14,33 @@ task :quality => [:reek, :flog, :flay, :rubocop]
12
14
  # rubocop:enable HashSyntax
13
15
 
14
16
  Dir.glob('tasks/*.rake').each { |each| import each }
17
+
18
+ require 'pio/pcap'
19
+
20
+ def dump_in_hex(data)
21
+ hexdump = data.unpack('C*').map do |each|
22
+ format('0x%02x', each)
23
+ end
24
+ puts "[#{hexdump.join(', ')}]"
25
+ end
26
+
27
+ desc 'Dump packet data file in Array'
28
+ task :dump do
29
+ unless ENV['PACKET_FILE']
30
+ fail 'Usage: rake PACKET_FILE="foobar.{pcap,raw}" dump'
31
+ end
32
+ packet_file = File.join(File.dirname(__FILE__),
33
+ '../features/packet_data', ENV['PACKET_FILE'])
34
+ case File.extname(packet_file)
35
+ when '.raw'
36
+ dump_in_hex(IO.read(packet_file))
37
+ when '.pcap'
38
+ File.open(packet_file) do |file|
39
+ Pio::Pcap::Frame.read(file).records.each do |each|
40
+ dump_in_hex(each.data)
41
+ end
42
+ end
43
+ else
44
+ fail "Unsupported file extension: #{ENV['PACKET_FILE']}"
45
+ end
46
+ end