trema 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. data/.mono.rant +4107 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +4 -0
  4. data/Doxyfile +1679 -0
  5. data/GPL2 +339 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +71 -0
  8. data/README.md +135 -0
  9. data/Rakefile +140 -0
  10. data/Rantfile +834 -0
  11. data/VERSION +1 -0
  12. data/build.rb +32 -0
  13. data/cruise.rb +389 -0
  14. data/features/example.dumper.feature +87 -0
  15. data/features/example.learning_switch.feature +39 -0
  16. data/features/example.list_switches.feature +38 -0
  17. data/features/example.message.echo_reply.feature +26 -0
  18. data/features/example.message.echo_request.feature +25 -0
  19. data/features/example.message.features_request.feature +84 -0
  20. data/features/example.message.hello.feature +25 -0
  21. data/features/example.message.set_config.feature +27 -0
  22. data/features/example.multi_learning_switch.feature +135 -0
  23. data/features/example.packetin_filter_config.feature +91 -0
  24. data/features/example.repeater_hub.feature +49 -0
  25. data/features/example.switch_monitor.feature +39 -0
  26. data/features/packetin_filter.feature +49 -0
  27. data/features/step_definitions/kill_steps.rb +30 -0
  28. data/features/step_definitions/log_steps.rb +90 -0
  29. data/features/step_definitions/misc_steps.rb +64 -0
  30. data/features/step_definitions/off_steps.rb +30 -0
  31. data/features/step_definitions/run_steps.rb +91 -0
  32. data/features/step_definitions/send_packets_steps.rb +42 -0
  33. data/features/step_definitions/show_stats_steps.rb +43 -0
  34. data/features/step_definitions/stats_steps.rb +39 -0
  35. data/features/support/env.rb +75 -0
  36. data/features/support/hooks.rb +8 -0
  37. data/features/switch_manager.feature +35 -0
  38. data/features/trema-config.feature +68 -0
  39. data/features/trema.dump_flows.feature +25 -0
  40. data/features/trema.feature +25 -0
  41. data/features/trema.kill.feature +53 -0
  42. data/features/trema.killall.feature +30 -0
  43. data/features/trema.reset_stats.feature +14 -0
  44. data/features/trema.run.feature +46 -0
  45. data/features/trema.send_packets.feature +56 -0
  46. data/features/trema.show_stats.feature +67 -0
  47. data/features/tutorial.hello_trema.feature +27 -0
  48. data/features/tutorial.packet_in.feature +47 -0
  49. data/features/tutorial.switch_info.feature +55 -0
  50. data/ruby/.gitignore +4 -0
  51. data/ruby/blocker.rb +78 -0
  52. data/ruby/extconf.rb +71 -0
  53. data/ruby/sub-process.rb +291 -0
  54. data/ruby/trema/action-common.c +60 -0
  55. data/ruby/trema/action-common.h +42 -0
  56. data/ruby/trema/action-enqueue.c +161 -0
  57. data/ruby/trema/action-enqueue.h +40 -0
  58. data/ruby/trema/action-output.c +169 -0
  59. data/ruby/trema/action-output.h +42 -0
  60. data/ruby/trema/action-set-dl-dst.c +131 -0
  61. data/ruby/trema/action-set-dl-dst.h +44 -0
  62. data/ruby/trema/action-set-dl-src.c +131 -0
  63. data/ruby/trema/action-set-dl-src.h +44 -0
  64. data/ruby/trema/action-set-nw-dst.c +135 -0
  65. data/ruby/trema/action-set-nw-dst.h +42 -0
  66. data/ruby/trema/action-set-nw-src.c +140 -0
  67. data/ruby/trema/action-set-nw-src.h +42 -0
  68. data/ruby/trema/action-set-nw-tos.c +124 -0
  69. data/ruby/trema/action-set-nw-tos.h +42 -0
  70. data/ruby/trema/action-set-tp-dst.c +122 -0
  71. data/ruby/trema/action-set-tp-dst.h +42 -0
  72. data/ruby/trema/action-set-tp-src.c +124 -0
  73. data/ruby/trema/action-set-tp-src.h +42 -0
  74. data/ruby/trema/action-set-vlan-pcp.c +128 -0
  75. data/ruby/trema/action-set-vlan-pcp.h +42 -0
  76. data/ruby/trema/action-set-vlan-vid.c +125 -0
  77. data/ruby/trema/action-set-vlan-vid.h +42 -0
  78. data/ruby/trema/action-strip-vlan.c +81 -0
  79. data/ruby/trema/action-strip-vlan.h +42 -0
  80. data/ruby/trema/action-vendor.c +121 -0
  81. data/ruby/trema/action-vendor.h +42 -0
  82. data/ruby/trema/aggregate-stats-reply.rb +70 -0
  83. data/ruby/trema/app.rb +112 -0
  84. data/ruby/trema/barrier-reply.c +99 -0
  85. data/ruby/trema/barrier-reply.h +46 -0
  86. data/ruby/trema/barrier-request.c +108 -0
  87. data/ruby/trema/barrier-request.h +44 -0
  88. data/ruby/trema/cli.rb +269 -0
  89. data/ruby/trema/command.rb +40 -0
  90. data/ruby/trema/command/dump_flows.rb +62 -0
  91. data/ruby/trema/command/kill.rb +71 -0
  92. data/ruby/trema/command/killall.rb +56 -0
  93. data/ruby/trema/command/reset_stats.rb +61 -0
  94. data/ruby/trema/command/ruby.rb +55 -0
  95. data/ruby/trema/command/run.rb +120 -0
  96. data/ruby/trema/command/send_packets.rb +130 -0
  97. data/ruby/trema/command/shell.rb +61 -0
  98. data/ruby/trema/command/show_stats.rb +84 -0
  99. data/ruby/trema/command/usage.rb +61 -0
  100. data/ruby/trema/command/version.rb +39 -0
  101. data/ruby/trema/controller.c +595 -0
  102. data/ruby/trema/controller.h +44 -0
  103. data/ruby/trema/controller.rb +81 -0
  104. data/ruby/trema/daemon.rb +167 -0
  105. data/ruby/trema/dsl.rb +34 -0
  106. data/ruby/trema/dsl/configuration.rb +153 -0
  107. data/ruby/trema/dsl/context.rb +71 -0
  108. data/ruby/trema/dsl/link.rb +41 -0
  109. data/ruby/trema/dsl/parser.rb +70 -0
  110. data/ruby/trema/dsl/run.rb +49 -0
  111. data/ruby/trema/dsl/runner.rb +165 -0
  112. data/ruby/trema/dsl/stanza.rb +53 -0
  113. data/ruby/trema/dsl/switch.rb +78 -0
  114. data/ruby/trema/dsl/syntax-error.rb +33 -0
  115. data/ruby/trema/dsl/syntax.rb +109 -0
  116. data/ruby/trema/dsl/vhost.rb +108 -0
  117. data/ruby/trema/dsl/vswitch.rb +47 -0
  118. data/ruby/trema/echo-reply.c +107 -0
  119. data/ruby/trema/echo-reply.h +42 -0
  120. data/ruby/trema/echo-request.c +140 -0
  121. data/ruby/trema/echo-request.h +42 -0
  122. data/ruby/trema/error.c +253 -0
  123. data/ruby/trema/error.h +44 -0
  124. data/ruby/trema/exact-match.rb +36 -0
  125. data/ruby/trema/executables.rb +95 -0
  126. data/ruby/trema/features-reply.c +238 -0
  127. data/ruby/trema/features-reply.h +60 -0
  128. data/ruby/trema/features-request.c +109 -0
  129. data/ruby/trema/features-request.h +44 -0
  130. data/ruby/trema/flow-removed.c +275 -0
  131. data/ruby/trema/flow-removed.h +46 -0
  132. data/ruby/trema/flow-stats-reply.rb +109 -0
  133. data/ruby/trema/flow.rb +56 -0
  134. data/ruby/trema/get-config-reply.c +159 -0
  135. data/ruby/trema/get-config-reply.h +52 -0
  136. data/ruby/trema/get-config-request.c +107 -0
  137. data/ruby/trema/get-config-request.h +44 -0
  138. data/ruby/trema/hello.c +110 -0
  139. data/ruby/trema/hello.h +44 -0
  140. data/ruby/trema/host.rb +257 -0
  141. data/ruby/trema/ip.rb +101 -0
  142. data/ruby/trema/link.rb +176 -0
  143. data/ruby/trema/list-switches-reply.c +46 -0
  144. data/ruby/trema/list-switches-reply.h +40 -0
  145. data/ruby/trema/logger.c +162 -0
  146. data/ruby/trema/logger.h +44 -0
  147. data/ruby/trema/mac.rb +151 -0
  148. data/ruby/trema/match.c +594 -0
  149. data/ruby/trema/match.h +36 -0
  150. data/ruby/trema/monkey-patch/integer.rb +35 -0
  151. data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
  152. data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
  153. data/ruby/trema/monkey-patch/module.rb +33 -0
  154. data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
  155. data/ruby/trema/monkey-patch/string.rb +33 -0
  156. data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
  157. data/ruby/trema/network-component.rb +153 -0
  158. data/ruby/trema/ofctl.rb +62 -0
  159. data/ruby/trema/open-vswitch.rb +154 -0
  160. data/ruby/trema/openflow-error.c +191 -0
  161. data/ruby/trema/openflow-error.h +53 -0
  162. data/ruby/trema/openflow-switch.rb +88 -0
  163. data/ruby/trema/ordered-hash.rb +74 -0
  164. data/ruby/trema/packet-queue.rb +178 -0
  165. data/ruby/trema/packet_in.c +736 -0
  166. data/ruby/trema/packet_in.h +46 -0
  167. data/ruby/trema/packetin-filter.rb +126 -0
  168. data/ruby/trema/path.rb +135 -0
  169. data/ruby/trema/phost.rb +69 -0
  170. data/ruby/trema/port-mod.c +226 -0
  171. data/ruby/trema/port-mod.h +36 -0
  172. data/ruby/trema/port-stats-reply.rb +111 -0
  173. data/ruby/trema/port-status.c +156 -0
  174. data/ruby/trema/port-status.h +45 -0
  175. data/ruby/trema/port.c +295 -0
  176. data/ruby/trema/port.h +47 -0
  177. data/ruby/trema/process.rb +76 -0
  178. data/ruby/trema/queue-get-config-reply.c +200 -0
  179. data/ruby/trema/queue-get-config-reply.h +47 -0
  180. data/ruby/trema/queue-get-config-request.c +141 -0
  181. data/ruby/trema/queue-get-config-request.h +44 -0
  182. data/ruby/trema/queue-stats-reply.rb +78 -0
  183. data/ruby/trema/set-config.c +171 -0
  184. data/ruby/trema/set-config.h +44 -0
  185. data/ruby/trema/shell.rb +39 -0
  186. data/ruby/trema/shell/down.rb +39 -0
  187. data/ruby/trema/shell/killall.rb +40 -0
  188. data/ruby/trema/shell/link.rb +61 -0
  189. data/ruby/trema/shell/reset_stats.rb +50 -0
  190. data/ruby/trema/shell/run.rb +67 -0
  191. data/ruby/trema/shell/send_packets.rb +42 -0
  192. data/ruby/trema/shell/show_stats.rb +49 -0
  193. data/ruby/trema/shell/up.rb +43 -0
  194. data/ruby/trema/shell/vhost.rb +44 -0
  195. data/ruby/trema/shell/vswitch.rb +49 -0
  196. data/ruby/trema/stats-helper.rb +65 -0
  197. data/ruby/trema/stats-reply.c +483 -0
  198. data/ruby/trema/stats-reply.h +53 -0
  199. data/ruby/trema/stats-request.c +634 -0
  200. data/ruby/trema/stats-request.h +42 -0
  201. data/ruby/trema/switch-daemon.rb +74 -0
  202. data/ruby/trema/switch-disconnected.c +40 -0
  203. data/ruby/trema/switch-disconnected.h +38 -0
  204. data/ruby/trema/switch-manager.rb +121 -0
  205. data/ruby/trema/switch.rb +37 -0
  206. data/ruby/trema/table-stats-reply.rb +87 -0
  207. data/ruby/trema/timers.rb +97 -0
  208. data/ruby/trema/trema.c +122 -0
  209. data/ruby/trema/tremashark.rb +39 -0
  210. data/ruby/trema/util.rb +84 -0
  211. data/ruby/trema/vendor-request.c +193 -0
  212. data/ruby/trema/vendor-request.h +44 -0
  213. data/ruby/trema/vendor-stats-reply.rb +62 -0
  214. data/ruby/trema/vendor.c +152 -0
  215. data/ruby/trema/vendor.h +52 -0
  216. data/ruby/trema/version.rb +30 -0
  217. data/spec/spec_helper.rb +153 -0
  218. data/spec/support/openflow-message.rb +94 -0
  219. data/spec/trema/action-enqueue_spec.rb +100 -0
  220. data/spec/trema/action-output_spec.rb +116 -0
  221. data/spec/trema/action-set-dl-dst_spec.rb +95 -0
  222. data/spec/trema/action-set-dl-src_spec.rb +92 -0
  223. data/spec/trema/action-set-nw-dst_spec.rb +96 -0
  224. data/spec/trema/action-set-nw-src_spec.rb +97 -0
  225. data/spec/trema/action-set-nw-tos_spec.rb +88 -0
  226. data/spec/trema/action-set-tp-dst_spec.rb +88 -0
  227. data/spec/trema/action-set-tp-src_spec.rb +88 -0
  228. data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
  229. data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
  230. data/spec/trema/action-strip-vlan_spec.rb +57 -0
  231. data/spec/trema/action-vendor_spec.rb +90 -0
  232. data/spec/trema/app_spec.rb +90 -0
  233. data/spec/trema/barrier-reply_spec.rb +45 -0
  234. data/spec/trema/barrier-request_spec.rb +83 -0
  235. data/spec/trema/cli_spec.rb +160 -0
  236. data/spec/trema/controller_spec.rb +100 -0
  237. data/spec/trema/dsl/configuration_spec.rb +122 -0
  238. data/spec/trema/dsl/link_spec.rb +54 -0
  239. data/spec/trema/dsl/run_spec.rb +78 -0
  240. data/spec/trema/dsl/runner_spec.rb +239 -0
  241. data/spec/trema/dsl/switch_spec.rb +77 -0
  242. data/spec/trema/dsl/syntax_spec.rb +121 -0
  243. data/spec/trema/dsl/vhost_spec.rb +148 -0
  244. data/spec/trema/dsl/vswitch_spec.rb +90 -0
  245. data/spec/trema/echo-reply_spec.rb +49 -0
  246. data/spec/trema/echo-request_spec.rb +75 -0
  247. data/spec/trema/error_spec.rb +142 -0
  248. data/spec/trema/executables_spec.rb +75 -0
  249. data/spec/trema/features-reply_spec.rb +57 -0
  250. data/spec/trema/features-request_spec.rb +66 -0
  251. data/spec/trema/flow-removed_spec.rb +146 -0
  252. data/spec/trema/get-config-reply_spec.rb +43 -0
  253. data/spec/trema/get-config-request_spec.rb +82 -0
  254. data/spec/trema/hello_spec.rb +49 -0
  255. data/spec/trema/host_spec.rb +193 -0
  256. data/spec/trema/link_spec.rb +64 -0
  257. data/spec/trema/list-switches-reply_spec.rb +48 -0
  258. data/spec/trema/logger_spec.rb +48 -0
  259. data/spec/trema/mac_spec.rb +115 -0
  260. data/spec/trema/match_spec.rb +113 -0
  261. data/spec/trema/open-vswitch_spec.rb +123 -0
  262. data/spec/trema/openflow-error_spec.rb +141 -0
  263. data/spec/trema/openflow-switch_spec.rb +56 -0
  264. data/spec/trema/packet-in_spec.rb +168 -0
  265. data/spec/trema/packet-out_spec.rb +128 -0
  266. data/spec/trema/packetin-filter_spec.rb +41 -0
  267. data/spec/trema/port-mod_spec.rb +101 -0
  268. data/spec/trema/port-status_spec.rb +108 -0
  269. data/spec/trema/port_spec.rb +61 -0
  270. data/spec/trema/process_spec.rb +71 -0
  271. data/spec/trema/queue-get-config-reply_spec.rb +66 -0
  272. data/spec/trema/queue-get-config-request_spec.rb +69 -0
  273. data/spec/trema/set-config_spec.rb +80 -0
  274. data/spec/trema/shell/vhost_spec.rb +57 -0
  275. data/spec/trema/shell/vswitch_spec.rb +89 -0
  276. data/spec/trema/stats-reply_spec.rb +306 -0
  277. data/spec/trema/stats-request_spec.rb +151 -0
  278. data/spec/trema/switch-disconnected_spec.rb +58 -0
  279. data/spec/trema/switch-manager_spec.rb +43 -0
  280. data/spec/trema/tremashark_spec.rb +41 -0
  281. data/spec/trema/util_spec.rb +93 -0
  282. data/spec/trema/vendor-request_spec.rb +79 -0
  283. data/src/examples/cbench_switch/README +21 -0
  284. data/src/examples/cbench_switch/cbench-switch.rb +39 -0
  285. data/src/examples/cbench_switch/cbench_switch.c +68 -0
  286. data/src/examples/dumper/dumper.c +370 -0
  287. data/src/examples/dumper/dumper.conf +7 -0
  288. data/src/examples/dumper/dumper.rb +196 -0
  289. data/src/examples/hello_trema/README +13 -0
  290. data/src/examples/hello_trema/hello_trema.c +51 -0
  291. data/src/examples/hello_trema/hello_trema.conf +3 -0
  292. data/src/examples/hello_trema/hello_trema.rb +35 -0
  293. data/src/examples/learning_switch/README +15 -0
  294. data/src/examples/learning_switch/fdb.rb +112 -0
  295. data/src/examples/learning_switch/learning-switch.rb +88 -0
  296. data/src/examples/learning_switch/learning_switch.c +236 -0
  297. data/src/examples/learning_switch/learning_switch.conf +18 -0
  298. data/src/examples/list_switches/README +19 -0
  299. data/src/examples/list_switches/list-switches.rb +45 -0
  300. data/src/examples/list_switches/list_switches.c +81 -0
  301. data/src/examples/list_switches/list_switches.conf +15 -0
  302. data/src/examples/match_compare/match-compare.conf +30 -0
  303. data/src/examples/match_compare/match-compare.rb +99 -0
  304. data/src/examples/multi_learning_switch/README +14 -0
  305. data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
  306. data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
  307. data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
  308. data/src/examples/openflow_message/README +11 -0
  309. data/src/examples/openflow_message/echo-reply.rb +59 -0
  310. data/src/examples/openflow_message/echo-request.rb +58 -0
  311. data/src/examples/openflow_message/echo_reply.c +70 -0
  312. data/src/examples/openflow_message/echo_request.c +70 -0
  313. data/src/examples/openflow_message/example.rb +63 -0
  314. data/src/examples/openflow_message/features-request.rb +97 -0
  315. data/src/examples/openflow_message/features_request.c +168 -0
  316. data/src/examples/openflow_message/hello.c +70 -0
  317. data/src/examples/openflow_message/hello.rb +58 -0
  318. data/src/examples/openflow_message/set-config.rb +59 -0
  319. data/src/examples/openflow_message/set_config.c +70 -0
  320. data/src/examples/packet_in/README +15 -0
  321. data/src/examples/packet_in/packet_in.c +55 -0
  322. data/src/examples/packet_in/packet_in.conf +15 -0
  323. data/src/examples/packet_in/packet_in.rb +34 -0
  324. data/src/examples/packetin_filter_config/README +12 -0
  325. data/src/examples/packetin_filter_config/add_filter.c +73 -0
  326. data/src/examples/packetin_filter_config/delete_filter.c +65 -0
  327. data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
  328. data/src/examples/packetin_filter_config/dump_filter.c +65 -0
  329. data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
  330. data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
  331. data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
  332. data/src/examples/packetin_filter_config/utils.c +102 -0
  333. data/src/examples/packetin_filter_config/utils.h +42 -0
  334. data/src/examples/repeater_hub/README +8 -0
  335. data/src/examples/repeater_hub/repeater-hub.rb +43 -0
  336. data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
  337. data/src/examples/repeater_hub/repeater_hub.c +83 -0
  338. data/src/examples/repeater_hub/repeater_hub.conf +28 -0
  339. data/src/examples/switch_info/README +13 -0
  340. data/src/examples/switch_info/switch_info.c +80 -0
  341. data/src/examples/switch_info/switch_info.conf +3 -0
  342. data/src/examples/switch_info/switch_info.rb +46 -0
  343. data/src/examples/switch_monitor/switch-monitor.conf +3 -0
  344. data/src/examples/switch_monitor/switch-monitor.rb +58 -0
  345. data/src/examples/switch_monitor/switch_monitor.c +154 -0
  346. data/src/examples/traffic_monitor/counter.c +74 -0
  347. data/src/examples/traffic_monitor/counter.h +48 -0
  348. data/src/examples/traffic_monitor/counter.rb +46 -0
  349. data/src/examples/traffic_monitor/fdb.c +76 -0
  350. data/src/examples/traffic_monitor/fdb.h +50 -0
  351. data/src/examples/traffic_monitor/fdb.rb +44 -0
  352. data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
  353. data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
  354. data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
  355. data/src/lib/arp.h +61 -0
  356. data/src/lib/bool.h +49 -0
  357. data/src/lib/buffer.c +305 -0
  358. data/src/lib/buffer.h +56 -0
  359. data/src/lib/byteorder.c +547 -0
  360. data/src/lib/byteorder.h +110 -0
  361. data/src/lib/checks.h +42 -0
  362. data/src/lib/daemon.c +302 -0
  363. data/src/lib/daemon.h +42 -0
  364. data/src/lib/doubly_linked_list.c +281 -0
  365. data/src/lib/doubly_linked_list.h +88 -0
  366. data/src/lib/ether.c +48 -0
  367. data/src/lib/ether.h +94 -0
  368. data/src/lib/etherip.h +46 -0
  369. data/src/lib/event_handler.c +389 -0
  370. data/src/lib/event_handler.h +64 -0
  371. data/src/lib/hash_table.c +417 -0
  372. data/src/lib/hash_table.h +138 -0
  373. data/src/lib/icmp.h +74 -0
  374. data/src/lib/igmp.h +50 -0
  375. data/src/lib/ipv4.h +50 -0
  376. data/src/lib/linked_list.c +199 -0
  377. data/src/lib/linked_list.h +84 -0
  378. data/src/lib/log.c +402 -0
  379. data/src/lib/log.h +78 -0
  380. data/src/lib/match.h +84 -0
  381. data/src/lib/match_table.c +608 -0
  382. data/src/lib/match_table.h +51 -0
  383. data/src/lib/message_queue.c +143 -0
  384. data/src/lib/message_queue.h +61 -0
  385. data/src/lib/messenger.c +1714 -0
  386. data/src/lib/messenger.h +145 -0
  387. data/src/lib/openflow_application_interface.c +1673 -0
  388. data/src/lib/openflow_application_interface.h +329 -0
  389. data/src/lib/openflow_message.c +4051 -0
  390. data/src/lib/openflow_message.h +288 -0
  391. data/src/lib/openflow_service_interface.h +59 -0
  392. data/src/lib/packet_info.c +230 -0
  393. data/src/lib/packet_info.h +209 -0
  394. data/src/lib/packet_parser.c +502 -0
  395. data/src/lib/packetin_filter_interface.c +294 -0
  396. data/src/lib/packetin_filter_interface.h +127 -0
  397. data/src/lib/persistent_storage.c +480 -0
  398. data/src/lib/persistent_storage.h +46 -0
  399. data/src/lib/stat.c +213 -0
  400. data/src/lib/stat.h +44 -0
  401. data/src/lib/tcp.h +67 -0
  402. data/src/lib/timer.c +350 -0
  403. data/src/lib/timer.h +53 -0
  404. data/src/lib/trema.c +710 -0
  405. data/src/lib/trema.h +79 -0
  406. data/src/lib/trema_private.c +177 -0
  407. data/src/lib/trema_private.h +60 -0
  408. data/src/lib/trema_wrapper.c +56 -0
  409. data/src/lib/trema_wrapper.h +64 -0
  410. data/src/lib/udp.h +43 -0
  411. data/src/lib/utility.c +515 -0
  412. data/src/lib/utility.h +67 -0
  413. data/src/lib/wrapper.c +100 -0
  414. data/src/lib/wrapper.h +76 -0
  415. data/src/packetin_filter/README +17 -0
  416. data/src/packetin_filter/packetin_filter.c +575 -0
  417. data/src/switch_manager/README +20 -0
  418. data/src/switch_manager/cookie_table.c +292 -0
  419. data/src/switch_manager/cookie_table.h +72 -0
  420. data/src/switch_manager/dpid_table.c +110 -0
  421. data/src/switch_manager/dpid_table.h +46 -0
  422. data/src/switch_manager/management_interface.h +44 -0
  423. data/src/switch_manager/ofpmsg_recv.c +482 -0
  424. data/src/switch_manager/ofpmsg_recv.h +42 -0
  425. data/src/switch_manager/ofpmsg_send.c +235 -0
  426. data/src/switch_manager/ofpmsg_send.h +50 -0
  427. data/src/switch_manager/secure_channel_listener.c +281 -0
  428. data/src/switch_manager/secure_channel_listener.h +42 -0
  429. data/src/switch_manager/secure_channel_receiver.c +126 -0
  430. data/src/switch_manager/secure_channel_receiver.h +43 -0
  431. data/src/switch_manager/secure_channel_sender.c +126 -0
  432. data/src/switch_manager/secure_channel_sender.h +43 -0
  433. data/src/switch_manager/service_interface.c +181 -0
  434. data/src/switch_manager/service_interface.h +46 -0
  435. data/src/switch_manager/switch.c +538 -0
  436. data/src/switch_manager/switch.h +51 -0
  437. data/src/switch_manager/switch_manager.c +448 -0
  438. data/src/switch_manager/switch_manager.h +63 -0
  439. data/src/switch_manager/switchinfo.h +72 -0
  440. data/src/switch_manager/xid_table.c +184 -0
  441. data/src/switch_manager/xid_table.h +56 -0
  442. data/src/tremashark/README +78 -0
  443. data/src/tremashark/packet_capture.c +357 -0
  444. data/src/tremashark/pcap_private.h +47 -0
  445. data/src/tremashark/pcap_queue.c +197 -0
  446. data/src/tremashark/pcap_queue.h +58 -0
  447. data/src/tremashark/plugin/.gitignore +6 -0
  448. data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
  449. data/src/tremashark/plugin/packet-trema/Makefile +77 -0
  450. data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
  451. data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
  452. data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
  453. data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
  454. data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
  455. data/src/tremashark/plugin/user_dlts +2 -0
  456. data/src/tremashark/queue.c +168 -0
  457. data/src/tremashark/queue.h +60 -0
  458. data/src/tremashark/stdin_relay.c +257 -0
  459. data/src/tremashark/syslog_relay.c +247 -0
  460. data/src/tremashark/tremashark.c +556 -0
  461. data/trema +93 -0
  462. data/trema-config +61 -0
  463. data/unittests/buffer_stubs.c +74 -0
  464. data/unittests/cmockery_trema.c +123 -0
  465. data/unittests/cmockery_trema.h +96 -0
  466. data/unittests/lib/buffer_test.c +370 -0
  467. data/unittests/lib/byteorder_test.c +1717 -0
  468. data/unittests/lib/daemon_test.c +664 -0
  469. data/unittests/lib/doubly_linked_list_test.c +346 -0
  470. data/unittests/lib/ether_test.c +127 -0
  471. data/unittests/lib/hash_table_test.c +278 -0
  472. data/unittests/lib/linked_list_test.c +343 -0
  473. data/unittests/lib/log_test.c +459 -0
  474. data/unittests/lib/match_table_test.c +1509 -0
  475. data/unittests/lib/message_queue_test.c +379 -0
  476. data/unittests/lib/messenger_test.c +438 -0
  477. data/unittests/lib/openflow_application_interface_test.c +3488 -0
  478. data/unittests/lib/openflow_message_test.c +7337 -0
  479. data/unittests/lib/packet_info_test.c +544 -0
  480. data/unittests/lib/packet_parser_test.c +703 -0
  481. data/unittests/lib/packetin_filter_interface_test.c +723 -0
  482. data/unittests/lib/persistent_storage_test.c +802 -0
  483. data/unittests/lib/stat_test.c +291 -0
  484. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  485. data/unittests/lib/test_packets/arp_req.cap +0 -0
  486. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  487. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  488. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  489. data/unittests/lib/test_packets/ipx.cap +0 -0
  490. data/unittests/lib/test_packets/lldp.cap +0 -0
  491. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  492. data/unittests/lib/test_packets/tcp.cap +0 -0
  493. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  494. data/unittests/lib/test_packets/udp.cap +0 -0
  495. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  496. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  497. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  498. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  499. data/unittests/lib/timer_test.c +248 -0
  500. data/unittests/lib/trema_private_test.c +323 -0
  501. data/unittests/lib/trema_test.c +985 -0
  502. data/unittests/lib/utility_test.c +628 -0
  503. data/unittests/lib/wrapper_test.c +201 -0
  504. data/unittests/packetin_filter/packetin_filter_test.c +477 -0
  505. data/unittests/switch_manager/switch_manager_test.c +1178 -0
  506. data/unittests/wrapper_stubs.c +39 -0
  507. data/vendor/.gitignore +6 -0
  508. data/vendor/README +30 -0
  509. data/vendor/cmockery-20110428.tar.gz +0 -0
  510. data/vendor/oflops-0.03.tar.gz +0 -0
  511. data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
  512. data/vendor/openflow-1.0.0.tar.gz +0 -0
  513. data/vendor/openflow.git.tar.gz +0 -0
  514. data/vendor/openvswitch-1.2.2.tar.gz +0 -0
  515. data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
  516. data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
  517. data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
  518. data/vendor/ruby-ifconfig-1.2/README +38 -0
  519. data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
  520. data/vendor/ruby-ifconfig-1.2/TODO +8 -0
  521. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
  522. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
  523. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
  524. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
  525. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
  526. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
  527. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
  528. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
  529. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
  530. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
  531. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
  532. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
  533. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
  534. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
  535. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
  536. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
  537. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
  538. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
  539. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
  540. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
  541. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
  542. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
  543. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
  544. data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
  545. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
  546. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
  547. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
  548. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
  549. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
  550. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
  551. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
  552. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
  553. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
  554. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
  555. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
  556. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
  557. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
  558. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
  559. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
  560. metadata +856 -0
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Author: Nick Karanatsios <nickkaranatsios@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
+ #ifndef STATS_REPLY_H
22
+ #define STATS_REPLY_H
23
+
24
+
25
+ #include "ruby.h"
26
+ #include "trema.h"
27
+
28
+
29
+ extern VALUE cStatsReply;
30
+
31
+
32
+ void Init_stats_reply( void );
33
+
34
+
35
+ void handle_stats_reply(
36
+ uint64_t datapath_id,
37
+ uint32_t transaction_id,
38
+ uint16_t type,
39
+ uint16_t flags,
40
+ const buffer *body,
41
+ void *user_data
42
+ );
43
+
44
+
45
+ #endif // STATS_REPLY_H
46
+
47
+
48
+ /*
49
+ * Local variables:
50
+ * c-basic-offset: 2
51
+ * indent-tabs-mode: nil
52
+ * End:
53
+ */
@@ -0,0 +1,634 @@
1
+ /*
2
+ * Author: Nick Karanatsios <nickkaranatsios@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 "trema.h"
22
+ #include "ruby.h"
23
+
24
+
25
+ extern VALUE mTrema;
26
+ VALUE cStatsRequest;
27
+ VALUE cFlowStatsRequest;
28
+ VALUE cAggregateStatsRequest;
29
+ VALUE cTableStatsRequest;
30
+ VALUE cPortStatsRequest;
31
+ VALUE cQueueStatsRequest;
32
+ VALUE cVendorStatsRequest;
33
+
34
+
35
+ static const struct ofp_match MATCH = { 0, 1,
36
+ { 0x01, 0x02, 0x03, 0x04, 0x05, 0x07 },
37
+ { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d },
38
+ 1, 1, { 0 }, 0x800, 0xfc, 0x6, { 0, 0 },
39
+ 0x0a090807, 0x0a090807, 1024, 2048 };
40
+ static const uint32_t MY_TRANSACTION_ID = 1;
41
+ static const uint32_t VENDOR_ID = 0x00004cff;
42
+ static const uint16_t NO_FLAGS = 0;
43
+ static const uint16_t OUT_PORT = 1;
44
+ static const uint16_t VENDOR_STATS_FLAG = 0xaabb;
45
+ static const uint8_t TABLE_ID = 0xff;
46
+
47
+
48
+ /*
49
+ * @overload initialize(options={})
50
+ * A +OPPT_STATS_REQUEST+ message is sent to collect statistics for a
51
+ * type element from the datapath. This type element can be a flow
52
+ * port, queue, or vendor. All stats. request messages share a common header
53
+ * followed by additional fields that further describe the request type.
54
+ * There is a derived class for each associated type. All stats. requests
55
+ * encapsulate their instances as a buffer object that can be converted
56
+ * to a packet to be used for transmission.
57
+ *
58
+ * @see FlowStatsRequest
59
+ * @see AggregateStatsRequest
60
+ * @see TableStatsRequest
61
+ * @see PortStatsRequest
62
+ * @see QueueStatsRequest
63
+ * @see VendorStatsRequest
64
+ *
65
+ * @param [Hash] options
66
+ * the options to create a message with.
67
+ *
68
+ * @option options [Number] :transaction_id
69
+ * transaction_id for this request or auto-generated if not specified.
70
+ *
71
+ * @option options [Number] :flags
72
+ * flags not defined yet should be set to zero.
73
+ *
74
+ * @raise [ArgumentError] if supplied transaction_id is not an unsigned 32-bit integer.
75
+ *
76
+ * @return [StatsRequest]
77
+ * an object that encapsulates an +OFPT_STATS_REQUEST+ OpenFlow message.
78
+ */
79
+ static VALUE
80
+ stats_request_init( VALUE self, VALUE options ) {
81
+ VALUE transaction_id;
82
+ if ( ( transaction_id = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
83
+ if ( rb_funcall( transaction_id, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
84
+ rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
85
+ }
86
+ }
87
+ else {
88
+ transaction_id = UINT2NUM( get_transaction_id() );
89
+ }
90
+ rb_iv_set( self, "@transaction_id", transaction_id );
91
+ VALUE flags = rb_hash_aref( options, ID2SYM( rb_intern( "flags" ) ) );
92
+ if ( flags == Qnil ) {
93
+ flags = UINT2NUM( 0 );
94
+ }
95
+ rb_iv_set( self, "@flags", flags );
96
+ return self;
97
+ }
98
+
99
+
100
+ static VALUE
101
+ subclass_stats_request_init( VALUE self, VALUE options ) {
102
+ rb_call_super( 1, &options );
103
+ VALUE match = rb_hash_aref( options, ID2SYM( rb_intern( "match" ) ) );
104
+ if ( match == Qnil ) {
105
+ rb_raise( rb_eArgError, "match option must be specified" );
106
+ }
107
+ rb_iv_set( self, "@match", match );
108
+ VALUE table_id = rb_hash_aref( options, ID2SYM( rb_intern( "table_id" ) ) );
109
+ if ( table_id == Qnil ) {
110
+ table_id = UINT2NUM( 0xff );
111
+ }
112
+ rb_iv_set( self, "@table_id", table_id );
113
+ VALUE out_port = rb_hash_aref( options, ID2SYM( rb_intern( "out_port" ) ) );
114
+ if ( out_port == Qnil ) {
115
+ out_port = UINT2NUM( OFPP_NONE );
116
+ }
117
+ rb_iv_set( self, "@out_port", out_port );
118
+ return self;
119
+ }
120
+
121
+
122
+ static VALUE
123
+ flow_stats_request_alloc( VALUE klass ) {
124
+ buffer *flow_stats_request = create_flow_stats_request( MY_TRANSACTION_ID, NO_FLAGS, MATCH, TABLE_ID, OUT_PORT );
125
+ return Data_Wrap_Struct( klass, NULL, free_buffer, flow_stats_request );
126
+ }
127
+
128
+
129
+ static VALUE
130
+ aggregate_stats_request_alloc( VALUE klass ) {
131
+ buffer *aggregate_stats_request = create_aggregate_stats_request( MY_TRANSACTION_ID, NO_FLAGS, MATCH, TABLE_ID, OUT_PORT );
132
+ return Data_Wrap_Struct( klass, NULL, free_buffer, aggregate_stats_request );
133
+ }
134
+
135
+
136
+ static VALUE
137
+ table_stats_request_alloc( VALUE klass ) {
138
+ buffer *table_stats_request = create_table_stats_request( MY_TRANSACTION_ID, NO_FLAGS );
139
+ return Data_Wrap_Struct( klass, NULL, free_buffer, table_stats_request );
140
+ }
141
+
142
+
143
+ static VALUE
144
+ port_stats_request_alloc( VALUE klass ) {
145
+ uint16_t port_no = 1;
146
+ buffer *port_stats_request = create_port_stats_request( MY_TRANSACTION_ID, NO_FLAGS, port_no );
147
+ return Data_Wrap_Struct( klass, NULL, free_buffer, port_stats_request );
148
+ }
149
+
150
+
151
+ static VALUE
152
+ queue_stats_request_alloc( VALUE klass ) {
153
+ uint32_t queue_id = 10;
154
+ uint16_t port_no = 1;
155
+ buffer *queue_stats_request = create_queue_stats_request( MY_TRANSACTION_ID, NO_FLAGS, port_no, queue_id );
156
+ return Data_Wrap_Struct( klass, NULL, free_buffer, queue_stats_request );
157
+ }
158
+
159
+
160
+ static VALUE
161
+ vendor_stats_request_alloc( VALUE klass ) {
162
+ uint16_t length = 128;
163
+ buffer *body = alloc_buffer_with_length( length );
164
+ void *p = append_back_buffer( body, length );
165
+ memset( p, 0xaf, length );
166
+ buffer *vendor_stats_request = create_vendor_stats_request( MY_TRANSACTION_ID, VENDOR_STATS_FLAG, VENDOR_ID, body );
167
+ return Data_Wrap_Struct( klass, NULL, free_buffer, vendor_stats_request );
168
+ }
169
+
170
+
171
+ /*
172
+ * Transaction ids, message sequence numbers matching requests to replies.
173
+ *
174
+ * @return [Number] the value of transaction_id.
175
+ */
176
+ static VALUE
177
+ stats_transaction_id( VALUE self ) {
178
+ return rb_iv_get( self, "@transaction_id" );
179
+ }
180
+
181
+
182
+ /*
183
+ * Not yet defined. Set to zero.
184
+ *
185
+ * @return [Number] the value of flags.
186
+ */
187
+ static VALUE
188
+ stats_flags( VALUE self ) {
189
+ return rb_iv_get( self, "@flags" );
190
+ }
191
+
192
+
193
+ /*
194
+ * Detailed description of each flow field.
195
+ *
196
+ * @return [Match] the value of match.
197
+ */
198
+ static VALUE
199
+ stats_match( VALUE self ) {
200
+ return rb_iv_get( self, "@match" );
201
+ }
202
+
203
+
204
+ /*
205
+ * An index into array of tables. 0xff for all tables.
206
+ *
207
+ * @return [Number] the value of table_id.
208
+ */
209
+ static VALUE
210
+ stats_table_id( VALUE self ) {
211
+ return rb_iv_get( self, "@table_id" );
212
+ }
213
+
214
+
215
+ /*
216
+ * Requires flow matching if defined.
217
+ *
218
+ * @return [Number] the value of out_port.
219
+ */
220
+ static VALUE
221
+ stats_out_port( VALUE self ) {
222
+ return rb_iv_get( self, "@out_port" );
223
+ }
224
+
225
+
226
+ /*
227
+ * Restrict port statistics to a specific port_no or to all ports.
228
+ *
229
+ * @return [Number] the value of port_no.
230
+ */
231
+ static VALUE
232
+ stats_port_no( VALUE self ) {
233
+ return rb_iv_get( self, "@port_no" );
234
+ }
235
+
236
+
237
+ /*
238
+ * Restrict queue statistics to a specific queue_id or to all queues.
239
+ *
240
+ * @return [Number] the value of queue_id.
241
+ */
242
+ static VALUE
243
+ stats_queue_id( VALUE self ) {
244
+ return rb_iv_get( self, "@queue_id" );
245
+ }
246
+
247
+
248
+ /*
249
+ * Vendor id uniquely assigned for each vendor.
250
+ *
251
+ * @return [Number] the value of vendor_id.
252
+ */
253
+ static VALUE
254
+ stats_vendor_id( VALUE self ) {
255
+ return rb_iv_get( self, "@vendor_id" );
256
+ }
257
+
258
+
259
+ uint32_t
260
+ get_stats_request_num2uint( VALUE self, const char *field ) {
261
+ return NUM2UINT( rb_iv_get( self, field ) );
262
+ }
263
+
264
+
265
+ uint16_t
266
+ get_stats_request_num2uint16( VALUE self, const char *field ) {
267
+ return ( uint16_t ) NUM2UINT( rb_iv_get( self, field ) );
268
+ }
269
+
270
+
271
+ uint8_t
272
+ get_stats_request_table_id( VALUE self ) {
273
+ return ( uint8_t ) NUM2UINT( rb_iv_get( self, "@table_id" ) );
274
+ }
275
+
276
+
277
+ struct ofp_match
278
+ get_stats_request_match( VALUE self ) {
279
+ const struct ofp_match *match;
280
+ Data_Get_Struct( rb_iv_get( self, "@match" ), struct ofp_match, match );
281
+ return *match;
282
+ }
283
+
284
+
285
+ /*
286
+ * A {FlowStatsRequest} object instance to request flow statistics.
287
+ *
288
+ * @overload initialize(options={})
289
+ * @example
290
+ * FlowStatsRequest.new(
291
+ * :match => Match
292
+ * )
293
+ *
294
+ * @param [Hash] options
295
+ * the options to create a message with.
296
+ *
297
+ * @option options [Match] :match
298
+ * a {Match} object to match flow fields with this request.
299
+ * This option is mandatory.
300
+ *
301
+ * @option options [Number] :table_id
302
+ * a table id to match and restrict returned results.
303
+ * A value of 0xff would return all tables and is set to if not specified.
304
+ *
305
+ * @option options [Number] :out_port
306
+ * a value of +OFPP_NONE+ would match all flow entries and is set to if not
307
+ * specified.
308
+ *
309
+ * @raise [ArgumentError] if option[:match] is not specified.
310
+ *
311
+ * @return [FlowStatsRequest]
312
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_FLOW)+ OpenFlow message.
313
+ */
314
+ static VALUE
315
+ flow_stats_request_init( VALUE self, VALUE options ) {
316
+ buffer *message;
317
+ Data_Get_Struct( self, buffer, message );
318
+
319
+ subclass_stats_request_init( self, options );
320
+
321
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
322
+
323
+ struct ofp_stats_request *stats_request;
324
+ stats_request = ( struct ofp_stats_request * ) message->data;
325
+ struct ofp_flow_stats_request *flow_stats_request;
326
+ flow_stats_request = ( struct ofp_flow_stats_request * ) stats_request->body;
327
+
328
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
329
+
330
+ struct ofp_match m = get_stats_request_match( self );
331
+ hton_match( &flow_stats_request->match, &m ) ;
332
+ flow_stats_request->table_id = get_stats_request_table_id( self );
333
+ flow_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
334
+ return self;
335
+ }
336
+
337
+
338
+ /*
339
+ * A {AggregateStatsRequest} object instance to request aggregate statistics.
340
+ * @overload initialize(options={})
341
+ * @example
342
+ * AggregateStatsRequest.new(
343
+ * :match => Match
344
+ * )
345
+ *
346
+ * @param [Hash] options
347
+ * the options to create a message with.
348
+ *
349
+ * @option options [Match] :match
350
+ * a {Match} object to match flow fields with this request.
351
+ * This option is mandatory.
352
+ *
353
+ * @option options [Number] :table_id
354
+ * a table id to match and restrict returned results.
355
+ * A value of 0xff would return all tables and is set to if not specified.
356
+ *
357
+ * @option options [Number] :out_port
358
+ * a value of +OFPP_NONE+ would match all flow entries and is set to if not
359
+ * specified.
360
+ *
361
+ * @raise [ArgumentError] if option[:match] is not specified.
362
+ *
363
+ * @return [AggregateStatsRequest]
364
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_AGGREGATE)+ OpenFlow message.
365
+ */
366
+ static VALUE
367
+ aggregate_stats_request_init( VALUE self, VALUE options ) {
368
+ buffer *message;
369
+ Data_Get_Struct( self, buffer, message );
370
+
371
+ subclass_stats_request_init( self, options );
372
+
373
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
374
+
375
+ struct ofp_stats_request *stats_request;
376
+ stats_request = ( struct ofp_stats_request * ) message->data;
377
+ struct ofp_aggregate_stats_request *aggregate_stats_request;
378
+ aggregate_stats_request = ( struct ofp_aggregate_stats_request * ) stats_request->body;
379
+
380
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
381
+
382
+ struct ofp_match m = get_stats_request_match( self );
383
+ hton_match( &aggregate_stats_request->match, &m ) ;
384
+ aggregate_stats_request->table_id = get_stats_request_table_id( self );
385
+ aggregate_stats_request->out_port = htons( get_stats_request_num2uint16( self, "@out_port" ) );
386
+ return self;
387
+ }
388
+
389
+
390
+ /*
391
+ * A {TableStatsRequest} object instance to request table statistics.
392
+ * Request table statistics. The table stats. request does not contain any data
393
+ * in the body.
394
+ *
395
+ * @overload initialize(options={})
396
+ *
397
+ * @example
398
+ * TableStatsRequest.new(
399
+ * :transaction_id => 1234
400
+ * )
401
+ *
402
+ * @param [Hash] options
403
+ * the options to create a message with.
404
+ *
405
+ * @option options [Number] :transaction_id
406
+ * set the transaction_id as specified or auto-generate it.
407
+ *
408
+ * @return [TableStatsRequest]
409
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_TABLE)+ openflow
410
+ * message.
411
+ */
412
+ static VALUE
413
+ table_stats_request_init( int argc, VALUE *argv, VALUE self ) {
414
+ VALUE options;
415
+ if ( !rb_scan_args( argc, argv, "01", &options )) {
416
+ options = rb_hash_new();
417
+ }
418
+ rb_call_super( 1, &options );
419
+ buffer *message;
420
+ Data_Get_Struct( self, buffer, message );
421
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
422
+ struct ofp_stats_request *stats_request;
423
+ stats_request = ( struct ofp_stats_request * ) message->data;
424
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
425
+ return self;
426
+ }
427
+
428
+
429
+ /*
430
+ * A {PortStatsRequest} object instance to request port statistics.
431
+ * Request port statistics.
432
+ *
433
+ * @overload initialize(options={})
434
+ *
435
+ * @example
436
+ * PortStatsRequest.new(
437
+ * :port_no => port_no
438
+ * )
439
+ *
440
+ * @param [Hash] options
441
+ * the options to create a message with.
442
+ *
443
+ * @option options [Number] :port_no
444
+ * request statistics for a specific port if specified, otherwise set port_no
445
+ * to +OFPP_NONE+ for all ports.
446
+ *
447
+ * @return [PortStatsRequest]
448
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_PORT)+ OpenFlow
449
+ * message.
450
+ */
451
+ static VALUE
452
+ port_stats_request_init( int argc, VALUE *argv, VALUE self ) {
453
+ VALUE options;
454
+ if ( !rb_scan_args( argc, argv, "01", &options )) {
455
+ options = rb_hash_new();
456
+ }
457
+ rb_call_super( 1, &options );
458
+ VALUE port_no = rb_hash_aref( options, ID2SYM( rb_intern( "port_no" ) ) );
459
+ if ( port_no == Qnil ) {
460
+ port_no = UINT2NUM( OFPP_NONE );
461
+ }
462
+ rb_iv_set( self, "@port_no", port_no );
463
+
464
+ buffer *message;
465
+ Data_Get_Struct( self, buffer, message );
466
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
467
+ struct ofp_stats_request *stats_request;
468
+ stats_request = ( struct ofp_stats_request * ) message->data;
469
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
470
+ struct ofp_port_stats_request *port_stats_request = ( struct ofp_port_stats_request * ) stats_request->body;
471
+ port_stats_request->port_no = htons( get_stats_request_num2uint16( self, "@port_no" ) );
472
+ return self;
473
+ }
474
+
475
+
476
+ /*
477
+ * A {QueueStatsRequest} object instance to request queue statistics.
478
+ * Request queue statistics.
479
+ *
480
+ * @overload initialize(options={})
481
+ *
482
+ * @example
483
+ * QueueStatsRequest.new(
484
+ * :port_no => port_no,
485
+ * :queue_id => queue_id
486
+ * )
487
+ *
488
+ * @param [Hash] options
489
+ * the options to create a message with.
490
+ *
491
+ * @option options [Number] :port_no
492
+ * request statistics for a specific port if specified, otherwise set port_no
493
+ * to +OFPP_ALL+ for all ports.
494
+ *
495
+ * @option options [Number] :queue_id
496
+ * request statistics for a specific queue_id or set queue_id to +OFPQ_ALL+
497
+ * for all queues.
498
+ *
499
+ * @return [QueueStatsRequest]
500
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_QUEUE)+ OpenFlow
501
+ * message.
502
+ */
503
+ static VALUE
504
+ queue_stats_request_init( int argc, VALUE *argv, VALUE self ) {
505
+ VALUE options;
506
+ if ( !rb_scan_args( argc, argv, "01", &options )) {
507
+ options = rb_hash_new();
508
+ }
509
+ rb_call_super( 1, &options );
510
+ VALUE port_no = rb_hash_aref( options, ID2SYM( rb_intern( "port_no" ) ) );
511
+ if ( port_no == Qnil ) {
512
+ port_no = UINT2NUM( OFPP_ALL );
513
+ }
514
+ rb_iv_set( self, "@port_no", port_no );
515
+ VALUE queue_id = rb_hash_aref( options, ID2SYM( rb_intern( "queue_id" ) ) );
516
+ if ( queue_id == Qnil ) {
517
+ queue_id = UINT2NUM( OFPQ_ALL );
518
+ }
519
+ rb_iv_set( self, "@queue_id", queue_id );
520
+
521
+
522
+ buffer *message;
523
+ Data_Get_Struct( self, buffer, message );
524
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
525
+ struct ofp_stats_request *stats_request;
526
+ stats_request = ( struct ofp_stats_request * ) message->data;
527
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
528
+
529
+ stats_request = ( struct ofp_stats_request * ) message->data;
530
+ struct ofp_queue_stats_request *queue_stats_request;
531
+ queue_stats_request = ( struct ofp_queue_stats_request * ) stats_request->body;
532
+ queue_stats_request->port_no = htons( get_stats_request_num2uint16( self, "@port_no" ) );
533
+ queue_stats_request->queue_id = htonl( get_stats_request_num2uint( self, "@queue_id" ) );
534
+ return self;
535
+ }
536
+
537
+
538
+ /*
539
+ * A {VendorStatsRequest} object instance to request vendor statistics.
540
+ * Request vendor specific statistics.
541
+ *
542
+ * @overload initialize(options={})
543
+ *
544
+ * @example
545
+ * VendorStatsRequeset.new(
546
+ * :vendor_id => vendor_id
547
+ * )
548
+ *
549
+ * @param [Hash] options
550
+ * the options to create a message with.
551
+ *
552
+ * @option options [Number] :vendor_id
553
+ * request statistics for a specific vendor_id, otherwise set vendor_id
554
+ * to a default value of 0x00004cff.
555
+ *
556
+ * @return [VendorStatsRequest]
557
+ * an object that encapsulates the +OFPT_STATS_REQUEST(OFPST_VENDOR)+ openflow
558
+ * message.
559
+ */
560
+ static VALUE
561
+ vendor_stats_request_init( int argc, VALUE *argv, VALUE self ) {
562
+ VALUE options;
563
+
564
+ if ( !rb_scan_args( argc, argv, "01", &options )) {
565
+ options = rb_hash_new();
566
+ }
567
+ rb_call_super( 1, &options );
568
+ VALUE vendor_id = rb_hash_aref( options, ID2SYM( rb_intern( "vendor_id" ) ) );
569
+ if ( vendor_id == Qnil ) {
570
+ vendor_id = UINT2NUM( 0x00004cff );
571
+ }
572
+ rb_iv_set( self, "@vendor_id", vendor_id );
573
+ buffer *message;
574
+ Data_Get_Struct( self, buffer, message );
575
+ ( ( struct ofp_header * ) ( message->data ) )->xid = htonl( get_stats_request_num2uint( self, "@transaction_id" ) );
576
+ struct ofp_stats_request *stats_request;
577
+ stats_request = ( struct ofp_stats_request * ) message->data;
578
+ stats_request->flags = htons ( get_stats_request_num2uint16( self, "@flags" ) );
579
+ uint32_t *vendor;
580
+ vendor = ( uint32_t * ) stats_request->body;
581
+ *vendor = htonl( get_stats_request_num2uint( self, "@vendor_id" ) );
582
+ return self;
583
+ }
584
+
585
+
586
+ void
587
+ Init_stats_request(){
588
+ cStatsRequest = rb_define_class_under( mTrema, "StatsRequest", rb_cObject );
589
+ cFlowStatsRequest = rb_define_class_under( mTrema, "FlowStatsRequest", cStatsRequest );
590
+ rb_define_method( cStatsRequest, "initialize", stats_request_init, 1 );
591
+ rb_define_method( cStatsRequest, "transaction_id", stats_transaction_id, 0 );
592
+ rb_define_method( cStatsRequest, "flags", stats_flags, 0 );
593
+
594
+ rb_define_alloc_func( cFlowStatsRequest, flow_stats_request_alloc );
595
+ rb_define_method( cFlowStatsRequest, "initialize", flow_stats_request_init, 1 );
596
+ rb_define_method( cFlowStatsRequest, "match", stats_match, 0 );
597
+ rb_define_method( cFlowStatsRequest, "table_id", stats_table_id, 0 );
598
+ rb_define_method( cFlowStatsRequest, "out_port", stats_out_port, 0 );
599
+
600
+ cAggregateStatsRequest = rb_define_class_under( mTrema, "AggregateStatsRequest", cStatsRequest );
601
+ rb_define_alloc_func( cAggregateStatsRequest, aggregate_stats_request_alloc );
602
+ rb_define_method( cAggregateStatsRequest, "initialize", aggregate_stats_request_init, 1 );
603
+ rb_define_method( cAggregateStatsRequest, "match", stats_match, 0 );
604
+ rb_define_method( cAggregateStatsRequest, "table_id", stats_table_id, 0 );
605
+ rb_define_method( cAggregateStatsRequest, "out_port", stats_out_port, 0 );
606
+
607
+ cTableStatsRequest = rb_define_class_under( mTrema, "TableStatsRequest", cStatsRequest );
608
+ rb_define_alloc_func( cTableStatsRequest, table_stats_request_alloc );
609
+ rb_define_method( cTableStatsRequest, "initialize", table_stats_request_init, -1 );
610
+
611
+ cPortStatsRequest = rb_define_class_under( mTrema, "PortStatsRequest", cStatsRequest );
612
+ rb_define_alloc_func( cPortStatsRequest, port_stats_request_alloc );
613
+ rb_define_method( cPortStatsRequest, "initialize", port_stats_request_init, -1 );
614
+ rb_define_method( cPortStatsRequest, "port_no", stats_port_no, 0 );
615
+
616
+ cQueueStatsRequest = rb_define_class_under( mTrema, "QueueStatsRequest", cStatsRequest );
617
+ rb_define_alloc_func( cQueueStatsRequest, queue_stats_request_alloc );
618
+ rb_define_method( cQueueStatsRequest, "initialize", queue_stats_request_init, -1 );
619
+ rb_define_method( cQueueStatsRequest, "port_no", stats_port_no, 0 );
620
+ rb_define_method( cQueueStatsRequest, "queue_id", stats_queue_id, 0 );
621
+
622
+ cVendorStatsRequest = rb_define_class_under( mTrema, "VendorStatsRequest", cStatsRequest );
623
+ rb_define_alloc_func( cVendorStatsRequest, vendor_stats_request_alloc );
624
+ rb_define_method( cVendorStatsRequest, "initialize", vendor_stats_request_init, -1 );
625
+ rb_define_method( cVendorStatsRequest, "vendor_id", stats_vendor_id, 0 );
626
+ }
627
+
628
+
629
+ /*
630
+ * Local variables:
631
+ * c-basic-offset: 2
632
+ * indent-tabs-mode: nil
633
+ * End:
634
+ */