trema 0.1.3
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.
- data/.mono.rant +4107 -0
- data/.rspec +1 -0
- data/.yardopts +4 -0
- data/Doxyfile +1679 -0
- data/GPL2 +339 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +71 -0
- data/README.md +135 -0
- data/Rakefile +140 -0
- data/Rantfile +834 -0
- data/VERSION +1 -0
- data/build.rb +32 -0
- data/cruise.rb +389 -0
- data/features/example.dumper.feature +87 -0
- data/features/example.learning_switch.feature +39 -0
- data/features/example.list_switches.feature +38 -0
- data/features/example.message.echo_reply.feature +26 -0
- data/features/example.message.echo_request.feature +25 -0
- data/features/example.message.features_request.feature +84 -0
- data/features/example.message.hello.feature +25 -0
- data/features/example.message.set_config.feature +27 -0
- data/features/example.multi_learning_switch.feature +135 -0
- data/features/example.packetin_filter_config.feature +91 -0
- data/features/example.repeater_hub.feature +49 -0
- data/features/example.switch_monitor.feature +39 -0
- data/features/packetin_filter.feature +49 -0
- data/features/step_definitions/kill_steps.rb +30 -0
- data/features/step_definitions/log_steps.rb +90 -0
- data/features/step_definitions/misc_steps.rb +64 -0
- data/features/step_definitions/off_steps.rb +30 -0
- data/features/step_definitions/run_steps.rb +91 -0
- data/features/step_definitions/send_packets_steps.rb +42 -0
- data/features/step_definitions/show_stats_steps.rb +43 -0
- data/features/step_definitions/stats_steps.rb +39 -0
- data/features/support/env.rb +75 -0
- data/features/support/hooks.rb +8 -0
- data/features/switch_manager.feature +35 -0
- data/features/trema-config.feature +68 -0
- data/features/trema.dump_flows.feature +25 -0
- data/features/trema.feature +25 -0
- data/features/trema.kill.feature +53 -0
- data/features/trema.killall.feature +30 -0
- data/features/trema.reset_stats.feature +14 -0
- data/features/trema.run.feature +46 -0
- data/features/trema.send_packets.feature +56 -0
- data/features/trema.show_stats.feature +67 -0
- data/features/tutorial.hello_trema.feature +27 -0
- data/features/tutorial.packet_in.feature +47 -0
- data/features/tutorial.switch_info.feature +55 -0
- data/ruby/.gitignore +4 -0
- data/ruby/blocker.rb +78 -0
- data/ruby/extconf.rb +71 -0
- data/ruby/sub-process.rb +291 -0
- data/ruby/trema/action-common.c +60 -0
- data/ruby/trema/action-common.h +42 -0
- data/ruby/trema/action-enqueue.c +161 -0
- data/ruby/trema/action-enqueue.h +40 -0
- data/ruby/trema/action-output.c +169 -0
- data/ruby/trema/action-output.h +42 -0
- data/ruby/trema/action-set-dl-dst.c +131 -0
- data/ruby/trema/action-set-dl-dst.h +44 -0
- data/ruby/trema/action-set-dl-src.c +131 -0
- data/ruby/trema/action-set-dl-src.h +44 -0
- data/ruby/trema/action-set-nw-dst.c +135 -0
- data/ruby/trema/action-set-nw-dst.h +42 -0
- data/ruby/trema/action-set-nw-src.c +140 -0
- data/ruby/trema/action-set-nw-src.h +42 -0
- data/ruby/trema/action-set-nw-tos.c +124 -0
- data/ruby/trema/action-set-nw-tos.h +42 -0
- data/ruby/trema/action-set-tp-dst.c +122 -0
- data/ruby/trema/action-set-tp-dst.h +42 -0
- data/ruby/trema/action-set-tp-src.c +124 -0
- data/ruby/trema/action-set-tp-src.h +42 -0
- data/ruby/trema/action-set-vlan-pcp.c +128 -0
- data/ruby/trema/action-set-vlan-pcp.h +42 -0
- data/ruby/trema/action-set-vlan-vid.c +125 -0
- data/ruby/trema/action-set-vlan-vid.h +42 -0
- data/ruby/trema/action-strip-vlan.c +81 -0
- data/ruby/trema/action-strip-vlan.h +42 -0
- data/ruby/trema/action-vendor.c +121 -0
- data/ruby/trema/action-vendor.h +42 -0
- data/ruby/trema/aggregate-stats-reply.rb +70 -0
- data/ruby/trema/app.rb +112 -0
- data/ruby/trema/barrier-reply.c +99 -0
- data/ruby/trema/barrier-reply.h +46 -0
- data/ruby/trema/barrier-request.c +108 -0
- data/ruby/trema/barrier-request.h +44 -0
- data/ruby/trema/cli.rb +269 -0
- data/ruby/trema/command.rb +40 -0
- data/ruby/trema/command/dump_flows.rb +62 -0
- data/ruby/trema/command/kill.rb +71 -0
- data/ruby/trema/command/killall.rb +56 -0
- data/ruby/trema/command/reset_stats.rb +61 -0
- data/ruby/trema/command/ruby.rb +55 -0
- data/ruby/trema/command/run.rb +120 -0
- data/ruby/trema/command/send_packets.rb +130 -0
- data/ruby/trema/command/shell.rb +61 -0
- data/ruby/trema/command/show_stats.rb +84 -0
- data/ruby/trema/command/usage.rb +61 -0
- data/ruby/trema/command/version.rb +39 -0
- data/ruby/trema/controller.c +595 -0
- data/ruby/trema/controller.h +44 -0
- data/ruby/trema/controller.rb +81 -0
- data/ruby/trema/daemon.rb +167 -0
- data/ruby/trema/dsl.rb +34 -0
- data/ruby/trema/dsl/configuration.rb +153 -0
- data/ruby/trema/dsl/context.rb +71 -0
- data/ruby/trema/dsl/link.rb +41 -0
- data/ruby/trema/dsl/parser.rb +70 -0
- data/ruby/trema/dsl/run.rb +49 -0
- data/ruby/trema/dsl/runner.rb +165 -0
- data/ruby/trema/dsl/stanza.rb +53 -0
- data/ruby/trema/dsl/switch.rb +78 -0
- data/ruby/trema/dsl/syntax-error.rb +33 -0
- data/ruby/trema/dsl/syntax.rb +109 -0
- data/ruby/trema/dsl/vhost.rb +108 -0
- data/ruby/trema/dsl/vswitch.rb +47 -0
- data/ruby/trema/echo-reply.c +107 -0
- data/ruby/trema/echo-reply.h +42 -0
- data/ruby/trema/echo-request.c +140 -0
- data/ruby/trema/echo-request.h +42 -0
- data/ruby/trema/error.c +253 -0
- data/ruby/trema/error.h +44 -0
- data/ruby/trema/exact-match.rb +36 -0
- data/ruby/trema/executables.rb +95 -0
- data/ruby/trema/features-reply.c +238 -0
- data/ruby/trema/features-reply.h +60 -0
- data/ruby/trema/features-request.c +109 -0
- data/ruby/trema/features-request.h +44 -0
- data/ruby/trema/flow-removed.c +275 -0
- data/ruby/trema/flow-removed.h +46 -0
- data/ruby/trema/flow-stats-reply.rb +109 -0
- data/ruby/trema/flow.rb +56 -0
- data/ruby/trema/get-config-reply.c +159 -0
- data/ruby/trema/get-config-reply.h +52 -0
- data/ruby/trema/get-config-request.c +107 -0
- data/ruby/trema/get-config-request.h +44 -0
- data/ruby/trema/hello.c +110 -0
- data/ruby/trema/hello.h +44 -0
- data/ruby/trema/host.rb +257 -0
- data/ruby/trema/ip.rb +101 -0
- data/ruby/trema/link.rb +176 -0
- data/ruby/trema/list-switches-reply.c +46 -0
- data/ruby/trema/list-switches-reply.h +40 -0
- data/ruby/trema/logger.c +162 -0
- data/ruby/trema/logger.h +44 -0
- data/ruby/trema/mac.rb +151 -0
- data/ruby/trema/match.c +594 -0
- data/ruby/trema/match.h +36 -0
- data/ruby/trema/monkey-patch/integer.rb +35 -0
- data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
- data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
- data/ruby/trema/monkey-patch/module.rb +33 -0
- data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
- data/ruby/trema/monkey-patch/string.rb +33 -0
- data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
- data/ruby/trema/network-component.rb +153 -0
- data/ruby/trema/ofctl.rb +62 -0
- data/ruby/trema/open-vswitch.rb +154 -0
- data/ruby/trema/openflow-error.c +191 -0
- data/ruby/trema/openflow-error.h +53 -0
- data/ruby/trema/openflow-switch.rb +88 -0
- data/ruby/trema/ordered-hash.rb +74 -0
- data/ruby/trema/packet-queue.rb +178 -0
- data/ruby/trema/packet_in.c +736 -0
- data/ruby/trema/packet_in.h +46 -0
- data/ruby/trema/packetin-filter.rb +126 -0
- data/ruby/trema/path.rb +135 -0
- data/ruby/trema/phost.rb +69 -0
- data/ruby/trema/port-mod.c +226 -0
- data/ruby/trema/port-mod.h +36 -0
- data/ruby/trema/port-stats-reply.rb +111 -0
- data/ruby/trema/port-status.c +156 -0
- data/ruby/trema/port-status.h +45 -0
- data/ruby/trema/port.c +295 -0
- data/ruby/trema/port.h +47 -0
- data/ruby/trema/process.rb +76 -0
- data/ruby/trema/queue-get-config-reply.c +200 -0
- data/ruby/trema/queue-get-config-reply.h +47 -0
- data/ruby/trema/queue-get-config-request.c +141 -0
- data/ruby/trema/queue-get-config-request.h +44 -0
- data/ruby/trema/queue-stats-reply.rb +78 -0
- data/ruby/trema/set-config.c +171 -0
- data/ruby/trema/set-config.h +44 -0
- data/ruby/trema/shell.rb +39 -0
- data/ruby/trema/shell/down.rb +39 -0
- data/ruby/trema/shell/killall.rb +40 -0
- data/ruby/trema/shell/link.rb +61 -0
- data/ruby/trema/shell/reset_stats.rb +50 -0
- data/ruby/trema/shell/run.rb +67 -0
- data/ruby/trema/shell/send_packets.rb +42 -0
- data/ruby/trema/shell/show_stats.rb +49 -0
- data/ruby/trema/shell/up.rb +43 -0
- data/ruby/trema/shell/vhost.rb +44 -0
- data/ruby/trema/shell/vswitch.rb +49 -0
- data/ruby/trema/stats-helper.rb +65 -0
- data/ruby/trema/stats-reply.c +483 -0
- data/ruby/trema/stats-reply.h +53 -0
- data/ruby/trema/stats-request.c +634 -0
- data/ruby/trema/stats-request.h +42 -0
- data/ruby/trema/switch-daemon.rb +74 -0
- data/ruby/trema/switch-disconnected.c +40 -0
- data/ruby/trema/switch-disconnected.h +38 -0
- data/ruby/trema/switch-manager.rb +121 -0
- data/ruby/trema/switch.rb +37 -0
- data/ruby/trema/table-stats-reply.rb +87 -0
- data/ruby/trema/timers.rb +97 -0
- data/ruby/trema/trema.c +122 -0
- data/ruby/trema/tremashark.rb +39 -0
- data/ruby/trema/util.rb +84 -0
- data/ruby/trema/vendor-request.c +193 -0
- data/ruby/trema/vendor-request.h +44 -0
- data/ruby/trema/vendor-stats-reply.rb +62 -0
- data/ruby/trema/vendor.c +152 -0
- data/ruby/trema/vendor.h +52 -0
- data/ruby/trema/version.rb +30 -0
- data/spec/spec_helper.rb +153 -0
- data/spec/support/openflow-message.rb +94 -0
- data/spec/trema/action-enqueue_spec.rb +100 -0
- data/spec/trema/action-output_spec.rb +116 -0
- data/spec/trema/action-set-dl-dst_spec.rb +95 -0
- data/spec/trema/action-set-dl-src_spec.rb +92 -0
- data/spec/trema/action-set-nw-dst_spec.rb +96 -0
- data/spec/trema/action-set-nw-src_spec.rb +97 -0
- data/spec/trema/action-set-nw-tos_spec.rb +88 -0
- data/spec/trema/action-set-tp-dst_spec.rb +88 -0
- data/spec/trema/action-set-tp-src_spec.rb +88 -0
- data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
- data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
- data/spec/trema/action-strip-vlan_spec.rb +57 -0
- data/spec/trema/action-vendor_spec.rb +90 -0
- data/spec/trema/app_spec.rb +90 -0
- data/spec/trema/barrier-reply_spec.rb +45 -0
- data/spec/trema/barrier-request_spec.rb +83 -0
- data/spec/trema/cli_spec.rb +160 -0
- data/spec/trema/controller_spec.rb +100 -0
- data/spec/trema/dsl/configuration_spec.rb +122 -0
- data/spec/trema/dsl/link_spec.rb +54 -0
- data/spec/trema/dsl/run_spec.rb +78 -0
- data/spec/trema/dsl/runner_spec.rb +239 -0
- data/spec/trema/dsl/switch_spec.rb +77 -0
- data/spec/trema/dsl/syntax_spec.rb +121 -0
- data/spec/trema/dsl/vhost_spec.rb +148 -0
- data/spec/trema/dsl/vswitch_spec.rb +90 -0
- data/spec/trema/echo-reply_spec.rb +49 -0
- data/spec/trema/echo-request_spec.rb +75 -0
- data/spec/trema/error_spec.rb +142 -0
- data/spec/trema/executables_spec.rb +75 -0
- data/spec/trema/features-reply_spec.rb +57 -0
- data/spec/trema/features-request_spec.rb +66 -0
- data/spec/trema/flow-removed_spec.rb +146 -0
- data/spec/trema/get-config-reply_spec.rb +43 -0
- data/spec/trema/get-config-request_spec.rb +82 -0
- data/spec/trema/hello_spec.rb +49 -0
- data/spec/trema/host_spec.rb +193 -0
- data/spec/trema/link_spec.rb +64 -0
- data/spec/trema/list-switches-reply_spec.rb +48 -0
- data/spec/trema/logger_spec.rb +48 -0
- data/spec/trema/mac_spec.rb +115 -0
- data/spec/trema/match_spec.rb +113 -0
- data/spec/trema/open-vswitch_spec.rb +123 -0
- data/spec/trema/openflow-error_spec.rb +141 -0
- data/spec/trema/openflow-switch_spec.rb +56 -0
- data/spec/trema/packet-in_spec.rb +168 -0
- data/spec/trema/packet-out_spec.rb +128 -0
- data/spec/trema/packetin-filter_spec.rb +41 -0
- data/spec/trema/port-mod_spec.rb +101 -0
- data/spec/trema/port-status_spec.rb +108 -0
- data/spec/trema/port_spec.rb +61 -0
- data/spec/trema/process_spec.rb +71 -0
- data/spec/trema/queue-get-config-reply_spec.rb +66 -0
- data/spec/trema/queue-get-config-request_spec.rb +69 -0
- data/spec/trema/set-config_spec.rb +80 -0
- data/spec/trema/shell/vhost_spec.rb +57 -0
- data/spec/trema/shell/vswitch_spec.rb +89 -0
- data/spec/trema/stats-reply_spec.rb +306 -0
- data/spec/trema/stats-request_spec.rb +151 -0
- data/spec/trema/switch-disconnected_spec.rb +58 -0
- data/spec/trema/switch-manager_spec.rb +43 -0
- data/spec/trema/tremashark_spec.rb +41 -0
- data/spec/trema/util_spec.rb +93 -0
- data/spec/trema/vendor-request_spec.rb +79 -0
- data/src/examples/cbench_switch/README +21 -0
- data/src/examples/cbench_switch/cbench-switch.rb +39 -0
- data/src/examples/cbench_switch/cbench_switch.c +68 -0
- data/src/examples/dumper/dumper.c +370 -0
- data/src/examples/dumper/dumper.conf +7 -0
- data/src/examples/dumper/dumper.rb +196 -0
- data/src/examples/hello_trema/README +13 -0
- data/src/examples/hello_trema/hello_trema.c +51 -0
- data/src/examples/hello_trema/hello_trema.conf +3 -0
- data/src/examples/hello_trema/hello_trema.rb +35 -0
- data/src/examples/learning_switch/README +15 -0
- data/src/examples/learning_switch/fdb.rb +112 -0
- data/src/examples/learning_switch/learning-switch.rb +88 -0
- data/src/examples/learning_switch/learning_switch.c +236 -0
- data/src/examples/learning_switch/learning_switch.conf +18 -0
- data/src/examples/list_switches/README +19 -0
- data/src/examples/list_switches/list-switches.rb +45 -0
- data/src/examples/list_switches/list_switches.c +81 -0
- data/src/examples/list_switches/list_switches.conf +15 -0
- data/src/examples/match_compare/match-compare.conf +30 -0
- data/src/examples/match_compare/match-compare.rb +99 -0
- data/src/examples/multi_learning_switch/README +14 -0
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
- data/src/examples/openflow_message/README +11 -0
- data/src/examples/openflow_message/echo-reply.rb +59 -0
- data/src/examples/openflow_message/echo-request.rb +58 -0
- data/src/examples/openflow_message/echo_reply.c +70 -0
- data/src/examples/openflow_message/echo_request.c +70 -0
- data/src/examples/openflow_message/example.rb +63 -0
- data/src/examples/openflow_message/features-request.rb +97 -0
- data/src/examples/openflow_message/features_request.c +168 -0
- data/src/examples/openflow_message/hello.c +70 -0
- data/src/examples/openflow_message/hello.rb +58 -0
- data/src/examples/openflow_message/set-config.rb +59 -0
- data/src/examples/openflow_message/set_config.c +70 -0
- data/src/examples/packet_in/README +15 -0
- data/src/examples/packet_in/packet_in.c +55 -0
- data/src/examples/packet_in/packet_in.conf +15 -0
- data/src/examples/packet_in/packet_in.rb +34 -0
- data/src/examples/packetin_filter_config/README +12 -0
- data/src/examples/packetin_filter_config/add_filter.c +73 -0
- data/src/examples/packetin_filter_config/delete_filter.c +65 -0
- data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/dump_filter.c +65 -0
- data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
- data/src/examples/packetin_filter_config/utils.c +102 -0
- data/src/examples/packetin_filter_config/utils.h +42 -0
- data/src/examples/repeater_hub/README +8 -0
- data/src/examples/repeater_hub/repeater-hub.rb +43 -0
- data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
- data/src/examples/repeater_hub/repeater_hub.c +83 -0
- data/src/examples/repeater_hub/repeater_hub.conf +28 -0
- data/src/examples/switch_info/README +13 -0
- data/src/examples/switch_info/switch_info.c +80 -0
- data/src/examples/switch_info/switch_info.conf +3 -0
- data/src/examples/switch_info/switch_info.rb +46 -0
- data/src/examples/switch_monitor/switch-monitor.conf +3 -0
- data/src/examples/switch_monitor/switch-monitor.rb +58 -0
- data/src/examples/switch_monitor/switch_monitor.c +154 -0
- data/src/examples/traffic_monitor/counter.c +74 -0
- data/src/examples/traffic_monitor/counter.h +48 -0
- data/src/examples/traffic_monitor/counter.rb +46 -0
- data/src/examples/traffic_monitor/fdb.c +76 -0
- data/src/examples/traffic_monitor/fdb.h +50 -0
- data/src/examples/traffic_monitor/fdb.rb +44 -0
- data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
- data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
- data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
- data/src/lib/arp.h +61 -0
- data/src/lib/bool.h +49 -0
- data/src/lib/buffer.c +305 -0
- data/src/lib/buffer.h +56 -0
- data/src/lib/byteorder.c +547 -0
- data/src/lib/byteorder.h +110 -0
- data/src/lib/checks.h +42 -0
- data/src/lib/daemon.c +302 -0
- data/src/lib/daemon.h +42 -0
- data/src/lib/doubly_linked_list.c +281 -0
- data/src/lib/doubly_linked_list.h +88 -0
- data/src/lib/ether.c +48 -0
- data/src/lib/ether.h +94 -0
- data/src/lib/etherip.h +46 -0
- data/src/lib/event_handler.c +389 -0
- data/src/lib/event_handler.h +64 -0
- data/src/lib/hash_table.c +417 -0
- data/src/lib/hash_table.h +138 -0
- data/src/lib/icmp.h +74 -0
- data/src/lib/igmp.h +50 -0
- data/src/lib/ipv4.h +50 -0
- data/src/lib/linked_list.c +199 -0
- data/src/lib/linked_list.h +84 -0
- data/src/lib/log.c +402 -0
- data/src/lib/log.h +78 -0
- data/src/lib/match.h +84 -0
- data/src/lib/match_table.c +608 -0
- data/src/lib/match_table.h +51 -0
- data/src/lib/message_queue.c +143 -0
- data/src/lib/message_queue.h +61 -0
- data/src/lib/messenger.c +1714 -0
- data/src/lib/messenger.h +145 -0
- data/src/lib/openflow_application_interface.c +1673 -0
- data/src/lib/openflow_application_interface.h +329 -0
- data/src/lib/openflow_message.c +4051 -0
- data/src/lib/openflow_message.h +288 -0
- data/src/lib/openflow_service_interface.h +59 -0
- data/src/lib/packet_info.c +230 -0
- data/src/lib/packet_info.h +209 -0
- data/src/lib/packet_parser.c +502 -0
- data/src/lib/packetin_filter_interface.c +294 -0
- data/src/lib/packetin_filter_interface.h +127 -0
- data/src/lib/persistent_storage.c +480 -0
- data/src/lib/persistent_storage.h +46 -0
- data/src/lib/stat.c +213 -0
- data/src/lib/stat.h +44 -0
- data/src/lib/tcp.h +67 -0
- data/src/lib/timer.c +350 -0
- data/src/lib/timer.h +53 -0
- data/src/lib/trema.c +710 -0
- data/src/lib/trema.h +79 -0
- data/src/lib/trema_private.c +177 -0
- data/src/lib/trema_private.h +60 -0
- data/src/lib/trema_wrapper.c +56 -0
- data/src/lib/trema_wrapper.h +64 -0
- data/src/lib/udp.h +43 -0
- data/src/lib/utility.c +515 -0
- data/src/lib/utility.h +67 -0
- data/src/lib/wrapper.c +100 -0
- data/src/lib/wrapper.h +76 -0
- data/src/packetin_filter/README +17 -0
- data/src/packetin_filter/packetin_filter.c +575 -0
- data/src/switch_manager/README +20 -0
- data/src/switch_manager/cookie_table.c +292 -0
- data/src/switch_manager/cookie_table.h +72 -0
- data/src/switch_manager/dpid_table.c +110 -0
- data/src/switch_manager/dpid_table.h +46 -0
- data/src/switch_manager/management_interface.h +44 -0
- data/src/switch_manager/ofpmsg_recv.c +482 -0
- data/src/switch_manager/ofpmsg_recv.h +42 -0
- data/src/switch_manager/ofpmsg_send.c +235 -0
- data/src/switch_manager/ofpmsg_send.h +50 -0
- data/src/switch_manager/secure_channel_listener.c +281 -0
- data/src/switch_manager/secure_channel_listener.h +42 -0
- data/src/switch_manager/secure_channel_receiver.c +126 -0
- data/src/switch_manager/secure_channel_receiver.h +43 -0
- data/src/switch_manager/secure_channel_sender.c +126 -0
- data/src/switch_manager/secure_channel_sender.h +43 -0
- data/src/switch_manager/service_interface.c +181 -0
- data/src/switch_manager/service_interface.h +46 -0
- data/src/switch_manager/switch.c +538 -0
- data/src/switch_manager/switch.h +51 -0
- data/src/switch_manager/switch_manager.c +448 -0
- data/src/switch_manager/switch_manager.h +63 -0
- data/src/switch_manager/switchinfo.h +72 -0
- data/src/switch_manager/xid_table.c +184 -0
- data/src/switch_manager/xid_table.h +56 -0
- data/src/tremashark/README +78 -0
- data/src/tremashark/packet_capture.c +357 -0
- data/src/tremashark/pcap_private.h +47 -0
- data/src/tremashark/pcap_queue.c +197 -0
- data/src/tremashark/pcap_queue.h +58 -0
- data/src/tremashark/plugin/.gitignore +6 -0
- data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
- data/src/tremashark/plugin/packet-trema/Makefile +77 -0
- data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
- data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
- data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
- data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
- data/src/tremashark/plugin/user_dlts +2 -0
- data/src/tremashark/queue.c +168 -0
- data/src/tremashark/queue.h +60 -0
- data/src/tremashark/stdin_relay.c +257 -0
- data/src/tremashark/syslog_relay.c +247 -0
- data/src/tremashark/tremashark.c +556 -0
- data/trema +93 -0
- data/trema-config +61 -0
- data/unittests/buffer_stubs.c +74 -0
- data/unittests/cmockery_trema.c +123 -0
- data/unittests/cmockery_trema.h +96 -0
- data/unittests/lib/buffer_test.c +370 -0
- data/unittests/lib/byteorder_test.c +1717 -0
- data/unittests/lib/daemon_test.c +664 -0
- data/unittests/lib/doubly_linked_list_test.c +346 -0
- data/unittests/lib/ether_test.c +127 -0
- data/unittests/lib/hash_table_test.c +278 -0
- data/unittests/lib/linked_list_test.c +343 -0
- data/unittests/lib/log_test.c +459 -0
- data/unittests/lib/match_table_test.c +1509 -0
- data/unittests/lib/message_queue_test.c +379 -0
- data/unittests/lib/messenger_test.c +438 -0
- data/unittests/lib/openflow_application_interface_test.c +3488 -0
- data/unittests/lib/openflow_message_test.c +7337 -0
- data/unittests/lib/packet_info_test.c +544 -0
- data/unittests/lib/packet_parser_test.c +703 -0
- data/unittests/lib/packetin_filter_interface_test.c +723 -0
- data/unittests/lib/persistent_storage_test.c +802 -0
- data/unittests/lib/stat_test.c +291 -0
- data/unittests/lib/test_packets/arp_rep.cap +0 -0
- data/unittests/lib/test_packets/arp_req.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
- data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
- data/unittests/lib/test_packets/ipx.cap +0 -0
- data/unittests/lib/test_packets/lldp.cap +0 -0
- data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
- data/unittests/lib/test_packets/tcp.cap +0 -0
- data/unittests/lib/test_packets/tcp_syn.cap +0 -0
- data/unittests/lib/test_packets/udp.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
- data/unittests/lib/timer_test.c +248 -0
- data/unittests/lib/trema_private_test.c +323 -0
- data/unittests/lib/trema_test.c +985 -0
- data/unittests/lib/utility_test.c +628 -0
- data/unittests/lib/wrapper_test.c +201 -0
- data/unittests/packetin_filter/packetin_filter_test.c +477 -0
- data/unittests/switch_manager/switch_manager_test.c +1178 -0
- data/unittests/wrapper_stubs.c +39 -0
- data/vendor/.gitignore +6 -0
- data/vendor/README +30 -0
- data/vendor/cmockery-20110428.tar.gz +0 -0
- data/vendor/oflops-0.03.tar.gz +0 -0
- data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
- data/vendor/openflow-1.0.0.tar.gz +0 -0
- data/vendor/openflow.git.tar.gz +0 -0
- data/vendor/openvswitch-1.2.2.tar.gz +0 -0
- data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
- data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
- data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
- data/vendor/ruby-ifconfig-1.2/README +38 -0
- data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
- data/vendor/ruby-ifconfig-1.2/TODO +8 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
- data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
- data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
- metadata +856 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
|
7
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
* published by the Free Software Foundation.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License along
|
|
16
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#ifndef STATS_REPLY_H
|
|
22
|
+
#define STATS_REPLY_H
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
#include "ruby.h"
|
|
26
|
+
#include "trema.h"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
extern VALUE cStatsReply;
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
void Init_stats_reply( void );
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
void handle_stats_reply(
|
|
36
|
+
uint64_t datapath_id,
|
|
37
|
+
uint32_t transaction_id,
|
|
38
|
+
uint16_t type,
|
|
39
|
+
uint16_t flags,
|
|
40
|
+
const buffer *body,
|
|
41
|
+
void *user_data
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
#endif // STATS_REPLY_H
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* Local variables:
|
|
50
|
+
* c-basic-offset: 2
|
|
51
|
+
* indent-tabs-mode: nil
|
|
52
|
+
* End:
|
|
53
|
+
*/
|
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
|
7
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
* published by the Free Software Foundation.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License along
|
|
16
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#include "trema.h"
|
|
22
|
+
#include "ruby.h"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
extern VALUE mTrema;
|
|
26
|
+
VALUE cStatsRequest;
|
|
27
|
+
VALUE cFlowStatsRequest;
|
|
28
|
+
VALUE cAggregateStatsRequest;
|
|
29
|
+
VALUE cTableStatsRequest;
|
|
30
|
+
VALUE cPortStatsRequest;
|
|
31
|
+
VALUE cQueueStatsRequest;
|
|
32
|
+
VALUE cVendorStatsRequest;
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
static const struct ofp_match MATCH = { 0, 1,
|
|
36
|
+
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x07 },
|
|
37
|
+
{ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d },
|
|
38
|
+
1, 1, { 0 }, 0x800, 0xfc, 0x6, { 0, 0 },
|
|
39
|
+
0x0a090807, 0x0a090807, 1024, 2048 };
|
|
40
|
+
static const uint32_t MY_TRANSACTION_ID = 1;
|
|
41
|
+
static const uint32_t VENDOR_ID = 0x00004cff;
|
|
42
|
+
static const uint16_t NO_FLAGS = 0;
|
|
43
|
+
static const uint16_t OUT_PORT = 1;
|
|
44
|
+
static const uint16_t VENDOR_STATS_FLAG = 0xaabb;
|
|
45
|
+
static const uint8_t TABLE_ID = 0xff;
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* @overload initialize(options={})
|
|
50
|
+
* A +OPPT_STATS_REQUEST+ message is sent to collect statistics for a
|
|
51
|
+
* type element from the datapath. This type element can be a flow
|
|
52
|
+
* port, queue, or vendor. All stats. request messages share a common header
|
|
53
|
+
* followed by additional fields that further describe the request type.
|
|
54
|
+
* There is a derived class for each associated type. All stats. requests
|
|
55
|
+
* encapsulate their instances as a buffer object that can be converted
|
|
56
|
+
* to a packet to be used for transmission.
|
|
57
|
+
*
|
|
58
|
+
* @see FlowStatsRequest
|
|
59
|
+
* @see AggregateStatsRequest
|
|
60
|
+
* @see TableStatsRequest
|
|
61
|
+
* @see PortStatsRequest
|
|
62
|
+
* @see QueueStatsRequest
|
|
63
|
+
* @see VendorStatsRequest
|
|
64
|
+
*
|
|
65
|
+
* @param [Hash] options
|
|
66
|
+
* the options to create a message with.
|
|
67
|
+
*
|
|
68
|
+
* @option options [Number] :transaction_id
|
|
69
|
+
* transaction_id for this request or auto-generated if not specified.
|
|
70
|
+
*
|
|
71
|
+
* @option options [Number] :flags
|
|
72
|
+
* flags not defined yet should be set to zero.
|
|
73
|
+
*
|
|
74
|
+
* @raise [ArgumentError] if supplied transaction_id is not an unsigned 32-bit integer.
|
|
75
|
+
*
|
|
76
|
+
* @return [StatsRequest]
|
|
77
|
+
* an object that encapsulates an +OFPT_STATS_REQUEST+ OpenFlow message.
|
|
78
|
+
*/
|
|
79
|
+
static VALUE
|
|
80
|
+
stats_request_init( VALUE self, VALUE options ) {
|
|
81
|
+
VALUE transaction_id;
|
|
82
|
+
if ( ( transaction_id = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
|
|
83
|
+
if ( rb_funcall( transaction_id, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
|
|
84
|
+
rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
transaction_id = UINT2NUM( get_transaction_id() );
|
|
89
|
+
}
|
|
90
|
+
rb_iv_set( self, "@transaction_id", transaction_id );
|
|
91
|
+
VALUE flags = rb_hash_aref( options, ID2SYM( rb_intern( "flags" ) ) );
|
|
92
|
+
if ( flags == Qnil ) {
|
|
93
|
+
flags = UINT2NUM( 0 );
|
|
94
|
+
}
|
|
95
|
+
rb_iv_set( self, "@flags", flags );
|
|
96
|
+
return self;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
static VALUE
|
|
101
|
+
subclass_stats_request_init( VALUE self, VALUE options ) {
|
|
102
|
+
rb_call_super( 1, &options );
|
|
103
|
+
VALUE match = rb_hash_aref( options, ID2SYM( rb_intern( "match" ) ) );
|
|
104
|
+
if ( match == Qnil ) {
|
|
105
|
+
rb_raise( rb_eArgError, "match option must be specified" );
|
|
106
|
+
}
|
|
107
|
+
rb_iv_set( self, "@match", match );
|
|
108
|
+
VALUE table_id = rb_hash_aref( options, ID2SYM( rb_intern( "table_id" ) ) );
|
|
109
|
+
if ( table_id == Qnil ) {
|
|
110
|
+
table_id = UINT2NUM( 0xff );
|
|
111
|
+
}
|
|
112
|
+
rb_iv_set( self, "@table_id", table_id );
|
|
113
|
+
VALUE out_port = rb_hash_aref( options, ID2SYM( rb_intern( "out_port" ) ) );
|
|
114
|
+
if ( out_port == Qnil ) {
|
|
115
|
+
out_port = UINT2NUM( OFPP_NONE );
|
|
116
|
+
}
|
|
117
|
+
rb_iv_set( self, "@out_port", out_port );
|
|
118
|
+
return self;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
static VALUE
|
|
123
|
+
flow_stats_request_alloc( VALUE klass ) {
|
|
124
|
+
buffer *flow_stats_request = create_flow_stats_request( MY_TRANSACTION_ID, NO_FLAGS, MATCH, TABLE_ID, OUT_PORT );
|
|
125
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, flow_stats_request );
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
static VALUE
|
|
130
|
+
aggregate_stats_request_alloc( VALUE klass ) {
|
|
131
|
+
buffer *aggregate_stats_request = create_aggregate_stats_request( MY_TRANSACTION_ID, NO_FLAGS, MATCH, TABLE_ID, OUT_PORT );
|
|
132
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, aggregate_stats_request );
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
static VALUE
|
|
137
|
+
table_stats_request_alloc( VALUE klass ) {
|
|
138
|
+
buffer *table_stats_request = create_table_stats_request( MY_TRANSACTION_ID, NO_FLAGS );
|
|
139
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, table_stats_request );
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
static VALUE
|
|
144
|
+
port_stats_request_alloc( VALUE klass ) {
|
|
145
|
+
uint16_t port_no = 1;
|
|
146
|
+
buffer *port_stats_request = create_port_stats_request( MY_TRANSACTION_ID, NO_FLAGS, port_no );
|
|
147
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, port_stats_request );
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
static VALUE
|
|
152
|
+
queue_stats_request_alloc( VALUE klass ) {
|
|
153
|
+
uint32_t queue_id = 10;
|
|
154
|
+
uint16_t port_no = 1;
|
|
155
|
+
buffer *queue_stats_request = create_queue_stats_request( MY_TRANSACTION_ID, NO_FLAGS, port_no, queue_id );
|
|
156
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, queue_stats_request );
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
static VALUE
|
|
161
|
+
vendor_stats_request_alloc( VALUE klass ) {
|
|
162
|
+
uint16_t length = 128;
|
|
163
|
+
buffer *body = alloc_buffer_with_length( length );
|
|
164
|
+
void *p = append_back_buffer( body, length );
|
|
165
|
+
memset( p, 0xaf, length );
|
|
166
|
+
buffer *vendor_stats_request = create_vendor_stats_request( MY_TRANSACTION_ID, VENDOR_STATS_FLAG, VENDOR_ID, body );
|
|
167
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, vendor_stats_request );
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* Transaction ids, message sequence numbers matching requests to replies.
|
|
173
|
+
*
|
|
174
|
+
* @return [Number] the value of transaction_id.
|
|
175
|
+
*/
|
|
176
|
+
static VALUE
|
|
177
|
+
stats_transaction_id( VALUE self ) {
|
|
178
|
+
return rb_iv_get( self, "@transaction_id" );
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
/*
|
|
183
|
+
* Not yet defined. Set to zero.
|
|
184
|
+
*
|
|
185
|
+
* @return [Number] the value of flags.
|
|
186
|
+
*/
|
|
187
|
+
static VALUE
|
|
188
|
+
stats_flags( VALUE self ) {
|
|
189
|
+
return rb_iv_get( self, "@flags" );
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
/*
|
|
194
|
+
* Detailed description of each flow field.
|
|
195
|
+
*
|
|
196
|
+
* @return [Match] the value of match.
|
|
197
|
+
*/
|
|
198
|
+
static VALUE
|
|
199
|
+
stats_match( VALUE self ) {
|
|
200
|
+
return rb_iv_get( self, "@match" );
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* An index into array of tables. 0xff for all tables.
|
|
206
|
+
*
|
|
207
|
+
* @return [Number] the value of table_id.
|
|
208
|
+
*/
|
|
209
|
+
static VALUE
|
|
210
|
+
stats_table_id( VALUE self ) {
|
|
211
|
+
return rb_iv_get( self, "@table_id" );
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
/*
|
|
216
|
+
* Requires flow matching if defined.
|
|
217
|
+
*
|
|
218
|
+
* @return [Number] the value of out_port.
|
|
219
|
+
*/
|
|
220
|
+
static VALUE
|
|
221
|
+
stats_out_port( VALUE self ) {
|
|
222
|
+
return rb_iv_get( self, "@out_port" );
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
/*
|
|
227
|
+
* Restrict port statistics to a specific port_no or to all ports.
|
|
228
|
+
*
|
|
229
|
+
* @return [Number] the value of port_no.
|
|
230
|
+
*/
|
|
231
|
+
static VALUE
|
|
232
|
+
stats_port_no( VALUE self ) {
|
|
233
|
+
return rb_iv_get( self, "@port_no" );
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
/*
|
|
238
|
+
* Restrict queue statistics to a specific queue_id or to all queues.
|
|
239
|
+
*
|
|
240
|
+
* @return [Number] the value of queue_id.
|
|
241
|
+
*/
|
|
242
|
+
static VALUE
|
|
243
|
+
stats_queue_id( VALUE self ) {
|
|
244
|
+
return rb_iv_get( self, "@queue_id" );
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* Vendor id uniquely assigned for each vendor.
|
|
250
|
+
*
|
|
251
|
+
* @return [Number] the value of vendor_id.
|
|
252
|
+
*/
|
|
253
|
+
static VALUE
|
|
254
|
+
stats_vendor_id( VALUE self ) {
|
|
255
|
+
return rb_iv_get( self, "@vendor_id" );
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
uint32_t
|
|
260
|
+
get_stats_request_num2uint( VALUE self, const char *field ) {
|
|
261
|
+
return NUM2UINT( rb_iv_get( self, field ) );
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
uint16_t
|
|
266
|
+
get_stats_request_num2uint16( VALUE self, const char *field ) {
|
|
267
|
+
return ( uint16_t ) NUM2UINT( rb_iv_get( self, field ) );
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
uint8_t
|
|
272
|
+
get_stats_request_table_id( VALUE self ) {
|
|
273
|
+
return ( uint8_t ) NUM2UINT( rb_iv_get( self, "@table_id" ) );
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
struct ofp_match
|
|
278
|
+
get_stats_request_match( VALUE self ) {
|
|
279
|
+
const struct ofp_match *match;
|
|
280
|
+
Data_Get_Struct( rb_iv_get( self, "@match" ), struct ofp_match, match );
|
|
281
|
+
return *match;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* A {FlowStatsRequest} object instance to request flow statistics.
|
|
287
|
+
*
|
|
288
|
+
* @overload initialize(options={})
|
|
289
|
+
* @example
|
|
290
|
+
* FlowStatsRequest.new(
|
|
291
|
+
* :match => Match
|
|
292
|
+
* )
|
|
293
|
+
*
|
|
294
|
+
* @param [Hash] options
|
|
295
|
+
* the options to create a message with.
|
|
296
|
+
*
|
|
297
|
+
* @option options [Match] :match
|
|
298
|
+
* a {Match} object to match flow fields with this request.
|
|
299
|
+
* This option is mandatory.
|
|
300
|
+
*
|
|
301
|
+
* @option options [Number] :table_id
|
|
302
|
+
* a table id to match and restrict returned results.
|
|
303
|
+
* A value of 0xff would return all tables and is set to if not specified.
|
|
304
|
+
*
|
|
305
|
+
* @option options [Number] :out_port
|
|
306
|
+
* a value of +OFPP_NONE+ would match all flow entries and is set to if not
|
|
307
|
+
* specified.
|
|
308
|
+
*
|
|
309
|
+
* @raise [ArgumentError] if option[:match] is not specified.
|
|
310
|
+
*
|
|
311
|
+
* @return [FlowStatsRequest]
|
|
312
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_FLOW)+ OpenFlow message.
|
|
313
|
+
*/
|
|
314
|
+
static VALUE
|
|
315
|
+
flow_stats_request_init( VALUE self, VALUE options ) {
|
|
316
|
+
buffer *message;
|
|
317
|
+
Data_Get_Struct( self, buffer, message );
|
|
318
|
+
|
|
319
|
+
subclass_stats_request_init( self, options );
|
|
320
|
+
|
|
321
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
322
|
+
|
|
323
|
+
struct ofp_stats_request *stats_request;
|
|
324
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
325
|
+
struct ofp_flow_stats_request *flow_stats_request;
|
|
326
|
+
flow_stats_request = ( struct ofp_flow_stats_request * ) stats_request->body;
|
|
327
|
+
|
|
328
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
329
|
+
|
|
330
|
+
struct ofp_match m = get_stats_request_match( self );
|
|
331
|
+
hton_match( &flow_stats_request->match, &m ) ;
|
|
332
|
+
flow_stats_request->table_id = get_stats_request_table_id( self );
|
|
333
|
+
flow_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
|
|
334
|
+
return self;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
/*
|
|
339
|
+
* A {AggregateStatsRequest} object instance to request aggregate statistics.
|
|
340
|
+
* @overload initialize(options={})
|
|
341
|
+
* @example
|
|
342
|
+
* AggregateStatsRequest.new(
|
|
343
|
+
* :match => Match
|
|
344
|
+
* )
|
|
345
|
+
*
|
|
346
|
+
* @param [Hash] options
|
|
347
|
+
* the options to create a message with.
|
|
348
|
+
*
|
|
349
|
+
* @option options [Match] :match
|
|
350
|
+
* a {Match} object to match flow fields with this request.
|
|
351
|
+
* This option is mandatory.
|
|
352
|
+
*
|
|
353
|
+
* @option options [Number] :table_id
|
|
354
|
+
* a table id to match and restrict returned results.
|
|
355
|
+
* A value of 0xff would return all tables and is set to if not specified.
|
|
356
|
+
*
|
|
357
|
+
* @option options [Number] :out_port
|
|
358
|
+
* a value of +OFPP_NONE+ would match all flow entries and is set to if not
|
|
359
|
+
* specified.
|
|
360
|
+
*
|
|
361
|
+
* @raise [ArgumentError] if option[:match] is not specified.
|
|
362
|
+
*
|
|
363
|
+
* @return [AggregateStatsRequest]
|
|
364
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_AGGREGATE)+ OpenFlow message.
|
|
365
|
+
*/
|
|
366
|
+
static VALUE
|
|
367
|
+
aggregate_stats_request_init( VALUE self, VALUE options ) {
|
|
368
|
+
buffer *message;
|
|
369
|
+
Data_Get_Struct( self, buffer, message );
|
|
370
|
+
|
|
371
|
+
subclass_stats_request_init( self, options );
|
|
372
|
+
|
|
373
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
374
|
+
|
|
375
|
+
struct ofp_stats_request *stats_request;
|
|
376
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
377
|
+
struct ofp_aggregate_stats_request *aggregate_stats_request;
|
|
378
|
+
aggregate_stats_request = ( struct ofp_aggregate_stats_request * ) stats_request->body;
|
|
379
|
+
|
|
380
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
381
|
+
|
|
382
|
+
struct ofp_match m = get_stats_request_match( self );
|
|
383
|
+
hton_match( &aggregate_stats_request->match, &m ) ;
|
|
384
|
+
aggregate_stats_request->table_id = get_stats_request_table_id( self );
|
|
385
|
+
aggregate_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
|
|
386
|
+
return self;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
/*
|
|
391
|
+
* A {TableStatsRequest} object instance to request table statistics.
|
|
392
|
+
* Request table statistics. The table stats. request does not contain any data
|
|
393
|
+
* in the body.
|
|
394
|
+
*
|
|
395
|
+
* @overload initialize(options={})
|
|
396
|
+
*
|
|
397
|
+
* @example
|
|
398
|
+
* TableStatsRequest.new(
|
|
399
|
+
* :transaction_id => 1234
|
|
400
|
+
* )
|
|
401
|
+
*
|
|
402
|
+
* @param [Hash] options
|
|
403
|
+
* the options to create a message with.
|
|
404
|
+
*
|
|
405
|
+
* @option options [Number] :transaction_id
|
|
406
|
+
* set the transaction_id as specified or auto-generate it.
|
|
407
|
+
*
|
|
408
|
+
* @return [TableStatsRequest]
|
|
409
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_TABLE)+ openflow
|
|
410
|
+
* message.
|
|
411
|
+
*/
|
|
412
|
+
static VALUE
|
|
413
|
+
table_stats_request_init( int argc, VALUE *argv, VALUE self ) {
|
|
414
|
+
VALUE options;
|
|
415
|
+
if ( !rb_scan_args( argc, argv, "01", &options )) {
|
|
416
|
+
options = rb_hash_new();
|
|
417
|
+
}
|
|
418
|
+
rb_call_super( 1, &options );
|
|
419
|
+
buffer *message;
|
|
420
|
+
Data_Get_Struct( self, buffer, message );
|
|
421
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
422
|
+
struct ofp_stats_request *stats_request;
|
|
423
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
424
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
425
|
+
return self;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
/*
|
|
430
|
+
* A {PortStatsRequest} object instance to request port statistics.
|
|
431
|
+
* Request port statistics.
|
|
432
|
+
*
|
|
433
|
+
* @overload initialize(options={})
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* PortStatsRequest.new(
|
|
437
|
+
* :port_no => port_no
|
|
438
|
+
* )
|
|
439
|
+
*
|
|
440
|
+
* @param [Hash] options
|
|
441
|
+
* the options to create a message with.
|
|
442
|
+
*
|
|
443
|
+
* @option options [Number] :port_no
|
|
444
|
+
* request statistics for a specific port if specified, otherwise set port_no
|
|
445
|
+
* to +OFPP_NONE+ for all ports.
|
|
446
|
+
*
|
|
447
|
+
* @return [PortStatsRequest]
|
|
448
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_PORT)+ OpenFlow
|
|
449
|
+
* message.
|
|
450
|
+
*/
|
|
451
|
+
static VALUE
|
|
452
|
+
port_stats_request_init( int argc, VALUE *argv, VALUE self ) {
|
|
453
|
+
VALUE options;
|
|
454
|
+
if ( !rb_scan_args( argc, argv, "01", &options )) {
|
|
455
|
+
options = rb_hash_new();
|
|
456
|
+
}
|
|
457
|
+
rb_call_super( 1, &options );
|
|
458
|
+
VALUE port_no = rb_hash_aref( options, ID2SYM( rb_intern( "port_no" ) ) );
|
|
459
|
+
if ( port_no == Qnil ) {
|
|
460
|
+
port_no = UINT2NUM( OFPP_NONE );
|
|
461
|
+
}
|
|
462
|
+
rb_iv_set( self, "@port_no", port_no );
|
|
463
|
+
|
|
464
|
+
buffer *message;
|
|
465
|
+
Data_Get_Struct( self, buffer, message );
|
|
466
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
467
|
+
struct ofp_stats_request *stats_request;
|
|
468
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
469
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
470
|
+
struct ofp_port_stats_request *port_stats_request = ( struct ofp_port_stats_request * ) stats_request->body;
|
|
471
|
+
port_stats_request->port_no = htons( get_stats_request_num2uint16( self, "@port_no" ) );
|
|
472
|
+
return self;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
/*
|
|
477
|
+
* A {QueueStatsRequest} object instance to request queue statistics.
|
|
478
|
+
* Request queue statistics.
|
|
479
|
+
*
|
|
480
|
+
* @overload initialize(options={})
|
|
481
|
+
*
|
|
482
|
+
* @example
|
|
483
|
+
* QueueStatsRequest.new(
|
|
484
|
+
* :port_no => port_no,
|
|
485
|
+
* :queue_id => queue_id
|
|
486
|
+
* )
|
|
487
|
+
*
|
|
488
|
+
* @param [Hash] options
|
|
489
|
+
* the options to create a message with.
|
|
490
|
+
*
|
|
491
|
+
* @option options [Number] :port_no
|
|
492
|
+
* request statistics for a specific port if specified, otherwise set port_no
|
|
493
|
+
* to +OFPP_ALL+ for all ports.
|
|
494
|
+
*
|
|
495
|
+
* @option options [Number] :queue_id
|
|
496
|
+
* request statistics for a specific queue_id or set queue_id to +OFPQ_ALL+
|
|
497
|
+
* for all queues.
|
|
498
|
+
*
|
|
499
|
+
* @return [QueueStatsRequest]
|
|
500
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_QUEUE)+ OpenFlow
|
|
501
|
+
* message.
|
|
502
|
+
*/
|
|
503
|
+
static VALUE
|
|
504
|
+
queue_stats_request_init( int argc, VALUE *argv, VALUE self ) {
|
|
505
|
+
VALUE options;
|
|
506
|
+
if ( !rb_scan_args( argc, argv, "01", &options )) {
|
|
507
|
+
options = rb_hash_new();
|
|
508
|
+
}
|
|
509
|
+
rb_call_super( 1, &options );
|
|
510
|
+
VALUE port_no = rb_hash_aref( options, ID2SYM( rb_intern( "port_no" ) ) );
|
|
511
|
+
if ( port_no == Qnil ) {
|
|
512
|
+
port_no = UINT2NUM( OFPP_ALL );
|
|
513
|
+
}
|
|
514
|
+
rb_iv_set( self, "@port_no", port_no );
|
|
515
|
+
VALUE queue_id = rb_hash_aref( options, ID2SYM( rb_intern( "queue_id" ) ) );
|
|
516
|
+
if ( queue_id == Qnil ) {
|
|
517
|
+
queue_id = UINT2NUM( OFPQ_ALL );
|
|
518
|
+
}
|
|
519
|
+
rb_iv_set( self, "@queue_id", queue_id );
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
buffer *message;
|
|
523
|
+
Data_Get_Struct( self, buffer, message );
|
|
524
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
525
|
+
struct ofp_stats_request *stats_request;
|
|
526
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
527
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
528
|
+
|
|
529
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
530
|
+
struct ofp_queue_stats_request *queue_stats_request;
|
|
531
|
+
queue_stats_request = ( struct ofp_queue_stats_request * ) stats_request->body;
|
|
532
|
+
queue_stats_request->port_no = htons( get_stats_request_num2uint16( self, "@port_no" ) );
|
|
533
|
+
queue_stats_request->queue_id = htonl( get_stats_request_num2uint( self, "@queue_id" ) );
|
|
534
|
+
return self;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
/*
|
|
539
|
+
* A {VendorStatsRequest} object instance to request vendor statistics.
|
|
540
|
+
* Request vendor specific statistics.
|
|
541
|
+
*
|
|
542
|
+
* @overload initialize(options={})
|
|
543
|
+
*
|
|
544
|
+
* @example
|
|
545
|
+
* VendorStatsRequeset.new(
|
|
546
|
+
* :vendor_id => vendor_id
|
|
547
|
+
* )
|
|
548
|
+
*
|
|
549
|
+
* @param [Hash] options
|
|
550
|
+
* the options to create a message with.
|
|
551
|
+
*
|
|
552
|
+
* @option options [Number] :vendor_id
|
|
553
|
+
* request statistics for a specific vendor_id, otherwise set vendor_id
|
|
554
|
+
* to a default value of 0x00004cff.
|
|
555
|
+
*
|
|
556
|
+
* @return [VendorStatsRequest]
|
|
557
|
+
* an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_VENDOR)+ openflow
|
|
558
|
+
* message.
|
|
559
|
+
*/
|
|
560
|
+
static VALUE
|
|
561
|
+
vendor_stats_request_init( int argc, VALUE *argv, VALUE self ) {
|
|
562
|
+
VALUE options;
|
|
563
|
+
|
|
564
|
+
if ( !rb_scan_args( argc, argv, "01", &options )) {
|
|
565
|
+
options = rb_hash_new();
|
|
566
|
+
}
|
|
567
|
+
rb_call_super( 1, &options );
|
|
568
|
+
VALUE vendor_id = rb_hash_aref( options, ID2SYM( rb_intern( "vendor_id" ) ) );
|
|
569
|
+
if ( vendor_id == Qnil ) {
|
|
570
|
+
vendor_id = UINT2NUM( 0x00004cff );
|
|
571
|
+
}
|
|
572
|
+
rb_iv_set( self, "@vendor_id", vendor_id );
|
|
573
|
+
buffer *message;
|
|
574
|
+
Data_Get_Struct( self, buffer, message );
|
|
575
|
+
( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
|
|
576
|
+
struct ofp_stats_request *stats_request;
|
|
577
|
+
stats_request = ( struct ofp_stats_request * ) message->data;
|
|
578
|
+
stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
|
|
579
|
+
uint32_t *vendor;
|
|
580
|
+
vendor = ( uint32_t * ) stats_request->body;
|
|
581
|
+
*vendor = htonl( get_stats_request_num2uint( self, "@vendor_id" ) );
|
|
582
|
+
return self;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
void
|
|
587
|
+
Init_stats_request(){
|
|
588
|
+
cStatsRequest = rb_define_class_under( mTrema, "StatsRequest", rb_cObject );
|
|
589
|
+
cFlowStatsRequest = rb_define_class_under( mTrema, "FlowStatsRequest", cStatsRequest );
|
|
590
|
+
rb_define_method( cStatsRequest, "initialize", stats_request_init, 1 );
|
|
591
|
+
rb_define_method( cStatsRequest, "transaction_id", stats_transaction_id, 0 );
|
|
592
|
+
rb_define_method( cStatsRequest, "flags", stats_flags, 0 );
|
|
593
|
+
|
|
594
|
+
rb_define_alloc_func( cFlowStatsRequest, flow_stats_request_alloc );
|
|
595
|
+
rb_define_method( cFlowStatsRequest, "initialize", flow_stats_request_init, 1 );
|
|
596
|
+
rb_define_method( cFlowStatsRequest, "match", stats_match, 0 );
|
|
597
|
+
rb_define_method( cFlowStatsRequest, "table_id", stats_table_id, 0 );
|
|
598
|
+
rb_define_method( cFlowStatsRequest, "out_port", stats_out_port, 0 );
|
|
599
|
+
|
|
600
|
+
cAggregateStatsRequest = rb_define_class_under( mTrema, "AggregateStatsRequest", cStatsRequest );
|
|
601
|
+
rb_define_alloc_func( cAggregateStatsRequest, aggregate_stats_request_alloc );
|
|
602
|
+
rb_define_method( cAggregateStatsRequest, "initialize", aggregate_stats_request_init, 1 );
|
|
603
|
+
rb_define_method( cAggregateStatsRequest, "match", stats_match, 0 );
|
|
604
|
+
rb_define_method( cAggregateStatsRequest, "table_id", stats_table_id, 0 );
|
|
605
|
+
rb_define_method( cAggregateStatsRequest, "out_port", stats_out_port, 0 );
|
|
606
|
+
|
|
607
|
+
cTableStatsRequest = rb_define_class_under( mTrema, "TableStatsRequest", cStatsRequest );
|
|
608
|
+
rb_define_alloc_func( cTableStatsRequest, table_stats_request_alloc );
|
|
609
|
+
rb_define_method( cTableStatsRequest, "initialize", table_stats_request_init, -1 );
|
|
610
|
+
|
|
611
|
+
cPortStatsRequest = rb_define_class_under( mTrema, "PortStatsRequest", cStatsRequest );
|
|
612
|
+
rb_define_alloc_func( cPortStatsRequest, port_stats_request_alloc );
|
|
613
|
+
rb_define_method( cPortStatsRequest, "initialize", port_stats_request_init, -1 );
|
|
614
|
+
rb_define_method( cPortStatsRequest, "port_no", stats_port_no, 0 );
|
|
615
|
+
|
|
616
|
+
cQueueStatsRequest = rb_define_class_under( mTrema, "QueueStatsRequest", cStatsRequest );
|
|
617
|
+
rb_define_alloc_func( cQueueStatsRequest, queue_stats_request_alloc );
|
|
618
|
+
rb_define_method( cQueueStatsRequest, "initialize", queue_stats_request_init, -1 );
|
|
619
|
+
rb_define_method( cQueueStatsRequest, "port_no", stats_port_no, 0 );
|
|
620
|
+
rb_define_method( cQueueStatsRequest, "queue_id", stats_queue_id, 0 );
|
|
621
|
+
|
|
622
|
+
cVendorStatsRequest = rb_define_class_under( mTrema, "VendorStatsRequest", cStatsRequest );
|
|
623
|
+
rb_define_alloc_func( cVendorStatsRequest, vendor_stats_request_alloc );
|
|
624
|
+
rb_define_method( cVendorStatsRequest, "initialize", vendor_stats_request_init, -1 );
|
|
625
|
+
rb_define_method( cVendorStatsRequest, "vendor_id", stats_vendor_id, 0 );
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
/*
|
|
630
|
+
* Local variables:
|
|
631
|
+
* c-basic-offset: 2
|
|
632
|
+
* indent-tabs-mode: nil
|
|
633
|
+
* End:
|
|
634
|
+
*/
|