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,149 @@
1
+ Feature: EthernetHeader
2
+ Scenario: create an Ethernet header
3
+ When I create a packet with:
4
+ """ruby
5
+ Pio::EthernetHeader.new(
6
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
7
+ source_mac: '00:26:82:eb:ea:d1',
8
+ ether_type: Pio::Ethernet::Type::IPV4
9
+ )
10
+ """
11
+ Then the packet has the following fields and values:
12
+ | field | value |
13
+ | class | Pio::EthernetHeader |
14
+ | destination_mac | ff:ff:ff:ff:ff:ff |
15
+ | source_mac | 00:26:82:eb:ea:d1 |
16
+ | ether_type.to_hex | 0x800 |
17
+
18
+ Scenario: create a VLAN-tagged Ethernet header
19
+ When I create a packet with:
20
+ """ruby
21
+ Pio::EthernetHeader.new(
22
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
23
+ source_mac: '00:26:82:eb:ea:d1',
24
+ ether_type: Pio::Ethernet::Type::VLAN,
25
+ vlan_pcp: 5,
26
+ vlan_cfi: 0,
27
+ vlan_vid: 100
28
+ )
29
+ """
30
+ Then the packet has the following fields and values:
31
+ | field | value |
32
+ | class | Pio::EthernetHeader |
33
+ | destination_mac | ff:ff:ff:ff:ff:ff |
34
+ | source_mac | 00:26:82:eb:ea:d1 |
35
+ | ether_type.to_hex | 0x8100 |
36
+ | vlan_pcp | 5 |
37
+ | vlan_cfi | 0 |
38
+ | vlan_vid | 100 |
39
+
40
+ Scenario: read an Ethernet header
41
+ Given I use the fixture "ethernet_header"
42
+ When I create a packet with:
43
+ """ruby
44
+ Pio::EthernetHeader.read(eval(IO.read('ethernet_header.rb')))
45
+ """
46
+ Then the packet has the following fields and values:
47
+ | field | value |
48
+ | class | Pio::EthernetHeader |
49
+ | destination_mac | ff:ff:ff:ff:ff:ff |
50
+ | source_mac | 00:26:82:eb:ea:d1 |
51
+ | ether_type.to_hex | 0x800 |
52
+
53
+ Scenario: read a VLAN-tagged Ethernet header
54
+ Given I use the fixture "ethernet_header"
55
+ When I create a packet with:
56
+ """ruby
57
+ Pio::EthernetHeader.read(eval(IO.read('vlan_ethernet_header.rb')))
58
+ """
59
+ Then the packet has the following fields and values:
60
+ | field | value |
61
+ | class | Pio::EthernetHeader |
62
+ | destination_mac | ff:ff:ff:ff:ff:ff |
63
+ | source_mac | 00:26:82:eb:ea:d1 |
64
+ | ether_type.to_hex | 0x8100 |
65
+ | vlan_pcp | 5 |
66
+ | vlan_cfi | 0 |
67
+ | vlan_vid | 100 |
68
+
69
+ Scenario: convert Ethernet header to Ruby code
70
+ When I eval the following Ruby code:
71
+ """ruby
72
+ Pio::EthernetHeader.new(
73
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
74
+ source_mac: '00:26:82:eb:ea:d1',
75
+ ether_type: Pio::Ethernet::Type::IPV4
76
+ ).to_ruby
77
+ """
78
+ Then the result of eval should be:
79
+ """ruby
80
+ [
81
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # destination_mac
82
+ 0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # source_mac
83
+ 0x08, 0x00, # ether_type
84
+ ].pack('C14')
85
+ """
86
+
87
+ Scenario: convert VLAN-tagged Ethernet header to Ruby code
88
+ When I eval the following Ruby code:
89
+ """ruby
90
+ Pio::EthernetHeader.new(
91
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
92
+ source_mac: '00:26:82:eb:ea:d1',
93
+ ether_type: Pio::Ethernet::Type::VLAN,
94
+ vlan_pcp: 5,
95
+ vlan_cfi: 0,
96
+ vlan_vid: 100
97
+ ).to_ruby
98
+ """
99
+ Then the result of eval should be:
100
+ """ruby
101
+ [
102
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, # destination_mac
103
+ 0x00, 0x26, 0x82, 0xeb, 0xea, 0xd1, # source_mac
104
+ 0x81, 0x00, # ether_type
105
+ 0b101_0_000001100100, # vlan_pcp, vlan_cfi, vlan_vid
106
+ 0x81, 0x00, # ether_type_vlan
107
+ ].pack('C14nC2')
108
+ """
109
+
110
+ Scenario: EthernetHeader instance inspection
111
+ When I eval the following Ruby code:
112
+ """ruby
113
+ Pio::EthernetHeader.new(
114
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
115
+ source_mac: '00:26:82:eb:ea:d1',
116
+ ether_type: Pio::Ethernet::Type::IPV4,
117
+ ).inspect
118
+ """
119
+ Then the result of eval should be:
120
+ """
121
+ #<Pio::EthernetHeader destination_mac: "ff:ff:ff:ff:ff:ff", source_mac: "00:26:82:eb:ea:d1", ether_type: 0x0800>
122
+ """
123
+
124
+ Scenario: VLAN-tagged EthernetHeader instance inspection
125
+ When I eval the following Ruby code:
126
+ """ruby
127
+ Pio::EthernetHeader.new(
128
+ destination_mac: 'ff:ff:ff:ff:ff:ff',
129
+ source_mac: '00:26:82:eb:ea:d1',
130
+ ether_type: Pio::Ethernet::Type::VLAN,
131
+ vlan_pcp: 5,
132
+ vlan_cfi: 0,
133
+ vlan_vid: 100
134
+ ).inspect
135
+ """
136
+ Then the result of eval should be:
137
+ """
138
+ #<Pio::EthernetHeader destination_mac: "ff:ff:ff:ff:ff:ff", source_mac: "00:26:82:eb:ea:d1", ether_type: 0x8100, vlan_pcp: 5, vlan_cfi: 0, vlan_vid: 100, ether_type_vlan: 0x8100>
139
+ """
140
+
141
+ Scenario: EthernetHeader class inspection
142
+ When I eval the following Ruby code:
143
+ """ruby
144
+ Pio::EthernetHeader.inspect
145
+ """
146
+ Then the result of eval should be:
147
+ """
148
+ Pio::EthernetHeader(destination_mac: mac_address, source_mac: mac_address, ether_type: ether_type, vlan_pcp: bit3, vlan_cfi: bit1, vlan_vid: bit12, ether_type_vlan: uint16)
149
+ """
@@ -0,0 +1,47 @@
1
+ Feature: Icmp
2
+ Background:
3
+ Given I use the fixture "icmp"
4
+
5
+ Scenario: read an ICMP request
6
+ When I create a packet with:
7
+ """ruby
8
+ Pio::Icmp.read(eval(IO.read('icmp_request.rb')))
9
+ """
10
+ Then the packet has the following fields and values:
11
+ | field | value |
12
+ | class | Pio::Icmp::Request |
13
+ | destination_mac | 11:22:33:44:55:66 |
14
+ | source_mac | 66:55:44:33:22:11 |
15
+ | ether_type.to_hex | 0x800 |
16
+ | ip_total_length | 54 |
17
+ | ip_protocol | 1 |
18
+ | source_ip_address | 192.168.83.3 |
19
+ | destination_ip_address | 192.168.83.254 |
20
+ | icmp_type | 8 |
21
+ | icmp_code | 0 |
22
+ | icmp_checksum | 26613 |
23
+ | icmp_identifier | 256 |
24
+ | icmp_sequence_number | 111 |
25
+ | echo_data | abcdefghijklmnopqrstuvwxyz |
26
+
27
+ Scenario: read an ICMP reply
28
+ When I create a packet with:
29
+ """ruby
30
+ Pio::Icmp.read(eval(IO.read('icmp_reply.rb')))
31
+ """
32
+ Then the packet has the following fields and values:
33
+ | field | value |
34
+ | class | Pio::Icmp::Reply |
35
+ | destination_mac | 11:22:33:44:55:66 |
36
+ | source_mac | 66:55:44:33:22:11 |
37
+ | ether_type.to_hex | 0x800 |
38
+ | ip_total_length | 54 |
39
+ | ip_protocol | 1 |
40
+ | source_ip_address | 192.168.83.254 |
41
+ | destination_ip_address | 192.168.83.3 |
42
+ | icmp_type | 0 |
43
+ | icmp_code | 0 |
44
+ | icmp_checksum | 28661 |
45
+ | icmp_identifier | 256 |
46
+ | icmp_sequence_number | 111 |
47
+ | echo_data | abcdefghijklmnopqrstuvwxyz |
@@ -0,0 +1,93 @@
1
+ Feature: Icmp::Reply
2
+ Scenario: create an ICMP reply
3
+ When I create a packet with:
4
+ """
5
+ Pio::Icmp::Reply.new(
6
+ destination_mac: '11:22:33:44:55:66',
7
+ source_mac: '66:55:44:33:22:11',
8
+ source_ip_address: '192.168.83.254',
9
+ destination_ip_address: '192.168.83.3',
10
+ icmp_identifier: 256,
11
+ icmp_sequence_number: 111,
12
+ echo_data: 'hello world'
13
+ )
14
+ """
15
+ Then the packet has the following fields and values:
16
+ | field | value |
17
+ | destination_mac | 11:22:33:44:55:66 |
18
+ | source_mac | 66:55:44:33:22:11 |
19
+ | ether_type.to_hex | 0x800 |
20
+ | ip_total_length | 50 |
21
+ | ip_protocol | 1 |
22
+ | source_ip_address | 192.168.83.254 |
23
+ | destination_ip_address | 192.168.83.3 |
24
+ | icmp_type | 0 |
25
+ | icmp_code | 0 |
26
+ | icmp_checksum | 53442 |
27
+ | icmp_identifier | 256 |
28
+ | icmp_sequence_number | 111 |
29
+ | echo_data | hello world |
30
+
31
+ Scenario: convert an ICMP reply to Ruby code
32
+ When I eval the following Ruby code:
33
+ """ruby
34
+ Pio::Icmp::Reply.new(
35
+ destination_mac: '11:22:33:44:55:66',
36
+ source_mac: '66:55:44:33:22:11',
37
+ source_ip_address: '192.168.83.254',
38
+ destination_ip_address: '192.168.83.3',
39
+ icmp_identifier: 256,
40
+ icmp_sequence_number: 0
41
+ ).to_ruby
42
+ """
43
+ Then the result of eval should be:
44
+ """ruby
45
+ [
46
+ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, # destination_mac
47
+ 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, # source_mac
48
+ 0x08, 0x00, # ether_type
49
+ 0b0100_0101, # ip_version, ip_header_length
50
+ 0x00, # ip_type_of_service
51
+ 0x00, 0x32, # ip_total_length
52
+ 0x00, 0x00, # ip_identifier
53
+ 0b000_0000000000000, # ip_flag, ip_fragment
54
+ 0x80, # ip_ttl
55
+ 0x01, # ip_protocol
56
+ 0x12, 0x79, # ip_header_checksum
57
+ 0xc0, 0xa8, 0x53, 0xfe, # source_ip_address
58
+ 0xc0, 0xa8, 0x53, 0x03, # destination_ip_address
59
+ 0x00, # icmp_type
60
+ 0x00, # icmp_code
61
+ 0xfe, 0xff, # icmp_checksum
62
+ 0x01, 0x00, # icmp_identifier
63
+ 0x00, 0x00, # icmp_sequence_number
64
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
65
+ ].pack('C20nC42')
66
+ """
67
+
68
+ Scenario: Icmp::Reply instance inspection
69
+ When I create a packet with:
70
+ """
71
+ Pio::Icmp::Reply.new(
72
+ destination_mac: '00:26:82:eb:ea:d1',
73
+ source_mac: '00:16:9d:1d:9c:c4',
74
+ source_ip_address: '1.2.3.4',
75
+ destination_ip_address: '4.3.2.1',
76
+ icmp_identifier: 256,
77
+ icmp_sequence_number: 0
78
+ ).inspect
79
+ """
80
+ Then the result of eval should be:
81
+ """
82
+ #<Pio::Icmp::Reply destination_mac: "00:26:82:eb:ea:d1", source_mac: "00:16:9d:1d:9c:c4", ether_type: 0x0800, ip_version: 4, ip_header_length: 5, ip_type_of_service: 0, ip_total_length: 50, ip_identifier: 0, ip_flag: 0, ip_fragment: 0, ip_ttl: 128, ip_protocol: 1, ip_header_checksum: 12482, source_ip_address: "1.2.3.4", destination_ip_address: "4.3.2.1", ip_option: "", icmp_type: 0, icmp_code: 0, icmp_checksum: 65279, icmp_identifier: 256, icmp_sequence_number: 0, echo_data: "">
83
+ """
84
+
85
+ Scenario: Icmp::Reply class inspection
86
+ When I eval the following Ruby code:
87
+ """ruby
88
+ Pio::Icmp::Reply.inspect
89
+ """
90
+ Then the result of eval should be:
91
+ """
92
+ Pio::Icmp::Reply(destination_mac: mac_address, source_mac: mac_address, ether_type: ether_type, vlan_pcp: bit3, vlan_cfi: bit1, vlan_vid: bit12, ether_type_vlan: uint16, 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, icmp_type: uint8, icmp_code: uint8, icmp_checksum: uint16, icmp_identifier: uint16, icmp_sequence_number: uint16, echo_data: string)
93
+ """
@@ -0,0 +1,89 @@
1
+ Feature: Icmp::Request
2
+ Scenario: create an ICMP request
3
+ When I create a packet with:
4
+ """ruby
5
+ Pio::Icmp::Request.new(
6
+ source_mac: '11:22:33:44:55:66',
7
+ destination_mac: '66:55:44:33:22:11',
8
+ source_ip_address: '192.168.83.3',
9
+ destination_ip_address: '192.168.83.254',
10
+ icmp_identifier: 256,
11
+ icmp_sequence_number: 111,
12
+ echo_data: 'hello world'
13
+ )
14
+ """
15
+ Then the packet has the following fields and values:
16
+ | field | value |
17
+ | source_mac | 11:22:33:44:55:66 |
18
+ | destination_mac | 66:55:44:33:22:11 |
19
+ | ether_type.to_hex | 0x800 |
20
+ | ip_total_length | 50 |
21
+ | ip_protocol | 1 |
22
+ | source_ip_address | 192.168.83.3 |
23
+ | destination_ip_address | 192.168.83.254 |
24
+ | icmp_type | 8 |
25
+ | icmp_code | 0 |
26
+ | icmp_checksum | 51394 |
27
+ | icmp_identifier | 256 |
28
+ | icmp_sequence_number | 111 |
29
+ | echo_data | hello world |
30
+
31
+ Scenario: convert an ICMP request to Ruby code
32
+ When I eval the following Ruby code:
33
+ """ruby
34
+ Pio::Icmp::Request.new(
35
+ destination_mac: '11:22:33:44:55:66',
36
+ source_mac: '66:55:44:33:22:11',
37
+ source_ip_address: '192.168.83.3',
38
+ destination_ip_address: '192.168.83.254'
39
+ ).to_ruby
40
+ """
41
+ Then the result of eval should be:
42
+ """ruby
43
+ [
44
+ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, # destination_mac
45
+ 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, # source_mac
46
+ 0x08, 0x00, # ether_type
47
+ 0b0100_0101, # ip_version, ip_header_length
48
+ 0x00, # ip_type_of_service
49
+ 0x00, 0x32, # ip_total_length
50
+ 0x00, 0x00, # ip_identifier
51
+ 0b000_0000000000000, # ip_flag, ip_fragment
52
+ 0x80, # ip_ttl
53
+ 0x01, # ip_protocol
54
+ 0x12, 0x79, # ip_header_checksum
55
+ 0xc0, 0xa8, 0x53, 0x03, # source_ip_address
56
+ 0xc0, 0xa8, 0x53, 0xfe, # destination_ip_address
57
+ 0x08, # icmp_type
58
+ 0x00, # icmp_code
59
+ 0xf7, 0xff, # icmp_checksum
60
+ 0x00, 0x00, # icmp_identifier
61
+ 0x00, 0x00, # icmp_sequence_number
62
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # padding
63
+ ].pack('C20nC42')
64
+ """
65
+
66
+ Scenario: Icmp::Request instance inspection
67
+ When I create a packet with:
68
+ """ruby
69
+ Pio::Icmp::Request.new(
70
+ destination_mac: '00:26:82:eb:ea:d1',
71
+ source_mac: '00:16:9d:1d:9c:c4',
72
+ source_ip_address: '1.2.3.4',
73
+ destination_ip_address: '4.3.2.1'
74
+ ).inspect
75
+ """
76
+ Then the result of eval should be:
77
+ """
78
+ #<Pio::Icmp::Request destination_mac: "00:26:82:eb:ea:d1", source_mac: "00:16:9d:1d:9c:c4", ether_type: 0x0800, ip_version: 4, ip_header_length: 5, ip_type_of_service: 0, ip_total_length: 50, ip_identifier: 0, ip_flag: 0, ip_fragment: 0, ip_ttl: 128, ip_protocol: 1, ip_header_checksum: 12482, source_ip_address: "1.2.3.4", destination_ip_address: "4.3.2.1", ip_option: "", icmp_type: 8, icmp_code: 0, icmp_checksum: 63487, icmp_identifier: 0, icmp_sequence_number: 0, echo_data: "">
79
+ """
80
+
81
+ Scenario: Icmp::Request class inspection
82
+ When I eval the following Ruby code:
83
+ """ruby
84
+ Pio::Icmp::Request.inspect
85
+ """
86
+ Then the result of eval should be:
87
+ """
88
+ Pio::Icmp::Request(destination_mac: mac_address, source_mac: mac_address, ether_type: ether_type, vlan_pcp: bit3, vlan_cfi: bit1, vlan_vid: bit12, ether_type_vlan: uint16, 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, icmp_type: uint8, icmp_code: uint8, icmp_checksum: uint16, icmp_identifier: uint16, icmp_sequence_number: uint16, echo_data: string)
89
+ """
@@ -0,0 +1,89 @@
1
+ Feature: IPv4Header
2
+ Scenario: create an IPv4 header
3
+ When I create a packet with:
4
+ """ruby
5
+ IPv4Header.new(source_ip_address: '1.2.3.4',
6
+ destination_ip_address: '4.3.2.1')
7
+ """
8
+ Then the packet has the following fields and values:
9
+ | field | value |
10
+ | class | Pio::IPv4Header |
11
+ | ip_version | 4 |
12
+ | ip_header_length | 5 |
13
+ | ip_type_of_service | 0 |
14
+ | ip_total_length | 20 |
15
+ | ip_identifier | 0 |
16
+ | ip_flag | 0 |
17
+ | ip_fragment | 0 |
18
+ | ip_ttl | 128 |
19
+ | ip_protocol | 0 |
20
+ | ip_header_checksum | 12513 |
21
+ | source_ip_address | 1.2.3.4 |
22
+ | destination_ip_address | 4.3.2.1 |
23
+ | ip_option | |
24
+
25
+ Scenario: read an IPv4 header
26
+ Given I use the fixture "ipv4_header"
27
+ When I create a packet with:
28
+ """ruby
29
+ Pio::IPv4Header.read(eval(IO.read('ipv4_header.rb')))
30
+ """
31
+ Then the packet has the following fields and values:
32
+ | field | value |
33
+ | class | Pio::IPv4Header |
34
+ | ip_version | 4 |
35
+ | ip_header_length | 5 |
36
+ | ip_type_of_service | 0 |
37
+ | ip_total_length | 20 |
38
+ | ip_identifier | 0 |
39
+ | ip_flag | 0 |
40
+ | ip_fragment | 0 |
41
+ | ip_ttl | 128 |
42
+ | ip_protocol | 0 |
43
+ | ip_header_checksum | 12513 |
44
+ | source_ip_address | 1.2.3.4 |
45
+ | destination_ip_address | 4.3.2.1 |
46
+ | ip_option | |
47
+
48
+ Scenario: convert IPv4 header to Ruby code
49
+ When I eval the following Ruby code:
50
+ """ruby
51
+ IPv4Header.new(source_ip_address: '1.2.3.4',
52
+ destination_ip_address: '4.3.2.1').to_ruby
53
+ """
54
+ Then the result of eval should be:
55
+ """ruby
56
+ [
57
+ 0b0100_0101, # ip_version, ip_header_length
58
+ 0x00, # ip_type_of_service
59
+ 0x00, 0x14, # ip_total_length
60
+ 0x00, 0x00, # ip_identifier
61
+ 0b000_0000000000000, # ip_flag, ip_fragment
62
+ 0x80, # ip_ttl
63
+ 0x00, # ip_protocol
64
+ 0x30, 0xe1, # ip_header_checksum
65
+ 0x01, 0x02, 0x03, 0x04, # source_ip_address
66
+ 0x04, 0x03, 0x02, 0x01, # destination_ip_address
67
+ ].pack('C6nC12')
68
+ """
69
+
70
+ Scenario: IPv4Header instance inspection
71
+ When I eval the following Ruby code:
72
+ """ruby
73
+ IPv4Header.new(source_ip_address: '1.2.3.4',
74
+ destination_ip_address: '4.3.2.1').inspect
75
+ """
76
+ Then the result of eval should be:
77
+ """
78
+ #<Pio::IPv4Header ip_version: 4, ip_header_length: 5, ip_type_of_service: 0, ip_total_length: 20, ip_identifier: 0, ip_flag: 0, ip_fragment: 0, ip_ttl: 128, ip_protocol: 0, ip_header_checksum: 12513, source_ip_address: "1.2.3.4", destination_ip_address: "4.3.2.1", ip_option: "">
79
+ """
80
+
81
+ Scenario: IPv4Header class inspection
82
+ When I eval the following Ruby code:
83
+ """ruby
84
+ Pio::IPv4Header.inspect
85
+ """
86
+ Then the result of eval should be:
87
+ """
88
+ 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)
89
+ """