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,42 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OpenFlow Switch Listener
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazushi SUGYO
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
7
|
+
*
|
|
8
|
+
* This program is free software; you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
10
|
+
* published by the Free Software Foundation.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU General Public License along
|
|
18
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ifndef SECURE_CANNEL_LISTENER_H
|
|
24
|
+
#define SECURE_CANNEL_LISTENER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include "switch_manager.h"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
bool secure_channel_listen_start( struct listener_info *listener_info );
|
|
31
|
+
void secure_channel_accept( int fd, void *data );
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#endif // SECURE_CANNEL_LISTENER_H
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* Local variables:
|
|
39
|
+
* c-basic-offset: 2
|
|
40
|
+
* indent-tabs-mode: nil
|
|
41
|
+
* End:
|
|
42
|
+
*/
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Kazushi SUGYO
|
|
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 <errno.h>
|
|
23
|
+
#include <limits.h>
|
|
24
|
+
#include <openflow.h>
|
|
25
|
+
#include <string.h>
|
|
26
|
+
#include <unistd.h>
|
|
27
|
+
#include "trema.h"
|
|
28
|
+
#include "message_queue.h"
|
|
29
|
+
#include "ofpmsg_recv.h"
|
|
30
|
+
#include "ofpmsg_send.h"
|
|
31
|
+
#include "secure_channel_receiver.h"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
static const size_t RECEIVE_BUFFFER_SIZE = UINT16_MAX + sizeof(struct ofp_packet_in) - 2;
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
int
|
|
38
|
+
recv_from_secure_channel( struct switch_info *sw_info ) {
|
|
39
|
+
assert( sw_info != NULL );
|
|
40
|
+
assert( sw_info->recv_queue != NULL );
|
|
41
|
+
|
|
42
|
+
// all queued messages should be processed before receiving new messages from remote
|
|
43
|
+
if ( sw_info->recv_queue->length > 0 ) {
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if ( sw_info->fragment_buf == NULL ) {
|
|
48
|
+
sw_info->fragment_buf = alloc_buffer_with_length( RECEIVE_BUFFFER_SIZE );
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
size_t remaining_length = RECEIVE_BUFFFER_SIZE - sw_info->fragment_buf->length;
|
|
52
|
+
char *recv_buf = ( char * ) sw_info->fragment_buf->data + sw_info->fragment_buf->length;
|
|
53
|
+
ssize_t recv_length = read( sw_info->secure_channel_fd, recv_buf, remaining_length );
|
|
54
|
+
if ( recv_length < 0 ) {
|
|
55
|
+
if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
error( "Receive error:%s(%d)", strerror( errno ), errno );
|
|
59
|
+
return -1;
|
|
60
|
+
}
|
|
61
|
+
if ( recv_length == 0 ) {
|
|
62
|
+
debug( "Connection closed by peer." );
|
|
63
|
+
return -1;
|
|
64
|
+
}
|
|
65
|
+
sw_info->fragment_buf->length += ( size_t ) recv_length;
|
|
66
|
+
|
|
67
|
+
size_t read_total = 0;
|
|
68
|
+
while ( sw_info->fragment_buf->length >= sizeof( struct ofp_header ) ) {
|
|
69
|
+
struct ofp_header *header = sw_info->fragment_buf->data;
|
|
70
|
+
if ( header->version != OFP_VERSION ) {
|
|
71
|
+
error( "Receive error: invalid version (version %d)", header->version );
|
|
72
|
+
ofpmsg_send_error_msg( sw_info,
|
|
73
|
+
OFPET_BAD_REQUEST, OFPBRC_BAD_VERSION, sw_info->fragment_buf );
|
|
74
|
+
return -1;
|
|
75
|
+
}
|
|
76
|
+
uint16_t message_length = ntohs( header->length );
|
|
77
|
+
if ( message_length > sw_info->fragment_buf->length ) {
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
buffer *message = alloc_buffer_with_length( message_length );
|
|
81
|
+
char *p = append_back_buffer( message, message_length );
|
|
82
|
+
memcpy( p, sw_info->fragment_buf->data, message_length );
|
|
83
|
+
remove_front_buffer( sw_info->fragment_buf, message_length );
|
|
84
|
+
enqueue_message( sw_info->recv_queue, message );
|
|
85
|
+
read_total += message_length;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// remove headroom manually for next call
|
|
89
|
+
if ( read_total > 0 ) {
|
|
90
|
+
memmove( ( char * ) sw_info->fragment_buf->data - read_total,
|
|
91
|
+
sw_info->fragment_buf->data,
|
|
92
|
+
sw_info->fragment_buf->length );
|
|
93
|
+
sw_info->fragment_buf->data = ( char * ) sw_info->fragment_buf->data - read_total;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
int
|
|
101
|
+
handle_messages_from_secure_channel( struct switch_info *sw_info ) {
|
|
102
|
+
assert( sw_info != NULL );
|
|
103
|
+
assert( sw_info->recv_queue != NULL );
|
|
104
|
+
|
|
105
|
+
int ret;
|
|
106
|
+
int errors = 0;
|
|
107
|
+
buffer *message;
|
|
108
|
+
|
|
109
|
+
while ( ( message = dequeue_message( sw_info->recv_queue ) ) != NULL ) {
|
|
110
|
+
ret = ofpmsg_recv( sw_info, message );
|
|
111
|
+
if ( ret < 0 ) {
|
|
112
|
+
error( "Failed to handle message to application." );
|
|
113
|
+
errors++;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return errors == 0 ? 0 : -1;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* Local variables:
|
|
123
|
+
* c-basic-offset: 2
|
|
124
|
+
* indent-tabs-mode: nil
|
|
125
|
+
* End:
|
|
126
|
+
*/
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OpenFlow Switch Manager
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazushi SUGYO
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
7
|
+
*
|
|
8
|
+
* This program is free software; you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
10
|
+
* published by the Free Software Foundation.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU General Public License along
|
|
18
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ifndef SECURE_CHANNEL_RECEIVER_H
|
|
24
|
+
#define SECURE_CHANNEL_RECEIVER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include "switch.h"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
int recv_from_secure_channel( struct switch_info *sw_info );
|
|
31
|
+
int handle_messages_from_secure_channel( struct switch_info *sw_info );
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#endif // SECURE_CHANNEL_RECEIVER_H
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/*
|
|
38
|
+
* Local variables:
|
|
39
|
+
* c-basic-offset: 2
|
|
40
|
+
* indent-tabs-mode: nil
|
|
41
|
+
* End:
|
|
42
|
+
*/
|
|
43
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Kazushi SUGYO
|
|
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 <errno.h>
|
|
23
|
+
#include <openflow.h>
|
|
24
|
+
#include <string.h>
|
|
25
|
+
#include <unistd.h>
|
|
26
|
+
#include "event_handler.h"
|
|
27
|
+
#include "message_queue.h"
|
|
28
|
+
#include "ofpmsg_send.h"
|
|
29
|
+
#include "secure_channel_sender.h"
|
|
30
|
+
#include "trema.h"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
int
|
|
34
|
+
send_to_secure_channel( struct switch_info *sw_info, buffer *buf ) {
|
|
35
|
+
assert( sw_info != NULL );
|
|
36
|
+
assert( buf != NULL );
|
|
37
|
+
assert( buf->length > 0 );
|
|
38
|
+
|
|
39
|
+
if ( sw_info->send_queue == NULL ) {
|
|
40
|
+
return -1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
bool res = enqueue_message( sw_info->send_queue, buf );
|
|
44
|
+
if ( res ) {
|
|
45
|
+
set_writable( sw_info->secure_channel_fd, true );
|
|
46
|
+
}
|
|
47
|
+
return res ? 0 : -1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
typedef struct {
|
|
52
|
+
struct iovec *iov;
|
|
53
|
+
int iovcnt;
|
|
54
|
+
} writev_args;
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
static void
|
|
58
|
+
append_to_writev_args( buffer *message, void *user_data ) {
|
|
59
|
+
writev_args *args = user_data;
|
|
60
|
+
|
|
61
|
+
args->iov[ args->iovcnt ].iov_base = message->data;
|
|
62
|
+
args->iov[ args->iovcnt ].iov_len = message->length;
|
|
63
|
+
args->iovcnt++;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
int
|
|
68
|
+
flush_secure_channel( struct switch_info *sw_info ) {
|
|
69
|
+
assert( sw_info != NULL );
|
|
70
|
+
assert( sw_info->send_queue != NULL );
|
|
71
|
+
assert( sw_info->secure_channel_fd >= 0 );
|
|
72
|
+
|
|
73
|
+
buffer *buf;
|
|
74
|
+
ssize_t write_length;
|
|
75
|
+
|
|
76
|
+
if ( sw_info->send_queue->length == 0 ) {
|
|
77
|
+
return 0;
|
|
78
|
+
}
|
|
79
|
+
set_writable( sw_info->secure_channel_fd, false );
|
|
80
|
+
writev_args args;
|
|
81
|
+
args.iov = xmalloc( sizeof( struct iovec ) * ( size_t ) sw_info->send_queue->length );
|
|
82
|
+
args.iovcnt = 0;
|
|
83
|
+
foreach_message_queue( sw_info->send_queue, append_to_writev_args, &args );
|
|
84
|
+
if ( args.iovcnt == 0 ) {
|
|
85
|
+
xfree( args.iov );
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
write_length = writev( sw_info->secure_channel_fd, args.iov, args.iovcnt );
|
|
89
|
+
xfree( args.iov );
|
|
90
|
+
if ( write_length < 0 ) {
|
|
91
|
+
if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
|
|
92
|
+
set_writable( sw_info->secure_channel_fd, true );
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
error( "Failed to send a message to secure channel ( errno = %s [%d] ).",
|
|
96
|
+
strerror( errno ), errno );
|
|
97
|
+
return -1;
|
|
98
|
+
}
|
|
99
|
+
if ( write_length == 0 ) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
while ( ( buf = peek_message( sw_info->send_queue ) ) != NULL ) {
|
|
103
|
+
if ( write_length == 0 ) {
|
|
104
|
+
set_writable( sw_info->secure_channel_fd, true );
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
if ( ( size_t ) write_length < buf->length ) {
|
|
108
|
+
remove_front_buffer( buf, ( size_t ) write_length );
|
|
109
|
+
set_writable( sw_info->secure_channel_fd, true );
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
write_length -= ( ssize_t ) buf->length;
|
|
113
|
+
buf = dequeue_message( sw_info->send_queue );
|
|
114
|
+
free_buffer( buf );
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* Local variables:
|
|
123
|
+
* c-basic-offset: 2
|
|
124
|
+
* indent-tabs-mode: nil
|
|
125
|
+
* End:
|
|
126
|
+
*/
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OpenFlow Switch Manager
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazushi SUGYO
|
|
5
|
+
*
|
|
6
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
7
|
+
*
|
|
8
|
+
* This program is free software; you can redistribute it and/or modify
|
|
9
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
10
|
+
* published by the Free Software Foundation.
|
|
11
|
+
*
|
|
12
|
+
* This program is distributed in the hope that it will be useful,
|
|
13
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
* GNU General Public License for more details.
|
|
16
|
+
*
|
|
17
|
+
* You should have received a copy of the GNU General Public License along
|
|
18
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
19
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
#ifndef SECURE_CHANNEL_SENDER_H
|
|
24
|
+
#define SECURE_CHANNEL_SENDER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include "trema.h"
|
|
28
|
+
#include "switch.h"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
int send_to_secure_channel( struct switch_info *sw_info, buffer *buf );
|
|
32
|
+
int flush_secure_channel( struct switch_info *sw_info );
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
#endif // SECURE_CHANNEL_SENDER_H
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
* Local variables:
|
|
40
|
+
* c-basic-offset: 2
|
|
41
|
+
* indent-tabs-mode: nil
|
|
42
|
+
* End:
|
|
43
|
+
*/
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Kazushi SUGYO
|
|
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 <string.h>
|
|
22
|
+
#include <inttypes.h>
|
|
23
|
+
#include "ofpmsg_send.h"
|
|
24
|
+
#include "openflow_service_interface.h"
|
|
25
|
+
#include "service_interface.h"
|
|
26
|
+
#include "trema.h"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
static buffer *
|
|
30
|
+
create_openflow_application_message( uint64_t *datapath_id, buffer *data ) {
|
|
31
|
+
openflow_service_header_t *message;
|
|
32
|
+
buffer *buf;
|
|
33
|
+
void *append;
|
|
34
|
+
size_t append_len = 0;
|
|
35
|
+
|
|
36
|
+
if ( data != NULL ) {
|
|
37
|
+
append_len = data->length;
|
|
38
|
+
}
|
|
39
|
+
buf = alloc_buffer_with_length( sizeof( openflow_service_header_t ) + append_len );
|
|
40
|
+
message = append_back_buffer( buf, sizeof( openflow_service_header_t ) );
|
|
41
|
+
if ( datapath_id == NULL ) {
|
|
42
|
+
message->datapath_id = ~0U; // FIXME: defined invalid datapath_id
|
|
43
|
+
} else {
|
|
44
|
+
message->datapath_id = htonll( *datapath_id );
|
|
45
|
+
}
|
|
46
|
+
message->service_name_length = htons( 0 );
|
|
47
|
+
// TODO: append ipaddress and port
|
|
48
|
+
if ( append_len > 0 ) {
|
|
49
|
+
append = append_back_buffer( buf, append_len );
|
|
50
|
+
memcpy( append, data->data, append_len );
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return buf;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
void
|
|
58
|
+
service_send_to_reply( char *service_name, uint16_t message_type, uint64_t *datapath_id, buffer *data ) {
|
|
59
|
+
buffer *buf;
|
|
60
|
+
|
|
61
|
+
if ( service_name == NULL ) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
buf = create_openflow_application_message( datapath_id, data );
|
|
66
|
+
if ( !send_message( service_name, message_type, buf->data, buf->length ) ) {
|
|
67
|
+
error( "Failed to send to reply ( service_name = %s ).", service_name );
|
|
68
|
+
}
|
|
69
|
+
free_buffer( buf );
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
void
|
|
74
|
+
service_send_to_application( list_element *service_name_list, uint16_t message_type, uint64_t *datapath_id, buffer *data ) {
|
|
75
|
+
buffer *buf;
|
|
76
|
+
list_element *list;
|
|
77
|
+
char *service_name;
|
|
78
|
+
|
|
79
|
+
if ( service_name_list == NULL ) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
buf = create_openflow_application_message( datapath_id, data );
|
|
84
|
+
|
|
85
|
+
static const char *error_service_name = NULL;
|
|
86
|
+
for ( list = service_name_list; list != NULL; list = list->next ) {
|
|
87
|
+
service_name = list->data;
|
|
88
|
+
if ( !send_message( service_name, message_type,
|
|
89
|
+
buf->data, buf->length ) ) {
|
|
90
|
+
if ( error_service_name != service_name ) {
|
|
91
|
+
warn( "Failed to send message ( service_name = %s ).", service_name );
|
|
92
|
+
}
|
|
93
|
+
error_service_name = service_name;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
error_service_name = NULL;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
free_buffer( buf );
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
static void
|
|
104
|
+
handle_openflow_message( uint64_t *datapath_id, char *service_name, buffer *buf ) {
|
|
105
|
+
struct ofp_header *header;
|
|
106
|
+
int ret;
|
|
107
|
+
|
|
108
|
+
ret = validate_openflow_message( buf );
|
|
109
|
+
if ( ret != 0 ) {
|
|
110
|
+
header = buf->data;
|
|
111
|
+
notice( "Validation error. dpid = %#" PRIx64 ", type %u, errno %d, service_name = %s",
|
|
112
|
+
*datapath_id, header->type, ret, service_name );
|
|
113
|
+
free_buffer( buf );
|
|
114
|
+
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
switch_event_recv_from_application( datapath_id, service_name, buf );
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
static void
|
|
123
|
+
handle_openflow_disconnect_request( uint64_t *datapath_id ) {
|
|
124
|
+
switch_event_disconnect_request( datapath_id );
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
void
|
|
129
|
+
service_recv_from_application( uint16_t message_type, buffer *buf ) {
|
|
130
|
+
openflow_service_header_t *message;
|
|
131
|
+
uint64_t datapath_id;
|
|
132
|
+
uint16_t service_name_length;
|
|
133
|
+
char *service_name;
|
|
134
|
+
|
|
135
|
+
if ( buf->length < sizeof( openflow_service_header_t ) + sizeof( struct ofp_header ) ) {
|
|
136
|
+
error( "Too short openflow application message(%u).", buf->length );
|
|
137
|
+
free_buffer( buf );
|
|
138
|
+
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
message = buf->data;
|
|
143
|
+
datapath_id = ntohll( message->datapath_id );
|
|
144
|
+
service_name_length = ntohs( message->service_name_length );
|
|
145
|
+
service_name = remove_front_buffer( buf, sizeof( openflow_service_header_t ) );
|
|
146
|
+
if ( service_name_length < 1 ) {
|
|
147
|
+
error( "Invalid service name length %u.", service_name_length );
|
|
148
|
+
free_buffer( buf );
|
|
149
|
+
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if ( service_name[ service_name_length - 1 ] != '\0' ) {
|
|
153
|
+
error( "Service name is not null terminated." );
|
|
154
|
+
free_buffer( buf );
|
|
155
|
+
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
remove_front_buffer( buf, service_name_length );
|
|
159
|
+
|
|
160
|
+
switch ( message_type ) {
|
|
161
|
+
case MESSENGER_OPENFLOW_MESSAGE:
|
|
162
|
+
handle_openflow_message( &datapath_id, service_name, buf );
|
|
163
|
+
break;
|
|
164
|
+
case MESSENGER_OPENFLOW_DISCONNECT_REQUEST:
|
|
165
|
+
free_buffer( buf );
|
|
166
|
+
handle_openflow_disconnect_request( &datapath_id );
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
error( "Unknown message type %d.", message_type );
|
|
170
|
+
free_buffer( buf );
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
/*
|
|
177
|
+
* Local variables:
|
|
178
|
+
* c-basic-offset: 2
|
|
179
|
+
* indent-tabs-mode: nil
|
|
180
|
+
* End:
|
|
181
|
+
*/
|