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
data/src/lib/ether.h
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Ethernet header definitions
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazuya Suzuki
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
7
|
+
*
|
|
8
|
+
* This program is free software; you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
10
|
+
* published by the Free Software Foundation.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU General Public License along
|
|
18
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ifndef ETHER_H
|
|
24
|
+
#define ETHER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include <endian.h>
|
|
28
|
+
#include <stdint.h>
|
|
29
|
+
#include "bool.h"
|
|
30
|
+
#include "buffer.h"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#define ETH_ADDRLEN 6
|
|
34
|
+
#define ETH_FCS_LENGTH 4
|
|
35
|
+
#define ETH_MINIMUM_LENGTH 64
|
|
36
|
+
#define ETH_MAXIMUM_LENGTH 1518
|
|
37
|
+
#define ETH_HDR_LENGTH sizeof( ether_header_t )
|
|
38
|
+
#define ETH_MTU ( ETH_MAXIMUM_LENGTH - ETH_HDR_LENGTH - ETH_FCS_LENGTH )
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
//Ethernet payload types
|
|
42
|
+
#define ETH_ETHTYPE_8023 0x05dc
|
|
43
|
+
#define ETH_ETHTYPE_IPV4 0x0800
|
|
44
|
+
#define ETH_ETHTYPE_ARP 0x0806
|
|
45
|
+
#define ETH_ETHTYPE_TPID 0x8100
|
|
46
|
+
#define ETH_ETHTYPE_IPV6 0x86DD
|
|
47
|
+
#define ETH_ETHTYPE_EAPOL 0x88c7
|
|
48
|
+
#define ETH_ETHTYPE_LLDP 0x88cc
|
|
49
|
+
#define ETH_ETHTYPE_UKNOWN 0xffff
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
typedef struct ether_headr {
|
|
53
|
+
uint8_t macda[ ETH_ADDRLEN ];
|
|
54
|
+
uint8_t macsa[ ETH_ADDRLEN ];
|
|
55
|
+
uint16_t type;
|
|
56
|
+
} ether_header_t;
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
typedef struct vlantag_header {
|
|
60
|
+
uint16_t tci;
|
|
61
|
+
uint16_t type;
|
|
62
|
+
} vlantag_header_t;
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
typedef struct snap_header {
|
|
66
|
+
uint8_t llc[ 3 ];
|
|
67
|
+
uint8_t oui[ 3 ];
|
|
68
|
+
uint16_t type;
|
|
69
|
+
} snap_header_t;
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
#define TCI_GET_PRIO( _tci ) ( uint8_t )( ( ( _tci ) >> 13 ) & 7 )
|
|
73
|
+
|
|
74
|
+
#define TCI_GET_CFI( _tci ) ( uint8_t )( ( ( _tci ) >> 12 ) & 1 )
|
|
75
|
+
|
|
76
|
+
#define TCI_GET_VID( _tci ) ( uint16_t )( ( _tci ) & 0x0FFF )
|
|
77
|
+
|
|
78
|
+
#define TCI_CREATE( _prio, _cfi, _vid ) \
|
|
79
|
+
( uint16_t )( ( ( ( _prio ) & 7 ) << 13 ) | \
|
|
80
|
+
( ( ( _cfi ) & 1 ) << 12 ) | \
|
|
81
|
+
( ( _vid ) & 0x0FFF ) )
|
|
82
|
+
|
|
83
|
+
uint16_t fill_ether_padding( buffer *buf );
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
#endif // ETHER_H
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/*
|
|
90
|
+
* Local variables:
|
|
91
|
+
* c-basic-offset: 2
|
|
92
|
+
* indent-tabs-mode: nil
|
|
93
|
+
* End:
|
|
94
|
+
*/
|
data/src/lib/etherip.h
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* EtherIP definitions
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazushi SUGYO
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
7
|
+
*
|
|
8
|
+
* This program is free software; you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
10
|
+
* published by the Free Software Foundation.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU General Public License along
|
|
18
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ifndef ETHERIP_H
|
|
24
|
+
#define ETHERIP_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#define IPPROTO_ETHERIP 97
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
typedef struct etherip_headr {
|
|
31
|
+
uint16_t version;
|
|
32
|
+
} etherip_header;
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
#define ETHERIP_VERSION ( 0x3 << 12 )
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#endif // ETHERIP_H
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Local variables:
|
|
43
|
+
* c-basic-offset: 2
|
|
44
|
+
* indent-tabs-mode: nil
|
|
45
|
+
* End:
|
|
46
|
+
*/
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Jari Sundell
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2011 axsh Ltd.
|
|
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 <errno.h>
|
|
22
|
+
#include <stddef.h>
|
|
23
|
+
#include <string.h>
|
|
24
|
+
#include <sys/time.h>
|
|
25
|
+
#include <unistd.h>
|
|
26
|
+
#include "checks.h"
|
|
27
|
+
#include "event_handler.h"
|
|
28
|
+
#include "log.h"
|
|
29
|
+
#include "timer.h"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
#ifdef UNIT_TESTING
|
|
33
|
+
|
|
34
|
+
#define static
|
|
35
|
+
|
|
36
|
+
#ifdef error
|
|
37
|
+
#undef error
|
|
38
|
+
#endif
|
|
39
|
+
#define error mock_error
|
|
40
|
+
extern void mock_error( const char *format, ... );
|
|
41
|
+
|
|
42
|
+
#ifdef debug
|
|
43
|
+
#undef debug
|
|
44
|
+
#endif
|
|
45
|
+
#define debug mock_debug
|
|
46
|
+
extern void mock_debug( const char *format, ... );
|
|
47
|
+
|
|
48
|
+
#ifdef warn
|
|
49
|
+
#undef warn
|
|
50
|
+
#endif
|
|
51
|
+
#define warn mock_warn
|
|
52
|
+
extern void mock_warn( const char *format, ... );
|
|
53
|
+
|
|
54
|
+
#ifdef add_periodic_event_callback
|
|
55
|
+
#undef add_periodic_event_callback
|
|
56
|
+
#endif
|
|
57
|
+
#define add_periodic_event_callback mock_add_periodic_event_callback
|
|
58
|
+
extern bool mock_add_periodic_event_callback( const time_t seconds, void ( *callback )( void *user_data ), void *user_data );
|
|
59
|
+
|
|
60
|
+
#ifdef execute_timer_events
|
|
61
|
+
#undef execute_timer_events
|
|
62
|
+
#endif
|
|
63
|
+
#define execute_timer_events mock_execute_timer_events
|
|
64
|
+
extern void mock_execute_timer_events( int *next_timeout_usec );
|
|
65
|
+
|
|
66
|
+
#endif // UNIT_TESTING
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
typedef struct {
|
|
70
|
+
int fd;
|
|
71
|
+
event_fd_callback read_callback;
|
|
72
|
+
event_fd_callback write_callback;
|
|
73
|
+
void *read_data;
|
|
74
|
+
void *write_data;
|
|
75
|
+
} event_fd;
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
enum {
|
|
79
|
+
EVENT_HANDLER_INITIALIZED = 0x1,
|
|
80
|
+
EVENT_HANDLER_RUNNING = 0x2,
|
|
81
|
+
EVENT_HANDLER_STOP = 0x4,
|
|
82
|
+
EVENT_HANDLER_FINALIZED = 0x8
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
int event_handler_state = 0;
|
|
86
|
+
|
|
87
|
+
event_fd event_list[ FD_SETSIZE ];
|
|
88
|
+
event_fd *event_last;
|
|
89
|
+
|
|
90
|
+
event_fd *event_fd_set[ FD_SETSIZE ];
|
|
91
|
+
|
|
92
|
+
fd_set event_read_set;
|
|
93
|
+
fd_set event_write_set;
|
|
94
|
+
fd_set current_read_set;
|
|
95
|
+
fd_set current_write_set;
|
|
96
|
+
|
|
97
|
+
int fd_set_size = 0;
|
|
98
|
+
|
|
99
|
+
external_callback_t external_callback = ( external_callback_t ) NULL;
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
static void
|
|
103
|
+
_init_event_handler() {
|
|
104
|
+
event_last = event_list;
|
|
105
|
+
event_handler_state = EVENT_HANDLER_INITIALIZED;
|
|
106
|
+
|
|
107
|
+
memset( event_list, 0, sizeof( event_fd ) * FD_SETSIZE );
|
|
108
|
+
memset( event_fd_set, 0, sizeof( event_fd * ) * FD_SETSIZE );
|
|
109
|
+
|
|
110
|
+
FD_ZERO( &event_read_set );
|
|
111
|
+
FD_ZERO( &event_write_set );
|
|
112
|
+
}
|
|
113
|
+
void ( *init_event_handler )() = _init_event_handler;
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
static void
|
|
117
|
+
_finalize_event_handler() {
|
|
118
|
+
if ( event_last != event_list ) {
|
|
119
|
+
warn( "Event Handler finalized with %i fd event handlers still active. (%i, ...)",
|
|
120
|
+
( event_last - event_list ), ( event_last > event_list ? event_list->fd : -1 ) );
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
event_handler_state = EVENT_HANDLER_FINALIZED;
|
|
125
|
+
}
|
|
126
|
+
void ( *finalize_event_handler )() = _finalize_event_handler;
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
static bool
|
|
130
|
+
_run_event_handler_once( int timeout_usec ) {
|
|
131
|
+
if ( external_callback != NULL ) {
|
|
132
|
+
external_callback_t callback = external_callback;
|
|
133
|
+
external_callback = NULL;
|
|
134
|
+
|
|
135
|
+
callback();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
memcpy( ¤t_read_set, &event_read_set, sizeof( fd_set ) );
|
|
139
|
+
memcpy( ¤t_write_set, &event_write_set, sizeof( fd_set ) );
|
|
140
|
+
|
|
141
|
+
struct timeval timeout;
|
|
142
|
+
timeout.tv_sec = timeout_usec / 1000000;
|
|
143
|
+
timeout.tv_usec = timeout_usec % 1000000;
|
|
144
|
+
int set_count = select( fd_set_size, ¤t_read_set, ¤t_write_set, NULL, &timeout );
|
|
145
|
+
|
|
146
|
+
if ( set_count == -1 ) {
|
|
147
|
+
if ( errno == EINTR ) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
error( "Failed to select ( errno = %s [%d] ).", strerror( errno ), errno );
|
|
151
|
+
return false;
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
else if ( set_count == 0 ) {
|
|
155
|
+
// timed out
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
event_fd *event_itr = event_list;
|
|
160
|
+
|
|
161
|
+
while ( event_itr < event_last ) {
|
|
162
|
+
event_fd current_event = *event_itr;
|
|
163
|
+
|
|
164
|
+
if ( FD_ISSET( current_event.fd, ¤t_write_set ) ) {
|
|
165
|
+
current_event.write_callback( current_event.fd, current_event.write_data );
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if ( FD_ISSET( current_event.fd, ¤t_read_set ) ) {
|
|
169
|
+
current_event.read_callback( current_event.fd, current_event.read_data );
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// In the rare cases the current fd is closed, a new one is opened
|
|
173
|
+
// with the same fd and is put in the same location we can just
|
|
174
|
+
// wait for the next select call.
|
|
175
|
+
if ( current_event.fd == event_itr->fd ) {
|
|
176
|
+
event_itr = event_itr + 1;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
debug( "run_event_handler_once: event fd is changed ( current = %d, new = %d )", current_event.fd, event_itr->fd ) ;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
bool ( *run_event_handler_once )( int ) = _run_event_handler_once;
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
static bool
|
|
189
|
+
_start_event_handler() {
|
|
190
|
+
debug( "Starting event handler." );
|
|
191
|
+
|
|
192
|
+
event_handler_state |= EVENT_HANDLER_RUNNING;
|
|
193
|
+
|
|
194
|
+
int timeout_usec;
|
|
195
|
+
while ( !( event_handler_state & EVENT_HANDLER_STOP ) ) {
|
|
196
|
+
execute_timer_events( &timeout_usec );
|
|
197
|
+
|
|
198
|
+
if ( !run_event_handler_once( timeout_usec ) ) {
|
|
199
|
+
error( "Failed to run main loop." );
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
event_handler_state &= ~EVENT_HANDLER_RUNNING;
|
|
205
|
+
|
|
206
|
+
debug( "Event handler terminated." );
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
bool ( *start_event_handler )() = _start_event_handler;
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
static void
|
|
213
|
+
_stop_event_handler() {
|
|
214
|
+
debug( "Terminating event handler." );
|
|
215
|
+
event_handler_state |= EVENT_HANDLER_STOP;
|
|
216
|
+
}
|
|
217
|
+
void ( *stop_event_handler )() = _stop_event_handler;
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
static void
|
|
222
|
+
_set_fd_handler( int fd,
|
|
223
|
+
event_fd_callback read_callback, void *read_data,
|
|
224
|
+
event_fd_callback write_callback, void *write_data ) {
|
|
225
|
+
debug( "Adding event handler for fd %i, %p, %p.", fd, read_callback, write_callback );
|
|
226
|
+
|
|
227
|
+
// Currently just issue critical warnings instead of killing the
|
|
228
|
+
// program."
|
|
229
|
+
if ( event_fd_set[ fd ] != NULL ) {
|
|
230
|
+
error( "Tried to add an already active fd event handler." );
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if ( fd < 0 || fd >= FD_SETSIZE ) {
|
|
235
|
+
error( "Tried to add an invalid fd." );
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if ( event_last >= event_list + FD_SETSIZE ) {
|
|
240
|
+
error( "Event handler list in invalid state." );
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
event_last->fd = fd;
|
|
245
|
+
event_last->read_callback = read_callback;
|
|
246
|
+
event_last->write_callback = write_callback;
|
|
247
|
+
event_last->read_data = read_data;
|
|
248
|
+
event_last->write_data = write_data;
|
|
249
|
+
|
|
250
|
+
event_fd_set[ fd ] = event_last++;
|
|
251
|
+
|
|
252
|
+
if ( fd >= fd_set_size ) {
|
|
253
|
+
fd_set_size = fd + 1;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
void ( *set_fd_handler )( int fd, event_fd_callback read_callback, void *read_data, event_fd_callback write_callback, void *write_data ) = _set_fd_handler;
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
static void
|
|
260
|
+
_delete_fd_handler( int fd ) {
|
|
261
|
+
debug( "Deleting event handler for fd %i.", fd );
|
|
262
|
+
|
|
263
|
+
event_fd* event = event_list;
|
|
264
|
+
|
|
265
|
+
while ( event != event_last && event->fd != fd ) {
|
|
266
|
+
event++;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if ( event >= event_last || event_fd_set[ fd ] == NULL ) {
|
|
270
|
+
error( "Tried to delete an inactive fd event handler." );
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if ( FD_ISSET( fd, &event_read_set ) ) {
|
|
275
|
+
error( "Tried to delete an fd event handler with active read notification." );
|
|
276
|
+
// return;
|
|
277
|
+
FD_CLR( fd, &event_read_set );
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if ( FD_ISSET( fd, &event_write_set ) ) {
|
|
281
|
+
error( "Tried to delete an fd event handler with active write notification." );
|
|
282
|
+
// return;
|
|
283
|
+
FD_CLR( fd, &event_write_set );
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
FD_CLR( fd, ¤t_read_set );
|
|
287
|
+
FD_CLR( fd, ¤t_write_set );
|
|
288
|
+
|
|
289
|
+
event_fd_set[ fd ] = NULL;
|
|
290
|
+
|
|
291
|
+
if ( event != --event_last ) {
|
|
292
|
+
memcpy( event, event_last, sizeof( event_fd ) );
|
|
293
|
+
event_fd_set[ event->fd ] = event;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
memset( event_last, 0, sizeof( event_fd ) );
|
|
297
|
+
event_last->fd = -1;
|
|
298
|
+
|
|
299
|
+
if ( fd == ( fd_set_size - 1 ) ) {
|
|
300
|
+
int i;
|
|
301
|
+
for ( i = ( fd_set_size - 2 ); i >= 0; --i ) {
|
|
302
|
+
if ( event_fd_set[ i ] != NULL ) {
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
fd_set_size = i + 1;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
void ( *delete_fd_handler )( int fd ) = _delete_fd_handler;
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
static void
|
|
313
|
+
_set_readable( int fd, bool state ) {
|
|
314
|
+
if ( fd < 0 || fd >= FD_SETSIZE ) {
|
|
315
|
+
error( "Invalid fd to set_readable call; %i.", fd );
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if ( event_fd_set[ fd ] == NULL || event_fd_set[ fd ]->read_callback == NULL ) {
|
|
320
|
+
error( "Found fd in invalid state in set_readable; %i, %p.", fd, event_fd_set[ fd ] );
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if ( state ) {
|
|
325
|
+
FD_SET( fd, &event_read_set );
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
FD_CLR( fd, &event_read_set );
|
|
329
|
+
FD_CLR( fd, ¤t_read_set );
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
void ( *set_readable )( int fd, bool state ) = _set_readable;
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
static void
|
|
336
|
+
_set_writable( int fd, bool state ) {
|
|
337
|
+
if ( fd < 0 || fd >= FD_SETSIZE ) {
|
|
338
|
+
error( "Invalid fd to notify_writeable_event call; %i.", fd );
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if ( event_fd_set[ fd ] == NULL || event_fd_set[ fd ]->write_callback == NULL ) {
|
|
343
|
+
error( "Found fd in invalid state in notify_writeable_event; %i, %p.", fd, event_fd_set[ fd ] );
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if ( state ) {
|
|
348
|
+
FD_SET( fd, &event_write_set );
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
FD_CLR( fd, &event_write_set );
|
|
352
|
+
FD_CLR( fd, ¤t_write_set );
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
void ( *set_writable )( int fd, bool state ) = _set_writable;
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
static bool
|
|
359
|
+
_readable( int fd ) {
|
|
360
|
+
return FD_ISSET( fd, &event_read_set );
|
|
361
|
+
}
|
|
362
|
+
bool ( *readable )( int fd ) = _readable;
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
static bool
|
|
366
|
+
_writable( int fd ) {
|
|
367
|
+
return FD_ISSET( fd, &event_write_set );
|
|
368
|
+
}
|
|
369
|
+
bool ( *writable )( int fd ) = _writable;
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
static bool
|
|
373
|
+
_set_external_callback( external_callback_t callback ) {
|
|
374
|
+
if ( external_callback != NULL ) {
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
external_callback = callback;
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
bool ( *set_external_callback )( external_callback_t callback ) = _set_external_callback;
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
/*
|
|
385
|
+
* Local variables:
|
|
386
|
+
* c-basic-offset: 2
|
|
387
|
+
* indent-tabs-mode: nil
|
|
388
|
+
* End:
|
|
389
|
+
*/
|