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,44 @@
1
+ /*
2
+ * Logger class.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef LOGGER_H
24
+ #define LOGGER_H
25
+
26
+
27
+ #include "ruby.h"
28
+
29
+
30
+ extern VALUE mLogger;
31
+
32
+
33
+ void Init_logger( void );
34
+
35
+
36
+ #endif // LOGGER_H
37
+
38
+
39
+ /*
40
+ * Local variables:
41
+ * c-basic-offset: 2
42
+ * indent-tabs-mode: nil
43
+ * End:
44
+ */
@@ -0,0 +1,151 @@
1
+ #
2
+ # Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
+ #
4
+ # Copyright (C) 2008-2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+
21
+ require "forwardable"
22
+
23
+
24
+ module Trema
25
+ #
26
+ # MAC address class
27
+ #
28
+ class Mac
29
+ extend Forwardable
30
+ def_delegator :@value, :hash
31
+
32
+
33
+ #
34
+ # @return [Number] Ethernet address in its numeric presentation.
35
+ #
36
+ attr_reader :value
37
+
38
+
39
+ #
40
+ # Creates a {Mac} instance that encapsulates Ethernet MAC addresses.
41
+ #
42
+ # @overload initialize(value)
43
+ #
44
+ # @param [String,Integer] value
45
+ # the MAC address to set to.
46
+ #
47
+ # @example address as a hexadecimal string
48
+ # Mac.new("11:22:33:44:55:66")
49
+ #
50
+ # @example address as a hexadecimal number
51
+ # Mac.new(0xffffffffffff)
52
+ #
53
+ # @raise [ArgumentError] if invalid format is detected.
54
+ # @raise [ArgumentError] if supplied argument is not a string or integer.
55
+ #
56
+ def initialize value
57
+ case value
58
+ when String
59
+ @value = from_string( value )
60
+ when Integer
61
+ @value = from_integer( value )
62
+ else
63
+ raise %{Invalid MAC address: #{ value.inspect }}
64
+ end
65
+ @string = string_format
66
+ end
67
+
68
+
69
+ #
70
+ # @return [String]
71
+ # the Ethernet address as 6 pairs of hexadecimal digits delimited by colons.
72
+ # eg. xx:xx:xx:xx:xx:xx
73
+ #
74
+ def to_s
75
+ @string
76
+ end
77
+
78
+
79
+ #
80
+ # @return [Array]
81
+ # an array of decimal numbers converted from Ethernet's address string
82
+ # format.
83
+ #
84
+ def to_short
85
+ @string.split( ":" ).collect do | each |
86
+ each.hex
87
+ end
88
+ end
89
+
90
+
91
+ #
92
+ # @return [Boolean] if other matches or not the attribute type value.
93
+ #
94
+ def == other
95
+ @value == other.value
96
+ end
97
+
98
+
99
+ #
100
+ # @return [Boolean] if other matches or not the attribute type value.
101
+ #
102
+ def eql? other
103
+ @value == other.value
104
+ end
105
+
106
+
107
+ #
108
+ # @return [Boolean] if MAC address is multicast or not.
109
+ #
110
+ def is_multicast?
111
+ # check I/G bit
112
+ return to_short[0] & 1 == 1
113
+ end
114
+
115
+
116
+ ################################################################################
117
+ private
118
+ ################################################################################
119
+
120
+
121
+ def from_string string
122
+ octet_regex = "[0-9a-fA-F][0-9a-fA-F]"
123
+ if /^(#{ octet_regex }:){5}(#{ octet_regex })$/=~ string
124
+ eval( "0x" + string.gsub( ":", "" ) )
125
+ else
126
+ raise %{Invalid MAC address: "#{ string }"}
127
+ end
128
+ end
129
+
130
+
131
+ def from_integer integer
132
+ if integer >= 0 and integer <= 0xffffffffffff
133
+ integer
134
+ else
135
+ raise %{Invalid MAC address: #{ integer }}
136
+ end
137
+ end
138
+
139
+
140
+ def string_format
141
+ sprintf( "%012x", @value ).unpack( "a2" * 6 ).join( ":" )
142
+ end
143
+ end
144
+ end
145
+
146
+
147
+ ### Local variables:
148
+ ### mode: Ruby
149
+ ### coding: utf-8-unix
150
+ ### indent-tabs-mode: nil
151
+ ### End:
@@ -0,0 +1,594 @@
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 <string.h>
22
+ #include "trema.h"
23
+ #include "ruby.h"
24
+ #include "action-common.h"
25
+
26
+
27
+ extern VALUE mTrema;
28
+ VALUE cMatch;
29
+
30
+
31
+ static VALUE
32
+ match_alloc( VALUE klass ) {
33
+ struct ofp_match *match = xmalloc( sizeof( struct ofp_match ) );
34
+ return Data_Wrap_Struct( klass, NULL, xfree, match );
35
+ }
36
+
37
+
38
+ static struct
39
+ ofp_match *get_match( VALUE self ) {
40
+ struct ofp_match *match;
41
+ Data_Get_Struct( self, struct ofp_match, match );
42
+ return match;
43
+ }
44
+
45
+
46
+ /*
47
+ * Creates a {Match} instance from packet_in's data, the method accepts an
48
+ * additional single argument whose type is an array of symbols to wildcard set
49
+ * to don't care and ignore while matching flow entries.
50
+ *
51
+ * @overload match_from(message, *options)
52
+ *
53
+ * @example
54
+ * def packet_in datapath_id, message
55
+ * send_flow_mod(
56
+ * datapath_id,
57
+ * :match => Match.from( message, [ :dl_type, :nw_proto ] ),
58
+ * :actions => Trema::ActionOutput.new( 2 )
59
+ * )
60
+ * end
61
+ *
62
+ * @param [PacketIn] message
63
+ * the {PacketIn}'s message content.
64
+ *
65
+ * @param [optional, Array] options
66
+ * If supplied an array of symbol ids indicating fields to be wildcarded.
67
+ *
68
+ * [:inport]
69
+ * the physical port number to wildcard.
70
+ *
71
+ * [:dl_src]
72
+ * the source Ethernet address to wildcard.
73
+ *
74
+ * [:dl_dst]
75
+ * the destination Ethernet address to wildcard.
76
+ *
77
+ * [:dl_vlan]
78
+ * the IEEE 802.1q virtual VLAN tag to wildcard.
79
+ *
80
+ * [:dl_vlan_pcp]
81
+ * the IEEE 802.1q priority code point to wildcard.
82
+ *
83
+ * [:dl_type]
84
+ * the Ethernet protocol type to wildcard.
85
+ *
86
+ * [:nw_tos]
87
+ * the IP ToS /DSCP field to wildcard.
88
+ *
89
+ * [:nw_proto]
90
+ * the IP protocol type to wildcard.
91
+ *
92
+ * [:nw_src]
93
+ * the IPv4 source address to wildcard.
94
+ *
95
+ * [:nw_dst]
96
+ * the IPv4 destination address to wildcard.
97
+ *
98
+ * [:tp_src]
99
+ * the source TCP/UDP port number to wildcard.
100
+ *
101
+ * [:tp_dst]
102
+ * the destination TCP/UDP port number to wildcard.
103
+ *
104
+ * @return [Match] self
105
+ * the modified or exact match from packet depending on whether the options
106
+ * argument supplied or not.
107
+ */
108
+ static VALUE
109
+ match_from( int argc, VALUE *argv, VALUE self ) {
110
+ VALUE message, obj, wildcard_id, options;
111
+ struct ofp_match *match;
112
+ packet_in *packet;
113
+ uint32_t wildcards = 0;
114
+
115
+ if ( rb_scan_args( argc, argv, "1*", &message, &options ) >= 1 ) {
116
+ obj = rb_funcall( self, rb_intern( "new" ), 0 );
117
+ match = get_match( obj );
118
+ Data_Get_Struct( message, packet_in, packet );
119
+ int i;
120
+ for ( i = 0; i < RARRAY_LEN( options ); i++ ) {
121
+ wildcard_id = SYM2ID( RARRAY_PTR( options )[ i ] );
122
+ if ( rb_intern( "inport" ) == wildcard_id ) {
123
+ wildcards |= OFPFW_IN_PORT;
124
+ }
125
+ if ( rb_intern( "dl_src" ) == wildcard_id ) {
126
+ wildcards |= OFPFW_DL_SRC;
127
+ }
128
+ if ( rb_intern( "dl_dst" ) == wildcard_id ) {
129
+ wildcards |= OFPFW_DL_DST;
130
+ }
131
+ if ( rb_intern( "dl_vlan" ) == wildcard_id ) {
132
+ wildcards |= OFPFW_DL_VLAN;
133
+ }
134
+ if ( rb_intern( "dl_vlan_pcp" ) == wildcard_id ) {
135
+ wildcards |= OFPFW_DL_VLAN_PCP;
136
+ }
137
+ if ( rb_intern( "dl_type" ) == wildcard_id ) {
138
+ wildcards |= OFPFW_DL_TYPE;
139
+ }
140
+ if ( rb_intern( "nw_tos" ) == wildcard_id ) {
141
+ wildcards |= OFPFW_NW_TOS;
142
+ }
143
+ if ( rb_intern( "nw_proto" ) == wildcard_id ) {
144
+ wildcards |= OFPFW_NW_PROTO;
145
+ }
146
+ if ( rb_intern( "nw_src" ) == wildcard_id ) {
147
+ wildcards |= OFPFW_NW_SRC_ALL;
148
+ }
149
+ if ( rb_intern( "nw_dst" ) == wildcard_id ) {
150
+ wildcards |= OFPFW_NW_DST_ALL;
151
+ }
152
+ if ( rb_intern( "tp_src" ) == wildcard_id ) {
153
+ wildcards |= OFPFW_TP_SRC;
154
+ }
155
+ if ( rb_intern( "tp_dst" ) == wildcard_id ) {
156
+ wildcards |= OFPFW_TP_DST;
157
+ }
158
+ }
159
+ }
160
+ set_match_from_packet( match, packet->in_port, wildcards, packet->data );
161
+ return obj;
162
+ }
163
+
164
+
165
+ /*
166
+ * Compare context of {Match} self with {Match} other.
167
+ *
168
+ * @example
169
+ * def packet_in datapath_id, message
170
+ * match = Match.new( :dl_type => 0x0800, :nw_src => "192.168.0.1" )
171
+ * if match.compare( ExactMatch.form( message ) )
172
+ * info "Received packet from 192.168.0.1"
173
+ * end
174
+ * end
175
+ *
176
+ * @return [Boolean] true if the {Match} match
177
+ */
178
+ static VALUE
179
+ match_compare( VALUE self, VALUE other ) {
180
+ return compare_match( get_match( self ), get_match( other ) ) ? Qtrue : Qfalse;
181
+ }
182
+
183
+
184
+ /*
185
+ * Replaces context of {Match} self with {Match} other.
186
+ *
187
+ * @return [Match] self
188
+ * the modified object instance.
189
+ */
190
+ static VALUE
191
+ match_replace( VALUE self, VALUE other ) {
192
+ memcpy( get_match( self ), get_match( other ), sizeof ( struct ofp_match ) );
193
+ return self;
194
+ }
195
+
196
+
197
+ /*
198
+ * (see ActionEnqueue#to_s)
199
+ */
200
+ static VALUE
201
+ match_to_s( VALUE self ) {
202
+ char match_str[ 1024 ];
203
+
204
+ match_to_string( get_match( self ), match_str, sizeof ( match_str ) );
205
+ return rb_str_new2( match_str );
206
+ }
207
+
208
+
209
+ /*
210
+ * The wildcard field expressed as a 32-bit bitmap,
211
+ *
212
+ * @return [Number] the value of wildcards.
213
+ */
214
+ static VALUE
215
+ match_wildcards( VALUE self ) {
216
+ return UINT2NUM( ( get_match( self ) )->wildcards );
217
+ }
218
+
219
+
220
+ /*
221
+ * @return [Number] the value of in_port.
222
+ */
223
+ static VALUE
224
+ match_in_port( VALUE self ) {
225
+ return UINT2NUM( ( get_match( self ) )->in_port );
226
+ }
227
+
228
+
229
+ static VALUE
230
+ match_dl( VALUE self, uint8_t which ) {
231
+ struct ofp_match *match;
232
+ uint8_t *dl_addr;
233
+
234
+ match = get_match( self );
235
+ if ( which ) {
236
+ dl_addr = match->dl_src;
237
+ } else {
238
+ dl_addr = match->dl_dst;
239
+ }
240
+ return rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, ULL2NUM( mac_to_uint64( dl_addr ) ) );
241
+ }
242
+
243
+
244
+ /*
245
+ * @return [Mac] the value of dl_src.
246
+ */
247
+ static VALUE
248
+ match_dl_src( VALUE self ) {
249
+ return match_dl( self, 1 );
250
+ }
251
+
252
+
253
+ /*
254
+ * @return [Mac] the value of dl_dst.
255
+ */
256
+ static VALUE
257
+ match_dl_dst( VALUE self ) {
258
+ return match_dl( self, 0 );
259
+ }
260
+
261
+
262
+ /*
263
+ * @return [Number] the value of dl_vlan.
264
+ */
265
+ static VALUE
266
+ match_dl_vlan( VALUE self ) {
267
+ return UINT2NUM( ( get_match( self ) )->dl_vlan );
268
+ }
269
+
270
+
271
+ /*
272
+ * @return [Number] the value of dl_vlan_pcp.
273
+ */
274
+ static VALUE
275
+ match_dl_vlan_pcp( VALUE self ) {
276
+ return UINT2NUM( ( get_match( self ) )->dl_vlan_pcp );
277
+ }
278
+
279
+
280
+ /*
281
+ * @return [Number] the value of dl_type.
282
+ */
283
+ static VALUE
284
+ match_dl_type( VALUE self ) {
285
+ return UINT2NUM( ( get_match( self ) )->dl_type );
286
+ }
287
+
288
+
289
+ /*
290
+ * @return [Number] the value of nw_tos.
291
+ */
292
+ static VALUE
293
+ match_nw_tos( VALUE self ) {
294
+ return UINT2NUM( ( get_match( self ) )->nw_tos );
295
+ }
296
+
297
+
298
+ /*
299
+ * @return [Number] the value of nw_proto.
300
+ */
301
+ static VALUE
302
+ match_nw_proto( VALUE self ) {
303
+ return UINT2NUM( ( get_match( self ) )->nw_proto );
304
+ }
305
+
306
+
307
+ static VALUE
308
+ match_nw( VALUE self, uint8_t which ) {
309
+ struct ofp_match *match;
310
+ uint32_t nw_addr;
311
+ uint32_t masklen;
312
+
313
+ match = get_match( self );
314
+ if ( which ) {
315
+ nw_addr = match->nw_src;
316
+ masklen = ( match->wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT;
317
+ } else {
318
+ nw_addr = match->nw_dst;
319
+ masklen = ( match->wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT;
320
+ }
321
+ uint32_t prefixlen = masklen > 32 ? 0 : 32 - masklen;
322
+ return rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 2, UINT2NUM( nw_addr ), UINT2NUM( prefixlen ) );
323
+ }
324
+
325
+
326
+ /*
327
+ * An IPv4 source address in its numeric representation.
328
+ *
329
+ * @return [IP] the value of nw_src.
330
+ */
331
+ static VALUE
332
+ match_nw_src( VALUE self ) {
333
+ return match_nw( self, 1 );
334
+ }
335
+
336
+
337
+ /*
338
+ * An IPv4 destination address in its numeric representation.
339
+ *
340
+ * @return [IP] the value of nw_dst.
341
+ */
342
+ static VALUE
343
+ match_nw_dst( VALUE self ) {
344
+ return match_nw( self, 0 );
345
+ }
346
+
347
+
348
+ /*
349
+ * @return [Number] the value of tp_src.
350
+ */
351
+ static VALUE
352
+ match_tp_src( VALUE self ) {
353
+ return UINT2NUM( ( get_match( self ) )->tp_src );
354
+ }
355
+
356
+
357
+ /*
358
+ * @return [Number] the value of tp_dst.
359
+ */
360
+ static VALUE
361
+ match_tp_dst( VALUE self ) {
362
+ return UINT2NUM( ( get_match( self ) )->tp_dst );
363
+ }
364
+
365
+
366
+ /*
367
+ * Creates a {Match} instance which describe fields such as MAC addresses, IP
368
+ * addresses, TCP/UDP ports of a flow to match against. An exact match
369
+ * flow would match on all fields whereas don't care bits are wildcarded and
370
+ * ignored.
371
+ *
372
+ * @overload initialize(options={})
373
+ *
374
+ * @example
375
+ * Match.new(
376
+ * :in_port => port_no,
377
+ * :dl_src => "xx:xx:xx;xx:xx:xx",
378
+ * :dl_dst => "xx:xx:xx:xx:xx:xx",
379
+ * :dl_type => ethertype,
380
+ * :dl_vlan => vlan,
381
+ * :dl_vlan_pcp => priority,
382
+ * :nw_tos => tos,
383
+ * :nw_proto => proto,
384
+ * :nw_src => ip_address/netmask,
385
+ * :nw_dst => ip_address/netmask,
386
+ * :tp_src => port,
387
+ * :tp_dst => port,
388
+ * )
389
+ *
390
+ * @param [Hash] options the options hash.
391
+ *
392
+ * @option options [Number] :inport
393
+ * the physical port number to match.
394
+ *
395
+ * @option options [String,Number,Trema::Mac] :dl_src
396
+ * the source ethernet address to match specified either as 6
397
+ * pairs of hexadecimal digits delimited by colon or as a
398
+ * hexadecimal number or as a Trema::Mac object.
399
+ * (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
400
+ *
401
+ * @option options [String,Number] :dl_dst
402
+ * the destination ethernet address to match specified either as a
403
+ * 6 pairs of hexadecimal digits delimited by colon or as a
404
+ * hexadecimal number or as a Trema::Mac object.
405
+ * (eg. "00:11:22:33:44:55" or 0x001122334455 or Mac.new("00:11:22:33:44:55")).
406
+ *
407
+ * @option options [Number] :dl_type
408
+ * the Ethernet protocol type to match. Can be specified either as a decimal
409
+ * or hexadecimal number. (eg 0x0800 to match IP packets, 0x08006 to match
410
+ * ARP packets, 0x88cc for LLDP packets).
411
+ *
412
+ * @option options [Number] :dl_vlan
413
+ * the IEEE 802.1q virtual VLAN tag to match specified as a 12-bit number
414
+ * 0 to 4095 inclusive.
415
+ *
416
+ * @option options [Number] :dl_vlan_pcp
417
+ * the IEEE 802.1q Priority Code Point (PCP) to match specified as a value of
418
+ * 0 to 7 inclusive. A higher value indicates a higher priority frame.
419
+ *
420
+ * @option options [Number] :nw_tos
421
+ * the IP ToS/DSCP field to match specified as a decimal number between 0 and
422
+ * 255 inclusive.
423
+ *
424
+ * @option options [Number] :nw_proto
425
+ * Depending on the dl_type the IP protocol type to match. (eg if dl_type
426
+ * equals 0x0800 UDP packets can be match by setting nw_proto to 17.)
427
+ * to match TCP packets). When dl_type = 0x0806 is set to arp it matches the
428
+ * lower 8 bits of the ARP opcode.
429
+ *
430
+ * @option options [String] :nw_src
431
+ * the IPv4 source address to match if dl_type is set to 0x0800.
432
+ *
433
+ * @option options [String] :nw_dst
434
+ * the IPv4 destination address to match if dl_type is set to 0x0800.
435
+ *
436
+ * @option options [Number] :tp_src
437
+ * the source TCP/UDP port number to match specified as a decimal number
438
+ * between 0 and 65535 inclusive. The value dl_type and nw_proto must be set
439
+ * to specify TCP or UDP.
440
+ *
441
+ * @option options [Number] :tp_dst
442
+ * the destination TCP/UDP port number to match specified as a decimal number
443
+ * between 0 and 65535 inclusive.
444
+ *
445
+ * @return [Match] self an object that encapsulates and wraps the +struct ofp_match+
446
+ */
447
+ static VALUE
448
+ match_init( int argc, VALUE *argv, VALUE self ) {
449
+ struct ofp_match *match;
450
+ VALUE options;
451
+
452
+ // Always clear the memory as the unused memory locations are
453
+ // exposed to both the user and the OpenFlow controller.
454
+ Data_Get_Struct( self, struct ofp_match, match );
455
+ memset( match, 0, sizeof ( *match ) );
456
+
457
+ // Default matches all packets.
458
+ match->wildcards = ( OFPFW_ALL & ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK ) )
459
+ | OFPFW_NW_SRC_ALL | OFPFW_NW_DST_ALL;
460
+
461
+ if ( rb_scan_args( argc, argv, "01", &options ) >= 1 ) {
462
+ if ( options != Qnil ) {
463
+ VALUE in_port = rb_hash_aref( options, ID2SYM( rb_intern( "in_port" ) ) );
464
+ if ( in_port != Qnil ) {
465
+ match->in_port = ( uint16_t ) NUM2UINT( in_port );
466
+ match->wildcards &= ( uint32_t ) ~OFPFW_IN_PORT;
467
+ }
468
+
469
+ VALUE dl_src = rb_hash_aref( options, ID2SYM( rb_intern( "dl_src" ) ) );
470
+ if ( dl_src != Qnil ) {
471
+ VALUE dl_addr;
472
+ if ( rb_obj_is_kind_of( dl_src, rb_eval_string( "Trema::Mac" ) ) ) {
473
+ dl_addr = dl_src;
474
+ }
475
+ else {
476
+ dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_src );
477
+ }
478
+ dl_addr_short( dl_addr, match->dl_src );
479
+ match->wildcards &= ( uint32_t ) ~OFPFW_DL_SRC;
480
+ }
481
+
482
+ VALUE dl_dst = rb_hash_aref( options, ID2SYM( rb_intern( "dl_dst" ) ) );
483
+ if ( dl_dst != Qnil ) {
484
+ VALUE dl_addr;
485
+ if ( rb_obj_is_kind_of( dl_dst, rb_eval_string( "Trema::Mac" ) ) ) {
486
+ dl_addr = dl_dst;
487
+ }
488
+ else {
489
+ dl_addr = rb_funcall( rb_eval_string( "Trema::Mac" ), rb_intern( "new" ), 1, dl_dst );
490
+ }
491
+ dl_addr_short( dl_addr, match->dl_dst );
492
+ match->wildcards &= ( uint32_t ) ~OFPFW_DL_DST;
493
+ }
494
+
495
+ VALUE dl_type = rb_hash_aref( options, ID2SYM( rb_intern( "dl_type" ) ) );
496
+ if ( dl_type != Qnil ) {
497
+ match->dl_type = ( uint16_t ) NUM2UINT( dl_type );
498
+ match->wildcards &= ( uint32_t ) ~OFPFW_DL_TYPE;
499
+ }
500
+
501
+ VALUE dl_vlan = rb_hash_aref( options, ID2SYM( rb_intern( "dl_vlan" ) ) );
502
+ if ( dl_vlan != Qnil ) {
503
+ match->dl_vlan = ( uint16_t ) NUM2UINT( dl_vlan );
504
+ match->wildcards &= ( uint32_t ) ~OFPFW_DL_VLAN;
505
+ }
506
+
507
+ VALUE dl_vlan_pcp = rb_hash_aref( options, ID2SYM( rb_intern( "dl_vlan_pcp" ) ) );
508
+ if ( dl_vlan_pcp != Qnil ) {
509
+ match->dl_vlan_pcp = ( uint8_t ) NUM2UINT( dl_vlan_pcp );
510
+ match->wildcards &= ( uint32_t ) ~OFPFW_DL_VLAN_PCP;
511
+ }
512
+
513
+ VALUE nw_tos = rb_hash_aref( options, ID2SYM( rb_intern( "nw_tos" ) ) );
514
+ if ( nw_tos != Qnil ) {
515
+ match->nw_tos = ( uint8_t ) NUM2UINT( nw_tos );
516
+ match->wildcards &= ( uint32_t ) ~OFPFW_NW_TOS;
517
+ }
518
+
519
+ VALUE nw_proto = rb_hash_aref( options, ID2SYM( rb_intern( "nw_proto" ) ) );
520
+ if ( nw_proto != Qnil ) {
521
+ match->nw_proto = ( uint8_t ) NUM2UINT( nw_proto );
522
+ match->wildcards &= ( uint32_t ) ~OFPFW_NW_PROTO;
523
+ }
524
+
525
+ VALUE nw_src = rb_hash_aref( options, ID2SYM( rb_intern( "nw_src" ) ) );
526
+ if ( nw_src != Qnil ) {
527
+ VALUE nw_addr = rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 1, nw_src );
528
+ uint32_t prefixlen = ( uint32_t ) NUM2UINT( rb_funcall( nw_addr, rb_intern( "prefixlen" ), 0 ) );
529
+ if ( prefixlen > 0 ) {
530
+ match->nw_src = nw_addr_to_i( nw_addr );
531
+ match->wildcards &= ( uint32_t ) ~OFPFW_NW_SRC_MASK;
532
+ match->wildcards |= ( uint32_t ) ( ( 32 - prefixlen ) << OFPFW_NW_SRC_SHIFT );
533
+ }
534
+ }
535
+
536
+ VALUE nw_dst = rb_hash_aref( options, ID2SYM( rb_intern( "nw_dst" ) ) );
537
+ if ( nw_dst != Qnil ) {
538
+ VALUE nw_addr = rb_funcall( rb_eval_string( "Trema::IP" ), rb_intern( "new" ), 1, nw_dst );
539
+ uint32_t prefixlen = ( uint32_t ) NUM2UINT( rb_funcall( nw_addr, rb_intern( "prefixlen" ), 0 ) );
540
+ if ( prefixlen > 0 ) {
541
+ match->nw_dst = nw_addr_to_i( nw_addr );
542
+ match->wildcards &= ( uint32_t ) ~OFPFW_NW_DST_MASK;
543
+ match->wildcards |= ( uint32_t ) ( ( 32 - prefixlen ) << OFPFW_NW_DST_SHIFT );
544
+ }
545
+ }
546
+
547
+ VALUE tp_src = rb_hash_aref( options, ID2SYM( rb_intern( "tp_src" ) ) );
548
+ if ( tp_src != Qnil ) {
549
+ match->tp_src = ( uint16_t ) NUM2UINT( tp_src );
550
+ match->wildcards &= ( uint32_t ) ~OFPFW_TP_SRC;
551
+ }
552
+
553
+ VALUE tp_dst = rb_hash_aref( options, ID2SYM( rb_intern( "tp_dst" ) ) );
554
+ if ( tp_dst != Qnil ) {
555
+ match->tp_dst = ( uint16_t ) NUM2UINT( tp_dst );
556
+ match->wildcards &= ( uint32_t ) ~OFPFW_TP_DST;
557
+ }
558
+ }
559
+ }
560
+ return self;
561
+ }
562
+
563
+
564
+ void
565
+ Init_match() {
566
+ cMatch = rb_define_class_under( mTrema, "Match", rb_cObject );
567
+ rb_define_alloc_func( cMatch, match_alloc );
568
+ rb_define_method( cMatch, "initialize", match_init, -1 );
569
+ rb_define_method( cMatch, "compare", match_compare, 1 );
570
+ rb_define_method( cMatch, "replace", match_replace, 1 );
571
+ rb_define_method( cMatch, "to_s", match_to_s, 0 );
572
+ rb_define_method( cMatch, "wildcards", match_wildcards, 0 );
573
+ rb_define_method( cMatch, "in_port", match_in_port, 0 );
574
+ rb_define_method( cMatch, "dl_src", match_dl_src, 0 );
575
+ rb_define_method( cMatch, "dl_dst", match_dl_dst, 0 );
576
+ rb_define_method( cMatch, "dl_vlan", match_dl_vlan, 0 );
577
+ rb_define_method( cMatch, "dl_vlan_pcp", match_dl_vlan_pcp, 0 );
578
+ rb_define_method( cMatch, "dl_type", match_dl_type, 0 );
579
+ rb_define_method( cMatch, "nw_tos", match_nw_tos, 0 );
580
+ rb_define_method( cMatch, "nw_proto", match_nw_proto, 0 );
581
+ rb_define_method( cMatch, "nw_src", match_nw_src, 0 );
582
+ rb_define_method( cMatch, "nw_dst", match_nw_dst, 0 );
583
+ rb_define_method( cMatch, "tp_src", match_tp_src, 0 );
584
+ rb_define_method( cMatch, "tp_dst", match_tp_dst, 0 );
585
+ rb_define_singleton_method( cMatch, "from", match_from, -1 );
586
+ }
587
+
588
+
589
+ /*
590
+ * Local variables:
591
+ * c-basic-offset: 2
592
+ * indent-tabs-mode: nil
593
+ * End:
594
+ */