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,6 @@
1
+ module BinData
2
+ # Add BinData::Record#to_binary
3
+ class Record
4
+ alias to_binary to_binary_s
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ module BinData
2
+ # Add BinData::String#to_bytes
3
+ class String
4
+ def to_bytes
5
+ to_s.unpack('H*').pop.scan(/[0-9a-f]{2}/).map do |each|
6
+ "0x#{each}"
7
+ end.join(', ')
8
+ end
9
+ end
10
+ end
@@ -3,7 +3,7 @@ module MonkeyPatch
3
3
  # to_hex etc.
4
4
  module BaseConversions
5
5
  def to_hex
6
- format '%#x', self
6
+ format '0x%02x', self
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,9 @@
1
+ require 'bindata'
2
+ require 'pio/monkey_patch/uint/base_conversions'
3
+
4
+ # BinData's base module
5
+ module BinData
6
+ Uint8.__send__ :include, MonkeyPatch::Uint::BaseConversions
7
+ Uint16be.__send__ :include, MonkeyPatch::Uint::BaseConversions
8
+ Uint32be.__send__ :include, MonkeyPatch::Uint::BaseConversions
9
+ end
@@ -0,0 +1,14 @@
1
+ module MonkeyPatch
2
+ module Uint
3
+ # Uint8#to_bytes, Uintxxbe#to_bytes
4
+ module BaseConversions
5
+ def to_bytes
6
+ /Uint(8|\d+be)$/=~ self.class.name
7
+ nbyte = Regexp.last_match(1).to_i / 4
8
+ format("%0#{nbyte}x", to_i).scan(/.{1,2}/).map do |each|
9
+ '0x' + each
10
+ end.join(', ')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,67 +1,53 @@
1
- require 'pio/open_flow/datapath_id'
2
- require 'pio/open_flow/error'
3
- require 'pio/open_flow/flags'
4
- require 'pio/open_flow/message'
5
- require 'pio/open_flow/open_flow_header'
6
- require 'pio/open_flow10'
7
- require 'pio/open_flow13'
1
+ require 'active_support/core_ext/array/access'
2
+ require 'active_support/core_ext/module/attribute_accessors'
3
+ require 'active_support/core_ext/module/introspection'
4
+ require 'pio/open_flow/header'
5
+ require 'pio/open_flow/parser'
8
6
 
9
7
  module Pio
10
8
  # Common OpenFlow modules/classes.
11
9
  module OpenFlow
12
- def self.version
13
- fail unless @version
14
- @version
15
- end
10
+ mattr_reader :version, instance_reader: false
16
11
 
17
- def self.switch_version(version)
18
- [:Barrier, :Echo, :Features, :FlowMod, :Hello, :Match,
19
- :PacketIn, :FlowRemoved, :PacketOut, :SendOutPort,
20
- :SetSourceMacAddress, :SetDestinationMacAddress, :PortStatus, :Stats,
21
- :FlowStats, :DescriptionStats, :AggregateStats, :TableStats, :PortStats,
22
- :QueueStats, :Error, :SetArpOperation, :SetArpSenderProtocolAddress,
23
- :SetArpSenderHardwareAddress, :NiciraRegMove, :SetMetadata,
24
- :NiciraRegLoad, :NiciraSendOutPort].each do |each|
25
- set_message_class_name each, version
26
- @version = version.to_s
12
+ def self.version=(version)
13
+ return if OpenFlow.version == version.to_sym
14
+ find_all_class_by_version(version).each do |each|
15
+ alias_open_flow_class each
27
16
  end
17
+ @@version = version.to_sym # rubocop:disable ClassVars
18
+ rescue NameError
19
+ raise "#{version} is not supported yet."
28
20
  end
29
21
 
30
- # rubocop:disable MethodLength
31
22
  def self.read(binary)
32
- parser = {
33
- 0 => Pio::Hello,
34
- 1 => Pio::OpenFlow::Error,
35
- 2 => Pio::Echo::Request,
36
- 3 => Pio::Echo::Reply,
37
- 5 => Pio::Features::Request,
38
- 6 => Pio::Features::Reply,
39
- 10 => Pio::PacketIn,
40
- 11 => Pio::FlowRemoved,
41
- 12 => Pio::PortStatus,
42
- 13 => Pio::PacketOut,
43
- 14 => Pio::FlowMod,
44
- 16 => Pio::Stats::Request,
45
- 17 => Pio::Stats::Reply,
46
- 18 => Pio::Barrier::Request,
47
- 19 => Pio::Barrier::Reply
48
- }
49
- header = OpenFlowHeaderParser.read(binary)
50
- parser.fetch(header.message_type).read(binary)
23
+ header = OpenFlow::Header.read(binary)
24
+ self.version = header.version
25
+ Parser.find_by_type!(header.type).read(binary)
51
26
  end
52
- # rubocop:enable MethodLength
53
27
 
54
- def self.set_message_class_name(klass_name, version)
55
- open_flow_module = Pio.const_get(version)
56
- return unless open_flow_module.const_defined?(klass_name)
57
- Pio.__send__ :remove_const, klass_name if Pio.const_defined?(klass_name)
58
- Pio.const_set(klass_name, open_flow_module.const_get(klass_name))
59
- rescue NameError
60
- raise "#{version} is not supported yet."
28
+ def self.find_all_class_by_version(version)
29
+ all_class = [Message, Instruction, Action, FlowMatch].
30
+ inject([]) do |result, each|
31
+ result + each.descendants
32
+ end
33
+ all_class.select do |each|
34
+ each.parents.include?(Class.const_get("Pio::#{version}"))
35
+ end
61
36
  end
62
- private_class_method :set_message_class_name
37
+ private_class_method :find_all_class_by_version
63
38
 
64
- # The default OpenFlow version is 1.0
65
- switch_version 'OpenFlow10'
39
+ # Pio::OpenFlow10::Hello -> Pio::Hello
40
+ def self.alias_open_flow_class(klass)
41
+ version = klass.name.split('::').second
42
+ class_name = klass.name.split('::').third
43
+ if Pio.const_defined?(class_name)
44
+ Pio.module_eval { remove_const class_name }
45
+ end
46
+ Pio.const_set(class_name, "Pio::#{version}::#{class_name}".constantize)
47
+ end
48
+ private_class_method :alias_open_flow_class
66
49
  end
67
50
  end
51
+
52
+ # The default OpenFlow version is 1.0
53
+ Pio::OpenFlow.version = :OpenFlow10
@@ -1,12 +1,11 @@
1
+ require 'active_support/descendants_tracker'
1
2
  require 'bindata'
2
3
 
3
4
  module Pio
4
5
  module OpenFlow
5
6
  # OpenFlow actions.
6
7
  class Action
7
- def self.inherited(child_klass)
8
- child_klass.const_set :Format, Class.new(BinData::Record)
9
- end
8
+ extend ActiveSupport::DescendantsTracker
10
9
 
11
10
  def self.action_header(options)
12
11
  module_eval do
@@ -24,7 +23,12 @@ module Pio
24
23
  end
25
24
 
26
25
  def self.method_missing(method, *args, &block)
27
- const_get(:Format).__send__ method, *args, &block
26
+ begin
27
+ const_get(:Format).__send__ method, *args, &block
28
+ rescue NameError
29
+ const_set :Format, Class.new(BinData::Record)
30
+ retry
31
+ end
28
32
  return if method == :endian || method == :virtual
29
33
  define_method(args.first) { @format.__send__ args.first }
30
34
  end
@@ -0,0 +1,19 @@
1
+ module Pio
2
+ module OpenFlow
3
+ # Buffered packet to apply to, or :no_buffer.
4
+ class BufferId < BinData::Primitive
5
+ NO_BUFFER = 0xffffffff
6
+
7
+ endian :big
8
+ uint32 :buffer_id, initial_value: NO_BUFFER
9
+
10
+ def get
11
+ buffer_id == NO_BUFFER ? :no_buffer : buffer_id
12
+ end
13
+
14
+ def set(value)
15
+ self.buffer_id = (value == :no_buffer ? NO_BUFFER : value)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -12,14 +12,14 @@ module Pio
12
12
 
13
13
  def set(value)
14
14
  unless value.unsigned_64bit?
15
- fail(ArgumentError,
16
- 'Datapath ID should be an unsigned 64-bit integer.')
15
+ raise(ArgumentError,
16
+ 'Datapath ID should be an unsigned 64-bit integer.')
17
17
  end
18
18
  self.datapath_id = value
19
19
  end
20
20
 
21
21
  def get
22
- datapath_id
22
+ datapath_id.to_i
23
23
  end
24
24
  end
25
25
  end
@@ -0,0 +1,32 @@
1
+ require 'active_support/core_ext/module/attribute_accessors'
2
+ require 'active_support/core_ext/string/inflections'
3
+
4
+ module Pio
5
+ module OpenFlow
6
+ # Error message parser
7
+ module ErrorMessage
8
+ mattr_reader(:type) { 1 }
9
+
10
+ # rubocop:disable AbcSize
11
+ def read(binary)
12
+ body = OpenFlow::Header.read(binary).body
13
+ error = const_get(:BodyParser).read(body)
14
+ klass = error_classes.find do |each|
15
+ each.name.split('::').last.underscore == error.error_type.to_s
16
+ end
17
+ unless klass
18
+ raise 'Unknown error message '\
19
+ "(type=#{error.error_type}, code=#{error.error_code})"
20
+ end
21
+ klass.read binary
22
+ end
23
+ # rubocop:enable AbcSize
24
+
25
+ def error_classes
26
+ OpenFlow::Message.descendants.select do |each|
27
+ each.parents.include? parent.const_get(:Error)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -3,17 +3,21 @@ module Pio
3
3
  # bitmap functions.
4
4
  # This class smells of :reek:DataClump
5
5
  module Flags
6
+ def define_flags_32bit(name, flags)
7
+ _define_flags name, 32, flags
8
+ end
9
+
6
10
  def flags_32bit(name, flags)
7
- _def_flags name, 32, flags
11
+ _flags name, 32, flags
8
12
  end
9
13
 
10
14
  def flags_16bit(name, flags)
11
- _def_flags name, 16, flags
15
+ _flags name, 16, flags
12
16
  end
13
17
 
14
18
  # rubocop:disable MethodLength
15
19
  # This method smells of :reek:TooManyStatements
16
- def _def_flags(name, size, flags)
20
+ def _define_flags(name, size, flags)
17
21
  flag_value = case flags
18
22
  when Array
19
23
  shift = 0
@@ -29,7 +33,7 @@ module Pio
29
33
  klass_name = name.to_s.split('_').map(&:capitalize).join
30
34
  flags_hash = flag_value.inspect
31
35
 
32
- code = %{
36
+ module_eval <<-end_eval, __FILE__, __LINE__
33
37
  class #{klass_name} < BinData::Primitive
34
38
  endian :big
35
39
 
@@ -53,8 +57,13 @@ module Pio
53
57
  v.map { |each| list[each] }.inject(:|)
54
58
  end
55
59
  end
56
- }
57
- module_eval code
60
+ end_eval
61
+ end
62
+ # rubocop:enable MethodLength
63
+
64
+ def _flags(name, size, flags_)
65
+ _define_flags name, size, flags_
66
+ module_eval "#{name} :#{name}", __FILE__, __LINE__
58
67
  end
59
68
  end
60
69
  end
@@ -0,0 +1,10 @@
1
+ require 'active_support/descendants_tracker'
2
+
3
+ module Pio
4
+ module OpenFlow
5
+ # Flow match
6
+ class FlowMatch
7
+ extend ActiveSupport::DescendantsTracker
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,26 @@
1
+ require 'bindata'
2
+ require 'pio/monkey_patch/uint'
3
+ require 'pio/open_flow/transaction_id'
4
+ require 'pio/open_flow/version'
5
+
6
+ module Pio
7
+ module OpenFlow
8
+ # OpenFlow message header parser
9
+ class Header < BinData::Record
10
+ endian :big
11
+
12
+ version :version
13
+ uint8 :type
14
+ uint16 :message_length
15
+ transaction_id :transaction_id
16
+ rest :body
17
+
18
+ def to_bytes
19
+ [version,
20
+ type,
21
+ message_length,
22
+ transaction_id].map(&:to_bytes).join(', ')
23
+ end
24
+ end
25
+ end
26
+ end
@@ -4,7 +4,7 @@ module Pio
4
4
  module OpenFlow
5
5
  # enum ofp_hello_failed_code
6
6
  class HelloFailedCode < BinData::Primitive
7
- ERROR_CODES = { incompatible: 0, permissions_error: 1 }
7
+ ERROR_CODES = { incompatible: 0, permissions_error: 1 }.freeze
8
8
 
9
9
  endian :big
10
10
  uint16 :error_code
@@ -0,0 +1,10 @@
1
+ require 'active_support/descendants_tracker'
2
+
3
+ module Pio
4
+ module OpenFlow
5
+ # Flow instruction
6
+ class Instruction
7
+ extend ActiveSupport::DescendantsTracker
8
+ end
9
+ end
10
+ end
@@ -1,15 +1,19 @@
1
+ require 'active_support/core_ext/module/attribute_accessors'
2
+ require 'active_support/descendants_tracker'
1
3
  require 'bindata'
4
+ require 'pio/open_flow/flags'
5
+ require 'pio/open_flow/header'
2
6
  require 'pio/parse_error'
3
- require 'pio/open_flow/open_flow_header'
7
+ require 'pio/ruby_dumper'
4
8
 
5
9
  module Pio
6
10
  module OpenFlow
7
11
  # OpenFlow messages.
8
12
  class Message
9
- def self.inherited(child_klass)
10
- child_klass.const_set :Format, Class.new(BinData::Record)
11
- child_klass.class_variable_set(:@@valid_options, [])
12
- end
13
+ attr_reader :format
14
+
15
+ extend ActiveSupport::DescendantsTracker
16
+ extend OpenFlow::Flags
13
17
 
14
18
  def self.read(raw_data)
15
19
  allocate.tap do |message|
@@ -21,31 +25,62 @@ module Pio
21
25
  raise Pio::ParseError, "Invalid #{message_name} message."
22
26
  end
23
27
 
28
+ # rubocop:disable MethodLength
29
+ # rubocop:disable AbcSize
24
30
  def self.method_missing(method, *args, &block)
25
- const_get(:Format).__send__ method, *args, &block
31
+ begin
32
+ const_get(:Format).__send__ method, *args, &block
33
+ rescue NameError
34
+ klass = Class.new(BinData::Record)
35
+ const_set :Format, klass
36
+ klass.class_eval do
37
+ include RubyDumper
38
+ define_method(:header_length) { 8 }
39
+ define_method(:length) { _length }
40
+ end
41
+ class_variable_set(:@@valid_options, [])
42
+ retry
43
+ end
26
44
 
27
45
  return if method == :endian || method == :virtual
46
+
28
47
  define_method(args.first) do
29
- @format.__send__ args.first
48
+ snapshot = @format.snapshot.__send__(args.first)
49
+ if snapshot.class == BinData::Struct::Snapshot
50
+ @format.__send__(args.first)
51
+ else
52
+ snapshot
53
+ end
30
54
  end
31
55
  class_variable_set(:@@valid_options,
32
56
  class_variable_get(:@@valid_options) + [args.first])
33
57
  end
58
+ # rubocop:enable MethodLength
59
+ # rubocop:enable AbcSize
34
60
 
35
61
  # rubocop:disable AbcSize
36
62
  # rubocop:disable MethodLength
37
63
  def self.open_flow_header(opts)
38
64
  module_eval do
65
+ cattr_reader(:type) { opts.fetch(:type) }
66
+
39
67
  endian :big
40
68
 
41
- uint8 :ofp_version, value: opts.fetch(:version)
42
- virtual assert: -> { ofp_version == opts.fetch(:version) }
43
- uint8 :message_type, value: opts.fetch(:message_type)
44
- virtual assert: -> { message_type == opts.fetch(:message_type) }
45
- uint16 :message_length,
46
- initial_value: opts[:message_length] || -> { 8 + body.length }
69
+ uint8 :version, value: opts.fetch(:version)
70
+ uint8 :type, value: opts.fetch(:type)
71
+ uint16(:_length,
72
+ initial_value: opts[:length] || lambda do
73
+ begin
74
+ 8 + body.length
75
+ rescue
76
+ 8
77
+ end
78
+ end)
47
79
  transaction_id :transaction_id, initial_value: 0
48
80
 
81
+ virtual assert: -> { version == opts.fetch(:version) }
82
+ virtual assert: -> { type == opts.fetch(:type) }
83
+
49
84
  alias_method :xid, :transaction_id
50
85
  end
51
86
  end
@@ -71,7 +106,7 @@ module Pio
71
106
  unknown_options =
72
107
  user_options.keys - self.class.class_variable_get(:@@valid_options)
73
108
  return if unknown_options.empty?
74
- fail "Unknown option: #{unknown_options.first}"
109
+ raise "Unknown option: #{unknown_options.first}"
75
110
  end
76
111
 
77
112
  def parse_options(user_options)