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
@@ -0,0 +1,7 @@
1
+ When(/^I eval the following Ruby code:$/) do |ruby_code|
2
+ @result = Pio.module_eval(ruby_code)
3
+ end
4
+
5
+ Then(/^the result of eval should be:$/) do |expected|
6
+ expect(@result.to_s).to eq expected
7
+ end
@@ -15,7 +15,7 @@ Then(/^the number of packets sent from "(.*?)" should be:$/) do |host_name, tabl
15
15
  when /-> (\S+) = (\d+) packet/
16
16
  result[Regexp.last_match(1)] = Regexp.last_match(2).to_i
17
17
  else
18
- fail "Failed to parse line '#{each}'"
18
+ raise "Failed to parse line '#{each}'"
19
19
  end
20
20
  end
21
21
  end
@@ -43,7 +43,7 @@ Then(/^the number of packets received by "(.*?)" should be:$/) do |host_name, ta
43
43
  next unless received
44
44
  result[Regexp.last_match(1)] = Regexp.last_match(3).to_i
45
45
  else
46
- fail "Failed to parse line '#{each}'"
46
+ raise "Failed to parse line '#{each}'"
47
47
  end
48
48
  end
49
49
  end
@@ -72,7 +72,7 @@ Then(/^the total number of received packets should be:$/) do |table|
72
72
  next unless received
73
73
  result += Regexp.last_match(3).to_i
74
74
  else
75
- fail "Failed to parse line '#{each}'"
75
+ raise "Failed to parse line '#{each}'"
76
76
  end
77
77
  end
78
78
  end
@@ -1,5 +1,6 @@
1
1
  require 'coveralls'
2
2
  Coveralls.wear!
3
3
 
4
+ require 'aruba/cucumber'
4
5
  require 'pio'
5
6
  require 'pio/pcap'
@@ -1,7 +1,7 @@
1
1
  Before('@open_flow10') do
2
- Pio::OpenFlow.switch_version :OpenFlow10
2
+ Pio::OpenFlow.version = :OpenFlow10
3
3
  end
4
4
 
5
5
  Before('@open_flow13') do
6
- Pio::OpenFlow.switch_version :OpenFlow13
6
+ Pio::OpenFlow.version = :OpenFlow13
7
7
  end
@@ -1,28 +1,27 @@
1
- Feature: Pio::Udp
1
+ Feature: Udp
2
2
  Scenario: parse dhcp.pcap
3
- When I try to parse a file named "dhcp.pcap" with "Pio::Udp" class
4
- Then it should finish successfully
5
- And the message #1 have the following fields and values:
6
- | field | value |
7
- | class | Pio::Udp |
8
- | destination_mac | ff:ff:ff:ff:ff:ff |
9
- | source_mac | 00:0b:82:01:fc:42 |
10
- | ether_type | 2048 |
11
- | ip_version | 4 |
12
- | ip_header_length | 5 |
13
- | ip_type_of_service | 0 |
14
- | ip_total_length | 300 |
15
- | ip_identifier | 43062 |
16
- | ip_flag | 0 |
17
- | ip_fragment | 0 |
18
- | ip_ttl | 250 |
19
- | ip_protocol | 17 |
20
- | ip_header_checksum | 6027 |
21
- | source_ip_address | 0.0.0.0 |
22
- | destination_ip_address | 255.255.255.255 |
23
- | ip_option | |
24
- | udp_source_port | 68 |
25
- | udp_destination_port | 67 |
26
- | udp_length | 280 |
27
- | udp_checksum | 22815 |
28
- | udp_payload.length | 272 |
3
+ When I parse a file named "dhcp.pcap" with "Pio::Udp" class
4
+ Then the message #1 have the following fields and values:
5
+ | field | value |
6
+ | class | Pio::Udp |
7
+ | destination_mac | ff:ff:ff:ff:ff:ff |
8
+ | source_mac | 00:0b:82:01:fc:42 |
9
+ | ether_type.to_hex | 0x800 |
10
+ | ip_version | 4 |
11
+ | ip_header_length | 5 |
12
+ | ip_type_of_service | 0 |
13
+ | ip_total_length | 300 |
14
+ | ip_identifier | 43062 |
15
+ | ip_flag | 0 |
16
+ | ip_fragment | 0 |
17
+ | ip_ttl | 250 |
18
+ | ip_protocol | 17 |
19
+ | ip_header_checksum | 6027 |
20
+ | source_ip_address | 0.0.0.0 |
21
+ | destination_ip_address | 255.255.255.255 |
22
+ | ip_option | |
23
+ | udp_source_port | 68 |
24
+ | udp_destination_port | 67 |
25
+ | udp_length | 280 |
26
+ | udp_checksum | 22815 |
27
+ | udp_payload.length | 272 |
data/lib/pio.rb CHANGED
@@ -5,5 +5,5 @@ require 'pio/dhcp'
5
5
  require 'pio/icmp'
6
6
  require 'pio/lldp'
7
7
  require 'pio/mac'
8
- require 'pio/open_flow'
9
8
  require 'pio/udp'
9
+ require 'pio/open_flow'
@@ -1,14 +1,17 @@
1
1
  require 'pio/arp/format'
2
- require 'pio/arp/request'
3
2
  require 'pio/arp/reply'
4
- require 'pio/message_type_selector'
3
+ require 'pio/arp/request'
4
+ require 'pio/parse_error'
5
5
 
6
- # Packet parser and generator library.
7
6
  module Pio
8
7
  # ARP parser and generator.
9
8
  class Arp
10
- extend MessageTypeSelector
11
- message_type Request::OPERATION => Request, Reply::OPERATION => Reply
9
+ def self.read(raw_data)
10
+ format = Format.read(raw_data)
11
+ { Request.operation => Request,
12
+ Reply.operation => Reply }.fetch(format.operation).create(format)
13
+ rescue
14
+ raise Pio::ParseError, $ERROR_INFO.message
15
+ end
12
16
  end
13
- ARP = Arp
14
17
  end
@@ -8,11 +8,11 @@ module Pio
8
8
  class Arp
9
9
  # ARP parser.
10
10
  class Format < BinData::Record
11
- include EthernetHeader
11
+ include Ethernet
12
12
 
13
13
  endian :big
14
14
 
15
- ethernet_header ether_type: EtherType::ARP
15
+ ethernet_header ether_type: Ethernet::Type::ARP
16
16
  uint16 :hardware_type, value: 1
17
17
  uint16 :protocol_type, value: 0x0800
18
18
  uint8 :hardware_length, value: 6
@@ -23,17 +23,13 @@ module Pio
23
23
  mac_address :target_hardware_address
24
24
  ip_address :target_protocol_address
25
25
 
26
- def message_type
27
- operation
28
- end
29
-
30
26
  # rubocop:disable MethodLength
31
27
  def to_exact_match(in_port)
32
28
  match_options = {
33
29
  in_port: in_port,
34
30
  source_mac_address: source_mac,
35
31
  destination_mac_address: destination_mac,
36
- vlan_vid: vlan_vid,
32
+ vlan_vid: 0xffff,
37
33
  vlan_priority: vlan_pcp,
38
34
  ether_type: ether_type,
39
35
  tos: 0,
@@ -1,14 +1,18 @@
1
1
  require 'pio/arp/format'
2
+ require 'pio/message'
2
3
 
3
4
  module Pio
4
5
  class Arp
5
6
  # Base class of ARP Request and Reply
6
- class Message
7
- private_class_method :new
7
+ class Message < Pio::Message
8
+ def self.create(format)
9
+ allocate.tap do |message|
10
+ message.instance_variable_set :@format, format
11
+ end
12
+ end
8
13
 
9
14
  def initialize(user_options)
10
- options = self.class.const_get(:Options).new(user_options.dup.freeze)
11
- @format = Arp::Format.new(options.to_hash)
15
+ @format = Arp::Format.new(parse_options(user_options))
12
16
  end
13
17
 
14
18
  def method_missing(method, *args)
@@ -1,43 +1,20 @@
1
1
  require 'pio/arp/message'
2
+ require 'pio/instance_inspector'
2
3
  require 'pio/mac'
3
- require 'pio/options'
4
4
 
5
5
  module Pio
6
6
  class Arp
7
7
  # ARP Reply packet generator
8
8
  class Reply < Message
9
- OPERATION = 2
10
- public_class_method :new
9
+ include InstanceInspector
11
10
 
12
- # User options for creating an Arp Reply.
13
- class Options < Pio::Options
14
- mandatory_option :source_mac
15
- mandatory_option :destination_mac
16
- mandatory_option :sender_protocol_address
17
- mandatory_option :target_protocol_address
18
-
19
- def initialize(options)
20
- validate options
21
- @source_mac = Mac.new(options[:source_mac]).freeze
22
- @destination_mac = Mac.new(options[:destination_mac]).freeze
23
- @sender_protocol_address =
24
- IPv4Address.new(options[:sender_protocol_address]).freeze
25
- @target_protocol_address =
26
- IPv4Address.new(options[:target_protocol_address]).freeze
27
- end
28
-
29
- def to_hash
30
- {
31
- operation: OPERATION,
32
- source_mac: @source_mac,
33
- destination_mac: @destination_mac,
34
- sender_hardware_address: @source_mac,
35
- target_hardware_address: @destination_mac,
36
- sender_protocol_address: @sender_protocol_address,
37
- target_protocol_address: @target_protocol_address
38
- }.freeze
39
- end
40
- end
11
+ option :operation, value: 2
12
+ option :source_mac
13
+ option :destination_mac
14
+ option :sender_hardware_address, value: :source_mac
15
+ option :target_hardware_address, value: :destination_mac
16
+ option :sender_protocol_address
17
+ option :target_protocol_address
41
18
  end
42
19
  end
43
20
  end
@@ -1,44 +1,20 @@
1
1
  require 'pio/arp/message'
2
+ require 'pio/instance_inspector'
2
3
  require 'pio/mac'
3
- require 'pio/options'
4
4
 
5
5
  module Pio
6
6
  class Arp
7
7
  # ARP Request packet generator
8
8
  class Request < Message
9
- OPERATION = 1
10
- public_class_method :new
9
+ include InstanceInspector
11
10
 
12
- # User options for creating an Arp Request.
13
- class Options < Pio::Options
14
- mandatory_option :source_mac
15
- mandatory_option :sender_protocol_address
16
- mandatory_option :target_protocol_address
17
-
18
- BROADCAST_MAC = Mac.new(0xffffffffffff).freeze
19
- ALL_ZERO_MAC = Mac.new(0).freeze
20
-
21
- def initialize(options)
22
- validate options
23
- @source_mac = Mac.new(options[:source_mac]).freeze
24
- @sender_protocol_address =
25
- IPv4Address.new(options[:sender_protocol_address]).freeze
26
- @target_protocol_address =
27
- IPv4Address.new(options[:target_protocol_address]).freeze
28
- end
29
-
30
- def to_hash
31
- {
32
- operation: OPERATION,
33
- source_mac: @source_mac,
34
- destination_mac: BROADCAST_MAC,
35
- sender_hardware_address: @source_mac,
36
- target_hardware_address: ALL_ZERO_MAC,
37
- sender_protocol_address: @sender_protocol_address,
38
- target_protocol_address: @target_protocol_address
39
- }.freeze
40
- end
41
- end
11
+ option :operation, value: 1
12
+ option :source_mac
13
+ option :destination_mac, default: 'ff:ff:ff:ff:ff:ff'.freeze
14
+ option :sender_hardware_address, value: :source_mac
15
+ option :target_hardware_address, default: '00:00:00:00:00:00'.freeze
16
+ option :sender_protocol_address
17
+ option :target_protocol_address
42
18
  end
43
19
  end
44
20
  end
@@ -0,0 +1,18 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+
3
+ module Pio
4
+ # Introduces Class.inspect method
5
+ module ClassInspector
6
+ # rubocop:disable LineLength
7
+ def inspect
8
+ field_and_type = fields.each_with_object([]) do |each, result|
9
+ next if each.name == :padding
10
+ result << [each.name,
11
+ each.prototype.instance_variable_get(:@obj_class).name.demodulize.sub(/be$/, '').underscore]
12
+ end
13
+ signature = field_and_type.map { |field, type| "#{field}: #{type}" }.join(', ')
14
+ "#{self}(#{signature})"
15
+ end
16
+ # rubocop:enable LineLength
17
+ end
18
+ end
@@ -22,7 +22,7 @@ module Pio
22
22
  ROUTER_TLV,
23
23
  DNS_TLV,
24
24
  NTP_SERVERS_TLV
25
- ]
25
+ ].freeze
26
26
  end
27
27
  DHCP = Dhcp
28
28
  end
@@ -41,7 +41,7 @@ module Pio
41
41
  Offer::TYPE => Offer,
42
42
  Request::TYPE => Request,
43
43
  Ack::TYPE => Ack
44
- }
44
+ }.freeze
45
45
 
46
46
  def self.read(raw_data)
47
47
  begin
@@ -12,12 +12,12 @@ module Pio
12
12
 
13
13
  OPTION_FIELD_LENGTH = 60
14
14
 
15
- include EthernetHeader
16
- include IPv4Header
15
+ include Ethernet
16
+ include IPv4
17
17
  include UdpHeader
18
18
 
19
19
  endian :big
20
- ethernet_header ether_type: EtherType::IPV4
20
+ ethernet_header ether_type: Ethernet::Type::IPV4
21
21
  ipv4_header ip_protocol: ProtocolNumber::UDP
22
22
  udp_header
23
23
  dhcp_field :dhcp
@@ -31,7 +31,7 @@ module Pio
31
31
 
32
32
  def ff_and_padding
33
33
  padding_length = OPTION_FIELD_LENGTH - dhcp.optional_tlvs.num_bytes - 1
34
- "\xFF" + (padding_length > 0 ? "\x00" * padding_length : '')
34
+ [0xFF].pack('C') + (padding_length > 0 ? "\x00" * padding_length : '')
35
35
  end
36
36
  end
37
37
  end
@@ -7,15 +7,15 @@ module Pio
7
7
  class Dhcp
8
8
  # DHCP Optional TLV
9
9
  class OptionalTlv < BinData::Record
10
- DEFAULT = 'default'
10
+ DEFAULT = 'default'.freeze
11
11
 
12
12
  endian :big
13
13
 
14
14
  bit8 :tlv_type
15
15
  bit8 :tlv_info_length,
16
- onlyif: -> { !(end_of_dhcpdu?) }
16
+ onlyif: -> { !end_of_dhcpdu? }
17
17
  choice :tlv_value,
18
- onlyif: -> { !(end_of_dhcpdu?) },
18
+ onlyif: -> { !end_of_dhcpdu? },
19
19
  selection: :chooser do
20
20
  uint8 Dhcp::MESSAGE_TYPE_TLV
21
21
  ip_address Dhcp::SERVER_IDENTIFIER_TLV
@@ -0,0 +1,20 @@
1
+ require 'bindata'
2
+ require 'pio/ethernet_header'
3
+ require 'pio/class_inspector'
4
+ require 'pio/instance_inspector'
5
+ require 'pio/ruby_dumper'
6
+
7
+ module Pio
8
+ # Ethernet frame parser
9
+ class EthernetFrame < BinData::Record
10
+ extend ClassInspector
11
+ include Ethernet
12
+ include InstanceInspector
13
+ include RubyDumper
14
+
15
+ endian :big
16
+
17
+ ethernet_header
18
+ rest :rest
19
+ end
20
+ end
@@ -1,10 +1,16 @@
1
+ require 'pio/class_inspector'
2
+ require 'pio/instance_inspector'
3
+ require 'pio/ruby_dumper'
4
+ require 'pio/type/ether_type'
1
5
  require 'pio/type/mac_address'
2
6
 
3
7
  module Pio
4
8
  # Adds ethernet_header macro.
5
- module EthernetHeader
6
- # EtherType constants for ethernet_header.ether_type.
7
- module EtherType
9
+ module Ethernet
10
+ MINIMUM_FRAME_SIZE = 64
11
+
12
+ # EtherType constants
13
+ module Type
8
14
  ARP = 0x0806
9
15
  IPV4 = 0x0800
10
16
  VLAN = 0x8100
@@ -12,28 +18,44 @@ module Pio
12
18
  end
13
19
 
14
20
  # This method smells of :reek:TooManyStatements
21
+ # rubocop:disable MethodLength
15
22
  def self.included(klass)
16
- def klass.ethernet_header(options)
23
+ def klass.ethernet_header(options = nil)
17
24
  mac_address :destination_mac
18
25
  mac_address :source_mac
19
- uint16 :ether_type, value: options.fetch(:ether_type)
20
- bit3 :vlan_pcp_internal, onlyif: :vlan?
26
+ if options
27
+ ether_type :ether_type, value: options.fetch(:ether_type)
28
+ else
29
+ ether_type :ether_type
30
+ end
31
+ bit3 :vlan_pcp, onlyif: :vlan?
21
32
  bit1 :vlan_cfi, onlyif: :vlan?
22
- bit12 :vlan_vid_internal, onlyif: :vlan?
33
+ bit12 :vlan_vid, onlyif: :vlan?
23
34
  uint16 :ether_type_vlan, value: :ether_type, onlyif: :vlan?
24
35
  end
25
36
  end
37
+ # rubocop:enable MethodLength
26
38
 
27
- def vlan_vid
28
- vlan? ? vlan_vid_internal : 0xffff
39
+ def ethernet_header_length
40
+ vlan? ? 18 : 14
29
41
  end
30
42
 
31
- def vlan_pcp
32
- vlan? ? vlan_pcp_internal : 0
33
- end
43
+ private
34
44
 
35
45
  def vlan?
36
- ether_type == EtherType::VLAN
46
+ ether_type == Type::VLAN
37
47
  end
38
48
  end
49
+
50
+ # Ethernet header generator/parser
51
+ class EthernetHeader < BinData::Record
52
+ extend ClassInspector
53
+ include Ethernet
54
+ include InstanceInspector
55
+ include RubyDumper
56
+
57
+ endian :big
58
+
59
+ ethernet_header
60
+ end
39
61
  end