trema 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.mono.rant +4107 -0
- data/.rspec +1 -0
- data/.yardopts +4 -0
- data/Doxyfile +1679 -0
- data/GPL2 +339 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +71 -0
- data/README.md +135 -0
- data/Rakefile +140 -0
- data/Rantfile +834 -0
- data/VERSION +1 -0
- data/build.rb +32 -0
- data/cruise.rb +389 -0
- data/features/example.dumper.feature +87 -0
- data/features/example.learning_switch.feature +39 -0
- data/features/example.list_switches.feature +38 -0
- data/features/example.message.echo_reply.feature +26 -0
- data/features/example.message.echo_request.feature +25 -0
- data/features/example.message.features_request.feature +84 -0
- data/features/example.message.hello.feature +25 -0
- data/features/example.message.set_config.feature +27 -0
- data/features/example.multi_learning_switch.feature +135 -0
- data/features/example.packetin_filter_config.feature +91 -0
- data/features/example.repeater_hub.feature +49 -0
- data/features/example.switch_monitor.feature +39 -0
- data/features/packetin_filter.feature +49 -0
- data/features/step_definitions/kill_steps.rb +30 -0
- data/features/step_definitions/log_steps.rb +90 -0
- data/features/step_definitions/misc_steps.rb +64 -0
- data/features/step_definitions/off_steps.rb +30 -0
- data/features/step_definitions/run_steps.rb +91 -0
- data/features/step_definitions/send_packets_steps.rb +42 -0
- data/features/step_definitions/show_stats_steps.rb +43 -0
- data/features/step_definitions/stats_steps.rb +39 -0
- data/features/support/env.rb +75 -0
- data/features/support/hooks.rb +8 -0
- data/features/switch_manager.feature +35 -0
- data/features/trema-config.feature +68 -0
- data/features/trema.dump_flows.feature +25 -0
- data/features/trema.feature +25 -0
- data/features/trema.kill.feature +53 -0
- data/features/trema.killall.feature +30 -0
- data/features/trema.reset_stats.feature +14 -0
- data/features/trema.run.feature +46 -0
- data/features/trema.send_packets.feature +56 -0
- data/features/trema.show_stats.feature +67 -0
- data/features/tutorial.hello_trema.feature +27 -0
- data/features/tutorial.packet_in.feature +47 -0
- data/features/tutorial.switch_info.feature +55 -0
- data/ruby/.gitignore +4 -0
- data/ruby/blocker.rb +78 -0
- data/ruby/extconf.rb +71 -0
- data/ruby/sub-process.rb +291 -0
- data/ruby/trema/action-common.c +60 -0
- data/ruby/trema/action-common.h +42 -0
- data/ruby/trema/action-enqueue.c +161 -0
- data/ruby/trema/action-enqueue.h +40 -0
- data/ruby/trema/action-output.c +169 -0
- data/ruby/trema/action-output.h +42 -0
- data/ruby/trema/action-set-dl-dst.c +131 -0
- data/ruby/trema/action-set-dl-dst.h +44 -0
- data/ruby/trema/action-set-dl-src.c +131 -0
- data/ruby/trema/action-set-dl-src.h +44 -0
- data/ruby/trema/action-set-nw-dst.c +135 -0
- data/ruby/trema/action-set-nw-dst.h +42 -0
- data/ruby/trema/action-set-nw-src.c +140 -0
- data/ruby/trema/action-set-nw-src.h +42 -0
- data/ruby/trema/action-set-nw-tos.c +124 -0
- data/ruby/trema/action-set-nw-tos.h +42 -0
- data/ruby/trema/action-set-tp-dst.c +122 -0
- data/ruby/trema/action-set-tp-dst.h +42 -0
- data/ruby/trema/action-set-tp-src.c +124 -0
- data/ruby/trema/action-set-tp-src.h +42 -0
- data/ruby/trema/action-set-vlan-pcp.c +128 -0
- data/ruby/trema/action-set-vlan-pcp.h +42 -0
- data/ruby/trema/action-set-vlan-vid.c +125 -0
- data/ruby/trema/action-set-vlan-vid.h +42 -0
- data/ruby/trema/action-strip-vlan.c +81 -0
- data/ruby/trema/action-strip-vlan.h +42 -0
- data/ruby/trema/action-vendor.c +121 -0
- data/ruby/trema/action-vendor.h +42 -0
- data/ruby/trema/aggregate-stats-reply.rb +70 -0
- data/ruby/trema/app.rb +112 -0
- data/ruby/trema/barrier-reply.c +99 -0
- data/ruby/trema/barrier-reply.h +46 -0
- data/ruby/trema/barrier-request.c +108 -0
- data/ruby/trema/barrier-request.h +44 -0
- data/ruby/trema/cli.rb +269 -0
- data/ruby/trema/command.rb +40 -0
- data/ruby/trema/command/dump_flows.rb +62 -0
- data/ruby/trema/command/kill.rb +71 -0
- data/ruby/trema/command/killall.rb +56 -0
- data/ruby/trema/command/reset_stats.rb +61 -0
- data/ruby/trema/command/ruby.rb +55 -0
- data/ruby/trema/command/run.rb +120 -0
- data/ruby/trema/command/send_packets.rb +130 -0
- data/ruby/trema/command/shell.rb +61 -0
- data/ruby/trema/command/show_stats.rb +84 -0
- data/ruby/trema/command/usage.rb +61 -0
- data/ruby/trema/command/version.rb +39 -0
- data/ruby/trema/controller.c +595 -0
- data/ruby/trema/controller.h +44 -0
- data/ruby/trema/controller.rb +81 -0
- data/ruby/trema/daemon.rb +167 -0
- data/ruby/trema/dsl.rb +34 -0
- data/ruby/trema/dsl/configuration.rb +153 -0
- data/ruby/trema/dsl/context.rb +71 -0
- data/ruby/trema/dsl/link.rb +41 -0
- data/ruby/trema/dsl/parser.rb +70 -0
- data/ruby/trema/dsl/run.rb +49 -0
- data/ruby/trema/dsl/runner.rb +165 -0
- data/ruby/trema/dsl/stanza.rb +53 -0
- data/ruby/trema/dsl/switch.rb +78 -0
- data/ruby/trema/dsl/syntax-error.rb +33 -0
- data/ruby/trema/dsl/syntax.rb +109 -0
- data/ruby/trema/dsl/vhost.rb +108 -0
- data/ruby/trema/dsl/vswitch.rb +47 -0
- data/ruby/trema/echo-reply.c +107 -0
- data/ruby/trema/echo-reply.h +42 -0
- data/ruby/trema/echo-request.c +140 -0
- data/ruby/trema/echo-request.h +42 -0
- data/ruby/trema/error.c +253 -0
- data/ruby/trema/error.h +44 -0
- data/ruby/trema/exact-match.rb +36 -0
- data/ruby/trema/executables.rb +95 -0
- data/ruby/trema/features-reply.c +238 -0
- data/ruby/trema/features-reply.h +60 -0
- data/ruby/trema/features-request.c +109 -0
- data/ruby/trema/features-request.h +44 -0
- data/ruby/trema/flow-removed.c +275 -0
- data/ruby/trema/flow-removed.h +46 -0
- data/ruby/trema/flow-stats-reply.rb +109 -0
- data/ruby/trema/flow.rb +56 -0
- data/ruby/trema/get-config-reply.c +159 -0
- data/ruby/trema/get-config-reply.h +52 -0
- data/ruby/trema/get-config-request.c +107 -0
- data/ruby/trema/get-config-request.h +44 -0
- data/ruby/trema/hello.c +110 -0
- data/ruby/trema/hello.h +44 -0
- data/ruby/trema/host.rb +257 -0
- data/ruby/trema/ip.rb +101 -0
- data/ruby/trema/link.rb +176 -0
- data/ruby/trema/list-switches-reply.c +46 -0
- data/ruby/trema/list-switches-reply.h +40 -0
- data/ruby/trema/logger.c +162 -0
- data/ruby/trema/logger.h +44 -0
- data/ruby/trema/mac.rb +151 -0
- data/ruby/trema/match.c +594 -0
- data/ruby/trema/match.h +36 -0
- data/ruby/trema/monkey-patch/integer.rb +35 -0
- data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
- data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
- data/ruby/trema/monkey-patch/module.rb +33 -0
- data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
- data/ruby/trema/monkey-patch/string.rb +33 -0
- data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
- data/ruby/trema/network-component.rb +153 -0
- data/ruby/trema/ofctl.rb +62 -0
- data/ruby/trema/open-vswitch.rb +154 -0
- data/ruby/trema/openflow-error.c +191 -0
- data/ruby/trema/openflow-error.h +53 -0
- data/ruby/trema/openflow-switch.rb +88 -0
- data/ruby/trema/ordered-hash.rb +74 -0
- data/ruby/trema/packet-queue.rb +178 -0
- data/ruby/trema/packet_in.c +736 -0
- data/ruby/trema/packet_in.h +46 -0
- data/ruby/trema/packetin-filter.rb +126 -0
- data/ruby/trema/path.rb +135 -0
- data/ruby/trema/phost.rb +69 -0
- data/ruby/trema/port-mod.c +226 -0
- data/ruby/trema/port-mod.h +36 -0
- data/ruby/trema/port-stats-reply.rb +111 -0
- data/ruby/trema/port-status.c +156 -0
- data/ruby/trema/port-status.h +45 -0
- data/ruby/trema/port.c +295 -0
- data/ruby/trema/port.h +47 -0
- data/ruby/trema/process.rb +76 -0
- data/ruby/trema/queue-get-config-reply.c +200 -0
- data/ruby/trema/queue-get-config-reply.h +47 -0
- data/ruby/trema/queue-get-config-request.c +141 -0
- data/ruby/trema/queue-get-config-request.h +44 -0
- data/ruby/trema/queue-stats-reply.rb +78 -0
- data/ruby/trema/set-config.c +171 -0
- data/ruby/trema/set-config.h +44 -0
- data/ruby/trema/shell.rb +39 -0
- data/ruby/trema/shell/down.rb +39 -0
- data/ruby/trema/shell/killall.rb +40 -0
- data/ruby/trema/shell/link.rb +61 -0
- data/ruby/trema/shell/reset_stats.rb +50 -0
- data/ruby/trema/shell/run.rb +67 -0
- data/ruby/trema/shell/send_packets.rb +42 -0
- data/ruby/trema/shell/show_stats.rb +49 -0
- data/ruby/trema/shell/up.rb +43 -0
- data/ruby/trema/shell/vhost.rb +44 -0
- data/ruby/trema/shell/vswitch.rb +49 -0
- data/ruby/trema/stats-helper.rb +65 -0
- data/ruby/trema/stats-reply.c +483 -0
- data/ruby/trema/stats-reply.h +53 -0
- data/ruby/trema/stats-request.c +634 -0
- data/ruby/trema/stats-request.h +42 -0
- data/ruby/trema/switch-daemon.rb +74 -0
- data/ruby/trema/switch-disconnected.c +40 -0
- data/ruby/trema/switch-disconnected.h +38 -0
- data/ruby/trema/switch-manager.rb +121 -0
- data/ruby/trema/switch.rb +37 -0
- data/ruby/trema/table-stats-reply.rb +87 -0
- data/ruby/trema/timers.rb +97 -0
- data/ruby/trema/trema.c +122 -0
- data/ruby/trema/tremashark.rb +39 -0
- data/ruby/trema/util.rb +84 -0
- data/ruby/trema/vendor-request.c +193 -0
- data/ruby/trema/vendor-request.h +44 -0
- data/ruby/trema/vendor-stats-reply.rb +62 -0
- data/ruby/trema/vendor.c +152 -0
- data/ruby/trema/vendor.h +52 -0
- data/ruby/trema/version.rb +30 -0
- data/spec/spec_helper.rb +153 -0
- data/spec/support/openflow-message.rb +94 -0
- data/spec/trema/action-enqueue_spec.rb +100 -0
- data/spec/trema/action-output_spec.rb +116 -0
- data/spec/trema/action-set-dl-dst_spec.rb +95 -0
- data/spec/trema/action-set-dl-src_spec.rb +92 -0
- data/spec/trema/action-set-nw-dst_spec.rb +96 -0
- data/spec/trema/action-set-nw-src_spec.rb +97 -0
- data/spec/trema/action-set-nw-tos_spec.rb +88 -0
- data/spec/trema/action-set-tp-dst_spec.rb +88 -0
- data/spec/trema/action-set-tp-src_spec.rb +88 -0
- data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
- data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
- data/spec/trema/action-strip-vlan_spec.rb +57 -0
- data/spec/trema/action-vendor_spec.rb +90 -0
- data/spec/trema/app_spec.rb +90 -0
- data/spec/trema/barrier-reply_spec.rb +45 -0
- data/spec/trema/barrier-request_spec.rb +83 -0
- data/spec/trema/cli_spec.rb +160 -0
- data/spec/trema/controller_spec.rb +100 -0
- data/spec/trema/dsl/configuration_spec.rb +122 -0
- data/spec/trema/dsl/link_spec.rb +54 -0
- data/spec/trema/dsl/run_spec.rb +78 -0
- data/spec/trema/dsl/runner_spec.rb +239 -0
- data/spec/trema/dsl/switch_spec.rb +77 -0
- data/spec/trema/dsl/syntax_spec.rb +121 -0
- data/spec/trema/dsl/vhost_spec.rb +148 -0
- data/spec/trema/dsl/vswitch_spec.rb +90 -0
- data/spec/trema/echo-reply_spec.rb +49 -0
- data/spec/trema/echo-request_spec.rb +75 -0
- data/spec/trema/error_spec.rb +142 -0
- data/spec/trema/executables_spec.rb +75 -0
- data/spec/trema/features-reply_spec.rb +57 -0
- data/spec/trema/features-request_spec.rb +66 -0
- data/spec/trema/flow-removed_spec.rb +146 -0
- data/spec/trema/get-config-reply_spec.rb +43 -0
- data/spec/trema/get-config-request_spec.rb +82 -0
- data/spec/trema/hello_spec.rb +49 -0
- data/spec/trema/host_spec.rb +193 -0
- data/spec/trema/link_spec.rb +64 -0
- data/spec/trema/list-switches-reply_spec.rb +48 -0
- data/spec/trema/logger_spec.rb +48 -0
- data/spec/trema/mac_spec.rb +115 -0
- data/spec/trema/match_spec.rb +113 -0
- data/spec/trema/open-vswitch_spec.rb +123 -0
- data/spec/trema/openflow-error_spec.rb +141 -0
- data/spec/trema/openflow-switch_spec.rb +56 -0
- data/spec/trema/packet-in_spec.rb +168 -0
- data/spec/trema/packet-out_spec.rb +128 -0
- data/spec/trema/packetin-filter_spec.rb +41 -0
- data/spec/trema/port-mod_spec.rb +101 -0
- data/spec/trema/port-status_spec.rb +108 -0
- data/spec/trema/port_spec.rb +61 -0
- data/spec/trema/process_spec.rb +71 -0
- data/spec/trema/queue-get-config-reply_spec.rb +66 -0
- data/spec/trema/queue-get-config-request_spec.rb +69 -0
- data/spec/trema/set-config_spec.rb +80 -0
- data/spec/trema/shell/vhost_spec.rb +57 -0
- data/spec/trema/shell/vswitch_spec.rb +89 -0
- data/spec/trema/stats-reply_spec.rb +306 -0
- data/spec/trema/stats-request_spec.rb +151 -0
- data/spec/trema/switch-disconnected_spec.rb +58 -0
- data/spec/trema/switch-manager_spec.rb +43 -0
- data/spec/trema/tremashark_spec.rb +41 -0
- data/spec/trema/util_spec.rb +93 -0
- data/spec/trema/vendor-request_spec.rb +79 -0
- data/src/examples/cbench_switch/README +21 -0
- data/src/examples/cbench_switch/cbench-switch.rb +39 -0
- data/src/examples/cbench_switch/cbench_switch.c +68 -0
- data/src/examples/dumper/dumper.c +370 -0
- data/src/examples/dumper/dumper.conf +7 -0
- data/src/examples/dumper/dumper.rb +196 -0
- data/src/examples/hello_trema/README +13 -0
- data/src/examples/hello_trema/hello_trema.c +51 -0
- data/src/examples/hello_trema/hello_trema.conf +3 -0
- data/src/examples/hello_trema/hello_trema.rb +35 -0
- data/src/examples/learning_switch/README +15 -0
- data/src/examples/learning_switch/fdb.rb +112 -0
- data/src/examples/learning_switch/learning-switch.rb +88 -0
- data/src/examples/learning_switch/learning_switch.c +236 -0
- data/src/examples/learning_switch/learning_switch.conf +18 -0
- data/src/examples/list_switches/README +19 -0
- data/src/examples/list_switches/list-switches.rb +45 -0
- data/src/examples/list_switches/list_switches.c +81 -0
- data/src/examples/list_switches/list_switches.conf +15 -0
- data/src/examples/match_compare/match-compare.conf +30 -0
- data/src/examples/match_compare/match-compare.rb +99 -0
- data/src/examples/multi_learning_switch/README +14 -0
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
- data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
- data/src/examples/openflow_message/README +11 -0
- data/src/examples/openflow_message/echo-reply.rb +59 -0
- data/src/examples/openflow_message/echo-request.rb +58 -0
- data/src/examples/openflow_message/echo_reply.c +70 -0
- data/src/examples/openflow_message/echo_request.c +70 -0
- data/src/examples/openflow_message/example.rb +63 -0
- data/src/examples/openflow_message/features-request.rb +97 -0
- data/src/examples/openflow_message/features_request.c +168 -0
- data/src/examples/openflow_message/hello.c +70 -0
- data/src/examples/openflow_message/hello.rb +58 -0
- data/src/examples/openflow_message/set-config.rb +59 -0
- data/src/examples/openflow_message/set_config.c +70 -0
- data/src/examples/packet_in/README +15 -0
- data/src/examples/packet_in/packet_in.c +55 -0
- data/src/examples/packet_in/packet_in.conf +15 -0
- data/src/examples/packet_in/packet_in.rb +34 -0
- data/src/examples/packetin_filter_config/README +12 -0
- data/src/examples/packetin_filter_config/add_filter.c +73 -0
- data/src/examples/packetin_filter_config/delete_filter.c +65 -0
- data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/dump_filter.c +65 -0
- data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
- data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
- data/src/examples/packetin_filter_config/utils.c +102 -0
- data/src/examples/packetin_filter_config/utils.h +42 -0
- data/src/examples/repeater_hub/README +8 -0
- data/src/examples/repeater_hub/repeater-hub.rb +43 -0
- data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
- data/src/examples/repeater_hub/repeater_hub.c +83 -0
- data/src/examples/repeater_hub/repeater_hub.conf +28 -0
- data/src/examples/switch_info/README +13 -0
- data/src/examples/switch_info/switch_info.c +80 -0
- data/src/examples/switch_info/switch_info.conf +3 -0
- data/src/examples/switch_info/switch_info.rb +46 -0
- data/src/examples/switch_monitor/switch-monitor.conf +3 -0
- data/src/examples/switch_monitor/switch-monitor.rb +58 -0
- data/src/examples/switch_monitor/switch_monitor.c +154 -0
- data/src/examples/traffic_monitor/counter.c +74 -0
- data/src/examples/traffic_monitor/counter.h +48 -0
- data/src/examples/traffic_monitor/counter.rb +46 -0
- data/src/examples/traffic_monitor/fdb.c +76 -0
- data/src/examples/traffic_monitor/fdb.h +50 -0
- data/src/examples/traffic_monitor/fdb.rb +44 -0
- data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
- data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
- data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
- data/src/lib/arp.h +61 -0
- data/src/lib/bool.h +49 -0
- data/src/lib/buffer.c +305 -0
- data/src/lib/buffer.h +56 -0
- data/src/lib/byteorder.c +547 -0
- data/src/lib/byteorder.h +110 -0
- data/src/lib/checks.h +42 -0
- data/src/lib/daemon.c +302 -0
- data/src/lib/daemon.h +42 -0
- data/src/lib/doubly_linked_list.c +281 -0
- data/src/lib/doubly_linked_list.h +88 -0
- data/src/lib/ether.c +48 -0
- data/src/lib/ether.h +94 -0
- data/src/lib/etherip.h +46 -0
- data/src/lib/event_handler.c +389 -0
- data/src/lib/event_handler.h +64 -0
- data/src/lib/hash_table.c +417 -0
- data/src/lib/hash_table.h +138 -0
- data/src/lib/icmp.h +74 -0
- data/src/lib/igmp.h +50 -0
- data/src/lib/ipv4.h +50 -0
- data/src/lib/linked_list.c +199 -0
- data/src/lib/linked_list.h +84 -0
- data/src/lib/log.c +402 -0
- data/src/lib/log.h +78 -0
- data/src/lib/match.h +84 -0
- data/src/lib/match_table.c +608 -0
- data/src/lib/match_table.h +51 -0
- data/src/lib/message_queue.c +143 -0
- data/src/lib/message_queue.h +61 -0
- data/src/lib/messenger.c +1714 -0
- data/src/lib/messenger.h +145 -0
- data/src/lib/openflow_application_interface.c +1673 -0
- data/src/lib/openflow_application_interface.h +329 -0
- data/src/lib/openflow_message.c +4051 -0
- data/src/lib/openflow_message.h +288 -0
- data/src/lib/openflow_service_interface.h +59 -0
- data/src/lib/packet_info.c +230 -0
- data/src/lib/packet_info.h +209 -0
- data/src/lib/packet_parser.c +502 -0
- data/src/lib/packetin_filter_interface.c +294 -0
- data/src/lib/packetin_filter_interface.h +127 -0
- data/src/lib/persistent_storage.c +480 -0
- data/src/lib/persistent_storage.h +46 -0
- data/src/lib/stat.c +213 -0
- data/src/lib/stat.h +44 -0
- data/src/lib/tcp.h +67 -0
- data/src/lib/timer.c +350 -0
- data/src/lib/timer.h +53 -0
- data/src/lib/trema.c +710 -0
- data/src/lib/trema.h +79 -0
- data/src/lib/trema_private.c +177 -0
- data/src/lib/trema_private.h +60 -0
- data/src/lib/trema_wrapper.c +56 -0
- data/src/lib/trema_wrapper.h +64 -0
- data/src/lib/udp.h +43 -0
- data/src/lib/utility.c +515 -0
- data/src/lib/utility.h +67 -0
- data/src/lib/wrapper.c +100 -0
- data/src/lib/wrapper.h +76 -0
- data/src/packetin_filter/README +17 -0
- data/src/packetin_filter/packetin_filter.c +575 -0
- data/src/switch_manager/README +20 -0
- data/src/switch_manager/cookie_table.c +292 -0
- data/src/switch_manager/cookie_table.h +72 -0
- data/src/switch_manager/dpid_table.c +110 -0
- data/src/switch_manager/dpid_table.h +46 -0
- data/src/switch_manager/management_interface.h +44 -0
- data/src/switch_manager/ofpmsg_recv.c +482 -0
- data/src/switch_manager/ofpmsg_recv.h +42 -0
- data/src/switch_manager/ofpmsg_send.c +235 -0
- data/src/switch_manager/ofpmsg_send.h +50 -0
- data/src/switch_manager/secure_channel_listener.c +281 -0
- data/src/switch_manager/secure_channel_listener.h +42 -0
- data/src/switch_manager/secure_channel_receiver.c +126 -0
- data/src/switch_manager/secure_channel_receiver.h +43 -0
- data/src/switch_manager/secure_channel_sender.c +126 -0
- data/src/switch_manager/secure_channel_sender.h +43 -0
- data/src/switch_manager/service_interface.c +181 -0
- data/src/switch_manager/service_interface.h +46 -0
- data/src/switch_manager/switch.c +538 -0
- data/src/switch_manager/switch.h +51 -0
- data/src/switch_manager/switch_manager.c +448 -0
- data/src/switch_manager/switch_manager.h +63 -0
- data/src/switch_manager/switchinfo.h +72 -0
- data/src/switch_manager/xid_table.c +184 -0
- data/src/switch_manager/xid_table.h +56 -0
- data/src/tremashark/README +78 -0
- data/src/tremashark/packet_capture.c +357 -0
- data/src/tremashark/pcap_private.h +47 -0
- data/src/tremashark/pcap_queue.c +197 -0
- data/src/tremashark/pcap_queue.h +58 -0
- data/src/tremashark/plugin/.gitignore +6 -0
- data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
- data/src/tremashark/plugin/packet-trema/Makefile +77 -0
- data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
- data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
- data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
- data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
- data/src/tremashark/plugin/user_dlts +2 -0
- data/src/tremashark/queue.c +168 -0
- data/src/tremashark/queue.h +60 -0
- data/src/tremashark/stdin_relay.c +257 -0
- data/src/tremashark/syslog_relay.c +247 -0
- data/src/tremashark/tremashark.c +556 -0
- data/trema +93 -0
- data/trema-config +61 -0
- data/unittests/buffer_stubs.c +74 -0
- data/unittests/cmockery_trema.c +123 -0
- data/unittests/cmockery_trema.h +96 -0
- data/unittests/lib/buffer_test.c +370 -0
- data/unittests/lib/byteorder_test.c +1717 -0
- data/unittests/lib/daemon_test.c +664 -0
- data/unittests/lib/doubly_linked_list_test.c +346 -0
- data/unittests/lib/ether_test.c +127 -0
- data/unittests/lib/hash_table_test.c +278 -0
- data/unittests/lib/linked_list_test.c +343 -0
- data/unittests/lib/log_test.c +459 -0
- data/unittests/lib/match_table_test.c +1509 -0
- data/unittests/lib/message_queue_test.c +379 -0
- data/unittests/lib/messenger_test.c +438 -0
- data/unittests/lib/openflow_application_interface_test.c +3488 -0
- data/unittests/lib/openflow_message_test.c +7337 -0
- data/unittests/lib/packet_info_test.c +544 -0
- data/unittests/lib/packet_parser_test.c +703 -0
- data/unittests/lib/packetin_filter_interface_test.c +723 -0
- data/unittests/lib/persistent_storage_test.c +802 -0
- data/unittests/lib/stat_test.c +291 -0
- data/unittests/lib/test_packets/arp_rep.cap +0 -0
- data/unittests/lib/test_packets/arp_req.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
- data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
- data/unittests/lib/test_packets/ipx.cap +0 -0
- data/unittests/lib/test_packets/lldp.cap +0 -0
- data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
- data/unittests/lib/test_packets/tcp.cap +0 -0
- data/unittests/lib/test_packets/tcp_syn.cap +0 -0
- data/unittests/lib/test_packets/udp.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
- data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
- data/unittests/lib/timer_test.c +248 -0
- data/unittests/lib/trema_private_test.c +323 -0
- data/unittests/lib/trema_test.c +985 -0
- data/unittests/lib/utility_test.c +628 -0
- data/unittests/lib/wrapper_test.c +201 -0
- data/unittests/packetin_filter/packetin_filter_test.c +477 -0
- data/unittests/switch_manager/switch_manager_test.c +1178 -0
- data/unittests/wrapper_stubs.c +39 -0
- data/vendor/.gitignore +6 -0
- data/vendor/README +30 -0
- data/vendor/cmockery-20110428.tar.gz +0 -0
- data/vendor/oflops-0.03.tar.gz +0 -0
- data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
- data/vendor/openflow-1.0.0.tar.gz +0 -0
- data/vendor/openflow.git.tar.gz +0 -0
- data/vendor/openvswitch-1.2.2.tar.gz +0 -0
- data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
- data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
- data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
- data/vendor/ruby-ifconfig-1.2/README +38 -0
- data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
- data/vendor/ruby-ifconfig-1.2/TODO +8 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
- data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
- data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
- data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
- data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
- data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
- data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
- data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
- metadata +856 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Functions for accessing commonly-used header fields values.
|
|
3
|
+
*
|
|
4
|
+
* Author: Kazuya Suzuki
|
|
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 PACKET_INFO_H
|
|
24
|
+
#define PACKET_INFO_H
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
#include "arp.h"
|
|
28
|
+
#include "checks.h"
|
|
29
|
+
#include "bool.h"
|
|
30
|
+
#include "ether.h"
|
|
31
|
+
#include "icmp.h"
|
|
32
|
+
#include "igmp.h"
|
|
33
|
+
#include "ipv4.h"
|
|
34
|
+
#include "tcp.h"
|
|
35
|
+
#include "udp.h"
|
|
36
|
+
#include "etherip.h"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
enum {
|
|
40
|
+
ETH_DIX = 0x00000001,
|
|
41
|
+
ETH_8023_RAW = 0x00000002,
|
|
42
|
+
ETH_8023_LLC = 0x00000004,
|
|
43
|
+
ETH_8023_SNAP = 0x00000008,
|
|
44
|
+
ETH_8021Q = 0x00000010,
|
|
45
|
+
NW_IPV4 = 0x00000100,
|
|
46
|
+
NW_ICMPV4 = 0x00000200,
|
|
47
|
+
NW_IPV6 = 0x00000400,
|
|
48
|
+
NW_ICMPV6 = 0x00000800,
|
|
49
|
+
NW_ARP = 0x00001000,
|
|
50
|
+
NW_IGMP = 0x00002000,
|
|
51
|
+
NW_LLDP = 0x00004000,
|
|
52
|
+
TP_TCP = 0x00010000,
|
|
53
|
+
TP_UDP = 0x00020000,
|
|
54
|
+
TP_ETHERIP = 0x00040000,
|
|
55
|
+
|
|
56
|
+
ETH_VTAG_DIX = ETH_8021Q | ETH_DIX,
|
|
57
|
+
ETH_VTAG_RAW = ETH_8021Q | ETH_8023_RAW,
|
|
58
|
+
ETH_VTAG_LLC = ETH_8021Q | ETH_8023_LLC,
|
|
59
|
+
ETH_VTAG_SNAP = ETH_8021Q | ETH_8023_SNAP,
|
|
60
|
+
ETH_ARP = ETH_DIX | NW_ARP,
|
|
61
|
+
ETH_LLDP = ETH_DIX | NW_LLDP,
|
|
62
|
+
ETH_IPV4 = ETH_DIX | NW_IPV4,
|
|
63
|
+
ETH_IPV4_ICMPV4 = ETH_IPV4 | NW_ICMPV4,
|
|
64
|
+
ETH_IPV4_IGMP = ETH_IPV4 | NW_IGMP,
|
|
65
|
+
ETH_IPV4_TCP = ETH_IPV4 | TP_TCP,
|
|
66
|
+
ETH_IPV4_UDP = ETH_IPV4 | TP_UDP,
|
|
67
|
+
ETH_IPV4_ETHERIP = ETH_IPV4 | TP_ETHERIP,
|
|
68
|
+
ETH_VTAG_ARP = ETH_VTAG_DIX | NW_ARP,
|
|
69
|
+
ETH_VTAG_IPV4 = ETH_VTAG_DIX | NW_IPV4,
|
|
70
|
+
ETH_VTAG_IPV4_ICMPV4 = ETH_VTAG_IPV4 | NW_ICMPV4,
|
|
71
|
+
ETH_VTAG_IPV4_TCP = ETH_VTAG_IPV4 | TP_TCP,
|
|
72
|
+
ETH_VTAG_IPV4_UDP = ETH_VTAG_IPV4 | TP_UDP,
|
|
73
|
+
ETH_SNAP_ARP = ETH_8023_SNAP | NW_ARP,
|
|
74
|
+
ETH_SNAP_IPV4 = ETH_8023_SNAP | NW_IPV4,
|
|
75
|
+
ETH_SNAP_IPV4_ICMPV4 = ETH_SNAP_IPV4 | NW_ICMPV4,
|
|
76
|
+
ETH_SNAP_IPV4_TCP = ETH_SNAP_IPV4 | TP_TCP,
|
|
77
|
+
ETH_SNAP_IPV4_UDP = ETH_SNAP_IPV4 | TP_UDP,
|
|
78
|
+
ETH_VTAG_SNAP_ARP = ETH_VTAG_SNAP | NW_ARP,
|
|
79
|
+
ETH_VTAG_SNAP_IPV4 = ETH_VTAG_SNAP | NW_IPV4,
|
|
80
|
+
ETH_VTAG_SNAP_IPV4_ICMPV4 = ETH_VTAG_SNAP_IPV4 | NW_ICMPV4,
|
|
81
|
+
ETH_VTAG_SNAP_IPV4_TCP = ETH_VTAG_SNAP_IPV4 | TP_TCP,
|
|
82
|
+
ETH_VTAG_SNAP_IPV4_UDP = ETH_VTAG_SNAP_IPV4 | TP_UDP,
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
enum {
|
|
87
|
+
SNAP_LLC_LENGTH = 3,
|
|
88
|
+
SNAP_OUI_LENGTH = 3,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
typedef struct {
|
|
93
|
+
uint32_t format;
|
|
94
|
+
|
|
95
|
+
uint8_t eth_macda[ ETH_ADDRLEN ];
|
|
96
|
+
uint8_t eth_macsa[ ETH_ADDRLEN ];
|
|
97
|
+
uint16_t eth_type;
|
|
98
|
+
|
|
99
|
+
uint16_t vlan_tci;
|
|
100
|
+
uint16_t vlan_tpid;
|
|
101
|
+
uint8_t vlan_prio;
|
|
102
|
+
uint8_t vlan_cfi;
|
|
103
|
+
uint16_t vlan_vid;
|
|
104
|
+
|
|
105
|
+
uint8_t snap_llc[ SNAP_LLC_LENGTH ];
|
|
106
|
+
uint8_t snap_oui[ SNAP_OUI_LENGTH ];
|
|
107
|
+
uint16_t snap_type;
|
|
108
|
+
|
|
109
|
+
uint16_t arp_ar_hrd;
|
|
110
|
+
uint16_t arp_ar_pro;
|
|
111
|
+
uint8_t arp_ar_hln;
|
|
112
|
+
uint8_t arp_ar_pln;
|
|
113
|
+
uint16_t arp_ar_op;
|
|
114
|
+
uint8_t arp_sha[ ETH_ADDRLEN ];
|
|
115
|
+
uint32_t arp_spa;
|
|
116
|
+
uint8_t arp_tha[ ETH_ADDRLEN ];
|
|
117
|
+
uint32_t arp_tpa;
|
|
118
|
+
|
|
119
|
+
uint8_t ipv4_version;
|
|
120
|
+
uint8_t ipv4_ihl;
|
|
121
|
+
uint8_t ipv4_tos;
|
|
122
|
+
uint16_t ipv4_tot_len;
|
|
123
|
+
uint16_t ipv4_id;
|
|
124
|
+
uint16_t ipv4_frag_off;
|
|
125
|
+
uint8_t ipv4_ttl;
|
|
126
|
+
uint8_t ipv4_protocol;
|
|
127
|
+
uint16_t ipv4_checksum;
|
|
128
|
+
uint32_t ipv4_saddr;
|
|
129
|
+
uint32_t ipv4_daddr;
|
|
130
|
+
|
|
131
|
+
uint8_t icmpv4_type;
|
|
132
|
+
uint8_t icmpv4_code;
|
|
133
|
+
uint16_t icmpv4_checksum;
|
|
134
|
+
uint16_t icmpv4_id;
|
|
135
|
+
uint16_t icmpv4_seq;
|
|
136
|
+
uint32_t icmpv4_gateway;
|
|
137
|
+
|
|
138
|
+
uint8_t igmp_type;
|
|
139
|
+
uint8_t igmp_code;
|
|
140
|
+
uint16_t igmp_cksum;
|
|
141
|
+
uint32_t igmp_group;
|
|
142
|
+
|
|
143
|
+
uint16_t tcp_src_port;
|
|
144
|
+
uint16_t tcp_dst_port;
|
|
145
|
+
uint32_t tcp_seq_no;
|
|
146
|
+
uint32_t tcp_ack_no;
|
|
147
|
+
uint8_t tcp_offset;
|
|
148
|
+
uint8_t tcp_flags;
|
|
149
|
+
uint16_t tcp_window;
|
|
150
|
+
uint16_t tcp_checksum;
|
|
151
|
+
uint16_t tcp_urgent;
|
|
152
|
+
|
|
153
|
+
uint16_t udp_src_port;
|
|
154
|
+
uint16_t udp_dst_port;
|
|
155
|
+
uint16_t udp_len;
|
|
156
|
+
uint16_t udp_checksum;
|
|
157
|
+
|
|
158
|
+
uint16_t etherip_version;
|
|
159
|
+
uint16_t etherip_offset;
|
|
160
|
+
|
|
161
|
+
void *l2_header;
|
|
162
|
+
void *l2_payload;
|
|
163
|
+
size_t l2_payload_length;
|
|
164
|
+
void *l3_header;
|
|
165
|
+
void *l3_payload;
|
|
166
|
+
size_t l3_payload_length;
|
|
167
|
+
void *l4_header;
|
|
168
|
+
void *l4_payload;
|
|
169
|
+
size_t l4_payload_length;
|
|
170
|
+
} packet_info;
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
bool parse_packet( buffer *buf );
|
|
174
|
+
|
|
175
|
+
void calloc_packet_info( buffer *frame );
|
|
176
|
+
void free_packet_info( buffer *frame );
|
|
177
|
+
packet_info get_packet_info( const buffer *frame );
|
|
178
|
+
|
|
179
|
+
bool packet_type_eth_dix( const buffer *frame );
|
|
180
|
+
bool packet_type_eth_vtag( const buffer *frame );
|
|
181
|
+
bool packet_type_eth_raw( const buffer *frame );
|
|
182
|
+
bool packet_type_eth_llc( const buffer *frame );
|
|
183
|
+
bool packet_type_eth_snap( const buffer *frame );
|
|
184
|
+
bool packet_type_ether( const buffer *frame );
|
|
185
|
+
bool packet_type_arp( const buffer *frame );
|
|
186
|
+
bool packet_type_ipv4( const buffer *frame );
|
|
187
|
+
bool packet_type_lldp( const buffer *frame );
|
|
188
|
+
bool packet_type_icmpv4( const buffer *frame );
|
|
189
|
+
bool packet_type_igmp( const buffer *frame );
|
|
190
|
+
bool packet_type_ipv4_tcp( const buffer *frame );
|
|
191
|
+
bool packet_type_ipv4_udp( const buffer *frame );
|
|
192
|
+
bool packet_type_ipv4_etherip( const buffer *frame );
|
|
193
|
+
|
|
194
|
+
bool packet_type_igmp_membership_query( const buffer *frame );
|
|
195
|
+
bool packet_type_igmp_v1_membership_report( const buffer *frame );
|
|
196
|
+
bool packet_type_igmp_v2_membership_report( const buffer *frame );
|
|
197
|
+
bool packet_type_igmp_v2_leave_group( const buffer *frame );
|
|
198
|
+
bool packet_type_igmp_v3_membership_report( const buffer *frame );
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
#endif // PACKET_INFO_H
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* Local variables:
|
|
206
|
+
* c-basic-offset: 2
|
|
207
|
+
* indent-tabs-mode: nil
|
|
208
|
+
* End:
|
|
209
|
+
*/
|
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Author: Kazuya Suzuki
|
|
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 <stdint.h>
|
|
23
|
+
#include <net/ethernet.h>
|
|
24
|
+
#include <netinet/ip.h>
|
|
25
|
+
#include "packet_info.h"
|
|
26
|
+
#include "log.h"
|
|
27
|
+
#include "wrapper.h"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
#define REMAINED_BUFFER_LENGTH( buf, ptr ) \
|
|
31
|
+
( buf->length - ( size_t ) ( ( char * ) ptr - ( char * ) buf->data ) )
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
static void
|
|
35
|
+
parse_ether( buffer *buf ) {
|
|
36
|
+
assert( buf != NULL );
|
|
37
|
+
|
|
38
|
+
packet_info *packet_info = buf->user_data;
|
|
39
|
+
void *ptr = packet_info->l2_header;
|
|
40
|
+
assert( ptr != NULL );
|
|
41
|
+
|
|
42
|
+
// Check the length of remained buffer
|
|
43
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
44
|
+
if ( length < sizeof( ether_header_t ) ) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Ethernet header
|
|
49
|
+
ether_header_t *ether_header = ptr;
|
|
50
|
+
memcpy( packet_info->eth_macsa, ether_header->macsa, ETH_ADDRLEN );
|
|
51
|
+
memcpy( packet_info->eth_macda, ether_header->macda, ETH_ADDRLEN );
|
|
52
|
+
packet_info->eth_type = ntohs( ether_header->type );
|
|
53
|
+
|
|
54
|
+
ptr = ( void * ) ( ether_header + 1 );
|
|
55
|
+
|
|
56
|
+
// vlan tag
|
|
57
|
+
if ( packet_info->eth_type == ETH_ETHTYPE_TPID ) {
|
|
58
|
+
// Check the length of remained buffer
|
|
59
|
+
length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
60
|
+
if ( length < sizeof( vlantag_header_t ) ) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
vlantag_header_t *vlantag_header = ptr;
|
|
64
|
+
|
|
65
|
+
packet_info->vlan_tci = ntohs( vlantag_header->tci );
|
|
66
|
+
packet_info->vlan_tpid = packet_info->eth_type;
|
|
67
|
+
packet_info->vlan_prio =TCI_GET_PRIO( packet_info->vlan_tci );
|
|
68
|
+
packet_info->vlan_cfi = TCI_GET_CFI( packet_info->vlan_tci );
|
|
69
|
+
packet_info->vlan_vid = TCI_GET_VID( packet_info->vlan_tci );
|
|
70
|
+
|
|
71
|
+
// Rewrite eth_type
|
|
72
|
+
packet_info->eth_type = ntohs( vlantag_header->type );
|
|
73
|
+
|
|
74
|
+
packet_info->format |= ETH_8021Q;
|
|
75
|
+
|
|
76
|
+
ptr = ( void * ) ( vlantag_header + 1 );
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Skip nested vlan headers.
|
|
80
|
+
while ( packet_info->eth_type == ETH_ETHTYPE_TPID ) {
|
|
81
|
+
// Check the length of remained buffer
|
|
82
|
+
length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
83
|
+
if ( length < sizeof( vlantag_header_t ) ) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
vlantag_header_t *vlantag_header = ptr;
|
|
87
|
+
|
|
88
|
+
// Rewrite eth_type
|
|
89
|
+
packet_info->eth_type = ntohs( vlantag_header->type );
|
|
90
|
+
ptr = ( void * ) ( vlantag_header + 1 );
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// snap header.
|
|
94
|
+
if ( packet_info->eth_type <= ETH_MTU ) {
|
|
95
|
+
// Check the length of remained buffer
|
|
96
|
+
length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
97
|
+
if ( length < sizeof( snap_header_t ) ) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
snap_header_t *snap_header = ptr;
|
|
101
|
+
|
|
102
|
+
memcpy( packet_info->snap_llc, snap_header->llc, SNAP_LLC_LENGTH );
|
|
103
|
+
memcpy( packet_info->snap_oui, snap_header->oui, SNAP_OUI_LENGTH );
|
|
104
|
+
packet_info->snap_type = ntohs( snap_header->type );
|
|
105
|
+
|
|
106
|
+
packet_info->format |= ETH_8023_SNAP;
|
|
107
|
+
|
|
108
|
+
ptr = ( void * ) ( snap_header + 1 );
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
packet_info->format |= ETH_DIX;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
115
|
+
if ( payload_length > 0 ) {
|
|
116
|
+
packet_info->l2_payload = ptr;
|
|
117
|
+
packet_info->l2_payload_length = payload_length;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
static void
|
|
125
|
+
parse_arp( buffer *buf ) {
|
|
126
|
+
assert( buf != NULL );
|
|
127
|
+
|
|
128
|
+
packet_info *packet_info = buf->user_data;
|
|
129
|
+
void *ptr = packet_info->l3_header;
|
|
130
|
+
assert( ptr != NULL );
|
|
131
|
+
|
|
132
|
+
// Check the length of remained buffer
|
|
133
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
134
|
+
if ( length < sizeof( arp_header_t ) ) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Ethernet header
|
|
139
|
+
arp_header_t *arp_header = ptr;
|
|
140
|
+
packet_info->arp_ar_hrd = ntohs( arp_header->ar_hrd );
|
|
141
|
+
packet_info->arp_ar_pro = ntohs( arp_header->ar_pro );
|
|
142
|
+
packet_info->arp_ar_hln = arp_header->ar_hln;
|
|
143
|
+
packet_info->arp_ar_pln = arp_header->ar_pln;
|
|
144
|
+
packet_info->arp_ar_op = ntohs( arp_header->ar_op );
|
|
145
|
+
memcpy( packet_info->arp_sha, arp_header->sha, ETH_ADDRLEN );
|
|
146
|
+
packet_info->arp_spa = ntohl( arp_header->sip );
|
|
147
|
+
memcpy( packet_info->arp_tha, arp_header->tha, ETH_ADDRLEN );
|
|
148
|
+
packet_info->arp_tpa = ntohl( arp_header->tip );
|
|
149
|
+
|
|
150
|
+
packet_info->format |= NW_ARP;
|
|
151
|
+
|
|
152
|
+
return;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
static void
|
|
157
|
+
parse_ipv4( buffer *buf ) {
|
|
158
|
+
assert( buf != NULL );
|
|
159
|
+
|
|
160
|
+
packet_info *packet_info = buf->user_data;
|
|
161
|
+
void *ptr = packet_info->l3_header;
|
|
162
|
+
assert( ptr != NULL );
|
|
163
|
+
|
|
164
|
+
// Check the length of remained buffer for an ipv4 header without options.
|
|
165
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
166
|
+
if ( length < sizeof( ipv4_header_t ) ) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Check the length of remained buffer for an ipv4 header with options.
|
|
171
|
+
ipv4_header_t *ipv4_header = ptr;
|
|
172
|
+
if ( ipv4_header->ihl < 5 ) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if ( length < ( size_t ) ipv4_header->ihl * 4 ) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Parses IPv4 header
|
|
180
|
+
packet_info->ipv4_version = ipv4_header->version;
|
|
181
|
+
packet_info->ipv4_ihl = ipv4_header->ihl;
|
|
182
|
+
packet_info->ipv4_tos = ipv4_header->tos;
|
|
183
|
+
packet_info->ipv4_tot_len = ntohs( ipv4_header->tot_len );
|
|
184
|
+
packet_info->ipv4_id = ntohs( ipv4_header->id );
|
|
185
|
+
packet_info->ipv4_frag_off = ntohs( ipv4_header->frag_off );
|
|
186
|
+
packet_info->ipv4_ttl = ipv4_header->ttl;
|
|
187
|
+
packet_info->ipv4_protocol = ipv4_header->protocol;
|
|
188
|
+
packet_info->ipv4_checksum = ntohs( ipv4_header->check );
|
|
189
|
+
packet_info->ipv4_saddr = ntohl( ipv4_header->saddr );
|
|
190
|
+
packet_info->ipv4_daddr = ntohl( ipv4_header->daddr );
|
|
191
|
+
|
|
192
|
+
ptr = ( char * ) ipv4_header + packet_info->ipv4_ihl * 4;
|
|
193
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
194
|
+
if ( payload_length > 0 ) {
|
|
195
|
+
packet_info->l3_payload = ptr;
|
|
196
|
+
packet_info->l3_payload_length = payload_length;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
packet_info->format |= NW_IPV4;
|
|
200
|
+
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
static void
|
|
206
|
+
parse_lldp( buffer *buf ) {
|
|
207
|
+
assert( buf != NULL );
|
|
208
|
+
|
|
209
|
+
packet_info *packet_info = buf->user_data;
|
|
210
|
+
void *ptr = packet_info->l3_header;
|
|
211
|
+
assert( ptr != NULL );
|
|
212
|
+
|
|
213
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
214
|
+
if ( payload_length > 0 ) {
|
|
215
|
+
packet_info->l3_payload = ptr;
|
|
216
|
+
packet_info->l3_payload_length = payload_length;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
packet_info->format |= NW_LLDP;
|
|
220
|
+
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
static void
|
|
226
|
+
parse_icmp( buffer *buf ) {
|
|
227
|
+
assert( buf != NULL );
|
|
228
|
+
|
|
229
|
+
packet_info *packet_info = buf->user_data;
|
|
230
|
+
void *ptr = packet_info->l4_header;
|
|
231
|
+
assert( ptr != NULL );
|
|
232
|
+
|
|
233
|
+
// Check the length of remained buffer
|
|
234
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
235
|
+
if ( length < sizeof( icmp_header_t ) ) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// ICMPV4 header
|
|
240
|
+
icmp_header_t *icmp_header = ptr;
|
|
241
|
+
packet_info->icmpv4_type = icmp_header->type;
|
|
242
|
+
packet_info->icmpv4_code = icmp_header->code;
|
|
243
|
+
packet_info->icmpv4_checksum = ntohs( icmp_header->csum );
|
|
244
|
+
|
|
245
|
+
switch ( packet_info->icmpv4_type ) {
|
|
246
|
+
case ICMP_TYPE_ECHOREP:
|
|
247
|
+
case ICMP_TYPE_ECHOREQ:
|
|
248
|
+
packet_info->icmpv4_id = ntohs( icmp_header->icmp_data.echo.ident );
|
|
249
|
+
packet_info->icmpv4_seq = ntohs( icmp_header->icmp_data.echo.seq );
|
|
250
|
+
break;
|
|
251
|
+
|
|
252
|
+
case ICMP_TYPE_REDIRECT:
|
|
253
|
+
packet_info->icmpv4_gateway = ntohl( icmp_header->icmp_data.gateway );
|
|
254
|
+
break;
|
|
255
|
+
|
|
256
|
+
default:
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
ptr = ( void * ) ( icmp_header + 1 );
|
|
261
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
262
|
+
if ( payload_length > 0 ) {
|
|
263
|
+
packet_info->l4_payload = ptr;
|
|
264
|
+
packet_info->l4_payload_length = payload_length;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
packet_info->format |= NW_ICMPV4;
|
|
268
|
+
|
|
269
|
+
return;
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
static void
|
|
274
|
+
parse_udp( buffer *buf ) {
|
|
275
|
+
assert( buf != NULL );
|
|
276
|
+
|
|
277
|
+
packet_info *packet_info = buf->user_data;
|
|
278
|
+
void *ptr = packet_info->l4_header;
|
|
279
|
+
assert( ptr != NULL );
|
|
280
|
+
|
|
281
|
+
// Check the length of remained buffer
|
|
282
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
283
|
+
if ( length < sizeof( udp_header_t ) ) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// UDP header
|
|
288
|
+
udp_header_t *udp_header = ptr;
|
|
289
|
+
packet_info->udp_src_port = ntohs( udp_header->src_port );
|
|
290
|
+
packet_info->udp_dst_port = ntohs( udp_header->dst_port );
|
|
291
|
+
packet_info->udp_len = ntohs( udp_header->len );
|
|
292
|
+
packet_info->udp_checksum = ntohs( udp_header->csum );
|
|
293
|
+
|
|
294
|
+
ptr = ( void * ) ( udp_header + 1 );
|
|
295
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
296
|
+
if ( payload_length > 0 ) {
|
|
297
|
+
packet_info->l4_payload = ptr;
|
|
298
|
+
packet_info->l4_payload_length = payload_length;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
packet_info->format |= TP_UDP;
|
|
302
|
+
|
|
303
|
+
return;
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
static void
|
|
308
|
+
parse_tcp( buffer *buf ) {
|
|
309
|
+
assert( buf != NULL );
|
|
310
|
+
|
|
311
|
+
packet_info *packet_info = buf->user_data;
|
|
312
|
+
void *ptr = packet_info->l4_header;
|
|
313
|
+
assert( ptr != NULL );
|
|
314
|
+
|
|
315
|
+
// Check the length of remained buffer for the tcp header without options
|
|
316
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
317
|
+
if ( length < sizeof( tcp_header_t ) ) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Check the length of remained buffer for the tcp header with options
|
|
322
|
+
tcp_header_t *tcp_header = ptr;
|
|
323
|
+
if ( tcp_header->offset < 5 ) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
if ( length < ( size_t ) tcp_header->offset * 4 ) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// TCP header
|
|
331
|
+
packet_info->tcp_src_port = ntohs( tcp_header->src_port );
|
|
332
|
+
packet_info->tcp_dst_port = ntohs( tcp_header->dst_port );
|
|
333
|
+
packet_info->tcp_seq_no = ntohl( tcp_header->seq_no );
|
|
334
|
+
packet_info->tcp_ack_no = ntohl( tcp_header->ack_no );
|
|
335
|
+
packet_info->tcp_offset = tcp_header->offset;
|
|
336
|
+
packet_info->tcp_flags = tcp_header->flags;
|
|
337
|
+
packet_info->tcp_window = ntohs( tcp_header->window );
|
|
338
|
+
packet_info->tcp_checksum = ntohs( tcp_header->csum );
|
|
339
|
+
packet_info->tcp_urgent = ntohs( tcp_header->urgent );
|
|
340
|
+
|
|
341
|
+
ptr = ( char * ) tcp_header + packet_info->tcp_offset * 4;
|
|
342
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
343
|
+
if ( payload_length > 0 ) {
|
|
344
|
+
packet_info->l4_payload = ptr;
|
|
345
|
+
packet_info->l4_payload_length = payload_length;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
packet_info->format |= TP_TCP;
|
|
349
|
+
|
|
350
|
+
return;
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
static void
|
|
356
|
+
parse_igmp( buffer *buf ) {
|
|
357
|
+
assert( buf != NULL );
|
|
358
|
+
|
|
359
|
+
packet_info *packet_info = buf->user_data;
|
|
360
|
+
void *ptr = packet_info->l4_header;
|
|
361
|
+
assert( ptr != NULL );
|
|
362
|
+
|
|
363
|
+
// Check the length of remained buffer
|
|
364
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
365
|
+
if ( length < sizeof( igmp_header_t ) ) {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
igmp_header_t *igmp = ptr;
|
|
370
|
+
packet_info->igmp_type = igmp->type;
|
|
371
|
+
packet_info->igmp_code = igmp->code;
|
|
372
|
+
packet_info->igmp_cksum = ntohs( igmp->csum );
|
|
373
|
+
packet_info->igmp_group = ntohl( igmp->group );
|
|
374
|
+
|
|
375
|
+
packet_info->format |= NW_IGMP;
|
|
376
|
+
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
static void
|
|
382
|
+
parse_etherip( buffer *buf ) {
|
|
383
|
+
assert( buf != NULL );
|
|
384
|
+
|
|
385
|
+
packet_info *packet_info = buf->user_data;
|
|
386
|
+
void *ptr = packet_info->l4_header;
|
|
387
|
+
assert( ptr != NULL );
|
|
388
|
+
|
|
389
|
+
// Check the length of remained buffer
|
|
390
|
+
size_t length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
391
|
+
if ( length < sizeof( etherip_header ) ) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Ether header
|
|
396
|
+
etherip_header *etherip_header = ptr;
|
|
397
|
+
packet_info->etherip_version = ntohs( etherip_header->version );
|
|
398
|
+
packet_info->etherip_offset = 0;
|
|
399
|
+
|
|
400
|
+
ptr = ( void * ) ( etherip_header + 1 );
|
|
401
|
+
size_t payload_length = REMAINED_BUFFER_LENGTH( buf, ptr );
|
|
402
|
+
if ( payload_length > 0 ) {
|
|
403
|
+
packet_info->l4_payload = ptr;
|
|
404
|
+
packet_info->l4_payload_length = payload_length;
|
|
405
|
+
packet_info->etherip_offset = ( uint16_t ) ( ( char * ) ptr - ( char *) buf->data );
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
packet_info->format |= TP_ETHERIP;
|
|
409
|
+
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
bool
|
|
415
|
+
parse_packet( buffer *buf ) {
|
|
416
|
+
assert( buf != NULL );
|
|
417
|
+
assert( buf->data != NULL );
|
|
418
|
+
|
|
419
|
+
calloc_packet_info( buf );
|
|
420
|
+
if ( buf->user_data == NULL ) {
|
|
421
|
+
error( "Can't alloc memory for packet_info." );
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Parse the L2 header.
|
|
426
|
+
packet_info *packet_info = buf->user_data;
|
|
427
|
+
packet_info->l2_header = buf->data;
|
|
428
|
+
parse_ether( buf );
|
|
429
|
+
|
|
430
|
+
// Parse the L3 header.
|
|
431
|
+
switch ( packet_info->eth_type ) {
|
|
432
|
+
case ETH_ETHTYPE_ARP:
|
|
433
|
+
packet_info->l3_header = packet_info->l2_payload;
|
|
434
|
+
parse_arp( buf );
|
|
435
|
+
break;
|
|
436
|
+
|
|
437
|
+
case ETH_ETHTYPE_IPV4:
|
|
438
|
+
packet_info->l3_header = packet_info->l2_payload;
|
|
439
|
+
parse_ipv4( buf );
|
|
440
|
+
break;
|
|
441
|
+
|
|
442
|
+
case ETH_ETHTYPE_LLDP:
|
|
443
|
+
packet_info->l3_header = packet_info->l2_payload;
|
|
444
|
+
parse_lldp( buf );
|
|
445
|
+
break;
|
|
446
|
+
|
|
447
|
+
default:
|
|
448
|
+
// Unknown L3 type
|
|
449
|
+
return true;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if ( !( packet_info->format & NW_IPV4 ) ) {
|
|
453
|
+
return true;
|
|
454
|
+
}
|
|
455
|
+
else if ( ( packet_info->ipv4_frag_off & IP_OFFMASK ) != 0 ) {
|
|
456
|
+
// The ipv4 packet is fragmented.
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Parse the L4 header.
|
|
461
|
+
switch ( packet_info->ipv4_protocol ) {
|
|
462
|
+
case IPPROTO_ICMP:
|
|
463
|
+
packet_info->l4_header = packet_info->l3_payload;
|
|
464
|
+
parse_icmp( buf );
|
|
465
|
+
break;
|
|
466
|
+
|
|
467
|
+
case IPPROTO_TCP:
|
|
468
|
+
packet_info->l4_header = packet_info->l3_payload;
|
|
469
|
+
parse_tcp( buf );
|
|
470
|
+
break;
|
|
471
|
+
|
|
472
|
+
case IPPROTO_UDP:
|
|
473
|
+
packet_info->l4_header = packet_info->l3_payload;
|
|
474
|
+
parse_udp( buf );
|
|
475
|
+
break;
|
|
476
|
+
|
|
477
|
+
case IPPROTO_IGMP:
|
|
478
|
+
packet_info->l4_header = packet_info->l3_payload;
|
|
479
|
+
parse_igmp( buf );
|
|
480
|
+
break;
|
|
481
|
+
|
|
482
|
+
case IPPROTO_ETHERIP:
|
|
483
|
+
packet_info->l4_header = packet_info->l3_payload;
|
|
484
|
+
parse_etherip( buf );
|
|
485
|
+
break;
|
|
486
|
+
|
|
487
|
+
default:
|
|
488
|
+
// Unknown L4 type
|
|
489
|
+
break;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return true;
|
|
493
|
+
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
/*
|
|
498
|
+
* Local variables:
|
|
499
|
+
* c-basic-offset: 2
|
|
500
|
+
* indent-tabs-mode: nil
|
|
501
|
+
* End:
|
|
502
|
+
*/
|