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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +6 -49
- data/Rakefile +4 -4
- data/features/{arp.feature → arp/arp.feature} +14 -30
- data/features/arp/arp_reply.feature +69 -0
- data/features/arp/arp_request.feature +67 -0
- data/features/dhcp.feature +157 -162
- data/features/ethernet_header.feature +149 -0
- data/features/icmp/icmp.feature +47 -0
- data/features/icmp/icmp_reply.feature +93 -0
- data/features/icmp/icmp_request.feature +89 -0
- data/features/ipv4_header.feature +89 -0
- data/features/lldp.feature +5 -8
- data/features/open_flow/header.feature +13 -0
- data/features/open_flow/nicira_resubmit.feature +4 -22
- data/features/open_flow/nicira_resubmit_table.feature +6 -16
- data/features/open_flow10/aggregate_stats_reply.feature +5 -7
- data/features/open_flow10/aggregate_stats_request.feature +12 -14
- data/features/open_flow10/bad_request.feature +7 -24
- data/features/open_flow10/barrier_reply.feature +14 -25
- data/features/open_flow10/barrier_request.feature +12 -25
- data/features/open_flow10/description_stats_reply.feature +9 -7
- data/features/open_flow10/description_stats_request.feature +12 -25
- data/features/open_flow10/echo_reply.feature +14 -35
- data/features/open_flow10/echo_request.feature +16 -39
- data/features/open_flow10/enqueue.feature +3 -4
- data/features/open_flow10/exact_match.feature +5 -5
- data/features/open_flow10/features_reply.feature +28 -73
- data/features/open_flow10/features_request.feature +10 -28
- data/features/open_flow10/flow_mod.feature +4 -188
- data/features/open_flow10/flow_removed.feature +28 -30
- data/features/open_flow10/flow_stats_reply.feature +5 -89
- data/features/open_flow10/flow_stats_request.feature +12 -42
- data/features/open_flow10/hello.feature +10 -32
- data/features/open_flow10/hello_failed.feature +7 -57
- data/features/open_flow10/packet_in.feature +130 -49
- data/features/open_flow10/packet_out.feature +29 -18
- data/features/open_flow10/port_stats_request.feature +8 -29
- data/features/open_flow10/port_status.feature +22 -21
- data/features/open_flow10/queue_stats_request.feature +12 -30
- data/features/open_flow10/send_out_port.feature +17 -25
- data/features/open_flow10/set_destination_mac_address.feature +3 -4
- data/features/open_flow10/set_ip_destination_address.feature +3 -4
- data/features/open_flow10/set_source_ip_address.feature +3 -4
- data/features/open_flow10/set_source_mac_address.feature +3 -4
- data/features/open_flow10/set_tos.feature +3 -4
- data/features/open_flow10/set_transport_destination_port.feature +3 -4
- data/features/open_flow10/set_transport_source_port.feature +3 -4
- data/features/open_flow10/set_vlan_priority.feature +3 -4
- data/features/open_flow10/set_vlan_vid.feature +3 -4
- data/features/open_flow10/strip_vlan_header.feature +3 -4
- data/features/open_flow10/table_stats_request.feature +11 -13
- data/features/open_flow10/vendor_action.feature +4 -5
- data/features/open_flow13/apply_actions.feature +15 -18
- data/features/open_flow13/bad_request.feature +7 -13
- data/features/open_flow13/copy_ttl_inwards.feature +13 -0
- data/features/open_flow13/copy_ttl_outwards.feature +13 -0
- data/features/open_flow13/decrement_ip_ttl.feature +11 -0
- data/features/open_flow13/echo_reply.feature +16 -42
- data/features/open_flow13/echo_request.feature +16 -42
- data/features/open_flow13/features_reply.feature +4 -25
- data/features/open_flow13/features_request.feature +7 -36
- data/features/open_flow13/flow_mod.feature +16 -76
- data/features/open_flow13/goto_table.feature +18 -20
- data/features/open_flow13/hello.feature +7 -37
- data/features/open_flow13/hello_failed.feature +7 -30
- data/features/open_flow13/match.feature +239 -248
- data/features/open_flow13/meter.feature +18 -20
- data/features/open_flow13/nicira_conjunction.feature +15 -0
- data/features/open_flow13/nicira_reg_load.feature +27 -42
- data/features/open_flow13/nicira_reg_move.feature +41 -35
- data/features/open_flow13/nicira_send_out_port.feature +21 -13
- data/features/open_flow13/nicira_stack_pop.feature +26 -0
- data/features/open_flow13/nicira_stack_push.feature +26 -0
- data/features/open_flow13/packet_in.feature +7 -34
- data/features/open_flow13/packet_out.feature +7 -45
- data/features/open_flow13/send_out_port.feature +19 -28
- data/features/open_flow13/set_arp_operation.feature +4 -5
- data/features/open_flow13/set_arp_sender_hardware_address.feature +3 -4
- data/features/open_flow13/set_arp_sender_protocol_address.feature +3 -4
- data/features/open_flow13/set_destination_mac_address.feature +3 -4
- data/features/open_flow13/set_ip_ttl.feature +12 -0
- data/features/open_flow13/set_metadata.feature +3 -4
- data/features/open_flow13/set_source_mac_address.feature +3 -4
- data/features/open_flow13/stats_request.feature +4 -7
- data/features/open_flow13/write_metadata.feature +20 -22
- data/features/open_flow_read.feature +24 -5
- data/features/open_flow_version.feature +1 -1
- data/features/parser.feature +8 -9
- data/features/step_definitions/open_flow_steps.rb +11 -16
- data/features/step_definitions/packet_data_steps.rb +16 -32
- data/features/step_definitions/ruby_steps.rb +7 -0
- data/features/step_definitions/show_stats_steps.rb +3 -3
- data/features/support/env.rb +1 -0
- data/features/support/hooks.rb +2 -2
- data/features/udp.feature +26 -27
- data/lib/pio.rb +1 -1
- data/lib/pio/arp.rb +9 -6
- data/lib/pio/arp/format.rb +3 -7
- data/lib/pio/arp/message.rb +8 -4
- data/lib/pio/arp/reply.rb +9 -32
- data/lib/pio/arp/request.rb +9 -33
- data/lib/pio/class_inspector.rb +18 -0
- data/lib/pio/dhcp.rb +2 -2
- data/lib/pio/dhcp/frame.rb +4 -4
- data/lib/pio/dhcp/optional_tlv.rb +3 -3
- data/lib/pio/ethernet_frame.rb +20 -0
- data/lib/pio/ethernet_header.rb +35 -13
- data/lib/pio/icmp.rb +8 -5
- data/lib/pio/icmp/format.rb +19 -22
- data/lib/pio/icmp/message.rb +18 -4
- data/lib/pio/icmp/reply.rb +8 -34
- data/lib/pio/icmp/request.rb +8 -43
- data/lib/pio/instance_inspector.rb +14 -0
- data/lib/pio/ipv4_address.rb +11 -11
- data/lib/pio/ipv4_header.rb +24 -2
- data/lib/pio/lldp/frame.rb +2 -2
- data/lib/pio/lldp/optional_tlv.rb +2 -2
- data/lib/pio/mac.rb +7 -3
- data/lib/pio/message.rb +50 -0
- data/lib/pio/monkey_patch/bindata_record.rb +6 -0
- data/lib/pio/monkey_patch/bindata_string.rb +10 -0
- data/lib/pio/monkey_patch/integer/base_conversions.rb +1 -1
- data/lib/pio/monkey_patch/uint.rb +9 -0
- data/lib/pio/monkey_patch/uint/base_conversions.rb +14 -0
- data/lib/pio/open_flow.rb +38 -52
- data/lib/pio/open_flow/action.rb +8 -4
- data/lib/pio/open_flow/buffer_id.rb +19 -0
- data/lib/pio/open_flow/datapath_id.rb +3 -3
- data/lib/pio/open_flow/error_message.rb +32 -0
- data/lib/pio/open_flow/flags.rb +15 -6
- data/lib/pio/open_flow/flow_match.rb +10 -0
- data/lib/pio/open_flow/header.rb +26 -0
- data/lib/pio/open_flow/hello_failed_code.rb +1 -1
- data/lib/pio/open_flow/instruction.rb +10 -0
- data/lib/pio/open_flow/message.rb +49 -14
- data/lib/pio/open_flow/nicira_resubmit.rb +13 -11
- data/lib/pio/open_flow/nicira_resubmit_table.rb +17 -10
- data/lib/pio/open_flow/parser.rb +19 -0
- data/lib/pio/open_flow/port.rb +2 -2
- data/lib/pio/open_flow/transaction_id.rb +2 -2
- data/lib/pio/open_flow/version.rb +22 -0
- data/lib/pio/open_flow10/actions.rb +16 -16
- data/lib/pio/open_flow10/aggregate_stats/reply.rb +2 -1
- data/lib/pio/open_flow10/aggregate_stats/request.rb +1 -3
- data/lib/pio/open_flow10/barrier/reply.rb +1 -1
- data/lib/pio/open_flow10/barrier/request.rb +1 -1
- data/lib/pio/open_flow10/description_stats/reply.rb +1 -1
- data/lib/pio/open_flow10/description_stats/request.rb +1 -3
- data/lib/pio/open_flow10/echo/reply.rb +3 -3
- data/lib/pio/open_flow10/echo/request.rb +3 -3
- data/lib/pio/open_flow10/enqueue.rb +3 -3
- data/lib/pio/open_flow10/error.rb +3 -13
- data/lib/pio/open_flow10/error/bad_request.rb +5 -29
- data/lib/pio/open_flow10/error/bad_request/bad_request_code.rb +35 -0
- data/lib/pio/open_flow10/error/error_type10.rb +1 -1
- data/lib/pio/open_flow10/error/hello_failed.rb +6 -4
- data/lib/pio/open_flow10/exact_match.rb +12 -10
- data/lib/pio/open_flow10/features/reply.rb +16 -31
- data/lib/pio/open_flow10/features/request.rb +1 -4
- data/lib/pio/open_flow10/flow_mod.rb +8 -33
- data/lib/pio/open_flow10/flow_mod/command.rb +28 -0
- data/lib/pio/open_flow10/flow_removed.rb +2 -17
- data/lib/pio/open_flow10/flow_removed/reason.rb +22 -0
- data/lib/pio/open_flow10/flow_stats/reply.rb +3 -4
- data/lib/pio/open_flow10/flow_stats/request.rb +1 -3
- data/lib/pio/open_flow10/hello.rb +1 -4
- data/lib/pio/open_flow10/match.rb +13 -12
- data/lib/pio/open_flow10/packet_in.rb +32 -28
- data/lib/pio/open_flow10/packet_in/reason.rb +25 -0
- data/lib/pio/open_flow10/packet_out.rb +5 -6
- data/lib/pio/open_flow10/phy_port16.rb +36 -58
- data/lib/pio/open_flow10/port_stats/request.rb +1 -3
- data/lib/pio/open_flow10/port_status.rb +23 -30
- data/lib/pio/open_flow10/port_status/reason.rb +21 -0
- data/lib/pio/open_flow10/queue_stats/request.rb +1 -3
- data/lib/pio/open_flow10/send_out_port.rb +2 -2
- data/lib/pio/open_flow10/set_tos.rb +2 -2
- data/lib/pio/open_flow10/set_transport_port.rb +4 -2
- data/lib/pio/open_flow10/set_vlan_priority.rb +1 -1
- data/lib/pio/open_flow10/set_vlan_vid.rb +1 -1
- data/lib/pio/open_flow10/stats_reply.rb +7 -10
- data/lib/pio/open_flow10/stats_request.rb +16 -15
- data/lib/pio/open_flow10/stats_type.rb +1 -1
- data/lib/pio/open_flow10/table_stats/request.rb +1 -3
- data/lib/pio/open_flow10/vendor_action.rb +22 -20
- data/lib/pio/open_flow13.rb +7 -0
- data/lib/pio/open_flow13/actions.rb +34 -32
- data/lib/pio/open_flow13/apply.rb +25 -22
- data/lib/pio/open_flow13/copy_ttl_inwards.rb +15 -0
- data/lib/pio/open_flow13/copy_ttl_outwards.rb +15 -0
- data/lib/pio/open_flow13/decrement_ip_ttl.rb +15 -0
- data/lib/pio/open_flow13/echo/reply.rb +3 -3
- data/lib/pio/open_flow13/echo/request.rb +3 -3
- data/lib/pio/open_flow13/error.rb +7 -18
- data/lib/pio/open_flow13/error/bad_request.rb +4 -3
- data/lib/pio/open_flow13/error/error_type13.rb +1 -1
- data/lib/pio/open_flow13/error/hello_failed.rb +3 -2
- data/lib/pio/open_flow13/features/reply.rb +9 -16
- data/lib/pio/open_flow13/features/request.rb +1 -1
- data/lib/pio/open_flow13/flow_mod.rb +14 -19
- data/lib/pio/open_flow13/goto_table.rb +26 -24
- data/lib/pio/open_flow13/hello.rb +3 -4
- data/lib/pio/open_flow13/match.rb +173 -9
- data/lib/pio/open_flow13/meter.rb +23 -20
- data/lib/pio/open_flow13/nicira_conjunction.rb +26 -0
- data/lib/pio/open_flow13/nicira_reg_load.rb +44 -24
- data/lib/pio/open_flow13/nicira_reg_move.rb +77 -35
- data/lib/pio/open_flow13/nicira_send_out_port.rb +37 -21
- data/lib/pio/open_flow13/nicira_stack_pop.rb +49 -0
- data/lib/pio/open_flow13/nicira_stack_push.rb +49 -0
- data/lib/pio/open_flow13/packet_in.rb +11 -8
- data/lib/pio/open_flow13/packet_out.rb +9 -8
- data/lib/pio/open_flow13/set_ip_ttl.rb +16 -0
- data/lib/pio/open_flow13/stats_request.rb +2 -4
- data/lib/pio/open_flow13/write_metadata.rb +40 -38
- data/lib/pio/options.rb +8 -3
- data/lib/pio/parser.rb +7 -16
- data/lib/pio/ruby_dumper.rb +69 -0
- data/lib/pio/type/ether_type.rb +31 -0
- data/lib/pio/type/ip_address.rb +8 -0
- data/lib/pio/type/mac_address.rb +10 -0
- data/lib/pio/udp.rb +3 -3
- data/lib/pio/udp_header.rb +1 -1
- data/lib/pio/version.rb +1 -1
- data/pio.gemspec +5 -38
- data/spec/pio/arp/reply_spec.rb +0 -4
- data/spec/pio/arp/request_spec.rb +0 -4
- data/spec/pio/arp_spec.rb +0 -4
- data/spec/pio/icmp/reply_spec.rb +4 -8
- data/spec/pio/icmp/request_spec.rb +6 -10
- data/spec/pio/icmp_spec.rb +8 -12
- data/spec/pio/monkey_patch/integer_spec.rb +23 -0
- data/spec/pio/open_flow/nicira_resubmit_spec.rb +19 -0
- data/spec/pio/open_flow/nicira_resubmit_table_spec.rb +20 -0
- data/spec/pio/open_flow10/error/hello_failed_spec.rb +2 -2
- data/spec/pio/open_flow10/flow_mod_spec.rb +24 -24
- data/spec/pio/open_flow10/flow_stats_request_spec.rb +3 -3
- data/spec/pio/open_flow10/hello_spec.rb +0 -2
- data/spec/pio/open_flow10/match_spec.rb +38 -38
- data/spec/pio/open_flow10/packet_out_spec.rb +0 -349
- data/spec/pio/open_flow10/phy_port16_spec.rb +5 -5
- data/spec/pio/open_flow13/error/hello_failed_spec.rb +2 -2
- data/spec/pio/open_flow13/goto_table_spec.rb +2 -2
- data/spec/pio/open_flow13/hello_spec.rb +15 -15
- data/spec/pio/open_flow13/match_spec.rb +29 -29
- data/spec/pio/open_flow13/meter_spec.rb +2 -2
- data/spec/pio/open_flow13/nicira_reg_load_spec.rb +71 -0
- data/spec/pio/open_flow13/nicira_reg_move_spec.rb +40 -0
- data/spec/pio/open_flow13/nicira_send_out_port_spec.rb +29 -0
- data/spec/pio/open_flow13/write_metadata_spec.rb +3 -3
- data/spec/pio/open_flow_spec.rb +6 -6
- data/spec/spec_helper.rb +1 -1
- data/spec/support/shared_examples_for_openflow_messages.rb +5 -13
- metadata +191 -790
- data/LICENSE +0 -674
- data/bin/_guard-core +0 -16
- data/bin/byebug +0 -16
- data/bin/cc-tddium-post-worker +0 -16
- data/bin/cdiff +0 -16
- data/bin/coderay +0 -16
- data/bin/colortab +0 -16
- data/bin/coveralls +0 -16
- data/bin/cucumber +0 -16
- data/bin/decolor +0 -16
- data/bin/flay +0 -16
- data/bin/flog +0 -16
- data/bin/guard +0 -16
- data/bin/htmldiff +0 -16
- data/bin/inch +0 -16
- data/bin/ldiff +0 -16
- data/bin/listen +0 -16
- data/bin/minitar +0 -16
- data/bin/pry +0 -16
- data/bin/rake +0 -16
- data/bin/reek +0 -16
- data/bin/relish +0 -16
- data/bin/restclient +0 -16
- data/bin/rspec +0 -16
- data/bin/rubocop +0 -16
- data/bin/ruby-parse +0 -16
- data/bin/ruby-rewrite +0 -16
- data/bin/ruby_parse +0 -16
- data/bin/ruby_parse_extract_error +0 -16
- data/bin/sparkr +0 -16
- data/bin/term_display +0 -16
- data/bin/term_mandel +0 -16
- data/bin/terminal-notifier +0 -16
- data/bin/thor +0 -16
- data/bin/unparser +0 -16
- data/bin/yard +0 -16
- data/bin/yardoc +0 -16
- data/bin/yri +0 -16
- data/features/arp-storm.pcap +0 -0
- data/features/arp.pcap +0 -0
- data/features/dhcp.pcap +0 -0
- data/features/icmp.feature +0 -130
- data/features/icmp.pcap +0 -0
- data/features/icmpv6.pcap +0 -0
- data/features/lldp.detailed.pcap +0 -0
- data/features/lldp.minimal.pcap +0 -0
- data/features/open_flow10/aggregate_stats_reply.raw +0 -0
- data/features/open_flow10/aggregate_stats_request.raw +0 -0
- data/features/open_flow10/bad_request.raw +0 -0
- data/features/open_flow10/barrier_reply.raw +0 -0
- data/features/open_flow10/barrier_request.raw +0 -0
- data/features/open_flow10/description_stats_reply.raw +0 -0
- data/features/open_flow10/description_stats_request.raw +0 -0
- data/features/open_flow10/echo_reply.raw +0 -0
- data/features/open_flow10/echo_request.raw +0 -0
- data/features/open_flow10/error.raw +0 -0
- data/features/open_flow10/features_reply.raw +0 -0
- data/features/open_flow10/features_request.raw +0 -0
- data/features/open_flow10/flow_mod_add.raw +0 -0
- data/features/open_flow10/flow_mod_delete.raw +0 -0
- data/features/open_flow10/flow_mod_delete_strict.raw +0 -0
- data/features/open_flow10/flow_mod_modify.raw +0 -0
- data/features/open_flow10/flow_mod_modify_strict.raw +0 -0
- data/features/open_flow10/flow_removed.raw +0 -0
- data/features/open_flow10/flow_stats_reply.raw +0 -0
- data/features/open_flow10/flow_stats_request.raw +0 -0
- data/features/open_flow10/get_config_reply.raw +0 -0
- data/features/open_flow10/get_config_request.raw +0 -0
- data/features/open_flow10/hello.raw +0 -0
- data/features/open_flow10/hello_failed.raw +0 -0
- data/features/open_flow10/nx_flow_mod_add.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete.raw +0 -0
- data/features/open_flow10/nx_flow_mod_delete_strict.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify.raw +0 -0
- data/features/open_flow10/nx_flow_mod_modify_strict.raw +0 -0
- data/features/open_flow10/nxast_learn.raw +0 -0
- data/features/open_flow10/packet_in.raw +0 -0
- data/features/open_flow10/packet_in_arp_reply.raw +0 -0
- data/features/open_flow10/packet_in_arp_request.raw +0 -0
- data/features/open_flow10/packet_in_cbench.raw +0 -0
- data/features/open_flow10/packet_out.raw +0 -0
- data/features/open_flow10/port_mod.raw +0 -0
- data/features/open_flow10/port_stats_reply.raw +0 -0
- data/features/open_flow10/port_stats_request.raw +0 -0
- data/features/open_flow10/port_status.raw +0 -0
- data/features/open_flow10/queue_get_config_reply.raw +0 -0
- data/features/open_flow10/queue_get_config_request.raw +0 -0
- data/features/open_flow10/queue_stats_request.raw +0 -0
- data/features/open_flow10/set_config.raw +0 -0
- data/features/open_flow10/table_stats_reply.raw +0 -0
- data/features/open_flow10/table_stats_request.raw +0 -0
- data/features/open_flow10/vendor.raw +0 -0
- data/features/open_flow10/vendor_stats_request.raw +0 -0
- data/features/open_flow13/action_copy_ttl_in.raw +0 -0
- data/features/open_flow13/action_copy_ttl_out.raw +0 -0
- data/features/open_flow13/action_dec_mpls_ttl.raw +0 -0
- data/features/open_flow13/action_dec_nw_ttl.raw +0 -0
- data/features/open_flow13/action_group.raw +0 -0
- data/features/open_flow13/action_pop_mpls.raw +0 -0
- data/features/open_flow13/action_pop_pbb.raw +0 -0
- data/features/open_flow13/action_pop_vlan.raw +0 -0
- data/features/open_flow13/action_push_mpls.raw +0 -0
- data/features/open_flow13/action_push_pbb.raw +0 -0
- data/features/open_flow13/action_push_vlan.raw +0 -0
- data/features/open_flow13/action_set_field.raw +0 -0
- data/features/open_flow13/action_set_mpls_ttl.raw +0 -0
- data/features/open_flow13/action_set_nw_ttl.raw +0 -0
- data/features/open_flow13/action_set_queue.raw +0 -0
- data/features/open_flow13/apply_actions.raw +0 -0
- data/features/open_flow13/bad_request.raw +0 -0
- data/features/open_flow13/echo_reply_body.raw +0 -0
- data/features/open_flow13/echo_reply_no_body.raw +0 -0
- data/features/open_flow13/echo_request_body.raw +0 -0
- data/features/open_flow13/echo_request_no_body.raw +0 -0
- data/features/open_flow13/features_reply.raw +0 -0
- data/features/open_flow13/features_request.raw +0 -0
- data/features/open_flow13/flow_add_apply_no_match.raw +0 -0
- data/features/open_flow13/flow_mod_add_apply_no_match.raw +0 -0
- data/features/open_flow13/flow_mod_no_match_or_instructions.raw +0 -0
- data/features/open_flow13/hello_failed.raw +0 -0
- data/features/open_flow13/hello_no_version_bitmap.raw +0 -0
- data/features/open_flow13/hello_version_bitmap.raw +0 -0
- data/features/open_flow13/instruction_clear_actions.raw +0 -0
- data/features/open_flow13/instruction_goto_table.raw +0 -0
- data/features/open_flow13/instruction_meter.raw +0 -0
- data/features/open_flow13/instruction_write_actions.raw +0 -0
- data/features/open_flow13/instruction_write_metadata.raw +0 -0
- data/features/open_flow13/oxm_arp_op_field.raw +0 -0
- data/features/open_flow13/oxm_arp_sha_field.raw +0 -0
- data/features/open_flow13/oxm_arp_spa_field.raw +0 -0
- data/features/open_flow13/oxm_arp_tha_field.raw +0 -0
- data/features/open_flow13/oxm_arp_tpa_field.raw +0 -0
- data/features/open_flow13/oxm_ether_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ether_source_field.raw +0 -0
- data/features/open_flow13/oxm_ether_type_field.raw +0 -0
- data/features/open_flow13/oxm_experimenter_stratos_basic_dot11.raw +0 -0
- data/features/open_flow13/oxm_icmpv4_code_field.raw +0 -0
- data/features/open_flow13/oxm_icmpv4_type_field.raw +0 -0
- data/features/open_flow13/oxm_in_phy_port_field.raw +0 -0
- data/features/open_flow13/oxm_in_port_field.raw +0 -0
- data/features/open_flow13/oxm_invalid_field.raw +0 -0
- data/features/open_flow13/oxm_ip_dscp_field.raw +0 -0
- data/features/open_flow13/oxm_ip_ecn_field.raw +0 -0
- data/features/open_flow13/oxm_ipv4_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ipv4_source_field.raw +0 -0
- data/features/open_flow13/oxm_ipv6_destination_field.raw +0 -0
- data/features/open_flow13/oxm_ipv6_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_sha_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_spa_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_tha_field.raw +0 -0
- data/features/open_flow13/oxm_masked_arp_tpa_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ether_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ether_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv4_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv4_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv6_destination_field.raw +0 -0
- data/features/open_flow13/oxm_masked_ipv6_source_field.raw +0 -0
- data/features/open_flow13/oxm_masked_tunnel_id_field.raw +0 -0
- data/features/open_flow13/oxm_metadata_field.raw +0 -0
- data/features/open_flow13/oxm_metadata_masked_field.raw +0 -0
- data/features/open_flow13/oxm_no_fields.raw +0 -0
- data/features/open_flow13/oxm_sctp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_sctp_source_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_field.raw +0 -0
- data/features/open_flow13/oxm_tcp_source_field.raw +0 -0
- data/features/open_flow13/oxm_tunnel_id_field.raw +0 -0
- data/features/open_flow13/oxm_udp_destination_field.raw +0 -0
- data/features/open_flow13/oxm_udp_field.raw +0 -0
- data/features/open_flow13/oxm_udp_source_field.raw +0 -0
- data/features/open_flow13/oxm_vlan_pcp_field.raw +0 -0
- data/features/open_flow13/oxm_vlan_vid_field.raw +0 -0
- data/features/open_flow13/packet_in.raw +0 -0
- data/features/open_flow13/packet_out.raw +0 -0
- data/features/open_flow13/send_out_port.raw +0 -0
- data/features/open_flow13/table_stats_reply.raw +0 -0
- data/features/open_flow13/table_stats_request.raw +0 -0
- data/features/step_definitions/LICENSE +0 -675
- data/features/udp_no_payload.raw +0 -0
- data/features/udp_with_payload.raw +0 -0
- data/lib/pio/icmp/options.rb +0 -21
- data/lib/pio/open_flow/error.rb +0 -19
- data/lib/pio/open_flow/open_flow_header.rb +0 -31
- data/lib/pio/open_flow13/buffer_id.rb +0 -17
- data/spec/pio/arp/reply/options_spec.rb +0 -143
- data/spec/pio/arp/request/options_spec.rb +0 -113
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
require 'pio/open_flow'
|
|
2
|
-
require 'pio/
|
|
2
|
+
require 'pio/open_flow/buffer_id'
|
|
3
3
|
require 'pio/open_flow13/match'
|
|
4
4
|
|
|
5
5
|
module Pio
|
|
@@ -14,7 +14,7 @@ module Pio
|
|
|
14
14
|
modify_strict: 2,
|
|
15
15
|
delete: 3,
|
|
16
16
|
delete_strict: 4
|
|
17
|
-
}
|
|
17
|
+
}.freeze
|
|
18
18
|
|
|
19
19
|
uint8 :command
|
|
20
20
|
|
|
@@ -36,7 +36,7 @@ module Pio
|
|
|
36
36
|
uint32 :out_port, initial_value: ANY
|
|
37
37
|
|
|
38
38
|
def get
|
|
39
|
-
|
|
39
|
+
out_port == ANY ? :any : out_port
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def set(value)
|
|
@@ -53,7 +53,7 @@ module Pio
|
|
|
53
53
|
uint32 :out_group, initial_value: ANY
|
|
54
54
|
|
|
55
55
|
def get
|
|
56
|
-
|
|
56
|
+
out_group == ANY ? :any : out_group
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
def set(value)
|
|
@@ -76,7 +76,7 @@ module Pio
|
|
|
76
76
|
def get
|
|
77
77
|
list = []
|
|
78
78
|
tmp = instructions
|
|
79
|
-
|
|
79
|
+
until tmp.empty?
|
|
80
80
|
instruction_type = BinData::Uint16be.read(tmp)
|
|
81
81
|
instruction = case instruction_type
|
|
82
82
|
when 1
|
|
@@ -88,7 +88,7 @@ module Pio
|
|
|
88
88
|
when 6
|
|
89
89
|
Meter.read(tmp)
|
|
90
90
|
else
|
|
91
|
-
|
|
91
|
+
raise "Unsupported instruction #{instruction_type}"
|
|
92
92
|
end
|
|
93
93
|
tmp = tmp[instruction.instruction_length..-1]
|
|
94
94
|
list << instruction
|
|
@@ -102,18 +102,8 @@ module Pio
|
|
|
102
102
|
end
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
flags_16bit :flags,
|
|
108
|
-
[:send_flow_rem,
|
|
109
|
-
:check_overwrap,
|
|
110
|
-
:reset_counts,
|
|
111
|
-
:no_packet_counts,
|
|
112
|
-
:no_byte_counts]
|
|
113
|
-
|
|
114
|
-
open_flow_header(version: 4,
|
|
115
|
-
message_type: 14,
|
|
116
|
-
message_length: lambda do
|
|
105
|
+
open_flow_header(version: 4, type: 14,
|
|
106
|
+
length: lambda do
|
|
117
107
|
48 + match.length + instructions.length
|
|
118
108
|
end)
|
|
119
109
|
uint64 :cookie
|
|
@@ -126,7 +116,12 @@ module Pio
|
|
|
126
116
|
buffer_id :buffer_id
|
|
127
117
|
out_port :out_port
|
|
128
118
|
out_group :out_group
|
|
129
|
-
|
|
119
|
+
flags_16bit :flags,
|
|
120
|
+
[:send_flow_rem,
|
|
121
|
+
:check_overwrap,
|
|
122
|
+
:reset_counts,
|
|
123
|
+
:no_packet_counts,
|
|
124
|
+
:no_byte_counts]
|
|
130
125
|
string :padding, length: 2
|
|
131
126
|
hide :padding
|
|
132
127
|
oxm :match
|
|
@@ -1,37 +1,39 @@
|
|
|
1
1
|
require 'bindata'
|
|
2
2
|
require 'forwardable'
|
|
3
|
+
require 'pio/open_flow/instruction'
|
|
3
4
|
|
|
4
|
-
# Base module.
|
|
5
5
|
module Pio
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
module OpenFlow13
|
|
7
|
+
# Resubmit to the table_id
|
|
8
|
+
class GotoTable < OpenFlow::Instruction
|
|
9
|
+
# OpenFlow 1.3.4 OFPIT_GOTO_TABLE instruction format
|
|
10
|
+
class Format < BinData::Record
|
|
11
|
+
endian :big
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
uint16 :instruction_type, value: 1
|
|
14
|
+
uint16 :instruction_length, value: 8
|
|
15
|
+
uint8 :table_id
|
|
16
|
+
bit24 :padding
|
|
17
|
+
hide :padding
|
|
18
|
+
end
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
def self.read(raw_data)
|
|
21
|
+
allocate.tap do |goto_table|
|
|
22
|
+
goto_table.instance_variable_set :@format, Format.read(raw_data)
|
|
23
|
+
end
|
|
22
24
|
end
|
|
23
|
-
end
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
extend Forwardable
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
def_delegators :@format, :instruction_type
|
|
29
|
+
def_delegators :@format, :instruction_length
|
|
30
|
+
def_delegators :@format, :table_id
|
|
31
|
+
def_delegators :@format, :to_binary_s
|
|
32
|
+
def_delegator :@format, :to_binary_s, :to_binary
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
34
|
+
def initialize(table_id)
|
|
35
|
+
@format = Format.new(table_id: table_id)
|
|
36
|
+
end
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
end
|
|
@@ -41,8 +41,8 @@ module Pio
|
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
open_flow_header version: 4,
|
|
45
|
-
body :body
|
|
44
|
+
open_flow_header version: 4, type: 0
|
|
45
|
+
body :body, read_length: -> { length - header_length }
|
|
46
46
|
|
|
47
47
|
def elements
|
|
48
48
|
body.elements
|
|
@@ -68,11 +68,10 @@ module Pio
|
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
def initialize(user_options = {})
|
|
71
|
-
validate_user_options user_options
|
|
72
71
|
body_options = { elements: [{ element_type: VERSION_BITMAP,
|
|
73
72
|
element_length: 8,
|
|
74
73
|
element_value: 0b10000 }] }
|
|
75
|
-
|
|
74
|
+
super user_options.merge(body: body_options)
|
|
76
75
|
end
|
|
77
76
|
end
|
|
78
77
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'bindata'
|
|
2
|
+
require 'pio/open_flow/flow_match'
|
|
2
3
|
require 'pio/type/ip_address'
|
|
3
4
|
require 'pio/type/ipv6_address'
|
|
4
5
|
require 'pio/type/mac_address'
|
|
@@ -11,7 +12,7 @@ module Pio
|
|
|
11
12
|
MATCH_TYPE_OXM = 1
|
|
12
13
|
|
|
13
14
|
# OpenFlow eXtensible Match (OXM)
|
|
14
|
-
class Match
|
|
15
|
+
class Match < OpenFlow::FlowMatch
|
|
15
16
|
# OFPXMC_NXM_1 TLV value
|
|
16
17
|
class NiciraMatchExtensionValue < BinData::Record
|
|
17
18
|
OXM_CLASS = 0x1
|
|
@@ -22,6 +23,11 @@ module Pio
|
|
|
22
23
|
OXM_CLASS = 0x8000
|
|
23
24
|
end
|
|
24
25
|
|
|
26
|
+
# OFPXMC_PACKET_REGS TLV value
|
|
27
|
+
class PacketRegistersValue < BinData::Record
|
|
28
|
+
OXM_CLASS = 0x8001
|
|
29
|
+
end
|
|
30
|
+
|
|
25
31
|
# OFPXMC_EXPERIMENTER TLV value
|
|
26
32
|
class ExperimenterValue < BinData::Record
|
|
27
33
|
OXM_CLASS = 0xFFFF
|
|
@@ -759,6 +765,105 @@ module Pio
|
|
|
759
765
|
end
|
|
760
766
|
end
|
|
761
767
|
|
|
768
|
+
# OXM_PACKET_REG0 match field
|
|
769
|
+
class PacketReg0 < PacketRegistersValue
|
|
770
|
+
OXM_FIELD = 0
|
|
771
|
+
|
|
772
|
+
endian :big
|
|
773
|
+
|
|
774
|
+
uint64 :packet_reg0
|
|
775
|
+
|
|
776
|
+
def length
|
|
777
|
+
8
|
|
778
|
+
end
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# Masked OXM_PACKET_REG0 match field
|
|
782
|
+
class MaskedPacketReg0 < PacketRegistersValue
|
|
783
|
+
endian :big
|
|
784
|
+
|
|
785
|
+
uint64 :packet_reg0
|
|
786
|
+
uint64 :packet_reg0_mask
|
|
787
|
+
|
|
788
|
+
def length
|
|
789
|
+
16
|
|
790
|
+
end
|
|
791
|
+
end
|
|
792
|
+
# OXM_PACKET_REG1 match field
|
|
793
|
+
class PacketReg1 < PacketRegistersValue
|
|
794
|
+
OXM_FIELD = 1
|
|
795
|
+
|
|
796
|
+
endian :big
|
|
797
|
+
|
|
798
|
+
uint64 :packet_reg1
|
|
799
|
+
|
|
800
|
+
def length
|
|
801
|
+
8
|
|
802
|
+
end
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
# Masked OXM_PACKET_REG1 match field
|
|
806
|
+
class MaskedPacketReg1 < PacketRegistersValue
|
|
807
|
+
endian :big
|
|
808
|
+
|
|
809
|
+
uint64 :packet_reg1
|
|
810
|
+
uint64 :packet_reg1_mask
|
|
811
|
+
|
|
812
|
+
def length
|
|
813
|
+
16
|
|
814
|
+
end
|
|
815
|
+
end
|
|
816
|
+
|
|
817
|
+
# OXM_PACKET_REG2 match field
|
|
818
|
+
class PacketReg2 < PacketRegistersValue
|
|
819
|
+
OXM_FIELD = 2
|
|
820
|
+
|
|
821
|
+
endian :big
|
|
822
|
+
|
|
823
|
+
uint64 :packet_reg2
|
|
824
|
+
|
|
825
|
+
def length
|
|
826
|
+
8
|
|
827
|
+
end
|
|
828
|
+
end
|
|
829
|
+
|
|
830
|
+
# Masked OXM_PACKET_REG2 match field
|
|
831
|
+
class MaskedPacketReg2 < PacketRegistersValue
|
|
832
|
+
endian :big
|
|
833
|
+
|
|
834
|
+
uint64 :packet_reg2
|
|
835
|
+
uint64 :packet_reg2_mask
|
|
836
|
+
|
|
837
|
+
def length
|
|
838
|
+
16
|
|
839
|
+
end
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
# OXM_PACKET_REG3 match field
|
|
843
|
+
class PacketReg3 < PacketRegistersValue
|
|
844
|
+
OXM_FIELD = 3
|
|
845
|
+
|
|
846
|
+
endian :big
|
|
847
|
+
|
|
848
|
+
uint64 :packet_reg3
|
|
849
|
+
|
|
850
|
+
def length
|
|
851
|
+
8
|
|
852
|
+
end
|
|
853
|
+
end
|
|
854
|
+
|
|
855
|
+
# Masked OXM_PACKET_REG3 match field
|
|
856
|
+
class MaskedPacketReg3 < PacketRegistersValue
|
|
857
|
+
endian :big
|
|
858
|
+
|
|
859
|
+
uint64 :packet_reg3
|
|
860
|
+
uint64 :packet_reg3_mask
|
|
861
|
+
|
|
862
|
+
def length
|
|
863
|
+
16
|
|
864
|
+
end
|
|
865
|
+
end
|
|
866
|
+
|
|
762
867
|
# OXM format
|
|
763
868
|
class Oxm < BinData::Record
|
|
764
869
|
# Experimenter part, data will use oxm_length
|
|
@@ -840,7 +945,7 @@ module Pio
|
|
|
840
945
|
when Reg7::OXM_FIELD
|
|
841
946
|
masked? ? MaskedReg7 : Reg7
|
|
842
947
|
else
|
|
843
|
-
|
|
948
|
+
raise "Unknown OXM field value: #{oxm_field}"
|
|
844
949
|
end
|
|
845
950
|
end
|
|
846
951
|
# rubocop:enable AbcSize
|
|
@@ -998,7 +1103,7 @@ module Pio
|
|
|
998
1103
|
when TunnelId::OXM_FIELD
|
|
999
1104
|
masked? ? MaskedTunnelId : TunnelId
|
|
1000
1105
|
else
|
|
1001
|
-
|
|
1106
|
+
raise "Unknown OXM field value: #{oxm_field}"
|
|
1002
1107
|
end
|
|
1003
1108
|
end
|
|
1004
1109
|
# rubocop:enable MethodLength
|
|
@@ -1008,6 +1113,58 @@ module Pio
|
|
|
1008
1113
|
end
|
|
1009
1114
|
# rubocop:enable MethodLength
|
|
1010
1115
|
|
|
1116
|
+
# Packet Register match field.
|
|
1117
|
+
class PacketRegisters < BinData::Record
|
|
1118
|
+
endian :big
|
|
1119
|
+
|
|
1120
|
+
bit7 :oxm_field
|
|
1121
|
+
bit1 :oxm_hasmask
|
|
1122
|
+
uint8 :oxm_length, value: -> { tlv_value.length }
|
|
1123
|
+
choice :tlv_value, selection: :choose_tlv_value do
|
|
1124
|
+
packet_reg0 PacketReg0
|
|
1125
|
+
masked_packet_reg0 MaskedPacketReg0
|
|
1126
|
+
packet_reg1 PacketReg1
|
|
1127
|
+
masked_packet_reg1 MaskedPacketReg1
|
|
1128
|
+
packet_reg2 PacketReg2
|
|
1129
|
+
masked_packet_reg2 MaskedPacketReg2
|
|
1130
|
+
packet_reg3 PacketReg3
|
|
1131
|
+
masked_packet_reg3 MaskedPacketReg3
|
|
1132
|
+
end
|
|
1133
|
+
|
|
1134
|
+
def length
|
|
1135
|
+
tlv_value.length + 2
|
|
1136
|
+
end
|
|
1137
|
+
|
|
1138
|
+
def masked?
|
|
1139
|
+
oxm_hasmask == 1
|
|
1140
|
+
end
|
|
1141
|
+
|
|
1142
|
+
def method_missing(method, *args, &block)
|
|
1143
|
+
tlv_value.__send__ method, *args, &block
|
|
1144
|
+
end
|
|
1145
|
+
|
|
1146
|
+
private
|
|
1147
|
+
|
|
1148
|
+
# rubocop:disable CyclomaticComplexity
|
|
1149
|
+
# rubocop:disable MethodLength
|
|
1150
|
+
def choose_tlv_value
|
|
1151
|
+
case oxm_field
|
|
1152
|
+
when PacketReg0::OXM_FIELD
|
|
1153
|
+
masked? ? MaskedPacketReg0 : PacketReg0
|
|
1154
|
+
when PacketReg1::OXM_FIELD
|
|
1155
|
+
masked? ? MaskedPacketReg1 : PacketReg1
|
|
1156
|
+
when PacketReg2::OXM_FIELD
|
|
1157
|
+
masked? ? MaskedPacketReg2 : PacketReg2
|
|
1158
|
+
when PacketReg3::OXM_FIELD
|
|
1159
|
+
masked? ? MaskedPacketReg3 : PacketReg3
|
|
1160
|
+
else
|
|
1161
|
+
raise "Unknown OXM field value: #{oxm_field}"
|
|
1162
|
+
end
|
|
1163
|
+
end
|
|
1164
|
+
# rubocop:enable CyclomaticComplexity
|
|
1165
|
+
# rubocop:enable MethodLength
|
|
1166
|
+
end
|
|
1167
|
+
|
|
1011
1168
|
# OXM match field.
|
|
1012
1169
|
class MatchField < BinData::Record
|
|
1013
1170
|
endian :big
|
|
@@ -1017,6 +1174,7 @@ module Pio
|
|
|
1017
1174
|
NiciraMatchExtension NiciraMatchExtensionValue::OXM_CLASS
|
|
1018
1175
|
OpenflowBasic OpenFlowBasicValue::OXM_CLASS
|
|
1019
1176
|
Experimenter ExperimenterValue::OXM_CLASS
|
|
1177
|
+
PacketRegisters PacketRegistersValue::OXM_CLASS
|
|
1020
1178
|
end
|
|
1021
1179
|
|
|
1022
1180
|
def oxm_field
|
|
@@ -1041,8 +1199,10 @@ module Pio
|
|
|
1041
1199
|
return class_payload.tlv_value.__send__(method, *args, &block)
|
|
1042
1200
|
when ExperimenterValue::OXM_CLASS
|
|
1043
1201
|
return class_payload.__send__(method, *args, &block)
|
|
1202
|
+
when PacketRegistersValue::OXM_CLASS
|
|
1203
|
+
return class_payload.__send__(method, *args, &block)
|
|
1044
1204
|
else
|
|
1045
|
-
|
|
1205
|
+
raise NoMethodError, method.to_s
|
|
1046
1206
|
end
|
|
1047
1207
|
end
|
|
1048
1208
|
end
|
|
@@ -1062,18 +1222,21 @@ module Pio
|
|
|
1062
1222
|
match_length + padding_length
|
|
1063
1223
|
end
|
|
1064
1224
|
|
|
1225
|
+
# rubocop:disable AbcSize
|
|
1065
1226
|
# rubocop:disable Next
|
|
1066
1227
|
# rubocop:disable LineLength
|
|
1067
1228
|
def method_missing(method, *args, &block)
|
|
1068
1229
|
match_fields.each do |each|
|
|
1069
|
-
if each.oxm_class == OpenFlowBasicValue::OXM_CLASS || each.oxm_class == NiciraMatchExtensionValue::OXM_CLASS
|
|
1230
|
+
if each.oxm_class == OpenFlowBasicValue::OXM_CLASS || each.oxm_class == NiciraMatchExtensionValue::OXM_CLASS || each.oxm_class == PacketRegistersValue::OXM_CLASS
|
|
1070
1231
|
next unless each.class_payload.tlv_value.respond_to?(method)
|
|
1071
1232
|
return each.class_payload.tlv_value.__send__(
|
|
1072
|
-
method, *args, &block
|
|
1233
|
+
method, *args, &block
|
|
1234
|
+
)
|
|
1073
1235
|
end
|
|
1074
1236
|
end
|
|
1075
|
-
|
|
1237
|
+
raise NoMethodError, method.to_s
|
|
1076
1238
|
end
|
|
1239
|
+
# rubocop:enable AbcSize
|
|
1077
1240
|
# rubocop:enable Next
|
|
1078
1241
|
# rubocop:enable LineLength
|
|
1079
1242
|
|
|
@@ -1084,7 +1247,7 @@ module Pio
|
|
|
1084
1247
|
end
|
|
1085
1248
|
|
|
1086
1249
|
def tlv_total_length
|
|
1087
|
-
if match_fields.
|
|
1250
|
+
if !match_fields.empty?
|
|
1088
1251
|
match_fields.map(&:length).inject(&:+)
|
|
1089
1252
|
else
|
|
1090
1253
|
0
|
|
@@ -1121,7 +1284,8 @@ module Pio
|
|
|
1121
1284
|
:arp_sender_protocol_address, :arp_target_protocol_address,
|
|
1122
1285
|
:arp_sender_hardware_address, :arp_target_hardware_address,
|
|
1123
1286
|
:ipv6_source_address, :ipv6_destination_address, :tunnel_id,
|
|
1124
|
-
:reg0, :reg1, :reg2, :reg3, :reg4, :reg5, :reg6, :reg7
|
|
1287
|
+
:reg0, :reg1, :reg2, :reg3, :reg4, :reg5, :reg6, :reg7,
|
|
1288
|
+
:packet_reg0, :packet_reg1, :packet_reg2, :packet_reg3].each do |each|
|
|
1125
1289
|
next unless user_attrs.key?(each)
|
|
1126
1290
|
klass = Match.const_get(each.to_s.split('_').map(&:capitalize).join)
|
|
1127
1291
|
mask_key = "#{each}_mask".to_sym
|
|
@@ -1,33 +1,36 @@
|
|
|
1
1
|
require 'forwardable'
|
|
2
|
+
require 'pio/open_flow/instruction'
|
|
2
3
|
|
|
3
4
|
# Base module.
|
|
4
5
|
module Pio
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
module OpenFlow13
|
|
7
|
+
# Apply meter (rate limiter)
|
|
8
|
+
class Meter < OpenFlow::Instruction
|
|
9
|
+
# OpenFlow 1.3.4 OFPIT_METER instruction format
|
|
10
|
+
class Format < BinData::Record
|
|
11
|
+
endian :big
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
uint16 :instruction_type, value: 6
|
|
14
|
+
uint16 :instruction_length, value: 8
|
|
15
|
+
uint32 :meter_id
|
|
16
|
+
end
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
def self.read(raw_data)
|
|
19
|
+
allocate.tap do |meter|
|
|
20
|
+
meter.instance_variable_set :@format, Format.read(raw_data)
|
|
21
|
+
end
|
|
19
22
|
end
|
|
20
|
-
end
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
extend Forwardable
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
def_delegators :@format, :instruction_type
|
|
27
|
+
def_delegators :@format, :instruction_length
|
|
28
|
+
def_delegators :@format, :meter_id
|
|
29
|
+
def_delegators :@format, :to_binary_s
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
def initialize(meter_id)
|
|
32
|
+
@format = Format.new(meter_id: meter_id)
|
|
33
|
+
end
|
|
31
34
|
end
|
|
32
35
|
end
|
|
33
36
|
end
|