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/ruby/trema/logger.h
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Logger class.
|
|
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 LOGGER_H
|
|
24
|
+
#define LOGGER_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include "ruby.h"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
extern VALUE mLogger;
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
void Init_logger( void );
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#endif // LOGGER_H
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* Local variables:
|
|
41
|
+
* c-basic-offset: 2
|
|
42
|
+
* indent-tabs-mode: nil
|
|
43
|
+
* End:
|
|
44
|
+
*/
|
data/ruby/trema/mac.rb
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
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
|
+
require "forwardable"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
module Trema
|
|
25
|
+
#
|
|
26
|
+
# MAC address class
|
|
27
|
+
#
|
|
28
|
+
class Mac
|
|
29
|
+
extend Forwardable
|
|
30
|
+
def_delegator :@value, :hash
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# @return [Number] Ethernet address in its numeric presentation.
|
|
35
|
+
#
|
|
36
|
+
attr_reader :value
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
#
|
|
40
|
+
# Creates a {Mac} instance that encapsulates Ethernet MAC addresses.
|
|
41
|
+
#
|
|
42
|
+
# @overload initialize(value)
|
|
43
|
+
#
|
|
44
|
+
# @param [String,Integer] value
|
|
45
|
+
# the MAC address to set to.
|
|
46
|
+
#
|
|
47
|
+
# @example address as a hexadecimal string
|
|
48
|
+
# Mac.new("11:22:33:44:55:66")
|
|
49
|
+
#
|
|
50
|
+
# @example address as a hexadecimal number
|
|
51
|
+
# Mac.new(0xffffffffffff)
|
|
52
|
+
#
|
|
53
|
+
# @raise [ArgumentError] if invalid format is detected.
|
|
54
|
+
# @raise [ArgumentError] if supplied argument is not a string or integer.
|
|
55
|
+
#
|
|
56
|
+
def initialize value
|
|
57
|
+
case value
|
|
58
|
+
when String
|
|
59
|
+
@value = from_string( value )
|
|
60
|
+
when Integer
|
|
61
|
+
@value = from_integer( value )
|
|
62
|
+
else
|
|
63
|
+
raise %{Invalid MAC address: #{ value.inspect }}
|
|
64
|
+
end
|
|
65
|
+
@string = string_format
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# @return [String]
|
|
71
|
+
# the Ethernet address as 6 pairs of hexadecimal digits delimited by colons.
|
|
72
|
+
# eg. xx:xx:xx:xx:xx:xx
|
|
73
|
+
#
|
|
74
|
+
def to_s
|
|
75
|
+
@string
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# @return [Array]
|
|
81
|
+
# an array of decimal numbers converted from Ethernet's address string
|
|
82
|
+
# format.
|
|
83
|
+
#
|
|
84
|
+
def to_short
|
|
85
|
+
@string.split( ":" ).collect do | each |
|
|
86
|
+
each.hex
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
# @return [Boolean] if other matches or not the attribute type value.
|
|
93
|
+
#
|
|
94
|
+
def == other
|
|
95
|
+
@value == other.value
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# @return [Boolean] if other matches or not the attribute type value.
|
|
101
|
+
#
|
|
102
|
+
def eql? other
|
|
103
|
+
@value == other.value
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# @return [Boolean] if MAC address is multicast or not.
|
|
109
|
+
#
|
|
110
|
+
def is_multicast?
|
|
111
|
+
# check I/G bit
|
|
112
|
+
return to_short[0] & 1 == 1
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
################################################################################
|
|
117
|
+
private
|
|
118
|
+
################################################################################
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def from_string string
|
|
122
|
+
octet_regex = "[0-9a-fA-F][0-9a-fA-F]"
|
|
123
|
+
if /^(#{ octet_regex }:){5}(#{ octet_regex })$/=~ string
|
|
124
|
+
eval( "0x" + string.gsub( ":", "" ) )
|
|
125
|
+
else
|
|
126
|
+
raise %{Invalid MAC address: "#{ string }"}
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
def from_integer integer
|
|
132
|
+
if integer >= 0 and integer <= 0xffffffffffff
|
|
133
|
+
integer
|
|
134
|
+
else
|
|
135
|
+
raise %{Invalid MAC address: #{ integer }}
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def string_format
|
|
141
|
+
sprintf( "%012x", @value ).unpack( "a2" * 6 ).join( ":" )
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
### Local variables:
|
|
148
|
+
### mode: Ruby
|
|
149
|
+
### coding: utf-8-unix
|
|
150
|
+
### indent-tabs-mode: nil
|
|
151
|
+
### End:
|
data/ruby/trema/match.c
ADDED
|
@@ -0,0 +1,594 @@
|
|
|
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 <string.h>
|
|
22
|
+
#include "trema.h"
|
|
23
|
+
#include "ruby.h"
|
|
24
|
+
#include "action-common.h"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
extern VALUE mTrema;
|
|
28
|
+
VALUE cMatch;
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
static VALUE
|
|
32
|
+
match_alloc( VALUE klass ) {
|
|
33
|
+
struct ofp_match *match = xmalloc( sizeof( struct ofp_match ) );
|
|
34
|
+
return Data_Wrap_Struct( klass, NULL, xfree, match );
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
static struct
|
|
39
|
+
ofp_match *get_match( VALUE self ) {
|
|
40
|
+
struct ofp_match *match;
|
|
41
|
+
Data_Get_Struct( self, struct ofp_match, match );
|
|
42
|
+
return match;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Creates a {Match} instance from packet_in's data, the method accepts an
|
|
48
|
+
* additional single argument whose type is an array of symbols to wildcard set
|
|
49
|
+
* to don't care and ignore while matching flow entries.
|
|
50
|
+
*
|
|
51
|
+
* @overload match_from(message, *options)
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* def packet_in datapath_id, message
|
|
55
|
+
* send_flow_mod(
|
|
56
|
+
* datapath_id,
|
|
57
|
+
* :match => Match.from( message, [ :dl_type, :nw_proto ] ),
|
|
58
|
+
* :actions => Trema::ActionOutput.new( 2 )
|
|
59
|
+
* )
|
|
60
|
+
* end
|
|
61
|
+
*
|
|
62
|
+
* @param [PacketIn] message
|
|
63
|
+
* the {PacketIn}'s message content.
|
|
64
|
+
*
|
|
65
|
+
* @param [optional, Array] options
|
|
66
|
+
* If supplied an array of symbol ids indicating fields to be wildcarded.
|
|
67
|
+
*
|
|
68
|
+
* [:inport]
|
|
69
|
+
* the physical port number to wildcard.
|
|
70
|
+
*
|
|
71
|
+
* [:dl_src]
|
|
72
|
+
* the source Ethernet address to wildcard.
|
|
73
|
+
*
|
|
74
|
+
* [:dl_dst]
|
|
75
|
+
* the destination Ethernet address to wildcard.
|
|
76
|
+
*
|
|
77
|
+
* [:dl_vlan]
|
|
78
|
+
* the IEEE 802.1q virtual VLAN tag to wildcard.
|
|
79
|
+
*
|
|
80
|
+
* [:dl_vlan_pcp]
|
|
81
|
+
* the IEEE 802.1q priority code point to wildcard.
|
|
82
|
+
*
|
|
83
|
+
* [:dl_type]
|
|
84
|
+
* the Ethernet protocol type to wildcard.
|
|
85
|
+
*
|
|
86
|
+
* [:nw_tos]
|
|
87
|
+
* the IP ToS /DSCP field to wildcard.
|
|
88
|
+
*
|
|
89
|
+
* [:nw_proto]
|
|
90
|
+
* the IP protocol type to wildcard.
|
|
91
|
+
*
|
|
92
|
+
* [:nw_src]
|
|
93
|
+
* the IPv4 source address to wildcard.
|
|
94
|
+
*
|
|
95
|
+
* [:nw_dst]
|
|
96
|
+
* the IPv4 destination address to wildcard.
|
|
97
|
+
*
|
|
98
|
+
* [:tp_src]
|
|
99
|
+
* the source TCP/UDP port number to wildcard.
|
|
100
|
+
*
|
|
101
|
+
* [:tp_dst]
|
|
102
|
+
* the destination TCP/UDP port number to wildcard.
|
|
103
|
+
*
|
|
104
|
+
* @return [Match] self
|
|
105
|
+
* the modified or exact match from packet depending on whether the options
|
|
106
|
+
* argument supplied or not.
|
|
107
|
+
*/
|
|
108
|
+
static VALUE
|
|
109
|
+
match_from( int argc, VALUE *argv, VALUE self ) {
|
|
110
|
+
VALUE message, obj, wildcard_id, options;
|
|
111
|
+
struct ofp_match *match;
|
|
112
|
+
packet_in *packet;
|
|
113
|
+
uint32_t wildcards = 0;
|
|
114
|
+
|
|
115
|
+
if ( rb_scan_args( argc, argv, "1*", &message, &options ) >= 1 ) {
|
|
116
|
+
obj = rb_funcall( self, rb_intern( "new" ), 0 );
|
|
117
|
+
match = get_match( obj );
|
|
118
|
+
Data_Get_Struct( message, packet_in, packet );
|
|
119
|
+
int i;
|
|
120
|
+
for ( i = 0; i < RARRAY_LEN( options ); i++ ) {
|
|
121
|
+
wildcard_id = SYM2ID( RARRAY_PTR( options )[ i ] );
|
|
122
|
+
if ( rb_intern( "inport" ) == wildcard_id ) {
|
|
123
|
+
wildcards |= OFPFW_IN_PORT;
|
|
124
|
+
}
|
|
125
|
+
if ( rb_intern( "dl_src" ) == wildcard_id ) {
|
|
126
|
+
wildcards |= OFPFW_DL_SRC;
|
|
127
|
+
}
|
|
128
|
+
if ( rb_intern( "dl_dst" ) == wildcard_id ) {
|
|
129
|
+
wildcards |= OFPFW_DL_DST;
|
|
130
|
+
}
|
|
131
|
+
if ( rb_intern( "dl_vlan" ) == wildcard_id ) {
|
|
132
|
+
wildcards |= OFPFW_DL_VLAN;
|
|
133
|
+
}
|
|
134
|
+
if ( rb_intern( "dl_vlan_pcp" ) == wildcard_id ) {
|
|
135
|
+
wildcards |= OFPFW_DL_VLAN_PCP;
|
|
136
|
+
}
|
|
137
|
+
if ( rb_intern( "dl_type" ) == wildcard_id ) {
|
|
138
|
+
wildcards |= OFPFW_DL_TYPE;
|
|
139
|
+
}
|
|
140
|
+
if ( rb_intern( "nw_tos" ) == wildcard_id ) {
|
|
141
|
+
wildcards |= OFPFW_NW_TOS;
|
|
142
|
+
}
|
|
143
|
+
if ( rb_intern( "nw_proto" ) == wildcard_id ) {
|
|
144
|
+
wildcards |= OFPFW_NW_PROTO;
|
|
145
|
+
}
|
|
146
|
+
if ( rb_intern( "nw_src" ) == wildcard_id ) {
|
|
147
|
+
wildcards |= OFPFW_NW_SRC_ALL;
|
|
148
|
+
}
|
|
149
|
+
if ( rb_intern( "nw_dst" ) == wildcard_id ) {
|
|
150
|
+
wildcards |= OFPFW_NW_DST_ALL;
|
|
151
|
+
}
|
|
152
|
+
if ( rb_intern( "tp_src" ) == wildcard_id ) {
|
|
153
|
+
wildcards |= OFPFW_TP_SRC;
|
|
154
|
+
}
|
|
155
|
+
if ( rb_intern( "tp_dst" ) == wildcard_id ) {
|
|
156
|
+
wildcards |= OFPFW_TP_DST;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
set_match_from_packet( match, packet->in_port, wildcards, packet->data );
|
|
161
|
+
return obj;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* Compare context of {Match} self with {Match} other.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* def packet_in datapath_id, message
|
|
170
|
+
* match = Match.new( :dl_type => 0x0800, :nw_src => "192.168.0.1" )
|
|
171
|
+
* if match.compare( ExactMatch.form( message ) )
|
|
172
|
+
* info "Received packet from 192.168.0.1"
|
|
173
|
+
* end
|
|
174
|
+
* end
|
|
175
|
+
*
|
|
176
|
+
* @return [Boolean] true if the {Match} match
|
|
177
|
+
*/
|
|
178
|
+
static VALUE
|
|
179
|
+
match_compare( VALUE self, VALUE other ) {
|
|
180
|
+
return compare_match( get_match( self ), get_match( other ) ) ? Qtrue : Qfalse;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* Replaces context of {Match} self with {Match} other.
|
|
186
|
+
*
|
|
187
|
+
* @return [Match] self
|
|
188
|
+
* the modified object instance.
|
|
189
|
+
*/
|
|
190
|
+
static VALUE
|
|
191
|
+
match_replace( VALUE self, VALUE other ) {
|
|
192
|
+
memcpy( get_match( self ), get_match( other ), sizeof ( struct ofp_match ) );
|
|
193
|
+
return self;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
/*
|
|
198
|
+
* (see ActionEnqueue#to_s)
|
|
199
|
+
*/
|
|
200
|
+
static VALUE
|
|
201
|
+
match_to_s( VALUE self ) {
|
|
202
|
+
char match_str[ 1024 ];
|
|
203
|
+
|
|
204
|
+
match_to_string( get_match( self ), match_str, sizeof ( match_str ) );
|
|
205
|
+
return rb_str_new2( match_str );
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* The wildcard field expressed as a 32-bit bitmap,
|
|
211
|
+
*
|
|
212
|
+
* @return [Number] the value of wildcards.
|
|
213
|
+
*/
|
|
214
|
+
static VALUE
|
|
215
|
+
match_wildcards( VALUE self ) {
|
|
216
|
+
return UINT2NUM( ( get_match( self ) )->wildcards );
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
/*
|
|
221
|
+
* @return [Number] the value of in_port.
|
|
222
|
+
*/
|
|
223
|
+
static VALUE
|
|
224
|
+
match_in_port( VALUE self ) {
|
|
225
|
+
return UINT2NUM( ( get_match( self ) )->in_port );
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
static VALUE
|
|
230
|
+
match_dl( VALUE self, uint8_t which ) {
|
|
231
|
+
struct ofp_match *match;
|
|
232
|
+
uint8_t *dl_addr;
|
|
233
|
+
|
|
234
|
+
match = get_match( self );
|
|
235
|
+
if ( which ) {
|
|
236
|
+
dl_addr = match->dl_src;
|
|
237
|
+
} else {
|
|
238
|
+
dl_addr = match->dl_dst;
|
|
239
|
+
}
|
|
240
|
+
return rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, ULL2NUM( mac_to_uint64( dl_addr ) ) );
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
/*
|
|
245
|
+
* @return [Mac] the value of dl_src.
|
|
246
|
+
*/
|
|
247
|
+
static VALUE
|
|
248
|
+
match_dl_src( VALUE self ) {
|
|
249
|
+
return match_dl( self, 1 );
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
/*
|
|
254
|
+
* @return [Mac] the value of dl_dst.
|
|
255
|
+
*/
|
|
256
|
+
static VALUE
|
|
257
|
+
match_dl_dst( VALUE self ) {
|
|
258
|
+
return match_dl( self, 0 );
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
/*
|
|
263
|
+
* @return [Number] the value of dl_vlan.
|
|
264
|
+
*/
|
|
265
|
+
static VALUE
|
|
266
|
+
match_dl_vlan( VALUE self ) {
|
|
267
|
+
return UINT2NUM( ( get_match( self ) )->dl_vlan );
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
/*
|
|
272
|
+
* @return [Number] the value of dl_vlan_pcp.
|
|
273
|
+
*/
|
|
274
|
+
static VALUE
|
|
275
|
+
match_dl_vlan_pcp( VALUE self ) {
|
|
276
|
+
return UINT2NUM( ( get_match( self ) )->dl_vlan_pcp );
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* @return [Number] the value of dl_type.
|
|
282
|
+
*/
|
|
283
|
+
static VALUE
|
|
284
|
+
match_dl_type( VALUE self ) {
|
|
285
|
+
return UINT2NUM( ( get_match( self ) )->dl_type );
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
/*
|
|
290
|
+
* @return [Number] the value of nw_tos.
|
|
291
|
+
*/
|
|
292
|
+
static VALUE
|
|
293
|
+
match_nw_tos( VALUE self ) {
|
|
294
|
+
return UINT2NUM( ( get_match( self ) )->nw_tos );
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
/*
|
|
299
|
+
* @return [Number] the value of nw_proto.
|
|
300
|
+
*/
|
|
301
|
+
static VALUE
|
|
302
|
+
match_nw_proto( VALUE self ) {
|
|
303
|
+
return UINT2NUM( ( get_match( self ) )->nw_proto );
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
static VALUE
|
|
308
|
+
match_nw( VALUE self, uint8_t which ) {
|
|
309
|
+
struct ofp_match *match;
|
|
310
|
+
uint32_t nw_addr;
|
|
311
|
+
uint32_t masklen;
|
|
312
|
+
|
|
313
|
+
match = get_match( self );
|
|
314
|
+
if ( which ) {
|
|
315
|
+
nw_addr = match->nw_src;
|
|
316
|
+
masklen = ( match->wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT;
|
|
317
|
+
} else {
|
|
318
|
+
nw_addr = match->nw_dst;
|
|
319
|
+
masklen = ( match->wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT;
|
|
320
|
+
}
|
|
321
|
+
uint32_t prefixlen = masklen > 32 ? 0 : 32 - masklen;
|
|
322
|
+
return rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 2, UINT2NUM( nw_addr ), UINT2NUM( prefixlen ) );
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
/*
|
|
327
|
+
* An IPv4 source address in its numeric representation.
|
|
328
|
+
*
|
|
329
|
+
* @return [IP] the value of nw_src.
|
|
330
|
+
*/
|
|
331
|
+
static VALUE
|
|
332
|
+
match_nw_src( VALUE self ) {
|
|
333
|
+
return match_nw( self, 1 );
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
/*
|
|
338
|
+
* An IPv4 destination address in its numeric representation.
|
|
339
|
+
*
|
|
340
|
+
* @return [IP] the value of nw_dst.
|
|
341
|
+
*/
|
|
342
|
+
static VALUE
|
|
343
|
+
match_nw_dst( VALUE self ) {
|
|
344
|
+
return match_nw( self, 0 );
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
/*
|
|
349
|
+
* @return [Number] the value of tp_src.
|
|
350
|
+
*/
|
|
351
|
+
static VALUE
|
|
352
|
+
match_tp_src( VALUE self ) {
|
|
353
|
+
return UINT2NUM( ( get_match( self ) )->tp_src );
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
/*
|
|
358
|
+
* @return [Number] the value of tp_dst.
|
|
359
|
+
*/
|
|
360
|
+
static VALUE
|
|
361
|
+
match_tp_dst( VALUE self ) {
|
|
362
|
+
return UINT2NUM( ( get_match( self ) )->tp_dst );
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
/*
|
|
367
|
+
* Creates a {Match} instance which describe fields such as MAC addresses, IP
|
|
368
|
+
* addresses, TCP/UDP ports of a flow to match against. An exact match
|
|
369
|
+
* flow would match on all fields whereas don't care bits are wildcarded and
|
|
370
|
+
* ignored.
|
|
371
|
+
*
|
|
372
|
+
* @overload initialize(options={})
|
|
373
|
+
*
|
|
374
|
+
* @example
|
|
375
|
+
* Match.new(
|
|
376
|
+
* :in_port => port_no,
|
|
377
|
+
* :dl_src => "xx:xx:xx;xx:xx:xx",
|
|
378
|
+
* :dl_dst => "xx:xx:xx:xx:xx:xx",
|
|
379
|
+
* :dl_type => ethertype,
|
|
380
|
+
* :dl_vlan => vlan,
|
|
381
|
+
* :dl_vlan_pcp => priority,
|
|
382
|
+
* :nw_tos => tos,
|
|
383
|
+
* :nw_proto => proto,
|
|
384
|
+
* :nw_src => ip_address/netmask,
|
|
385
|
+
* :nw_dst => ip_address/netmask,
|
|
386
|
+
* :tp_src => port,
|
|
387
|
+
* :tp_dst => port,
|
|
388
|
+
* )
|
|
389
|
+
*
|
|
390
|
+
* @param [Hash] options the options hash.
|
|
391
|
+
*
|
|
392
|
+
* @option options [Number] :inport
|
|
393
|
+
* the physical port number to match.
|
|
394
|
+
*
|
|
395
|
+
* @option options [String,Number,Trema::Mac] :dl_src
|
|
396
|
+
* the source ethernet address to match specified either as 6
|
|
397
|
+
* pairs of hexadecimal digits delimited by colon or as a
|
|
398
|
+
* hexadecimal number or as a Trema::Mac object.
|
|
399
|
+
* (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
|
|
400
|
+
*
|
|
401
|
+
* @option options [String,Number] :dl_dst
|
|
402
|
+
* the destination ethernet address to match specified either as a
|
|
403
|
+
* 6 pairs of hexadecimal digits delimited by colon or as a
|
|
404
|
+
* hexadecimal number or as a Trema::Mac object.
|
|
405
|
+
* (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
|
|
406
|
+
*
|
|
407
|
+
* @option options [Number] :dl_type
|
|
408
|
+
* the Ethernet protocol type to match. Can be specified either as a decimal
|
|
409
|
+
* or hexadecimal number. (eg 0x0800 to match IP packets, 0x08006 to match
|
|
410
|
+
* ARP packets, 0x88cc for LLDP packets).
|
|
411
|
+
*
|
|
412
|
+
* @option options [Number] :dl_vlan
|
|
413
|
+
* the IEEE 802.1q virtual VLAN tag to match specified as a 12-bit number
|
|
414
|
+
* 0 to 4095 inclusive.
|
|
415
|
+
*
|
|
416
|
+
* @option options [Number] :dl_vlan_pcp
|
|
417
|
+
* the IEEE 802.1q Priority Code Point (PCP) to match specified as a value of
|
|
418
|
+
* 0 to 7 inclusive. A higher value indicates a higher priority frame.
|
|
419
|
+
*
|
|
420
|
+
* @option options [Number] :nw_tos
|
|
421
|
+
* the IP ToS/DSCP field to match specified as a decimal number between 0 and
|
|
422
|
+
* 255 inclusive.
|
|
423
|
+
*
|
|
424
|
+
* @option options [Number] :nw_proto
|
|
425
|
+
* Depending on the dl_type the IP protocol type to match. (eg if dl_type
|
|
426
|
+
* equals 0x0800 UDP packets can be match by setting nw_proto to 17.)
|
|
427
|
+
* to match TCP packets). When dl_type = 0x0806 is set to arp it matches the
|
|
428
|
+
* lower 8 bits of the ARP opcode.
|
|
429
|
+
*
|
|
430
|
+
* @option options [String] :nw_src
|
|
431
|
+
* the IPv4 source address to match if dl_type is set to 0x0800.
|
|
432
|
+
*
|
|
433
|
+
* @option options [String] :nw_dst
|
|
434
|
+
* the IPv4 destination address to match if dl_type is set to 0x0800.
|
|
435
|
+
*
|
|
436
|
+
* @option options [Number] :tp_src
|
|
437
|
+
* the source TCP/UDP port number to match specified as a decimal number
|
|
438
|
+
* between 0 and 65535 inclusive. The value dl_type and nw_proto must be set
|
|
439
|
+
* to specify TCP or UDP.
|
|
440
|
+
*
|
|
441
|
+
* @option options [Number] :tp_dst
|
|
442
|
+
* the destination TCP/UDP port number to match specified as a decimal number
|
|
443
|
+
* between 0 and 65535 inclusive.
|
|
444
|
+
*
|
|
445
|
+
* @return [Match] self an object that encapsulates and wraps the +struct ofp_match+
|
|
446
|
+
*/
|
|
447
|
+
static VALUE
|
|
448
|
+
match_init( int argc, VALUE *argv, VALUE self ) {
|
|
449
|
+
struct ofp_match *match;
|
|
450
|
+
VALUE options;
|
|
451
|
+
|
|
452
|
+
// Always clear the memory as the unused memory locations are
|
|
453
|
+
// exposed to both the user and the OpenFlow controller.
|
|
454
|
+
Data_Get_Struct( self, struct ofp_match, match );
|
|
455
|
+
memset( match, 0, sizeof ( *match ) );
|
|
456
|
+
|
|
457
|
+
// Default matches all packets.
|
|
458
|
+
match->wildcards = ( OFPFW_ALL & ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK ) )
|
|
459
|
+
| OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL;
|
|
460
|
+
|
|
461
|
+
if ( rb_scan_args( argc, argv, "01", &options ) >= 1 ) {
|
|
462
|
+
if ( options != Qnil ) {
|
|
463
|
+
VALUE in_port = rb_hash_aref( options, ID2SYM( rb_intern( "in_port" ) ) );
|
|
464
|
+
if ( in_port != Qnil ) {
|
|
465
|
+
match->in_port = ( uint16_t ) NUM2UINT( in_port );
|
|
466
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_IN_PORT;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
VALUE dl_src = rb_hash_aref( options, ID2SYM( rb_intern( "dl_src" ) ) );
|
|
470
|
+
if ( dl_src != Qnil ) {
|
|
471
|
+
VALUE dl_addr;
|
|
472
|
+
if ( rb_obj_is_kind_of( dl_src, rb_eval_string( "Trema::Mac" ) ) ) {
|
|
473
|
+
dl_addr = dl_src;
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_src );
|
|
477
|
+
}
|
|
478
|
+
dl_addr_short( dl_addr, match->dl_src );
|
|
479
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_DL_SRC;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
VALUE dl_dst = rb_hash_aref( options, ID2SYM( rb_intern( "dl_dst" ) ) );
|
|
483
|
+
if ( dl_dst != Qnil ) {
|
|
484
|
+
VALUE dl_addr;
|
|
485
|
+
if ( rb_obj_is_kind_of( dl_dst, rb_eval_string( "Trema::Mac" ) ) ) {
|
|
486
|
+
dl_addr = dl_dst;
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_dst );
|
|
490
|
+
}
|
|
491
|
+
dl_addr_short( dl_addr, match->dl_dst );
|
|
492
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_DL_DST;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
VALUE dl_type = rb_hash_aref( options, ID2SYM( rb_intern( "dl_type" ) ) );
|
|
496
|
+
if ( dl_type != Qnil ) {
|
|
497
|
+
match->dl_type = ( uint16_t ) NUM2UINT( dl_type );
|
|
498
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_DL_TYPE;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
VALUE dl_vlan = rb_hash_aref( options, ID2SYM( rb_intern( "dl_vlan" ) ) );
|
|
502
|
+
if ( dl_vlan != Qnil ) {
|
|
503
|
+
match->dl_vlan = ( uint16_t ) NUM2UINT( dl_vlan );
|
|
504
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_DL_VLAN;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
VALUE dl_vlan_pcp = rb_hash_aref( options, ID2SYM( rb_intern( "dl_vlan_pcp" ) ) );
|
|
508
|
+
if ( dl_vlan_pcp != Qnil ) {
|
|
509
|
+
match->dl_vlan_pcp = ( uint8_t ) NUM2UINT( dl_vlan_pcp );
|
|
510
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_DL_VLAN_PCP;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
VALUE nw_tos = rb_hash_aref( options, ID2SYM( rb_intern( "nw_tos" ) ) );
|
|
514
|
+
if ( nw_tos != Qnil ) {
|
|
515
|
+
match->nw_tos = ( uint8_t ) NUM2UINT( nw_tos );
|
|
516
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_NW_TOS;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
VALUE nw_proto = rb_hash_aref( options, ID2SYM( rb_intern( "nw_proto" ) ) );
|
|
520
|
+
if ( nw_proto != Qnil ) {
|
|
521
|
+
match->nw_proto = ( uint8_t ) NUM2UINT( nw_proto );
|
|
522
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_NW_PROTO;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
VALUE nw_src = rb_hash_aref( options, ID2SYM( rb_intern( "nw_src" ) ) );
|
|
526
|
+
if ( nw_src != Qnil ) {
|
|
527
|
+
VALUE nw_addr = rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 1, nw_src );
|
|
528
|
+
uint32_t prefixlen = ( uint32_t ) NUM2UINT( rb_funcall( nw_addr, rb_intern( "prefixlen" ), 0 ) );
|
|
529
|
+
if ( prefixlen > 0 ) {
|
|
530
|
+
match->nw_src = nw_addr_to_i( nw_addr );
|
|
531
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_NW_SRC_MASK;
|
|
532
|
+
match->wildcards |= ( uint32_t ) ( ( 32 - prefixlen ) << OFPFW_NW_SRC_SHIFT );
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
VALUE nw_dst = rb_hash_aref( options, ID2SYM( rb_intern( "nw_dst" ) ) );
|
|
537
|
+
if ( nw_dst != Qnil ) {
|
|
538
|
+
VALUE nw_addr = rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 1, nw_dst );
|
|
539
|
+
uint32_t prefixlen = ( uint32_t ) NUM2UINT( rb_funcall( nw_addr, rb_intern( "prefixlen" ), 0 ) );
|
|
540
|
+
if ( prefixlen > 0 ) {
|
|
541
|
+
match->nw_dst = nw_addr_to_i( nw_addr );
|
|
542
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_NW_DST_MASK;
|
|
543
|
+
match->wildcards |= ( uint32_t ) ( ( 32 - prefixlen ) << OFPFW_NW_DST_SHIFT );
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
VALUE tp_src = rb_hash_aref( options, ID2SYM( rb_intern( "tp_src" ) ) );
|
|
548
|
+
if ( tp_src != Qnil ) {
|
|
549
|
+
match->tp_src = ( uint16_t ) NUM2UINT( tp_src );
|
|
550
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_TP_SRC;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
VALUE tp_dst = rb_hash_aref( options, ID2SYM( rb_intern( "tp_dst" ) ) );
|
|
554
|
+
if ( tp_dst != Qnil ) {
|
|
555
|
+
match->tp_dst = ( uint16_t ) NUM2UINT( tp_dst );
|
|
556
|
+
match->wildcards &= ( uint32_t ) ~OFPFW_TP_DST;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return self;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
void
|
|
565
|
+
Init_match() {
|
|
566
|
+
cMatch = rb_define_class_under( mTrema, "Match", rb_cObject );
|
|
567
|
+
rb_define_alloc_func( cMatch, match_alloc );
|
|
568
|
+
rb_define_method( cMatch, "initialize", match_init, -1 );
|
|
569
|
+
rb_define_method( cMatch, "compare", match_compare, 1 );
|
|
570
|
+
rb_define_method( cMatch, "replace", match_replace, 1 );
|
|
571
|
+
rb_define_method( cMatch, "to_s", match_to_s, 0 );
|
|
572
|
+
rb_define_method( cMatch, "wildcards", match_wildcards, 0 );
|
|
573
|
+
rb_define_method( cMatch, "in_port", match_in_port, 0 );
|
|
574
|
+
rb_define_method( cMatch, "dl_src", match_dl_src, 0 );
|
|
575
|
+
rb_define_method( cMatch, "dl_dst", match_dl_dst, 0 );
|
|
576
|
+
rb_define_method( cMatch, "dl_vlan", match_dl_vlan, 0 );
|
|
577
|
+
rb_define_method( cMatch, "dl_vlan_pcp", match_dl_vlan_pcp, 0 );
|
|
578
|
+
rb_define_method( cMatch, "dl_type", match_dl_type, 0 );
|
|
579
|
+
rb_define_method( cMatch, "nw_tos", match_nw_tos, 0 );
|
|
580
|
+
rb_define_method( cMatch, "nw_proto", match_nw_proto, 0 );
|
|
581
|
+
rb_define_method( cMatch, "nw_src", match_nw_src, 0 );
|
|
582
|
+
rb_define_method( cMatch, "nw_dst", match_nw_dst, 0 );
|
|
583
|
+
rb_define_method( cMatch, "tp_src", match_tp_src, 0 );
|
|
584
|
+
rb_define_method( cMatch, "tp_dst", match_tp_dst, 0 );
|
|
585
|
+
rb_define_singleton_method( cMatch, "from", match_from, -1 );
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
/*
|
|
590
|
+
* Local variables:
|
|
591
|
+
* c-basic-offset: 2
|
|
592
|
+
* indent-tabs-mode: nil
|
|
593
|
+
* End:
|
|
594
|
+
*/
|