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,53 @@
1
+ /*
2
+ * Timer events and callbacks.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef TIMER_H
24
+ #define TIMER_H
25
+
26
+
27
+ #include <stdbool.h>
28
+ #include <time.h>
29
+
30
+
31
+ typedef void ( *timer_callback )( void *user_data );
32
+
33
+
34
+ extern bool ( *init_timer )( void );
35
+ extern bool ( *finalize_timer )( void );
36
+
37
+ extern bool ( *add_timer_event_callback )( struct itimerspec *interval, timer_callback callback, void *user_data );
38
+ extern bool ( *add_periodic_event_callback )( const time_t seconds, timer_callback callback, void *user_data );
39
+
40
+ extern bool ( *delete_timer_event )( timer_callback callback, void *user_data );
41
+
42
+ extern void ( *execute_timer_events )( int *next_timeout_usec );
43
+
44
+
45
+ #endif // TIMER_H
46
+
47
+
48
+ /*
49
+ * Local variables:
50
+ * c-basic-offset: 2
51
+ * indent-tabs-mode: nil
52
+ * End:
53
+ */
@@ -0,0 +1,710 @@
1
+ /*
2
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
+ *
4
+ * Copyright (C) 2008-2012 NEC Corporation
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License, version 2, as
8
+ * published by the Free Software Foundation.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+
21
+ #include <assert.h>
22
+ #include <errno.h>
23
+ #include <getopt.h>
24
+ #include <libgen.h>
25
+ #include <limits.h>
26
+ #include <pthread.h>
27
+ #include <signal.h>
28
+ #include <stdio.h>
29
+ #include <stdlib.h>
30
+ #include <string.h>
31
+ #include <sys/stat.h>
32
+ #include <sys/types.h>
33
+ #include <unistd.h>
34
+ #include "trema.h"
35
+ #include "daemon.h"
36
+ #include "doubly_linked_list.h"
37
+ #include "log.h"
38
+ #include "messenger.h"
39
+ #include "openflow_application_interface.h"
40
+ #include "packetin_filter_interface.h"
41
+ #include "timer.h"
42
+ #include "trema_private.h"
43
+ #include "utility.h"
44
+ #include "wrapper.h"
45
+
46
+
47
+ #ifdef UNIT_TESTING
48
+
49
+ #ifdef init_log
50
+ #undef init_log
51
+ #endif
52
+ #define init_log mock_init_log
53
+ bool mock_init_log( const char *ident, const char *log_directory, bool run_as_daemon );
54
+
55
+ #ifdef error
56
+ #undef error
57
+ #endif
58
+ #define error mock_error
59
+ void mock_error( const char *format, ... );
60
+
61
+ #ifdef set_logging_level
62
+ #undef set_logging_level
63
+ #endif
64
+ #define set_logging_level mock_set_logging_level
65
+ bool mock_set_logging_level( const char *level );
66
+
67
+ #ifdef daemonize
68
+ #undef daemonize
69
+ #endif
70
+ #define daemonize mock_daemonize
71
+ void mock_daemonize( const char *home );
72
+
73
+ #ifdef write_pid
74
+ #undef write_pid
75
+ #endif
76
+ #define write_pid mock_write_pid
77
+ void mock_write_pid( const char *directory, const char *name );
78
+
79
+ #ifdef unlink_pid
80
+ #undef unlink_pid
81
+ #endif
82
+ #define unlink_pid mock_unlink_pid
83
+ void mock_unlink_pid( const char *directory, const char *name );
84
+
85
+ #ifdef rename_pid
86
+ #undef rename_pid
87
+ #endif
88
+ #define rename_pid mock_rename_pid
89
+ void mock_rename_pid( const char *directory, const char *old, const char *new );
90
+
91
+ #ifdef read_pid
92
+ #undef read_pid
93
+ #endif
94
+ #define read_pid mock_read_pid
95
+ pid_t mock_read_pid( const char *directory, const char *name );
96
+
97
+ #ifdef kill
98
+ #undef kill
99
+ #endif
100
+ #define kill mock_kill
101
+ int mock_kill( pid_t pid, int sig );
102
+
103
+ #ifdef sleep
104
+ #undef sleep
105
+ #endif
106
+ #define sleep mock_sleep
107
+ unsigned int mock_sleep( unsigned int seconds );
108
+
109
+ #ifdef init_event_handler
110
+ #undef init_event_handler
111
+ #endif
112
+ #define init_event_handler mock_init_event_handler
113
+ void mock_init_event_handler( void );
114
+
115
+ #ifdef start_event_handler
116
+ #undef start_event_handler
117
+ #endif
118
+ #define start_event_handler mock_start_event_handler
119
+ void mock_start_event_handler( void );
120
+
121
+ #ifdef stop_event_handler
122
+ #undef stop_event_handler
123
+ #endif
124
+ #define stop_event_handler mock_stop_event_handler
125
+ void mock_stop_event_handler( void );
126
+
127
+ #ifdef init_messenger
128
+ #undef init_messenger
129
+ #endif
130
+ #define init_messenger mock_init_messenger
131
+ void mock_init_messenger( const char *working_directory );
132
+
133
+ #ifdef start_messenger
134
+ #undef start_messenger
135
+ #endif
136
+ #define start_messenger mock_start_messenger
137
+ void mock_start_messenger( void );
138
+
139
+ #ifdef flush_messenger
140
+ #undef flush_messenger
141
+ #endif
142
+ #define flush_messenger mock_flush_messenger
143
+ void mock_flush_messenger( void );
144
+
145
+ #ifdef stop_messenger
146
+ #undef stop_messenger
147
+ #endif
148
+ #define stop_messenger mock_stop_messenger
149
+ void mock_stop_messenger( void );
150
+
151
+ #ifdef finalize_messenger
152
+ #undef finalize_messenger
153
+ #endif
154
+ #define finalize_messenger mock_finalize_messenger
155
+ void mock_finalize_messenger( void );
156
+
157
+ #ifdef start_messenger_dump
158
+ #undef start_messenger_dump
159
+ #endif
160
+ #define start_messenger_dump mock_start_messenger_dump
161
+ void mock_start_messenger_dump( const char *dump_app_name, const char *dump_service_name );
162
+
163
+ #ifdef stop_messenger_dump
164
+ #undef stop_messenger_dump
165
+ #endif
166
+ #define stop_messenger_dump mock_stop_messenger_dump
167
+ void mock_stop_messenger_dump();
168
+
169
+ #ifdef messenger_dump_enabled
170
+ #undef messenger_dump_enabled
171
+ #endif
172
+ #define messenger_dump_enabled mock_messenger_dump_enabled
173
+ bool mock_messenger_dump_enabled();
174
+
175
+ #ifdef die
176
+ #undef die
177
+ #endif
178
+ #define die mock_die
179
+ void mock_die( const char *format, ... );
180
+
181
+ #ifdef exit
182
+ #undef exit
183
+ #endif
184
+ #define exit mock_exit
185
+ void mock_exit( int status );
186
+
187
+ #ifdef openflow_application_interface_is_initialized
188
+ #undef openflow_application_interface_is_initialized
189
+ #endif
190
+ #define openflow_application_interface_is_initialized mock_openflow_application_interface_is_initialized
191
+ bool mock_openflow_application_interface_is_initialized( void );
192
+
193
+ #ifdef finalize_openflow_application_interface
194
+ #undef finalize_openflow_application_interface
195
+ #endif
196
+ #define finalize_openflow_application_interface mock_finalize_openflow_application_interface
197
+ bool mock_finalize_openflow_application_interface( void );
198
+
199
+ #ifdef printf
200
+ #undef printf
201
+ #endif
202
+ #define printf mock_printf
203
+ int mock_printf(const char *format, ...);
204
+
205
+ typedef struct stat _stat;
206
+ #ifdef stat
207
+ #undef stat
208
+ #endif
209
+ #define stat mock_stat
210
+ int mock_stat( const char *path, _stat *buf );
211
+
212
+ #ifdef debug
213
+ #undef debug
214
+ #endif
215
+ #define debug mock_debug
216
+ void mock_debug( const char *format, ... );
217
+
218
+ #ifdef init_stat
219
+ #undef init_stat
220
+ #endif
221
+ #define init_stat mock_init_stat
222
+ bool mock_init_stat();
223
+
224
+ #ifdef finalize_stat
225
+ #undef finalize_stat
226
+ #endif
227
+ #define finalize_stat mock_finalize_stat
228
+ bool mock_finalize_stat();
229
+
230
+ #ifdef init_timer
231
+ #undef init_timer
232
+ #endif
233
+ #define init_timer mock_init_timer
234
+ bool mock_init_timer();
235
+
236
+ #ifdef finalize_timer
237
+ #undef finalize_timer
238
+ #endif
239
+ #define finalize_timer mock_finalize_timer
240
+ bool mock_finalize_timer();
241
+
242
+ #ifdef set_external_callback
243
+ #undef set_external_callback
244
+ #endif
245
+ #define set_external_callback mock_set_external_callback
246
+ bool mock_set_external_callback( void ( *callback ) ( void ) );
247
+
248
+ #ifdef dump_stats
249
+ #undef dump_stats
250
+ #endif
251
+ #define dump_stats mock_dump_stats
252
+ void mock_dump_stats();
253
+
254
+ #ifdef finalize_packetin_filter_interface
255
+ #undef finalize_packetin_filter_interface
256
+ #endif
257
+ #define finalize_packetin_filter_interface mock_finalize_packetin_filter_interface
258
+ bool mock_finalize_packetin_filter_interface();
259
+
260
+ #define static
261
+
262
+ #endif // UNIT_TESTING
263
+
264
+
265
+ #ifndef UNIT_TESTING
266
+ #define _stat struct stat
267
+ #endif // not UNIT_TESTING
268
+
269
+
270
+ static bool initialized = false;
271
+ static bool trema_started = false;
272
+ static bool run_as_daemon = false;
273
+ static char *trema_name = NULL;
274
+ static char *executable_name = NULL;
275
+ static char *trema_log = NULL;
276
+ static char *trema_pid = NULL;
277
+ static char *trema_sock = NULL;
278
+ static pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
279
+
280
+
281
+ static struct option long_options[] = {
282
+ { "name", 1, NULL, 'n' },
283
+ { "daemonize", 0, NULL, 'd' },
284
+ { "logging_level", 1, NULL, 'l' },
285
+ { "help", 0, NULL, 'h' },
286
+ { NULL, 0, NULL, 0 },
287
+ };
288
+ static char short_options[] = "n:dl:h";
289
+
290
+
291
+ /**
292
+ * Default usage function shown on <tt>-h</tt> or <tt>--help</tt>.
293
+ *
294
+ * This can be overridden by defining your own <tt>void usage( void )</tt>
295
+ * in your Trema application.
296
+ */
297
+ void
298
+ usage() {
299
+ printf(
300
+ "Usage: %s [OPTION]...\n"
301
+ "\n"
302
+ " -n, --name=SERVICE_NAME service name\n"
303
+ " -d, --daemonize run in the background\n"
304
+ " -l, --logging_level=LEVEL set logging level\n"
305
+ " -h, --help display this help and exit\n",
306
+ executable_name
307
+ );
308
+ }
309
+
310
+
311
+ static const char *
312
+ get_trema_log() {
313
+ if ( trema_log == NULL ) {
314
+ char path[ PATH_MAX ];
315
+ sprintf( path, "%s/log", get_trema_tmp() );
316
+ trema_log = xstrdup( path );
317
+ }
318
+ return trema_log;
319
+ }
320
+
321
+
322
+ static const char *
323
+ get_trema_pid() {
324
+ if ( trema_pid == NULL ) {
325
+ char path[ PATH_MAX ];
326
+ sprintf( path, "%s/pid", get_trema_tmp() );
327
+ trema_pid = xstrdup( path );
328
+ }
329
+ return trema_pid;
330
+ }
331
+
332
+
333
+ static const char *
334
+ get_trema_sock() {
335
+ if ( trema_sock == NULL ) {
336
+ char path[ PATH_MAX ];
337
+ sprintf( path, "%s/sock", get_trema_tmp() );
338
+ trema_sock = xstrdup( path );
339
+ }
340
+ return trema_sock;
341
+ }
342
+
343
+
344
+ static void
345
+ maybe_finalize_openflow_application_interface() {
346
+ if ( openflow_application_interface_is_initialized() ) {
347
+ finalize_openflow_application_interface();
348
+ }
349
+ }
350
+
351
+
352
+ static void
353
+ die_unless_initialized() {
354
+ if ( !initialized ) {
355
+ die( "Trema is not initialized. Call init_trema() first." );
356
+ }
357
+ }
358
+
359
+
360
+ static void
361
+ finalize_trema() {
362
+ die_unless_initialized();
363
+
364
+ debug( "Terminating %s...", get_trema_name() );
365
+
366
+ maybe_finalize_openflow_application_interface();
367
+ finalize_packetin_filter_interface();
368
+ finalize_messenger();
369
+ finalize_stat();
370
+ finalize_timer();
371
+ trema_started = false;
372
+ unlink_pid( get_trema_pid(), get_trema_name() );
373
+ xfree( trema_name );
374
+ trema_name = NULL;
375
+ xfree( executable_name );
376
+ executable_name = NULL;
377
+
378
+ unset_trema_home();
379
+ unset_trema_tmp();
380
+
381
+ xfree( trema_log );
382
+ trema_log = NULL;
383
+
384
+ initialized = false;
385
+ }
386
+
387
+
388
+ static void
389
+ check_trema_tmp() {
390
+ _stat st;
391
+ int ret = stat( get_trema_tmp(), &st );
392
+ if ( ( ret != 0 ) && ( errno == ENOENT ) ) {
393
+ die( "Trema temporary directory does not exist: %s", get_trema_tmp() );
394
+ }
395
+ }
396
+
397
+
398
+ static void
399
+ reset_getopt() {
400
+ optind = 0;
401
+ opterr = 1;
402
+ }
403
+
404
+
405
+ static void
406
+ parse_argv( int *argc, char ***argv ) {
407
+ assert( argc != NULL );
408
+ assert( argv != NULL );
409
+
410
+ int argc_tmp = *argc;
411
+ char *new_argv[ *argc ];
412
+
413
+ run_as_daemon = false;
414
+
415
+ set_trema_name( basename( ( *argv )[ 0 ] ) );
416
+ executable_name = xstrdup( get_trema_name() );
417
+
418
+ for ( int i = 0; i < *argc; ++i ) {
419
+ new_argv[ i ] = ( *argv )[ i ];
420
+ }
421
+
422
+ for ( ;; ) {
423
+ opterr = 0;
424
+ int c = getopt_long( *argc, *argv, short_options, long_options, NULL );
425
+
426
+ if ( c == -1 ) {
427
+ break;
428
+ }
429
+
430
+ switch ( c ) {
431
+ case 'n':
432
+ set_trema_name( optarg );
433
+ break;
434
+ case 'd':
435
+ run_as_daemon = true;
436
+ break;
437
+ case 'l':
438
+ set_logging_level( optarg );
439
+ break;
440
+ case 'h':
441
+ usage();
442
+ xfree( trema_name );
443
+ xfree( executable_name );
444
+ exit( EXIT_SUCCESS );
445
+ break;
446
+ default:
447
+ continue;
448
+ }
449
+
450
+ if ( optarg == NULL || strchr( new_argv[ optind - 1 ], '=' ) != NULL ) {
451
+ argc_tmp -= 1;
452
+ new_argv[ optind - 1 ] = NULL;
453
+ }
454
+ else {
455
+ argc_tmp -= 2;
456
+ new_argv[ optind - 1 ] = NULL;
457
+ new_argv[ optind - 2 ] = NULL;
458
+ }
459
+ }
460
+
461
+ for ( int i = 0, j = 0; i < *argc; ++i ) {
462
+ if ( new_argv[ i ] != NULL ) {
463
+ ( *argv )[ j ] = new_argv[ i ];
464
+ j++;
465
+ }
466
+ }
467
+ if ( argc_tmp < *argc ) {
468
+ ( *argv )[ argc_tmp ] = NULL;
469
+ }
470
+ *argc = argc_tmp;
471
+
472
+ reset_getopt();
473
+ }
474
+
475
+
476
+ static void
477
+ ignore_sigpipe() {
478
+ struct sigaction sigpipe_ignore;
479
+
480
+ memset( &sigpipe_ignore, 0, sizeof( struct sigaction ) );
481
+ sigpipe_ignore.sa_handler = SIG_IGN;
482
+ sigaction( SIGPIPE, &sigpipe_ignore, NULL );
483
+ }
484
+
485
+
486
+ static void
487
+ set_exit_handler() {
488
+ struct sigaction signal_exit;
489
+
490
+ memset( &signal_exit, 0, sizeof( struct sigaction ) );
491
+ signal_exit.sa_handler = ( void * ) stop_trema;
492
+ sigaction( SIGINT, &signal_exit, NULL );
493
+ sigaction( SIGTERM, &signal_exit, NULL );
494
+ }
495
+
496
+
497
+ static void
498
+ set_dump_stats_as_external_callback() {
499
+ set_external_callback( dump_stats );
500
+ }
501
+
502
+
503
+ static void
504
+ set_usr1_handler() {
505
+ struct sigaction signal_usr1;
506
+
507
+ memset( &signal_usr1, 0, sizeof( struct sigaction ) );
508
+ signal_usr1.sa_handler = ( void * ) set_dump_stats_as_external_callback;
509
+ sigaction( SIGUSR1, &signal_usr1, NULL );
510
+ }
511
+
512
+
513
+ static void
514
+ toggle_messenger_dump() {
515
+ if ( messenger_dump_enabled() ) {
516
+ stop_messenger_dump();
517
+ }
518
+ else {
519
+ start_messenger_dump( get_trema_name(), DEFAULT_DUMP_SERVICE_NAME );
520
+ }
521
+ }
522
+
523
+
524
+ static void
525
+ set_usr2_handler() {
526
+ struct sigaction signal_usr2;
527
+
528
+ memset( &signal_usr2, 0, sizeof( struct sigaction ) );
529
+ signal_usr2.sa_handler = ( void * ) toggle_messenger_dump;
530
+ sigaction( SIGUSR2, &signal_usr2, NULL );
531
+ }
532
+
533
+
534
+ static void
535
+ maybe_daemonize() {
536
+ if ( run_as_daemon ) {
537
+ daemonize( get_trema_home() );
538
+ }
539
+ }
540
+
541
+
542
+ /**
543
+ * Call this function before using any other Trema functions in your
544
+ * applications.
545
+ *
546
+ * It will initialize everything needed to handle OpenFlow events and
547
+ * parses some standard command line options. <tt>argc</tt> and
548
+ * <tt>argv</tt> are adjusted accordingly so your own code will never
549
+ * see those standard arguments.
550
+ */
551
+ void
552
+ init_trema( int *argc, char ***argv ) {
553
+ assert( argc != NULL );
554
+ assert( argv != NULL );
555
+
556
+ pthread_mutex_lock( &mutex );
557
+
558
+ trema_name = NULL;
559
+ trema_log = NULL;
560
+ executable_name = NULL;
561
+ initialized = false;
562
+ trema_started = false;
563
+ run_as_daemon = false;
564
+
565
+ parse_argv( argc, argv );
566
+ set_trema_home();
567
+ set_trema_tmp();
568
+ check_trema_tmp();
569
+ init_log( get_trema_name(), get_trema_log(), run_as_daemon );
570
+ ignore_sigpipe();
571
+ set_exit_handler();
572
+ set_usr1_handler();
573
+ set_usr2_handler();
574
+ init_messenger( get_trema_sock() );
575
+ init_stat();
576
+ init_timer();
577
+
578
+ initialized = true;
579
+
580
+ pthread_mutex_unlock( &mutex );
581
+ }
582
+
583
+
584
+ /**
585
+ * Runs the main loop.
586
+ */
587
+ void
588
+ start_trema() {
589
+ start_trema_up();
590
+ start_event_handler();
591
+ start_trema_down();
592
+ }
593
+
594
+
595
+ void
596
+ start_trema_up() {
597
+ pthread_mutex_lock( &mutex );
598
+
599
+ die_unless_initialized();
600
+
601
+ debug( "Starting %s ... (TREMA_HOME = %s)", get_trema_name(), get_trema_home() );
602
+
603
+ maybe_daemonize();
604
+ write_pid( get_trema_pid(), get_trema_name() );
605
+ trema_started = true;
606
+
607
+ start_messenger();
608
+ }
609
+
610
+
611
+ void
612
+ start_trema_down() {
613
+ finalize_trema();
614
+
615
+ pthread_mutex_unlock( &mutex );
616
+ }
617
+
618
+
619
+ void
620
+ flush() {
621
+ flush_messenger();
622
+ }
623
+
624
+
625
+ /**
626
+ * Exits from the main loop.
627
+ */
628
+ void
629
+ stop_trema() {
630
+ stop_event_handler();
631
+ stop_messenger();
632
+ }
633
+
634
+
635
+ void
636
+ set_trema_name( const char *name ) {
637
+ assert( name != NULL );
638
+ if ( trema_name != NULL ) {
639
+ if ( trema_started ) {
640
+ rename_pid( get_trema_pid(), trema_name, name );
641
+ rename_log( trema_name, name, get_trema_log() );
642
+ }
643
+ xfree( trema_name );
644
+ }
645
+ trema_name = xstrdup( name );
646
+
647
+ if ( initialized ) {
648
+ restart_log( trema_name, get_trema_log() );
649
+ }
650
+ }
651
+
652
+
653
+ /**
654
+ * Returns the ID of your Trema application.
655
+ */
656
+ const char *
657
+ get_trema_name() {
658
+ assert( trema_name != NULL );
659
+ return trema_name;
660
+ }
661
+
662
+
663
+ /**
664
+ * Returns the basename of <tt>argv[ 0 ]</tt>. This function is useful
665
+ * for your application's <tt>usage()</tt> function.
666
+ */
667
+ const char *
668
+ get_executable_name() {
669
+ assert( executable_name != NULL );
670
+ return executable_name;
671
+ }
672
+
673
+
674
+ pid_t
675
+ get_trema_process_from_name( const char *name ) {
676
+ return read_pid( get_trema_pid(), name );
677
+ }
678
+
679
+
680
+ bool
681
+ terminate_trema_process( pid_t pid ) {
682
+ assert( pid > 0 );
683
+ int res = kill( pid, SIGTERM );
684
+ if ( res < 0 ) {
685
+ if ( errno == ESRCH ) {
686
+ return true;
687
+ }
688
+ error( "Failed to kill %d ( %s [%d] ).", pid, strerror( errno ), errno );
689
+ return false;
690
+ }
691
+
692
+ int try = 0;
693
+ const int max_try = 10;
694
+ while ( kill( pid, 0 ) == 0 && ++try <= max_try ) {
695
+ sleep( 1 );
696
+ }
697
+ if ( try > max_try ) {
698
+ error( "Failed to terminate %d.", pid );
699
+ return false;
700
+ }
701
+ return true;
702
+ }
703
+
704
+
705
+ /*
706
+ * Local variables:
707
+ * c-basic-offset: 2
708
+ * indent-tabs-mode: nil
709
+ * End:
710
+ */