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/log.h
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A simple logging library.
|
|
3
|
+
*
|
|
4
|
+
* Some good logging guidelines can be found here:
|
|
5
|
+
* http://watchitlater.com/blog/2009/12/logging-guidelines/
|
|
6
|
+
*
|
|
7
|
+
* Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
8
|
+
*
|
|
9
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
10
|
+
*
|
|
11
|
+
* This program is free software; you can redistribute it and/or modify
|
|
12
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
13
|
+
* published by the Free Software Foundation.
|
|
14
|
+
*
|
|
15
|
+
* This program is distributed in the hope that it will be useful,
|
|
16
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
17
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
18
|
+
* GNU General Public License for more details.
|
|
19
|
+
*
|
|
20
|
+
* You should have received a copy of the GNU General Public License along
|
|
21
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
22
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @file
|
|
28
|
+
*
|
|
29
|
+
* @brief Versatile support for logging messages with different levels
|
|
30
|
+
* of importance.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
#ifndef LOG_H
|
|
35
|
+
#define LOG_H
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#include "bool.h"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Constants specifying the level of log messages.
|
|
43
|
+
*/
|
|
44
|
+
typedef enum {
|
|
45
|
+
LOG_CRITICAL,
|
|
46
|
+
LOG_ERROR,
|
|
47
|
+
LOG_WARN,
|
|
48
|
+
LOG_NOTICE,
|
|
49
|
+
LOG_INFO,
|
|
50
|
+
LOG_DEBUG,
|
|
51
|
+
} logging_level;
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
bool init_log( const char *ident, const char *log_directory, bool run_as_daemon );
|
|
55
|
+
void restart_log( const char *ident, const char *log_directory );
|
|
56
|
+
void rename_log( const char *old_ident, const char *new_ident, const char *directory );
|
|
57
|
+
bool finalize_log( void );
|
|
58
|
+
|
|
59
|
+
bool set_logging_level( const char *level );
|
|
60
|
+
extern logging_level ( *get_logging_level )( void );
|
|
61
|
+
|
|
62
|
+
extern void ( *critical )( const char *format, ... );
|
|
63
|
+
extern void ( *error )( const char *format, ... );
|
|
64
|
+
extern void ( *warn )( const char *format, ... );
|
|
65
|
+
extern void ( *notice )( const char *format, ... );
|
|
66
|
+
extern void ( *info )( const char *format, ... );
|
|
67
|
+
extern void ( *debug )( const char *format, ... );
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
#endif // LOG_H
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* Local variables:
|
|
75
|
+
* c-basic-offset: 2
|
|
76
|
+
* indent-tabs-mode: nil
|
|
77
|
+
* End:
|
|
78
|
+
*/
|
data/src/lib/match.h
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* OpenFlow flow matching library
|
|
3
|
+
*
|
|
4
|
+
* Author: Yasunobu Chiba
|
|
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 MATCH_H
|
|
24
|
+
#define MATCH_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include <openflow.h>
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
#define COMPARE_MAC( _x, _y ) \
|
|
31
|
+
( ( ( ( uint16_t * ) &( _x ) )[ 0 ] == ( ( uint16_t * ) &( _y ) )[ 0 ] ) \
|
|
32
|
+
&& ( ( ( uint16_t * ) &( _x ) )[ 1 ] == ( ( uint16_t * ) &( _y ) )[ 1 ] ) \
|
|
33
|
+
&& ( ( ( uint16_t * ) &( _x ) )[ 2 ] == ( ( uint16_t * ) &( _y ) )[ 2 ] ) )
|
|
34
|
+
|
|
35
|
+
#define create_nw_src_mask( _w ) \
|
|
36
|
+
( { \
|
|
37
|
+
uint32_t _m = ( ( _w ) & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT; \
|
|
38
|
+
( _m >= 32 ) ? 0 : 0xffffffff << _m; \
|
|
39
|
+
} \
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
#define create_nw_dst_mask( _w ) \
|
|
43
|
+
( { \
|
|
44
|
+
uint32_t _m = ( ( _w ) & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT; \
|
|
45
|
+
( _m >= 32 ) ? 0 : 0xffffffff << _m; \
|
|
46
|
+
} \
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
#define compare_match( _x, _y ) \
|
|
50
|
+
( { \
|
|
51
|
+
uint32_t _w = ( _x )->wildcards | ( _y )->wildcards; \
|
|
52
|
+
uint32_t _sm = create_nw_src_mask( ( _x )->wildcards ) \
|
|
53
|
+
& create_nw_src_mask( ( _y )->wildcards ); \
|
|
54
|
+
uint32_t _dm = create_nw_dst_mask( ( _x )->wildcards ) \
|
|
55
|
+
& create_nw_dst_mask( ( _y )->wildcards ); \
|
|
56
|
+
( ( _w & OFPFW_IN_PORT || ( _x )->in_port == ( _y )->in_port ) \
|
|
57
|
+
&& ( _w & OFPFW_DL_VLAN || ( _x )->dl_vlan == ( _y )->dl_vlan ) \
|
|
58
|
+
&& ( _w & OFPFW_DL_VLAN_PCP || ( _x )->dl_vlan_pcp == ( _y )->dl_vlan_pcp ) \
|
|
59
|
+
&& ( _w & OFPFW_DL_SRC || COMPARE_MAC( ( _x )->dl_src, ( _y )->dl_src ) ) \
|
|
60
|
+
&& ( _w & OFPFW_DL_DST || COMPARE_MAC( ( _x )->dl_dst, ( _y )->dl_dst ) ) \
|
|
61
|
+
&& ( _w & OFPFW_DL_TYPE || ( _x )->dl_type == ( _y )->dl_type ) \
|
|
62
|
+
&& !( ( ( _x )->nw_src ^ ( _y )->nw_src ) & _sm ) \
|
|
63
|
+
&& !( ( ( _x )->nw_dst ^ ( _y )->nw_dst ) & _dm ) \
|
|
64
|
+
&& ( _w & OFPFW_NW_TOS || ( _x )->nw_tos == ( _y )->nw_tos ) \
|
|
65
|
+
&& ( _w & OFPFW_NW_PROTO || ( _x )->nw_proto == ( _y )->nw_proto ) \
|
|
66
|
+
&& ( _w & OFPFW_TP_SRC || ( _x )->tp_src == ( _y )->tp_src ) \
|
|
67
|
+
&& ( _w & OFPFW_TP_DST || ( _x )->tp_dst == ( _y )->tp_dst ) ); \
|
|
68
|
+
} \
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
#define compare_match_strict( _x, _y ) \
|
|
72
|
+
( ( ( ( ( _x )->wildcards ^ ( _y )->wildcards ) & OFPFW_ALL ) == 0 ) \
|
|
73
|
+
&& compare_match( ( _x ), ( _y ) ) )
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
#endif // MATCH_H
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Local variables:
|
|
81
|
+
* c-basic-offset: 2
|
|
82
|
+
* indent-tabs-mode: nil
|
|
83
|
+
* End:
|
|
84
|
+
*/
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Kazushi SUGYO
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
*
|
|
6
|
+
* This program is free software; you can redistribute it and/or modify
|
|
7
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
* published by the Free Software Foundation.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License along
|
|
16
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
#include <assert.h>
|
|
22
|
+
#include <pthread.h>
|
|
23
|
+
#include <stdlib.h>
|
|
24
|
+
#include <string.h>
|
|
25
|
+
#include <openflow.h>
|
|
26
|
+
#include "checks.h"
|
|
27
|
+
#include "match.h"
|
|
28
|
+
#include "match_table.h"
|
|
29
|
+
#include "log.h"
|
|
30
|
+
#include "wrapper.h"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#define VLAN_VID_MASK 0x0fff // 12 bits
|
|
34
|
+
#define VLAN_PCP_MASK 0x07 // 3 bits
|
|
35
|
+
#define NW_TOS_MASK 0x3f // 6 bits
|
|
36
|
+
|
|
37
|
+
#define MATCH_STRING_LENGTH 1024
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
typedef struct {
|
|
41
|
+
struct ofp_match match; // match data. host byte order
|
|
42
|
+
uint16_t priority;
|
|
43
|
+
void *data;
|
|
44
|
+
} match_entry;
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
typedef struct {
|
|
48
|
+
hash_table *exact_table; // no wildcards are set
|
|
49
|
+
list_element *wildcards_table; // wildcards flags are set
|
|
50
|
+
pthread_mutex_t *mutex;
|
|
51
|
+
} match_table;
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
typedef struct {
|
|
55
|
+
struct ofp_match *match;
|
|
56
|
+
void ( * function )( struct ofp_match, uint16_t, void *, void * );
|
|
57
|
+
void *user_data;
|
|
58
|
+
} match_walker;
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
match_table *_match_table_head = NULL; // non-static variable for use in unit testing
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
static inline bool
|
|
65
|
+
exact_match( struct ofp_match *match ) {
|
|
66
|
+
assert( match != NULL );
|
|
67
|
+
|
|
68
|
+
return ( ( match->wildcards & OFPFW_ALL ) == 0 );
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
static match_entry *
|
|
73
|
+
allocate_match_entry( struct ofp_match *match, uint16_t priority, void *data ) {
|
|
74
|
+
match_entry *new_entry = xmalloc( sizeof( match_entry ) );
|
|
75
|
+
new_entry->match = *match;
|
|
76
|
+
new_entry->priority = priority;
|
|
77
|
+
new_entry->data = data;
|
|
78
|
+
|
|
79
|
+
return new_entry;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
static void
|
|
84
|
+
free_match_entry( match_entry *free_entry ) {
|
|
85
|
+
assert( free_entry != NULL );
|
|
86
|
+
|
|
87
|
+
xfree( free_entry );
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
static bool
|
|
92
|
+
compare_filter_match( struct ofp_match *x, struct ofp_match *y ) {
|
|
93
|
+
uint32_t w_x = x->wildcards & OFPFW_ALL;
|
|
94
|
+
uint32_t w_y = y->wildcards & OFPFW_ALL;
|
|
95
|
+
uint32_t sm_x = create_nw_src_mask( w_x );
|
|
96
|
+
uint32_t dm_x = create_nw_dst_mask( w_x );
|
|
97
|
+
uint32_t sm_y = create_nw_src_mask( w_y );
|
|
98
|
+
uint32_t dm_y = create_nw_dst_mask( w_y );
|
|
99
|
+
|
|
100
|
+
w_x &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
|
|
101
|
+
w_y &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
|
|
102
|
+
if ( ( ~w_x & w_y ) != 0 ) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if ( sm_x > sm_y ) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if ( dm_x > dm_y ) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return ( ( w_x & OFPFW_IN_PORT || x->in_port == y->in_port )
|
|
113
|
+
&& ( w_x & OFPFW_DL_VLAN || x->dl_vlan == y->dl_vlan )
|
|
114
|
+
&& ( w_x & OFPFW_DL_VLAN_PCP || x->dl_vlan_pcp == y->dl_vlan_pcp )
|
|
115
|
+
&& ( w_x & OFPFW_DL_SRC || COMPARE_MAC( x->dl_src, y->dl_src ) )
|
|
116
|
+
&& ( w_x & OFPFW_DL_DST || COMPARE_MAC( x->dl_dst, y->dl_dst ) )
|
|
117
|
+
&& ( w_x & OFPFW_DL_TYPE || x->dl_type == y->dl_type )
|
|
118
|
+
&& !( ( x->nw_src ^ y->nw_src ) & sm_x )
|
|
119
|
+
&& !( ( x->nw_dst ^ y->nw_dst ) & dm_x )
|
|
120
|
+
&& ( w_x & OFPFW_NW_TOS || x->nw_tos == y->nw_tos )
|
|
121
|
+
&& ( w_x & OFPFW_NW_PROTO || x->nw_proto == y->nw_proto )
|
|
122
|
+
&& ( w_x & OFPFW_TP_SRC || x->tp_src == y->tp_src )
|
|
123
|
+
&& ( w_x & OFPFW_TP_DST || x->tp_dst == y->tp_dst ) ) != 0 ? true : false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
static bool
|
|
128
|
+
compare_exact_match_entry( const void *x, const void *y ) {
|
|
129
|
+
assert( x != NULL );
|
|
130
|
+
assert( y != NULL );
|
|
131
|
+
|
|
132
|
+
const struct ofp_match *xofp_match = x;
|
|
133
|
+
const struct ofp_match *yofp_match = y;
|
|
134
|
+
return compare_match_strict( xofp_match, yofp_match );
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
static unsigned int
|
|
139
|
+
hash_exact_match_entry( const void *key ) {
|
|
140
|
+
assert( key != NULL );
|
|
141
|
+
const struct ofp_match *match = key;
|
|
142
|
+
|
|
143
|
+
uint16_t dl_vlan = match->dl_vlan;
|
|
144
|
+
if ( dl_vlan != UINT16_MAX ) {
|
|
145
|
+
dl_vlan = ( uint16_t ) ( dl_vlan & VLAN_VID_MASK );
|
|
146
|
+
}
|
|
147
|
+
uint8_t dl_vlan_pcp = ( uint8_t ) ( match->dl_vlan_pcp & VLAN_PCP_MASK );
|
|
148
|
+
uint8_t nw_tos = ( uint8_t ) ( match->nw_tos & NW_TOS_MASK );
|
|
149
|
+
|
|
150
|
+
unsigned int hash = 0;
|
|
151
|
+
hash ^= ( unsigned int ) ( match->in_port << 16 );
|
|
152
|
+
hash ^= ( unsigned int ) hash_mac( match->dl_src );
|
|
153
|
+
hash ^= ( unsigned int ) hash_mac( match->dl_dst );
|
|
154
|
+
hash ^= dl_vlan;
|
|
155
|
+
hash ^= ( unsigned int ) ( dl_vlan_pcp << 24 );
|
|
156
|
+
hash ^= ( unsigned int ) ( match->dl_type << 8 );
|
|
157
|
+
hash ^= nw_tos;
|
|
158
|
+
hash ^= ( unsigned int ) ( match->nw_proto << 24 );
|
|
159
|
+
hash ^= match->nw_src;
|
|
160
|
+
hash ^= match->nw_dst;
|
|
161
|
+
hash ^= ( unsigned int ) ( match->tp_src << 16 );
|
|
162
|
+
hash ^= match->tp_dst;
|
|
163
|
+
|
|
164
|
+
return hash;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
static void
|
|
169
|
+
init_exact_match_table( hash_table **exact_table ) {
|
|
170
|
+
assert( exact_table != NULL );
|
|
171
|
+
|
|
172
|
+
*exact_table = create_hash( compare_exact_match_entry, hash_exact_match_entry );
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
static void
|
|
177
|
+
free_exact_match_entry( void *key, void *value, void *user_data ) {
|
|
178
|
+
UNUSED( key );
|
|
179
|
+
assert( value != NULL );
|
|
180
|
+
UNUSED( user_data );
|
|
181
|
+
|
|
182
|
+
match_entry *entry = value;
|
|
183
|
+
|
|
184
|
+
free_match_entry( entry );
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
static void
|
|
189
|
+
finalize_exact_match_table( hash_table *exact_table ) {
|
|
190
|
+
assert( exact_table != NULL );
|
|
191
|
+
|
|
192
|
+
foreach_hash( exact_table, free_exact_match_entry, NULL );
|
|
193
|
+
delete_hash( exact_table );
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
static bool
|
|
198
|
+
insert_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
|
|
199
|
+
assert( exact_table != NULL );
|
|
200
|
+
assert( match != NULL );
|
|
201
|
+
|
|
202
|
+
match_entry *entry = lookup_hash_entry( exact_table, match );
|
|
203
|
+
if ( entry != NULL ) {
|
|
204
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
205
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
206
|
+
warn( "exact match entry already exists ( match = [%s] )", match_string );
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
match_entry *new_entry = allocate_match_entry( match, 0 /* dummy priority */, data );
|
|
210
|
+
match_entry *conflict_entry = insert_hash_entry( exact_table, &new_entry->match, new_entry );
|
|
211
|
+
assert( conflict_entry == NULL );
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
static match_entry *
|
|
217
|
+
lookup_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
|
|
218
|
+
assert( exact_table != NULL );
|
|
219
|
+
assert( match != NULL );
|
|
220
|
+
|
|
221
|
+
return lookup_hash_entry( exact_table, match );
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
#define lookup_exact_match_entry( table, match ) lookup_exact_match_strict_entry( table, match )
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
static bool
|
|
229
|
+
update_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
|
|
230
|
+
assert( exact_table != NULL );
|
|
231
|
+
assert( match != NULL );
|
|
232
|
+
|
|
233
|
+
match_entry *entry = lookup_exact_match_strict_entry( exact_table, match );
|
|
234
|
+
if ( entry == NULL ) {
|
|
235
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
236
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
237
|
+
warn( "exact match entry not found ( match = [%s] )",
|
|
238
|
+
match_string );
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
entry->data = data;
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
static void *
|
|
247
|
+
delete_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
|
|
248
|
+
assert( exact_table != NULL );
|
|
249
|
+
assert( match != NULL );
|
|
250
|
+
|
|
251
|
+
match_entry *entry = lookup_hash_entry( exact_table, match );
|
|
252
|
+
if ( entry == NULL ) {
|
|
253
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
254
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
255
|
+
warn( "exact match entry not found ( match = [%s] )",
|
|
256
|
+
match_string );
|
|
257
|
+
return NULL;
|
|
258
|
+
}
|
|
259
|
+
void *data = entry->data;
|
|
260
|
+
delete_hash_entry( exact_table, match );
|
|
261
|
+
free_match_entry( entry );
|
|
262
|
+
return data;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
static void
|
|
267
|
+
exact_match_table_walker( void *key, void *value, void *user_data ) {
|
|
268
|
+
UNUSED( key );
|
|
269
|
+
assert( value != NULL );
|
|
270
|
+
match_walker *walker = user_data;
|
|
271
|
+
assert( walker != NULL );
|
|
272
|
+
assert( walker->function != NULL );
|
|
273
|
+
|
|
274
|
+
match_entry *entry = value;
|
|
275
|
+
if ( walker->match != NULL ) {
|
|
276
|
+
if ( !compare_filter_match( walker->match, &entry->match ) ) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
void ( * function )( struct ofp_match, uint16_t, void *, void * ) = walker->function;
|
|
281
|
+
|
|
282
|
+
function( entry->match, entry->priority, entry->data, walker->user_data );
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
static void
|
|
287
|
+
map_exact_match_table( hash_table *exact_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void *user_data ) {
|
|
288
|
+
assert( exact_table != NULL );
|
|
289
|
+
assert( function != NULL );
|
|
290
|
+
match_walker walker;
|
|
291
|
+
walker.match = match;
|
|
292
|
+
walker.function = function;
|
|
293
|
+
walker.user_data = user_data;
|
|
294
|
+
foreach_hash( exact_table, exact_match_table_walker, &walker );
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
static void
|
|
299
|
+
init_wildcards_match_table( list_element **wildcards_table ) {
|
|
300
|
+
assert( wildcards_table != NULL);
|
|
301
|
+
|
|
302
|
+
create_list( wildcards_table );
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
static void
|
|
307
|
+
finalize_wildcards_match_table( list_element *wildcards_table ) {
|
|
308
|
+
list_element *element;
|
|
309
|
+
for ( element = wildcards_table; element != NULL; element = element->next ) {
|
|
310
|
+
free_match_entry( element->data );
|
|
311
|
+
element->data = NULL;
|
|
312
|
+
}
|
|
313
|
+
delete_list( wildcards_table );
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
static bool
|
|
318
|
+
insert_wildcards_match_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
|
|
319
|
+
assert( match != NULL );
|
|
320
|
+
|
|
321
|
+
list_element *element;
|
|
322
|
+
for ( element = *wildcards_table; element != NULL; element = element->next ) {
|
|
323
|
+
match_entry *entry = element->data;
|
|
324
|
+
if ( entry->priority < priority ) {
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
assert( entry != NULL );
|
|
328
|
+
if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
|
|
329
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
330
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
331
|
+
warn( "wildcards match entry already exists ( match = [%s], priority = %u )",
|
|
332
|
+
match_string, priority );
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
match_entry *new_entry = allocate_match_entry( match, priority, data );
|
|
337
|
+
if ( element == NULL ) {
|
|
338
|
+
// tail
|
|
339
|
+
append_to_tail( wildcards_table, new_entry );
|
|
340
|
+
}
|
|
341
|
+
else if ( element == *wildcards_table ) {
|
|
342
|
+
// head
|
|
343
|
+
insert_in_front( wildcards_table, new_entry );
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
// insert before
|
|
347
|
+
insert_before( wildcards_table, element->data, new_entry );
|
|
348
|
+
}
|
|
349
|
+
return true;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
static match_entry *
|
|
354
|
+
lookup_wildcards_match_strict_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority ) {
|
|
355
|
+
assert( match != NULL );
|
|
356
|
+
|
|
357
|
+
list_element *element;
|
|
358
|
+
for ( element = wildcards_table; element != NULL; element = element->next ) {
|
|
359
|
+
match_entry *entry = element->data;
|
|
360
|
+
if ( entry->priority < priority ) {
|
|
361
|
+
break;
|
|
362
|
+
}
|
|
363
|
+
if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
|
|
364
|
+
return entry;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return NULL;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
static match_entry *
|
|
372
|
+
lookup_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match ) {
|
|
373
|
+
assert( match != NULL );
|
|
374
|
+
|
|
375
|
+
list_element *element;
|
|
376
|
+
for ( element = wildcards_table; element != NULL; element = element->next ) {
|
|
377
|
+
match_entry *entry = element->data;
|
|
378
|
+
if ( compare_match( &entry->match, match ) ) {
|
|
379
|
+
return entry;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return NULL;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
static bool
|
|
387
|
+
update_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
|
|
388
|
+
assert( match != NULL );
|
|
389
|
+
|
|
390
|
+
match_entry *entry = lookup_wildcards_match_strict_entry( wildcards_table, match, priority );
|
|
391
|
+
if ( entry == NULL ) {
|
|
392
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
393
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
394
|
+
warn( "wildcards match entry not found ( match = [%s], priority = %u )",
|
|
395
|
+
match_string, priority );
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
entry->data = data;
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
static void *
|
|
404
|
+
delete_wildcards_match_strict_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority ) {
|
|
405
|
+
assert( match != NULL );
|
|
406
|
+
|
|
407
|
+
match_entry *entry = lookup_wildcards_match_strict_entry( *wildcards_table, match, priority );
|
|
408
|
+
if ( entry == NULL ) {
|
|
409
|
+
char match_string[ MATCH_STRING_LENGTH ];
|
|
410
|
+
match_to_string( match, match_string, sizeof( match_string ) );
|
|
411
|
+
warn( "wildcards match entry not found ( match = [%s], priority = %u )",
|
|
412
|
+
match_string, priority );
|
|
413
|
+
return NULL;
|
|
414
|
+
}
|
|
415
|
+
void *data = entry->data;
|
|
416
|
+
delete_element( wildcards_table, entry );
|
|
417
|
+
free_match_entry( entry );
|
|
418
|
+
return data;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
static void
|
|
423
|
+
map_wildcards_match_table( list_element *wildcards_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void * user_data ) {
|
|
424
|
+
assert( function != NULL );
|
|
425
|
+
|
|
426
|
+
list_element *element = wildcards_table;
|
|
427
|
+
while ( element != NULL ) {
|
|
428
|
+
match_entry *entry = element->data;
|
|
429
|
+
element = element->next;
|
|
430
|
+
if ( match != NULL ) {
|
|
431
|
+
if ( !compare_filter_match( match, &entry->match ) ) {
|
|
432
|
+
continue;
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
function( entry->match, entry->priority, entry->data, user_data );
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
void
|
|
441
|
+
init_match_table( void ) {
|
|
442
|
+
if ( _match_table_head != NULL ) {
|
|
443
|
+
die( "match table is already initialized." );
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
match_table *table = xmalloc( sizeof( match_table ) );
|
|
447
|
+
init_exact_match_table( &table->exact_table );
|
|
448
|
+
init_wildcards_match_table( &table->wildcards_table );
|
|
449
|
+
pthread_mutexattr_t attr;
|
|
450
|
+
pthread_mutexattr_init( &attr );
|
|
451
|
+
pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE_NP );
|
|
452
|
+
table->mutex = xmalloc( sizeof( pthread_mutex_t ) );
|
|
453
|
+
pthread_mutex_init( table->mutex, &attr );
|
|
454
|
+
|
|
455
|
+
_match_table_head = table;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
void
|
|
460
|
+
finalize_match_table( void ) {
|
|
461
|
+
if ( _match_table_head == NULL ) {
|
|
462
|
+
die( "match table is not initialized." );
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
pthread_mutex_t *mutex = _match_table_head->mutex;
|
|
466
|
+
|
|
467
|
+
pthread_mutex_lock( mutex );
|
|
468
|
+
finalize_exact_match_table( _match_table_head->exact_table );
|
|
469
|
+
finalize_wildcards_match_table( _match_table_head->wildcards_table );
|
|
470
|
+
xfree( _match_table_head );
|
|
471
|
+
_match_table_head = NULL;
|
|
472
|
+
pthread_mutex_unlock( mutex );
|
|
473
|
+
pthread_mutex_destroy( mutex );
|
|
474
|
+
xfree( mutex );
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
bool
|
|
479
|
+
insert_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
|
|
480
|
+
if ( _match_table_head == NULL ) {
|
|
481
|
+
die( "match table is not initialized." );
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
485
|
+
bool result;
|
|
486
|
+
if ( exact_match( &match ) ) {
|
|
487
|
+
result = insert_exact_match_entry( _match_table_head->exact_table, &match, data );
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
// wildcards flags are set
|
|
491
|
+
result = insert_wildcards_match_entry( &_match_table_head->wildcards_table, &match, priority, data );
|
|
492
|
+
}
|
|
493
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
494
|
+
return result;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
void *
|
|
499
|
+
lookup_match_strict_entry( struct ofp_match match, uint16_t priority ) {
|
|
500
|
+
if ( _match_table_head == NULL ) {
|
|
501
|
+
die( "match table is not initialized." );
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
505
|
+
match_entry *entry;
|
|
506
|
+
if ( exact_match( &match ) ) {
|
|
507
|
+
entry = lookup_exact_match_strict_entry( _match_table_head->exact_table, &match );
|
|
508
|
+
}
|
|
509
|
+
else {
|
|
510
|
+
entry = lookup_wildcards_match_strict_entry( _match_table_head->wildcards_table, &match, priority );
|
|
511
|
+
}
|
|
512
|
+
void *data = ( entry != NULL ? entry->data : NULL );
|
|
513
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
514
|
+
return data;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
void *
|
|
519
|
+
lookup_match_entry( struct ofp_match match ) {
|
|
520
|
+
if ( _match_table_head == NULL ) {
|
|
521
|
+
die( "match table is not initialized." );
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
525
|
+
match_entry *entry = lookup_exact_match_entry( _match_table_head->exact_table, &match );
|
|
526
|
+
if ( entry == NULL ) {
|
|
527
|
+
entry = lookup_wildcards_match_entry( _match_table_head->wildcards_table, &match );
|
|
528
|
+
}
|
|
529
|
+
void *data = ( entry != NULL ? entry->data : NULL );
|
|
530
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
531
|
+
return data;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
bool
|
|
536
|
+
update_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
|
|
537
|
+
if ( _match_table_head == NULL ) {
|
|
538
|
+
die( "match table is not initialized." );
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
542
|
+
bool result;
|
|
543
|
+
if ( exact_match( &match ) ) {
|
|
544
|
+
result = update_exact_match_entry( _match_table_head->exact_table, &match, data );
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
// wildcards flags are set
|
|
548
|
+
result = update_wildcards_match_entry( _match_table_head->wildcards_table, &match, priority, data );
|
|
549
|
+
}
|
|
550
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
551
|
+
return result;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
void *
|
|
556
|
+
delete_match_strict_entry( struct ofp_match match, uint16_t priority ) {
|
|
557
|
+
if ( _match_table_head == NULL ) {
|
|
558
|
+
die( "match table is not initialized." );
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
562
|
+
void *data = NULL;
|
|
563
|
+
if ( exact_match( &match ) ) {
|
|
564
|
+
data = delete_exact_match_strict_entry( _match_table_head->exact_table, &match );
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
// wildcards flags are set
|
|
568
|
+
data = delete_wildcards_match_strict_entry( &_match_table_head->wildcards_table, &match, priority );
|
|
569
|
+
}
|
|
570
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
571
|
+
return data;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
static void
|
|
576
|
+
_map_match_table( struct ofp_match *match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
|
|
577
|
+
if ( _match_table_head == NULL ) {
|
|
578
|
+
die( "match table is not initialized." );
|
|
579
|
+
}
|
|
580
|
+
if ( function == NULL ) {
|
|
581
|
+
die( "function must not be NULL" );
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
pthread_mutex_lock( _match_table_head->mutex );
|
|
585
|
+
map_exact_match_table( _match_table_head->exact_table, match, function, user_data );
|
|
586
|
+
map_wildcards_match_table( _match_table_head->wildcards_table, match, function, user_data );
|
|
587
|
+
pthread_mutex_unlock( _match_table_head->mutex );
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
void
|
|
592
|
+
foreach_match_table( void function( struct ofp_match, uint16_t, void *, void *), void *user_data ) {
|
|
593
|
+
_map_match_table( NULL, function, user_data );
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
void
|
|
598
|
+
map_match_table( struct ofp_match match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
|
|
599
|
+
_map_match_table( &match, function, user_data );
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
/*
|
|
604
|
+
* Local variables:
|
|
605
|
+
* c-basic-offset: 2
|
|
606
|
+
* indent-tabs-mode: nil
|
|
607
|
+
* End:
|
|
608
|
+
*/
|