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,140 @@
1
+ #
2
+ # Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
+ #
4
+ # Copyright (C) 2008-2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+
21
+ require "rubygems"
22
+ require "bundler"
23
+
24
+
25
+ begin
26
+ Bundler.setup :default, :development
27
+ rescue Bundler::BundlerError => e
28
+ $stderr.puts e.message
29
+ $stderr.puts "Run `bundle install` to install missing gems"
30
+ exit e.status_code
31
+ end
32
+
33
+
34
+ require "rake"
35
+
36
+ task :default do
37
+ system "./build.rb"
38
+ end
39
+
40
+
41
+ require "jeweler"
42
+
43
+ Jeweler::Tasks.new do |gem|
44
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
45
+ gem.name = "trema"
46
+ gem.homepage = "http://github.com/trema/trema"
47
+ gem.license = "GPL2"
48
+ gem.summary = %Q{Full-Stack OpenFlow Framework for Ruby/C}
49
+ gem.description = %Q{Trema is a full-stack, easy-to-use framework for developing OpenFlow controllers in Ruby/C}
50
+ gem.email = "yasuhito@gmail.com"
51
+ gem.authors = ["Yasuhito Takamiya"]
52
+ # dependencies defined in Gemfile
53
+ end
54
+ Jeweler::RubygemsDotOrgTasks.new
55
+
56
+
57
+ require "rspec/core"
58
+ require "rspec/core/rake_task"
59
+
60
+ RSpec::Core::RakeTask.new( :spec ) do | spec |
61
+ spec.pattern = FileList[ "spec/**/*_spec.rb" ]
62
+ end
63
+
64
+ RSpec::Core::RakeTask.new( :rcov ) do | spec |
65
+ spec.pattern = "spec/**/*_spec.rb"
66
+ spec.rcov = true
67
+ end
68
+
69
+
70
+ require "cucumber/rake/task"
71
+ Cucumber::Rake::Task.new( :features )
72
+
73
+
74
+ desc "Enforce Ruby code quality with static analysis of code"
75
+ task :quality => [ :reek, :roodi, :flog, :flay ]
76
+
77
+
78
+ require "reek/rake/task"
79
+
80
+ Reek::Rake::Task.new do | t |
81
+ t.fail_on_error = true
82
+ t.verbose = false
83
+ t.ruby_opts = [ "-rubygems" ]
84
+ t.reek_opts = "--quiet"
85
+ t.source_files = "ruby/**/*.rb"
86
+ end
87
+
88
+
89
+ require "roodi"
90
+ require "roodi_task"
91
+
92
+ RoodiTask.new do | t |
93
+ t.verbose = false
94
+ t.patterns = %w(ruby/**/*.rb spec/**/*.rb features/**/*.rb)
95
+ end
96
+
97
+
98
+ require "flog"
99
+
100
+ desc "Analyze for code complexity"
101
+ task :flog do
102
+ flog = Flog.new( :continue => true )
103
+ flog.flog [ "ruby" ]
104
+ threshold = 10
105
+
106
+ bad_methods = flog.totals.select do | name, score |
107
+ name != "main#none" && score > threshold
108
+ end
109
+ bad_methods.sort do | a, b |
110
+ a[ 1 ] <=> b[ 1 ]
111
+ end.each do | name, score |
112
+ puts "%8.1f: %s" % [ score, name ]
113
+ end
114
+ unless bad_methods.empty?
115
+ raise "#{ bad_methods.size } methods have a flog complexity > #{ threshold }"
116
+ end
117
+ end
118
+
119
+
120
+ require "flay"
121
+ require "flay_task"
122
+
123
+ FlayTask.new do | t |
124
+ # add directories such as app, bin, spec and test if need be.
125
+ t.dirs = %w( ruby )
126
+ t.threshold = 0
127
+ end
128
+
129
+
130
+ desc "Generate a monolithic rant file"
131
+ task "build.rb" do
132
+ sh "rant-import --force --auto .mono.rant"
133
+ end
134
+
135
+
136
+ require "yard"
137
+
138
+ YARD::Rake::YardocTask.new do | t |
139
+ t.options << "--debug" << "--verbose" if $trace
140
+ end
@@ -0,0 +1,834 @@
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
+ $LOAD_PATH.unshift File.expand_path( File.join File.dirname( __FILE__ ), "ruby" )
22
+ $LOAD_PATH.unshift File.expand_path( File.join File.dirname( __FILE__ ), "vendor", "ruby-ifconfig-1.2", "lib" )
23
+
24
+
25
+ require "trema/executables"
26
+ require "trema/path"
27
+ require "trema/dsl/parser"
28
+
29
+ import "c/dependencies"
30
+ import "directedrule"
31
+
32
+
33
+ ################################################################################
34
+ # Main tasks
35
+ ################################################################################
36
+
37
+ desc "Build trema."
38
+ task :default => [
39
+ :libtrema,
40
+ :rubylib,
41
+ :switch_manager,
42
+ :switch,
43
+ :packetin_filter,
44
+ :tremashark,
45
+ :packet_capture,
46
+ :syslog_relay,
47
+ :stdin_relay,
48
+ :vendor,
49
+ :examples
50
+ ]
51
+
52
+
53
+ task :examples => [
54
+ "examples:cbench_switch",
55
+ "examples:dumper",
56
+ "examples:hello_trema",
57
+ "examples:learning_switch",
58
+ "examples:list_switches",
59
+ "examples:multi_learning_switch",
60
+ "examples:openflow_message",
61
+ "examples:packet_in",
62
+ "examples:repeater_hub",
63
+ "examples:packetin_filter_config",
64
+ "examples:switch_info",
65
+ "examples:switch_monitor",
66
+ "examples:traffic_monitor",
67
+ ]
68
+
69
+
70
+ import "clean"
71
+
72
+ desc "Cleanup generated files."
73
+ gen Clean
74
+
75
+ var[ :clean ] << Trema.objects
76
+ var[ :clean ] << File.join( Trema.home, "objects/unittests" )
77
+ var[ :clean ] << File.join( Trema.home, "unittests/objects" )
78
+ var[ :clean ] << Trema::DSL::Context::PATH
79
+
80
+
81
+ desc "Cleanup everything."
82
+ task :distclean => :clean
83
+
84
+
85
+ desc "Generate build.rb."
86
+ task :buildrb do
87
+ sys "rant-import --force --imports c/dependencies,directedrule,clean,sys/tgz build.rb"
88
+ sys "chmod +x build.rb"
89
+ end
90
+
91
+
92
+ ################################################################################
93
+ # Helpers
94
+ ################################################################################
95
+
96
+ def objects path
97
+ File.join Trema.objects, path
98
+ end
99
+
100
+
101
+ def dependency name
102
+ file = ".#{ name }.dependency"
103
+ var[ :clean ] << file
104
+ ".#{ name }.dependency"
105
+ end
106
+
107
+
108
+ def trema_include
109
+ "#{ Trema.home }/src/lib"
110
+ end
111
+
112
+
113
+ def trema_lib
114
+ "#{ Trema.home }/objects/lib"
115
+ end
116
+
117
+
118
+ def openflow_include
119
+ "#{ Trema.home }/objects/openflow"
120
+ end
121
+
122
+
123
+ ################################################################################
124
+ # !!!!!! DO NOT MODIFY !!!!!!
125
+ ################################################################################
126
+
127
+ var :CFLAGS => "-g -std=gnu99 -D_GNU_SOURCE -fno-strict-aliasing -Werror -Wall -Wextra -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wfloat-equal -Wpointer-arith"
128
+
129
+
130
+ ################################################################################
131
+ # Run cbench benchmarks.
132
+ ################################################################################
133
+
134
+ def cbench_command
135
+ File.join Trema.objects, "oflops/bin/cbench"
136
+ end
137
+
138
+
139
+ def trema_cbench_command
140
+ "./trema run ./objects/examples/cbench_switch/cbench_switch -d"
141
+ end
142
+
143
+
144
+ def cbench_latency_mode_options
145
+ "--switches 1 --loops 10 --delay 1000"
146
+ end
147
+
148
+
149
+ def cbench_throughput_mode_options
150
+ cbench_latency_mode_options + " --throughput"
151
+ end
152
+
153
+
154
+ def cbench options
155
+ begin
156
+ sys trema_cbench_command
157
+ sys "#{ cbench_command } #{ options }"
158
+ ensure
159
+ sys "./trema killall"
160
+ end
161
+ end
162
+
163
+
164
+ var[ :clean ].include sys[ "callgrind.out.*" ]
165
+
166
+ def cbench_profile options
167
+ valgrind = "valgrind --tool=callgrind --trace-children=yes"
168
+ begin
169
+ sys "#{ valgrind } #{ trema_cbench_command }"
170
+ sys "#{ cbench_command } #{ options }"
171
+ ensure
172
+ sys "./trema killall"
173
+ end
174
+ end
175
+
176
+
177
+ desc "Run cbench openflow controller benchmarks."
178
+ task :cbench => :default do
179
+ cbench cbench_latency_mode_options
180
+ cbench cbench_throughput_mode_options
181
+ end
182
+
183
+
184
+ desc "Run cbench with profiling enabled."
185
+ task "cbench:profile" => :default do
186
+ cbench_profile cbench_latency_mode_options
187
+ cbench_profile cbench_throughput_mode_options
188
+ end
189
+
190
+
191
+ ################################################################################
192
+ # Build vendor/*
193
+ ################################################################################
194
+
195
+ import "sys/tgz"
196
+
197
+
198
+ task :vendor => [
199
+ "vendor:oflops",
200
+ "vendor:openflow",
201
+ "vendor:openvswitch",
202
+ "vendor:phost",
203
+ ]
204
+
205
+ task :distclean => [
206
+ "vendor:cmockery:distclean",
207
+ "vendor:oflops:distclean",
208
+ "vendor:openflow:distclean",
209
+ "vendor:openvswitch:distclean",
210
+ "vendor:phost:distclean",
211
+ ]
212
+
213
+
214
+ #
215
+ # OpenFlow reference implementation
216
+ #
217
+
218
+ gen Directory, Trema.objects
219
+
220
+ task "vendor:openflow" => Trema.openflow_h
221
+ file Trema.openflow_h => Trema.objects do
222
+ sys.unpack_tgz "#{ Trema::Vendor.openflow }.tar.gz", :in => Trema::Vendor.path
223
+ sys.cp_r "#{ Trema::Vendor.openflow }/include/openflow", Trema.objects
224
+ end
225
+
226
+ task "vendor:openflow:distclean" do
227
+ sys.rm_rf Trema::Vendor.openflow
228
+ end
229
+
230
+
231
+ #
232
+ # Use the Stanford openflow reference software to compile and copy the wireshark
233
+ # plugin to enable viewing of openflow messages.
234
+ # The plugin would be compiled and copied to your home directory
235
+ # (.wireshark/plugins) if it is found, otherwise it is left for you to copy
236
+ # from openflow.git/utilities/wireshark_dissectors/openflow directory
237
+ #
238
+ desc "Build openflow wireshark plugin"
239
+ task :openflow_wireshark_plugin => Trema::Vendor.openflow_wireshark_plugin
240
+ file Trema::Vendor.openflow_wireshark_plugin do | t |
241
+ sys.unpack_tgz "#{ t.name }.tar.gz", :in => Trema::Vendor.path
242
+ subpath = "utilities/wireshark_dissectors/openflow"
243
+ sys.cd "#{ Trema::Vendor.openflow_wireshark_plugin }/#{ subpath }" do
244
+ sys "make"
245
+ plugin_path = "#{ File.expand_path(" ~ ") }/.wireshark/plugins"
246
+ sys.cp "packet-openflow.so", plugin_path if File.directory?( plugin_path )
247
+ end
248
+ end
249
+
250
+
251
+ task "openflow_wireshark_plugin:clean" => "openflow_wireshark_plugin:distclean"
252
+ task "openflow_wireshark_plugin:distclean" do
253
+ sys.rm_rf Trema::Vendor.openflow_wireshark_plugin
254
+ end
255
+
256
+
257
+ #
258
+ # Open vSwitch
259
+ #
260
+
261
+ task "vendor:openvswitch" => Trema::Executables.ovs_openflowd
262
+ file Trema::Executables.ovs_openflowd do
263
+ sys.unpack_tgz "#{ Trema::Vendor.openvswitch }.tar.gz", :in => Trema::Vendor.path
264
+ sys.cd Trema::Vendor.openvswitch do
265
+ sys "./configure --prefix=#{ Trema.openvswitch } --with-rundir=#{ Trema.sock_directory }"
266
+ sys "make install"
267
+ sys "cp ./tests/test-openflowd #{ Trema::Executables.ovs_openflowd }"
268
+ end
269
+ end
270
+
271
+ task "vendor:openvswitch:distclean" do
272
+ sys.rm_rf Trema::Vendor.openvswitch
273
+ end
274
+
275
+
276
+ #
277
+ # oflops
278
+ #
279
+
280
+ task "vendor:oflops" => cbench_command
281
+ file cbench_command => Trema.openflow_h do
282
+ sys.unpack_tgz "#{ Trema::Vendor.oflops }.tar.gz", :in => Trema::Vendor.path
283
+ sys.cd Trema::Vendor.oflops do
284
+ sys "./configure --prefix=#{ Trema.oflops } --with-openflow-src-dir=#{ Trema::Vendor.openflow }"
285
+ sys "make install"
286
+ end
287
+ end
288
+
289
+ task "vendor:oflops:distclean" do
290
+ sys.rm_rf Trema::Vendor.oflops
291
+ end
292
+
293
+
294
+ #
295
+ # phost
296
+ #
297
+
298
+ def phost_src
299
+ File.join Trema::Vendor.phost, "src"
300
+ end
301
+
302
+
303
+ task "vendor:phost" => [ Trema::Executables.phost, Trema::Executables.cli ]
304
+
305
+ file Trema::Executables.phost do
306
+ sys.cd phost_src do
307
+ sys "make"
308
+ end
309
+ sys.mkdir_p File.dirname( Trema::Executables.phost )
310
+ sys.install File.join( phost_src, "phost" ), Trema::Executables.phost, :mode => 0755
311
+ end
312
+
313
+ file Trema::Executables.cli do
314
+ sys.cd phost_src do
315
+ sys "make"
316
+ end
317
+ sys.mkdir_p File.dirname( Trema::Executables.cli )
318
+ sys.install File.join( phost_src, "cli" ), Trema::Executables.cli, :mode => 0755
319
+ end
320
+
321
+ task "vendor:phost:distclean" do
322
+ begin
323
+ sys.cd phost_src do
324
+ sys "make clean"
325
+ end
326
+ rescue
327
+ # ignore.
328
+ end
329
+ end
330
+
331
+
332
+ #
333
+ # cmockery
334
+ #
335
+
336
+ task "vendor:cmockery" => Trema.libcmockery_a
337
+ file Trema.libcmockery_a do
338
+ sys.unpack_tgz "#{ Trema::Vendor.cmockery }.tar.gz", :in => Trema::Vendor.path
339
+ sys.cd Trema::Vendor.cmockery do
340
+ sys "./configure --prefix=#{ Trema.cmockery }"
341
+ sys "make install"
342
+ end
343
+ end
344
+
345
+ task "vendor:cmockery:distclean" do
346
+ sys.rm_rf Trema::Vendor.cmockery
347
+ end
348
+
349
+
350
+ ################################################################################
351
+ # Build libtrema.a
352
+ ################################################################################
353
+
354
+ build_libtrema_a = Proc.new do | t |
355
+ sys "rm -f #{ t.name }"
356
+ sys "ar -cq #{ t.name } #{ sys.sp t.prerequisites }"
357
+ sys "ranlib #{ t.name }"
358
+ end
359
+
360
+
361
+ task dependency( "libtrema" ) => "vendor:openflow"
362
+ gen C::Dependencies, dependency( "libtrema" ),
363
+ :search => [ trema_include, objects( "openflow" ) ],
364
+ :sources => sys[ "#{ trema_include }/*.c" ]
365
+
366
+ gen Action do
367
+ source dependency( "libtrema" )
368
+ end
369
+
370
+
371
+ gen Directory, trema_lib
372
+ gen Directory, "#{ Trema.home }/objects/unittests"
373
+
374
+ libtrema = File.join( trema_lib, "libtrema.a" )
375
+ libtrema_gcov = File.join( "#{ Trema.home }/objects/unittests", "libtrema.a" )
376
+
377
+ libtrema_o = gen DirectedRule, trema_lib => [ trema_include ], :o => :c do | t |
378
+ sys "gcc -I#{ objects "openflow" } #{ var :CFLAGS } -fPIC -c -o #{ t.name } #{ t.source }"
379
+ end
380
+ libtrema_gcov_o = gen DirectedRule, "#{ Trema.home }/objects/unittests" => [ trema_include ], :o => :c do | t |
381
+ sys "gcc --coverage -I#{ objects "openflow" } #{ var :CFLAGS } -fPIC -c -o #{ t.name } #{ t.source }"
382
+ end
383
+
384
+ desc "Build trema library."
385
+ task :libtrema => libtrema
386
+ file libtrema => libtrema_o.candidates do | t |
387
+ build_libtrema_a.call t
388
+ end
389
+
390
+ desc "Build trema library (coverage)."
391
+ task "coverage:libtrema" => libtrema_gcov
392
+ file libtrema_gcov => libtrema_gcov_o.candidates do | t |
393
+ build_libtrema_a.call t
394
+ end
395
+
396
+
397
+ ################################################################################
398
+ # Build trema.so (ruby library)
399
+ ################################################################################
400
+
401
+ task :clean => "rubylib:clean"
402
+ task :distclean => "rubylib:distclean"
403
+
404
+
405
+ desc "Build ruby library."
406
+ task :rubylib => "ruby/trema.so"
407
+ file "ruby/trema.so" => FileList[ "ruby/trema/*.c", "ruby/trema/*.h", libtrema ] do
408
+ sys.cd "ruby" do
409
+ sys "ruby extconf.rb --with-trema-include=#{ trema_include } --with-trema-lib=#{ trema_lib } --with-openflow-include=#{ openflow_include }"
410
+ sys "make"
411
+ end
412
+ end
413
+
414
+
415
+ task "rubylib:clean" do
416
+ sys.cd "ruby" do
417
+ sys "make clean" rescue nil
418
+ end
419
+ end
420
+
421
+ task "rubylib:distclean" do
422
+ sys.rm_f "ruby/Makefile"
423
+ end
424
+
425
+
426
+ ################################################################################
427
+ # Build switch manager
428
+ ################################################################################
429
+
430
+ switch_manager_objects_dir = objects( "switch_manager" )
431
+
432
+ gen C::Dependencies, dependency( "switch_manager" ),
433
+ :search => [ "src/switch_manager", trema_include ], :sources => sys[ "src/switch_manager/*.c" ]
434
+
435
+ gen Action do
436
+ source dependency( "switch_manager" )
437
+ end
438
+
439
+
440
+ gen Directory, switch_manager_objects_dir
441
+
442
+ gen DirectedRule, switch_manager_objects_dir => [ "src/switch_manager" ], :o => :c do | t |
443
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
444
+ end
445
+
446
+
447
+ switch_manager_objects = [
448
+ "dpid_table.o",
449
+ "switch_manager.o",
450
+ "secure_channel_listener.o"
451
+ ].collect do | each |
452
+ File.join switch_manager_objects_dir, each
453
+ end
454
+
455
+ desc "Build switch manager."
456
+ task :switch_manager => Trema::Executables.switch_manager
457
+ file Trema::Executables.switch_manager => switch_manager_objects + [ libtrema ] do | t |
458
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt"
459
+ end
460
+
461
+
462
+ switch_objects = [
463
+ "cookie_table.o",
464
+ "ofpmsg_recv.o",
465
+ "ofpmsg_send.o",
466
+ "secure_channel_receiver.o",
467
+ "secure_channel_sender.o",
468
+ "service_interface.o",
469
+ "switch.o",
470
+ "xid_table.o",
471
+ ].collect do | each |
472
+ File.join switch_manager_objects_dir, each
473
+ end
474
+
475
+ desc "Build switch."
476
+ task :switch => Trema::Executables.switch
477
+ file Trema::Executables.switch => switch_objects + [ libtrema ] do | t |
478
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt"
479
+ end
480
+
481
+
482
+ ################################################################################
483
+ # Build packetin filter
484
+ ################################################################################
485
+
486
+ gen C::Dependencies, dependency( "packetin_filter" ),
487
+ :search => [ "src/packetin_filter", trema_include ], :sources => sys[ "src/packetin_filter/*.c" ]
488
+
489
+ gen Action do
490
+ source dependency( "packetin_filter" )
491
+ end
492
+
493
+
494
+ gen Directory, objects( "packetin_filter" )
495
+
496
+ packetin_filter_objects = gen DirectedRule, objects( "packetin_filter" ) => [ "src/packetin_filter" ], :o => :c do | t |
497
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
498
+ end
499
+
500
+ desc "Build packetin filter."
501
+ task :packetin_filter => Trema::Executables.packetin_filter
502
+ file Trema::Executables.packetin_filter => packetin_filter_objects.candidates + [ libtrema ] do | t |
503
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt"
504
+ end
505
+
506
+
507
+ ################################################################################
508
+ # tremashark
509
+ ################################################################################
510
+
511
+ tremashark_objects_dir = objects( "tremashark" )
512
+
513
+ gen C::Dependencies, dependency( "tremashark" ),
514
+ :search => [ "src/tremashark", trema_include ], :sources => sys[ "src/tremashark/*.c" ]
515
+
516
+ gen Action do
517
+ source dependency( "tremashark" )
518
+ end
519
+
520
+
521
+ gen Directory, tremashark_objects_dir
522
+
523
+ gen DirectedRule, tremashark_objects_dir => [ "src/tremashark" ], :o => :c do | t |
524
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
525
+ end
526
+
527
+
528
+ tremashark_objects = [
529
+ "pcap_queue.o",
530
+ "queue.o",
531
+ "tremashark.o",
532
+ ].collect do | each |
533
+ File.join tremashark_objects_dir, each
534
+ end
535
+
536
+ desc "Build tremashark."
537
+ task :tremashark => Trema::Executables.tremashark
538
+ file Trema::Executables.tremashark => tremashark_objects + [ libtrema ] do | t |
539
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt -lpcap"
540
+ end
541
+
542
+
543
+ packet_capture_objects = [
544
+ "packet_capture.o",
545
+ "queue.o",
546
+ ].collect do | each |
547
+ File.join tremashark_objects_dir, each
548
+ end
549
+
550
+ desc "Build packet_capture."
551
+ task :packet_capture => Trema::Executables.packet_capture
552
+ file Trema::Executables.packet_capture => packet_capture_objects + [ libtrema ] do | t |
553
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt -lpcap"
554
+ end
555
+
556
+
557
+ syslog_relay_objects = [
558
+ "syslog_relay.o",
559
+ ].collect do | each |
560
+ File.join tremashark_objects_dir, each
561
+ end
562
+
563
+ desc "Build syslog_relay."
564
+ task :syslog_relay => Trema::Executables.syslog_relay
565
+ file Trema::Executables.syslog_relay => syslog_relay_objects + [ libtrema ] do | t |
566
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt -lpcap"
567
+ end
568
+
569
+
570
+ stdin_relay_objects = [
571
+ "stdin_relay.o",
572
+ ].collect do | each |
573
+ File.join tremashark_objects_dir, each
574
+ end
575
+
576
+ desc "Build stdin_relay."
577
+ task :stdin_relay => Trema::Executables.stdin_relay
578
+ file Trema::Executables.stdin_relay => stdin_relay_objects + [ libtrema ] do | t |
579
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt -lpcap"
580
+ end
581
+
582
+
583
+ ################################################################################
584
+ # Build standalone examples
585
+ ################################################################################
586
+
587
+ standalone_examples = [
588
+ "cbench_switch",
589
+ "dumper",
590
+ "hello_trema",
591
+ "learning_switch",
592
+ "list_switches",
593
+ "multi_learning_switch",
594
+ "packet_in",
595
+ "repeater_hub",
596
+ "switch_info",
597
+ "switch_monitor",
598
+ "traffic_monitor",
599
+ ]
600
+
601
+ standalone_examples.each do | each |
602
+ objects_dir = objects( "examples/#{ each }" )
603
+ target = objects( "examples/#{ each }/#{ each }" )
604
+
605
+ gen C::Dependencies, dependency( each ),
606
+ :search => [ "src/examples/#{ each }", trema_include ], :sources => sys[ "src/examples/#{ each }/*.c" ]
607
+
608
+ gen Action do
609
+ source dependency( each )
610
+ end
611
+
612
+
613
+ gen Directory, objects_dir
614
+
615
+ objects = gen DirectedRule, objects_dir => [ "src/examples/#{ each }" ], :o => :c do | t |
616
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
617
+ end
618
+
619
+
620
+ desc "Build #{ each } example."
621
+ task "examples:#{ each }" => target
622
+ file target => objects.candidates + [ libtrema ] do | t |
623
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ sys.sp t.prerequisites } -ltrema -lsqlite3 -ldl -lrt"
624
+ end
625
+ end
626
+
627
+
628
+ ################################################################################
629
+ # Build openflow messages
630
+ ################################################################################
631
+
632
+ openflow_messages = [
633
+ "echo_reply",
634
+ "echo_request",
635
+ "features_request",
636
+ "hello",
637
+ "set_config",
638
+ ]
639
+
640
+ openflow_message_source_dir = "src/examples/openflow_message"
641
+ openflow_message_objects_dir = objects( "examples/openflow_message" )
642
+
643
+ gen C::Dependencies, dependency( "openflow_message" ),
644
+ :search => [ trema_include ], :sources => sys[ "#{ openflow_message_source_dir }/*.c" ]
645
+
646
+ gen Action do
647
+ source dependency( "openflow_message" )
648
+ end
649
+
650
+ gen Directory, openflow_message_objects_dir
651
+
652
+
653
+ gen DirectedRule, openflow_message_objects_dir => [ openflow_message_source_dir ], :o => :c do | t |
654
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
655
+ end
656
+
657
+
658
+ openflow_messages.each do | each |
659
+ target = File.join( openflow_message_objects_dir, each )
660
+ task "examples:openflow_message" => target
661
+ file target => [ File.join( openflow_message_objects_dir, "#{ each }.o" ), libtrema ] do | t |
662
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ t.source } -ltrema -lsqlite3 -ldl -lrt"
663
+ end
664
+ end
665
+
666
+
667
+ ################################################################################
668
+ # Build packetin_filter_config
669
+ ################################################################################
670
+
671
+ packetin_filter_config = [
672
+ "add_filter",
673
+ "delete_filter",
674
+ "delete_filter_strict",
675
+ "dump_filter",
676
+ "dump_filter_strict",
677
+ ]
678
+
679
+ packetin_filter_config_source_dir = "src/examples/packetin_filter_config"
680
+ packetin_filter_config_objects_dir = objects( "examples/packetin_filter_config" )
681
+
682
+ gen C::Dependencies, dependency( "packetin_filter_config" ),
683
+ :search => [ trema_include ], :sources => sys[ "#{ packetin_filter_config_source_dir }/*.c" ]
684
+
685
+ gen Action do
686
+ source dependency( "packetin_filter_config" )
687
+ end
688
+
689
+ gen Directory, packetin_filter_config_objects_dir
690
+
691
+
692
+ gen DirectedRule, packetin_filter_config_objects_dir => [ packetin_filter_config_source_dir ], :o => :c do | t |
693
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
694
+ end
695
+
696
+
697
+ packetin_filter_config.each do | each |
698
+ packetin_filter_config_utils_o = File.join( packetin_filter_config_objects_dir, "utils.o" )
699
+ target = File.join( packetin_filter_config_objects_dir, each )
700
+ task "examples:packetin_filter_config" => target
701
+ file target => [
702
+ File.join( packetin_filter_config_objects_dir, "#{ each }.o" ),
703
+ packetin_filter_config_utils_o,
704
+ libtrema
705
+ ] do | t |
706
+ sys "gcc -L#{ trema_lib } -o #{ t.name } #{ t.source } #{ packetin_filter_config_utils_o } -ltrema -lsqlite3 -ldl -lrt"
707
+ end
708
+ end
709
+
710
+
711
+ ################################################################################
712
+ # Unit tests.
713
+ ################################################################################
714
+
715
+ def libtrema_unit_tests
716
+ {
717
+ :byteorder_test => [ :log, :utility, :wrapper, :trema_wrapper ],
718
+ :daemon_test => [],
719
+ :ether_test => [ :buffer, :log, :utility, :wrapper, :trema_wrapper ],
720
+ :messenger_test => [ :doubly_linked_list, :hash_table, :event_handler, :linked_list, :utility, :wrapper, :timer, :log, :trema_wrapper ],
721
+ :openflow_application_interface_test => [ :buffer, :byteorder, :hash_table, :doubly_linked_list, :linked_list, :log, :openflow_message, :packet_info, :stat, :trema_wrapper, :utility, :wrapper ],
722
+ :openflow_message_test => [ :buffer, :byteorder, :linked_list, :log, :packet_info, :utility, :wrapper, :trema_wrapper ],
723
+ :packet_info_test => [ :buffer, :log, :utility, :wrapper, :trema_wrapper ],
724
+ :stat_test => [ :hash_table, :doubly_linked_list, :log, :utility, :wrapper, :trema_wrapper ],
725
+ :timer_test => [ :log, :utility, :wrapper, :doubly_linked_list, :trema_wrapper ],
726
+ :trema_test => [ :utility, :log, :wrapper, :doubly_linked_list, :trema_private, :trema_wrapper ],
727
+ }
728
+ end
729
+
730
+
731
+ def test_object_files test
732
+ names = [ test.to_s.gsub( /_test$/, "" ) ] + libtrema_unit_tests[ test ]
733
+ names.collect do | each |
734
+ if each == :buffer
735
+ [ "unittests/objects/buffer.o", "unittests/objects/buffer_stubs.o" ]
736
+ elsif each == :wrapper
737
+ [ "unittests/objects/wrapper.o", "unittests/objects/wrapper_stubs.o" ]
738
+ else
739
+ "unittests/objects/#{ each }.o"
740
+ end
741
+ end.flatten
742
+ end
743
+
744
+
745
+ gen C::Dependencies, dependency( "unittests" ),
746
+ :search => [ trema_include, "unittests" ], :sources => sys[ "unittests/lib/*.c", "src/lib/*.c" ]
747
+
748
+ gen Action do
749
+ source dependency( "unittests" )
750
+ end
751
+
752
+
753
+ gen Directory, "unittests/objects"
754
+ gen Directory, "objects/unittests"
755
+
756
+ gen DirectedRule, "unittests/objects" => [ "unittests", "unittests/lib", "src/lib" ], :o => :c do | t |
757
+ sys "gcc -I#{ trema_include } -I#{ openflow_include } -I#{ File.dirname Trema.cmockery_h } -Iunittests -DUNIT_TESTING --coverage #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
758
+ end
759
+
760
+
761
+ libtrema_unit_tests.keys.each do | each |
762
+ target = "unittests/objects/#{ each }"
763
+
764
+ task :build_old_unittests => target
765
+ task target => "vendor:cmockery"
766
+ file target => test_object_files( each ) + [ "#{ target }.o" ] do | t |
767
+ sys "gcc -L#{ File.dirname Trema.libcmockery_a } -o #{ t.name } #{ sys.sp t.prerequisites } -DUNIT_TESTING -lrt -lcmockery -lsqlite3 -ldl -lpthread --coverage --static"
768
+ end
769
+ end
770
+
771
+
772
+ # new unittest
773
+ tests = [
774
+ "objects/unittests/buffer_test",
775
+ "objects/unittests/doubly_linked_list_test",
776
+ "objects/unittests/ether_test",
777
+ "objects/unittests/hash_table_test",
778
+ "objects/unittests/linked_list_test",
779
+ "objects/unittests/log_test",
780
+ "objects/unittests/packetin_filter_interface_test",
781
+ "objects/unittests/packet_info_test",
782
+ "objects/unittests/packet_parser_test",
783
+ "objects/unittests/persistent_storage_test",
784
+ "objects/unittests/trema_private_test",
785
+ "objects/unittests/utility_test",
786
+ "objects/unittests/wrapper_test",
787
+ "objects/unittests/match_table_test",
788
+ "objects/unittests/message_queue_test",
789
+ ]
790
+
791
+
792
+ file "objects/unittests/cmockery_trema.o" do | t |
793
+ sys "gcc --coverage -c unittests/#{ File.basename t.name, ".o" }.c -o #{ t.name } #{ var :CFLAGS } -I#{ trema_include } -I#{ File.dirname Trema.cmockery_h } -Iunittests"
794
+ end
795
+
796
+
797
+ tests.each do | each |
798
+ task :build_unittests => [ "coverage:libtrema", each ]
799
+ task each => [ "coverage:libtrema", "vendor:cmockery", "objects/unittests/cmockery_trema.o", "#{ Trema.home }/objects/unittests" ]
800
+ file each => "unittests/lib/#{ File.basename each }.c" do | t |
801
+ sys "gcc --coverage -c unittests/lib/#{ File.basename t.name }.c -o #{ each }.o #{ var :CFLAGS } -I#{ trema_include } -I#{ openflow_include } -I#{ File.dirname Trema.cmockery_h } -Iunittests"
802
+ sys "gcc --coverage -o #{ t.name } #{ each }.o objects/unittests/cmockery_trema.o -Lobjects/unittests -L#{ File.dirname Trema.libcmockery_a } -ltrema -lrt -lcmockery -lsqlite3 -ldl -lpthread --static"
803
+ end
804
+ end
805
+
806
+
807
+ desc "Run unittests"
808
+ task :unittests => [ :build_old_unittests, :build_unittests ] do
809
+ ( sys[ "unittests/objects/*_test" ] + tests ).each do | each |
810
+ puts "Running #{ each }..."
811
+ sys each
812
+ end
813
+ end
814
+
815
+
816
+ ################################################################################
817
+ # TODO, FIXME etc.
818
+ ################################################################################
819
+
820
+ desc "Print list of notes."
821
+ task :notes do
822
+ keywords = [ "TODO", "FIXME", "XXX" ]
823
+ keywords.each do | key |
824
+ system "find src unittests -name '*.c' | xargs grep -n #{ key }"
825
+ system "find ruby spec features -name '*.rb' | xargs grep -n #{ key }"
826
+ end
827
+ end
828
+
829
+
830
+ ### Local variables:
831
+ ### mode: Ruby
832
+ ### coding: utf-8-unix
833
+ ### indent-tabs-mode: nil
834
+ ### End: