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,84 @@
1
+ #
2
+ # trema show_stats command.
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
+ require "optparse"
24
+ require "trema/cli"
25
+ require "trema/dsl"
26
+ require "trema/util"
27
+
28
+
29
+ module Trema
30
+ module Command
31
+ include Trema::Util
32
+
33
+
34
+ def show_stats
35
+ sanity_check
36
+
37
+ stats = nil
38
+
39
+ options = OptionParser.new
40
+ options.banner = "Usage: #{ $0 } show_stats HOSTNAME [OPTIONS ...]"
41
+
42
+ options.on( "-t", "--tx" ) do
43
+ stats = :tx
44
+ end
45
+ options.on( "-r", "--rx" ) do
46
+ stats = :rx
47
+ end
48
+
49
+ options.separator ""
50
+
51
+ options.on( "-h", "--help" ) do
52
+ puts options.to_s
53
+ exit 0
54
+ end
55
+ options.on( "-v", "--verbose" ) do
56
+ $verbose = true
57
+ end
58
+
59
+ options.parse! ARGV
60
+
61
+ host = Trema::DSL::Context.load_current.hosts[ ARGV[ 0 ] ]
62
+ raise "Unknown host: #{ ARGV[ 0 ] }" if host.nil?
63
+
64
+ case stats
65
+ when :tx
66
+ Trema::Cli.new( host ).show_tx_stats
67
+ when :rx
68
+ Trema::Cli.new( host ).show_rx_stats
69
+ else
70
+ puts "Sent packets:"
71
+ Trema::Cli.new( host ).show_tx_stats
72
+ puts "Received packets:"
73
+ Trema::Cli.new( host ).show_rx_stats
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ ### Local variables:
81
+ ### mode: Ruby
82
+ ### coding: utf-8
83
+ ### indent-tabs-mode: nil
84
+ ### End:
@@ -0,0 +1,61 @@
1
+ #
2
+ # trema usage (help) command.
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
+ module Trema
24
+ module Command
25
+ def usage
26
+ command = ARGV.shift
27
+
28
+ ARGV.clear << "--help"
29
+ if command.nil?
30
+ puts <<-EOL
31
+ usage: #{ $PROGRAM_NAME } <COMMAND> [OPTIONS ...]
32
+
33
+ Trema command-line tool
34
+ Type '#{ $PROGRAM_NAME } help <COMMAND>' for help on a specific command.
35
+
36
+ Available commands:
37
+ run - runs a trema application.
38
+ kill - terminates a trema process.
39
+ killall - terminates all trema processes.
40
+ send_packets - sends UDP packets to destination host.
41
+ show_stats - shows stats of packets.
42
+ reset_stats - resets stats of packets.
43
+ dump_flows - print all flow entries.
44
+ ruby - opens in your browser Trema's Ruby API documentation.
45
+ EOL
46
+ elsif method_for( command )
47
+ __send__ method_for( command )
48
+ else
49
+ STDERR.puts "Type '#{ $PROGRAM_NAME } help' for usage."
50
+ exit false
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+
57
+ ### Local variables:
58
+ ### mode: Ruby
59
+ ### coding: utf-8
60
+ ### indent-tabs-mode: nil
61
+ ### End:
@@ -0,0 +1,39 @@
1
+ #
2
+ # trema version command.
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
+ require "trema/version"
24
+
25
+
26
+ module Trema
27
+ module Command
28
+ def version
29
+ puts "trema version #{ Trema::VERSION }"
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ ### Local variables:
36
+ ### mode: Ruby
37
+ ### coding: utf-8
38
+ ### indent-tabs-mode: nil
39
+ ### End:
@@ -0,0 +1,595 @@
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 "barrier-reply.h"
22
+ #include "buffer.h"
23
+ #include "controller.h"
24
+ #include "features-reply.h"
25
+ #include "flow-removed.h"
26
+ #include "get-config-reply.h"
27
+ #include "list-switches-reply.h"
28
+ #include "logger.h"
29
+ #include "openflow-error.h"
30
+ #include "openflow.h"
31
+ #include "packet_in.h"
32
+ #include "port-status.h"
33
+ #include "queue-get-config-reply.h"
34
+ #include "ruby.h"
35
+ #include "rubysig.h"
36
+ #include "stats-reply.h"
37
+ #include "switch-disconnected.h"
38
+ #include "trema.h"
39
+ #include "vendor.h"
40
+
41
+
42
+ VALUE mTrema;
43
+ VALUE cController;
44
+
45
+
46
+ static void
47
+ handle_timer_event( void *self ) {
48
+ if ( rb_respond_to( ( VALUE ) self, rb_intern( "handle_timer_event" ) ) == Qtrue ) {
49
+ rb_funcall( ( VALUE ) self, rb_intern( "handle_timer_event" ), 0 );
50
+ }
51
+ }
52
+
53
+
54
+ /*
55
+ * @overload send_message(datapath_id, message)
56
+ * Sends an OpenFlow message to the datapath.
57
+ *
58
+ * @example
59
+ * send_message datapath_id, FeaturesRequest.new
60
+ *
61
+ *
62
+ * @param [Number] datapath_id
63
+ * the datapath to which a message is sent.
64
+ *
65
+ * @param [FeaturesRequest] message
66
+ * the message to be sent.
67
+ */
68
+ static VALUE
69
+ controller_send_message( VALUE self, VALUE datapath_id, VALUE message ) {
70
+ buffer *buf;
71
+ Data_Get_Struct( message, buffer, buf );
72
+ send_openflow_message( NUM2ULL( datapath_id ), buf );
73
+ return self;
74
+ }
75
+
76
+
77
+ static VALUE
78
+ controller_send_list_switches_request( VALUE self ) {
79
+ send_list_switches_request( ( void * ) self );
80
+ return self;
81
+ }
82
+
83
+
84
+ static void
85
+ form_actions( VALUE raction, openflow_actions *actions ) {
86
+ VALUE *data_ptr;
87
+ int i;
88
+
89
+ if ( raction != Qnil ) {
90
+ switch ( TYPE( raction ) ) {
91
+ case T_ARRAY:
92
+ data_ptr = RARRAY_PTR( raction );
93
+
94
+ for ( i = 0; i < RARRAY_LEN( raction ); i++ ) {
95
+ VALUE value = data_ptr[i];
96
+ rb_funcall( value, rb_intern( "append" ), 1, Data_Wrap_Struct( cController, NULL, NULL, actions ) );
97
+ }
98
+ break;
99
+ case T_OBJECT:
100
+ rb_funcall( raction, rb_intern( "append" ), 1, Data_Wrap_Struct( cController, NULL, NULL, actions ) );
101
+ break;
102
+ default:
103
+ rb_raise( rb_eTypeError, "actions argument must be an Array or an Action object" );
104
+ }
105
+ }
106
+ }
107
+
108
+
109
+ static VALUE
110
+ get_strict( int argc, VALUE *argv ) {
111
+ VALUE datapath_id = Qnil;
112
+ VALUE options = Qnil;
113
+ VALUE strict = Qnil;
114
+
115
+ rb_scan_args( argc, argv, "11", &datapath_id, &options );
116
+ if ( options != Qnil ) {
117
+ strict = rb_hash_aref( options, ID2SYM( rb_intern( "strict" ) ) );
118
+ }
119
+ return strict;
120
+ }
121
+
122
+
123
+ static VALUE
124
+ controller_send_flow_mod( uint16_t command, int argc, VALUE *argv, VALUE self ) {
125
+ VALUE datapath_id = Qnil;
126
+ VALUE options = Qnil;
127
+ rb_scan_args( argc, argv, "11", &datapath_id, &options );
128
+
129
+ // Defaults
130
+ struct ofp_match default_match;
131
+ memset( &default_match, 0, sizeof( struct ofp_match ) );
132
+ default_match.wildcards = OFPFW_ALL;
133
+ struct ofp_match *match = &default_match;
134
+ uint64_t cookie = get_cookie();
135
+ uint16_t idle_timeout = 0;
136
+ uint16_t hard_timeout = 0;
137
+ uint16_t priority = UINT16_MAX;
138
+ uint32_t buffer_id = UINT32_MAX;
139
+ uint16_t flags = OFPFF_SEND_FLOW_REM;
140
+ openflow_actions *actions = create_actions();
141
+
142
+ // Options
143
+ if ( options != Qnil ) {
144
+ VALUE opt_match = rb_hash_aref( options, ID2SYM( rb_intern( "match" ) ) );
145
+ if ( opt_match != Qnil ) {
146
+ Data_Get_Struct( opt_match, struct ofp_match, match );
147
+ }
148
+
149
+ VALUE opt_cookie = rb_hash_aref( options, ID2SYM( rb_intern( "cookie" ) ) );
150
+ if ( opt_cookie != Qnil ) {
151
+ cookie = NUM2ULL( opt_cookie );
152
+ }
153
+
154
+ VALUE opt_idle_timeout = rb_hash_aref( options, ID2SYM( rb_intern( "idle_timeout" ) ) );
155
+ if ( opt_idle_timeout != Qnil ) {
156
+ idle_timeout = ( uint16_t )NUM2UINT( opt_idle_timeout );
157
+ }
158
+
159
+ VALUE opt_hard_timeout = rb_hash_aref( options, ID2SYM( rb_intern( "hard_timeout" ) ) );
160
+ if ( opt_hard_timeout != Qnil ) {
161
+ hard_timeout = ( uint16_t )NUM2UINT( opt_hard_timeout );
162
+ }
163
+
164
+ VALUE opt_priority = rb_hash_aref( options, ID2SYM( rb_intern( "priority" ) ) );
165
+ if ( opt_priority != Qnil ) {
166
+ priority = ( uint16_t )NUM2UINT( opt_priority );
167
+ }
168
+
169
+ VALUE opt_buffer_id = rb_hash_aref( options, ID2SYM( rb_intern( "buffer_id" ) ) );
170
+ if ( opt_buffer_id != Qnil ) {
171
+ buffer_id = ( uint32_t ) NUM2ULONG( opt_buffer_id );
172
+ }
173
+
174
+ VALUE opt_send_flow_rem = rb_hash_aref( options, ID2SYM( rb_intern( "send_flow_rem" ) ) );
175
+ if ( opt_send_flow_rem == Qfalse ) {
176
+ flags &= ( uint16_t ) ~OFPFF_SEND_FLOW_REM;
177
+ }
178
+
179
+ VALUE opt_check_overlap = rb_hash_aref( options, ID2SYM( rb_intern( "check_overlap" ) ) );
180
+ if ( opt_check_overlap != Qnil ) {
181
+ flags |= OFPFF_CHECK_OVERLAP;
182
+ }
183
+
184
+ VALUE opt_emerg = rb_hash_aref( options, ID2SYM( rb_intern( "emerg" ) ) );
185
+ if ( opt_emerg != Qnil ) {
186
+ flags |= OFPFF_EMERG;
187
+ }
188
+
189
+ VALUE opt_actions = rb_hash_aref( options, ID2SYM( rb_intern( "actions" ) ) );
190
+ if ( opt_actions != Qnil ) {
191
+ form_actions( opt_actions, actions );
192
+ }
193
+ }
194
+
195
+ buffer *flow_mod = create_flow_mod(
196
+ get_transaction_id(),
197
+ *match,
198
+ cookie,
199
+ command,
200
+ idle_timeout,
201
+ hard_timeout,
202
+ priority,
203
+ buffer_id,
204
+ OFPP_NONE,
205
+ flags,
206
+ actions
207
+ );
208
+ send_openflow_message( NUM2ULL( datapath_id ), flow_mod );
209
+
210
+ free_buffer( flow_mod );
211
+ delete_actions( actions );
212
+
213
+ return self;
214
+ }
215
+
216
+
217
+ /*
218
+ * @overload send_flow_mod_add(datapath_id, options={})
219
+ * Sends a flow_mod message to add a flow into the datapath.
220
+ *
221
+ * @example
222
+ * def packet_in datapath_id, message
223
+ * send_flow_mod_add datapath_id, :match => Match.from(message), :actions => ActionOutput.new(OFPP_FLOOD)
224
+ * end
225
+ *
226
+ *
227
+ * @param [Number] datapath_id
228
+ * the datapath to which a message is sent.
229
+ *
230
+ * @param [Hash] options
231
+ * the options to create a message with.
232
+ *
233
+ *
234
+ * @option options [Match, nil] :match (nil)
235
+ * A {Match} object describing the fields of the flow.
236
+ *
237
+ * @option options [Number] :idle_timeout (0)
238
+ * The idle time in seconds before discarding.
239
+ * Zero means flow never expires.
240
+ *
241
+ * @option options [Number] :cookie
242
+ * An opaque issued identifier.
243
+ *
244
+ * @option options [Number] :hard_timeout (0)
245
+ * The maximum time before discarding in seconds.
246
+ * Zero means flow never expires.
247
+ *
248
+ * @option options [Number] :priority (0xffff)
249
+ * The priority level of the flow entry.
250
+ *
251
+ * @option options [Number] :buffer_id (0xffffffff)
252
+ * The buffer ID assigned by the datapath of a buffered packet to
253
+ * apply the flow to. If 0xffffffff, no buffered packet is to be
254
+ * applied to flow actions.
255
+ *
256
+ * @option options [Boolean] :send_flow_rem (true)
257
+ * If true, send a flow_removed message when the flow expires or
258
+ * is deleted.
259
+ *
260
+ * @option options [Boolean] :check_overlap (false)
261
+ * If true, check for overlapping entries first, i.e. if there are
262
+ * conflicting entries with the same priority, the flow is not
263
+ * added and the modification fails.
264
+ *
265
+ * @option options [Boolean] :emerg (false)
266
+ * if true, the switch must consider this flow entry as an
267
+ * emergency entry, and only use it for forwarding when
268
+ * disconnected from the controller.
269
+ *
270
+ * @option options [ActionOutput, Array<ActionOutput>, nil] :actions (nil)
271
+ * The sequence of actions specifying the actions to perform on
272
+ * the flow's packets.
273
+ */
274
+ static VALUE
275
+ controller_send_flow_mod_add( int argc, VALUE *argv, VALUE self ) {
276
+ return controller_send_flow_mod( OFPFC_ADD, argc, argv, self );
277
+ }
278
+
279
+
280
+ /*
281
+ * @overload send_flow_mod_modify(datapath, options={})
282
+ * Sends a flow_mod message to either modify or modify strict a flow from datapath.
283
+ * Both flow_mod modify and flow_mod modify strict commands would modify
284
+ * matched flow actions. The strict option adds the flow priority to the
285
+ * matched criteria. Accepts the same options as #send_flow_mod_add with the
286
+ * following additional option.
287
+ *
288
+ * @option options [Symbol] :strict
289
+ * If set to true modify_strict command is invoked otherwise the modify
290
+ * command is invoked.
291
+ */
292
+ static VALUE
293
+ controller_send_flow_mod_modify( int argc, VALUE *argv, VALUE self ) {
294
+ uint16_t command = OFPFC_MODIFY;
295
+
296
+ if ( get_strict( argc, argv ) == Qtrue ) {
297
+ command = OFPFC_MODIFY_STRICT;
298
+ }
299
+ return controller_send_flow_mod( command, argc, argv, self );
300
+ }
301
+
302
+
303
+ /*
304
+ * @overload send_flow_mod_delete(datapath_id, options={})
305
+ * Sends a flow_mod_delete message to delete all matching flows.
306
+ * Both flow_mod delete and flow_mod delete strict commands would delete matched flows.
307
+ * The strict option adds the flow priority to the matched criteria.
308
+ * Accepts the same options as #send_flow_mod_add with the following additional
309
+ * option.
310
+ *
311
+ * @option options [Symbol] :strict
312
+ * If set to true delete_strict command is invoked otherwise the delete
313
+ * command is invoked.
314
+ */
315
+ static VALUE
316
+ controller_send_flow_mod_delete( int argc, VALUE *argv, VALUE self ) {
317
+ uint16_t command = OFPFC_DELETE;
318
+
319
+ if ( get_strict( argc, argv ) == Qtrue ) {
320
+ command = OFPFC_DELETE_STRICT;
321
+ }
322
+ return controller_send_flow_mod( command, argc, argv, self );
323
+ }
324
+
325
+
326
+ /*
327
+ * @overload send_packet_out(datapath_id, options={})
328
+ * Sends a packet_out message to have a packet processed by the datapath.
329
+ *
330
+ * @example
331
+ * send_packet_out(
332
+ * datapath_id,
333
+ * :packet_in => message,
334
+ * :actions => Trema::ActionOutput.new(port_no)
335
+ * )
336
+ *
337
+ *
338
+ * @param [Number] datapath_id
339
+ * the datapath to which a message is sent.
340
+ *
341
+ * @param [Hash] options
342
+ * the options to create a message with.
343
+ *
344
+ *
345
+ * @option options [PacketIn] :packet_in (nil)
346
+ * The {PacketIn} object received by packet_in handler. If this
347
+ * option is not nil, :buffer_id, :data, and :in_port option is
348
+ * set automatically according to the value of :packet_in.
349
+ *
350
+ * @option options [Number] :in_port (OFPP_NONE)
351
+ * The port from which the frame is to be sent. OFPP_NONE if
352
+ * none. OFPP_TABLE to perform the actions defined in the flow
353
+ * table.
354
+ *
355
+ * @option options [Number] :buffer_id (0xffffffff)
356
+ * The buffer ID assigned by the datapath. If 0xffffffff, the
357
+ * frame is not buffered, and the entire frame must be passed in
358
+ * :data.
359
+ *
360
+ * @option options [String, nil] :data (nil)
361
+ * The entire Ethernet frame. Should be of length 0 if buffer_id
362
+ * is 0xffffffff, and should be of length >0 otherwise.
363
+ *
364
+ * @option options [ActionOutput, Array<ActionOutput>, nil] :actions (nil)
365
+ * The sequence of actions specifying the actions to perform on
366
+ * the frame.
367
+ */
368
+ static VALUE
369
+ controller_send_packet_out( int argc, VALUE *argv, VALUE self ) {
370
+ VALUE datapath_id = Qnil;
371
+ VALUE options = Qnil;
372
+ rb_scan_args( argc, argv, "11", &datapath_id, &options );
373
+
374
+ // Defaults.
375
+ uint32_t buffer_id = UINT32_MAX;
376
+ uint16_t in_port = OFPP_NONE;
377
+ openflow_actions *actions = create_actions();
378
+ const buffer *data = NULL;
379
+ buffer *allocated_data = NULL;
380
+
381
+ if ( options != Qnil ) {
382
+ VALUE opt_message = rb_hash_aref( options, ID2SYM( rb_intern( "packet_in" ) ) );
383
+ if ( opt_message != Qnil ) {
384
+ packet_in *message;
385
+ Data_Get_Struct( opt_message, packet_in, message );
386
+
387
+ if ( NUM2ULL( datapath_id ) == message->datapath_id ) {
388
+ buffer_id = message->buffer_id;
389
+ in_port = message->in_port;
390
+ }
391
+ data = ( buffer_id == UINT32_MAX ? message->data : NULL );
392
+ }
393
+
394
+ VALUE opt_buffer_id = rb_hash_aref( options, ID2SYM( rb_intern( "buffer_id" ) ) );
395
+ if ( opt_buffer_id != Qnil ) {
396
+ buffer_id = ( uint32_t ) NUM2ULONG( opt_buffer_id );
397
+ }
398
+
399
+ VALUE opt_in_port = rb_hash_aref( options, ID2SYM( rb_intern( "in_port" ) ) );
400
+ if ( opt_in_port != Qnil ) {
401
+ in_port = ( uint16_t ) NUM2UINT( opt_in_port );
402
+ }
403
+
404
+ VALUE opt_action = rb_hash_aref( options, ID2SYM( rb_intern( "actions" ) ) );
405
+ if ( opt_action != Qnil ) {
406
+ form_actions( opt_action, actions );
407
+ }
408
+
409
+ VALUE opt_data = rb_hash_aref( options, ID2SYM( rb_intern( "data" ) ) );
410
+ if ( opt_data != Qnil ) {
411
+ Check_Type( opt_data, T_STRING );
412
+ uint16_t length = ( u_int16_t ) RSTRING_LEN( opt_data );
413
+ allocated_data = alloc_buffer_with_length( length );
414
+ memcpy( append_back_buffer( allocated_data, length ), RSTRING_PTR( opt_data ), length );
415
+ data = allocated_data;
416
+ }
417
+ }
418
+
419
+ buffer *packet_out = create_packet_out(
420
+ get_transaction_id(),
421
+ buffer_id,
422
+ in_port,
423
+ actions,
424
+ data
425
+ );
426
+ send_openflow_message( NUM2ULL( datapath_id ), packet_out );
427
+
428
+ if ( allocated_data != NULL ) {
429
+ free_buffer( allocated_data );
430
+ }
431
+ free_buffer( packet_out );
432
+ delete_actions( actions );
433
+ return self;
434
+ }
435
+
436
+
437
+ /*
438
+ * Starts this controller. Usually you do not need to invoke
439
+ * explicitly, because this is called implicitly by "trema run"
440
+ * command.
441
+ */
442
+ static VALUE
443
+ controller_run( VALUE self ) {
444
+ setenv( "TREMA_HOME", STR2CSTR( rb_funcall( mTrema, rb_intern( "home" ), 0 ) ), 1 );
445
+
446
+ VALUE name = rb_funcall( self, rb_intern( "name" ), 0 );
447
+ rb_gv_set( "$PROGRAM_NAME", name );
448
+
449
+ int argc = 3;
450
+ char **argv = xmalloc( sizeof ( char * ) * ( uint32_t ) ( argc + 1 ) );
451
+ argv[ 0 ] = STR2CSTR( name );
452
+ argv[ 1 ] = ( char * ) ( uintptr_t ) "--name";
453
+ argv[ 2 ] = STR2CSTR( name );
454
+ argv[ 3 ] = NULL;
455
+ init_trema( &argc, &argv );
456
+ xfree( argv );
457
+
458
+ set_switch_ready_handler( handle_switch_ready, ( void * ) self );
459
+ set_features_reply_handler( handle_features_reply, ( void * ) self );
460
+ set_packet_in_handler( handle_packet_in, ( void * ) self );
461
+ set_flow_removed_handler( handle_flow_removed, ( void * ) self );
462
+ set_switch_disconnected_handler( handle_switch_disconnected, ( void * ) self );
463
+ set_port_status_handler( handle_port_status, ( void * ) self );
464
+ set_stats_reply_handler( handle_stats_reply, ( void * ) self );
465
+ set_error_handler( handle_openflow_error, ( void * ) self );
466
+ set_get_config_reply_handler( handle_get_config_reply, ( void * ) self );
467
+ set_barrier_reply_handler( handle_barrier_reply, ( void * ) self );
468
+ set_vendor_handler( handle_vendor, ( void * ) self );
469
+ set_queue_get_config_reply_handler( handle_queue_get_config_reply, ( void * ) self );
470
+ set_list_switches_reply_handler( handle_list_switches_reply );
471
+
472
+ struct itimerspec interval;
473
+ interval.it_interval.tv_sec = 1;
474
+ interval.it_interval.tv_nsec = 0;
475
+ interval.it_value.tv_sec = 0;
476
+ interval.it_value.tv_nsec = 0;
477
+ add_timer_event_callback( &interval, handle_timer_event, ( void * ) self );
478
+
479
+ if ( rb_respond_to( self, rb_intern( "start" ) ) == Qtrue ) {
480
+ rb_funcall( self, rb_intern( "start" ), 0 );
481
+ }
482
+
483
+ rb_funcall( self, rb_intern( "start_trema" ), 0 );
484
+
485
+ return self;
486
+ }
487
+
488
+
489
+ /*
490
+ * @overload shutdown!
491
+ * In the context of trema framework stops this controller and its applications.
492
+ */
493
+ static VALUE
494
+ controller_shutdown( VALUE self ) {
495
+ stop_trema();
496
+ return self;
497
+ }
498
+
499
+
500
+ static void
501
+ thread_pass( void *user_data ) {
502
+ UNUSED( user_data );
503
+ CHECK_INTS;
504
+ rb_funcall( rb_cThread, rb_intern( "pass" ), 0 );
505
+ }
506
+
507
+
508
+ /*
509
+ * In the context of trema framework invokes the scheduler to start its applications.
510
+ */
511
+ static VALUE
512
+ controller_start_trema( VALUE self ) {
513
+ struct itimerspec interval;
514
+ interval.it_interval.tv_sec = 0;
515
+ interval.it_interval.tv_nsec = 1000000;
516
+ interval.it_value.tv_sec = 0;
517
+ interval.it_value.tv_nsec = 0;
518
+ add_timer_event_callback( &interval, thread_pass, NULL );
519
+
520
+ start_trema();
521
+
522
+ return self;
523
+ }
524
+
525
+ /********************************************************************************
526
+ * Init Controller module.
527
+ ********************************************************************************/
528
+
529
+ void
530
+ Init_controller() {
531
+ rb_require( "trema/app" );
532
+ VALUE cApp = rb_eval_string( "Trema::App" );
533
+ cController = rb_define_class_under( mTrema, "Controller", cApp );
534
+ rb_include_module( cController, mLogger );
535
+
536
+ rb_define_const( cController, "OFPP_MAX", INT2NUM( OFPP_MAX ) );
537
+ rb_define_const( cController, "OFPP_IN_PORT", INT2NUM( OFPP_IN_PORT ) );
538
+ rb_define_const( cController, "OFPP_TABLE", INT2NUM( OFPP_TABLE ) );
539
+ rb_define_const( cController, "OFPP_NORMAL", INT2NUM( OFPP_NORMAL ) );
540
+ rb_define_const( cController, "OFPP_FLOOD", INT2NUM( OFPP_FLOOD ) );
541
+ rb_define_const( cController, "OFPP_ALL", INT2NUM( OFPP_ALL ) );
542
+ rb_define_const( cController, "OFPP_CONTROLLER", INT2NUM( OFPP_CONTROLLER ) );
543
+ rb_define_const( cController, "OFPP_LOCAL", INT2NUM( OFPP_LOCAL ) );
544
+ rb_define_const( cController, "OFPP_NONE", INT2NUM( OFPP_NONE ) );
545
+
546
+ rb_define_const( cController, "OFPPR_ADD", INT2NUM( OFPPR_ADD ) );
547
+ rb_define_const( cController, "OFPPR_DELETE", INT2NUM( OFPPR_DELETE ) );
548
+ rb_define_const( cController, "OFPPR_MODIFY", INT2NUM( OFPPR_MODIFY ) );
549
+
550
+ rb_define_const( cController, "OFPC_FLOW_STATS", INT2NUM( OFPC_FLOW_STATS ) );
551
+ rb_define_const( cController, "OFPC_TABLE_STATS", INT2NUM( OFPC_TABLE_STATS ) );
552
+ rb_define_const( cController, "OFPC_PORT_STATS", INT2NUM( OFPC_PORT_STATS ) );
553
+ rb_define_const( cController, "OFPC_STP", INT2NUM( OFPC_STP) );
554
+ rb_define_const( cController, "OFPC_RESERVED", INT2NUM( OFPC_RESERVED ) );
555
+ rb_define_const( cController, "OFPC_IP_REASM", INT2NUM( OFPC_IP_REASM ) );
556
+ rb_define_const( cController, "OFPC_QUEUE_STATS", INT2NUM( OFPC_QUEUE_STATS ) );
557
+ rb_define_const( cController, "OFPC_ARP_MATCH_IP", INT2NUM( OFPC_ARP_MATCH_IP ) );
558
+
559
+ rb_define_const( cController, "OFPAT_OUTPUT", INT2NUM( OFPAT_OUTPUT ) );
560
+ rb_define_const( cController, "OFPAT_SET_VLAN_VID", INT2NUM( OFPAT_SET_VLAN_VID ) );
561
+ rb_define_const( cController, "OFPAT_SET_VLAN_PCP", INT2NUM( OFPAT_SET_VLAN_PCP ) );
562
+ rb_define_const( cController, "OFPAT_STRIP_VLAN", INT2NUM( OFPAT_STRIP_VLAN ) );
563
+ rb_define_const( cController, "OFPAT_SET_DL_SRC", INT2NUM( OFPAT_SET_DL_SRC) );
564
+ rb_define_const( cController, "OFPAT_SET_DL_DST", INT2NUM( OFPAT_SET_DL_DST) );
565
+ rb_define_const( cController, "OFPAT_SET_NW_SRC", INT2NUM( OFPAT_SET_NW_SRC ) );
566
+ rb_define_const( cController, "OFPAT_SET_NW_DST", INT2NUM( OFPAT_SET_NW_DST ) );
567
+ rb_define_const( cController, "OFPAT_SET_NW_TOS", INT2NUM( OFPAT_SET_NW_TOS ) );
568
+ rb_define_const( cController, "OFPAT_SET_TP_SRC", INT2NUM( OFPAT_SET_TP_SRC ) );
569
+ rb_define_const( cController, "OFPAT_SET_TP_DST", INT2NUM( OFPAT_SET_TP_DST ) );
570
+ rb_define_const( cController, "OFPAT_ENQUEUE", INT2NUM( OFPAT_ENQUEUE ) );
571
+ rb_define_const( cController, "OFPAT_VENDOR", INT2NUM( OFPAT_VENDOR ) );
572
+
573
+ rb_define_method( cController, "send_message", controller_send_message, 2 );
574
+ rb_define_method( cController, "send_list_switches_request", controller_send_list_switches_request, 0 );
575
+ rb_define_method( cController, "send_flow_mod_add", controller_send_flow_mod_add, -1 );
576
+ rb_define_method( cController, "send_flow_mod_modify", controller_send_flow_mod_modify, -1 );
577
+ rb_define_method( cController, "send_flow_mod_delete", controller_send_flow_mod_delete, -1 );
578
+ rb_define_method( cController, "send_packet_out", controller_send_packet_out, -1 );
579
+
580
+ rb_define_method( cController, "run!", controller_run, 0 );
581
+ rb_define_method( cController, "shutdown!", controller_shutdown, 0 );
582
+
583
+ // Private
584
+ rb_define_private_method( cController, "start_trema", controller_start_trema, 0 );
585
+
586
+ rb_require( "trema/controller" );
587
+ }
588
+
589
+
590
+ /*
591
+ * Local variables:
592
+ * c-basic-offset: 2
593
+ * indent-tabs-mode: nil
594
+ * End:
595
+ */