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,34 +1,32 @@
1
1
  @open_flow10
2
- Feature: Pio::FlowRemoved
2
+ Feature: FlowRemoved
3
+
4
+ If the controller has requested to be notified when flows time out, the datapath
5
+ does this with the FlowRemoved message.
3
6
 
4
- @open_flow10
5
7
  Scenario: read
6
- When I try to parse a file named "open_flow10/flow_removed.raw" with "FlowRemoved" class
7
- Then it should finish successfully
8
- And the message has the following fields and values:
9
- | field | value |
10
- | ofp_version | 1 |
11
- | message_type | 11 |
12
- | message_length | 88 |
13
- | transaction_id | 0 |
14
- | xid | 0 |
15
- | match.wildcards.keys.size | 11 |
16
- | match.wildcards.fetch(:destination_mac_address) | true |
17
- | match.wildcards.fetch(:source_mac_address) | true |
18
- | match.wildcards.fetch(:ether_type) | true |
19
- | match.wildcards.fetch(:destination_ip_address_all) | true |
20
- | match.wildcards.fetch(:ip_protocol) | true |
21
- | match.wildcards.fetch(:source_ip_address_all) | true |
22
- | match.wildcards.fetch(:tos) | true |
23
- | match.wildcards.fetch(:transport_destination_port) | true |
24
- | match.wildcards.fetch(:transport_source_port) | true |
25
- | match.wildcards.fetch(:vlan_priority) | true |
26
- | match.wildcards.fetch(:vlan_vid) | true |
27
- | cookie | 1 |
28
- | priority | 65535 |
8
+ When I parse a file named "open_flow10/flow_removed.raw" with "FlowRemoved" class
9
+ Then the message has the following fields and values:
10
+ | field | value |
11
+ | transaction_id | 0 |
12
+ | xid | 0 |
13
+ | match.wildcards.keys.size | 11 |
14
+ | match.wildcards.fetch(:destination_mac_address) | true |
15
+ | match.wildcards.fetch(:source_mac_address) | true |
16
+ | match.wildcards.fetch(:ether_type) | true |
17
+ | match.wildcards.fetch(:destination_ip_address_all) | true |
18
+ | match.wildcards.fetch(:ip_protocol) | true |
19
+ | match.wildcards.fetch(:source_ip_address_all) | true |
20
+ | match.wildcards.fetch(:tos) | true |
21
+ | match.wildcards.fetch(:transport_destination_port) | true |
22
+ | match.wildcards.fetch(:transport_source_port) | true |
23
+ | match.wildcards.fetch(:vlan_priority) | true |
24
+ | match.wildcards.fetch(:vlan_vid) | true |
25
+ | cookie | 1 |
26
+ | priority | 65535 |
29
27
  | reason | :delete |
30
- | duration_sec | 0 |
31
- | duration_nsec | 0 |
32
- | idle_timeout | 0 |
33
- | packet_count | 0 |
34
- | byte_count | 0 |
28
+ | duration_sec | 0 |
29
+ | duration_nsec | 0 |
30
+ | idle_timeout | 0 |
31
+ | packet_count | 0 |
32
+ | byte_count | 0 |
@@ -1,16 +1,13 @@
1
1
  @open_flow10
2
- Feature: Pio::FlowStats::Reply
2
+ Feature: FlowStats::Reply
3
3
  Scenario: new
4
- When I try to create an OpenFlow message with:
4
+ When I create an OpenFlow message with:
5
5
  """
6
6
  Pio::FlowStats::Reply.new
7
7
  """
8
- Then it should finish successfully
9
- And the message has the following fields and values:
8
+ Then the message has the following fields and values:
10
9
  | field | value |
11
- | ofp_version | 1 |
12
- | message_type | 17 |
13
- | message_length | 12 |
10
+ | version | 1 |
14
11
  | transaction_id | 0 |
15
12
  | xid | 0 |
16
13
  | stats_type | :flow |
@@ -18,88 +15,7 @@ Feature: Pio::FlowStats::Reply
18
15
 
19
16
  @wip
20
17
  Scenario: new(more options)
21
- When I try to create an OpenFlow message with:
18
+ When I create an OpenFlow message with:
22
19
  """
23
20
  Pio::FlowStats::Reply.new(more options)
24
21
  """
25
- Then it should finish successfully
26
-
27
- Scenario: read
28
- When I try to parse a file named "open_flow10/flow_stats_reply.raw" with "FlowStats::Reply" class
29
- Then it should finish successfully
30
- And the message has the following fields and values:
31
- | field | value |
32
- | ofp_version | 1 |
33
- | message_type | 17 |
34
- | message_length | 228 |
35
- | transaction_id | 6 |
36
- | xid | 6 |
37
- | stats_type | :flow |
38
- | stats.size | 2 |
39
- | stats[0].entry_length | 104 |
40
- | stats[0].table_id | 3 |
41
- | stats[0].match.wildcards.keys.size | 14 |
42
- | stats[0].match.wildcards.fetch(:destination_mac_address) | true |
43
- | stats[0].match.wildcards.fetch(:source_mac_address) | true |
44
- | stats[0].match.wildcards.fetch(:ether_type) | true |
45
- | stats[0].match.wildcards.fetch(:in_port) | true |
46
- | stats[0].match.wildcards.fetch(:destination_ip_address) | 31 |
47
- | stats[0].match.wildcards.fetch(:destination_ip_address_all) | true |
48
- | stats[0].match.wildcards.fetch(:ip_protocol) | true |
49
- | stats[0].match.wildcards.fetch(:source_ip_address) | 31 |
50
- | stats[0].match.wildcards.fetch(:source_ip_address_all) | true |
51
- | stats[0].match.wildcards.fetch(:tos) | true |
52
- | stats[0].match.wildcards.fetch(:transport_destination_port) | true |
53
- | stats[0].match.wildcards.fetch(:transport_source_port) | true |
54
- | stats[0].match.wildcards.fetch(:vlan_priority) | true |
55
- | stats[0].match.wildcards.fetch(:vlan_vid) | true |
56
- | stats[0].duration_sec | 1 |
57
- | stats[0].duration_nsec | 2 |
58
- | stats[0].priority | 100 |
59
- | stats[0].idle_timeout | 5 |
60
- | stats[0].hard_timeout | 10 |
61
- | stats[0].cookie.to_hex | 0x123456789abcdef |
62
- | stats[0].packet_count | 10 |
63
- | stats[0].byte_count | 1000 |
64
- | stats[0].actions.length | 2 |
65
- | stats[0].actions[0].class | Pio::OpenFlow10::SendOutPort |
66
- | stats[0].actions[0].port | 1 |
67
- | stats[0].actions[0].max_length | 0 |
68
- | stats[0].actions[1].class | Pio::OpenFlow10::SendOutPort |
69
- | stats[0].actions[1].port | 2 |
70
- | stats[0].actions[1].max_length | 0 |
71
- | stats[1].entry_length | 112 |
72
- | stats[1].table_id | 4 |
73
- | stats[1].match.wildcards.keys.size | 14 |
74
- | stats[1].match.wildcards.fetch(:destination_mac_address) | true |
75
- | stats[1].match.wildcards.fetch(:source_mac_address) | true |
76
- | stats[1].match.wildcards.fetch(:ether_type) | true |
77
- | stats[1].match.wildcards.fetch(:in_port) | true |
78
- | stats[1].match.wildcards.fetch(:destination_ip_address) | 31 |
79
- | stats[1].match.wildcards.fetch(:destination_ip_address_all) | true |
80
- | stats[1].match.wildcards.fetch(:ip_protocol) | true |
81
- | stats[1].match.wildcards.fetch(:source_ip_address) | 31 |
82
- | stats[1].match.wildcards.fetch(:source_ip_address_all) | true |
83
- | stats[1].match.wildcards.fetch(:tos) | true |
84
- | stats[1].match.wildcards.fetch(:transport_destination_port) | true |
85
- | stats[1].match.wildcards.fetch(:transport_source_port) | true |
86
- | stats[1].match.wildcards.fetch(:vlan_priority) | true |
87
- | stats[1].match.wildcards.fetch(:vlan_vid) | true |
88
- | stats[1].duration_sec | 1 |
89
- | stats[1].duration_nsec | 2 |
90
- | stats[1].priority | 100 |
91
- | stats[1].idle_timeout | 5 |
92
- | stats[1].hard_timeout | 10 |
93
- | stats[1].cookie.to_hex | 0x123456789abcdef |
94
- | stats[1].packet_count | 10 |
95
- | stats[1].byte_count | 1000 |
96
- | stats[1].actions.length | 3 |
97
- | stats[1].actions[0].class | Pio::OpenFlow10::SendOutPort |
98
- | stats[1].actions[0].port | 1 |
99
- | stats[1].actions[0].max_length | 0 |
100
- | stats[1].actions[1].class | Pio::OpenFlow10::SendOutPort |
101
- | stats[1].actions[1].port | 2 |
102
- | stats[1].actions[1].max_length | 0 |
103
- | stats[1].actions[2].class | Pio::OpenFlow10::SendOutPort |
104
- | stats[1].actions[2].port | 3 |
105
- | stats[1].actions[2].max_length | 0 |
@@ -1,16 +1,17 @@
1
1
  @open_flow10
2
- Feature: Pio::FlowStats::Request
2
+ Feature: FlowStats::Request
3
+
4
+ Information about individual flows is requested with a Flow Stats
5
+ Request message.
6
+
3
7
  Scenario: new
4
- When I try to create an OpenFlow message with:
8
+ When I create an OpenFlow message with:
5
9
  """
6
10
  Pio::FlowStats::Request.new
7
11
  """
8
- Then it should finish successfully
9
- And the message has the following fields and values:
12
+ Then the message has the following fields and values:
10
13
  | field | value |
11
- | ofp_version | 1 |
12
- | message_type | 16 |
13
- | message_length | 56 |
14
+ | version | 1 |
14
15
  | transaction_id | 0 |
15
16
  | xid | 0 |
16
17
  | stats_type | :flow |
@@ -31,16 +32,13 @@ Feature: Pio::FlowStats::Request
31
32
  | out_port | :none |
32
33
 
33
34
  Scenario: new
34
- When I try to create an OpenFlow message with:
35
+ When I create an OpenFlow message with:
35
36
  """
36
- Pio::FlowStats::Request.new(match: Match.new(in_port: 1))
37
+ Pio::FlowStats::Request.new(match: Pio::Match.new(in_port: 1))
37
38
  """
38
- Then it should finish successfully
39
- And the message has the following fields and values:
39
+ Then the message has the following fields and values:
40
40
  | field | value |
41
- | ofp_version | 1 |
42
- | message_type | 16 |
43
- | message_length | 56 |
41
+ | version | 1 |
44
42
  | transaction_id | 0 |
45
43
  | xid | 0 |
46
44
  | stats_type | :flow |
@@ -59,31 +57,3 @@ Feature: Pio::FlowStats::Request
59
57
  | match.wildcards.fetch(:vlan_vid) | true |
60
58
  | table_id.to_hex | 0xff |
61
59
  | out_port | :none |
62
-
63
-
64
- Scenario: read
65
- When I try to parse a file named "open_flow10/flow_stats_request.raw" with "FlowStats::Request" class
66
- Then it should finish successfully
67
- And the message has the following fields and values:
68
- | field | value |
69
- | ofp_version | 1 |
70
- | message_type | 16 |
71
- | message_length | 56 |
72
- | transaction_id | 13 |
73
- | xid | 13 |
74
- | stats_type | :flow |
75
- | match.wildcards.keys.size | 12 |
76
- | match.wildcards.fetch(:destination_mac_address) | true |
77
- | match.wildcards.fetch(:source_mac_address) | true |
78
- | match.wildcards.fetch(:ether_type) | true |
79
- | match.wildcards.fetch(:in_port) | true |
80
- | match.wildcards.fetch(:destination_ip_address_all) | true |
81
- | match.wildcards.fetch(:ip_protocol) | true |
82
- | match.wildcards.fetch(:source_ip_address_all) | true |
83
- | match.wildcards.fetch(:tos) | true |
84
- | match.wildcards.fetch(:transport_destination_port) | true |
85
- | match.wildcards.fetch(:transport_source_port) | true |
86
- | match.wildcards.fetch(:vlan_priority) | true |
87
- | match.wildcards.fetch(:vlan_vid) | true |
88
- | table_id.to_hex | 0xff |
89
- | out_port | :none |
@@ -1,50 +1,28 @@
1
1
  @open_flow10
2
- Feature: Pio::Hello
2
+ Feature: Hello
3
3
 
4
4
  Hello messages are exchanged between the switch and controller upon
5
- connection startup.
5
+ connection startup. Hello messages have the version field set to the
6
+ highest OpenFlow protocol version supported by the sender.
6
7
 
7
8
  Scenario: new
8
- When I try to create an OpenFlow message with:
9
+ When I create an OpenFlow message with:
9
10
  """
10
- Pio::OpenFlow10::Hello.new
11
+ Pio::Hello.new
11
12
  """
12
- Then it should finish successfully
13
- And the message has the following fields and values:
13
+ Then the message has the following fields and values:
14
14
  | field | value |
15
- | ofp_version | 1 |
16
- | message_type | 0 |
17
- | message_length | 8 |
15
+ | version | 1 |
18
16
  | transaction_id | 0 |
19
17
  | xid | 0 |
20
- | body | |
21
- | user_data | |
22
18
 
23
19
  Scenario: new(transaction_id: 123)
24
- When I try to create an OpenFlow message with:
20
+ When I create an OpenFlow message with:
25
21
  """
26
22
  Pio::Hello.new(transaction_id: 123)
27
23
  """
28
- Then it should finish successfully
29
- And the message has the following fields and values:
24
+ Then the message has the following fields and values:
30
25
  | field | value |
31
- | ofp_version | 1 |
32
- | message_type | 0 |
33
- | message_length | 8 |
26
+ | version | 1 |
34
27
  | transaction_id | 123 |
35
28
  | xid | 123 |
36
- | body | |
37
- | user_data | |
38
-
39
- Scenario: read
40
- When I try to parse a file named "open_flow10/hello.raw" with "Hello" class
41
- Then it should finish successfully
42
- And the message has the following fields and values:
43
- | field | value |
44
- | ofp_version | 1 |
45
- | message_type | 0 |
46
- | message_length | 8 |
47
- | transaction_id | 23 |
48
- | xid | 23 |
49
- | body | |
50
- | user_data | |
@@ -1,69 +1,19 @@
1
1
  @open_flow10
2
- Feature: Pio::Error::HelloFailed
2
+ Feature: Error::HelloFailed
3
3
 
4
- Hello protocol failed
4
+ Hello protocol failed error
5
5
 
6
- Scenario: new
7
- When I try to create an OpenFlow message with:
6
+ Scenario: new(error_code: :incompatible, description: 'error description')
7
+ When I create an OpenFlow message with:
8
8
  """
9
- Pio::Error::HelloFailed.new
9
+ Pio::Error::HelloFailed.new(error_code: :incompatible,
10
+ description: 'error description')
10
11
  """
11
- Then it should finish successfully
12
- And the message has the following fields and values:
13
- | field | value |
14
- | ofp_version | 1 |
15
- | message_type | 1 |
16
- | message_length | 12 |
17
- | transaction_id | 0 |
18
- | xid | 0 |
19
- | error_type | :hello_failed |
20
- | error_code | :incompatible |
21
- | description | |
22
-
23
- Scenario: new(description: 'error description')
24
- When I try to create an OpenFlow message with:
25
- """
26
- Pio::Error::HelloFailed.new(description: 'error description')
27
- """
28
- Then it should finish successfully
29
- And the message has the following fields and values:
12
+ Then the message has the following fields and values:
30
13
  | field | value |
31
- | ofp_version | 1 |
32
- | message_type | 1 |
33
- | message_length | 29 |
34
14
  | transaction_id | 0 |
35
15
  | xid | 0 |
36
16
  | error_type | :hello_failed |
37
17
  | error_code | :incompatible |
38
18
  | description | error description |
39
19
 
40
- Scenario: new(error_code: :permissions_error)
41
- When I try to create an OpenFlow message with:
42
- """
43
- Pio::Error::HelloFailed.new(error_code: :permissions_error)
44
- """
45
- Then it should finish successfully
46
- And the message has the following fields and values:
47
- | field | value |
48
- | ofp_version | 1 |
49
- | message_type | 1 |
50
- | message_length | 12 |
51
- | transaction_id | 0 |
52
- | xid | 0 |
53
- | error_type | :hello_failed |
54
- | error_code | :permissions_error |
55
- | description | |
56
-
57
- Scenario: read
58
- When I try to parse a file named "open_flow10/hello_failed.raw" with "Pio::Error::HelloFailed" class
59
- Then it should finish successfully
60
- And the message has the following fields and values:
61
- | field | value |
62
- | ofp_version | 1 |
63
- | message_type | 1 |
64
- | message_length | 29 |
65
- | transaction_id | 0 |
66
- | xid | 0 |
67
- | error_type | :hello_failed |
68
- | error_code | :incompatible |
69
- | description | error description |
@@ -1,57 +1,138 @@
1
1
  @open_flow10
2
- Feature: Pio::PacketIn
2
+ Feature: PacketIn
3
+
4
+ When packets are received by the datapath and sent to the
5
+ controller, they use the PacketIn message.
6
+
3
7
  Scenario: new
4
- When I try to create an OpenFlow message with:
8
+ When I create an OpenFlow message with:
9
+ """ruby
10
+ arp_request = Pio::Arp::Request.new(
11
+ source_mac: 'fa:ce:b0:00:00:cc',
12
+ sender_protocol_address: '192.168.0.1',
13
+ target_protocol_address: '192.168.0.2'
14
+ )
15
+
16
+ Pio::PacketIn.new(transaction_id: 0,
17
+ buffer_id: 0xffffff00,
18
+ in_port: 1,
19
+ reason: :no_match,
20
+ raw_data: arp_request.to_binary)
21
+ """
22
+ Then the message has the following fields and values:
23
+ | field | value |
24
+ | transaction_id | 0 |
25
+ | xid | 0 |
26
+ | buffer_id | 4294967040 |
27
+ | total_length | 64 |
28
+ | in_port | 1 |
29
+ | reason | :no_match |
30
+ | data.class | Pio::Arp::Request |
31
+ | source_mac | fa:ce:b0:00:00:cc |
32
+ | destination_mac | ff:ff:ff:ff:ff:ff |
33
+
34
+ Scenario: read an empty PacketIn message
35
+ Given I use the fixture "open_flow10"
36
+ When I create a packet with:
37
+ """ruby
38
+ Pio::PacketIn.read(eval(IO.read('packet_in.rb')))
39
+ """
40
+ Then the packet has the following fields and values:
41
+ | field | value |
42
+ | transaction_id | 0 |
43
+ | xid | 0 |
44
+ | buffer_id | 4294967040 |
45
+ | in_port | 1 |
46
+ | reason | :no_match |
47
+
48
+ Scenario: read a PacketIn message (ARP request)
49
+ Given I use the fixture "open_flow10"
50
+ When I create a packet with:
51
+ """ruby
52
+ Pio::PacketIn.read(eval(IO.read('packet_in_arp_request.rb')))
53
+ """
54
+ Then the packet has the following fields and values:
55
+ | field | value |
56
+ | transaction_id | 0 |
57
+ | xid | 0 |
58
+ | buffer_id | 4294967040 |
59
+ | total_length | 64 |
60
+ | in_port | 1 |
61
+ | reason | :no_match |
62
+ | data.class | Pio::Arp::Request |
63
+ | source_mac | fa:ce:b0:00:00:cc |
64
+ | destination_mac | ff:ff:ff:ff:ff:ff |
65
+
66
+ Scenario: convert PacketIn to Ruby code
67
+ When I eval the following Ruby code:
68
+ """ruby
69
+ arp_request = Pio::Arp::Request.new(
70
+ source_mac: 'fa:ce:b0:00:00:cc',
71
+ sender_protocol_address: '192.168.0.1',
72
+ target_protocol_address: '192.168.0.2'
73
+ )
74
+
75
+ Pio::PacketIn.new(transaction_id: 0,
76
+ buffer_id: 0xffffff00,
77
+ in_port: 1,
78
+ reason: :no_match,
79
+ raw_data: arp_request.to_binary).to_ruby
80
+ """
81
+ Then the result of eval should be:
82
+ """ruby
83
+ [
84
+ 0x01, # version
85
+ 0x0a, # type
86
+ 0x00, 0x52, # _length
87
+ 0x00, 0x00, 0x00, 0x00, # transaction_id
88
+ 0xff, 0xff, 0xff, 0x00, # buffer_id
89
+ 0x00, 0x40, # total_length
90
+ 0x00, 0x01, # in_port
91
+ 0x00, # reason
92
+ 0x00, # padding
93
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xce, 0xb0, 0x00, 0x00, 0xcc, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0xfa, 0xce, 0xb0, 0x00, 0x00, 0xcc, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xa8, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # raw_data
94
+ ].pack('C82')
5
95
  """
6
- data_dump = [
7
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x5d, 0x10, 0x31, 0x37,
8
- 0x79, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01,
9
- 0xac, 0x5d, 0x10, 0x31, 0x37, 0x79, 0xc0, 0xa8, 0x02, 0xfe, 0xff,
10
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa8, 0x02, 0x05, 0x00, 0x00,
11
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12
- 0x00, 0x00, 0x00, 0x00, 0x00
13
- ].pack('C*')
96
+
97
+ Scenario: PacketIn inspection (empty PacketIn)
98
+ When I eval the following Ruby code:
99
+ """ruby
100
+ Pio::PacketIn.new(transaction_id: 0,
101
+ buffer_id: 0xffffff00,
102
+ in_port: 1,
103
+ reason: :no_match).inspect
104
+ """
105
+ Then the result of eval should be:
106
+ """
107
+ #<PacketIn open_flow_version: 1, message_type: 10, message_length: 18, transaction_id: 0x0, buffer_id: 0xffffff00, total_length: 0, in_port: 1, reason: :no_match, raw_data: "">
108
+ """
109
+
110
+ Scenario: PacketIn inspection (ARP request)
111
+ When I eval the following Ruby code:
112
+ """ruby
113
+ arp_request = Pio::Arp::Request.new(
114
+ source_mac: 'fa:ce:b0:00:00:cc',
115
+ sender_protocol_address: '192.168.0.1',
116
+ target_protocol_address: '192.168.0.2'
117
+ )
14
118
 
15
119
  Pio::PacketIn.new(transaction_id: 0,
16
120
  buffer_id: 0xffffff00,
17
121
  in_port: 1,
18
122
  reason: :no_match,
19
- raw_data: data_dump)
20
- """
21
- Then it should finish successfully
22
- And the message has the following fields and values:
23
- | field | value |
24
- | ofp_version | 1 |
25
- | message_type | 10 |
26
- | message_length | 78 |
27
- | transaction_id | 0 |
28
- | xid | 0 |
29
- | buffer_id | 4294967040 |
30
- | total_len | 60 |
31
- | in_port | 1 |
32
- | reason | :no_match |
33
- | raw_data.length | 60 |
34
- | source_mac | ac:5d:10:31:37:79 |
35
- | source_mac.class | Pio::Mac |
36
- | destination_mac | ff:ff:ff:ff:ff:ff |
37
- | destination_mac.class | Pio::Mac |
38
-
39
- Scenario: read
40
- When I try to parse a file named "open_flow10/packet_in_arp_request.raw" with "PacketIn" class
41
- Then it should finish successfully
42
- And the message has the following fields and values:
43
- | field | value |
44
- | ofp_version | 1 |
45
- | message_type | 10 |
46
- | message_length | 78 |
47
- | transaction_id | 0 |
48
- | xid | 0 |
49
- | buffer_id | 4294967040 |
50
- | total_len | 60 |
51
- | in_port | 1 |
52
- | reason | :no_match |
53
- | raw_data.length | 60 |
54
- | source_mac | ac:5d:10:31:37:79 |
55
- | source_mac.class | Pio::Mac |
56
- | destination_mac | ff:ff:ff:ff:ff:ff |
57
- | destination_mac.class | Pio::Mac |
123
+ raw_data: arp_request.to_binary).inspect
124
+ """
125
+ Then the result of eval should be:
126
+ """
127
+ #<PacketIn open_flow_version: 1, message_type: 10, message_length: 82, transaction_id: 0x0, buffer_id: 0xffffff00, total_length: 64, in_port: 1, reason: :no_match, data: #<Pio::Arp::Request destination_mac: "ff:ff:ff:ff:ff:ff", source_mac: "fa:ce:b0:00:00:cc", ether_type: 0x0806, hardware_type: 1, protocol_type: 2048, hardware_length: 6, protocol_length: 4, operation: 1, sender_hardware_address: "fa:ce:b0:00:00:cc", sender_protocol_address: "192.168.0.1", target_hardware_address: "00:00:00:00:00:00", target_protocol_address: "192.168.0.2">>
128
+ """
129
+
130
+ Scenario: PacketIn class inspection
131
+ When I eval the following Ruby code:
132
+ """ruby
133
+ Pio::PacketIn.inspect
134
+ """
135
+ Then the result of eval should be:
136
+ """
137
+ PacketIn(open_flow_version: uint8, message_type: uint8, message_length: uint16, transaction_id: uint32, buffer_id: uint32, total_length: uint16, in_port: uint16, reason: symbol, raw_data: string)
138
+ """