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,294 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Yasunobu Chiba
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2011 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 <arpa/inet.h>
|
|
22
|
+
#include <stddef.h>
|
|
23
|
+
#include <stdio.h>
|
|
24
|
+
#include <string.h>
|
|
25
|
+
#include <sys/types.h>
|
|
26
|
+
#include <unistd.h>
|
|
27
|
+
#include "buffer.h"
|
|
28
|
+
#include "byteorder.h"
|
|
29
|
+
#include "log.h"
|
|
30
|
+
#include "packetin_filter_interface.h"
|
|
31
|
+
#include "trema_wrapper.h"
|
|
32
|
+
#include "wrapper.h"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
typedef struct {
|
|
36
|
+
void *callback;
|
|
37
|
+
void *user_data;
|
|
38
|
+
} handler_data;
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
static bool initialized = false;
|
|
42
|
+
static char client_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
static void
|
|
46
|
+
set_client_service_name( void ) {
|
|
47
|
+
snprintf( client_service_name, sizeof( client_service_name ), "packetin_filter.%u", trema_getpid() );
|
|
48
|
+
client_service_name[ sizeof( client_service_name ) - 1 ] = '\0';
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
static const char *
|
|
53
|
+
get_client_service_name( void ) {
|
|
54
|
+
return client_service_name;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
static void
|
|
59
|
+
maybe_init_packetin_filter_interface( void ) {
|
|
60
|
+
if ( initialized ) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
init_packetin_filter_interface();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
static void
|
|
69
|
+
addition_completed( int status, handler_data *data ) {
|
|
70
|
+
if ( data->callback != NULL ) {
|
|
71
|
+
add_packetin_filter_handler callback = data->callback;
|
|
72
|
+
callback( status, data->user_data );
|
|
73
|
+
}
|
|
74
|
+
xfree( data );
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
static void
|
|
79
|
+
deletion_completed( int status, int n_deleted, handler_data *data ) {
|
|
80
|
+
if ( data->callback != NULL ) {
|
|
81
|
+
delete_packetin_filter_handler callback = data->callback;
|
|
82
|
+
callback( status, n_deleted, data->user_data );
|
|
83
|
+
}
|
|
84
|
+
xfree( data );
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
static void
|
|
89
|
+
ntoh_packetin_filter_entry( packetin_filter_entry *dst, packetin_filter_entry *src ) {
|
|
90
|
+
ntoh_match( &dst->match, &src->match );
|
|
91
|
+
dst->priority = ntohs( src->priority );
|
|
92
|
+
memcpy( dst->service_name, src->service_name, sizeof( dst->service_name ) );
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
static void
|
|
97
|
+
dump_completed( int status, int n_entries, packetin_filter_entry *entries, handler_data *data ) {
|
|
98
|
+
if ( data->callback != NULL ) {
|
|
99
|
+
dump_packetin_filter_handler callback = data->callback;
|
|
100
|
+
callback( status, n_entries, entries, data->user_data );
|
|
101
|
+
}
|
|
102
|
+
xfree( data );
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
bool
|
|
107
|
+
add_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name,
|
|
108
|
+
add_packetin_filter_handler callback, void *user_data ) {
|
|
109
|
+
if ( service_name == NULL || ( service_name != NULL && strlen( service_name ) == 0 ) ) {
|
|
110
|
+
error( "Service name must be specified." );
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
maybe_init_packetin_filter_interface();
|
|
115
|
+
|
|
116
|
+
handler_data *data = xmalloc( sizeof( handler_data ) );
|
|
117
|
+
data->callback = callback;
|
|
118
|
+
data->user_data = user_data;
|
|
119
|
+
|
|
120
|
+
add_packetin_filter_request request;
|
|
121
|
+
memset( &request, 0, sizeof( add_packetin_filter_request ) );
|
|
122
|
+
hton_match( &request.entry.match, &match );
|
|
123
|
+
request.entry.priority = htons( priority );
|
|
124
|
+
memcpy( request.entry.service_name, service_name, sizeof( request.entry.service_name ) );
|
|
125
|
+
|
|
126
|
+
bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
|
|
127
|
+
get_client_service_name(),
|
|
128
|
+
MESSENGER_ADD_PACKETIN_FILTER_REQUEST,
|
|
129
|
+
&request, sizeof( add_packetin_filter_request ), data );
|
|
130
|
+
|
|
131
|
+
return ret;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
bool
|
|
136
|
+
delete_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
|
|
137
|
+
delete_packetin_filter_handler callback, void *user_data ) {
|
|
138
|
+
maybe_init_packetin_filter_interface();
|
|
139
|
+
|
|
140
|
+
handler_data *data = xmalloc( sizeof( handler_data ) );
|
|
141
|
+
data->callback = callback;
|
|
142
|
+
data->user_data = user_data;
|
|
143
|
+
|
|
144
|
+
delete_packetin_filter_request request;
|
|
145
|
+
memset( &request, 0, sizeof( delete_packetin_filter_request ) );
|
|
146
|
+
hton_match( &request.criteria.match, &match );
|
|
147
|
+
request.criteria.priority = htons( priority );
|
|
148
|
+
if ( service_name != NULL ) {
|
|
149
|
+
strncpy( request.criteria.service_name, service_name, sizeof( request.criteria.service_name ) );
|
|
150
|
+
request.criteria.service_name[ sizeof( request.criteria.service_name ) - 1 ] = '\0';
|
|
151
|
+
}
|
|
152
|
+
if ( strict ) {
|
|
153
|
+
request.flags = PACKETIN_FILTER_FLAG_MATCH_STRICT;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
request.flags = PACKETIN_FILTER_FLAG_MATCH_LOOSE;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
|
|
160
|
+
get_client_service_name(),
|
|
161
|
+
MESSENGER_DELETE_PACKETIN_FILTER_REQUEST,
|
|
162
|
+
&request, sizeof( delete_packetin_filter_request ), data );
|
|
163
|
+
|
|
164
|
+
return ret;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
bool
|
|
169
|
+
dump_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
|
|
170
|
+
dump_packetin_filter_handler callback, void *user_data ) {
|
|
171
|
+
maybe_init_packetin_filter_interface();
|
|
172
|
+
|
|
173
|
+
handler_data *data = xmalloc( sizeof( handler_data ) );
|
|
174
|
+
data->callback = callback;
|
|
175
|
+
data->user_data = user_data;
|
|
176
|
+
|
|
177
|
+
dump_packetin_filter_request request;
|
|
178
|
+
memset( &request, 0, sizeof( dump_packetin_filter_request ) );
|
|
179
|
+
hton_match( &request.criteria.match, &match );
|
|
180
|
+
request.criteria.priority = htons( priority );
|
|
181
|
+
if ( service_name != NULL ) {
|
|
182
|
+
strncpy( request.criteria.service_name, service_name, sizeof( request.criteria.service_name ) );
|
|
183
|
+
request.criteria.service_name[ sizeof( request.criteria.service_name ) - 1 ] = '\0';
|
|
184
|
+
}
|
|
185
|
+
if ( strict ) {
|
|
186
|
+
request.flags = PACKETIN_FILTER_FLAG_MATCH_STRICT;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
request.flags = PACKETIN_FILTER_FLAG_MATCH_LOOSE;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
|
|
193
|
+
get_client_service_name(),
|
|
194
|
+
MESSENGER_DUMP_PACKETIN_FILTER_REQUEST,
|
|
195
|
+
&request, sizeof( dump_packetin_filter_request ), data );
|
|
196
|
+
|
|
197
|
+
return ret;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
static void
|
|
202
|
+
handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
|
|
203
|
+
switch ( tag ) {
|
|
204
|
+
case MESSENGER_ADD_PACKETIN_FILTER_REPLY:
|
|
205
|
+
{
|
|
206
|
+
if ( length != sizeof( add_packetin_filter_reply ) ) {
|
|
207
|
+
error( "Invalid add packetin filter reply ( length = %u ).", length );
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
add_packetin_filter_reply *reply = data;
|
|
211
|
+
addition_completed( reply->status, user_data );
|
|
212
|
+
}
|
|
213
|
+
break;
|
|
214
|
+
case MESSENGER_DELETE_PACKETIN_FILTER_REPLY:
|
|
215
|
+
{
|
|
216
|
+
if ( length != sizeof( delete_packetin_filter_reply ) ) {
|
|
217
|
+
error( "Invalid delete packetin filter reply ( length = %u ).", length );
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
delete_packetin_filter_reply *reply = data;
|
|
221
|
+
deletion_completed( reply->status, ( int ) ntohl( reply->n_deleted ), user_data );
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
case MESSENGER_DUMP_PACKETIN_FILTER_REPLY:
|
|
225
|
+
{
|
|
226
|
+
if ( length < offsetof( dump_packetin_filter_reply, entries ) ) {
|
|
227
|
+
error( "Invalid dump packetin filter reply ( length = %u ).", length );
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
dump_packetin_filter_reply *reply = data;
|
|
231
|
+
size_t expected_length = offsetof( dump_packetin_filter_reply, entries ) + sizeof( packetin_filter_entry ) * ntohl( reply->n_entries );
|
|
232
|
+
if ( length != expected_length ) {
|
|
233
|
+
error( "Invalid dump packetin filter reply ( length = %u ).", length );
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
packetin_filter_entry *entries = NULL;
|
|
237
|
+
int n_entries = ( int ) ntohl( reply->n_entries );
|
|
238
|
+
if ( n_entries > 0 && reply->entries != NULL ) {
|
|
239
|
+
entries = xmalloc( sizeof( packetin_filter_entry ) * ( size_t ) n_entries );
|
|
240
|
+
for ( int i = 0; i < n_entries; i++ ) {
|
|
241
|
+
ntoh_packetin_filter_entry( &entries[ i ], &reply->entries[ i ] );
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
dump_completed( reply->status, n_entries, entries, user_data );
|
|
245
|
+
if ( entries != NULL ) {
|
|
246
|
+
xfree( entries );
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
{
|
|
252
|
+
warn( "Undefined reply tag ( tag = %#x, length = %u ).", tag, length );
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
bool
|
|
260
|
+
init_packetin_filter_interface( void ) {
|
|
261
|
+
if ( initialized ) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
set_client_service_name();
|
|
266
|
+
add_message_replied_callback( get_client_service_name(), handle_reply );
|
|
267
|
+
|
|
268
|
+
initialized = true;
|
|
269
|
+
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
bool
|
|
275
|
+
finalize_packetin_filter_interface( void ) {
|
|
276
|
+
if ( !initialized ) {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
delete_message_replied_callback( get_client_service_name(), handle_reply );
|
|
281
|
+
|
|
282
|
+
initialized = false;
|
|
283
|
+
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
/*
|
|
290
|
+
* Local variables:
|
|
291
|
+
* c-basic-offset: 2
|
|
292
|
+
* indent-tabs-mode: nil
|
|
293
|
+
* End:
|
|
294
|
+
*/
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Yasunobu Chiba
|
|
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 PACKETIN_FILTER_INTERFACE_H
|
|
22
|
+
#define PACKETIN_FILTER_INTERFACE_H
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
#include <inttypes.h>
|
|
26
|
+
#include <openflow.h>
|
|
27
|
+
#include "bool.h"
|
|
28
|
+
#include "messenger.h"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#define PACKETIN_FILTER_MANAGEMENT_SERVICE "packetin_filter_management"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
enum {
|
|
35
|
+
MESSENGER_ADD_PACKETIN_FILTER_REQUEST = 0x0010,
|
|
36
|
+
MESSENGER_ADD_PACKETIN_FILTER_REPLY,
|
|
37
|
+
MESSENGER_DELETE_PACKETIN_FILTER_REQUEST,
|
|
38
|
+
MESSENGER_DELETE_PACKETIN_FILTER_REPLY,
|
|
39
|
+
MESSENGER_DUMP_PACKETIN_FILTER_REQUEST,
|
|
40
|
+
MESSENGER_DUMP_PACKETIN_FILTER_REPLY,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
enum {
|
|
44
|
+
PACKETIN_FILTER_OPERATION_SUCCEEDED,
|
|
45
|
+
PACKETIN_FILTER_OPERATION_FAILED,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
enum {
|
|
49
|
+
PACKETIN_FILTER_FLAG_MATCH_LOOSE = 0x00,
|
|
50
|
+
PACKETIN_FILTER_FLAG_MATCH_STRICT = 0x01,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
typedef struct {
|
|
55
|
+
struct ofp_match match;
|
|
56
|
+
uint16_t priority;
|
|
57
|
+
char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
|
|
58
|
+
} __attribute__( ( packed ) ) packetin_filter_entry;
|
|
59
|
+
|
|
60
|
+
typedef struct {
|
|
61
|
+
packetin_filter_entry entry;
|
|
62
|
+
} __attribute__( ( packed ) ) add_packetin_filter_request;
|
|
63
|
+
|
|
64
|
+
typedef struct {
|
|
65
|
+
uint8_t status;
|
|
66
|
+
} __attribute__( ( packed ) ) add_packetin_filter_reply;
|
|
67
|
+
|
|
68
|
+
typedef struct {
|
|
69
|
+
packetin_filter_entry criteria;
|
|
70
|
+
uint8_t flags;
|
|
71
|
+
} __attribute__( ( packed ) ) delete_packetin_filter_request;
|
|
72
|
+
|
|
73
|
+
typedef struct {
|
|
74
|
+
uint8_t status;
|
|
75
|
+
uint32_t n_deleted;
|
|
76
|
+
} __attribute__( ( packed ) ) delete_packetin_filter_reply;
|
|
77
|
+
|
|
78
|
+
typedef struct {
|
|
79
|
+
packetin_filter_entry criteria;
|
|
80
|
+
uint8_t flags;
|
|
81
|
+
} __attribute__( ( packed ) ) dump_packetin_filter_request;
|
|
82
|
+
|
|
83
|
+
typedef struct {
|
|
84
|
+
uint8_t status;
|
|
85
|
+
uint32_t n_entries;
|
|
86
|
+
packetin_filter_entry entries[ 0 ];
|
|
87
|
+
} __attribute__( ( packed ) ) dump_packetin_filter_reply;
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
typedef void ( *add_packetin_filter_handler )(
|
|
91
|
+
int status,
|
|
92
|
+
void *user_data
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
typedef void ( *delete_packetin_filter_handler )(
|
|
96
|
+
int status,
|
|
97
|
+
int n_deleted,
|
|
98
|
+
void *user_data
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
typedef void ( *dump_packetin_filter_handler )(
|
|
102
|
+
int status,
|
|
103
|
+
int n_entries,
|
|
104
|
+
packetin_filter_entry *entries,
|
|
105
|
+
void *user_data
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
bool add_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name,
|
|
110
|
+
add_packetin_filter_handler callback, void *user_data );
|
|
111
|
+
bool delete_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
|
|
112
|
+
delete_packetin_filter_handler callback, void *user_data );
|
|
113
|
+
bool dump_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
|
|
114
|
+
dump_packetin_filter_handler callback, void *user_data );
|
|
115
|
+
bool init_packetin_filter_interface( void );
|
|
116
|
+
bool finalize_packetin_filter_interface( void );
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
#endif // PACKETIN_FILTER_INTERFACE_H
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* Local variables:
|
|
124
|
+
* c-basic-offset: 2
|
|
125
|
+
* indent-tabs-mode: nil
|
|
126
|
+
* End:
|
|
127
|
+
*/
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Yasunobu Chiba
|
|
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 <ctype.h>
|
|
23
|
+
#include <errno.h>
|
|
24
|
+
#include <limits.h>
|
|
25
|
+
#include <sqlite3.h>
|
|
26
|
+
#include <stdlib.h>
|
|
27
|
+
#include <string.h>
|
|
28
|
+
#include <unistd.h>
|
|
29
|
+
#include "checks.h"
|
|
30
|
+
#include "log.h"
|
|
31
|
+
#include "persistent_storage.h"
|
|
32
|
+
#include "trema_private.h"
|
|
33
|
+
#include "trema_wrapper.h"
|
|
34
|
+
#include "wrapper.h"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
static const size_t MAX_KEY_LENGTH = 256;
|
|
38
|
+
static const size_t MAX_VALUE_LENGTH = 256;
|
|
39
|
+
static const char DEFAULT_DB_FILE[] = ".trema.db";
|
|
40
|
+
static char *db_file = NULL;
|
|
41
|
+
static sqlite3 *db_handle = NULL;
|
|
42
|
+
static bool backend_initialized = false;
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
static bool
|
|
46
|
+
finalize_backend( bool delete_file ) {
|
|
47
|
+
assert( db_handle != NULL );
|
|
48
|
+
assert( db_file != NULL );
|
|
49
|
+
|
|
50
|
+
int ret = trema_sqlite3_close( db_handle );
|
|
51
|
+
if ( ret != SQLITE_OK ) {
|
|
52
|
+
error( "Failed to destroy a sqlite3 object ( %s ).", trema_sqlite3_errmsg( db_handle ) );
|
|
53
|
+
goto error;
|
|
54
|
+
}
|
|
55
|
+
db_handle = NULL;
|
|
56
|
+
|
|
57
|
+
if ( delete_file ) {
|
|
58
|
+
int ret = trema_unlink( db_file );
|
|
59
|
+
if ( ret < 0 ) {
|
|
60
|
+
char buf[ 256 ];
|
|
61
|
+
error( "Failed to delete database file. ( db_file = %s, errno = %s [%d] ).",
|
|
62
|
+
db_file, strerror_r( errno, buf, sizeof( buf ) ), errno );
|
|
63
|
+
goto error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
xfree( db_file );
|
|
68
|
+
db_file = NULL;
|
|
69
|
+
|
|
70
|
+
return true;
|
|
71
|
+
|
|
72
|
+
error:
|
|
73
|
+
db_handle = NULL;
|
|
74
|
+
if ( db_file != NULL ) {
|
|
75
|
+
xfree( db_file );
|
|
76
|
+
db_file = NULL;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
static bool
|
|
83
|
+
init_backend() {
|
|
84
|
+
assert( db_file == NULL );
|
|
85
|
+
assert( db_handle == NULL );
|
|
86
|
+
|
|
87
|
+
db_file = xmalloc( PATH_MAX );
|
|
88
|
+
memset( db_file, '\0', PATH_MAX );
|
|
89
|
+
sprintf( db_file, "%s/%s", get_trema_tmp(), DEFAULT_DB_FILE );
|
|
90
|
+
|
|
91
|
+
int ret = trema_sqlite3_open( db_file, &db_handle );
|
|
92
|
+
if ( ret != SQLITE_OK ) {
|
|
93
|
+
error( "Failed to open backend database ( %s ).", trema_sqlite3_errmsg( db_handle ) );
|
|
94
|
+
finalize_backend( false );
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
char *err = NULL;
|
|
99
|
+
char *statement = sqlite3_mprintf( "CREATE TABLE IF NOT EXISTS trema ( key TEXT, value TEXT, CONSTRAINT key_unique UNIQUE (key) ON CONFLICT FAIL )" );
|
|
100
|
+
ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
|
|
101
|
+
if ( ret != SQLITE_OK ) {
|
|
102
|
+
error( "Failed to create a table ( error = %s ).", err );
|
|
103
|
+
xfree( db_file );
|
|
104
|
+
db_file = NULL;
|
|
105
|
+
trema_sqlite3_close( db_handle );
|
|
106
|
+
db_handle = NULL;
|
|
107
|
+
trema_sqlite3_free( err );
|
|
108
|
+
trema_sqlite3_free( statement );
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
trema_sqlite3_free( statement );
|
|
112
|
+
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
static int
|
|
118
|
+
save_value( void *value, int n_columns, char **columns, char **column_names ) {
|
|
119
|
+
UNUSED( column_names );
|
|
120
|
+
|
|
121
|
+
assert( n_columns == 1 );
|
|
122
|
+
assert( columns != NULL );
|
|
123
|
+
assert( columns[ 0 ] != NULL );
|
|
124
|
+
assert( value != NULL );
|
|
125
|
+
|
|
126
|
+
size_t length = strlen( columns[ 0 ] ) + 1;
|
|
127
|
+
*( char ** ) value = xmalloc( length );
|
|
128
|
+
strncpy( *( char ** ) value, columns[ 0 ], length );
|
|
129
|
+
|
|
130
|
+
return 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
static char*
|
|
135
|
+
get_value_from_backend( const char *key ) {
|
|
136
|
+
assert( db_handle != NULL );
|
|
137
|
+
assert( key != NULL );
|
|
138
|
+
|
|
139
|
+
char *value = NULL;
|
|
140
|
+
char *err = NULL;
|
|
141
|
+
char *statement= sqlite3_mprintf( "SELECT value FROM trema WHERE key = '%q'", key );
|
|
142
|
+
int ret = trema_sqlite3_exec( db_handle, statement, save_value, &value, &err );
|
|
143
|
+
if ( ret != SQLITE_OK ) {
|
|
144
|
+
error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
|
|
145
|
+
trema_sqlite3_free( statement );
|
|
146
|
+
trema_sqlite3_free( err );
|
|
147
|
+
return NULL;
|
|
148
|
+
}
|
|
149
|
+
trema_sqlite3_free( statement );
|
|
150
|
+
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
static bool
|
|
156
|
+
save_value_to_backend( const char *key, const char *value ) {
|
|
157
|
+
assert( db_handle != NULL );
|
|
158
|
+
assert( key != NULL );
|
|
159
|
+
|
|
160
|
+
char *err = NULL;
|
|
161
|
+
char *statement = sqlite3_mprintf( "INSERT INTO trema (key,value) VALUES ('%q','%q')", key, value );
|
|
162
|
+
int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
|
|
163
|
+
if ( ret != SQLITE_OK ) {
|
|
164
|
+
error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
|
|
165
|
+
trema_sqlite3_free( statement );
|
|
166
|
+
trema_sqlite3_free( err );
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
trema_sqlite3_free( statement );
|
|
170
|
+
|
|
171
|
+
int n_changes = trema_sqlite3_changes( db_handle );
|
|
172
|
+
if ( n_changes != 1 ) {
|
|
173
|
+
if ( n_changes > 1 ) {
|
|
174
|
+
error( "Multiple entries are created ( n_changes = %d ).", n_changes );
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
static bool
|
|
184
|
+
update_value_on_backend( const char *key, const char *value ) {
|
|
185
|
+
assert( db_handle != NULL );
|
|
186
|
+
assert( key != NULL );
|
|
187
|
+
|
|
188
|
+
char *err = NULL;
|
|
189
|
+
char *statement = sqlite3_mprintf( "UPDATE trema SET value = '%q' WHERE key = '%q'", value, key );
|
|
190
|
+
int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
|
|
191
|
+
if ( ret != SQLITE_OK ) {
|
|
192
|
+
error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
|
|
193
|
+
trema_sqlite3_free( statement );
|
|
194
|
+
trema_sqlite3_free( err );
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
trema_sqlite3_free( statement );
|
|
198
|
+
|
|
199
|
+
int n_changes = trema_sqlite3_changes( db_handle );
|
|
200
|
+
if ( n_changes != 1 ) {
|
|
201
|
+
if ( n_changes > 1 ) {
|
|
202
|
+
error( "Multiple entries are updated ( n_changes = %d ).", n_changes );
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return true;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
static bool
|
|
212
|
+
delete_key_value_from_backend( const char *key ) {
|
|
213
|
+
assert( db_handle != NULL );
|
|
214
|
+
assert( key != NULL );
|
|
215
|
+
|
|
216
|
+
char *err = NULL;
|
|
217
|
+
char *statement = sqlite3_mprintf( "DELETE FROM trema WHERE key = '%q'", key );
|
|
218
|
+
int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
|
|
219
|
+
if ( ret != SQLITE_OK ) {
|
|
220
|
+
error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
|
|
221
|
+
trema_sqlite3_free( statement );
|
|
222
|
+
trema_sqlite3_free( err );
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
trema_sqlite3_free( statement );
|
|
226
|
+
|
|
227
|
+
int n_changes = trema_sqlite3_changes( db_handle );
|
|
228
|
+
if ( n_changes != 1 ) {
|
|
229
|
+
if ( n_changes > 1 ) {
|
|
230
|
+
error( "Multiple entries are deleted ( n_changes = %d ).", n_changes );
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
bool
|
|
240
|
+
init_persistent_storage() {
|
|
241
|
+
if ( backend_initialized ) {
|
|
242
|
+
error( "Backend is already initialized." );
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
backend_initialized = init_backend();
|
|
247
|
+
|
|
248
|
+
return backend_initialized;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
bool
|
|
253
|
+
finalize_persistent_storage() {
|
|
254
|
+
if ( !backend_initialized ) {
|
|
255
|
+
error( "Backend is not initialized yet." );
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
backend_initialized = false;
|
|
260
|
+
|
|
261
|
+
return finalize_backend( false );
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
bool
|
|
266
|
+
clear_persistent_storage() {
|
|
267
|
+
if ( !backend_initialized ) {
|
|
268
|
+
error( "Backend is not initialized yet." );
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
bool ret = finalize_backend( true );
|
|
273
|
+
if ( ret == false ) {
|
|
274
|
+
backend_initialized = false;
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
backend_initialized = init_backend();
|
|
279
|
+
|
|
280
|
+
return backend_initialized;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
static bool
|
|
285
|
+
key_exists( const char *key ) {
|
|
286
|
+
assert( key != NULL );
|
|
287
|
+
|
|
288
|
+
char *retrieved = get_value_from_backend( key );
|
|
289
|
+
if ( retrieved == NULL ) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
xfree( retrieved );
|
|
294
|
+
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
static bool
|
|
300
|
+
backend_ready( void ) {
|
|
301
|
+
if ( !backend_initialized ) {
|
|
302
|
+
error( "Backend is not initialized yet." );
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
return backend_initialized;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
static bool
|
|
310
|
+
ascii_string( const char *string ) {
|
|
311
|
+
assert( string != NULL );
|
|
312
|
+
|
|
313
|
+
int i = 0;
|
|
314
|
+
while ( string[ i ] != '\0' ) {
|
|
315
|
+
if ( isprint( string[ i ] ) == 0 ) {
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
i++;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
static bool
|
|
326
|
+
valid_key( const char *key ) {
|
|
327
|
+
if ( key == NULL ) {
|
|
328
|
+
error( "'key' must be specified." );
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
if ( !ascii_string( key ) ) {
|
|
333
|
+
error( "'key' must only have printable ASCII characters." );
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
size_t length = strlen( key );
|
|
338
|
+
if ( length > MAX_KEY_LENGTH ) {
|
|
339
|
+
error( "Too long key ( length = %u ) specified. Maximum length is %u.", length, MAX_KEY_LENGTH );
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return true;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
static bool
|
|
348
|
+
valid_value( const char *value ) {
|
|
349
|
+
if ( value == NULL ) {
|
|
350
|
+
error( "'value' must be specified." );
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if ( !ascii_string( value ) ) {
|
|
355
|
+
error( "'value' must only have printable ASCII characters." );
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
size_t length = strlen( value );
|
|
360
|
+
if ( length > MAX_KEY_LENGTH ) {
|
|
361
|
+
error( "Too long value ( length = %u ) specified. Maximum length is %u.", length, MAX_VALUE_LENGTH );
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
bool
|
|
371
|
+
set_value( const char *key, const char *value ) {
|
|
372
|
+
if ( !backend_ready() ) {
|
|
373
|
+
return false;
|
|
374
|
+
}
|
|
375
|
+
if ( !valid_key( key ) ) {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
if ( !valid_value( value ) ) {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if ( key_exists( key ) ) {
|
|
383
|
+
return update_value_on_backend( key, value );
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return save_value_to_backend( key, value );
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
bool
|
|
391
|
+
get_value( const char *key, char *value, const size_t length ) {
|
|
392
|
+
if ( !backend_ready() ) {
|
|
393
|
+
return false;
|
|
394
|
+
}
|
|
395
|
+
if ( !valid_key( key ) ) {
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
if ( value == NULL ) {
|
|
399
|
+
error( "'value' must be specified." );
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
if ( length == 0 ) {
|
|
403
|
+
error( "'length' must be greater than zero." );
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
char *retrieved = get_value_from_backend( key );
|
|
408
|
+
if ( retrieved == NULL ) {
|
|
409
|
+
error( "Failed to retrieve a value for '%s'.", key );
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
size_t required_length = strlen( retrieved ) + 1;
|
|
414
|
+
if ( required_length > length ) {
|
|
415
|
+
error( "Insufficient buffer space ( %u [bytes] > %u [bytes] ).",
|
|
416
|
+
required_length, length );
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
strncpy( value, retrieved, required_length );
|
|
421
|
+
xfree( retrieved );
|
|
422
|
+
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
bool
|
|
428
|
+
delete_key_value( const char *key ) {
|
|
429
|
+
if ( !backend_ready() ) {
|
|
430
|
+
return false;
|
|
431
|
+
}
|
|
432
|
+
if ( !valid_key( key ) ) {
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
if ( !key_exists( key ) ) {
|
|
437
|
+
error( "An entry for '%s' does not exist.", key );
|
|
438
|
+
return false;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return delete_key_value_from_backend( key );
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
const char*
|
|
446
|
+
_get_db_file( void ) {
|
|
447
|
+
return db_file;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
const sqlite3*
|
|
452
|
+
_get_db_handle( void ) {
|
|
453
|
+
return db_handle;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
bool
|
|
458
|
+
_get_backend_initialized( void ) {
|
|
459
|
+
return backend_initialized;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
size_t
|
|
464
|
+
_get_max_key_length( void ) {
|
|
465
|
+
return MAX_KEY_LENGTH;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
size_t
|
|
470
|
+
_get_max_value_length( void ) {
|
|
471
|
+
return MAX_VALUE_LENGTH;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
/*
|
|
476
|
+
* Local variables:
|
|
477
|
+
* c-basic-offset: 2
|
|
478
|
+
* indent-tabs-mode: nil
|
|
479
|
+
* End:
|
|
480
|
+
*/
|