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.
Files changed (560) hide show
  1. data/.mono.rant +4107 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +4 -0
  4. data/Doxyfile +1679 -0
  5. data/GPL2 +339 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +71 -0
  8. data/README.md +135 -0
  9. data/Rakefile +140 -0
  10. data/Rantfile +834 -0
  11. data/VERSION +1 -0
  12. data/build.rb +32 -0
  13. data/cruise.rb +389 -0
  14. data/features/example.dumper.feature +87 -0
  15. data/features/example.learning_switch.feature +39 -0
  16. data/features/example.list_switches.feature +38 -0
  17. data/features/example.message.echo_reply.feature +26 -0
  18. data/features/example.message.echo_request.feature +25 -0
  19. data/features/example.message.features_request.feature +84 -0
  20. data/features/example.message.hello.feature +25 -0
  21. data/features/example.message.set_config.feature +27 -0
  22. data/features/example.multi_learning_switch.feature +135 -0
  23. data/features/example.packetin_filter_config.feature +91 -0
  24. data/features/example.repeater_hub.feature +49 -0
  25. data/features/example.switch_monitor.feature +39 -0
  26. data/features/packetin_filter.feature +49 -0
  27. data/features/step_definitions/kill_steps.rb +30 -0
  28. data/features/step_definitions/log_steps.rb +90 -0
  29. data/features/step_definitions/misc_steps.rb +64 -0
  30. data/features/step_definitions/off_steps.rb +30 -0
  31. data/features/step_definitions/run_steps.rb +91 -0
  32. data/features/step_definitions/send_packets_steps.rb +42 -0
  33. data/features/step_definitions/show_stats_steps.rb +43 -0
  34. data/features/step_definitions/stats_steps.rb +39 -0
  35. data/features/support/env.rb +75 -0
  36. data/features/support/hooks.rb +8 -0
  37. data/features/switch_manager.feature +35 -0
  38. data/features/trema-config.feature +68 -0
  39. data/features/trema.dump_flows.feature +25 -0
  40. data/features/trema.feature +25 -0
  41. data/features/trema.kill.feature +53 -0
  42. data/features/trema.killall.feature +30 -0
  43. data/features/trema.reset_stats.feature +14 -0
  44. data/features/trema.run.feature +46 -0
  45. data/features/trema.send_packets.feature +56 -0
  46. data/features/trema.show_stats.feature +67 -0
  47. data/features/tutorial.hello_trema.feature +27 -0
  48. data/features/tutorial.packet_in.feature +47 -0
  49. data/features/tutorial.switch_info.feature +55 -0
  50. data/ruby/.gitignore +4 -0
  51. data/ruby/blocker.rb +78 -0
  52. data/ruby/extconf.rb +71 -0
  53. data/ruby/sub-process.rb +291 -0
  54. data/ruby/trema/action-common.c +60 -0
  55. data/ruby/trema/action-common.h +42 -0
  56. data/ruby/trema/action-enqueue.c +161 -0
  57. data/ruby/trema/action-enqueue.h +40 -0
  58. data/ruby/trema/action-output.c +169 -0
  59. data/ruby/trema/action-output.h +42 -0
  60. data/ruby/trema/action-set-dl-dst.c +131 -0
  61. data/ruby/trema/action-set-dl-dst.h +44 -0
  62. data/ruby/trema/action-set-dl-src.c +131 -0
  63. data/ruby/trema/action-set-dl-src.h +44 -0
  64. data/ruby/trema/action-set-nw-dst.c +135 -0
  65. data/ruby/trema/action-set-nw-dst.h +42 -0
  66. data/ruby/trema/action-set-nw-src.c +140 -0
  67. data/ruby/trema/action-set-nw-src.h +42 -0
  68. data/ruby/trema/action-set-nw-tos.c +124 -0
  69. data/ruby/trema/action-set-nw-tos.h +42 -0
  70. data/ruby/trema/action-set-tp-dst.c +122 -0
  71. data/ruby/trema/action-set-tp-dst.h +42 -0
  72. data/ruby/trema/action-set-tp-src.c +124 -0
  73. data/ruby/trema/action-set-tp-src.h +42 -0
  74. data/ruby/trema/action-set-vlan-pcp.c +128 -0
  75. data/ruby/trema/action-set-vlan-pcp.h +42 -0
  76. data/ruby/trema/action-set-vlan-vid.c +125 -0
  77. data/ruby/trema/action-set-vlan-vid.h +42 -0
  78. data/ruby/trema/action-strip-vlan.c +81 -0
  79. data/ruby/trema/action-strip-vlan.h +42 -0
  80. data/ruby/trema/action-vendor.c +121 -0
  81. data/ruby/trema/action-vendor.h +42 -0
  82. data/ruby/trema/aggregate-stats-reply.rb +70 -0
  83. data/ruby/trema/app.rb +112 -0
  84. data/ruby/trema/barrier-reply.c +99 -0
  85. data/ruby/trema/barrier-reply.h +46 -0
  86. data/ruby/trema/barrier-request.c +108 -0
  87. data/ruby/trema/barrier-request.h +44 -0
  88. data/ruby/trema/cli.rb +269 -0
  89. data/ruby/trema/command.rb +40 -0
  90. data/ruby/trema/command/dump_flows.rb +62 -0
  91. data/ruby/trema/command/kill.rb +71 -0
  92. data/ruby/trema/command/killall.rb +56 -0
  93. data/ruby/trema/command/reset_stats.rb +61 -0
  94. data/ruby/trema/command/ruby.rb +55 -0
  95. data/ruby/trema/command/run.rb +120 -0
  96. data/ruby/trema/command/send_packets.rb +130 -0
  97. data/ruby/trema/command/shell.rb +61 -0
  98. data/ruby/trema/command/show_stats.rb +84 -0
  99. data/ruby/trema/command/usage.rb +61 -0
  100. data/ruby/trema/command/version.rb +39 -0
  101. data/ruby/trema/controller.c +595 -0
  102. data/ruby/trema/controller.h +44 -0
  103. data/ruby/trema/controller.rb +81 -0
  104. data/ruby/trema/daemon.rb +167 -0
  105. data/ruby/trema/dsl.rb +34 -0
  106. data/ruby/trema/dsl/configuration.rb +153 -0
  107. data/ruby/trema/dsl/context.rb +71 -0
  108. data/ruby/trema/dsl/link.rb +41 -0
  109. data/ruby/trema/dsl/parser.rb +70 -0
  110. data/ruby/trema/dsl/run.rb +49 -0
  111. data/ruby/trema/dsl/runner.rb +165 -0
  112. data/ruby/trema/dsl/stanza.rb +53 -0
  113. data/ruby/trema/dsl/switch.rb +78 -0
  114. data/ruby/trema/dsl/syntax-error.rb +33 -0
  115. data/ruby/trema/dsl/syntax.rb +109 -0
  116. data/ruby/trema/dsl/vhost.rb +108 -0
  117. data/ruby/trema/dsl/vswitch.rb +47 -0
  118. data/ruby/trema/echo-reply.c +107 -0
  119. data/ruby/trema/echo-reply.h +42 -0
  120. data/ruby/trema/echo-request.c +140 -0
  121. data/ruby/trema/echo-request.h +42 -0
  122. data/ruby/trema/error.c +253 -0
  123. data/ruby/trema/error.h +44 -0
  124. data/ruby/trema/exact-match.rb +36 -0
  125. data/ruby/trema/executables.rb +95 -0
  126. data/ruby/trema/features-reply.c +238 -0
  127. data/ruby/trema/features-reply.h +60 -0
  128. data/ruby/trema/features-request.c +109 -0
  129. data/ruby/trema/features-request.h +44 -0
  130. data/ruby/trema/flow-removed.c +275 -0
  131. data/ruby/trema/flow-removed.h +46 -0
  132. data/ruby/trema/flow-stats-reply.rb +109 -0
  133. data/ruby/trema/flow.rb +56 -0
  134. data/ruby/trema/get-config-reply.c +159 -0
  135. data/ruby/trema/get-config-reply.h +52 -0
  136. data/ruby/trema/get-config-request.c +107 -0
  137. data/ruby/trema/get-config-request.h +44 -0
  138. data/ruby/trema/hello.c +110 -0
  139. data/ruby/trema/hello.h +44 -0
  140. data/ruby/trema/host.rb +257 -0
  141. data/ruby/trema/ip.rb +101 -0
  142. data/ruby/trema/link.rb +176 -0
  143. data/ruby/trema/list-switches-reply.c +46 -0
  144. data/ruby/trema/list-switches-reply.h +40 -0
  145. data/ruby/trema/logger.c +162 -0
  146. data/ruby/trema/logger.h +44 -0
  147. data/ruby/trema/mac.rb +151 -0
  148. data/ruby/trema/match.c +594 -0
  149. data/ruby/trema/match.h +36 -0
  150. data/ruby/trema/monkey-patch/integer.rb +35 -0
  151. data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
  152. data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
  153. data/ruby/trema/monkey-patch/module.rb +33 -0
  154. data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
  155. data/ruby/trema/monkey-patch/string.rb +33 -0
  156. data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
  157. data/ruby/trema/network-component.rb +153 -0
  158. data/ruby/trema/ofctl.rb +62 -0
  159. data/ruby/trema/open-vswitch.rb +154 -0
  160. data/ruby/trema/openflow-error.c +191 -0
  161. data/ruby/trema/openflow-error.h +53 -0
  162. data/ruby/trema/openflow-switch.rb +88 -0
  163. data/ruby/trema/ordered-hash.rb +74 -0
  164. data/ruby/trema/packet-queue.rb +178 -0
  165. data/ruby/trema/packet_in.c +736 -0
  166. data/ruby/trema/packet_in.h +46 -0
  167. data/ruby/trema/packetin-filter.rb +126 -0
  168. data/ruby/trema/path.rb +135 -0
  169. data/ruby/trema/phost.rb +69 -0
  170. data/ruby/trema/port-mod.c +226 -0
  171. data/ruby/trema/port-mod.h +36 -0
  172. data/ruby/trema/port-stats-reply.rb +111 -0
  173. data/ruby/trema/port-status.c +156 -0
  174. data/ruby/trema/port-status.h +45 -0
  175. data/ruby/trema/port.c +295 -0
  176. data/ruby/trema/port.h +47 -0
  177. data/ruby/trema/process.rb +76 -0
  178. data/ruby/trema/queue-get-config-reply.c +200 -0
  179. data/ruby/trema/queue-get-config-reply.h +47 -0
  180. data/ruby/trema/queue-get-config-request.c +141 -0
  181. data/ruby/trema/queue-get-config-request.h +44 -0
  182. data/ruby/trema/queue-stats-reply.rb +78 -0
  183. data/ruby/trema/set-config.c +171 -0
  184. data/ruby/trema/set-config.h +44 -0
  185. data/ruby/trema/shell.rb +39 -0
  186. data/ruby/trema/shell/down.rb +39 -0
  187. data/ruby/trema/shell/killall.rb +40 -0
  188. data/ruby/trema/shell/link.rb +61 -0
  189. data/ruby/trema/shell/reset_stats.rb +50 -0
  190. data/ruby/trema/shell/run.rb +67 -0
  191. data/ruby/trema/shell/send_packets.rb +42 -0
  192. data/ruby/trema/shell/show_stats.rb +49 -0
  193. data/ruby/trema/shell/up.rb +43 -0
  194. data/ruby/trema/shell/vhost.rb +44 -0
  195. data/ruby/trema/shell/vswitch.rb +49 -0
  196. data/ruby/trema/stats-helper.rb +65 -0
  197. data/ruby/trema/stats-reply.c +483 -0
  198. data/ruby/trema/stats-reply.h +53 -0
  199. data/ruby/trema/stats-request.c +634 -0
  200. data/ruby/trema/stats-request.h +42 -0
  201. data/ruby/trema/switch-daemon.rb +74 -0
  202. data/ruby/trema/switch-disconnected.c +40 -0
  203. data/ruby/trema/switch-disconnected.h +38 -0
  204. data/ruby/trema/switch-manager.rb +121 -0
  205. data/ruby/trema/switch.rb +37 -0
  206. data/ruby/trema/table-stats-reply.rb +87 -0
  207. data/ruby/trema/timers.rb +97 -0
  208. data/ruby/trema/trema.c +122 -0
  209. data/ruby/trema/tremashark.rb +39 -0
  210. data/ruby/trema/util.rb +84 -0
  211. data/ruby/trema/vendor-request.c +193 -0
  212. data/ruby/trema/vendor-request.h +44 -0
  213. data/ruby/trema/vendor-stats-reply.rb +62 -0
  214. data/ruby/trema/vendor.c +152 -0
  215. data/ruby/trema/vendor.h +52 -0
  216. data/ruby/trema/version.rb +30 -0
  217. data/spec/spec_helper.rb +153 -0
  218. data/spec/support/openflow-message.rb +94 -0
  219. data/spec/trema/action-enqueue_spec.rb +100 -0
  220. data/spec/trema/action-output_spec.rb +116 -0
  221. data/spec/trema/action-set-dl-dst_spec.rb +95 -0
  222. data/spec/trema/action-set-dl-src_spec.rb +92 -0
  223. data/spec/trema/action-set-nw-dst_spec.rb +96 -0
  224. data/spec/trema/action-set-nw-src_spec.rb +97 -0
  225. data/spec/trema/action-set-nw-tos_spec.rb +88 -0
  226. data/spec/trema/action-set-tp-dst_spec.rb +88 -0
  227. data/spec/trema/action-set-tp-src_spec.rb +88 -0
  228. data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
  229. data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
  230. data/spec/trema/action-strip-vlan_spec.rb +57 -0
  231. data/spec/trema/action-vendor_spec.rb +90 -0
  232. data/spec/trema/app_spec.rb +90 -0
  233. data/spec/trema/barrier-reply_spec.rb +45 -0
  234. data/spec/trema/barrier-request_spec.rb +83 -0
  235. data/spec/trema/cli_spec.rb +160 -0
  236. data/spec/trema/controller_spec.rb +100 -0
  237. data/spec/trema/dsl/configuration_spec.rb +122 -0
  238. data/spec/trema/dsl/link_spec.rb +54 -0
  239. data/spec/trema/dsl/run_spec.rb +78 -0
  240. data/spec/trema/dsl/runner_spec.rb +239 -0
  241. data/spec/trema/dsl/switch_spec.rb +77 -0
  242. data/spec/trema/dsl/syntax_spec.rb +121 -0
  243. data/spec/trema/dsl/vhost_spec.rb +148 -0
  244. data/spec/trema/dsl/vswitch_spec.rb +90 -0
  245. data/spec/trema/echo-reply_spec.rb +49 -0
  246. data/spec/trema/echo-request_spec.rb +75 -0
  247. data/spec/trema/error_spec.rb +142 -0
  248. data/spec/trema/executables_spec.rb +75 -0
  249. data/spec/trema/features-reply_spec.rb +57 -0
  250. data/spec/trema/features-request_spec.rb +66 -0
  251. data/spec/trema/flow-removed_spec.rb +146 -0
  252. data/spec/trema/get-config-reply_spec.rb +43 -0
  253. data/spec/trema/get-config-request_spec.rb +82 -0
  254. data/spec/trema/hello_spec.rb +49 -0
  255. data/spec/trema/host_spec.rb +193 -0
  256. data/spec/trema/link_spec.rb +64 -0
  257. data/spec/trema/list-switches-reply_spec.rb +48 -0
  258. data/spec/trema/logger_spec.rb +48 -0
  259. data/spec/trema/mac_spec.rb +115 -0
  260. data/spec/trema/match_spec.rb +113 -0
  261. data/spec/trema/open-vswitch_spec.rb +123 -0
  262. data/spec/trema/openflow-error_spec.rb +141 -0
  263. data/spec/trema/openflow-switch_spec.rb +56 -0
  264. data/spec/trema/packet-in_spec.rb +168 -0
  265. data/spec/trema/packet-out_spec.rb +128 -0
  266. data/spec/trema/packetin-filter_spec.rb +41 -0
  267. data/spec/trema/port-mod_spec.rb +101 -0
  268. data/spec/trema/port-status_spec.rb +108 -0
  269. data/spec/trema/port_spec.rb +61 -0
  270. data/spec/trema/process_spec.rb +71 -0
  271. data/spec/trema/queue-get-config-reply_spec.rb +66 -0
  272. data/spec/trema/queue-get-config-request_spec.rb +69 -0
  273. data/spec/trema/set-config_spec.rb +80 -0
  274. data/spec/trema/shell/vhost_spec.rb +57 -0
  275. data/spec/trema/shell/vswitch_spec.rb +89 -0
  276. data/spec/trema/stats-reply_spec.rb +306 -0
  277. data/spec/trema/stats-request_spec.rb +151 -0
  278. data/spec/trema/switch-disconnected_spec.rb +58 -0
  279. data/spec/trema/switch-manager_spec.rb +43 -0
  280. data/spec/trema/tremashark_spec.rb +41 -0
  281. data/spec/trema/util_spec.rb +93 -0
  282. data/spec/trema/vendor-request_spec.rb +79 -0
  283. data/src/examples/cbench_switch/README +21 -0
  284. data/src/examples/cbench_switch/cbench-switch.rb +39 -0
  285. data/src/examples/cbench_switch/cbench_switch.c +68 -0
  286. data/src/examples/dumper/dumper.c +370 -0
  287. data/src/examples/dumper/dumper.conf +7 -0
  288. data/src/examples/dumper/dumper.rb +196 -0
  289. data/src/examples/hello_trema/README +13 -0
  290. data/src/examples/hello_trema/hello_trema.c +51 -0
  291. data/src/examples/hello_trema/hello_trema.conf +3 -0
  292. data/src/examples/hello_trema/hello_trema.rb +35 -0
  293. data/src/examples/learning_switch/README +15 -0
  294. data/src/examples/learning_switch/fdb.rb +112 -0
  295. data/src/examples/learning_switch/learning-switch.rb +88 -0
  296. data/src/examples/learning_switch/learning_switch.c +236 -0
  297. data/src/examples/learning_switch/learning_switch.conf +18 -0
  298. data/src/examples/list_switches/README +19 -0
  299. data/src/examples/list_switches/list-switches.rb +45 -0
  300. data/src/examples/list_switches/list_switches.c +81 -0
  301. data/src/examples/list_switches/list_switches.conf +15 -0
  302. data/src/examples/match_compare/match-compare.conf +30 -0
  303. data/src/examples/match_compare/match-compare.rb +99 -0
  304. data/src/examples/multi_learning_switch/README +14 -0
  305. data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
  306. data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
  307. data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
  308. data/src/examples/openflow_message/README +11 -0
  309. data/src/examples/openflow_message/echo-reply.rb +59 -0
  310. data/src/examples/openflow_message/echo-request.rb +58 -0
  311. data/src/examples/openflow_message/echo_reply.c +70 -0
  312. data/src/examples/openflow_message/echo_request.c +70 -0
  313. data/src/examples/openflow_message/example.rb +63 -0
  314. data/src/examples/openflow_message/features-request.rb +97 -0
  315. data/src/examples/openflow_message/features_request.c +168 -0
  316. data/src/examples/openflow_message/hello.c +70 -0
  317. data/src/examples/openflow_message/hello.rb +58 -0
  318. data/src/examples/openflow_message/set-config.rb +59 -0
  319. data/src/examples/openflow_message/set_config.c +70 -0
  320. data/src/examples/packet_in/README +15 -0
  321. data/src/examples/packet_in/packet_in.c +55 -0
  322. data/src/examples/packet_in/packet_in.conf +15 -0
  323. data/src/examples/packet_in/packet_in.rb +34 -0
  324. data/src/examples/packetin_filter_config/README +12 -0
  325. data/src/examples/packetin_filter_config/add_filter.c +73 -0
  326. data/src/examples/packetin_filter_config/delete_filter.c +65 -0
  327. data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
  328. data/src/examples/packetin_filter_config/dump_filter.c +65 -0
  329. data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
  330. data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
  331. data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
  332. data/src/examples/packetin_filter_config/utils.c +102 -0
  333. data/src/examples/packetin_filter_config/utils.h +42 -0
  334. data/src/examples/repeater_hub/README +8 -0
  335. data/src/examples/repeater_hub/repeater-hub.rb +43 -0
  336. data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
  337. data/src/examples/repeater_hub/repeater_hub.c +83 -0
  338. data/src/examples/repeater_hub/repeater_hub.conf +28 -0
  339. data/src/examples/switch_info/README +13 -0
  340. data/src/examples/switch_info/switch_info.c +80 -0
  341. data/src/examples/switch_info/switch_info.conf +3 -0
  342. data/src/examples/switch_info/switch_info.rb +46 -0
  343. data/src/examples/switch_monitor/switch-monitor.conf +3 -0
  344. data/src/examples/switch_monitor/switch-monitor.rb +58 -0
  345. data/src/examples/switch_monitor/switch_monitor.c +154 -0
  346. data/src/examples/traffic_monitor/counter.c +74 -0
  347. data/src/examples/traffic_monitor/counter.h +48 -0
  348. data/src/examples/traffic_monitor/counter.rb +46 -0
  349. data/src/examples/traffic_monitor/fdb.c +76 -0
  350. data/src/examples/traffic_monitor/fdb.h +50 -0
  351. data/src/examples/traffic_monitor/fdb.rb +44 -0
  352. data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
  353. data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
  354. data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
  355. data/src/lib/arp.h +61 -0
  356. data/src/lib/bool.h +49 -0
  357. data/src/lib/buffer.c +305 -0
  358. data/src/lib/buffer.h +56 -0
  359. data/src/lib/byteorder.c +547 -0
  360. data/src/lib/byteorder.h +110 -0
  361. data/src/lib/checks.h +42 -0
  362. data/src/lib/daemon.c +302 -0
  363. data/src/lib/daemon.h +42 -0
  364. data/src/lib/doubly_linked_list.c +281 -0
  365. data/src/lib/doubly_linked_list.h +88 -0
  366. data/src/lib/ether.c +48 -0
  367. data/src/lib/ether.h +94 -0
  368. data/src/lib/etherip.h +46 -0
  369. data/src/lib/event_handler.c +389 -0
  370. data/src/lib/event_handler.h +64 -0
  371. data/src/lib/hash_table.c +417 -0
  372. data/src/lib/hash_table.h +138 -0
  373. data/src/lib/icmp.h +74 -0
  374. data/src/lib/igmp.h +50 -0
  375. data/src/lib/ipv4.h +50 -0
  376. data/src/lib/linked_list.c +199 -0
  377. data/src/lib/linked_list.h +84 -0
  378. data/src/lib/log.c +402 -0
  379. data/src/lib/log.h +78 -0
  380. data/src/lib/match.h +84 -0
  381. data/src/lib/match_table.c +608 -0
  382. data/src/lib/match_table.h +51 -0
  383. data/src/lib/message_queue.c +143 -0
  384. data/src/lib/message_queue.h +61 -0
  385. data/src/lib/messenger.c +1714 -0
  386. data/src/lib/messenger.h +145 -0
  387. data/src/lib/openflow_application_interface.c +1673 -0
  388. data/src/lib/openflow_application_interface.h +329 -0
  389. data/src/lib/openflow_message.c +4051 -0
  390. data/src/lib/openflow_message.h +288 -0
  391. data/src/lib/openflow_service_interface.h +59 -0
  392. data/src/lib/packet_info.c +230 -0
  393. data/src/lib/packet_info.h +209 -0
  394. data/src/lib/packet_parser.c +502 -0
  395. data/src/lib/packetin_filter_interface.c +294 -0
  396. data/src/lib/packetin_filter_interface.h +127 -0
  397. data/src/lib/persistent_storage.c +480 -0
  398. data/src/lib/persistent_storage.h +46 -0
  399. data/src/lib/stat.c +213 -0
  400. data/src/lib/stat.h +44 -0
  401. data/src/lib/tcp.h +67 -0
  402. data/src/lib/timer.c +350 -0
  403. data/src/lib/timer.h +53 -0
  404. data/src/lib/trema.c +710 -0
  405. data/src/lib/trema.h +79 -0
  406. data/src/lib/trema_private.c +177 -0
  407. data/src/lib/trema_private.h +60 -0
  408. data/src/lib/trema_wrapper.c +56 -0
  409. data/src/lib/trema_wrapper.h +64 -0
  410. data/src/lib/udp.h +43 -0
  411. data/src/lib/utility.c +515 -0
  412. data/src/lib/utility.h +67 -0
  413. data/src/lib/wrapper.c +100 -0
  414. data/src/lib/wrapper.h +76 -0
  415. data/src/packetin_filter/README +17 -0
  416. data/src/packetin_filter/packetin_filter.c +575 -0
  417. data/src/switch_manager/README +20 -0
  418. data/src/switch_manager/cookie_table.c +292 -0
  419. data/src/switch_manager/cookie_table.h +72 -0
  420. data/src/switch_manager/dpid_table.c +110 -0
  421. data/src/switch_manager/dpid_table.h +46 -0
  422. data/src/switch_manager/management_interface.h +44 -0
  423. data/src/switch_manager/ofpmsg_recv.c +482 -0
  424. data/src/switch_manager/ofpmsg_recv.h +42 -0
  425. data/src/switch_manager/ofpmsg_send.c +235 -0
  426. data/src/switch_manager/ofpmsg_send.h +50 -0
  427. data/src/switch_manager/secure_channel_listener.c +281 -0
  428. data/src/switch_manager/secure_channel_listener.h +42 -0
  429. data/src/switch_manager/secure_channel_receiver.c +126 -0
  430. data/src/switch_manager/secure_channel_receiver.h +43 -0
  431. data/src/switch_manager/secure_channel_sender.c +126 -0
  432. data/src/switch_manager/secure_channel_sender.h +43 -0
  433. data/src/switch_manager/service_interface.c +181 -0
  434. data/src/switch_manager/service_interface.h +46 -0
  435. data/src/switch_manager/switch.c +538 -0
  436. data/src/switch_manager/switch.h +51 -0
  437. data/src/switch_manager/switch_manager.c +448 -0
  438. data/src/switch_manager/switch_manager.h +63 -0
  439. data/src/switch_manager/switchinfo.h +72 -0
  440. data/src/switch_manager/xid_table.c +184 -0
  441. data/src/switch_manager/xid_table.h +56 -0
  442. data/src/tremashark/README +78 -0
  443. data/src/tremashark/packet_capture.c +357 -0
  444. data/src/tremashark/pcap_private.h +47 -0
  445. data/src/tremashark/pcap_queue.c +197 -0
  446. data/src/tremashark/pcap_queue.h +58 -0
  447. data/src/tremashark/plugin/.gitignore +6 -0
  448. data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
  449. data/src/tremashark/plugin/packet-trema/Makefile +77 -0
  450. data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
  451. data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
  452. data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
  453. data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
  454. data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
  455. data/src/tremashark/plugin/user_dlts +2 -0
  456. data/src/tremashark/queue.c +168 -0
  457. data/src/tremashark/queue.h +60 -0
  458. data/src/tremashark/stdin_relay.c +257 -0
  459. data/src/tremashark/syslog_relay.c +247 -0
  460. data/src/tremashark/tremashark.c +556 -0
  461. data/trema +93 -0
  462. data/trema-config +61 -0
  463. data/unittests/buffer_stubs.c +74 -0
  464. data/unittests/cmockery_trema.c +123 -0
  465. data/unittests/cmockery_trema.h +96 -0
  466. data/unittests/lib/buffer_test.c +370 -0
  467. data/unittests/lib/byteorder_test.c +1717 -0
  468. data/unittests/lib/daemon_test.c +664 -0
  469. data/unittests/lib/doubly_linked_list_test.c +346 -0
  470. data/unittests/lib/ether_test.c +127 -0
  471. data/unittests/lib/hash_table_test.c +278 -0
  472. data/unittests/lib/linked_list_test.c +343 -0
  473. data/unittests/lib/log_test.c +459 -0
  474. data/unittests/lib/match_table_test.c +1509 -0
  475. data/unittests/lib/message_queue_test.c +379 -0
  476. data/unittests/lib/messenger_test.c +438 -0
  477. data/unittests/lib/openflow_application_interface_test.c +3488 -0
  478. data/unittests/lib/openflow_message_test.c +7337 -0
  479. data/unittests/lib/packet_info_test.c +544 -0
  480. data/unittests/lib/packet_parser_test.c +703 -0
  481. data/unittests/lib/packetin_filter_interface_test.c +723 -0
  482. data/unittests/lib/persistent_storage_test.c +802 -0
  483. data/unittests/lib/stat_test.c +291 -0
  484. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  485. data/unittests/lib/test_packets/arp_req.cap +0 -0
  486. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  487. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  488. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  489. data/unittests/lib/test_packets/ipx.cap +0 -0
  490. data/unittests/lib/test_packets/lldp.cap +0 -0
  491. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  492. data/unittests/lib/test_packets/tcp.cap +0 -0
  493. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  494. data/unittests/lib/test_packets/udp.cap +0 -0
  495. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  496. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  497. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  498. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  499. data/unittests/lib/timer_test.c +248 -0
  500. data/unittests/lib/trema_private_test.c +323 -0
  501. data/unittests/lib/trema_test.c +985 -0
  502. data/unittests/lib/utility_test.c +628 -0
  503. data/unittests/lib/wrapper_test.c +201 -0
  504. data/unittests/packetin_filter/packetin_filter_test.c +477 -0
  505. data/unittests/switch_manager/switch_manager_test.c +1178 -0
  506. data/unittests/wrapper_stubs.c +39 -0
  507. data/vendor/.gitignore +6 -0
  508. data/vendor/README +30 -0
  509. data/vendor/cmockery-20110428.tar.gz +0 -0
  510. data/vendor/oflops-0.03.tar.gz +0 -0
  511. data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
  512. data/vendor/openflow-1.0.0.tar.gz +0 -0
  513. data/vendor/openflow.git.tar.gz +0 -0
  514. data/vendor/openvswitch-1.2.2.tar.gz +0 -0
  515. data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
  516. data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
  517. data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
  518. data/vendor/ruby-ifconfig-1.2/README +38 -0
  519. data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
  520. data/vendor/ruby-ifconfig-1.2/TODO +8 -0
  521. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
  522. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
  523. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
  524. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
  525. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
  526. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
  527. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
  528. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
  529. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
  530. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
  531. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
  532. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
  533. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
  534. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
  535. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
  536. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
  537. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
  538. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
  539. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
  540. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
  541. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
  542. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
  543. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
  544. data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
  545. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
  546. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
  547. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
  548. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
  549. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
  550. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
  551. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
  552. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
  553. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
  554. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
  555. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
  556. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
  557. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
  558. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
  559. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
  560. metadata +856 -0
@@ -0,0 +1,247 @@
1
+ /*
2
+ * syslog_relay: An application that relays syslog messages to tremashark
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
+ #include <errno.h>
24
+ #include <getopt.h>
25
+ #include <inttypes.h>
26
+ #include <string.h>
27
+ #include <sys/types.h>
28
+ #include <sys/socket.h>
29
+ #include <unistd.h>
30
+ #include "trema.h"
31
+
32
+
33
+ static char *dump_service_name = NULL;
34
+ static uint16_t listen_port = 514;
35
+ static int syslog_fd = -1;
36
+
37
+
38
+ static void
39
+ relay_syslog_message( buffer *message ) {
40
+ // retrieve current time
41
+ struct timespec now;
42
+ if ( clock_gettime( CLOCK_REALTIME, &now ) == -1 ) {
43
+ error( "Failed to retrieve system-wide real-time clock ( %s [%d] ).", strerror( errno ), errno );
44
+ return;
45
+ }
46
+
47
+ // allocate buffer
48
+ char *service_name = xstrdup( get_trema_name() );
49
+ uint16_t service_name_length = ( uint16_t ) ( strlen( service_name ) + 1 );
50
+ size_t buffer_length = sizeof( message_dump_header ) + service_name_length + sizeof( syslog_dump_header ) + message->length;
51
+ buffer *buf = alloc_buffer_with_length( buffer_length );
52
+
53
+ // syslog_dump_header + service_name
54
+ message_dump_header *mdh = append_back_buffer( buf, sizeof( message_dump_header ) );
55
+ mdh->sent_time.sec = htonl( ( uint32_t ) now.tv_sec );
56
+ mdh->sent_time.nsec = htonl( ( uint32_t ) now.tv_nsec );
57
+ mdh->app_name_length = htons( 0 );
58
+ mdh->service_name_length = htons( service_name_length );
59
+ mdh->data_length = htonl( ( uint32_t ) ( sizeof( syslog_dump_header ) + message->length ) );
60
+ void *svn = append_back_buffer( buf, service_name_length );
61
+ memcpy( svn, service_name, service_name_length );
62
+ xfree( service_name );
63
+
64
+ // syslog_dump_header
65
+ syslog_dump_header *sdh = append_back_buffer( buf, sizeof( syslog_dump_header ) );
66
+ sdh->sent_time.sec = htonl( ( uint32_t ) now.tv_sec );
67
+ sdh->sent_time.nsec = htonl( ( uint32_t ) now.tv_nsec );
68
+
69
+ // message
70
+ void *p = append_back_buffer( buf, message->length );
71
+ memcpy( p, message->data, message->length );
72
+
73
+ bool ret = send_message( dump_service_name, MESSENGER_DUMP_SYSLOG, buf->data, buf->length );
74
+ if ( !ret ) {
75
+ error( "Failed to relay syslog message." );
76
+ }
77
+ free_buffer( buf );
78
+ }
79
+
80
+
81
+ static void
82
+ recv_syslog_message( int fd, void *data ) {
83
+ UNUSED( data );
84
+
85
+ char buf[ 1024 ];
86
+ ssize_t ret = read( fd, buf, sizeof( buf ) );
87
+
88
+ if ( ret < 0 ) {
89
+ if ( errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK ) {
90
+ return;
91
+ }
92
+
93
+ error( "Receive error ( errno = %s [%d] ).", strerror( errno ), errno );
94
+
95
+ set_readable( fd, false );
96
+ delete_fd_handler( fd );
97
+ return;
98
+ }
99
+
100
+ buffer *message = alloc_buffer_with_length( ( size_t ) ret );
101
+ void *p = append_back_buffer( message, ( size_t ) ret );
102
+ memcpy( p, buf, ( size_t ) ret );
103
+
104
+ relay_syslog_message( message );
105
+
106
+ free_buffer( message );
107
+ }
108
+
109
+
110
+ void
111
+ usage( void ) {
112
+ printf(
113
+ "Usage: syslog_relay [OPTION]...\n"
114
+ "\n"
115
+ " -p LISTEN_PORT listen port for receiving syslog messages\n"
116
+ " -s DUMP_SERVICE_NAME dump service name\n"
117
+ " -n, --name=SERVICE_NAME service name\n"
118
+ " -d, --daemonize run in the background\n"
119
+ " -l, --logging_level=LEVEL set logging level\n"
120
+ " -h, --help display this help and exit\n"
121
+ );
122
+ }
123
+
124
+
125
+ static void
126
+ print_usage_and_exit( void ) {
127
+ usage();
128
+ exit( EXIT_FAILURE );
129
+ }
130
+
131
+
132
+ static void
133
+ parse_options( int *argc, char **argv[] ) {
134
+ int opt;
135
+
136
+ while( 1 ) {
137
+ opt = getopt( *argc, *argv, "p:s:" );
138
+
139
+ if( opt < 0 ){
140
+ break;
141
+ }
142
+
143
+ switch ( opt ){
144
+ case 'p':
145
+ if ( ( optarg != NULL ) && ( atoi( optarg ) <= UINT16_MAX ) && ( atoi ( optarg ) >= 0 ) ) {
146
+ listen_port = ( uint16_t ) atoi( optarg );
147
+ }
148
+ else {
149
+ print_usage_and_exit();
150
+ }
151
+ break;
152
+
153
+ case 's':
154
+ if ( optarg && dump_service_name == NULL ) {
155
+ dump_service_name = xstrdup( optarg );
156
+ }
157
+ else {
158
+ print_usage_and_exit();
159
+ }
160
+ break;
161
+
162
+ default:
163
+ print_usage_and_exit();
164
+ }
165
+ }
166
+
167
+ if ( dump_service_name == NULL ) {
168
+ dump_service_name = xstrdup( DEFAULT_DUMP_SERVICE_NAME );
169
+ }
170
+ }
171
+
172
+
173
+ static bool
174
+ init_syslog_relay( int *argc, char **argv[] ) {
175
+ parse_options( argc, argv );
176
+
177
+ if ( syslog_fd >= 0 ) {
178
+ close( syslog_fd );
179
+ syslog_fd = -1;
180
+ }
181
+
182
+ syslog_fd = socket( PF_INET, SOCK_DGRAM, 0 );
183
+ if ( syslog_fd < 0 ) {
184
+ error( "Failed to create socket ( errno = %s [%d] ).", strerror( errno ), errno );
185
+ return false;
186
+ }
187
+
188
+ struct sockaddr_in addr;
189
+ memset( &addr, 0, sizeof( struct sockaddr_in ) );
190
+ addr.sin_family = AF_INET;
191
+ addr.sin_port = htons( listen_port );
192
+ addr.sin_addr.s_addr = htonl( INADDR_ANY );
193
+
194
+ int ret = bind( syslog_fd, ( struct sockaddr * ) &addr, sizeof( struct sockaddr_in ) );
195
+ if ( ret < 0 ) {
196
+ error( "Failed to bind socket ( errno = %s [%d] ).", strerror( errno ), errno );
197
+ close( syslog_fd );
198
+ syslog_fd = -1;
199
+ return false;
200
+ }
201
+
202
+ set_fd_handler( syslog_fd, recv_syslog_message, NULL, NULL, NULL );
203
+ set_readable( syslog_fd, true );
204
+
205
+ return true;
206
+ }
207
+
208
+
209
+ static bool
210
+ finalize_syslog_relay( void ) {
211
+ if ( syslog_fd >= 0 ) {
212
+ set_readable( syslog_fd, false );
213
+ delete_fd_handler( syslog_fd );
214
+
215
+ close( syslog_fd );
216
+ syslog_fd = -1;
217
+ }
218
+
219
+ xfree( dump_service_name );
220
+ dump_service_name = NULL;
221
+
222
+ return true;
223
+ }
224
+
225
+
226
+ int
227
+ main( int argc, char *argv[] ) {
228
+ // Initialize the Trema world
229
+ init_trema( &argc, &argv );
230
+ init_syslog_relay( &argc, &argv );
231
+
232
+ // Main loop
233
+ start_trema();
234
+
235
+ // Cleanup
236
+ finalize_syslog_relay();
237
+
238
+ return 0;
239
+ }
240
+
241
+
242
+ /*
243
+ * Local variables:
244
+ * c-basic-offset: 2
245
+ * indent-tabs-mode: nil
246
+ * End:
247
+ */
@@ -0,0 +1,556 @@
1
+ /*
2
+ * tremashark: A bridge for printing various events on Wireshark
3
+ *
4
+ * Author: Yasunobu Chiba, Yasunori Nakazawa
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #include <assert.h>
24
+ #include <errno.h>
25
+ #include <fcntl.h>
26
+ #include <getopt.h>
27
+ #include <inttypes.h>
28
+ #include <linux/limits.h>
29
+ #include <pcap.h>
30
+ #include <signal.h>
31
+ #include <stdarg.h>
32
+ #include <stdio.h>
33
+ #include <string.h>
34
+ #include <sys/select.h>
35
+ #include <sys/stat.h>
36
+ #include <sys/time.h>
37
+ #include <sys/types.h>
38
+ #include <unistd.h>
39
+ #include "trema.h"
40
+ #include "pcap_private.h"
41
+ #include "pcap_queue.h"
42
+
43
+
44
+ #define FIFO_NAME "tremashark"
45
+ #define WIRESHARK "wireshark"
46
+ #define TSHARK "tshark"
47
+ #define FLUSH_INTERVAL 250000000 // nanoseconds
48
+ #define MESSAGE_BUFFER_LENGTH 100000 // microseconds
49
+
50
+ #define WRITE_SUCCESS 0
51
+ #define WRITE_BUSY 1
52
+ #define WRITE_ERROR -1
53
+
54
+
55
+ static char fifo_pathname[ PATH_MAX ];
56
+ static char pcap_file_pathname[ PATH_MAX ];
57
+ static bool output_to_pcap_file = false;
58
+ static bool launch_wireshark = true;
59
+ static bool launch_tshark = false;
60
+ static bool trust_remote_clocks = true;
61
+ static bool use_circular_buffer = false;
62
+ static int circular_buffer_length = 1024;
63
+ static int outfile_fd = -1;
64
+ static uint64_t total = 0;
65
+ static uint64_t lost = 0;
66
+
67
+
68
+ // Special purpose header for telling extra information to wireshark
69
+ typedef struct {
70
+ uint16_t dump_type;
71
+ struct {
72
+ uint32_t sec;
73
+ uint32_t nsec;
74
+ } sent_time;
75
+ uint16_t app_name_len;
76
+ uint16_t service_name_len;
77
+ uint32_t data_len;
78
+ } __attribute__( ( packed ) ) message_pcap_dump_header;
79
+
80
+
81
+ static void
82
+ init_fifo_pathname() {
83
+ assert( strlen( get_trema_tmp() ) + strlen( FIFO_NAME ) + 1 <= PATH_MAX );
84
+
85
+ snprintf( fifo_pathname, PATH_MAX, "%s/%s", get_trema_tmp(), FIFO_NAME );
86
+ }
87
+
88
+
89
+ static int
90
+ write_to_file( buffer *packet ) {
91
+ assert( packet != NULL && packet->data != NULL && packet->length > 0 );
92
+ assert( outfile_fd >= 0 );
93
+
94
+ ssize_t ret = write( outfile_fd, packet->data, packet->length );
95
+ if ( ret < 0 ) {
96
+ int err = errno;
97
+ if ( err == EAGAIN || err == EWOULDBLOCK ) {
98
+ return WRITE_BUSY;
99
+ }
100
+ error( "write error ( errno = %s [%d] ).", strerror( err), err );
101
+ return WRITE_ERROR;
102
+ }
103
+
104
+ if ( ret != ( ssize_t ) packet->length ) {
105
+ packet->data = ( char * ) packet->data + ret;
106
+ packet->length = packet->length - ( unsigned int ) ret;
107
+ return WRITE_BUSY;
108
+ }
109
+
110
+ return WRITE_SUCCESS;
111
+ }
112
+
113
+
114
+ static void
115
+ dump_message( uint16_t tag, void *data, size_t len ) {
116
+ char *app_name, *service_name;
117
+ const char *type_str[] = { "sent", "received", "recv-connected", "recv-overflow", "recv-closed",
118
+ "send-connected", "send-refused", "send-overflow", "send-closed",
119
+ "logger", "pcap", "syslog", "text" };
120
+ size_t pcap_dump_header_length;
121
+ struct pcap_pkthdr_private pcap_header;
122
+ message_dump_header *dump_hdr;
123
+ message_pcap_dump_header *pcap_dump_hdr;
124
+ message_header *hdr;
125
+ buffer *packet;
126
+ queue_status status;
127
+
128
+ dump_hdr = data;
129
+
130
+ app_name = ( char * ) ( dump_hdr + 1 );
131
+ service_name = app_name + ntohs( dump_hdr->app_name_length );
132
+ hdr = ( message_header * ) ( service_name + ntohs( dump_hdr->service_name_length ) );
133
+
134
+ debug( "app: %s type: %s service_name: %s", app_name, type_str[ tag ], service_name );
135
+
136
+ if ( ntohl( dump_hdr->data_length ) > 0 ) {
137
+ debug( "message type: %d, length: %u", tag, ntohl( dump_hdr->data_length ) );
138
+ }
139
+
140
+ size_t dump_header_length = ( sizeof( message_dump_header ) +
141
+ ntohs( dump_hdr->app_name_length ) +
142
+ ntohs( dump_hdr->service_name_length ) );
143
+
144
+ pcap_dump_header_length = ( sizeof( message_pcap_dump_header ) +
145
+ ntohs( dump_hdr->app_name_length ) +
146
+ ntohs( dump_hdr->service_name_length ) );
147
+
148
+ pcap_dump_hdr = xmalloc( pcap_dump_header_length );
149
+
150
+ pcap_dump_hdr->dump_type = htons( tag );
151
+ pcap_dump_hdr->sent_time.sec = dump_hdr->sent_time.sec;
152
+ pcap_dump_hdr->sent_time.nsec = dump_hdr->sent_time.nsec;
153
+ pcap_dump_hdr->app_name_len = dump_hdr->app_name_length;
154
+ pcap_dump_hdr->service_name_len = dump_hdr->service_name_length;
155
+ pcap_dump_hdr->data_len = dump_hdr->data_length;
156
+
157
+ char *pcap_dump_app_name = ( char * ) ( pcap_dump_hdr + 1 );
158
+ memcpy( pcap_dump_app_name, app_name, ntohs( pcap_dump_hdr->app_name_len ) );
159
+ if ( ntohs( pcap_dump_hdr->service_name_len ) > 0 ) {
160
+ char *pcap_dump_service_name = pcap_dump_app_name + ntohs( pcap_dump_hdr->app_name_len );
161
+ memcpy( pcap_dump_service_name, service_name, ntohs( pcap_dump_hdr->service_name_len ) );
162
+ }
163
+
164
+ memset( &pcap_header, 0, sizeof( struct pcap_pkthdr_private ) );
165
+ if ( trust_remote_clocks ) {
166
+ pcap_header.ts.tv_sec = ( bpf_int32 ) ntohl( dump_hdr->sent_time.sec );
167
+ pcap_header.ts.tv_usec = ( bpf_int32 ) ( ntohl( dump_hdr->sent_time.nsec ) / 1000 );
168
+ }
169
+ else {
170
+ struct timeval ts;
171
+ gettimeofday( &ts, NULL );
172
+ pcap_header.ts.tv_sec = ( bpf_int32 ) ts.tv_sec;
173
+ pcap_header.ts.tv_usec = ( bpf_int32 ) ts.tv_usec;
174
+ }
175
+
176
+ len -= dump_header_length;
177
+
178
+ pcap_header.caplen = ( bpf_u_int32 ) ( pcap_dump_header_length + ntohl( pcap_dump_hdr->data_len ) );
179
+ pcap_header.len = ( bpf_u_int32 ) ( pcap_dump_header_length + ntohl( pcap_dump_hdr->data_len ) );
180
+
181
+ packet = create_pcap_packet( &pcap_header, sizeof( struct pcap_pkthdr_private ),
182
+ pcap_dump_hdr, pcap_dump_header_length,
183
+ hdr, ntohl( pcap_dump_hdr->data_len ) );
184
+ xfree( pcap_dump_hdr );
185
+
186
+ if ( use_circular_buffer ) {
187
+ buffer *dummy;
188
+ while ( get_pcap_queue_length() >= circular_buffer_length ) {
189
+ dummy = NULL;
190
+ dequeue_pcap_packet( &dummy );
191
+ if ( dummy != NULL ) {
192
+ delete_pcap_packet( dummy );
193
+ }
194
+ }
195
+ }
196
+
197
+ status = enqueue_pcap_packet( packet );
198
+ if ( status == QUEUE_FULL ) {
199
+ warn( "tremashark queue is full. packet is discarded." );
200
+ delete_pcap_packet( packet );
201
+ lost++;
202
+ }
203
+ total++;
204
+ }
205
+
206
+
207
+ static void
208
+ write_pcap_packet( void *user_data ) {
209
+ UNUSED( user_data );
210
+
211
+ sort_pcap_queue();
212
+
213
+ struct timeval now;
214
+ gettimeofday( &now, NULL );
215
+ struct timeval buffer_length;
216
+ buffer_length.tv_sec = 0;
217
+ buffer_length.tv_usec = MESSAGE_BUFFER_LENGTH;
218
+ struct timeval threshold;
219
+
220
+ timersub( &now, &buffer_length, &threshold );
221
+
222
+ for ( ; ; ) {
223
+ buffer *packet;
224
+ queue_status status = peek_pcap_packet( &packet );
225
+ if ( status == QUEUE_EMPTY ) {
226
+ break;
227
+ }
228
+
229
+ struct pcap_pkthdr_private *p = packet->data;
230
+ if ( ( p->ts.tv_sec > threshold.tv_sec ) ||
231
+ ( p->ts.tv_sec == threshold.tv_sec && p->ts.tv_usec > threshold.tv_usec ) ) {
232
+ break;
233
+ }
234
+
235
+ int ret = write_to_file( packet );
236
+ switch ( ret ) {
237
+ case WRITE_SUCCESS:
238
+ status = dequeue_pcap_packet( &packet );
239
+ if ( status == QUEUE_SUCCESS && packet != NULL ) {
240
+ delete_pcap_packet( packet );
241
+ }
242
+ break;
243
+
244
+ case WRITE_BUSY:
245
+ case WRITE_ERROR:
246
+ return;
247
+
248
+ default:
249
+ assert( 0 );
250
+ }
251
+ }
252
+
253
+ fsync( outfile_fd );
254
+
255
+ return;
256
+ }
257
+
258
+
259
+ static void
260
+ set_timer_event() {
261
+ if ( use_circular_buffer ) {
262
+ return;
263
+ }
264
+
265
+ struct itimerspec interval;
266
+
267
+ interval.it_value.tv_sec = 0;
268
+ interval.it_value.tv_nsec = 0;
269
+ interval.it_interval.tv_sec = 0;
270
+ interval.it_interval.tv_nsec = FLUSH_INTERVAL;
271
+
272
+ bool ret = add_timer_event_callback( &interval, write_pcap_packet, NULL );
273
+ if ( !ret ) {
274
+ critical( "failed in set timer event" );
275
+ abort();
276
+ }
277
+ return;
278
+ }
279
+
280
+
281
+ static void
282
+ init_pcap() {
283
+ struct pcap_file_header header;
284
+ memset( &header, 0, sizeof( struct pcap_file_header ) );
285
+ header.magic = 0xa1b2c3d4;
286
+ header.version_major = PCAP_VERSION_MAJOR;
287
+ header.version_minor = PCAP_VERSION_MINOR;
288
+ header.thiszone = 0;
289
+ header.sigfigs = 0;
290
+ header.snaplen = UINT16_MAX; // FIXME
291
+ header.linktype = DLT_USER0; // FIXME
292
+
293
+ mode_t mode = ( S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH );
294
+ if ( output_to_pcap_file ) {
295
+ outfile_fd = open( pcap_file_pathname, O_RDWR | O_CREAT | O_TRUNC, mode );
296
+ if ( outfile_fd < 0 ) {
297
+ critical( "Failed to open a file (%s).", pcap_file_pathname );
298
+ assert( 0 );
299
+ }
300
+ }
301
+ else {
302
+ int ret = mkfifo( fifo_pathname, mode );
303
+ if ( ret < 0 ) {
304
+ critical( "Failed to create a named pipe." );
305
+ assert( 0 );
306
+ }
307
+
308
+ outfile_fd = open( fifo_pathname, O_RDWR | O_APPEND | O_NONBLOCK );
309
+ if ( outfile_fd < 0 ) {
310
+ critical( "Failed to open a named pipe." );
311
+ assert( 0 );
312
+ }
313
+ }
314
+
315
+ ssize_t ret = write( outfile_fd, &header, sizeof( struct pcap_file_header ) );
316
+
317
+ if ( ret != sizeof( struct pcap_file_header ) ) {
318
+ critical( "Failed to write a pcap header." );
319
+ assert( 0 );
320
+ }
321
+
322
+ fsync( outfile_fd );
323
+ }
324
+
325
+
326
+ static void
327
+ finalize_pcap() {
328
+ if ( outfile_fd >= 0 ) {
329
+ fsync( outfile_fd );
330
+ close( outfile_fd );
331
+ outfile_fd = -1;
332
+ }
333
+
334
+ unlink( fifo_pathname );
335
+ }
336
+
337
+
338
+ static void
339
+ write_circular_buffer( void ) {
340
+ if ( !output_to_pcap_file ) {
341
+ return;
342
+ }
343
+
344
+ if ( outfile_fd < 0 ) {
345
+ init_pcap();
346
+ }
347
+
348
+ sort_pcap_queue();
349
+
350
+ foreach_pcap_queue( ( void * ) write_to_file );
351
+
352
+ finalize_pcap();
353
+
354
+ return;
355
+ }
356
+
357
+
358
+ static void
359
+ set_write_circular_buffer( void ) {
360
+ if ( set_external_callback != NULL ) {
361
+ set_external_callback( write_circular_buffer );
362
+ }
363
+ }
364
+
365
+
366
+ static void
367
+ set_signal_handler( void ) {
368
+ // Note that this overrides a default signal handler set by Trema.
369
+ struct sigaction signal_usr2;
370
+ memset( &signal_usr2, 0, sizeof( struct sigaction ) );
371
+ signal_usr2.sa_handler = ( void * ) set_write_circular_buffer;
372
+ sigaction( SIGUSR2, &signal_usr2, NULL );
373
+ }
374
+
375
+
376
+ static void
377
+ start_wireshark() {
378
+ pid_t pid;
379
+
380
+ if ( !launch_wireshark && !launch_tshark ) {
381
+ return;
382
+ }
383
+
384
+ pid = fork();
385
+
386
+ if ( pid < 0 ) {
387
+ assert( 0 );
388
+ }
389
+
390
+ if ( pid == 0 ) {
391
+ if ( launch_wireshark ) {
392
+ execlp( WIRESHARK, "wireshark", "-k", "-i", fifo_pathname, NULL );
393
+ }
394
+ else if ( launch_tshark ) {
395
+ execlp( TSHARK, "tshark", "-V", "-i", fifo_pathname, NULL );
396
+ }
397
+ }
398
+ }
399
+
400
+
401
+ void
402
+ usage( void ) {
403
+ printf(
404
+ "Usage: tremashark [OPTION]...\n"
405
+ "\n"
406
+ " -t launch tshark instead of wireshark\n"
407
+ " -w FILE_TO_SAVE save messages to pcap file\n"
408
+ " -p do not launch wireshark nor tshark\n"
409
+ " -r do not trust remote clock\n"
410
+ " -c NUMBER_OF_MESSAGES save messages to circular buffer\n"
411
+ " -s DUMP_SERVICE_NAME dump service name\n"
412
+ " -n, --name=SERVICE_NAME service name\n"
413
+ " -d, --daemonize run in the background\n"
414
+ " -l, --logging_level=LEVEL set logging level\n"
415
+ " -h, --help display this help and exit\n"
416
+ );
417
+ }
418
+
419
+
420
+ static void
421
+ print_usage_and_exit( void ) {
422
+ usage();
423
+ exit( EXIT_FAILURE );
424
+ }
425
+
426
+
427
+ static void
428
+ parse_options( int *argc, char **argv[] ) {
429
+ char *service_name = NULL;
430
+ int opt;
431
+
432
+ while ( 1 ) {
433
+ opt = getopt( *argc, *argv, "c:s:tw:pr" );
434
+
435
+ if ( opt < 0 ) {
436
+ break;
437
+ }
438
+
439
+ switch ( opt ) {
440
+ case 'p':
441
+ launch_wireshark = false;
442
+ launch_tshark = false;
443
+ break;
444
+
445
+ case 't':
446
+ launch_wireshark = false;
447
+ launch_tshark = true;
448
+ break;
449
+
450
+ case 'r':
451
+ trust_remote_clocks = false;
452
+ break;
453
+
454
+ case 's':
455
+ if ( optarg && service_name == NULL ) {
456
+ service_name = xmalloc( strlen( optarg ) + 1 );
457
+ strcpy( service_name, optarg );
458
+ }
459
+ else {
460
+ print_usage_and_exit();
461
+ }
462
+ break;
463
+
464
+ case 'w':
465
+ if ( optarg ) {
466
+ // Save packets to a pcap file
467
+ strncpy( pcap_file_pathname, optarg, PATH_MAX );
468
+ output_to_pcap_file = true;
469
+ launch_wireshark = false;
470
+ launch_tshark = false;
471
+ }
472
+ else {
473
+ print_usage_and_exit();
474
+ }
475
+ break;
476
+
477
+ case 'c':
478
+ use_circular_buffer = true;
479
+ launch_wireshark = false;
480
+ launch_tshark = false;
481
+ if ( optarg ) {
482
+ int n = atoi( optarg );
483
+ if ( n > 0 ) {
484
+ circular_buffer_length = n;
485
+ set_max_pcap_queue_length( circular_buffer_length );
486
+ }
487
+ else {
488
+ print_usage_and_exit();
489
+ }
490
+ }
491
+ break;
492
+
493
+ default:
494
+ print_usage_and_exit();
495
+ }
496
+ }
497
+
498
+ if ( use_circular_buffer && !output_to_pcap_file ) {
499
+ printf( "-w FILE_NAME option must be specified in conjunction with -c.\n" );
500
+ print_usage_and_exit();
501
+ }
502
+
503
+ // Set an event handler
504
+ if ( service_name == NULL ) {
505
+ add_message_received_callback( DEFAULT_DUMP_SERVICE_NAME, dump_message );
506
+ }
507
+ else {
508
+ add_message_received_callback( service_name, dump_message );
509
+ xfree( service_name );
510
+ }
511
+ }
512
+
513
+
514
+ int
515
+ main( int argc, char *argv[] ) {
516
+ // Initialize the Trema world
517
+ init_trema( &argc, &argv );
518
+ parse_options( &argc, &argv );
519
+ init_fifo_pathname();
520
+
521
+ // create queue for storing pcap packets
522
+ create_pcap_queue();
523
+
524
+ // Initialize an interface to wireshark
525
+ init_pcap();
526
+
527
+ // Start wireshark/tshark if necessary
528
+ start_wireshark();
529
+
530
+ // Set timer event to write packet
531
+ set_timer_event();
532
+
533
+ // Set signal handler to dump circular buffer
534
+ set_signal_handler();
535
+
536
+ // Main loop
537
+ start_trema();
538
+
539
+ // Cleanup
540
+ finalize_pcap();
541
+ delete_pcap_queue();
542
+
543
+ if ( lost > 0 ) {
544
+ warn( "%" PRIu64 "/%" PRIu64 " messages lost.", lost, total );
545
+ }
546
+
547
+ return 0;
548
+ }
549
+
550
+
551
+ /*
552
+ * Local variables:
553
+ * c-basic-offset: 2
554
+ * indent-tabs-mode: nil
555
+ * End:
556
+ */