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,78 @@
1
+ /*
2
+ * A simple logging library.
3
+ *
4
+ * Some good logging guidelines can be found here:
5
+ * http://watchitlater.com/blog/2009/12/logging-guidelines/
6
+ *
7
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
8
+ *
9
+ * Copyright (C) 2008-2012 NEC Corporation
10
+ *
11
+ * This program is free software; you can redistribute it and/or modify
12
+ * it under the terms of the GNU General Public License, version 2, as
13
+ * published by the Free Software Foundation.
14
+ *
15
+ * This program is distributed in the hope that it will be useful,
16
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ * GNU General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU General Public License along
21
+ * with this program; if not, write to the Free Software Foundation, Inc.,
22
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23
+ */
24
+
25
+
26
+ /**
27
+ * @file
28
+ *
29
+ * @brief Versatile support for logging messages with different levels
30
+ * of importance.
31
+ */
32
+
33
+
34
+ #ifndef LOG_H
35
+ #define LOG_H
36
+
37
+
38
+ #include "bool.h"
39
+
40
+
41
+ /**
42
+ * Constants specifying the level of log messages.
43
+ */
44
+ typedef enum {
45
+ LOG_CRITICAL,
46
+ LOG_ERROR,
47
+ LOG_WARN,
48
+ LOG_NOTICE,
49
+ LOG_INFO,
50
+ LOG_DEBUG,
51
+ } logging_level;
52
+
53
+
54
+ bool init_log( const char *ident, const char *log_directory, bool run_as_daemon );
55
+ void restart_log( const char *ident, const char *log_directory );
56
+ void rename_log( const char *old_ident, const char *new_ident, const char *directory );
57
+ bool finalize_log( void );
58
+
59
+ bool set_logging_level( const char *level );
60
+ extern logging_level ( *get_logging_level )( void );
61
+
62
+ extern void ( *critical )( const char *format, ... );
63
+ extern void ( *error )( const char *format, ... );
64
+ extern void ( *warn )( const char *format, ... );
65
+ extern void ( *notice )( const char *format, ... );
66
+ extern void ( *info )( const char *format, ... );
67
+ extern void ( *debug )( const char *format, ... );
68
+
69
+
70
+ #endif // LOG_H
71
+
72
+
73
+ /*
74
+ * Local variables:
75
+ * c-basic-offset: 2
76
+ * indent-tabs-mode: nil
77
+ * End:
78
+ */
@@ -0,0 +1,84 @@
1
+ /*
2
+ * OpenFlow flow matching library
3
+ *
4
+ * Author: Yasunobu Chiba
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 MATCH_H
24
+ #define MATCH_H
25
+
26
+
27
+ #include <openflow.h>
28
+
29
+
30
+ #define COMPARE_MAC( _x, _y ) \
31
+ ( ( ( ( uint16_t * ) &( _x ) )[ 0 ] == ( ( uint16_t * ) &( _y ) )[ 0 ] ) \
32
+ && ( ( ( uint16_t * ) &( _x ) )[ 1 ] == ( ( uint16_t * ) &( _y ) )[ 1 ] ) \
33
+ && ( ( ( uint16_t * ) &( _x ) )[ 2 ] == ( ( uint16_t * ) &( _y ) )[ 2 ] ) )
34
+
35
+ #define create_nw_src_mask( _w ) \
36
+ ( { \
37
+ uint32_t _m = ( ( _w ) & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT; \
38
+ ( _m >= 32 ) ? 0 : 0xffffffff << _m; \
39
+ } \
40
+ )
41
+
42
+ #define create_nw_dst_mask( _w ) \
43
+ ( { \
44
+ uint32_t _m = ( ( _w ) & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT; \
45
+ ( _m >= 32 ) ? 0 : 0xffffffff << _m; \
46
+ } \
47
+ )
48
+
49
+ #define compare_match( _x, _y ) \
50
+ ( { \
51
+ uint32_t _w = ( _x )->wildcards | ( _y )->wildcards; \
52
+ uint32_t _sm = create_nw_src_mask( ( _x )->wildcards ) \
53
+ & create_nw_src_mask( ( _y )->wildcards ); \
54
+ uint32_t _dm = create_nw_dst_mask( ( _x )->wildcards ) \
55
+ & create_nw_dst_mask( ( _y )->wildcards ); \
56
+ ( ( _w & OFPFW_IN_PORT || ( _x )->in_port == ( _y )->in_port ) \
57
+ && ( _w & OFPFW_DL_VLAN || ( _x )->dl_vlan == ( _y )->dl_vlan ) \
58
+ && ( _w & OFPFW_DL_VLAN_PCP || ( _x )->dl_vlan_pcp == ( _y )->dl_vlan_pcp ) \
59
+ && ( _w & OFPFW_DL_SRC || COMPARE_MAC( ( _x )->dl_src, ( _y )->dl_src ) ) \
60
+ && ( _w & OFPFW_DL_DST || COMPARE_MAC( ( _x )->dl_dst, ( _y )->dl_dst ) ) \
61
+ && ( _w & OFPFW_DL_TYPE || ( _x )->dl_type == ( _y )->dl_type ) \
62
+ && !( ( ( _x )->nw_src ^ ( _y )->nw_src ) & _sm ) \
63
+ && !( ( ( _x )->nw_dst ^ ( _y )->nw_dst ) & _dm ) \
64
+ && ( _w & OFPFW_NW_TOS || ( _x )->nw_tos == ( _y )->nw_tos ) \
65
+ && ( _w & OFPFW_NW_PROTO || ( _x )->nw_proto == ( _y )->nw_proto ) \
66
+ && ( _w & OFPFW_TP_SRC || ( _x )->tp_src == ( _y )->tp_src ) \
67
+ && ( _w & OFPFW_TP_DST || ( _x )->tp_dst == ( _y )->tp_dst ) ); \
68
+ } \
69
+ )
70
+
71
+ #define compare_match_strict( _x, _y ) \
72
+ ( ( ( ( ( _x )->wildcards ^ ( _y )->wildcards ) & OFPFW_ALL ) == 0 ) \
73
+ && compare_match( ( _x ), ( _y ) ) )
74
+
75
+
76
+ #endif // MATCH_H
77
+
78
+
79
+ /*
80
+ * Local variables:
81
+ * c-basic-offset: 2
82
+ * indent-tabs-mode: nil
83
+ * End:
84
+ */
@@ -0,0 +1,608 @@
1
+ /*
2
+ * Author: Kazushi SUGYO
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 <pthread.h>
23
+ #include <stdlib.h>
24
+ #include <string.h>
25
+ #include <openflow.h>
26
+ #include "checks.h"
27
+ #include "match.h"
28
+ #include "match_table.h"
29
+ #include "log.h"
30
+ #include "wrapper.h"
31
+
32
+
33
+ #define VLAN_VID_MASK 0x0fff // 12 bits
34
+ #define VLAN_PCP_MASK 0x07 // 3 bits
35
+ #define NW_TOS_MASK 0x3f // 6 bits
36
+
37
+ #define MATCH_STRING_LENGTH 1024
38
+
39
+
40
+ typedef struct {
41
+ struct ofp_match match; // match data. host byte order
42
+ uint16_t priority;
43
+ void *data;
44
+ } match_entry;
45
+
46
+
47
+ typedef struct {
48
+ hash_table *exact_table; // no wildcards are set
49
+ list_element *wildcards_table; // wildcards flags are set
50
+ pthread_mutex_t *mutex;
51
+ } match_table;
52
+
53
+
54
+ typedef struct {
55
+ struct ofp_match *match;
56
+ void ( * function )( struct ofp_match, uint16_t, void *, void * );
57
+ void *user_data;
58
+ } match_walker;
59
+
60
+
61
+ match_table *_match_table_head = NULL; // non-static variable for use in unit testing
62
+
63
+
64
+ static inline bool
65
+ exact_match( struct ofp_match *match ) {
66
+ assert( match != NULL );
67
+
68
+ return ( ( match->wildcards & OFPFW_ALL ) == 0 );
69
+ }
70
+
71
+
72
+ static match_entry *
73
+ allocate_match_entry( struct ofp_match *match, uint16_t priority, void *data ) {
74
+ match_entry *new_entry = xmalloc( sizeof( match_entry ) );
75
+ new_entry->match = *match;
76
+ new_entry->priority = priority;
77
+ new_entry->data = data;
78
+
79
+ return new_entry;
80
+ }
81
+
82
+
83
+ static void
84
+ free_match_entry( match_entry *free_entry ) {
85
+ assert( free_entry != NULL );
86
+
87
+ xfree( free_entry );
88
+ }
89
+
90
+
91
+ static bool
92
+ compare_filter_match( struct ofp_match *x, struct ofp_match *y ) {
93
+ uint32_t w_x = x->wildcards & OFPFW_ALL;
94
+ uint32_t w_y = y->wildcards & OFPFW_ALL;
95
+ uint32_t sm_x = create_nw_src_mask( w_x );
96
+ uint32_t dm_x = create_nw_dst_mask( w_x );
97
+ uint32_t sm_y = create_nw_src_mask( w_y );
98
+ uint32_t dm_y = create_nw_dst_mask( w_y );
99
+
100
+ w_x &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
101
+ w_y &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
102
+ if ( ( ~w_x & w_y ) != 0 ) {
103
+ return false;
104
+ }
105
+ if ( sm_x > sm_y ) {
106
+ return false;
107
+ }
108
+ if ( dm_x > dm_y ) {
109
+ return false;
110
+ }
111
+
112
+ return ( ( w_x & OFPFW_IN_PORT || x->in_port == y->in_port )
113
+ && ( w_x & OFPFW_DL_VLAN || x->dl_vlan == y->dl_vlan )
114
+ && ( w_x & OFPFW_DL_VLAN_PCP || x->dl_vlan_pcp == y->dl_vlan_pcp )
115
+ && ( w_x & OFPFW_DL_SRC || COMPARE_MAC( x->dl_src, y->dl_src ) )
116
+ && ( w_x & OFPFW_DL_DST || COMPARE_MAC( x->dl_dst, y->dl_dst ) )
117
+ && ( w_x & OFPFW_DL_TYPE || x->dl_type == y->dl_type )
118
+ && !( ( x->nw_src ^ y->nw_src ) & sm_x )
119
+ && !( ( x->nw_dst ^ y->nw_dst ) & dm_x )
120
+ && ( w_x & OFPFW_NW_TOS || x->nw_tos == y->nw_tos )
121
+ && ( w_x & OFPFW_NW_PROTO || x->nw_proto == y->nw_proto )
122
+ && ( w_x & OFPFW_TP_SRC || x->tp_src == y->tp_src )
123
+ && ( w_x & OFPFW_TP_DST || x->tp_dst == y->tp_dst ) ) != 0 ? true : false;
124
+ }
125
+
126
+
127
+ static bool
128
+ compare_exact_match_entry( const void *x, const void *y ) {
129
+ assert( x != NULL );
130
+ assert( y != NULL );
131
+
132
+ const struct ofp_match *xofp_match = x;
133
+ const struct ofp_match *yofp_match = y;
134
+ return compare_match_strict( xofp_match, yofp_match );
135
+ }
136
+
137
+
138
+ static unsigned int
139
+ hash_exact_match_entry( const void *key ) {
140
+ assert( key != NULL );
141
+ const struct ofp_match *match = key;
142
+
143
+ uint16_t dl_vlan = match->dl_vlan;
144
+ if ( dl_vlan != UINT16_MAX ) {
145
+ dl_vlan = ( uint16_t ) ( dl_vlan & VLAN_VID_MASK );
146
+ }
147
+ uint8_t dl_vlan_pcp = ( uint8_t ) ( match->dl_vlan_pcp & VLAN_PCP_MASK );
148
+ uint8_t nw_tos = ( uint8_t ) ( match->nw_tos & NW_TOS_MASK );
149
+
150
+ unsigned int hash = 0;
151
+ hash ^= ( unsigned int ) ( match->in_port << 16 );
152
+ hash ^= ( unsigned int ) hash_mac( match->dl_src );
153
+ hash ^= ( unsigned int ) hash_mac( match->dl_dst );
154
+ hash ^= dl_vlan;
155
+ hash ^= ( unsigned int ) ( dl_vlan_pcp << 24 );
156
+ hash ^= ( unsigned int ) ( match->dl_type << 8 );
157
+ hash ^= nw_tos;
158
+ hash ^= ( unsigned int ) ( match->nw_proto << 24 );
159
+ hash ^= match->nw_src;
160
+ hash ^= match->nw_dst;
161
+ hash ^= ( unsigned int ) ( match->tp_src << 16 );
162
+ hash ^= match->tp_dst;
163
+
164
+ return hash;
165
+ }
166
+
167
+
168
+ static void
169
+ init_exact_match_table( hash_table **exact_table ) {
170
+ assert( exact_table != NULL );
171
+
172
+ *exact_table = create_hash( compare_exact_match_entry, hash_exact_match_entry );
173
+ }
174
+
175
+
176
+ static void
177
+ free_exact_match_entry( void *key, void *value, void *user_data ) {
178
+ UNUSED( key );
179
+ assert( value != NULL );
180
+ UNUSED( user_data );
181
+
182
+ match_entry *entry = value;
183
+
184
+ free_match_entry( entry );
185
+ }
186
+
187
+
188
+ static void
189
+ finalize_exact_match_table( hash_table *exact_table ) {
190
+ assert( exact_table != NULL );
191
+
192
+ foreach_hash( exact_table, free_exact_match_entry, NULL );
193
+ delete_hash( exact_table );
194
+ }
195
+
196
+
197
+ static bool
198
+ insert_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
199
+ assert( exact_table != NULL );
200
+ assert( match != NULL );
201
+
202
+ match_entry *entry = lookup_hash_entry( exact_table, match );
203
+ if ( entry != NULL ) {
204
+ char match_string[ MATCH_STRING_LENGTH ];
205
+ match_to_string( match, match_string, sizeof( match_string ) );
206
+ warn( "exact match entry already exists ( match = [%s] )", match_string );
207
+ return false;
208
+ }
209
+ match_entry *new_entry = allocate_match_entry( match, 0 /* dummy priority */, data );
210
+ match_entry *conflict_entry = insert_hash_entry( exact_table, &new_entry->match, new_entry );
211
+ assert( conflict_entry == NULL );
212
+ return true;
213
+ }
214
+
215
+
216
+ static match_entry *
217
+ lookup_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
218
+ assert( exact_table != NULL );
219
+ assert( match != NULL );
220
+
221
+ return lookup_hash_entry( exact_table, match );
222
+ }
223
+
224
+
225
+ #define lookup_exact_match_entry( table, match ) lookup_exact_match_strict_entry( table, match )
226
+
227
+
228
+ static bool
229
+ update_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
230
+ assert( exact_table != NULL );
231
+ assert( match != NULL );
232
+
233
+ match_entry *entry = lookup_exact_match_strict_entry( exact_table, match );
234
+ if ( entry == NULL ) {
235
+ char match_string[ MATCH_STRING_LENGTH ];
236
+ match_to_string( match, match_string, sizeof( match_string ) );
237
+ warn( "exact match entry not found ( match = [%s] )",
238
+ match_string );
239
+ return false;
240
+ }
241
+ entry->data = data;
242
+ return true;
243
+ }
244
+
245
+
246
+ static void *
247
+ delete_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
248
+ assert( exact_table != NULL );
249
+ assert( match != NULL );
250
+
251
+ match_entry *entry = lookup_hash_entry( exact_table, match );
252
+ if ( entry == NULL ) {
253
+ char match_string[ MATCH_STRING_LENGTH ];
254
+ match_to_string( match, match_string, sizeof( match_string ) );
255
+ warn( "exact match entry not found ( match = [%s] )",
256
+ match_string );
257
+ return NULL;
258
+ }
259
+ void *data = entry->data;
260
+ delete_hash_entry( exact_table, match );
261
+ free_match_entry( entry );
262
+ return data;
263
+ }
264
+
265
+
266
+ static void
267
+ exact_match_table_walker( void *key, void *value, void *user_data ) {
268
+ UNUSED( key );
269
+ assert( value != NULL );
270
+ match_walker *walker = user_data;
271
+ assert( walker != NULL );
272
+ assert( walker->function != NULL );
273
+
274
+ match_entry *entry = value;
275
+ if ( walker->match != NULL ) {
276
+ if ( !compare_filter_match( walker->match, &entry->match ) ) {
277
+ return;
278
+ }
279
+ }
280
+ void ( * function )( struct ofp_match, uint16_t, void *, void * ) = walker->function;
281
+
282
+ function( entry->match, entry->priority, entry->data, walker->user_data );
283
+ }
284
+
285
+
286
+ static void
287
+ map_exact_match_table( hash_table *exact_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void *user_data ) {
288
+ assert( exact_table != NULL );
289
+ assert( function != NULL );
290
+ match_walker walker;
291
+ walker.match = match;
292
+ walker.function = function;
293
+ walker.user_data = user_data;
294
+ foreach_hash( exact_table, exact_match_table_walker, &walker );
295
+ }
296
+
297
+
298
+ static void
299
+ init_wildcards_match_table( list_element **wildcards_table ) {
300
+ assert( wildcards_table != NULL);
301
+
302
+ create_list( wildcards_table );
303
+ }
304
+
305
+
306
+ static void
307
+ finalize_wildcards_match_table( list_element *wildcards_table ) {
308
+ list_element *element;
309
+ for ( element = wildcards_table; element != NULL; element = element->next ) {
310
+ free_match_entry( element->data );
311
+ element->data = NULL;
312
+ }
313
+ delete_list( wildcards_table );
314
+ }
315
+
316
+
317
+ static bool
318
+ insert_wildcards_match_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
319
+ assert( match != NULL );
320
+
321
+ list_element *element;
322
+ for ( element = *wildcards_table; element != NULL; element = element->next ) {
323
+ match_entry *entry = element->data;
324
+ if ( entry->priority < priority ) {
325
+ break;
326
+ }
327
+ assert( entry != NULL );
328
+ if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
329
+ char match_string[ MATCH_STRING_LENGTH ];
330
+ match_to_string( match, match_string, sizeof( match_string ) );
331
+ warn( "wildcards match entry already exists ( match = [%s], priority = %u )",
332
+ match_string, priority );
333
+ return false;
334
+ }
335
+ }
336
+ match_entry *new_entry = allocate_match_entry( match, priority, data );
337
+ if ( element == NULL ) {
338
+ // tail
339
+ append_to_tail( wildcards_table, new_entry );
340
+ }
341
+ else if ( element == *wildcards_table ) {
342
+ // head
343
+ insert_in_front( wildcards_table, new_entry );
344
+ }
345
+ else {
346
+ // insert before
347
+ insert_before( wildcards_table, element->data, new_entry );
348
+ }
349
+ return true;
350
+ }
351
+
352
+
353
+ static match_entry *
354
+ lookup_wildcards_match_strict_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority ) {
355
+ assert( match != NULL );
356
+
357
+ list_element *element;
358
+ for ( element = wildcards_table; element != NULL; element = element->next ) {
359
+ match_entry *entry = element->data;
360
+ if ( entry->priority < priority ) {
361
+ break;
362
+ }
363
+ if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
364
+ return entry;
365
+ }
366
+ }
367
+ return NULL;
368
+ }
369
+
370
+
371
+ static match_entry *
372
+ lookup_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match ) {
373
+ assert( match != NULL );
374
+
375
+ list_element *element;
376
+ for ( element = wildcards_table; element != NULL; element = element->next ) {
377
+ match_entry *entry = element->data;
378
+ if ( compare_match( &entry->match, match ) ) {
379
+ return entry;
380
+ }
381
+ }
382
+ return NULL;
383
+ }
384
+
385
+
386
+ static bool
387
+ update_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
388
+ assert( match != NULL );
389
+
390
+ match_entry *entry = lookup_wildcards_match_strict_entry( wildcards_table, match, priority );
391
+ if ( entry == NULL ) {
392
+ char match_string[ MATCH_STRING_LENGTH ];
393
+ match_to_string( match, match_string, sizeof( match_string ) );
394
+ warn( "wildcards match entry not found ( match = [%s], priority = %u )",
395
+ match_string, priority );
396
+ return false;
397
+ }
398
+ entry->data = data;
399
+ return true;
400
+ }
401
+
402
+
403
+ static void *
404
+ delete_wildcards_match_strict_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority ) {
405
+ assert( match != NULL );
406
+
407
+ match_entry *entry = lookup_wildcards_match_strict_entry( *wildcards_table, match, priority );
408
+ if ( entry == NULL ) {
409
+ char match_string[ MATCH_STRING_LENGTH ];
410
+ match_to_string( match, match_string, sizeof( match_string ) );
411
+ warn( "wildcards match entry not found ( match = [%s], priority = %u )",
412
+ match_string, priority );
413
+ return NULL;
414
+ }
415
+ void *data = entry->data;
416
+ delete_element( wildcards_table, entry );
417
+ free_match_entry( entry );
418
+ return data;
419
+ }
420
+
421
+
422
+ static void
423
+ map_wildcards_match_table( list_element *wildcards_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void * user_data ) {
424
+ assert( function != NULL );
425
+
426
+ list_element *element = wildcards_table;
427
+ while ( element != NULL ) {
428
+ match_entry *entry = element->data;
429
+ element = element->next;
430
+ if ( match != NULL ) {
431
+ if ( !compare_filter_match( match, &entry->match ) ) {
432
+ continue;
433
+ }
434
+ }
435
+ function( entry->match, entry->priority, entry->data, user_data );
436
+ }
437
+ }
438
+
439
+
440
+ void
441
+ init_match_table( void ) {
442
+ if ( _match_table_head != NULL ) {
443
+ die( "match table is already initialized." );
444
+ }
445
+
446
+ match_table *table = xmalloc( sizeof( match_table ) );
447
+ init_exact_match_table( &table->exact_table );
448
+ init_wildcards_match_table( &table->wildcards_table );
449
+ pthread_mutexattr_t attr;
450
+ pthread_mutexattr_init( &attr );
451
+ pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE_NP );
452
+ table->mutex = xmalloc( sizeof( pthread_mutex_t ) );
453
+ pthread_mutex_init( table->mutex, &attr );
454
+
455
+ _match_table_head = table;
456
+ }
457
+
458
+
459
+ void
460
+ finalize_match_table( void ) {
461
+ if ( _match_table_head == NULL ) {
462
+ die( "match table is not initialized." );
463
+ }
464
+
465
+ pthread_mutex_t *mutex = _match_table_head->mutex;
466
+
467
+ pthread_mutex_lock( mutex );
468
+ finalize_exact_match_table( _match_table_head->exact_table );
469
+ finalize_wildcards_match_table( _match_table_head->wildcards_table );
470
+ xfree( _match_table_head );
471
+ _match_table_head = NULL;
472
+ pthread_mutex_unlock( mutex );
473
+ pthread_mutex_destroy( mutex );
474
+ xfree( mutex );
475
+ }
476
+
477
+
478
+ bool
479
+ insert_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
480
+ if ( _match_table_head == NULL ) {
481
+ die( "match table is not initialized." );
482
+ }
483
+
484
+ pthread_mutex_lock( _match_table_head->mutex );
485
+ bool result;
486
+ if ( exact_match( &match ) ) {
487
+ result = insert_exact_match_entry( _match_table_head->exact_table, &match, data );
488
+ }
489
+ else {
490
+ // wildcards flags are set
491
+ result = insert_wildcards_match_entry( &_match_table_head->wildcards_table, &match, priority, data );
492
+ }
493
+ pthread_mutex_unlock( _match_table_head->mutex );
494
+ return result;
495
+ }
496
+
497
+
498
+ void *
499
+ lookup_match_strict_entry( struct ofp_match match, uint16_t priority ) {
500
+ if ( _match_table_head == NULL ) {
501
+ die( "match table is not initialized." );
502
+ }
503
+
504
+ pthread_mutex_lock( _match_table_head->mutex );
505
+ match_entry *entry;
506
+ if ( exact_match( &match ) ) {
507
+ entry = lookup_exact_match_strict_entry( _match_table_head->exact_table, &match );
508
+ }
509
+ else {
510
+ entry = lookup_wildcards_match_strict_entry( _match_table_head->wildcards_table, &match, priority );
511
+ }
512
+ void *data = ( entry != NULL ? entry->data : NULL );
513
+ pthread_mutex_unlock( _match_table_head->mutex );
514
+ return data;
515
+ }
516
+
517
+
518
+ void *
519
+ lookup_match_entry( struct ofp_match match ) {
520
+ if ( _match_table_head == NULL ) {
521
+ die( "match table is not initialized." );
522
+ }
523
+
524
+ pthread_mutex_lock( _match_table_head->mutex );
525
+ match_entry *entry = lookup_exact_match_entry( _match_table_head->exact_table, &match );
526
+ if ( entry == NULL ) {
527
+ entry = lookup_wildcards_match_entry( _match_table_head->wildcards_table, &match );
528
+ }
529
+ void *data = ( entry != NULL ? entry->data : NULL );
530
+ pthread_mutex_unlock( _match_table_head->mutex );
531
+ return data;
532
+ }
533
+
534
+
535
+ bool
536
+ update_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
537
+ if ( _match_table_head == NULL ) {
538
+ die( "match table is not initialized." );
539
+ }
540
+
541
+ pthread_mutex_lock( _match_table_head->mutex );
542
+ bool result;
543
+ if ( exact_match( &match ) ) {
544
+ result = update_exact_match_entry( _match_table_head->exact_table, &match, data );
545
+ }
546
+ else {
547
+ // wildcards flags are set
548
+ result = update_wildcards_match_entry( _match_table_head->wildcards_table, &match, priority, data );
549
+ }
550
+ pthread_mutex_unlock( _match_table_head->mutex );
551
+ return result;
552
+ }
553
+
554
+
555
+ void *
556
+ delete_match_strict_entry( struct ofp_match match, uint16_t priority ) {
557
+ if ( _match_table_head == NULL ) {
558
+ die( "match table is not initialized." );
559
+ }
560
+
561
+ pthread_mutex_lock( _match_table_head->mutex );
562
+ void *data = NULL;
563
+ if ( exact_match( &match ) ) {
564
+ data = delete_exact_match_strict_entry( _match_table_head->exact_table, &match );
565
+ }
566
+ else {
567
+ // wildcards flags are set
568
+ data = delete_wildcards_match_strict_entry( &_match_table_head->wildcards_table, &match, priority );
569
+ }
570
+ pthread_mutex_unlock( _match_table_head->mutex );
571
+ return data;
572
+ }
573
+
574
+
575
+ static void
576
+ _map_match_table( struct ofp_match *match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
577
+ if ( _match_table_head == NULL ) {
578
+ die( "match table is not initialized." );
579
+ }
580
+ if ( function == NULL ) {
581
+ die( "function must not be NULL" );
582
+ }
583
+
584
+ pthread_mutex_lock( _match_table_head->mutex );
585
+ map_exact_match_table( _match_table_head->exact_table, match, function, user_data );
586
+ map_wildcards_match_table( _match_table_head->wildcards_table, match, function, user_data );
587
+ pthread_mutex_unlock( _match_table_head->mutex );
588
+ }
589
+
590
+
591
+ void
592
+ foreach_match_table( void function( struct ofp_match, uint16_t, void *, void *), void *user_data ) {
593
+ _map_match_table( NULL, function, user_data );
594
+ }
595
+
596
+
597
+ void
598
+ map_match_table( struct ofp_match match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
599
+ _map_match_table( &match, function, user_data );
600
+ }
601
+
602
+
603
+ /*
604
+ * Local variables:
605
+ * c-basic-offset: 2
606
+ * indent-tabs-mode: nil
607
+ * End:
608
+ */