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,14 +1,17 @@
1
1
  require 'pio/icmp/format'
2
2
  require 'pio/icmp/reply'
3
3
  require 'pio/icmp/request'
4
- require 'pio/message_type_selector'
4
+ require 'pio/parse_error'
5
5
 
6
- # Packet parser and generator library.
7
6
  module Pio
8
7
  # Icmp parser and generator.
9
8
  class Icmp
10
- extend MessageTypeSelector
11
- message_type Request::TYPE => Request, Reply::TYPE => Reply
9
+ def self.read(raw_data)
10
+ format = Format.read(raw_data)
11
+ { Request.icmp_type => Request,
12
+ Reply.icmp_type => Reply }.fetch(format.icmp_type).create(format)
13
+ rescue
14
+ raise Pio::ParseError, $ERROR_INFO.message
15
+ end
12
16
  end
13
- ICMP = Icmp
14
17
  end
@@ -1,37 +1,33 @@
1
- require 'bindata'
2
1
  require 'pio/ethernet_header'
3
2
  require 'pio/ipv4_header'
3
+ require 'pio/monkey_patch/bindata_record'
4
4
 
5
5
  module Pio
6
- # Icmp parser and generator.
6
+ # ICMP parser and generator
7
7
  class Icmp
8
- # Icmp parser.
8
+ # ICMP format
9
9
  class Format < BinData::Record
10
- MINIMUM_IP_PACKET_LENGTH = 50
11
-
12
- include EthernetHeader
13
- include IPv4Header
10
+ include Ethernet
11
+ include IPv4
14
12
 
15
13
  endian :big
16
14
 
17
- ethernet_header ether_type: EtherType::IPV4
15
+ ethernet_header ether_type: Ethernet::Type::IPV4
18
16
  ipv4_header ip_protocol: ProtocolNumber::ICMP
19
17
  uint8 :icmp_type
20
18
  uint8 :icmp_code, initial_value: 0
21
19
  uint16 :icmp_checksum, value: :calculate_icmp_checksum
22
20
  uint16 :icmp_identifier
23
21
  uint16 :icmp_sequence_number
24
- string :echo_data, read_length: :echo_data_read_length
25
- string :padding, read_length: 0, initial_value: :icmp_padding_length
26
-
27
- def message_type
28
- icmp_type
29
- end
30
-
31
- alias_method :to_binary, :to_binary_s
22
+ string :echo_data, read_length: :echo_data_length
23
+ string :padding, length: :padding_length
32
24
 
33
25
  private
34
26
 
27
+ def icmp_header_length
28
+ 8
29
+ end
30
+
35
31
  def calculate_icmp_checksum
36
32
  sum = [icmp_type * 0x100 + icmp_code,
37
33
  icmp_identifier,
@@ -40,14 +36,15 @@ module Pio
40
36
  ~((sum & 0xffff) + (sum >> 16)) & 0xffff
41
37
  end
42
38
 
43
- def echo_data_read_length
44
- ip_total_length - (ip_header_length * 4) - 8
39
+ def echo_data_length
40
+ ip_total_length - ip_header_length_in_bytes - icmp_header_length
45
41
  end
46
42
 
47
- def icmp_padding_length
48
- length = MINIMUM_IP_PACKET_LENGTH -
49
- (ip_header_length * 4) - 8 - echo_data.length
50
- length > 0 ? "\x00" * length : ''
43
+ def padding_length
44
+ tmp = Ethernet::MINIMUM_FRAME_SIZE -
45
+ ethernet_header_length - ip_header_length_in_bytes -
46
+ icmp_header_length - echo_data.length
47
+ tmp > 0 ? tmp : 0
51
48
  end
52
49
  end
53
50
  end
@@ -1,14 +1,28 @@
1
+ require 'pio/class_inspector'
1
2
  require 'pio/icmp/format'
3
+ require 'pio/instance_inspector'
4
+ require 'pio/message'
5
+ require 'pio/ruby_dumper'
2
6
 
3
7
  module Pio
4
8
  class Icmp
5
9
  # Base class of Icmp::Request and Icmp::Reply.
6
- class Message
7
- private_class_method :new
10
+ class Message < Pio::Message
11
+ extend ClassInspector
12
+ include InstanceInspector
13
+
14
+ def self.fields
15
+ Icmp::Format.fields
16
+ end
17
+
18
+ def self.create(format)
19
+ allocate.tap do |message|
20
+ message.instance_variable_set :@format, format
21
+ end
22
+ end
8
23
 
9
24
  def initialize(user_options)
10
- options = self.class.const_get(:Options).new(user_options)
11
- @format = Icmp::Format.new(options.to_hash)
25
+ @format = Icmp::Format.new(parse_options(user_options))
12
26
  end
13
27
 
14
28
  def method_missing(method, *args)
@@ -1,43 +1,17 @@
1
1
  require 'pio/icmp/message'
2
- require 'pio/icmp/options'
3
- require 'pio/mac'
4
2
 
5
3
  module Pio
6
4
  class Icmp
7
5
  # ICMP Reply packet generator
8
6
  class Reply < Message
9
- TYPE = 0
10
- public_class_method :new
11
-
12
- # User options for creating an ICMP Reply.
13
- class Options < Pio::Icmp::Options
14
- mandatory_option :source_mac
15
- mandatory_option :destination_mac
16
- mandatory_option :source_ip_address
17
- mandatory_option :destination_ip_address
18
- mandatory_option :identifier
19
- mandatory_option :sequence_number
20
- option :echo_data
21
-
22
- # rubocop:disable MethodLength
23
- # rubocop:disable AbcSize
24
- def initialize(options)
25
- validate options
26
- @type = TYPE
27
-
28
- @source_mac = Mac.new(options[:source_mac]).freeze
29
- @destination_mac = Mac.new(options[:destination_mac]).freeze
30
- @source_ip_address =
31
- IPv4Address.new(options[:source_ip_address]).freeze
32
- @destination_ip_address =
33
- IPv4Address.new(options[:destination_ip_address]).freeze
34
- @identifier = options[:identifier]
35
- @sequence_number = options[:sequence_number]
36
- @echo_data = options[:echo_data] || ''
37
- end
38
- # rubocop:enable AbcSize
39
- # rubocop:enable MethodLength
40
- end
7
+ option :icmp_type, value: 0
8
+ option :source_mac
9
+ option :destination_mac
10
+ option :source_ip_address
11
+ option :destination_ip_address
12
+ option :icmp_identifier
13
+ option :icmp_sequence_number
14
+ option :echo_data, default: ''
41
15
  end
42
16
  end
43
17
  end
@@ -1,52 +1,17 @@
1
1
  require 'pio/icmp/message'
2
- require 'pio/icmp/options'
3
- require 'pio/mac'
4
2
 
5
3
  module Pio
6
4
  class Icmp
7
5
  # ICMP Request packet generator
8
6
  class Request < Message
9
- TYPE = 8
10
- public_class_method :new
11
-
12
- # User options for creating an ICMP Request.
13
- class Options < Pio::Icmp::Options
14
- DEFAULT_IDENTIFIER = 0x0100
15
- DEFAULT_SEQUENCE_NUMBER = 0
16
-
17
- mandatory_option :source_mac
18
- mandatory_option :destination_mac
19
- mandatory_option :source_ip_address
20
- mandatory_option :destination_ip_address
21
- option :identifier
22
- option :sequence_number
23
- option :echo_data
24
-
25
- # rubocop:disable MethodLength
26
- # rubocop:disable AbcSize
27
- def initialize(options)
28
- validate options
29
- @type = TYPE
30
-
31
- @source_mac = Mac.new(options[:source_mac]).freeze
32
- @destination_mac = Mac.new(options[:destination_mac]).freeze
33
- @source_ip_address =
34
- IPv4Address.new(options[:source_ip_address]).freeze
35
- @destination_ip_address =
36
- IPv4Address.new(options[:destination_ip_address]).freeze
37
- @identifier =
38
- options[:icmp_identifier] ||
39
- options[:identifier] ||
40
- DEFAULT_IDENTIFIER
41
- @sequence_number =
42
- options[:icmp_sequence_number] ||
43
- options[:sequence_number] ||
44
- DEFAULT_SEQUENCE_NUMBER
45
- @echo_data = options[:echo_data] || ''
46
- end
47
- # rubocop:enable AbcSize
48
- # rubocop:enable MethodLength
49
- end
7
+ option :icmp_type, value: 8
8
+ option :source_mac
9
+ option :destination_mac
10
+ option :source_ip_address
11
+ option :destination_ip_address
12
+ option :icmp_identifier, default: 0
13
+ option :icmp_sequence_number, default: 0
14
+ option :echo_data, default: ''
50
15
  end
51
16
  end
52
17
  end
@@ -0,0 +1,14 @@
1
+ module Pio
2
+ # Introduces #inspect method
3
+ module InstanceInspector
4
+ def inspect
5
+ "#<#{self.class.name} " +
6
+ field_names.map do |each|
7
+ next if each == :padding
8
+ next unless __send__("#{each}?")
9
+ "#{each}: #{__send__(each).inspect}"
10
+ end.compact.join(', ') +
11
+ '>'
12
+ end
13
+ end
14
+ end
@@ -21,14 +21,14 @@ module Pio
21
21
  # @return [IPv4Address] self
22
22
  # a proxy to IPAddr.
23
23
  def initialize(addr)
24
- case addr
25
- when Integer
26
- @value = IPAddr.new(addr, Socket::AF_INET)
27
- when String
28
- @value = IPAddr.new(addr)
29
- else
30
- @value = addr.value
31
- end
24
+ @value = case addr
25
+ when Integer
26
+ IPAddr.new(addr, Socket::AF_INET)
27
+ when String
28
+ IPAddr.new(addr)
29
+ else
30
+ addr.value
31
+ end
32
32
  end
33
33
 
34
34
  # @return [String] the IPv4 address in its text representation.
@@ -78,14 +78,14 @@ module Pio
78
78
  @value = @value.mask(masklen)
79
79
  self
80
80
  end
81
- alias_method :prefix!, :mask!
81
+ alias prefix! mask!
82
82
 
83
83
  # Returns the IPv4 address masked with +masklen+.
84
84
  # @return [IPv4Address]
85
85
  def mask(masklen)
86
86
  clone.mask!(masklen)
87
87
  end
88
- alias_method :prefix, :mask
88
+ alias prefix mask
89
89
 
90
90
  # @return [bool]
91
91
  # Returns true if the address belongs to class A.
@@ -110,7 +110,7 @@ module Pio
110
110
  def class_d?
111
111
  mask(4).to_s == '224.0.0.0'
112
112
  end
113
- alias_method :multicast?, :class_d?
113
+ alias multicast? class_d?
114
114
 
115
115
  # @return [bool]
116
116
  # Returns true if the address belongs to class E.
@@ -1,9 +1,12 @@
1
+ require 'pio/instance_inspector'
2
+ require 'pio/monkey_patch/bindata_string'
1
3
  require 'pio/payload'
4
+ require 'pio/ruby_dumper'
2
5
  require 'pio/type/ip_address'
3
6
 
4
7
  module Pio
5
8
  # IP Version 4 Header Format
6
- module IPv4Header
9
+ module IPv4
7
10
  # Internet protocol numbers for ipv4_header.ip_protocol
8
11
  module ProtocolNumber
9
12
  ICMP = 1
@@ -39,7 +42,7 @@ module Pio
39
42
  in_port: in_port,
40
43
  source_mac_address: source_mac,
41
44
  destination_mac_address: destination_mac,
42
- vlan_vid: vlan_vid,
45
+ vlan_vid: vlan? ? vlan_vid : 0xffff,
43
46
  vlan_priority: vlan_pcp,
44
47
  ether_type: ether_type,
45
48
  tos: ip_type_of_service,
@@ -53,6 +56,10 @@ module Pio
53
56
  end
54
57
  # rubocop:enable MethodLength
55
58
 
59
+ def ip_header_length_in_bytes
60
+ ip_header_length * 4
61
+ end
62
+
56
63
  private
57
64
 
58
65
  def calculate_ip_length
@@ -82,4 +89,19 @@ module Pio
82
89
  20 - ip_header_length * 4
83
90
  end
84
91
  end
92
+
93
+ # IPv4 header generator/parser
94
+ class IPv4Header < BinData::Record
95
+ include IPv4
96
+ include InstanceInspector
97
+ include RubyDumper
98
+
99
+ ipv4_header
100
+
101
+ # rubocop:disable LineLength
102
+ def self.inspect
103
+ 'IPv4Header(ip_version: bit4, ip_header_length: bit4, ip_type_of_service: uint8, ip_total_length: uint16, ip_identifier: uint16, ip_flag: bit3, ip_fragment: bit13, ip_ttl: uint8, ip_protocol: uint8, ip_header_checksum: uint16, source_ip_address: ip_address, destination_ip_address: ip_address, ip_option: string)'
104
+ end
105
+ # rubocop:enable LineLength
106
+ end
85
107
  end
@@ -11,11 +11,11 @@ module Pio
11
11
  class Lldp
12
12
  # LLDP frame
13
13
  class Frame < BinData::Record
14
- include EthernetHeader
14
+ include Ethernet
15
15
 
16
16
  endian :big
17
17
 
18
- ethernet_header ether_type: EtherType::LLDP
18
+ ethernet_header ether_type: Ethernet::Type::LLDP
19
19
  chassis_id_tlv :chassis_id
20
20
  port_id_tlv :port_id
21
21
  ttl_tlv :ttl, initial_value: 120
@@ -29,7 +29,7 @@ module Pio
29
29
  end
30
30
 
31
31
  def end_of_lldpdu?
32
- tlv_type == 0
32
+ tlv_type.zero?
33
33
  end
34
34
 
35
35
  def chooser
@@ -52,7 +52,7 @@ module Pio
52
52
  end
53
53
 
54
54
  def end_of_lldpdu_tlv?
55
- tlv_type == 0
55
+ tlv_type.zero?
56
56
  end
57
57
  end
58
58
  end
@@ -29,7 +29,7 @@ module Pio
29
29
  @value = value.to_int
30
30
  validate_value_range
31
31
  else
32
- fail TypeError
32
+ raise TypeError
33
33
  end
34
34
  rescue ArgumentError, TypeError
35
35
  raise InvalidValueError, "Invalid MAC address: #{value.inspect}"
@@ -91,6 +91,10 @@ module Pio
91
91
  to_s.split(':').map(&:hex)
92
92
  end
93
93
 
94
+ def to_hex
95
+ to_a.map(&:to_hex).join(', ')
96
+ end
97
+
94
98
  # @!endgroup
95
99
 
96
100
  # @!group Predicates
@@ -202,12 +206,12 @@ module Pio
202
206
  when /^(?:#{octet}(:)){5}#{octet}$/, /^(?:#{doctet}(\.)){2}#{doctet}$/
203
207
  mac.gsub(Regexp.last_match[1], '').hex
204
208
  else
205
- fail ArgumentError
209
+ raise ArgumentError
206
210
  end
207
211
  end
208
212
 
209
213
  def validate_value_range
210
- fail ArgumentError unless @value >= 0 && @value <= 0xffffffffffff
214
+ raise ArgumentError unless @value >= 0 && @value <= 0xffffffffffff
211
215
  end
212
216
  end
213
217
  end
@@ -0,0 +1,50 @@
1
+ require 'active_support/core_ext/class/attribute'
2
+ require 'pio/ruby_dumper'
3
+
4
+ module Pio
5
+ # Base message class
6
+ class Message
7
+ include RubyDumper
8
+
9
+ class_attribute :options
10
+
11
+ def self.option(name, value: nil, default: nil)
12
+ self.options ||= {}
13
+ if value && !value.is_a?(Symbol)
14
+ class_eval { class_attribute name }
15
+ class_eval { __send__("#{name}=", value) }
16
+ end
17
+ self.options.merge! name => { value: value, default: default }
18
+ end
19
+
20
+ private
21
+
22
+ # rubocop:disable MethodLength
23
+ # rubocop:disable AbcSize
24
+ # rubocop:disable PerceivedComplexity
25
+ # rubocop:disable CyclomaticComplexity
26
+ def parse_options(user_options)
27
+ options = {}
28
+ self.class.options.each_pair do |key, attrs|
29
+ if !attrs[:value] && !attrs[:default]
30
+ begin
31
+ options[key] = user_options.fetch(key)
32
+ rescue
33
+ raise "#{key} option is a mandatory"
34
+ end
35
+ elsif attrs[:value] && attrs[:value].is_a?(Symbol)
36
+ options[key] = user_options.fetch(attrs[:value])
37
+ elsif attrs[:value]
38
+ options[key] = user_options[key] || attrs[:value]
39
+ else
40
+ options[key] = user_options[key] || attrs[:default]
41
+ end
42
+ end
43
+ options
44
+ end
45
+ # rubocop:enable MethodLength
46
+ # rubocop:enable AbcSize
47
+ # rubocop:enable PerceivedComplexity
48
+ # rubocop:enable CyclomaticComplexity
49
+ end
50
+ end