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,294 @@
1
+ /*
2
+ * Author: Yasunobu Chiba
3
+ *
4
+ * Copyright (C) 2011 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 <arpa/inet.h>
22
+ #include <stddef.h>
23
+ #include <stdio.h>
24
+ #include <string.h>
25
+ #include <sys/types.h>
26
+ #include <unistd.h>
27
+ #include "buffer.h"
28
+ #include "byteorder.h"
29
+ #include "log.h"
30
+ #include "packetin_filter_interface.h"
31
+ #include "trema_wrapper.h"
32
+ #include "wrapper.h"
33
+
34
+
35
+ typedef struct {
36
+ void *callback;
37
+ void *user_data;
38
+ } handler_data;
39
+
40
+
41
+ static bool initialized = false;
42
+ static char client_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
43
+
44
+
45
+ static void
46
+ set_client_service_name( void ) {
47
+ snprintf( client_service_name, sizeof( client_service_name ), "packetin_filter.%u", trema_getpid() );
48
+ client_service_name[ sizeof( client_service_name ) - 1 ] = '\0';
49
+ }
50
+
51
+
52
+ static const char *
53
+ get_client_service_name( void ) {
54
+ return client_service_name;
55
+ }
56
+
57
+
58
+ static void
59
+ maybe_init_packetin_filter_interface( void ) {
60
+ if ( initialized ) {
61
+ return;
62
+ }
63
+
64
+ init_packetin_filter_interface();
65
+ }
66
+
67
+
68
+ static void
69
+ addition_completed( int status, handler_data *data ) {
70
+ if ( data->callback != NULL ) {
71
+ add_packetin_filter_handler callback = data->callback;
72
+ callback( status, data->user_data );
73
+ }
74
+ xfree( data );
75
+ }
76
+
77
+
78
+ static void
79
+ deletion_completed( int status, int n_deleted, handler_data *data ) {
80
+ if ( data->callback != NULL ) {
81
+ delete_packetin_filter_handler callback = data->callback;
82
+ callback( status, n_deleted, data->user_data );
83
+ }
84
+ xfree( data );
85
+ }
86
+
87
+
88
+ static void
89
+ ntoh_packetin_filter_entry( packetin_filter_entry *dst, packetin_filter_entry *src ) {
90
+ ntoh_match( &dst->match, &src->match );
91
+ dst->priority = ntohs( src->priority );
92
+ memcpy( dst->service_name, src->service_name, sizeof( dst->service_name ) );
93
+ }
94
+
95
+
96
+ static void
97
+ dump_completed( int status, int n_entries, packetin_filter_entry *entries, handler_data *data ) {
98
+ if ( data->callback != NULL ) {
99
+ dump_packetin_filter_handler callback = data->callback;
100
+ callback( status, n_entries, entries, data->user_data );
101
+ }
102
+ xfree( data );
103
+ }
104
+
105
+
106
+ bool
107
+ add_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name,
108
+ add_packetin_filter_handler callback, void *user_data ) {
109
+ if ( service_name == NULL || ( service_name != NULL && strlen( service_name ) == 0 ) ) {
110
+ error( "Service name must be specified." );
111
+ return false;
112
+ }
113
+
114
+ maybe_init_packetin_filter_interface();
115
+
116
+ handler_data *data = xmalloc( sizeof( handler_data ) );
117
+ data->callback = callback;
118
+ data->user_data = user_data;
119
+
120
+ add_packetin_filter_request request;
121
+ memset( &request, 0, sizeof( add_packetin_filter_request ) );
122
+ hton_match( &request.entry.match, &match );
123
+ request.entry.priority = htons( priority );
124
+ memcpy( request.entry.service_name, service_name, sizeof( request.entry.service_name ) );
125
+
126
+ bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
127
+ get_client_service_name(),
128
+ MESSENGER_ADD_PACKETIN_FILTER_REQUEST,
129
+ &request, sizeof( add_packetin_filter_request ), data );
130
+
131
+ return ret;
132
+ }
133
+
134
+
135
+ bool
136
+ delete_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
137
+ delete_packetin_filter_handler callback, void *user_data ) {
138
+ maybe_init_packetin_filter_interface();
139
+
140
+ handler_data *data = xmalloc( sizeof( handler_data ) );
141
+ data->callback = callback;
142
+ data->user_data = user_data;
143
+
144
+ delete_packetin_filter_request request;
145
+ memset( &request, 0, sizeof( delete_packetin_filter_request ) );
146
+ hton_match( &request.criteria.match, &match );
147
+ request.criteria.priority = htons( priority );
148
+ if ( service_name != NULL ) {
149
+ strncpy( request.criteria.service_name, service_name, sizeof( request.criteria.service_name ) );
150
+ request.criteria.service_name[ sizeof( request.criteria.service_name ) - 1 ] = '\0';
151
+ }
152
+ if ( strict ) {
153
+ request.flags = PACKETIN_FILTER_FLAG_MATCH_STRICT;
154
+ }
155
+ else {
156
+ request.flags = PACKETIN_FILTER_FLAG_MATCH_LOOSE;
157
+ }
158
+
159
+ bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
160
+ get_client_service_name(),
161
+ MESSENGER_DELETE_PACKETIN_FILTER_REQUEST,
162
+ &request, sizeof( delete_packetin_filter_request ), data );
163
+
164
+ return ret;
165
+ }
166
+
167
+
168
+ bool
169
+ dump_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
170
+ dump_packetin_filter_handler callback, void *user_data ) {
171
+ maybe_init_packetin_filter_interface();
172
+
173
+ handler_data *data = xmalloc( sizeof( handler_data ) );
174
+ data->callback = callback;
175
+ data->user_data = user_data;
176
+
177
+ dump_packetin_filter_request request;
178
+ memset( &request, 0, sizeof( dump_packetin_filter_request ) );
179
+ hton_match( &request.criteria.match, &match );
180
+ request.criteria.priority = htons( priority );
181
+ if ( service_name != NULL ) {
182
+ strncpy( request.criteria.service_name, service_name, sizeof( request.criteria.service_name ) );
183
+ request.criteria.service_name[ sizeof( request.criteria.service_name ) - 1 ] = '\0';
184
+ }
185
+ if ( strict ) {
186
+ request.flags = PACKETIN_FILTER_FLAG_MATCH_STRICT;
187
+ }
188
+ else {
189
+ request.flags = PACKETIN_FILTER_FLAG_MATCH_LOOSE;
190
+ }
191
+
192
+ bool ret = send_request_message( PACKETIN_FILTER_MANAGEMENT_SERVICE,
193
+ get_client_service_name(),
194
+ MESSENGER_DUMP_PACKETIN_FILTER_REQUEST,
195
+ &request, sizeof( dump_packetin_filter_request ), data );
196
+
197
+ return ret;
198
+ }
199
+
200
+
201
+ static void
202
+ handle_reply( uint16_t tag, void *data, size_t length, void *user_data ) {
203
+ switch ( tag ) {
204
+ case MESSENGER_ADD_PACKETIN_FILTER_REPLY:
205
+ {
206
+ if ( length != sizeof( add_packetin_filter_reply ) ) {
207
+ error( "Invalid add packetin filter reply ( length = %u ).", length );
208
+ return;
209
+ }
210
+ add_packetin_filter_reply *reply = data;
211
+ addition_completed( reply->status, user_data );
212
+ }
213
+ break;
214
+ case MESSENGER_DELETE_PACKETIN_FILTER_REPLY:
215
+ {
216
+ if ( length != sizeof( delete_packetin_filter_reply ) ) {
217
+ error( "Invalid delete packetin filter reply ( length = %u ).", length );
218
+ return;
219
+ }
220
+ delete_packetin_filter_reply *reply = data;
221
+ deletion_completed( reply->status, ( int ) ntohl( reply->n_deleted ), user_data );
222
+ }
223
+ break;
224
+ case MESSENGER_DUMP_PACKETIN_FILTER_REPLY:
225
+ {
226
+ if ( length < offsetof( dump_packetin_filter_reply, entries ) ) {
227
+ error( "Invalid dump packetin filter reply ( length = %u ).", length );
228
+ return;
229
+ }
230
+ dump_packetin_filter_reply *reply = data;
231
+ size_t expected_length = offsetof( dump_packetin_filter_reply, entries ) + sizeof( packetin_filter_entry ) * ntohl( reply->n_entries );
232
+ if ( length != expected_length ) {
233
+ error( "Invalid dump packetin filter reply ( length = %u ).", length );
234
+ return;
235
+ }
236
+ packetin_filter_entry *entries = NULL;
237
+ int n_entries = ( int ) ntohl( reply->n_entries );
238
+ if ( n_entries > 0 && reply->entries != NULL ) {
239
+ entries = xmalloc( sizeof( packetin_filter_entry ) * ( size_t ) n_entries );
240
+ for ( int i = 0; i < n_entries; i++ ) {
241
+ ntoh_packetin_filter_entry( &entries[ i ], &reply->entries[ i ] );
242
+ }
243
+ }
244
+ dump_completed( reply->status, n_entries, entries, user_data );
245
+ if ( entries != NULL ) {
246
+ xfree( entries );
247
+ }
248
+ }
249
+ break;
250
+ default:
251
+ {
252
+ warn( "Undefined reply tag ( tag = %#x, length = %u ).", tag, length );
253
+ }
254
+ return;
255
+ }
256
+ }
257
+
258
+
259
+ bool
260
+ init_packetin_filter_interface( void ) {
261
+ if ( initialized ) {
262
+ return false;
263
+ }
264
+
265
+ set_client_service_name();
266
+ add_message_replied_callback( get_client_service_name(), handle_reply );
267
+
268
+ initialized = true;
269
+
270
+ return true;
271
+ }
272
+
273
+
274
+ bool
275
+ finalize_packetin_filter_interface( void ) {
276
+ if ( !initialized ) {
277
+ return false;
278
+ }
279
+
280
+ delete_message_replied_callback( get_client_service_name(), handle_reply );
281
+
282
+ initialized = false;
283
+
284
+ return true;
285
+ }
286
+
287
+
288
+
289
+ /*
290
+ * Local variables:
291
+ * c-basic-offset: 2
292
+ * indent-tabs-mode: nil
293
+ * End:
294
+ */
@@ -0,0 +1,127 @@
1
+ /*
2
+ * Author: Yasunobu Chiba
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 PACKETIN_FILTER_INTERFACE_H
22
+ #define PACKETIN_FILTER_INTERFACE_H
23
+
24
+
25
+ #include <inttypes.h>
26
+ #include <openflow.h>
27
+ #include "bool.h"
28
+ #include "messenger.h"
29
+
30
+
31
+ #define PACKETIN_FILTER_MANAGEMENT_SERVICE "packetin_filter_management"
32
+
33
+
34
+ enum {
35
+ MESSENGER_ADD_PACKETIN_FILTER_REQUEST = 0x0010,
36
+ MESSENGER_ADD_PACKETIN_FILTER_REPLY,
37
+ MESSENGER_DELETE_PACKETIN_FILTER_REQUEST,
38
+ MESSENGER_DELETE_PACKETIN_FILTER_REPLY,
39
+ MESSENGER_DUMP_PACKETIN_FILTER_REQUEST,
40
+ MESSENGER_DUMP_PACKETIN_FILTER_REPLY,
41
+ };
42
+
43
+ enum {
44
+ PACKETIN_FILTER_OPERATION_SUCCEEDED,
45
+ PACKETIN_FILTER_OPERATION_FAILED,
46
+ };
47
+
48
+ enum {
49
+ PACKETIN_FILTER_FLAG_MATCH_LOOSE = 0x00,
50
+ PACKETIN_FILTER_FLAG_MATCH_STRICT = 0x01,
51
+ };
52
+
53
+
54
+ typedef struct {
55
+ struct ofp_match match;
56
+ uint16_t priority;
57
+ char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
58
+ } __attribute__( ( packed ) ) packetin_filter_entry;
59
+
60
+ typedef struct {
61
+ packetin_filter_entry entry;
62
+ } __attribute__( ( packed ) ) add_packetin_filter_request;
63
+
64
+ typedef struct {
65
+ uint8_t status;
66
+ } __attribute__( ( packed ) ) add_packetin_filter_reply;
67
+
68
+ typedef struct {
69
+ packetin_filter_entry criteria;
70
+ uint8_t flags;
71
+ } __attribute__( ( packed ) ) delete_packetin_filter_request;
72
+
73
+ typedef struct {
74
+ uint8_t status;
75
+ uint32_t n_deleted;
76
+ } __attribute__( ( packed ) ) delete_packetin_filter_reply;
77
+
78
+ typedef struct {
79
+ packetin_filter_entry criteria;
80
+ uint8_t flags;
81
+ } __attribute__( ( packed ) ) dump_packetin_filter_request;
82
+
83
+ typedef struct {
84
+ uint8_t status;
85
+ uint32_t n_entries;
86
+ packetin_filter_entry entries[ 0 ];
87
+ } __attribute__( ( packed ) ) dump_packetin_filter_reply;
88
+
89
+
90
+ typedef void ( *add_packetin_filter_handler )(
91
+ int status,
92
+ void *user_data
93
+ );
94
+
95
+ typedef void ( *delete_packetin_filter_handler )(
96
+ int status,
97
+ int n_deleted,
98
+ void *user_data
99
+ );
100
+
101
+ typedef void ( *dump_packetin_filter_handler )(
102
+ int status,
103
+ int n_entries,
104
+ packetin_filter_entry *entries,
105
+ void *user_data
106
+ );
107
+
108
+
109
+ bool add_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name,
110
+ add_packetin_filter_handler callback, void *user_data );
111
+ bool delete_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
112
+ delete_packetin_filter_handler callback, void *user_data );
113
+ bool dump_packetin_filter( struct ofp_match match, uint16_t priority, char *service_name, bool strict,
114
+ dump_packetin_filter_handler callback, void *user_data );
115
+ bool init_packetin_filter_interface( void );
116
+ bool finalize_packetin_filter_interface( void );
117
+
118
+
119
+ #endif // PACKETIN_FILTER_INTERFACE_H
120
+
121
+
122
+ /*
123
+ * Local variables:
124
+ * c-basic-offset: 2
125
+ * indent-tabs-mode: nil
126
+ * End:
127
+ */
@@ -0,0 +1,480 @@
1
+ /*
2
+ * Author: Yasunobu Chiba
3
+ *
4
+ * Copyright (C) 2008-2012 NEC Corporation
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License, version 2, as
8
+ * published by the Free Software Foundation.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+
21
+ #include <assert.h>
22
+ #include <ctype.h>
23
+ #include <errno.h>
24
+ #include <limits.h>
25
+ #include <sqlite3.h>
26
+ #include <stdlib.h>
27
+ #include <string.h>
28
+ #include <unistd.h>
29
+ #include "checks.h"
30
+ #include "log.h"
31
+ #include "persistent_storage.h"
32
+ #include "trema_private.h"
33
+ #include "trema_wrapper.h"
34
+ #include "wrapper.h"
35
+
36
+
37
+ static const size_t MAX_KEY_LENGTH = 256;
38
+ static const size_t MAX_VALUE_LENGTH = 256;
39
+ static const char DEFAULT_DB_FILE[] = ".trema.db";
40
+ static char *db_file = NULL;
41
+ static sqlite3 *db_handle = NULL;
42
+ static bool backend_initialized = false;
43
+
44
+
45
+ static bool
46
+ finalize_backend( bool delete_file ) {
47
+ assert( db_handle != NULL );
48
+ assert( db_file != NULL );
49
+
50
+ int ret = trema_sqlite3_close( db_handle );
51
+ if ( ret != SQLITE_OK ) {
52
+ error( "Failed to destroy a sqlite3 object ( %s ).", trema_sqlite3_errmsg( db_handle ) );
53
+ goto error;
54
+ }
55
+ db_handle = NULL;
56
+
57
+ if ( delete_file ) {
58
+ int ret = trema_unlink( db_file );
59
+ if ( ret < 0 ) {
60
+ char buf[ 256 ];
61
+ error( "Failed to delete database file. ( db_file = %s, errno = %s [%d] ).",
62
+ db_file, strerror_r( errno, buf, sizeof( buf ) ), errno );
63
+ goto error;
64
+ }
65
+ }
66
+
67
+ xfree( db_file );
68
+ db_file = NULL;
69
+
70
+ return true;
71
+
72
+ error:
73
+ db_handle = NULL;
74
+ if ( db_file != NULL ) {
75
+ xfree( db_file );
76
+ db_file = NULL;
77
+ }
78
+ return false;
79
+ }
80
+
81
+
82
+ static bool
83
+ init_backend() {
84
+ assert( db_file == NULL );
85
+ assert( db_handle == NULL );
86
+
87
+ db_file = xmalloc( PATH_MAX );
88
+ memset( db_file, '\0', PATH_MAX );
89
+ sprintf( db_file, "%s/%s", get_trema_tmp(), DEFAULT_DB_FILE );
90
+
91
+ int ret = trema_sqlite3_open( db_file, &db_handle );
92
+ if ( ret != SQLITE_OK ) {
93
+ error( "Failed to open backend database ( %s ).", trema_sqlite3_errmsg( db_handle ) );
94
+ finalize_backend( false );
95
+ return false;
96
+ }
97
+
98
+ char *err = NULL;
99
+ char *statement = sqlite3_mprintf( "CREATE TABLE IF NOT EXISTS trema ( key TEXT, value TEXT, CONSTRAINT key_unique UNIQUE (key) ON CONFLICT FAIL )" );
100
+ ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
101
+ if ( ret != SQLITE_OK ) {
102
+ error( "Failed to create a table ( error = %s ).", err );
103
+ xfree( db_file );
104
+ db_file = NULL;
105
+ trema_sqlite3_close( db_handle );
106
+ db_handle = NULL;
107
+ trema_sqlite3_free( err );
108
+ trema_sqlite3_free( statement );
109
+ return false;
110
+ }
111
+ trema_sqlite3_free( statement );
112
+
113
+ return true;
114
+ }
115
+
116
+
117
+ static int
118
+ save_value( void *value, int n_columns, char **columns, char **column_names ) {
119
+ UNUSED( column_names );
120
+
121
+ assert( n_columns == 1 );
122
+ assert( columns != NULL );
123
+ assert( columns[ 0 ] != NULL );
124
+ assert( value != NULL );
125
+
126
+ size_t length = strlen( columns[ 0 ] ) + 1;
127
+ *( char ** ) value = xmalloc( length );
128
+ strncpy( *( char ** ) value, columns[ 0 ], length );
129
+
130
+ return 0;
131
+ }
132
+
133
+
134
+ static char*
135
+ get_value_from_backend( const char *key ) {
136
+ assert( db_handle != NULL );
137
+ assert( key != NULL );
138
+
139
+ char *value = NULL;
140
+ char *err = NULL;
141
+ char *statement= sqlite3_mprintf( "SELECT value FROM trema WHERE key = '%q'", key );
142
+ int ret = trema_sqlite3_exec( db_handle, statement, save_value, &value, &err );
143
+ if ( ret != SQLITE_OK ) {
144
+ error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
145
+ trema_sqlite3_free( statement );
146
+ trema_sqlite3_free( err );
147
+ return NULL;
148
+ }
149
+ trema_sqlite3_free( statement );
150
+
151
+ return value;
152
+ }
153
+
154
+
155
+ static bool
156
+ save_value_to_backend( const char *key, const char *value ) {
157
+ assert( db_handle != NULL );
158
+ assert( key != NULL );
159
+
160
+ char *err = NULL;
161
+ char *statement = sqlite3_mprintf( "INSERT INTO trema (key,value) VALUES ('%q','%q')", key, value );
162
+ int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
163
+ if ( ret != SQLITE_OK ) {
164
+ error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
165
+ trema_sqlite3_free( statement );
166
+ trema_sqlite3_free( err );
167
+ return false;
168
+ }
169
+ trema_sqlite3_free( statement );
170
+
171
+ int n_changes = trema_sqlite3_changes( db_handle );
172
+ if ( n_changes != 1 ) {
173
+ if ( n_changes > 1 ) {
174
+ error( "Multiple entries are created ( n_changes = %d ).", n_changes );
175
+ }
176
+ return false;
177
+ }
178
+
179
+ return true;
180
+ }
181
+
182
+
183
+ static bool
184
+ update_value_on_backend( const char *key, const char *value ) {
185
+ assert( db_handle != NULL );
186
+ assert( key != NULL );
187
+
188
+ char *err = NULL;
189
+ char *statement = sqlite3_mprintf( "UPDATE trema SET value = '%q' WHERE key = '%q'", value, key );
190
+ int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
191
+ if ( ret != SQLITE_OK ) {
192
+ error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
193
+ trema_sqlite3_free( statement );
194
+ trema_sqlite3_free( err );
195
+ return false;
196
+ }
197
+ trema_sqlite3_free( statement );
198
+
199
+ int n_changes = trema_sqlite3_changes( db_handle );
200
+ if ( n_changes != 1 ) {
201
+ if ( n_changes > 1 ) {
202
+ error( "Multiple entries are updated ( n_changes = %d ).", n_changes );
203
+ }
204
+ return false;
205
+ }
206
+
207
+ return true;
208
+ }
209
+
210
+
211
+ static bool
212
+ delete_key_value_from_backend( const char *key ) {
213
+ assert( db_handle != NULL );
214
+ assert( key != NULL );
215
+
216
+ char *err = NULL;
217
+ char *statement = sqlite3_mprintf( "DELETE FROM trema WHERE key = '%q'", key );
218
+ int ret = trema_sqlite3_exec( db_handle, statement, NULL, NULL, &err );
219
+ if ( ret != SQLITE_OK ) {
220
+ error( "Failed to execute a SQL statement ( statement = %s, error = %s ).", statement, err );
221
+ trema_sqlite3_free( statement );
222
+ trema_sqlite3_free( err );
223
+ return false;
224
+ }
225
+ trema_sqlite3_free( statement );
226
+
227
+ int n_changes = trema_sqlite3_changes( db_handle );
228
+ if ( n_changes != 1 ) {
229
+ if ( n_changes > 1 ) {
230
+ error( "Multiple entries are deleted ( n_changes = %d ).", n_changes );
231
+ }
232
+ return false;
233
+ }
234
+
235
+ return true;
236
+ }
237
+
238
+
239
+ bool
240
+ init_persistent_storage() {
241
+ if ( backend_initialized ) {
242
+ error( "Backend is already initialized." );
243
+ return false;
244
+ }
245
+
246
+ backend_initialized = init_backend();
247
+
248
+ return backend_initialized;
249
+ }
250
+
251
+
252
+ bool
253
+ finalize_persistent_storage() {
254
+ if ( !backend_initialized ) {
255
+ error( "Backend is not initialized yet." );
256
+ return false;
257
+ }
258
+
259
+ backend_initialized = false;
260
+
261
+ return finalize_backend( false );
262
+ }
263
+
264
+
265
+ bool
266
+ clear_persistent_storage() {
267
+ if ( !backend_initialized ) {
268
+ error( "Backend is not initialized yet." );
269
+ return false;
270
+ }
271
+
272
+ bool ret = finalize_backend( true );
273
+ if ( ret == false ) {
274
+ backend_initialized = false;
275
+ return false;
276
+ }
277
+
278
+ backend_initialized = init_backend();
279
+
280
+ return backend_initialized;
281
+ }
282
+
283
+
284
+ static bool
285
+ key_exists( const char *key ) {
286
+ assert( key != NULL );
287
+
288
+ char *retrieved = get_value_from_backend( key );
289
+ if ( retrieved == NULL ) {
290
+ return false;
291
+ }
292
+
293
+ xfree( retrieved );
294
+
295
+ return true;
296
+ }
297
+
298
+
299
+ static bool
300
+ backend_ready( void ) {
301
+ if ( !backend_initialized ) {
302
+ error( "Backend is not initialized yet." );
303
+ }
304
+
305
+ return backend_initialized;
306
+ }
307
+
308
+
309
+ static bool
310
+ ascii_string( const char *string ) {
311
+ assert( string != NULL );
312
+
313
+ int i = 0;
314
+ while ( string[ i ] != '\0' ) {
315
+ if ( isprint( string[ i ] ) == 0 ) {
316
+ return false;
317
+ }
318
+ i++;
319
+ }
320
+
321
+ return true;
322
+ }
323
+
324
+
325
+ static bool
326
+ valid_key( const char *key ) {
327
+ if ( key == NULL ) {
328
+ error( "'key' must be specified." );
329
+ return false;
330
+ }
331
+
332
+ if ( !ascii_string( key ) ) {
333
+ error( "'key' must only have printable ASCII characters." );
334
+ return false;
335
+ }
336
+
337
+ size_t length = strlen( key );
338
+ if ( length > MAX_KEY_LENGTH ) {
339
+ error( "Too long key ( length = %u ) specified. Maximum length is %u.", length, MAX_KEY_LENGTH );
340
+ return false;
341
+ }
342
+
343
+ return true;
344
+ }
345
+
346
+
347
+ static bool
348
+ valid_value( const char *value ) {
349
+ if ( value == NULL ) {
350
+ error( "'value' must be specified." );
351
+ return false;
352
+ }
353
+
354
+ if ( !ascii_string( value ) ) {
355
+ error( "'value' must only have printable ASCII characters." );
356
+ return false;
357
+ }
358
+
359
+ size_t length = strlen( value );
360
+ if ( length > MAX_KEY_LENGTH ) {
361
+ error( "Too long value ( length = %u ) specified. Maximum length is %u.", length, MAX_VALUE_LENGTH );
362
+ return false;
363
+ }
364
+
365
+ return true;
366
+ }
367
+
368
+
369
+
370
+ bool
371
+ set_value( const char *key, const char *value ) {
372
+ if ( !backend_ready() ) {
373
+ return false;
374
+ }
375
+ if ( !valid_key( key ) ) {
376
+ return false;
377
+ }
378
+ if ( !valid_value( value ) ) {
379
+ return false;
380
+ }
381
+
382
+ if ( key_exists( key ) ) {
383
+ return update_value_on_backend( key, value );
384
+ }
385
+
386
+ return save_value_to_backend( key, value );
387
+ }
388
+
389
+
390
+ bool
391
+ get_value( const char *key, char *value, const size_t length ) {
392
+ if ( !backend_ready() ) {
393
+ return false;
394
+ }
395
+ if ( !valid_key( key ) ) {
396
+ return false;
397
+ }
398
+ if ( value == NULL ) {
399
+ error( "'value' must be specified." );
400
+ return false;
401
+ }
402
+ if ( length == 0 ) {
403
+ error( "'length' must be greater than zero." );
404
+ return false;
405
+ }
406
+
407
+ char *retrieved = get_value_from_backend( key );
408
+ if ( retrieved == NULL ) {
409
+ error( "Failed to retrieve a value for '%s'.", key );
410
+ return false;
411
+ }
412
+
413
+ size_t required_length = strlen( retrieved ) + 1;
414
+ if ( required_length > length ) {
415
+ error( "Insufficient buffer space ( %u [bytes] > %u [bytes] ).",
416
+ required_length, length );
417
+ return false;
418
+ }
419
+
420
+ strncpy( value, retrieved, required_length );
421
+ xfree( retrieved );
422
+
423
+ return true;
424
+ }
425
+
426
+
427
+ bool
428
+ delete_key_value( const char *key ) {
429
+ if ( !backend_ready() ) {
430
+ return false;
431
+ }
432
+ if ( !valid_key( key ) ) {
433
+ return false;
434
+ }
435
+
436
+ if ( !key_exists( key ) ) {
437
+ error( "An entry for '%s' does not exist.", key );
438
+ return false;
439
+ }
440
+
441
+ return delete_key_value_from_backend( key );
442
+ }
443
+
444
+
445
+ const char*
446
+ _get_db_file( void ) {
447
+ return db_file;
448
+ }
449
+
450
+
451
+ const sqlite3*
452
+ _get_db_handle( void ) {
453
+ return db_handle;
454
+ }
455
+
456
+
457
+ bool
458
+ _get_backend_initialized( void ) {
459
+ return backend_initialized;
460
+ }
461
+
462
+
463
+ size_t
464
+ _get_max_key_length( void ) {
465
+ return MAX_KEY_LENGTH;
466
+ }
467
+
468
+
469
+ size_t
470
+ _get_max_value_length( void ) {
471
+ return MAX_VALUE_LENGTH;
472
+ }
473
+
474
+
475
+ /*
476
+ * Local variables:
477
+ * c-basic-offset: 2
478
+ * indent-tabs-mode: nil
479
+ * End:
480
+ */