pio 0.30.0 → 0.30.1

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 (442) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +6 -49
  4. data/Rakefile +4 -4
  5. data/features/{arp.feature → arp/arp.feature} +14 -30
  6. data/features/arp/arp_reply.feature +69 -0
  7. data/features/arp/arp_request.feature +67 -0
  8. data/features/dhcp.feature +157 -162
  9. data/features/ethernet_header.feature +149 -0
  10. data/features/icmp/icmp.feature +47 -0
  11. data/features/icmp/icmp_reply.feature +93 -0
  12. data/features/icmp/icmp_request.feature +89 -0
  13. data/features/ipv4_header.feature +89 -0
  14. data/features/lldp.feature +5 -8
  15. data/features/open_flow/header.feature +13 -0
  16. data/features/open_flow/nicira_resubmit.feature +4 -22
  17. data/features/open_flow/nicira_resubmit_table.feature +6 -16
  18. data/features/open_flow10/aggregate_stats_reply.feature +5 -7
  19. data/features/open_flow10/aggregate_stats_request.feature +12 -14
  20. data/features/open_flow10/bad_request.feature +7 -24
  21. data/features/open_flow10/barrier_reply.feature +14 -25
  22. data/features/open_flow10/barrier_request.feature +12 -25
  23. data/features/open_flow10/description_stats_reply.feature +9 -7
  24. data/features/open_flow10/description_stats_request.feature +12 -25
  25. data/features/open_flow10/echo_reply.feature +14 -35
  26. data/features/open_flow10/echo_request.feature +16 -39
  27. data/features/open_flow10/enqueue.feature +3 -4
  28. data/features/open_flow10/exact_match.feature +5 -5
  29. data/features/open_flow10/features_reply.feature +28 -73
  30. data/features/open_flow10/features_request.feature +10 -28
  31. data/features/open_flow10/flow_mod.feature +4 -188
  32. data/features/open_flow10/flow_removed.feature +28 -30
  33. data/features/open_flow10/flow_stats_reply.feature +5 -89
  34. data/features/open_flow10/flow_stats_request.feature +12 -42
  35. data/features/open_flow10/hello.feature +10 -32
  36. data/features/open_flow10/hello_failed.feature +7 -57
  37. data/features/open_flow10/packet_in.feature +130 -49
  38. data/features/open_flow10/packet_out.feature +29 -18
  39. data/features/open_flow10/port_stats_request.feature +8 -29
  40. data/features/open_flow10/port_status.feature +22 -21
  41. data/features/open_flow10/queue_stats_request.feature +12 -30
  42. data/features/open_flow10/send_out_port.feature +17 -25
  43. data/features/open_flow10/set_destination_mac_address.feature +3 -4
  44. data/features/open_flow10/set_ip_destination_address.feature +3 -4
  45. data/features/open_flow10/set_source_ip_address.feature +3 -4
  46. data/features/open_flow10/set_source_mac_address.feature +3 -4
  47. data/features/open_flow10/set_tos.feature +3 -4
  48. data/features/open_flow10/set_transport_destination_port.feature +3 -4
  49. data/features/open_flow10/set_transport_source_port.feature +3 -4
  50. data/features/open_flow10/set_vlan_priority.feature +3 -4
  51. data/features/open_flow10/set_vlan_vid.feature +3 -4
  52. data/features/open_flow10/strip_vlan_header.feature +3 -4
  53. data/features/open_flow10/table_stats_request.feature +11 -13
  54. data/features/open_flow10/vendor_action.feature +4 -5
  55. data/features/open_flow13/apply_actions.feature +15 -18
  56. data/features/open_flow13/bad_request.feature +7 -13
  57. data/features/open_flow13/copy_ttl_inwards.feature +13 -0
  58. data/features/open_flow13/copy_ttl_outwards.feature +13 -0
  59. data/features/open_flow13/decrement_ip_ttl.feature +11 -0
  60. data/features/open_flow13/echo_reply.feature +16 -42
  61. data/features/open_flow13/echo_request.feature +16 -42
  62. data/features/open_flow13/features_reply.feature +4 -25
  63. data/features/open_flow13/features_request.feature +7 -36
  64. data/features/open_flow13/flow_mod.feature +16 -76
  65. data/features/open_flow13/goto_table.feature +18 -20
  66. data/features/open_flow13/hello.feature +7 -37
  67. data/features/open_flow13/hello_failed.feature +7 -30
  68. data/features/open_flow13/match.feature +239 -248
  69. data/features/open_flow13/meter.feature +18 -20
  70. data/features/open_flow13/nicira_conjunction.feature +15 -0
  71. data/features/open_flow13/nicira_reg_load.feature +27 -42
  72. data/features/open_flow13/nicira_reg_move.feature +41 -35
  73. data/features/open_flow13/nicira_send_out_port.feature +21 -13
  74. data/features/open_flow13/nicira_stack_pop.feature +26 -0
  75. data/features/open_flow13/nicira_stack_push.feature +26 -0
  76. data/features/open_flow13/packet_in.feature +7 -34
  77. data/features/open_flow13/packet_out.feature +7 -45
  78. data/features/open_flow13/send_out_port.feature +19 -28
  79. data/features/open_flow13/set_arp_operation.feature +4 -5
  80. data/features/open_flow13/set_arp_sender_hardware_address.feature +3 -4
  81. data/features/open_flow13/set_arp_sender_protocol_address.feature +3 -4
  82. data/features/open_flow13/set_destination_mac_address.feature +3 -4
  83. data/features/open_flow13/set_ip_ttl.feature +12 -0
  84. data/features/open_flow13/set_metadata.feature +3 -4
  85. data/features/open_flow13/set_source_mac_address.feature +3 -4
  86. data/features/open_flow13/stats_request.feature +4 -7
  87. data/features/open_flow13/write_metadata.feature +20 -22
  88. data/features/open_flow_read.feature +24 -5
  89. data/features/open_flow_version.feature +1 -1
  90. data/features/parser.feature +8 -9
  91. data/features/step_definitions/open_flow_steps.rb +11 -16
  92. data/features/step_definitions/packet_data_steps.rb +16 -32
  93. data/features/step_definitions/ruby_steps.rb +7 -0
  94. data/features/step_definitions/show_stats_steps.rb +3 -3
  95. data/features/support/env.rb +1 -0
  96. data/features/support/hooks.rb +2 -2
  97. data/features/udp.feature +26 -27
  98. data/lib/pio.rb +1 -1
  99. data/lib/pio/arp.rb +9 -6
  100. data/lib/pio/arp/format.rb +3 -7
  101. data/lib/pio/arp/message.rb +8 -4
  102. data/lib/pio/arp/reply.rb +9 -32
  103. data/lib/pio/arp/request.rb +9 -33
  104. data/lib/pio/class_inspector.rb +18 -0
  105. data/lib/pio/dhcp.rb +2 -2
  106. data/lib/pio/dhcp/frame.rb +4 -4
  107. data/lib/pio/dhcp/optional_tlv.rb +3 -3
  108. data/lib/pio/ethernet_frame.rb +20 -0
  109. data/lib/pio/ethernet_header.rb +35 -13
  110. data/lib/pio/icmp.rb +8 -5
  111. data/lib/pio/icmp/format.rb +19 -22
  112. data/lib/pio/icmp/message.rb +18 -4
  113. data/lib/pio/icmp/reply.rb +8 -34
  114. data/lib/pio/icmp/request.rb +8 -43
  115. data/lib/pio/instance_inspector.rb +14 -0
  116. data/lib/pio/ipv4_address.rb +11 -11
  117. data/lib/pio/ipv4_header.rb +24 -2
  118. data/lib/pio/lldp/frame.rb +2 -2
  119. data/lib/pio/lldp/optional_tlv.rb +2 -2
  120. data/lib/pio/mac.rb +7 -3
  121. data/lib/pio/message.rb +50 -0
  122. data/lib/pio/monkey_patch/bindata_record.rb +6 -0
  123. data/lib/pio/monkey_patch/bindata_string.rb +10 -0
  124. data/lib/pio/monkey_patch/integer/base_conversions.rb +1 -1
  125. data/lib/pio/monkey_patch/uint.rb +9 -0
  126. data/lib/pio/monkey_patch/uint/base_conversions.rb +14 -0
  127. data/lib/pio/open_flow.rb +38 -52
  128. data/lib/pio/open_flow/action.rb +8 -4
  129. data/lib/pio/open_flow/buffer_id.rb +19 -0
  130. data/lib/pio/open_flow/datapath_id.rb +3 -3
  131. data/lib/pio/open_flow/error_message.rb +32 -0
  132. data/lib/pio/open_flow/flags.rb +15 -6
  133. data/lib/pio/open_flow/flow_match.rb +10 -0
  134. data/lib/pio/open_flow/header.rb +26 -0
  135. data/lib/pio/open_flow/hello_failed_code.rb +1 -1
  136. data/lib/pio/open_flow/instruction.rb +10 -0
  137. data/lib/pio/open_flow/message.rb +49 -14
  138. data/lib/pio/open_flow/nicira_resubmit.rb +13 -11
  139. data/lib/pio/open_flow/nicira_resubmit_table.rb +17 -10
  140. data/lib/pio/open_flow/parser.rb +19 -0
  141. data/lib/pio/open_flow/port.rb +2 -2
  142. data/lib/pio/open_flow/transaction_id.rb +2 -2
  143. data/lib/pio/open_flow/version.rb +22 -0
  144. data/lib/pio/open_flow10/actions.rb +16 -16
  145. data/lib/pio/open_flow10/aggregate_stats/reply.rb +2 -1
  146. data/lib/pio/open_flow10/aggregate_stats/request.rb +1 -3
  147. data/lib/pio/open_flow10/barrier/reply.rb +1 -1
  148. data/lib/pio/open_flow10/barrier/request.rb +1 -1
  149. data/lib/pio/open_flow10/description_stats/reply.rb +1 -1
  150. data/lib/pio/open_flow10/description_stats/request.rb +1 -3
  151. data/lib/pio/open_flow10/echo/reply.rb +3 -3
  152. data/lib/pio/open_flow10/echo/request.rb +3 -3
  153. data/lib/pio/open_flow10/enqueue.rb +3 -3
  154. data/lib/pio/open_flow10/error.rb +3 -13
  155. data/lib/pio/open_flow10/error/bad_request.rb +5 -29
  156. data/lib/pio/open_flow10/error/bad_request/bad_request_code.rb +35 -0
  157. data/lib/pio/open_flow10/error/error_type10.rb +1 -1
  158. data/lib/pio/open_flow10/error/hello_failed.rb +6 -4
  159. data/lib/pio/open_flow10/exact_match.rb +12 -10
  160. data/lib/pio/open_flow10/features/reply.rb +16 -31
  161. data/lib/pio/open_flow10/features/request.rb +1 -4
  162. data/lib/pio/open_flow10/flow_mod.rb +8 -33
  163. data/lib/pio/open_flow10/flow_mod/command.rb +28 -0
  164. data/lib/pio/open_flow10/flow_removed.rb +2 -17
  165. data/lib/pio/open_flow10/flow_removed/reason.rb +22 -0
  166. data/lib/pio/open_flow10/flow_stats/reply.rb +3 -4
  167. data/lib/pio/open_flow10/flow_stats/request.rb +1 -3
  168. data/lib/pio/open_flow10/hello.rb +1 -4
  169. data/lib/pio/open_flow10/match.rb +13 -12
  170. data/lib/pio/open_flow10/packet_in.rb +32 -28
  171. data/lib/pio/open_flow10/packet_in/reason.rb +25 -0
  172. data/lib/pio/open_flow10/packet_out.rb +5 -6
  173. data/lib/pio/open_flow10/phy_port16.rb +36 -58
  174. data/lib/pio/open_flow10/port_stats/request.rb +1 -3
  175. data/lib/pio/open_flow10/port_status.rb +23 -30
  176. data/lib/pio/open_flow10/port_status/reason.rb +21 -0
  177. data/lib/pio/open_flow10/queue_stats/request.rb +1 -3
  178. data/lib/pio/open_flow10/send_out_port.rb +2 -2
  179. data/lib/pio/open_flow10/set_tos.rb +2 -2
  180. data/lib/pio/open_flow10/set_transport_port.rb +4 -2
  181. data/lib/pio/open_flow10/set_vlan_priority.rb +1 -1
  182. data/lib/pio/open_flow10/set_vlan_vid.rb +1 -1
  183. data/lib/pio/open_flow10/stats_reply.rb +7 -10
  184. data/lib/pio/open_flow10/stats_request.rb +16 -15
  185. data/lib/pio/open_flow10/stats_type.rb +1 -1
  186. data/lib/pio/open_flow10/table_stats/request.rb +1 -3
  187. data/lib/pio/open_flow10/vendor_action.rb +22 -20
  188. data/lib/pio/open_flow13.rb +7 -0
  189. data/lib/pio/open_flow13/actions.rb +34 -32
  190. data/lib/pio/open_flow13/apply.rb +25 -22
  191. data/lib/pio/open_flow13/copy_ttl_inwards.rb +15 -0
  192. data/lib/pio/open_flow13/copy_ttl_outwards.rb +15 -0
  193. data/lib/pio/open_flow13/decrement_ip_ttl.rb +15 -0
  194. data/lib/pio/open_flow13/echo/reply.rb +3 -3
  195. data/lib/pio/open_flow13/echo/request.rb +3 -3
  196. data/lib/pio/open_flow13/error.rb +7 -18
  197. data/lib/pio/open_flow13/error/bad_request.rb +4 -3
  198. data/lib/pio/open_flow13/error/error_type13.rb +1 -1
  199. data/lib/pio/open_flow13/error/hello_failed.rb +3 -2
  200. data/lib/pio/open_flow13/features/reply.rb +9 -16
  201. data/lib/pio/open_flow13/features/request.rb +1 -1
  202. data/lib/pio/open_flow13/flow_mod.rb +14 -19
  203. data/lib/pio/open_flow13/goto_table.rb +26 -24
  204. data/lib/pio/open_flow13/hello.rb +3 -4
  205. data/lib/pio/open_flow13/match.rb +173 -9
  206. data/lib/pio/open_flow13/meter.rb +23 -20
  207. data/lib/pio/open_flow13/nicira_conjunction.rb +26 -0
  208. data/lib/pio/open_flow13/nicira_reg_load.rb +44 -24
  209. data/lib/pio/open_flow13/nicira_reg_move.rb +77 -35
  210. data/lib/pio/open_flow13/nicira_send_out_port.rb +37 -21
  211. data/lib/pio/open_flow13/nicira_stack_pop.rb +49 -0
  212. data/lib/pio/open_flow13/nicira_stack_push.rb +49 -0
  213. data/lib/pio/open_flow13/packet_in.rb +11 -8
  214. data/lib/pio/open_flow13/packet_out.rb +9 -8
  215. data/lib/pio/open_flow13/set_ip_ttl.rb +16 -0
  216. data/lib/pio/open_flow13/stats_request.rb +2 -4
  217. data/lib/pio/open_flow13/write_metadata.rb +40 -38
  218. data/lib/pio/options.rb +8 -3
  219. data/lib/pio/parser.rb +7 -16
  220. data/lib/pio/ruby_dumper.rb +69 -0
  221. data/lib/pio/type/ether_type.rb +31 -0
  222. data/lib/pio/type/ip_address.rb +8 -0
  223. data/lib/pio/type/mac_address.rb +10 -0
  224. data/lib/pio/udp.rb +3 -3
  225. data/lib/pio/udp_header.rb +1 -1
  226. data/lib/pio/version.rb +1 -1
  227. data/pio.gemspec +5 -38
  228. data/spec/pio/arp/reply_spec.rb +0 -4
  229. data/spec/pio/arp/request_spec.rb +0 -4
  230. data/spec/pio/arp_spec.rb +0 -4
  231. data/spec/pio/icmp/reply_spec.rb +4 -8
  232. data/spec/pio/icmp/request_spec.rb +6 -10
  233. data/spec/pio/icmp_spec.rb +8 -12
  234. data/spec/pio/monkey_patch/integer_spec.rb +23 -0
  235. data/spec/pio/open_flow/nicira_resubmit_spec.rb +19 -0
  236. data/spec/pio/open_flow/nicira_resubmit_table_spec.rb +20 -0
  237. data/spec/pio/open_flow10/error/hello_failed_spec.rb +2 -2
  238. data/spec/pio/open_flow10/flow_mod_spec.rb +24 -24
  239. data/spec/pio/open_flow10/flow_stats_request_spec.rb +3 -3
  240. data/spec/pio/open_flow10/hello_spec.rb +0 -2
  241. data/spec/pio/open_flow10/match_spec.rb +38 -38
  242. data/spec/pio/open_flow10/packet_out_spec.rb +0 -349
  243. data/spec/pio/open_flow10/phy_port16_spec.rb +5 -5
  244. data/spec/pio/open_flow13/error/hello_failed_spec.rb +2 -2
  245. data/spec/pio/open_flow13/goto_table_spec.rb +2 -2
  246. data/spec/pio/open_flow13/hello_spec.rb +15 -15
  247. data/spec/pio/open_flow13/match_spec.rb +29 -29
  248. data/spec/pio/open_flow13/meter_spec.rb +2 -2
  249. data/spec/pio/open_flow13/nicira_reg_load_spec.rb +71 -0
  250. data/spec/pio/open_flow13/nicira_reg_move_spec.rb +40 -0
  251. data/spec/pio/open_flow13/nicira_send_out_port_spec.rb +29 -0
  252. data/spec/pio/open_flow13/write_metadata_spec.rb +3 -3
  253. data/spec/pio/open_flow_spec.rb +6 -6
  254. data/spec/spec_helper.rb +1 -1
  255. data/spec/support/shared_examples_for_openflow_messages.rb +5 -13
  256. metadata +191 -790
  257. data/LICENSE +0 -674
  258. data/bin/_guard-core +0 -16
  259. data/bin/byebug +0 -16
  260. data/bin/cc-tddium-post-worker +0 -16
  261. data/bin/cdiff +0 -16
  262. data/bin/coderay +0 -16
  263. data/bin/colortab +0 -16
  264. data/bin/coveralls +0 -16
  265. data/bin/cucumber +0 -16
  266. data/bin/decolor +0 -16
  267. data/bin/flay +0 -16
  268. data/bin/flog +0 -16
  269. data/bin/guard +0 -16
  270. data/bin/htmldiff +0 -16
  271. data/bin/inch +0 -16
  272. data/bin/ldiff +0 -16
  273. data/bin/listen +0 -16
  274. data/bin/minitar +0 -16
  275. data/bin/pry +0 -16
  276. data/bin/rake +0 -16
  277. data/bin/reek +0 -16
  278. data/bin/relish +0 -16
  279. data/bin/restclient +0 -16
  280. data/bin/rspec +0 -16
  281. data/bin/rubocop +0 -16
  282. data/bin/ruby-parse +0 -16
  283. data/bin/ruby-rewrite +0 -16
  284. data/bin/ruby_parse +0 -16
  285. data/bin/ruby_parse_extract_error +0 -16
  286. data/bin/sparkr +0 -16
  287. data/bin/term_display +0 -16
  288. data/bin/term_mandel +0 -16
  289. data/bin/terminal-notifier +0 -16
  290. data/bin/thor +0 -16
  291. data/bin/unparser +0 -16
  292. data/bin/yard +0 -16
  293. data/bin/yardoc +0 -16
  294. data/bin/yri +0 -16
  295. data/features/arp-storm.pcap +0 -0
  296. data/features/arp.pcap +0 -0
  297. data/features/dhcp.pcap +0 -0
  298. data/features/icmp.feature +0 -130
  299. data/features/icmp.pcap +0 -0
  300. data/features/icmpv6.pcap +0 -0
  301. data/features/lldp.detailed.pcap +0 -0
  302. data/features/lldp.minimal.pcap +0 -0
  303. data/features/open_flow10/aggregate_stats_reply.raw +0 -0
  304. data/features/open_flow10/aggregate_stats_request.raw +0 -0
  305. data/features/open_flow10/bad_request.raw +0 -0
  306. data/features/open_flow10/barrier_reply.raw +0 -0
  307. data/features/open_flow10/barrier_request.raw +0 -0
  308. data/features/open_flow10/description_stats_reply.raw +0 -0
  309. data/features/open_flow10/description_stats_request.raw +0 -0
  310. data/features/open_flow10/echo_reply.raw +0 -0
  311. data/features/open_flow10/echo_request.raw +0 -0
  312. data/features/open_flow10/error.raw +0 -0
  313. data/features/open_flow10/features_reply.raw +0 -0
  314. data/features/open_flow10/features_request.raw +0 -0
  315. data/features/open_flow10/flow_mod_add.raw +0 -0
  316. data/features/open_flow10/flow_mod_delete.raw +0 -0
  317. data/features/open_flow10/flow_mod_delete_strict.raw +0 -0
  318. data/features/open_flow10/flow_mod_modify.raw +0 -0
  319. data/features/open_flow10/flow_mod_modify_strict.raw +0 -0
  320. data/features/open_flow10/flow_removed.raw +0 -0
  321. data/features/open_flow10/flow_stats_reply.raw +0 -0
  322. data/features/open_flow10/flow_stats_request.raw +0 -0
  323. data/features/open_flow10/get_config_reply.raw +0 -0
  324. data/features/open_flow10/get_config_request.raw +0 -0
  325. data/features/open_flow10/hello.raw +0 -0
  326. data/features/open_flow10/hello_failed.raw +0 -0
  327. data/features/open_flow10/nx_flow_mod_add.raw +0 -0
  328. data/features/open_flow10/nx_flow_mod_delete.raw +0 -0
  329. data/features/open_flow10/nx_flow_mod_delete_strict.raw +0 -0
  330. data/features/open_flow10/nx_flow_mod_modify.raw +0 -0
  331. data/features/open_flow10/nx_flow_mod_modify_strict.raw +0 -0
  332. data/features/open_flow10/nxast_learn.raw +0 -0
  333. data/features/open_flow10/packet_in.raw +0 -0
  334. data/features/open_flow10/packet_in_arp_reply.raw +0 -0
  335. data/features/open_flow10/packet_in_arp_request.raw +0 -0
  336. data/features/open_flow10/packet_in_cbench.raw +0 -0
  337. data/features/open_flow10/packet_out.raw +0 -0
  338. data/features/open_flow10/port_mod.raw +0 -0
  339. data/features/open_flow10/port_stats_reply.raw +0 -0
  340. data/features/open_flow10/port_stats_request.raw +0 -0
  341. data/features/open_flow10/port_status.raw +0 -0
  342. data/features/open_flow10/queue_get_config_reply.raw +0 -0
  343. data/features/open_flow10/queue_get_config_request.raw +0 -0
  344. data/features/open_flow10/queue_stats_request.raw +0 -0
  345. data/features/open_flow10/set_config.raw +0 -0
  346. data/features/open_flow10/table_stats_reply.raw +0 -0
  347. data/features/open_flow10/table_stats_request.raw +0 -0
  348. data/features/open_flow10/vendor.raw +0 -0
  349. data/features/open_flow10/vendor_stats_request.raw +0 -0
  350. data/features/open_flow13/action_copy_ttl_in.raw +0 -0
  351. data/features/open_flow13/action_copy_ttl_out.raw +0 -0
  352. data/features/open_flow13/action_dec_mpls_ttl.raw +0 -0
  353. data/features/open_flow13/action_dec_nw_ttl.raw +0 -0
  354. data/features/open_flow13/action_group.raw +0 -0
  355. data/features/open_flow13/action_pop_mpls.raw +0 -0
  356. data/features/open_flow13/action_pop_pbb.raw +0 -0
  357. data/features/open_flow13/action_pop_vlan.raw +0 -0
  358. data/features/open_flow13/action_push_mpls.raw +0 -0
  359. data/features/open_flow13/action_push_pbb.raw +0 -0
  360. data/features/open_flow13/action_push_vlan.raw +0 -0
  361. data/features/open_flow13/action_set_field.raw +0 -0
  362. data/features/open_flow13/action_set_mpls_ttl.raw +0 -0
  363. data/features/open_flow13/action_set_nw_ttl.raw +0 -0
  364. data/features/open_flow13/action_set_queue.raw +0 -0
  365. data/features/open_flow13/apply_actions.raw +0 -0
  366. data/features/open_flow13/bad_request.raw +0 -0
  367. data/features/open_flow13/echo_reply_body.raw +0 -0
  368. data/features/open_flow13/echo_reply_no_body.raw +0 -0
  369. data/features/open_flow13/echo_request_body.raw +0 -0
  370. data/features/open_flow13/echo_request_no_body.raw +0 -0
  371. data/features/open_flow13/features_reply.raw +0 -0
  372. data/features/open_flow13/features_request.raw +0 -0
  373. data/features/open_flow13/flow_add_apply_no_match.raw +0 -0
  374. data/features/open_flow13/flow_mod_add_apply_no_match.raw +0 -0
  375. data/features/open_flow13/flow_mod_no_match_or_instructions.raw +0 -0
  376. data/features/open_flow13/hello_failed.raw +0 -0
  377. data/features/open_flow13/hello_no_version_bitmap.raw +0 -0
  378. data/features/open_flow13/hello_version_bitmap.raw +0 -0
  379. data/features/open_flow13/instruction_clear_actions.raw +0 -0
  380. data/features/open_flow13/instruction_goto_table.raw +0 -0
  381. data/features/open_flow13/instruction_meter.raw +0 -0
  382. data/features/open_flow13/instruction_write_actions.raw +0 -0
  383. data/features/open_flow13/instruction_write_metadata.raw +0 -0
  384. data/features/open_flow13/oxm_arp_op_field.raw +0 -0
  385. data/features/open_flow13/oxm_arp_sha_field.raw +0 -0
  386. data/features/open_flow13/oxm_arp_spa_field.raw +0 -0
  387. data/features/open_flow13/oxm_arp_tha_field.raw +0 -0
  388. data/features/open_flow13/oxm_arp_tpa_field.raw +0 -0
  389. data/features/open_flow13/oxm_ether_destination_field.raw +0 -0
  390. data/features/open_flow13/oxm_ether_source_field.raw +0 -0
  391. data/features/open_flow13/oxm_ether_type_field.raw +0 -0
  392. data/features/open_flow13/oxm_experimenter_stratos_basic_dot11.raw +0 -0
  393. data/features/open_flow13/oxm_icmpv4_code_field.raw +0 -0
  394. data/features/open_flow13/oxm_icmpv4_type_field.raw +0 -0
  395. data/features/open_flow13/oxm_in_phy_port_field.raw +0 -0
  396. data/features/open_flow13/oxm_in_port_field.raw +0 -0
  397. data/features/open_flow13/oxm_invalid_field.raw +0 -0
  398. data/features/open_flow13/oxm_ip_dscp_field.raw +0 -0
  399. data/features/open_flow13/oxm_ip_ecn_field.raw +0 -0
  400. data/features/open_flow13/oxm_ipv4_destination_field.raw +0 -0
  401. data/features/open_flow13/oxm_ipv4_source_field.raw +0 -0
  402. data/features/open_flow13/oxm_ipv6_destination_field.raw +0 -0
  403. data/features/open_flow13/oxm_ipv6_source_field.raw +0 -0
  404. data/features/open_flow13/oxm_masked_arp_sha_field.raw +0 -0
  405. data/features/open_flow13/oxm_masked_arp_spa_field.raw +0 -0
  406. data/features/open_flow13/oxm_masked_arp_tha_field.raw +0 -0
  407. data/features/open_flow13/oxm_masked_arp_tpa_field.raw +0 -0
  408. data/features/open_flow13/oxm_masked_ether_destination_field.raw +0 -0
  409. data/features/open_flow13/oxm_masked_ether_source_field.raw +0 -0
  410. data/features/open_flow13/oxm_masked_ipv4_destination_field.raw +0 -0
  411. data/features/open_flow13/oxm_masked_ipv4_source_field.raw +0 -0
  412. data/features/open_flow13/oxm_masked_ipv6_destination_field.raw +0 -0
  413. data/features/open_flow13/oxm_masked_ipv6_source_field.raw +0 -0
  414. data/features/open_flow13/oxm_masked_tunnel_id_field.raw +0 -0
  415. data/features/open_flow13/oxm_metadata_field.raw +0 -0
  416. data/features/open_flow13/oxm_metadata_masked_field.raw +0 -0
  417. data/features/open_flow13/oxm_no_fields.raw +0 -0
  418. data/features/open_flow13/oxm_sctp_destination_field.raw +0 -0
  419. data/features/open_flow13/oxm_sctp_source_field.raw +0 -0
  420. data/features/open_flow13/oxm_tcp_destination_field.raw +0 -0
  421. data/features/open_flow13/oxm_tcp_field.raw +0 -0
  422. data/features/open_flow13/oxm_tcp_source_field.raw +0 -0
  423. data/features/open_flow13/oxm_tunnel_id_field.raw +0 -0
  424. data/features/open_flow13/oxm_udp_destination_field.raw +0 -0
  425. data/features/open_flow13/oxm_udp_field.raw +0 -0
  426. data/features/open_flow13/oxm_udp_source_field.raw +0 -0
  427. data/features/open_flow13/oxm_vlan_pcp_field.raw +0 -0
  428. data/features/open_flow13/oxm_vlan_vid_field.raw +0 -0
  429. data/features/open_flow13/packet_in.raw +0 -0
  430. data/features/open_flow13/packet_out.raw +0 -0
  431. data/features/open_flow13/send_out_port.raw +0 -0
  432. data/features/open_flow13/table_stats_reply.raw +0 -0
  433. data/features/open_flow13/table_stats_request.raw +0 -0
  434. data/features/step_definitions/LICENSE +0 -675
  435. data/features/udp_no_payload.raw +0 -0
  436. data/features/udp_with_payload.raw +0 -0
  437. data/lib/pio/icmp/options.rb +0 -21
  438. data/lib/pio/open_flow/error.rb +0 -19
  439. data/lib/pio/open_flow/open_flow_header.rb +0 -31
  440. data/lib/pio/open_flow13/buffer_id.rb +0 -17
  441. data/spec/pio/arp/reply/options_spec.rb +0 -143
  442. data/spec/pio/arp/request/options_spec.rb +0 -113
@@ -1,6 +1,7 @@
1
+ require 'active_support/core_ext/object/try'
1
2
  require 'pio/open_flow'
3
+ require 'pio/open_flow/buffer_id'
2
4
  require 'pio/open_flow13/actions'
3
- require 'pio/open_flow13/buffer_id'
4
5
 
5
6
  module Pio
6
7
  module OpenFlow13
@@ -14,7 +15,7 @@ module Pio
14
15
  uint32 :in_port
15
16
 
16
17
  def get
17
- (in_port == CONTROLLER) ? :controller : in_port
18
+ in_port == CONTROLLER ? :controller : in_port
18
19
  end
19
20
 
20
21
  def set(value)
@@ -22,24 +23,24 @@ module Pio
22
23
  end
23
24
  end
24
25
 
25
- open_flow_header(version: 4,
26
- message_type: 13,
27
- message_length: lambda do
26
+ open_flow_header(version: 4, type: 13,
27
+ length: lambda do
28
28
  24 + actions_length + raw_data.length
29
29
  end)
30
30
  buffer_id :buffer_id
31
31
  in_port :in_port
32
32
  uint16 :actions_length, initial_value: -> { actions.binary.length }
33
33
  string :padding, length: 6
34
- actions :actions, length: :actions_length
35
- string :raw_data, read_length: -> { message_length - 24 - actions_length }
34
+ actions13 :actions, length: :actions_length
35
+ string :raw_data, read_length: -> { length - 24 - actions_length }
36
36
 
37
37
  def data
38
38
  @data ||= Pio::Parser.read(raw_data)
39
39
  end
40
40
 
41
41
  def method_missing(method, *args)
42
- data.__send__(method, *args).snapshot
42
+ bindata_value = data.__send__(method, *args)
43
+ bindata_value.try(:snapshot) || bindata_value
43
44
  end
44
45
  end
45
46
  end
@@ -0,0 +1,16 @@
1
+ require 'pio/open_flow/action'
2
+
3
+ module Pio
4
+ module OpenFlow13
5
+ # Sets IP TTL
6
+ class SetIpTtl < OpenFlow::Action
7
+ action_header action_type: 23, action_length: 8
8
+ uint8 :ttl
9
+ string :padding, length: 3
10
+
11
+ def initialize(ttl)
12
+ super(ttl: ttl)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -12,7 +12,7 @@ module Pio
12
12
  :table,
13
13
  :port,
14
14
  :queue,
15
- :vendor]
15
+ :vendor].freeze
16
16
 
17
17
  endian :big
18
18
 
@@ -27,9 +27,7 @@ module Pio
27
27
  end
28
28
  end
29
29
 
30
- open_flow_header version: 4,
31
- message_type: 16,
32
- message_length: 12
30
+ open_flow_header version: 4, type: 16, length: 12
33
31
  stats_type :stats_type
34
32
  uint16 :stats_flags
35
33
  end
@@ -1,52 +1,54 @@
1
1
  require 'forwardable'
2
+ require 'pio/open_flow/action'
2
3
 
3
- # Base module.
4
4
  module Pio
5
- # Write metadata
6
- class WriteMetadata
7
- # OpenFlow 1.3.4 OFPIT_WRITE_METADATA instruction format
8
- class Format < BinData::Record
9
- endian :big
10
-
11
- uint16 :instruction_type, value: 2
12
- uint16 :instruction_length, value: 24
13
- uint32 :padding
14
- uint64 :metadata
15
- uint64 :metadata_mask
16
- end
5
+ module OpenFlow13
6
+ # Write metadata
7
+ class WriteMetadata < OpenFlow::Action
8
+ # OpenFlow 1.3.4 OFPIT_WRITE_METADATA instruction format
9
+ class Format < BinData::Record
10
+ endian :big
11
+
12
+ uint16 :instruction_type, value: 2
13
+ uint16 :instruction_length, value: 24
14
+ uint32 :padding
15
+ uint64 :metadata
16
+ uint64 :metadata_mask
17
+ end
17
18
 
18
- def self.read(raw_data)
19
- allocate.tap do |write_metadata|
20
- write_metadata.instance_variable_set :@format, Format.read(raw_data)
19
+ def self.read(raw_data)
20
+ allocate.tap do |write_metadata|
21
+ write_metadata.instance_variable_set :@format, Format.read(raw_data)
22
+ end
21
23
  end
22
- end
23
24
 
24
- extend Forwardable
25
+ extend Forwardable
25
26
 
26
- def_delegators :@format, :instruction_type
27
- def_delegators :@format, :instruction_length
28
- def_delegators :@format, :metadata
29
- def_delegators :@format, :metadata_mask
30
- def_delegators :@format, :to_binary_s
27
+ def_delegators :@format, :instruction_type
28
+ def_delegators :@format, :instruction_length
29
+ def_delegators :@format, :metadata
30
+ def_delegators :@format, :metadata_mask
31
+ def_delegators :@format, :to_binary_s
31
32
 
32
- def initialize(user_options)
33
- @options = user_options
34
- @format = Format.new(options)
35
- end
33
+ def initialize(user_options)
34
+ @options = user_options
35
+ @format = Format.new(options)
36
+ end
36
37
 
37
- def options
38
- {
39
- metadata: metadata_option,
40
- metadata_mask: metadata_mask_option
41
- }
42
- end
38
+ def options
39
+ {
40
+ metadata: metadata_option,
41
+ metadata_mask: metadata_mask_option
42
+ }
43
+ end
43
44
 
44
- def metadata_option
45
- @options[:metadata]
46
- end
45
+ def metadata_option
46
+ @options[:metadata]
47
+ end
47
48
 
48
- def metadata_mask_option
49
- @options[:metadata_mask]
49
+ def metadata_mask_option
50
+ @options[:metadata_mask]
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -14,6 +14,11 @@ module Pio
14
14
  const_get(:OPTIONS) << name
15
15
  end
16
16
 
17
+ def initialize(options)
18
+ validate options
19
+ @options = options
20
+ end
21
+
17
22
  private
18
23
 
19
24
  def validate(user_options)
@@ -42,7 +47,7 @@ module Pio
42
47
  def check_unknown(user_options)
43
48
  valid_options = mandatory_options + options
44
49
  user_options.keys.each do |each|
45
- fail "Unknown option: #{each}." unless valid_options.include?(each)
50
+ raise "Unknown option: #{each}." unless valid_options.include?(each)
46
51
  end
47
52
  end
48
53
 
@@ -54,10 +59,10 @@ module Pio
54
59
 
55
60
  def check_existence(user_options, key)
56
61
  value = user_options.fetch(key) do |missing_key|
57
- fail ArgumentError, "The #{missing_key} option should be passed."
62
+ raise ArgumentError, "The #{missing_key} option should be passed."
58
63
  end
59
64
  return if value
60
- fail(ArgumentError, "The #{key} option shouldn't be #{value.inspect}.")
65
+ raise(ArgumentError, "The #{key} option shouldn't be #{value.inspect}.")
61
66
  end
62
67
  end
63
68
  end
@@ -1,27 +1,18 @@
1
+ require 'pio/ethernet_frame'
1
2
  require 'pio/ethernet_header'
2
3
  require 'pio/ipv4_header'
3
4
 
4
5
  module Pio
5
6
  # Raw data parser.
6
7
  class Parser
7
- # Ethernet header parser
8
- class EthernetFrame < BinData::Record
9
- endian :big
10
-
11
- mac_address :destination_mac
12
- mac_address :source_mac
13
- uint16 :ether_type
14
- rest :rest
15
- end
16
-
17
8
  # IPv4 packet parser
18
9
  class IPv4Packet < BinData::Record
19
- include EthernetHeader
20
- include IPv4Header
10
+ include Ethernet
11
+ include IPv4
21
12
 
22
13
  endian :big
23
14
 
24
- ethernet_header ether_type: EtherType::IPV4
15
+ ethernet_header ether_type: Ethernet::Type::IPV4
25
16
  ipv4_header
26
17
 
27
18
  uint16 :transport_source_port
@@ -33,11 +24,11 @@ module Pio
33
24
  def self.read(raw_data)
34
25
  ethernet_frame = EthernetFrame.read(raw_data)
35
26
  case ethernet_frame.ether_type
36
- when EthernetHeader::EtherType::IPV4, EthernetHeader::EtherType::VLAN
27
+ when Ethernet::Type::IPV4, Ethernet::Type::VLAN
37
28
  IPv4Packet.read raw_data
38
- when EthernetHeader::EtherType::ARP
29
+ when Ethernet::Type::ARP
39
30
  Pio::Arp.read raw_data
40
- when EthernetHeader::EtherType::LLDP
31
+ when Ethernet::Type::LLDP
41
32
  Pio::Lldp.read raw_data
42
33
  else
43
34
  ethernet_frame
@@ -0,0 +1,69 @@
1
+ module Pio
2
+ # defines to_ruby method
3
+ module RubyDumper
4
+ # Returns a Ruby code representation of this packet, such that
5
+ # it can be eval'ed and sent later.
6
+ #
7
+ # rubocop:disable AbcSize
8
+ # rubocop:disable MethodLength
9
+ # rubocop:disable CyclomaticComplexity
10
+ # rubocop:disable PerceivedComplexity
11
+ def to_ruby
12
+ pack_template = ''
13
+ bytes = ''
14
+ bit = false
15
+ bit_names = []
16
+ total_bit_length = 0
17
+ field_names.each do |each|
18
+ next unless __send__("#{each}?")
19
+ if /Bit(\d+)$/ =~ __send__(each).class.to_s
20
+ bit_length = Regexp.last_match(1).to_i
21
+ total_bit_length += bit_length
22
+ if bit
23
+ bit_names << each
24
+ bytes << format("_%0#{bit_length}b", __send__(each))
25
+ else
26
+ bit_names = [each]
27
+ bytes << format(" 0b%0#{bit_length}b", __send__(each))
28
+ end
29
+ bit = true
30
+ else
31
+ if bit
32
+ bytes << ", # #{bit_names.join(', ')}\n"
33
+ if total_bit_length == 8
34
+ pack_template << 'C'
35
+ elsif total_bit_length == 16
36
+ pack_template << 'n'
37
+ else
38
+ raise
39
+ end
40
+ total_bit_length = 0
41
+ bit_names = []
42
+ bit = false
43
+ end
44
+ list = (@format || self).__send__(each).to_bytes
45
+ next if list.empty?
46
+ bytes << " #{list}, # #{each}\n"
47
+ pack_template << 'C' * (list.count(',') + 1)
48
+ end
49
+ end.compact
50
+
51
+ template = ''
52
+ until pack_template.empty?
53
+ if /^(.)(\1+)/ =~ pack_template
54
+ pack_template.sub!(/^(.)(\1+)/, '')
55
+ template <<
56
+ "#{Regexp.last_match(1)}#{Regexp.last_match(2).length + 1}"
57
+ else
58
+ pack_template.sub!(/^(.)/, '')
59
+ template << Regexp.last_match(1)
60
+ end
61
+ end
62
+ "[\n#{bytes}].pack('#{template}')"
63
+ end
64
+ # rubocop:enable AbcSize
65
+ # rubocop:enable MethodLength
66
+ # rubocop:enable CyclomaticComplexity
67
+ # rubocop:enable PerceivedComplexity
68
+ end
69
+ end
@@ -0,0 +1,31 @@
1
+ require 'bindata'
2
+
3
+ module Pio
4
+ module Type
5
+ # Ether type
6
+ class EtherType < BinData::Primitive
7
+ endian :big
8
+
9
+ uint16 :ether_type
10
+
11
+ def set(value)
12
+ self.ether_type = value
13
+ end
14
+
15
+ def get
16
+ ether_type
17
+ end
18
+
19
+ # This method smells of :reek:UncommunicativeVariableName
20
+ def to_bytes
21
+ byte1 = format('%02x', (self & 0xff00) >> 8)
22
+ byte2 = format('%02x', self & 0xff)
23
+ "0x#{byte1}, 0x#{byte2}"
24
+ end
25
+
26
+ def inspect
27
+ Kernel.format '0x%04x', self
28
+ end
29
+ end
30
+ end
31
+ end
@@ -26,6 +26,14 @@ module Pio
26
26
  def ==(other)
27
27
  get == other
28
28
  end
29
+
30
+ def to_bytes
31
+ octets.map(&:to_hex).join(', ')
32
+ end
33
+
34
+ def inspect
35
+ %("#{get}")
36
+ end
29
37
  end
30
38
  end
31
39
  end
@@ -1,5 +1,7 @@
1
1
  require 'bindata'
2
2
  require 'pio/mac'
3
+ require 'pio/monkey_patch/integer'
4
+ require 'pio/monkey_patch/uint'
3
5
 
4
6
  module Pio
5
7
  module Type
@@ -16,6 +18,14 @@ module Pio
16
18
  str + format('%02x', each)
17
19
  end.hex)
18
20
  end
21
+
22
+ def to_bytes
23
+ octets.map(&:to_hex).join(', ')
24
+ end
25
+
26
+ def inspect
27
+ %("#{get}")
28
+ end
19
29
  end
20
30
  end
21
31
  end
@@ -6,12 +6,12 @@ require 'pio/udp_header'
6
6
  module Pio
7
7
  # UDP packet format
8
8
  class Udp < BinData::Record
9
- include EthernetHeader
10
- include IPv4Header
9
+ include Ethernet
10
+ include IPv4
11
11
  include UdpHeader
12
12
 
13
13
  endian :big
14
- ethernet_header ether_type: EtherType::IPV4
14
+ ethernet_header ether_type: Ethernet::Type::IPV4
15
15
  ipv4_header ip_protocol: ProtocolNumber::UDP
16
16
  udp_header
17
17
  rest :udp_payload
@@ -11,7 +11,7 @@ module Pio
11
11
  ip_address :source_ip_address
12
12
  ip_address :destination_ip_address
13
13
  uint8 :padding
14
- uint8 :ip_protocol, value: IPv4Header::ProtocolNumber::UDP
14
+ uint8 :ip_protocol, value: IPv4::ProtocolNumber::UDP
15
15
  uint16 :udp_length
16
16
  end
17
17
 
@@ -1,5 +1,5 @@
1
1
  # Base module.
2
2
  module Pio
3
3
  # gem version.
4
- VERSION = '0.30.0'.freeze
4
+ VERSION = '0.30.1'.freeze
5
5
  end
@@ -8,57 +8,24 @@ Gem::Specification.new do |gem|
8
8
  gem.summary = 'Packet parser and generator.'
9
9
  gem.description = 'Pure ruby packet parser and generator.'
10
10
 
11
- gem.license = 'GPL3'
11
+ gem.licenses = %w(GPLv2 MIT)
12
12
 
13
13
  gem.authors = ['Yasuhito Takamiya']
14
14
  gem.email = ['yasuhito@gmail.com']
15
15
  gem.homepage = 'http://github.com/trema/pio'
16
16
 
17
- gem.files = %w(CONTRIBUTING.md LICENSE Rakefile pio.gemspec)
17
+ gem.files = %w(CONTRIBUTING.md Rakefile pio.gemspec)
18
18
  gem.files += Dir.glob('lib/**/*.rb')
19
- gem.files += Dir.glob('bin/**/*')
20
19
  gem.files += Dir.glob('spec/**/*')
21
- gem.files += Dir.glob('examples/**/*')
22
20
 
23
21
  gem.require_paths = ['lib']
24
22
 
25
- gem.extra_rdoc_files = %w(README.md CHANGELOG.md LICENSE CONTRIBUTING.md)
23
+ gem.extra_rdoc_files = %w(README.md CHANGELOG.md CONTRIBUTING.md)
26
24
  gem.test_files = Dir.glob('spec/**/*')
27
25
  gem.test_files += Dir.glob('features/**/*')
28
26
 
29
- gem.required_ruby_version = '>= 2.0.0'
27
+ gem.required_ruby_version = '>= 2.2.2'
30
28
 
31
29
  gem.add_dependency 'bindata', '~> 2.1.0'
32
- gem.add_dependency 'activesupport', '~> 4.2', '>= 4.2.4'
33
-
34
- gem.add_development_dependency 'bundler', '~> 1.10.6'
35
- gem.add_development_dependency 'pry', '~> 0.10.3'
36
- gem.add_development_dependency 'rake'
37
-
38
- # Guard
39
- gem.add_development_dependency 'guard', '~> 2.13.0'
40
- gem.add_development_dependency 'guard-bundler', '~> 2.1.0'
41
- gem.add_development_dependency 'guard-cucumber', '~> 1.6.0'
42
- gem.add_development_dependency 'guard-rspec', '~> 4.6.4'
43
- gem.add_development_dependency 'guard-rubocop', '~> 1.2.0'
44
- gem.add_development_dependency 'rb-fchange', '~> 0.0.6'
45
- gem.add_development_dependency 'rb-fsevent', '~> 0.9.6'
46
- gem.add_development_dependency 'rb-inotify', '~> 0.9.5'
47
- gem.add_development_dependency 'terminal-notifier-guard', '~> 1.6.4'
48
-
49
- # Docs
50
- gem.add_development_dependency 'inch', '~> 0.7.0'
51
- gem.add_development_dependency 'relish', '~> 0.7.1'
52
- gem.add_development_dependency 'yard', '~> 0.8.7.6'
53
-
54
- # Test
55
- gem.add_development_dependency 'codeclimate-test-reporter', '~> 0.4.8'
56
- gem.add_development_dependency 'coveralls', '~> 0.8.3'
57
- gem.add_development_dependency 'cucumber', '~> 2.1.0'
58
- gem.add_development_dependency 'flay', '~> 2.6.1'
59
- gem.add_development_dependency 'flog', '~> 4.3.2'
60
- gem.add_development_dependency 'reek', '~> 3.6.0'
61
- gem.add_development_dependency 'rspec', '~> 3.3.0'
62
- gem.add_development_dependency 'rspec-given', '~> 3.7.1'
63
- gem.add_development_dependency 'rubocop', '~> 0.34.2'
30
+ gem.add_dependency 'activesupport', '~> 5.0.2'
64
31
  end