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,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Trema event handler library.
|
|
3
|
+
*
|
|
4
|
+
* Author: Jari Sundell
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2011 axsh Ltd.
|
|
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 EVENT_HANDLER_H
|
|
24
|
+
#define EVENT_HANDLER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include <sys/types.h>
|
|
28
|
+
#include "bool.h"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
typedef void ( *event_fd_callback )( int, void *data );
|
|
32
|
+
typedef void ( *external_callback_t )( void );
|
|
33
|
+
|
|
34
|
+
extern void ( *init_event_handler )();
|
|
35
|
+
extern void ( *finalize_event_handler )();
|
|
36
|
+
|
|
37
|
+
extern bool ( *start_event_handler )();
|
|
38
|
+
extern void ( *stop_event_handler )();
|
|
39
|
+
|
|
40
|
+
extern bool ( *run_event_handler_once )( int timeout_usec );
|
|
41
|
+
|
|
42
|
+
extern void ( *set_fd_handler )( int fd, event_fd_callback read_callback, void *read_data, event_fd_callback write_callback, void *write_data );
|
|
43
|
+
extern void ( *delete_fd_handler )( int fd );
|
|
44
|
+
|
|
45
|
+
extern void ( *set_readable )( int fd, bool state );
|
|
46
|
+
extern void ( *set_writable )( int fd, bool state );
|
|
47
|
+
|
|
48
|
+
extern bool ( *readable )( int fd );
|
|
49
|
+
extern bool ( *writable )( int fd );
|
|
50
|
+
|
|
51
|
+
// Optional functions for event handlers to implement, must be signal
|
|
52
|
+
// safe. Leave as NULL if not supported.
|
|
53
|
+
extern bool ( *set_external_callback )( external_callback_t callback );
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
#endif // EVENT_HANDLER_H
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* Local variables:
|
|
61
|
+
* c-basic-offset: 2
|
|
62
|
+
* indent-tabs-mode: nil
|
|
63
|
+
* End:
|
|
64
|
+
*/
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Yasuhito Takamiya <yasuhito@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 <assert.h>
|
|
22
|
+
#include <pthread.h>
|
|
23
|
+
#include <string.h>
|
|
24
|
+
#include "hash_table.h"
|
|
25
|
+
#include "wrapper.h"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
static const unsigned int default_hash_size = 65521;
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
typedef struct {
|
|
32
|
+
hash_table public;
|
|
33
|
+
pthread_mutex_t *mutex;
|
|
34
|
+
} private_hash_table;
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Compares two pointer arguments and returns true if they are
|
|
39
|
+
* equal. It can be passed to create_hash() as the key_equal_func
|
|
40
|
+
* parameter, when using pointers as keys in a hash_table.
|
|
41
|
+
*
|
|
42
|
+
* @param x a key.
|
|
43
|
+
* @param y a key to compare with x.
|
|
44
|
+
* @return true if the two keys match.
|
|
45
|
+
*/
|
|
46
|
+
bool
|
|
47
|
+
compare_atom( const void *x, const void *y ) {
|
|
48
|
+
return x == y;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Converts a pointer to a hash value. It can be passed to
|
|
54
|
+
* create_hash() as the hash parameter, when using pointers as keys in
|
|
55
|
+
* a hash_table.
|
|
56
|
+
*
|
|
57
|
+
* @param key a pointer key.
|
|
58
|
+
* @return a hash value corresponding to the key.
|
|
59
|
+
*/
|
|
60
|
+
unsigned int
|
|
61
|
+
hash_atom( const void *key ) {
|
|
62
|
+
return ( unsigned int ) ( ( unsigned long ) key >> 2 );
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Creates a new hash_table.
|
|
68
|
+
*
|
|
69
|
+
* @param compare a function to check two keys for equality. This is
|
|
70
|
+
* used when looking up keys in the hash_table. If compare is
|
|
71
|
+
* NULL, keys are compared by compare_atom().
|
|
72
|
+
* @param hash a function to create a hash value from a key. Hash
|
|
73
|
+
* values are used to determine where keys are stored within
|
|
74
|
+
* the hash_table data structure. If hash_func is NULL,
|
|
75
|
+
* hash_atom() is used.
|
|
76
|
+
* @return a new hash_table.
|
|
77
|
+
*/
|
|
78
|
+
hash_table *
|
|
79
|
+
create_hash( const compare_function compare, const hash_function hash ) {
|
|
80
|
+
return create_hash_with_size( compare, hash, default_hash_size );
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Creates a new hash_table by specifying its bucket size.
|
|
86
|
+
*
|
|
87
|
+
* @param compare a function to check two keys for equality. This is
|
|
88
|
+
* used when looking up keys in the hash_table. If compare is
|
|
89
|
+
* NULL, keys are compared by compare_atom().
|
|
90
|
+
* @param hash a function to create a hash value from a key. Hash
|
|
91
|
+
* values are used to determine where keys are stored within
|
|
92
|
+
* the hash_table data structure. If hash_func is NULL,
|
|
93
|
+
* hash_atom() is used.
|
|
94
|
+
* @param size the number of hash buckets.
|
|
95
|
+
* @return a new hash_table.
|
|
96
|
+
*/
|
|
97
|
+
hash_table *
|
|
98
|
+
create_hash_with_size( const compare_function compare, const hash_function hash, unsigned int size ) {
|
|
99
|
+
private_hash_table *table = xmalloc( sizeof( private_hash_table ) );
|
|
100
|
+
|
|
101
|
+
table->public.number_of_buckets = size;
|
|
102
|
+
table->public.compare = compare ? compare : compare_atom;
|
|
103
|
+
table->public.hash = hash ? hash : hash_atom;
|
|
104
|
+
table->public.length = 0;
|
|
105
|
+
table->public.buckets = xmalloc( sizeof( dlist_element * ) * table->public.number_of_buckets );
|
|
106
|
+
memset( table->public.buckets, 0, sizeof( dlist_element * ) * table->public.number_of_buckets );
|
|
107
|
+
table->public.nonempty_bucket_index = create_dlist();
|
|
108
|
+
|
|
109
|
+
pthread_mutexattr_t attr;
|
|
110
|
+
pthread_mutexattr_init( &attr );
|
|
111
|
+
pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE_NP );
|
|
112
|
+
table->mutex = xmalloc( sizeof( pthread_mutex_t ) );
|
|
113
|
+
pthread_mutex_init( table->mutex, &attr );
|
|
114
|
+
|
|
115
|
+
return ( hash_table * ) table;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
static unsigned int
|
|
120
|
+
get_bucket_index( const hash_table *table, const void *key ) {
|
|
121
|
+
assert( table != NULL );
|
|
122
|
+
assert( key != NULL );
|
|
123
|
+
|
|
124
|
+
return ( *table->hash )( key ) % table->number_of_buckets;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
static void
|
|
129
|
+
new_bucket( hash_table *table, unsigned int bucket_index ) {
|
|
130
|
+
table->buckets[ bucket_index ] = create_dlist();
|
|
131
|
+
table->buckets[ bucket_index ]->data = insert_after_dlist( table->nonempty_bucket_index, ( void * ) ( unsigned long ) bucket_index );
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
#define MUTEX_LOCK( table ) pthread_mutex_lock( ( ( private_hash_table * ) ( table ) )->mutex )
|
|
136
|
+
#define MUTEX_UNLOCK( table ) pthread_mutex_unlock( ( ( private_hash_table * ) ( table ) )->mutex )
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Inserts a new key and value into a hash_table. If the key already
|
|
141
|
+
* exists in the hash_table its current value is replaced with the new
|
|
142
|
+
* value.
|
|
143
|
+
*
|
|
144
|
+
* @param table a hash_table.
|
|
145
|
+
* @param key a key to insert.
|
|
146
|
+
* @param value the value to associate with the key.
|
|
147
|
+
* @return the old value associated with the key.
|
|
148
|
+
*/
|
|
149
|
+
void *
|
|
150
|
+
insert_hash_entry( hash_table *table, void *key, void *value ) {
|
|
151
|
+
assert( table != NULL );
|
|
152
|
+
assert( key != NULL );
|
|
153
|
+
|
|
154
|
+
MUTEX_LOCK( table );
|
|
155
|
+
|
|
156
|
+
void *old_value = NULL;
|
|
157
|
+
unsigned int i = get_bucket_index( table, key );
|
|
158
|
+
|
|
159
|
+
if ( table->buckets[ i ] != NULL ) {
|
|
160
|
+
dlist_element *old_element = NULL;
|
|
161
|
+
for ( old_element = table->buckets[ i ]->next; old_element; old_element = old_element->next ) {
|
|
162
|
+
if ( ( *table->compare )( key, ( ( hash_entry * ) old_element->data )->key ) ) {
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if ( old_element != NULL ) {
|
|
167
|
+
old_value = ( ( hash_entry * ) old_element->data )->value;
|
|
168
|
+
delete_hash_entry( table, key );
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if ( table->buckets[ i ] == NULL ) {
|
|
173
|
+
new_bucket( table, i );
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
hash_entry *new_entry = xmalloc( sizeof( hash_entry ) );
|
|
177
|
+
new_entry->key = key;
|
|
178
|
+
new_entry->value = value;
|
|
179
|
+
insert_after_dlist( table->buckets[ i ], new_entry );
|
|
180
|
+
table->length++;
|
|
181
|
+
|
|
182
|
+
MUTEX_UNLOCK( table );
|
|
183
|
+
|
|
184
|
+
return old_value;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Looks up a key in a hash_table.
|
|
190
|
+
*
|
|
191
|
+
* @param table a hash_table.
|
|
192
|
+
* @param key the key to look up.
|
|
193
|
+
* @return the associated value, or NULL if the key is not found.
|
|
194
|
+
*/
|
|
195
|
+
void *
|
|
196
|
+
lookup_hash_entry( hash_table *table, const void *key ) {
|
|
197
|
+
assert( table != NULL );
|
|
198
|
+
assert( key != NULL );
|
|
199
|
+
|
|
200
|
+
MUTEX_LOCK( table );
|
|
201
|
+
|
|
202
|
+
void *value = NULL;
|
|
203
|
+
unsigned int i = get_bucket_index( table, key );
|
|
204
|
+
if ( table->buckets[ i ] != NULL ) {
|
|
205
|
+
for ( dlist_element *e = table->buckets[ i ]->next; e; e = e->next ) {
|
|
206
|
+
if ( ( *table->compare )( key, ( ( hash_entry * ) e->data )->key ) ) {
|
|
207
|
+
value = ( ( hash_entry * ) e->data )->value;
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
MUTEX_UNLOCK( table );
|
|
214
|
+
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
static void
|
|
220
|
+
delete_bucket( hash_table *table, unsigned int bucket_index ) {
|
|
221
|
+
if ( table->buckets[ bucket_index ]->data != NULL ) {
|
|
222
|
+
delete_dlist_element( table->buckets[ bucket_index ]->data );
|
|
223
|
+
table->buckets[ bucket_index ]->data = NULL;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
delete_dlist( table->buckets[ bucket_index ] );
|
|
227
|
+
table->buckets[ bucket_index ] = NULL;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Deletes a key and its associated value from a hash_table.
|
|
233
|
+
*
|
|
234
|
+
* @param table a hash_table.
|
|
235
|
+
* @param key the key to remove
|
|
236
|
+
* @return the value deleted from the hash_table.
|
|
237
|
+
*/
|
|
238
|
+
void *
|
|
239
|
+
delete_hash_entry( hash_table *table, const void *key ) {
|
|
240
|
+
assert( table != NULL );
|
|
241
|
+
assert( key != NULL );
|
|
242
|
+
|
|
243
|
+
MUTEX_LOCK( table );
|
|
244
|
+
|
|
245
|
+
unsigned int i = get_bucket_index( table, key );
|
|
246
|
+
|
|
247
|
+
if ( table->buckets[ i ] == NULL ) {
|
|
248
|
+
MUTEX_UNLOCK( table );
|
|
249
|
+
return NULL;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
void *deleted = NULL;
|
|
253
|
+
dlist_element *e = NULL;
|
|
254
|
+
for ( e = table->buckets[ i ]->next; e; e = e->next ) {
|
|
255
|
+
if ( ( *table->compare )( key, ( ( hash_entry * ) e->data )->key ) ) {
|
|
256
|
+
hash_entry *delete_me = e->data;
|
|
257
|
+
deleted = delete_me->value;
|
|
258
|
+
delete_dlist_element( e );
|
|
259
|
+
xfree( delete_me );
|
|
260
|
+
table->length--;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if ( table->buckets[ i ]->next == NULL ) {
|
|
266
|
+
delete_bucket( table, i );
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
MUTEX_UNLOCK( table );
|
|
270
|
+
|
|
271
|
+
return deleted;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Calls the given function for each of the key/value pairs in the
|
|
277
|
+
* hash_table. The function is passed the key and value of each pair,
|
|
278
|
+
* and the given user_data parameter.
|
|
279
|
+
*
|
|
280
|
+
* @param table a hash_table.
|
|
281
|
+
* @param function the function to call for each key/value pair.
|
|
282
|
+
* @param user_data user data to pass to the function.
|
|
283
|
+
*/
|
|
284
|
+
void
|
|
285
|
+
foreach_hash( hash_table *table, void function( void *key, void *value, void *user_data ), void *user_data ) {
|
|
286
|
+
assert( table != NULL );
|
|
287
|
+
|
|
288
|
+
MUTEX_LOCK( table );
|
|
289
|
+
|
|
290
|
+
for ( dlist_element *nonempty = table->nonempty_bucket_index->next; nonempty; ) {
|
|
291
|
+
int i = ( int ) ( unsigned long ) nonempty->data;
|
|
292
|
+
nonempty = nonempty->next;
|
|
293
|
+
|
|
294
|
+
if ( table->buckets[ i ] == NULL ) {
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
for ( dlist_element *e = table->buckets[ i ]->next; e != NULL; ) {
|
|
299
|
+
hash_entry *h = e->data;
|
|
300
|
+
e = e->next;
|
|
301
|
+
function( h->key, h->value, user_data );
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
MUTEX_UNLOCK( table );
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Initializes a key/value pair iterator and associates it with
|
|
311
|
+
* hash_table. Modifying the hash table after calling this function
|
|
312
|
+
* invalidates the returned iterator.
|
|
313
|
+
*
|
|
314
|
+
* @param table a hash_table.
|
|
315
|
+
* @param iterator an uninitialized hash_iterator
|
|
316
|
+
*/
|
|
317
|
+
void
|
|
318
|
+
init_hash_iterator( hash_table *table, hash_iterator *iterator ) {
|
|
319
|
+
assert( table != NULL );
|
|
320
|
+
assert( iterator != NULL );
|
|
321
|
+
|
|
322
|
+
iterator->buckets = table->buckets;
|
|
323
|
+
if ( table->nonempty_bucket_index->next ) {
|
|
324
|
+
iterator->bucket_index = table->nonempty_bucket_index->next;
|
|
325
|
+
iterator->next_bucket_index = iterator->bucket_index->next;
|
|
326
|
+
assert( iterator->buckets[ ( int ) ( unsigned long ) iterator->bucket_index->data ] != NULL );
|
|
327
|
+
iterator->element = iterator->buckets[ ( int ) ( unsigned long ) iterator->bucket_index->data ]->next;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
iterator->bucket_index = NULL;
|
|
331
|
+
iterator->element = NULL;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Advances iterator and retrieves the hash_entry that are now pointed
|
|
338
|
+
* to as a result of this advancement. If NULL is returned, the
|
|
339
|
+
* iterator becomes invalid.
|
|
340
|
+
*
|
|
341
|
+
* @param iterator a hash_iterator.
|
|
342
|
+
* @return a hash_entry.
|
|
343
|
+
*/
|
|
344
|
+
hash_entry *
|
|
345
|
+
iterate_hash_next( hash_iterator *iterator ) {
|
|
346
|
+
assert( iterator != NULL );
|
|
347
|
+
|
|
348
|
+
for ( ;; ) {
|
|
349
|
+
if ( iterator->bucket_index == NULL ) {
|
|
350
|
+
return NULL;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
dlist_element *e = iterator->element;
|
|
354
|
+
if ( e == NULL ) {
|
|
355
|
+
if ( iterator->next_bucket_index != NULL ) {
|
|
356
|
+
iterator->bucket_index = iterator->next_bucket_index;
|
|
357
|
+
iterator->next_bucket_index = iterator->next_bucket_index->next;
|
|
358
|
+
int bucket_index = ( int ) ( unsigned long ) iterator->bucket_index->data;
|
|
359
|
+
assert( iterator->buckets[ bucket_index ] != NULL );
|
|
360
|
+
iterator->element = iterator->buckets[ bucket_index ]->next;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
return NULL;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
iterator->element = e->next;
|
|
368
|
+
return e->data;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Deletes a hash_table.
|
|
376
|
+
*
|
|
377
|
+
* @param table a hash_table.
|
|
378
|
+
*/
|
|
379
|
+
void
|
|
380
|
+
delete_hash( hash_table *table ) {
|
|
381
|
+
assert( table != NULL );
|
|
382
|
+
|
|
383
|
+
pthread_mutex_lock( ( ( private_hash_table * ) table )->mutex );
|
|
384
|
+
pthread_mutex_t *mutex = ( ( private_hash_table * ) table )->mutex;
|
|
385
|
+
|
|
386
|
+
for ( dlist_element *nonempty = table->nonempty_bucket_index->next; nonempty; ) {
|
|
387
|
+
unsigned int i = ( unsigned int ) ( unsigned long ) nonempty->data;
|
|
388
|
+
nonempty = nonempty->next;
|
|
389
|
+
if ( table->buckets[ i ] == NULL ) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
for ( dlist_element *e = table->buckets[ i ]->next; e != NULL; ) {
|
|
394
|
+
dlist_element *delete_me = e;
|
|
395
|
+
e = e->next;
|
|
396
|
+
xfree( delete_me->data );
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
delete_bucket( table, i );
|
|
400
|
+
}
|
|
401
|
+
xfree( table->buckets );
|
|
402
|
+
|
|
403
|
+
delete_dlist( table->nonempty_bucket_index );
|
|
404
|
+
|
|
405
|
+
xfree( table );
|
|
406
|
+
|
|
407
|
+
pthread_mutex_unlock( mutex );
|
|
408
|
+
xfree( mutex );
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
/*
|
|
413
|
+
* Local variables:
|
|
414
|
+
* c-basic-offset: 2
|
|
415
|
+
* indent-tabs-mode: nil
|
|
416
|
+
* End:
|
|
417
|
+
*/
|