trema 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.mono.rant +4107 -0
- data/.rspec +1 -0
- data/.yardopts +4 -0
- data/Doxyfile +1679 -0
- data/GPL2 +339 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +71 -0
- data/README.md +135 -0
- data/Rakefile +140 -0
- data/Rantfile +834 -0
- data/VERSION +1 -0
- data/build.rb +32 -0
- data/cruise.rb +389 -0
- data/features/example.dumper.feature +87 -0
- data/features/example.learning_switch.feature +39 -0
- data/features/example.list_switches.feature +38 -0
- data/features/example.message.echo_reply.feature +26 -0
- data/features/example.message.echo_request.feature +25 -0
- data/features/example.message.features_request.feature +84 -0
- data/features/example.message.hello.feature +25 -0
- data/features/example.message.set_config.feature +27 -0
- data/features/example.multi_learning_switch.feature +135 -0
- data/features/example.packetin_filter_config.feature +91 -0
- data/features/example.repeater_hub.feature +49 -0
- data/features/example.switch_monitor.feature +39 -0
- data/features/packetin_filter.feature +49 -0
- data/features/step_definitions/kill_steps.rb +30 -0
- data/features/step_definitions/log_steps.rb +90 -0
- data/features/step_definitions/misc_steps.rb +64 -0
- data/features/step_definitions/off_steps.rb +30 -0
- data/features/step_definitions/run_steps.rb +91 -0
- data/features/step_definitions/send_packets_steps.rb +42 -0
- data/features/step_definitions/show_stats_steps.rb +43 -0
- data/features/step_definitions/stats_steps.rb +39 -0
- data/features/support/env.rb +75 -0
- data/features/support/hooks.rb +8 -0
- data/features/switch_manager.feature +35 -0
- data/features/trema-config.feature +68 -0
- data/features/trema.dump_flows.feature +25 -0
- data/features/trema.feature +25 -0
- data/features/trema.kill.feature +53 -0
- data/features/trema.killall.feature +30 -0
- data/features/trema.reset_stats.feature +14 -0
- data/features/trema.run.feature +46 -0
- data/features/trema.send_packets.feature +56 -0
- data/features/trema.show_stats.feature +67 -0
- data/features/tutorial.hello_trema.feature +27 -0
- data/features/tutorial.packet_in.feature +47 -0
- data/features/tutorial.switch_info.feature +55 -0
- data/ruby/.gitignore +4 -0
- data/ruby/blocker.rb +78 -0
- data/ruby/extconf.rb +71 -0
- data/ruby/sub-process.rb +291 -0
- data/ruby/trema/action-common.c +60 -0
- data/ruby/trema/action-common.h +42 -0
- data/ruby/trema/action-enqueue.c +161 -0
- data/ruby/trema/action-enqueue.h +40 -0
- data/ruby/trema/action-output.c +169 -0
- data/ruby/trema/action-output.h +42 -0
- data/ruby/trema/action-set-dl-dst.c +131 -0
- data/ruby/trema/action-set-dl-dst.h +44 -0
- data/ruby/trema/action-set-dl-src.c +131 -0
- data/ruby/trema/action-set-dl-src.h +44 -0
- data/ruby/trema/action-set-nw-dst.c +135 -0
- data/ruby/trema/action-set-nw-dst.h +42 -0
- data/ruby/trema/action-set-nw-src.c +140 -0
- data/ruby/trema/action-set-nw-src.h +42 -0
- data/ruby/trema/action-set-nw-tos.c +124 -0
- data/ruby/trema/action-set-nw-tos.h +42 -0
- data/ruby/trema/action-set-tp-dst.c +122 -0
- data/ruby/trema/action-set-tp-dst.h +42 -0
- data/ruby/trema/action-set-tp-src.c +124 -0
- data/ruby/trema/action-set-tp-src.h +42 -0
- data/ruby/trema/action-set-vlan-pcp.c +128 -0
- data/ruby/trema/action-set-vlan-pcp.h +42 -0
- data/ruby/trema/action-set-vlan-vid.c +125 -0
- data/ruby/trema/action-set-vlan-vid.h +42 -0
- data/ruby/trema/action-strip-vlan.c +81 -0
- data/ruby/trema/action-strip-vlan.h +42 -0
- data/ruby/trema/action-vendor.c +121 -0
- data/ruby/trema/action-vendor.h +42 -0
- data/ruby/trema/aggregate-stats-reply.rb +70 -0
- data/ruby/trema/app.rb +112 -0
- data/ruby/trema/barrier-reply.c +99 -0
- data/ruby/trema/barrier-reply.h +46 -0
- data/ruby/trema/barrier-request.c +108 -0
- data/ruby/trema/barrier-request.h +44 -0
- data/ruby/trema/cli.rb +269 -0
- data/ruby/trema/command.rb +40 -0
- data/ruby/trema/command/dump_flows.rb +62 -0
- data/ruby/trema/command/kill.rb +71 -0
- data/ruby/trema/command/killall.rb +56 -0
- data/ruby/trema/command/reset_stats.rb +61 -0
- data/ruby/trema/command/ruby.rb +55 -0
- data/ruby/trema/command/run.rb +120 -0
- data/ruby/trema/command/send_packets.rb +130 -0
- data/ruby/trema/command/shell.rb +61 -0
- data/ruby/trema/command/show_stats.rb +84 -0
- data/ruby/trema/command/usage.rb +61 -0
- data/ruby/trema/command/version.rb +39 -0
- data/ruby/trema/controller.c +595 -0
- data/ruby/trema/controller.h +44 -0
- data/ruby/trema/controller.rb +81 -0
- data/ruby/trema/daemon.rb +167 -0
- data/ruby/trema/dsl.rb +34 -0
- data/ruby/trema/dsl/configuration.rb +153 -0
- data/ruby/trema/dsl/context.rb +71 -0
- data/ruby/trema/dsl/link.rb +41 -0
- data/ruby/trema/dsl/parser.rb +70 -0
- data/ruby/trema/dsl/run.rb +49 -0
- data/ruby/trema/dsl/runner.rb +165 -0
- data/ruby/trema/dsl/stanza.rb +53 -0
- data/ruby/trema/dsl/switch.rb +78 -0
- data/ruby/trema/dsl/syntax-error.rb +33 -0
- data/ruby/trema/dsl/syntax.rb +109 -0
- data/ruby/trema/dsl/vhost.rb +108 -0
- data/ruby/trema/dsl/vswitch.rb +47 -0
- data/ruby/trema/echo-reply.c +107 -0
- data/ruby/trema/echo-reply.h +42 -0
- data/ruby/trema/echo-request.c +140 -0
- data/ruby/trema/echo-request.h +42 -0
- data/ruby/trema/error.c +253 -0
- data/ruby/trema/error.h +44 -0
- data/ruby/trema/exact-match.rb +36 -0
- data/ruby/trema/executables.rb +95 -0
- data/ruby/trema/features-reply.c +238 -0
- data/ruby/trema/features-reply.h +60 -0
- data/ruby/trema/features-request.c +109 -0
- data/ruby/trema/features-request.h +44 -0
- data/ruby/trema/flow-removed.c +275 -0
- data/ruby/trema/flow-removed.h +46 -0
- data/ruby/trema/flow-stats-reply.rb +109 -0
- data/ruby/trema/flow.rb +56 -0
- data/ruby/trema/get-config-reply.c +159 -0
- data/ruby/trema/get-config-reply.h +52 -0
- data/ruby/trema/get-config-request.c +107 -0
- data/ruby/trema/get-config-request.h +44 -0
- data/ruby/trema/hello.c +110 -0
- data/ruby/trema/hello.h +44 -0
- data/ruby/trema/host.rb +257 -0
- data/ruby/trema/ip.rb +101 -0
- data/ruby/trema/link.rb +176 -0
- data/ruby/trema/list-switches-reply.c +46 -0
- data/ruby/trema/list-switches-reply.h +40 -0
- data/ruby/trema/logger.c +162 -0
- data/ruby/trema/logger.h +44 -0
- data/ruby/trema/mac.rb +151 -0
- data/ruby/trema/match.c +594 -0
- data/ruby/trema/match.h +36 -0
- data/ruby/trema/monkey-patch/integer.rb +35 -0
- data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
- data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
- data/ruby/trema/monkey-patch/module.rb +33 -0
- data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
- data/ruby/trema/monkey-patch/string.rb +33 -0
- data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
- data/ruby/trema/network-component.rb +153 -0
- data/ruby/trema/ofctl.rb +62 -0
- data/ruby/trema/open-vswitch.rb +154 -0
- data/ruby/trema/openflow-error.c +191 -0
- data/ruby/trema/openflow-error.h +53 -0
- data/ruby/trema/openflow-switch.rb +88 -0
- data/ruby/trema/ordered-hash.rb +74 -0
- data/ruby/trema/packet-queue.rb +178 -0
- data/ruby/trema/packet_in.c +736 -0
- data/ruby/trema/packet_in.h +46 -0
- data/ruby/trema/packetin-filter.rb +126 -0
- data/ruby/trema/path.rb +135 -0
- data/ruby/trema/phost.rb +69 -0
- data/ruby/trema/port-mod.c +226 -0
- data/ruby/trema/port-mod.h +36 -0
- data/ruby/trema/port-stats-reply.rb +111 -0
- data/ruby/trema/port-status.c +156 -0
- data/ruby/trema/port-status.h +45 -0
- data/ruby/trema/port.c +295 -0
- data/ruby/trema/port.h +47 -0
- data/ruby/trema/process.rb +76 -0
- data/ruby/trema/queue-get-config-reply.c +200 -0
- data/ruby/trema/queue-get-config-reply.h +47 -0
- data/ruby/trema/queue-get-config-request.c +141 -0
- data/ruby/trema/queue-get-config-request.h +44 -0
- data/ruby/trema/queue-stats-reply.rb +78 -0
- data/ruby/trema/set-config.c +171 -0
- data/ruby/trema/set-config.h +44 -0
- data/ruby/trema/shell.rb +39 -0
- data/ruby/trema/shell/down.rb +39 -0
- data/ruby/trema/shell/killall.rb +40 -0
- data/ruby/trema/shell/link.rb +61 -0
- data/ruby/trema/shell/reset_stats.rb +50 -0
- data/ruby/trema/shell/run.rb +67 -0
- data/ruby/trema/shell/send_packets.rb +42 -0
- data/ruby/trema/shell/show_stats.rb +49 -0
- data/ruby/trema/shell/up.rb +43 -0
- data/ruby/trema/shell/vhost.rb +44 -0
- data/ruby/trema/shell/vswitch.rb +49 -0
- data/ruby/trema/stats-helper.rb +65 -0
- data/ruby/trema/stats-reply.c +483 -0
- data/ruby/trema/stats-reply.h +53 -0
- data/ruby/trema/stats-request.c +634 -0
- data/ruby/trema/stats-request.h +42 -0
- data/ruby/trema/switch-daemon.rb +74 -0
- data/ruby/trema/switch-disconnected.c +40 -0
- data/ruby/trema/switch-disconnected.h +38 -0
- data/ruby/trema/switch-manager.rb +121 -0
- data/ruby/trema/switch.rb +37 -0
- data/ruby/trema/table-stats-reply.rb +87 -0
- data/ruby/trema/timers.rb +97 -0
- data/ruby/trema/trema.c +122 -0
- data/ruby/trema/tremashark.rb +39 -0
- data/ruby/trema/util.rb +84 -0
- data/ruby/trema/vendor-request.c +193 -0
- data/ruby/trema/vendor-request.h +44 -0
- data/ruby/trema/vendor-stats-reply.rb +62 -0
- data/ruby/trema/vendor.c +152 -0
- data/ruby/trema/vendor.h +52 -0
- data/ruby/trema/version.rb +30 -0
- data/spec/spec_helper.rb +153 -0
- data/spec/support/openflow-message.rb +94 -0
- data/spec/trema/action-enqueue_spec.rb +100 -0
- data/spec/trema/action-output_spec.rb +116 -0
- data/spec/trema/action-set-dl-dst_spec.rb +95 -0
- data/spec/trema/action-set-dl-src_spec.rb +92 -0
- data/spec/trema/action-set-nw-dst_spec.rb +96 -0
- data/spec/trema/action-set-nw-src_spec.rb +97 -0
- data/spec/trema/action-set-nw-tos_spec.rb +88 -0
- data/spec/trema/action-set-tp-dst_spec.rb +88 -0
- data/spec/trema/action-set-tp-src_spec.rb +88 -0
- data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
- data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
- data/spec/trema/action-strip-vlan_spec.rb +57 -0
- data/spec/trema/action-vendor_spec.rb +90 -0
- data/spec/trema/app_spec.rb +90 -0
- data/spec/trema/barrier-reply_spec.rb +45 -0
- data/spec/trema/barrier-request_spec.rb +83 -0
- data/spec/trema/cli_spec.rb +160 -0
- data/spec/trema/controller_spec.rb +100 -0
- data/spec/trema/dsl/configuration_spec.rb +122 -0
- data/spec/trema/dsl/link_spec.rb +54 -0
- data/spec/trema/dsl/run_spec.rb +78 -0
- data/spec/trema/dsl/runner_spec.rb +239 -0
- data/spec/trema/dsl/switch_spec.rb +77 -0
- data/spec/trema/dsl/syntax_spec.rb +121 -0
- data/spec/trema/dsl/vhost_spec.rb +148 -0
- data/spec/trema/dsl/vswitch_spec.rb +90 -0
- data/spec/trema/echo-reply_spec.rb +49 -0
- data/spec/trema/echo-request_spec.rb +75 -0
- data/spec/trema/error_spec.rb +142 -0
- data/spec/trema/executables_spec.rb +75 -0
- data/spec/trema/features-reply_spec.rb +57 -0
- data/spec/trema/features-request_spec.rb +66 -0
- data/spec/trema/flow-removed_spec.rb +146 -0
- data/spec/trema/get-config-reply_spec.rb +43 -0
- data/spec/trema/get-config-request_spec.rb +82 -0
- data/spec/trema/hello_spec.rb +49 -0
- data/spec/trema/host_spec.rb +193 -0
- data/spec/trema/link_spec.rb +64 -0
- data/spec/trema/list-switches-reply_spec.rb +48 -0
- data/spec/trema/logger_spec.rb +48 -0
- data/spec/trema/mac_spec.rb +115 -0
- data/spec/trema/match_spec.rb +113 -0
- data/spec/trema/open-vswitch_spec.rb +123 -0
- data/spec/trema/openflow-error_spec.rb +141 -0
- data/spec/trema/openflow-switch_spec.rb +56 -0
- data/spec/trema/packet-in_spec.rb +168 -0
- data/spec/trema/packet-out_spec.rb +128 -0
- data/spec/trema/packetin-filter_spec.rb +41 -0
- data/spec/trema/port-mod_spec.rb +101 -0
- data/spec/trema/port-status_spec.rb +108 -0
- data/spec/trema/port_spec.rb +61 -0
- data/spec/trema/process_spec.rb +71 -0
- data/spec/trema/queue-get-config-reply_spec.rb +66 -0
- data/spec/trema/queue-get-config-request_spec.rb +69 -0
- data/spec/trema/set-config_spec.rb +80 -0
- data/spec/trema/shell/vhost_spec.rb +57 -0
- data/spec/trema/shell/vswitch_spec.rb +89 -0
- data/spec/trema/stats-reply_spec.rb +306 -0
- data/spec/trema/stats-request_spec.rb +151 -0
- data/spec/trema/switch-disconnected_spec.rb +58 -0
- data/spec/trema/switch-manager_spec.rb +43 -0
- data/spec/trema/tremashark_spec.rb +41 -0
- data/spec/trema/util_spec.rb +93 -0
- data/spec/trema/vendor-request_spec.rb +79 -0
- data/src/examples/cbench_switch/README +21 -0
- data/src/examples/cbench_switch/cbench-switch.rb +39 -0
- data/src/examples/cbench_switch/cbench_switch.c +68 -0
- data/src/examples/dumper/dumper.c +370 -0
- data/src/examples/dumper/dumper.conf +7 -0
- data/src/examples/dumper/dumper.rb +196 -0
- data/src/examples/hello_trema/README +13 -0
- data/src/examples/hello_trema/hello_trema.c +51 -0
- data/src/examples/hello_trema/hello_trema.conf +3 -0
- data/src/examples/hello_trema/hello_trema.rb +35 -0
- data/src/examples/learning_switch/README +15 -0
- data/src/examples/learning_switch/fdb.rb +112 -0
- data/src/examples/learning_switch/learning-switch.rb +88 -0
- data/src/examples/learning_switch/learning_switch.c +236 -0
- data/src/examples/learning_switch/learning_switch.conf +18 -0
- data/src/examples/list_switches/README +19 -0
- data/src/examples/list_switches/list-switches.rb +45 -0
- data/src/examples/list_switches/list_switches.c +81 -0
- data/src/examples/list_switches/list_switches.conf +15 -0
- data/src/examples/match_compare/match-compare.conf +30 -0
- data/src/examples/match_compare/match-compare.rb +99 -0
- data/src/examples/multi_learning_switch/README +14 -0
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
- data/src/examples/openflow_message/README +11 -0
- data/src/examples/openflow_message/echo-reply.rb +59 -0
- data/src/examples/openflow_message/echo-request.rb +58 -0
- data/src/examples/openflow_message/echo_reply.c +70 -0
- data/src/examples/openflow_message/echo_request.c +70 -0
- data/src/examples/openflow_message/example.rb +63 -0
- data/src/examples/openflow_message/features-request.rb +97 -0
- data/src/examples/openflow_message/features_request.c +168 -0
- data/src/examples/openflow_message/hello.c +70 -0
- data/src/examples/openflow_message/hello.rb +58 -0
- data/src/examples/openflow_message/set-config.rb +59 -0
- data/src/examples/openflow_message/set_config.c +70 -0
- data/src/examples/packet_in/README +15 -0
- data/src/examples/packet_in/packet_in.c +55 -0
- data/src/examples/packet_in/packet_in.conf +15 -0
- data/src/examples/packet_in/packet_in.rb +34 -0
- data/src/examples/packetin_filter_config/README +12 -0
- data/src/examples/packetin_filter_config/add_filter.c +73 -0
- data/src/examples/packetin_filter_config/delete_filter.c +65 -0
- data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/dump_filter.c +65 -0
- data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
- data/src/examples/packetin_filter_config/utils.c +102 -0
- data/src/examples/packetin_filter_config/utils.h +42 -0
- data/src/examples/repeater_hub/README +8 -0
- data/src/examples/repeater_hub/repeater-hub.rb +43 -0
- data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
- data/src/examples/repeater_hub/repeater_hub.c +83 -0
- data/src/examples/repeater_hub/repeater_hub.conf +28 -0
- data/src/examples/switch_info/README +13 -0
- data/src/examples/switch_info/switch_info.c +80 -0
- data/src/examples/switch_info/switch_info.conf +3 -0
- data/src/examples/switch_info/switch_info.rb +46 -0
- data/src/examples/switch_monitor/switch-monitor.conf +3 -0
- data/src/examples/switch_monitor/switch-monitor.rb +58 -0
- data/src/examples/switch_monitor/switch_monitor.c +154 -0
- data/src/examples/traffic_monitor/counter.c +74 -0
- data/src/examples/traffic_monitor/counter.h +48 -0
- data/src/examples/traffic_monitor/counter.rb +46 -0
- data/src/examples/traffic_monitor/fdb.c +76 -0
- data/src/examples/traffic_monitor/fdb.h +50 -0
- data/src/examples/traffic_monitor/fdb.rb +44 -0
- data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
- data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
- data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
- data/src/lib/arp.h +61 -0
- data/src/lib/bool.h +49 -0
- data/src/lib/buffer.c +305 -0
- data/src/lib/buffer.h +56 -0
- data/src/lib/byteorder.c +547 -0
- data/src/lib/byteorder.h +110 -0
- data/src/lib/checks.h +42 -0
- data/src/lib/daemon.c +302 -0
- data/src/lib/daemon.h +42 -0
- data/src/lib/doubly_linked_list.c +281 -0
- data/src/lib/doubly_linked_list.h +88 -0
- data/src/lib/ether.c +48 -0
- data/src/lib/ether.h +94 -0
- data/src/lib/etherip.h +46 -0
- data/src/lib/event_handler.c +389 -0
- data/src/lib/event_handler.h +64 -0
- data/src/lib/hash_table.c +417 -0
- data/src/lib/hash_table.h +138 -0
- data/src/lib/icmp.h +74 -0
- data/src/lib/igmp.h +50 -0
- data/src/lib/ipv4.h +50 -0
- data/src/lib/linked_list.c +199 -0
- data/src/lib/linked_list.h +84 -0
- data/src/lib/log.c +402 -0
- data/src/lib/log.h +78 -0
- data/src/lib/match.h +84 -0
- data/src/lib/match_table.c +608 -0
- data/src/lib/match_table.h +51 -0
- data/src/lib/message_queue.c +143 -0
- data/src/lib/message_queue.h +61 -0
- data/src/lib/messenger.c +1714 -0
- data/src/lib/messenger.h +145 -0
- data/src/lib/openflow_application_interface.c +1673 -0
- data/src/lib/openflow_application_interface.h +329 -0
- data/src/lib/openflow_message.c +4051 -0
- data/src/lib/openflow_message.h +288 -0
- data/src/lib/openflow_service_interface.h +59 -0
- data/src/lib/packet_info.c +230 -0
- data/src/lib/packet_info.h +209 -0
- data/src/lib/packet_parser.c +502 -0
- data/src/lib/packetin_filter_interface.c +294 -0
- data/src/lib/packetin_filter_interface.h +127 -0
- data/src/lib/persistent_storage.c +480 -0
- data/src/lib/persistent_storage.h +46 -0
- data/src/lib/stat.c +213 -0
- data/src/lib/stat.h +44 -0
- data/src/lib/tcp.h +67 -0
- data/src/lib/timer.c +350 -0
- data/src/lib/timer.h +53 -0
- data/src/lib/trema.c +710 -0
- data/src/lib/trema.h +79 -0
- data/src/lib/trema_private.c +177 -0
- data/src/lib/trema_private.h +60 -0
- data/src/lib/trema_wrapper.c +56 -0
- data/src/lib/trema_wrapper.h +64 -0
- data/src/lib/udp.h +43 -0
- data/src/lib/utility.c +515 -0
- data/src/lib/utility.h +67 -0
- data/src/lib/wrapper.c +100 -0
- data/src/lib/wrapper.h +76 -0
- data/src/packetin_filter/README +17 -0
- data/src/packetin_filter/packetin_filter.c +575 -0
- data/src/switch_manager/README +20 -0
- data/src/switch_manager/cookie_table.c +292 -0
- data/src/switch_manager/cookie_table.h +72 -0
- data/src/switch_manager/dpid_table.c +110 -0
- data/src/switch_manager/dpid_table.h +46 -0
- data/src/switch_manager/management_interface.h +44 -0
- data/src/switch_manager/ofpmsg_recv.c +482 -0
- data/src/switch_manager/ofpmsg_recv.h +42 -0
- data/src/switch_manager/ofpmsg_send.c +235 -0
- data/src/switch_manager/ofpmsg_send.h +50 -0
- data/src/switch_manager/secure_channel_listener.c +281 -0
- data/src/switch_manager/secure_channel_listener.h +42 -0
- data/src/switch_manager/secure_channel_receiver.c +126 -0
- data/src/switch_manager/secure_channel_receiver.h +43 -0
- data/src/switch_manager/secure_channel_sender.c +126 -0
- data/src/switch_manager/secure_channel_sender.h +43 -0
- data/src/switch_manager/service_interface.c +181 -0
- data/src/switch_manager/service_interface.h +46 -0
- data/src/switch_manager/switch.c +538 -0
- data/src/switch_manager/switch.h +51 -0
- data/src/switch_manager/switch_manager.c +448 -0
- data/src/switch_manager/switch_manager.h +63 -0
- data/src/switch_manager/switchinfo.h +72 -0
- data/src/switch_manager/xid_table.c +184 -0
- data/src/switch_manager/xid_table.h +56 -0
- data/src/tremashark/README +78 -0
- data/src/tremashark/packet_capture.c +357 -0
- data/src/tremashark/pcap_private.h +47 -0
- data/src/tremashark/pcap_queue.c +197 -0
- data/src/tremashark/pcap_queue.h +58 -0
- data/src/tremashark/plugin/.gitignore +6 -0
- data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
- data/src/tremashark/plugin/packet-trema/Makefile +77 -0
- data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
- data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
- data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
- data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
- data/src/tremashark/plugin/user_dlts +2 -0
- data/src/tremashark/queue.c +168 -0
- data/src/tremashark/queue.h +60 -0
- data/src/tremashark/stdin_relay.c +257 -0
- data/src/tremashark/syslog_relay.c +247 -0
- data/src/tremashark/tremashark.c +556 -0
- data/trema +93 -0
- data/trema-config +61 -0
- data/unittests/buffer_stubs.c +74 -0
- data/unittests/cmockery_trema.c +123 -0
- data/unittests/cmockery_trema.h +96 -0
- data/unittests/lib/buffer_test.c +370 -0
- data/unittests/lib/byteorder_test.c +1717 -0
- data/unittests/lib/daemon_test.c +664 -0
- data/unittests/lib/doubly_linked_list_test.c +346 -0
- data/unittests/lib/ether_test.c +127 -0
- data/unittests/lib/hash_table_test.c +278 -0
- data/unittests/lib/linked_list_test.c +343 -0
- data/unittests/lib/log_test.c +459 -0
- data/unittests/lib/match_table_test.c +1509 -0
- data/unittests/lib/message_queue_test.c +379 -0
- data/unittests/lib/messenger_test.c +438 -0
- data/unittests/lib/openflow_application_interface_test.c +3488 -0
- data/unittests/lib/openflow_message_test.c +7337 -0
- data/unittests/lib/packet_info_test.c +544 -0
- data/unittests/lib/packet_parser_test.c +703 -0
- data/unittests/lib/packetin_filter_interface_test.c +723 -0
- data/unittests/lib/persistent_storage_test.c +802 -0
- data/unittests/lib/stat_test.c +291 -0
- data/unittests/lib/test_packets/arp_rep.cap +0 -0
- data/unittests/lib/test_packets/arp_req.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
- data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
- data/unittests/lib/test_packets/ipx.cap +0 -0
- data/unittests/lib/test_packets/lldp.cap +0 -0
- data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
- data/unittests/lib/test_packets/tcp.cap +0 -0
- data/unittests/lib/test_packets/tcp_syn.cap +0 -0
- data/unittests/lib/test_packets/udp.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
- data/unittests/lib/timer_test.c +248 -0
- data/unittests/lib/trema_private_test.c +323 -0
- data/unittests/lib/trema_test.c +985 -0
- data/unittests/lib/utility_test.c +628 -0
- data/unittests/lib/wrapper_test.c +201 -0
- data/unittests/packetin_filter/packetin_filter_test.c +477 -0
- data/unittests/switch_manager/switch_manager_test.c +1178 -0
- data/unittests/wrapper_stubs.c +39 -0
- data/vendor/.gitignore +6 -0
- data/vendor/README +30 -0
- data/vendor/cmockery-20110428.tar.gz +0 -0
- data/vendor/oflops-0.03.tar.gz +0 -0
- data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
- data/vendor/openflow-1.0.0.tar.gz +0 -0
- data/vendor/openflow.git.tar.gz +0 -0
- data/vendor/openvswitch-1.2.2.tar.gz +0 -0
- data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
- data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
- data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
- data/vendor/ruby-ifconfig-1.2/README +38 -0
- data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
- data/vendor/ruby-ifconfig-1.2/TODO +8 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
- data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
- data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
- metadata +856 -0
data/src/lib/utility.h
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Utility functions.
|
|
3
|
+
*
|
|
4
|
+
* Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
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 UTILITY_H
|
|
24
|
+
#define UTILITY_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include <stdint.h>
|
|
28
|
+
#include <stdio.h>
|
|
29
|
+
#include "bool.h"
|
|
30
|
+
#include "openflow.h"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
extern void ( *die )( const char *format, ... );
|
|
34
|
+
|
|
35
|
+
unsigned int hash_core( const void *key, int size );
|
|
36
|
+
|
|
37
|
+
bool compare_string( const void *x, const void *y );
|
|
38
|
+
unsigned int hash_string( const void *key );
|
|
39
|
+
|
|
40
|
+
bool compare_mac( const void *x, const void *y );
|
|
41
|
+
unsigned int hash_mac( const void *mac );
|
|
42
|
+
uint64_t mac_to_uint64( const uint8_t *mac );
|
|
43
|
+
|
|
44
|
+
bool compare_uint32( const void *x, const void *y );
|
|
45
|
+
unsigned int hash_uint32( const void *key );
|
|
46
|
+
|
|
47
|
+
bool compare_datapath_id( const void *x, const void *y );
|
|
48
|
+
unsigned int hash_datapath_id( const void *key );
|
|
49
|
+
|
|
50
|
+
bool string_to_datapath_id( const char *str, uint64_t *datapath_id );
|
|
51
|
+
|
|
52
|
+
bool match_to_string( const struct ofp_match *match, char *str, size_t size );
|
|
53
|
+
bool phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size );
|
|
54
|
+
bool actions_to_string( const struct ofp_action_header *actions, uint16_t actions_length, char *str, size_t str_length );
|
|
55
|
+
|
|
56
|
+
uint16_t get_checksum( uint16_t *pos, uint32_t size );
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
#endif // UTILITY_H
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* Local variables:
|
|
64
|
+
* c-basic-offset: 2
|
|
65
|
+
* indent-tabs-mode: nil
|
|
66
|
+
* End:
|
|
67
|
+
*/
|
data/src/lib/wrapper.c
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
|
7
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
* published by the Free Software Foundation.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License along
|
|
16
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#include <linux/limits.h>
|
|
22
|
+
#include <stdarg.h>
|
|
23
|
+
#include <stdlib.h>
|
|
24
|
+
#include <string.h>
|
|
25
|
+
#include "trema_wrapper.h"
|
|
26
|
+
#include "utility.h"
|
|
27
|
+
#include "wrapper.h"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
static void *
|
|
31
|
+
_trema_malloc( size_t size, const char *error_message ) {
|
|
32
|
+
void *ret = trema_malloc( size );
|
|
33
|
+
if ( !ret ) {
|
|
34
|
+
die( error_message );
|
|
35
|
+
}
|
|
36
|
+
return ret;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
void *
|
|
41
|
+
xmalloc( size_t size ) {
|
|
42
|
+
void *ret = _trema_malloc( size, "Out of memory, xmalloc failed" );
|
|
43
|
+
memset( ret, 0xA5, size );
|
|
44
|
+
return ret;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
void *
|
|
49
|
+
xcalloc( size_t nmemb, size_t size ) {
|
|
50
|
+
void *ret = trema_calloc( nmemb, size );
|
|
51
|
+
if ( !ret ) {
|
|
52
|
+
die( "Out of memory, xcalloc failed" );
|
|
53
|
+
}
|
|
54
|
+
return ret;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
void
|
|
59
|
+
xfree( void *ptr ) {
|
|
60
|
+
trema_free( ptr );
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
static char *
|
|
65
|
+
_xstrdup( const char *s, const char *error_message ) {
|
|
66
|
+
size_t len = strlen( s ) + 1;
|
|
67
|
+
char *ret = _trema_malloc( len, error_message );
|
|
68
|
+
memcpy( ret, s, len );
|
|
69
|
+
return ret;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
char *
|
|
74
|
+
xstrdup( const char *s ) {
|
|
75
|
+
return _xstrdup( s, "Out of memory, xstrdup failed" );
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
char *
|
|
80
|
+
xasprintf( const char *format, ... ) {
|
|
81
|
+
const char error[] = "Out of memory, xasprintf failed";
|
|
82
|
+
va_list args;
|
|
83
|
+
va_start( args, format );
|
|
84
|
+
char *str;
|
|
85
|
+
if ( trema_vasprintf( &str, format, args ) < 0 ) {
|
|
86
|
+
die( error );
|
|
87
|
+
}
|
|
88
|
+
char *result = _xstrdup( str, error );
|
|
89
|
+
free( str );
|
|
90
|
+
va_end( args );
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* Local variables:
|
|
97
|
+
* c-basic-offset: 2
|
|
98
|
+
* indent-tabs-mode: nil
|
|
99
|
+
* End:
|
|
100
|
+
*/
|
data/src/lib/wrapper.h
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Wrappers that simplifies the handling of memory allocation errors.
|
|
3
|
+
*
|
|
4
|
+
* Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
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 WRAPPER_H
|
|
24
|
+
#define WRAPPER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include <stddef.h>
|
|
28
|
+
#include <string.h>
|
|
29
|
+
#include "utility.h"
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
// If this is being built for a unit test.
|
|
33
|
+
#ifdef UNIT_TESTING
|
|
34
|
+
|
|
35
|
+
// Redirect assert to mock_assert() so assertions can be caught by cmockery.
|
|
36
|
+
#ifdef assert
|
|
37
|
+
#undef assert
|
|
38
|
+
#endif // assert
|
|
39
|
+
#define assert( expression ) \
|
|
40
|
+
mock_assert( ( int ) ( expression ), #expression, __FILE__, __LINE__ );
|
|
41
|
+
extern void mock_assert( const int result, const char *const expression, const char *const file, const int line );
|
|
42
|
+
|
|
43
|
+
#endif // UNIT_TESTING
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
// Undef Ruby's xmalloc()
|
|
47
|
+
#ifdef xmalloc
|
|
48
|
+
#undef xmalloc
|
|
49
|
+
#endif
|
|
50
|
+
void *xmalloc( size_t size );
|
|
51
|
+
|
|
52
|
+
// Undef Ruby's xcalloc()
|
|
53
|
+
#ifdef xcalloc
|
|
54
|
+
#undef xcalloc
|
|
55
|
+
#endif
|
|
56
|
+
void *xcalloc( size_t nmemb, size_t size );
|
|
57
|
+
|
|
58
|
+
// Undef Ruby's xfree()
|
|
59
|
+
#ifdef xfree
|
|
60
|
+
#undef xfree
|
|
61
|
+
#endif
|
|
62
|
+
void xfree( void *ptr );
|
|
63
|
+
|
|
64
|
+
char *xstrdup( const char *s );
|
|
65
|
+
char *xasprintf( const char *format, ... );
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
#endif // WRAPPER_H
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* Local variables:
|
|
73
|
+
* c-basic-offset: 2
|
|
74
|
+
* indent-tabs-mode: nil
|
|
75
|
+
* End:
|
|
76
|
+
*/
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
This directory includes packet-in filter component.
|
|
2
|
+
|
|
3
|
+
packet out
|
|
4
|
+
.---------------------------------------.
|
|
5
|
+
v |
|
|
6
|
+
+----------+ +-----------+ +-------+
|
|
7
|
+
| switch | * 1 | packet in | 1 * | trema |
|
|
8
|
+
| daemon | --------> | filter | --------> | apps |
|
|
9
|
+
+----------+ packet in +-----------+ packet in +-------+
|
|
10
|
+
^ 1
|
|
11
|
+
|
|
|
12
|
+
|
|
|
13
|
+
v 1
|
|
14
|
+
+----------+
|
|
15
|
+
| openflow |
|
|
16
|
+
| switch |
|
|
17
|
+
+----------+
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OpenFlow Packet_in message filter
|
|
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
|
+
#include <arpa/inet.h>
|
|
24
|
+
#include <assert.h>
|
|
25
|
+
#include <getopt.h>
|
|
26
|
+
#include <inttypes.h>
|
|
27
|
+
#include <stdio.h>
|
|
28
|
+
#include <string.h>
|
|
29
|
+
#include <unistd.h>
|
|
30
|
+
#include "trema.h"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#ifdef UNIT_TESTING
|
|
34
|
+
|
|
35
|
+
#define static
|
|
36
|
+
#define main packetin_filter_main
|
|
37
|
+
|
|
38
|
+
#ifdef printf
|
|
39
|
+
#undef printf
|
|
40
|
+
#endif
|
|
41
|
+
#define printf( fmt, args... ) mock_printf2( fmt, ##args )
|
|
42
|
+
int mock_printf2(const char *format, ...);
|
|
43
|
+
|
|
44
|
+
#ifdef error
|
|
45
|
+
#undef error
|
|
46
|
+
#endif
|
|
47
|
+
#define error( fmt, args... ) mock_error( fmt, ##args )
|
|
48
|
+
void mock_error( const char *format, ... );
|
|
49
|
+
|
|
50
|
+
#ifdef set_match_from_packet
|
|
51
|
+
#undef set_match_from_packet
|
|
52
|
+
#endif
|
|
53
|
+
#define set_match_from_packet mock_set_match_from_packet
|
|
54
|
+
void mock_set_match_from_packet( struct ofp_match *match, const uint16_t in_port,
|
|
55
|
+
const uint32_t wildcards, const buffer *packet );
|
|
56
|
+
|
|
57
|
+
#ifdef create_packet_in
|
|
58
|
+
#undef create_packet_in
|
|
59
|
+
#endif
|
|
60
|
+
#define create_packet_in mock_create_packet_in
|
|
61
|
+
buffer *mock_create_packet_in( const uint32_t transaction_id, const uint32_t buffer_id,
|
|
62
|
+
const uint16_t total_len, uint16_t in_port,
|
|
63
|
+
const uint8_t reason, const buffer *data );
|
|
64
|
+
|
|
65
|
+
#ifdef insert_match_entry
|
|
66
|
+
#undef insert_match_entry
|
|
67
|
+
#endif
|
|
68
|
+
#define insert_match_entry mock_insert_match_entry
|
|
69
|
+
void mock_insert_match_entry( struct ofp_match *ofp_match, uint16_t priority,
|
|
70
|
+
const char *service_name );
|
|
71
|
+
|
|
72
|
+
#ifdef lookup_match_entry
|
|
73
|
+
#undef lookup_match_entry
|
|
74
|
+
#endif
|
|
75
|
+
#define lookup_match_entry mock_lookup_match_entry
|
|
76
|
+
match_entry *mock_lookup_match_entry( struct ofp_match *match );
|
|
77
|
+
|
|
78
|
+
#ifdef send_message
|
|
79
|
+
#undef send_message
|
|
80
|
+
#endif
|
|
81
|
+
#define send_message mock_send_message
|
|
82
|
+
bool mock_send_message( const char *service_name, const uint16_t tag, const void *data,
|
|
83
|
+
size_t len );
|
|
84
|
+
|
|
85
|
+
#ifdef init_trema
|
|
86
|
+
#undef init_trema
|
|
87
|
+
#endif
|
|
88
|
+
#define init_trema mock_init_trema
|
|
89
|
+
void mock_init_trema( int *argc, char ***argv );
|
|
90
|
+
|
|
91
|
+
#ifdef set_packet_in_handler
|
|
92
|
+
#undef set_packet_in_handler
|
|
93
|
+
#endif
|
|
94
|
+
#define set_packet_in_handler mock_set_packet_in_handler
|
|
95
|
+
bool mock_set_packet_in_handler( packet_in_handler callback, void *user_data );
|
|
96
|
+
|
|
97
|
+
#ifdef start_trema
|
|
98
|
+
#undef start_trema
|
|
99
|
+
#endif
|
|
100
|
+
#define start_trema mock_start_trema
|
|
101
|
+
void mock_start_trema( void );
|
|
102
|
+
|
|
103
|
+
#ifdef get_executable_name
|
|
104
|
+
#undef get_executable_name
|
|
105
|
+
#endif
|
|
106
|
+
#define get_executable_name mock_get_executable_name
|
|
107
|
+
const char *mock_get_executable_name( void );
|
|
108
|
+
|
|
109
|
+
#endif // UNIT_TESTING
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
void
|
|
113
|
+
usage() {
|
|
114
|
+
printf(
|
|
115
|
+
"OpenFlow Packet in Filter.\n"
|
|
116
|
+
"Usage: %s [OPTION]... [PACKETIN-FILTER-RULE]...\n"
|
|
117
|
+
"\n"
|
|
118
|
+
" -n, --name=SERVICE_NAME service name\n"
|
|
119
|
+
" -d, --daemonize run in the background\n"
|
|
120
|
+
" -l, --logging_level=LEVEL set logging level\n"
|
|
121
|
+
" -h, --help display this help and exit\n"
|
|
122
|
+
"\n"
|
|
123
|
+
"PACKETIN-FILTER-RULE:\n"
|
|
124
|
+
" match-type::destination-service-name\n"
|
|
125
|
+
"\n"
|
|
126
|
+
"match-type:\n"
|
|
127
|
+
" lldp LLDP ethernet frame type and priority is 0x8000\n"
|
|
128
|
+
" packet_in any packet and priority is zero\n"
|
|
129
|
+
"\n"
|
|
130
|
+
"destination-service-name destination service name\n"
|
|
131
|
+
, get_executable_name()
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
static buffer *
|
|
137
|
+
parse_etherip( const buffer *data ) {
|
|
138
|
+
packet_info *packet_info = data->user_data;
|
|
139
|
+
if ( packet_info->etherip_version != ETHERIP_VERSION ) {
|
|
140
|
+
error( "invalid etherip version 0x%04x.", packet_info->etherip_version );
|
|
141
|
+
return NULL;
|
|
142
|
+
}
|
|
143
|
+
if ( packet_info->etherip_offset == 0 ) {
|
|
144
|
+
debug( "too short etherip message" );
|
|
145
|
+
return NULL;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
buffer *copy = duplicate_buffer( data );
|
|
149
|
+
if ( copy == NULL ) {
|
|
150
|
+
error( "duplicate_buffer failed." );
|
|
151
|
+
return NULL;
|
|
152
|
+
}
|
|
153
|
+
copy->user_data = NULL;
|
|
154
|
+
remove_front_buffer( copy, packet_info->etherip_offset );
|
|
155
|
+
|
|
156
|
+
if ( !parse_packet( copy ) ) {
|
|
157
|
+
error( "parse_packet failed." );
|
|
158
|
+
free_buffer( copy );
|
|
159
|
+
return NULL;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
debug( "Receive EtherIP packet." );
|
|
163
|
+
|
|
164
|
+
return copy;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
static void
|
|
169
|
+
handle_packet_in( uint64_t datapath_id, uint32_t transaction_id,
|
|
170
|
+
uint32_t buffer_id, uint16_t total_len,
|
|
171
|
+
uint16_t in_port, uint8_t reason, const buffer *data,
|
|
172
|
+
void *user_data ) {
|
|
173
|
+
UNUSED( user_data );
|
|
174
|
+
|
|
175
|
+
char match_str[ 1024 ];
|
|
176
|
+
struct ofp_match ofp_match; // host order
|
|
177
|
+
|
|
178
|
+
buffer *copy = NULL;
|
|
179
|
+
packet_info *packet_info = data->user_data;
|
|
180
|
+
debug( "Receive packet. ethertype=0x%04x, ipproto=0x%x", packet_info->eth_type, packet_info->ipv4_protocol );
|
|
181
|
+
if ( packet_type_ipv4_etherip( data ) ) {
|
|
182
|
+
copy = parse_etherip( data );
|
|
183
|
+
}
|
|
184
|
+
set_match_from_packet( &ofp_match, in_port, 0, copy != NULL ? copy : data );
|
|
185
|
+
if ( copy != NULL ) {
|
|
186
|
+
free_buffer( copy );
|
|
187
|
+
copy = NULL;
|
|
188
|
+
}
|
|
189
|
+
match_to_string( &ofp_match, match_str, sizeof( match_str ) );
|
|
190
|
+
|
|
191
|
+
list_element *services = lookup_match_entry( ofp_match );
|
|
192
|
+
if ( services == NULL ) {
|
|
193
|
+
debug( "match entry not found" );
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
buffer *buf = create_packet_in( transaction_id, buffer_id, total_len, in_port,
|
|
198
|
+
reason, data );
|
|
199
|
+
|
|
200
|
+
openflow_service_header_t *message;
|
|
201
|
+
message = append_front_buffer( buf, sizeof( openflow_service_header_t ) );
|
|
202
|
+
message->datapath_id = htonll( datapath_id );
|
|
203
|
+
message->service_name_length = htons( 0 );
|
|
204
|
+
list_element *element;
|
|
205
|
+
for ( element = services; element != NULL; element = element->next ) {
|
|
206
|
+
const char *service_name = element->data;
|
|
207
|
+
if ( !send_message( service_name, MESSENGER_OPENFLOW_MESSAGE,
|
|
208
|
+
buf->data, buf->length ) ) {
|
|
209
|
+
error( "Failed to send a message to %s ( match = %s ).", service_name, match_str );
|
|
210
|
+
free_buffer( buf );
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
debug( "Sending a message to %s ( match = %s ).", service_name, match_str );
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
free_buffer( buf );
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
static void
|
|
222
|
+
init_packetin_match_table( void ) {
|
|
223
|
+
init_match_table();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
static void
|
|
228
|
+
free_user_data_entry( struct ofp_match match, uint16_t priority, void *services, void *user_data ) {
|
|
229
|
+
UNUSED( match );
|
|
230
|
+
UNUSED( priority );
|
|
231
|
+
UNUSED( user_data );
|
|
232
|
+
|
|
233
|
+
list_element *element;
|
|
234
|
+
for ( element = services; element != NULL; element = element->next ) {
|
|
235
|
+
xfree( element->data );
|
|
236
|
+
element->data = NULL;
|
|
237
|
+
}
|
|
238
|
+
delete_list( services );
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
static void
|
|
243
|
+
finalize_packetin_match_table( void ) {
|
|
244
|
+
foreach_match_table( free_user_data_entry, NULL );
|
|
245
|
+
finalize_match_table();
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
static bool
|
|
250
|
+
add_packetin_match_entry( struct ofp_match match, uint16_t priority, const char *service_name ) {
|
|
251
|
+
bool ( *insert_or_update_match_entry ) ( struct ofp_match, uint16_t, void * ) = update_match_entry;
|
|
252
|
+
list_element *services = lookup_match_strict_entry( match, priority );
|
|
253
|
+
if ( services == NULL ) {
|
|
254
|
+
insert_or_update_match_entry = insert_match_entry;
|
|
255
|
+
create_list( &services );
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
list_element *element;
|
|
259
|
+
for ( element = services; element != NULL; element = element->next ) {
|
|
260
|
+
if ( strcmp( element->data, service_name ) == 0 ) {
|
|
261
|
+
char match_string[ 256 ];
|
|
262
|
+
match_to_string( &match, match_string, sizeof( match_string ) );
|
|
263
|
+
warn( "match entry already exists ( match = [%s], service_name = [%s] )", match_string, service_name );
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
append_to_tail( &services, xstrdup( service_name ) );
|
|
269
|
+
insert_or_update_match_entry( match, priority, services );
|
|
270
|
+
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
static int
|
|
276
|
+
delete_packetin_match_entry( struct ofp_match match, uint16_t priority, const char *service_name ) {
|
|
277
|
+
list_element *head = delete_match_strict_entry( match, priority );
|
|
278
|
+
if ( head == NULL ) {
|
|
279
|
+
return 0;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
int n_deleted = 0;
|
|
283
|
+
int n_remaining_services = 0;
|
|
284
|
+
list_element *services = head;
|
|
285
|
+
while ( services != NULL ) {
|
|
286
|
+
char *service = services->data;
|
|
287
|
+
services = services->next;
|
|
288
|
+
if ( strcmp( service, service_name ) == 0 ) {
|
|
289
|
+
delete_element( &head, service );
|
|
290
|
+
xfree( service );
|
|
291
|
+
n_deleted++;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
n_remaining_services++;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if ( n_remaining_services == 0 ) {
|
|
299
|
+
if ( head != NULL ) {
|
|
300
|
+
delete_list( head );
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
insert_match_entry( match, priority, head );
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return n_deleted;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
static void
|
|
312
|
+
register_dl_type_filter( uint16_t dl_type, uint16_t priority, const char *service_name ) {
|
|
313
|
+
struct ofp_match match;
|
|
314
|
+
memset( &match, 0, sizeof( struct ofp_match ) );
|
|
315
|
+
match.wildcards = OFPFW_ALL & ~OFPFW_DL_TYPE;
|
|
316
|
+
match.dl_type = dl_type;
|
|
317
|
+
|
|
318
|
+
add_packetin_match_entry( match, priority, service_name );
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
static void
|
|
323
|
+
register_any_filter( uint16_t priority, const char *service_name ) {
|
|
324
|
+
struct ofp_match match;
|
|
325
|
+
memset( &match, 0, sizeof( struct ofp_match ) );
|
|
326
|
+
match.wildcards = OFPFW_ALL;
|
|
327
|
+
|
|
328
|
+
add_packetin_match_entry( match, priority, service_name );
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
static const char *
|
|
333
|
+
match_type( const char *type, char *name ) {
|
|
334
|
+
size_t len = strlen( type );
|
|
335
|
+
if ( strncmp( name, type, len ) != 0 ) {
|
|
336
|
+
return NULL;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return name + len;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
// built-in packetin-filter-rule
|
|
344
|
+
static const char LLDP_PACKET_IN[] = "lldp::";
|
|
345
|
+
static const char ANY_PACKET_IN[] = "packet_in::";
|
|
346
|
+
|
|
347
|
+
static bool
|
|
348
|
+
set_match_type( int argc, char *argv[] ) {
|
|
349
|
+
int i;
|
|
350
|
+
const char *service_name;
|
|
351
|
+
for ( i = 1; i < argc; i++ ) {
|
|
352
|
+
if ( ( service_name = match_type( LLDP_PACKET_IN, argv[ i ] ) ) != NULL ) {
|
|
353
|
+
register_dl_type_filter( ETH_ETHTYPE_LLDP, OFP_DEFAULT_PRIORITY, service_name );
|
|
354
|
+
}
|
|
355
|
+
else if ( ( service_name = match_type( ANY_PACKET_IN, argv[ i ] ) ) != NULL ) {
|
|
356
|
+
register_any_filter( 0, service_name );
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
static void
|
|
368
|
+
handle_add_filter_request( const messenger_context_handle *handle, add_packetin_filter_request *request ) {
|
|
369
|
+
assert( handle != NULL );
|
|
370
|
+
assert( request != NULL ) ;
|
|
371
|
+
|
|
372
|
+
request->entry.service_name[ MESSENGER_SERVICE_NAME_LENGTH - 1 ] = '\0';
|
|
373
|
+
if ( strlen( request->entry.service_name ) == 0 ) {
|
|
374
|
+
error( "Service name must be specified." );
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
struct ofp_match match;
|
|
378
|
+
ntoh_match( &match, &request->entry.match );
|
|
379
|
+
bool ret = add_packetin_match_entry( match, ntohs( request->entry.priority ), request->entry.service_name );
|
|
380
|
+
|
|
381
|
+
add_packetin_filter_reply reply;
|
|
382
|
+
memset( &reply, 0, sizeof( add_packetin_filter_reply ) );
|
|
383
|
+
reply.status = ( uint8_t ) ( ret ? PACKETIN_FILTER_OPERATION_SUCCEEDED : PACKETIN_FILTER_OPERATION_FAILED );
|
|
384
|
+
ret = send_reply_message( handle, MESSENGER_ADD_PACKETIN_FILTER_REPLY,
|
|
385
|
+
&reply, sizeof( add_packetin_filter_reply ) );
|
|
386
|
+
if ( ret == false ) {
|
|
387
|
+
error( "Failed to send an add filter reply." );
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
static void
|
|
393
|
+
delete_filter_walker( struct ofp_match match, uint16_t priority, void *data, void *user_data ) {
|
|
394
|
+
UNUSED( data );
|
|
395
|
+
buffer *reply_buffer = user_data;
|
|
396
|
+
assert( reply_buffer != NULL );
|
|
397
|
+
|
|
398
|
+
delete_packetin_filter_reply *reply = reply_buffer->data;
|
|
399
|
+
list_element *head = delete_match_strict_entry( match, priority );
|
|
400
|
+
for ( list_element *services = head; services != NULL; services = services->next ) {
|
|
401
|
+
xfree( services->data );
|
|
402
|
+
reply->n_deleted++;
|
|
403
|
+
}
|
|
404
|
+
if ( head != NULL ) {
|
|
405
|
+
delete_list( head );
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
static void
|
|
411
|
+
handle_delete_filter_request( const messenger_context_handle *handle, delete_packetin_filter_request *request ) {
|
|
412
|
+
assert( handle != NULL );
|
|
413
|
+
assert( request != NULL ) ;
|
|
414
|
+
|
|
415
|
+
buffer *buf = alloc_buffer_with_length( sizeof( delete_packetin_filter_reply ) );
|
|
416
|
+
delete_packetin_filter_reply *reply = append_back_buffer( buf, sizeof( delete_packetin_filter_reply ) );
|
|
417
|
+
reply->status = PACKETIN_FILTER_OPERATION_SUCCEEDED;
|
|
418
|
+
reply->n_deleted = 0;
|
|
419
|
+
|
|
420
|
+
struct ofp_match match;
|
|
421
|
+
ntoh_match( &match, &request->criteria.match );
|
|
422
|
+
uint16_t priority = ntohs( request->criteria.priority );
|
|
423
|
+
if ( request->flags & PACKETIN_FILTER_FLAG_MATCH_STRICT ) {
|
|
424
|
+
int n_deleted = delete_packetin_match_entry( match, priority, request->criteria.service_name );
|
|
425
|
+
reply->n_deleted += ( uint32_t ) n_deleted;
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
map_match_table( match, delete_filter_walker, buf );
|
|
429
|
+
}
|
|
430
|
+
reply->n_deleted = htonl( reply->n_deleted );
|
|
431
|
+
|
|
432
|
+
bool ret = send_reply_message( handle, MESSENGER_DELETE_PACKETIN_FILTER_REPLY, buf->data, buf->length );
|
|
433
|
+
free_buffer( buf );
|
|
434
|
+
if ( ret == false ) {
|
|
435
|
+
error( "Failed to send a dump filter reply." );
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
static void
|
|
441
|
+
dump_filter_walker( struct ofp_match match, uint16_t priority, void *data, void *user_data ) {
|
|
442
|
+
buffer *reply_buffer = user_data;
|
|
443
|
+
assert( reply_buffer != NULL );
|
|
444
|
+
|
|
445
|
+
dump_packetin_filter_reply *reply = reply_buffer->data;
|
|
446
|
+
list_element *services = data;
|
|
447
|
+
while ( services != NULL ) {
|
|
448
|
+
reply->n_entries++;
|
|
449
|
+
packetin_filter_entry *entry = append_back_buffer( reply_buffer, sizeof( packetin_filter_entry ) );
|
|
450
|
+
hton_match( &entry->match, &match );
|
|
451
|
+
entry->priority = htons( priority );
|
|
452
|
+
strncpy( entry->service_name, services->data, sizeof( entry->service_name ) );
|
|
453
|
+
entry->service_name[ sizeof( entry->service_name ) - 1 ] = '\0';
|
|
454
|
+
services = services->next;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
static void
|
|
460
|
+
handle_dump_filter_request( const messenger_context_handle *handle, dump_packetin_filter_request *request ) {
|
|
461
|
+
assert( handle != NULL );
|
|
462
|
+
assert( request != NULL ) ;
|
|
463
|
+
|
|
464
|
+
buffer *buf = alloc_buffer_with_length( 2048 );
|
|
465
|
+
dump_packetin_filter_reply *reply = append_back_buffer( buf, offsetof( dump_packetin_filter_reply, entries ) );
|
|
466
|
+
reply->status = PACKETIN_FILTER_OPERATION_SUCCEEDED;
|
|
467
|
+
reply->n_entries = 0;
|
|
468
|
+
|
|
469
|
+
struct ofp_match match;
|
|
470
|
+
ntoh_match( &match, &request->criteria.match );
|
|
471
|
+
uint16_t priority = ntohs( request->criteria.priority );
|
|
472
|
+
if ( request->flags & PACKETIN_FILTER_FLAG_MATCH_STRICT ) {
|
|
473
|
+
list_element *services = lookup_match_strict_entry( match, priority );
|
|
474
|
+
while ( services != NULL ) {
|
|
475
|
+
if ( strcmp( services->data, request->criteria.service_name ) == 0 ) {
|
|
476
|
+
packetin_filter_entry *entry = append_back_buffer( buf, sizeof( packetin_filter_entry ) );
|
|
477
|
+
reply->n_entries++;
|
|
478
|
+
entry->match = request->criteria.match;
|
|
479
|
+
entry->priority = request->criteria.priority;
|
|
480
|
+
strncpy( entry->service_name, services->data, sizeof( entry->service_name ) );
|
|
481
|
+
entry->service_name[ sizeof( entry->service_name ) - 1 ] = '\0';
|
|
482
|
+
}
|
|
483
|
+
services = services->next;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
map_match_table( match, dump_filter_walker, buf );
|
|
488
|
+
}
|
|
489
|
+
reply->n_entries = htonl( reply->n_entries );
|
|
490
|
+
|
|
491
|
+
bool ret = send_reply_message( handle, MESSENGER_DUMP_PACKETIN_FILTER_REPLY, buf->data, buf->length );
|
|
492
|
+
free_buffer( buf );
|
|
493
|
+
if ( ret == false ) {
|
|
494
|
+
error( "Failed to send a dump packetin filter reply." );
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
static void
|
|
500
|
+
handle_request( const messenger_context_handle *handle, uint16_t tag, void *data, size_t length ) {
|
|
501
|
+
assert( handle != NULL );
|
|
502
|
+
|
|
503
|
+
debug( "Handling a request ( handle = %p, tag = %#x, data = %p, length = %u ).",
|
|
504
|
+
handle, tag, data, length );
|
|
505
|
+
|
|
506
|
+
switch ( tag ) {
|
|
507
|
+
case MESSENGER_ADD_PACKETIN_FILTER_REQUEST:
|
|
508
|
+
{
|
|
509
|
+
if ( length != sizeof( add_packetin_filter_request ) ) {
|
|
510
|
+
error( "Invalid add packetin filter request ( length = %u ).", length );
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
handle_add_filter_request( handle, data );
|
|
515
|
+
}
|
|
516
|
+
break;
|
|
517
|
+
case MESSENGER_DELETE_PACKETIN_FILTER_REQUEST:
|
|
518
|
+
{
|
|
519
|
+
if ( length != sizeof( delete_packetin_filter_request ) ) {
|
|
520
|
+
error( "Invalid delete packetin filter request ( length = %u ).", length );
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
handle_delete_filter_request( handle, data );
|
|
525
|
+
}
|
|
526
|
+
break;
|
|
527
|
+
case MESSENGER_DUMP_PACKETIN_FILTER_REQUEST:
|
|
528
|
+
{
|
|
529
|
+
if ( length != sizeof( dump_packetin_filter_request ) ) {
|
|
530
|
+
error( "Invalid dump packetin filter request ( length = %u ).", length );
|
|
531
|
+
return;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
handle_dump_filter_request( handle, data );
|
|
535
|
+
}
|
|
536
|
+
break;
|
|
537
|
+
default:
|
|
538
|
+
{
|
|
539
|
+
warn( "Undefined request tag ( tag = %#x ).", tag );
|
|
540
|
+
}
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
int
|
|
547
|
+
main( int argc, char *argv[] ) {
|
|
548
|
+
init_trema( &argc, &argv );
|
|
549
|
+
|
|
550
|
+
init_packetin_match_table();
|
|
551
|
+
|
|
552
|
+
// built-in packetin-filter-rule
|
|
553
|
+
if ( !set_match_type( argc, argv ) ) {
|
|
554
|
+
usage();
|
|
555
|
+
finalize_packetin_match_table();
|
|
556
|
+
exit( EXIT_FAILURE );
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
set_packet_in_handler( handle_packet_in, NULL );
|
|
560
|
+
add_message_requested_callback( PACKETIN_FILTER_MANAGEMENT_SERVICE, handle_request );
|
|
561
|
+
|
|
562
|
+
start_trema();
|
|
563
|
+
|
|
564
|
+
finalize_packetin_match_table();
|
|
565
|
+
|
|
566
|
+
return 0;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
/*
|
|
571
|
+
* Local variables:
|
|
572
|
+
* c-basic-offset: 2
|
|
573
|
+
* indent-tabs-mode: nil
|
|
574
|
+
* End:
|
|
575
|
+
*/
|