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,67 @@
1
+ /*
2
+ * Utility functions.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef UTILITY_H
24
+ #define UTILITY_H
25
+
26
+
27
+ #include <stdint.h>
28
+ #include <stdio.h>
29
+ #include "bool.h"
30
+ #include "openflow.h"
31
+
32
+
33
+ extern void ( *die )( const char *format, ... );
34
+
35
+ unsigned int hash_core( const void *key, int size );
36
+
37
+ bool compare_string( const void *x, const void *y );
38
+ unsigned int hash_string( const void *key );
39
+
40
+ bool compare_mac( const void *x, const void *y );
41
+ unsigned int hash_mac( const void *mac );
42
+ uint64_t mac_to_uint64( const uint8_t *mac );
43
+
44
+ bool compare_uint32( const void *x, const void *y );
45
+ unsigned int hash_uint32( const void *key );
46
+
47
+ bool compare_datapath_id( const void *x, const void *y );
48
+ unsigned int hash_datapath_id( const void *key );
49
+
50
+ bool string_to_datapath_id( const char *str, uint64_t *datapath_id );
51
+
52
+ bool match_to_string( const struct ofp_match *match, char *str, size_t size );
53
+ bool phy_port_to_string( const struct ofp_phy_port *phy_port, char *str, size_t size );
54
+ bool actions_to_string( const struct ofp_action_header *actions, uint16_t actions_length, char *str, size_t str_length );
55
+
56
+ uint16_t get_checksum( uint16_t *pos, uint32_t size );
57
+
58
+
59
+ #endif // UTILITY_H
60
+
61
+
62
+ /*
63
+ * Local variables:
64
+ * c-basic-offset: 2
65
+ * indent-tabs-mode: nil
66
+ * End:
67
+ */
@@ -0,0 +1,100 @@
1
+ /*
2
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
+ *
4
+ * Copyright (C) 2008-2012 NEC Corporation
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License, version 2, as
8
+ * published by the Free Software Foundation.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+
21
+ #include <linux/limits.h>
22
+ #include <stdarg.h>
23
+ #include <stdlib.h>
24
+ #include <string.h>
25
+ #include "trema_wrapper.h"
26
+ #include "utility.h"
27
+ #include "wrapper.h"
28
+
29
+
30
+ static void *
31
+ _trema_malloc( size_t size, const char *error_message ) {
32
+ void *ret = trema_malloc( size );
33
+ if ( !ret ) {
34
+ die( error_message );
35
+ }
36
+ return ret;
37
+ }
38
+
39
+
40
+ void *
41
+ xmalloc( size_t size ) {
42
+ void *ret = _trema_malloc( size, "Out of memory, xmalloc failed" );
43
+ memset( ret, 0xA5, size );
44
+ return ret;
45
+ }
46
+
47
+
48
+ void *
49
+ xcalloc( size_t nmemb, size_t size ) {
50
+ void *ret = trema_calloc( nmemb, size );
51
+ if ( !ret ) {
52
+ die( "Out of memory, xcalloc failed" );
53
+ }
54
+ return ret;
55
+ }
56
+
57
+
58
+ void
59
+ xfree( void *ptr ) {
60
+ trema_free( ptr );
61
+ }
62
+
63
+
64
+ static char *
65
+ _xstrdup( const char *s, const char *error_message ) {
66
+ size_t len = strlen( s ) + 1;
67
+ char *ret = _trema_malloc( len, error_message );
68
+ memcpy( ret, s, len );
69
+ return ret;
70
+ }
71
+
72
+
73
+ char *
74
+ xstrdup( const char *s ) {
75
+ return _xstrdup( s, "Out of memory, xstrdup failed" );
76
+ }
77
+
78
+
79
+ char *
80
+ xasprintf( const char *format, ... ) {
81
+ const char error[] = "Out of memory, xasprintf failed";
82
+ va_list args;
83
+ va_start( args, format );
84
+ char *str;
85
+ if ( trema_vasprintf( &str, format, args ) < 0 ) {
86
+ die( error );
87
+ }
88
+ char *result = _xstrdup( str, error );
89
+ free( str );
90
+ va_end( args );
91
+ return result;
92
+ }
93
+
94
+
95
+ /*
96
+ * Local variables:
97
+ * c-basic-offset: 2
98
+ * indent-tabs-mode: nil
99
+ * End:
100
+ */
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Wrappers that simplifies the handling of memory allocation errors.
3
+ *
4
+ * Author: Yasuhito Takamiya <yasuhito@gmail.com>
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef WRAPPER_H
24
+ #define WRAPPER_H
25
+
26
+
27
+ #include <stddef.h>
28
+ #include <string.h>
29
+ #include "utility.h"
30
+
31
+
32
+ // If this is being built for a unit test.
33
+ #ifdef UNIT_TESTING
34
+
35
+ // Redirect assert to mock_assert() so assertions can be caught by cmockery.
36
+ #ifdef assert
37
+ #undef assert
38
+ #endif // assert
39
+ #define assert( expression ) \
40
+ mock_assert( ( int ) ( expression ), #expression, __FILE__, __LINE__ );
41
+ extern void mock_assert( const int result, const char *const expression, const char *const file, const int line );
42
+
43
+ #endif // UNIT_TESTING
44
+
45
+
46
+ // Undef Ruby's xmalloc()
47
+ #ifdef xmalloc
48
+ #undef xmalloc
49
+ #endif
50
+ void *xmalloc( size_t size );
51
+
52
+ // Undef Ruby's xcalloc()
53
+ #ifdef xcalloc
54
+ #undef xcalloc
55
+ #endif
56
+ void *xcalloc( size_t nmemb, size_t size );
57
+
58
+ // Undef Ruby's xfree()
59
+ #ifdef xfree
60
+ #undef xfree
61
+ #endif
62
+ void xfree( void *ptr );
63
+
64
+ char *xstrdup( const char *s );
65
+ char *xasprintf( const char *format, ... );
66
+
67
+
68
+ #endif // WRAPPER_H
69
+
70
+
71
+ /*
72
+ * Local variables:
73
+ * c-basic-offset: 2
74
+ * indent-tabs-mode: nil
75
+ * End:
76
+ */
@@ -0,0 +1,17 @@
1
+ This directory includes packet-in filter component.
2
+
3
+ packet out
4
+ .---------------------------------------.
5
+ v |
6
+ +----------+ +-----------+ +-------+
7
+ | switch | * 1 | packet in | 1 * | trema |
8
+ | daemon | --------> | filter | --------> | apps |
9
+ +----------+ packet in +-----------+ packet in +-------+
10
+ ^ 1
11
+ |
12
+ |
13
+ v 1
14
+ +----------+
15
+ | openflow |
16
+ | switch |
17
+ +----------+
@@ -0,0 +1,575 @@
1
+ /*
2
+ * OpenFlow Packet_in message filter
3
+ *
4
+ * Author: Kazushi SUGYO
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
+ #include <arpa/inet.h>
24
+ #include <assert.h>
25
+ #include <getopt.h>
26
+ #include <inttypes.h>
27
+ #include <stdio.h>
28
+ #include <string.h>
29
+ #include <unistd.h>
30
+ #include "trema.h"
31
+
32
+
33
+ #ifdef UNIT_TESTING
34
+
35
+ #define static
36
+ #define main packetin_filter_main
37
+
38
+ #ifdef printf
39
+ #undef printf
40
+ #endif
41
+ #define printf( fmt, args... ) mock_printf2( fmt, ##args )
42
+ int mock_printf2(const char *format, ...);
43
+
44
+ #ifdef error
45
+ #undef error
46
+ #endif
47
+ #define error( fmt, args... ) mock_error( fmt, ##args )
48
+ void mock_error( const char *format, ... );
49
+
50
+ #ifdef set_match_from_packet
51
+ #undef set_match_from_packet
52
+ #endif
53
+ #define set_match_from_packet mock_set_match_from_packet
54
+ void mock_set_match_from_packet( struct ofp_match *match, const uint16_t in_port,
55
+ const uint32_t wildcards, const buffer *packet );
56
+
57
+ #ifdef create_packet_in
58
+ #undef create_packet_in
59
+ #endif
60
+ #define create_packet_in mock_create_packet_in
61
+ buffer *mock_create_packet_in( const uint32_t transaction_id, const uint32_t buffer_id,
62
+ const uint16_t total_len, uint16_t in_port,
63
+ const uint8_t reason, const buffer *data );
64
+
65
+ #ifdef insert_match_entry
66
+ #undef insert_match_entry
67
+ #endif
68
+ #define insert_match_entry mock_insert_match_entry
69
+ void mock_insert_match_entry( struct ofp_match *ofp_match, uint16_t priority,
70
+ const char *service_name );
71
+
72
+ #ifdef lookup_match_entry
73
+ #undef lookup_match_entry
74
+ #endif
75
+ #define lookup_match_entry mock_lookup_match_entry
76
+ match_entry *mock_lookup_match_entry( struct ofp_match *match );
77
+
78
+ #ifdef send_message
79
+ #undef send_message
80
+ #endif
81
+ #define send_message mock_send_message
82
+ bool mock_send_message( const char *service_name, const uint16_t tag, const void *data,
83
+ size_t len );
84
+
85
+ #ifdef init_trema
86
+ #undef init_trema
87
+ #endif
88
+ #define init_trema mock_init_trema
89
+ void mock_init_trema( int *argc, char ***argv );
90
+
91
+ #ifdef set_packet_in_handler
92
+ #undef set_packet_in_handler
93
+ #endif
94
+ #define set_packet_in_handler mock_set_packet_in_handler
95
+ bool mock_set_packet_in_handler( packet_in_handler callback, void *user_data );
96
+
97
+ #ifdef start_trema
98
+ #undef start_trema
99
+ #endif
100
+ #define start_trema mock_start_trema
101
+ void mock_start_trema( void );
102
+
103
+ #ifdef get_executable_name
104
+ #undef get_executable_name
105
+ #endif
106
+ #define get_executable_name mock_get_executable_name
107
+ const char *mock_get_executable_name( void );
108
+
109
+ #endif // UNIT_TESTING
110
+
111
+
112
+ void
113
+ usage() {
114
+ printf(
115
+ "OpenFlow Packet in Filter.\n"
116
+ "Usage: %s [OPTION]... [PACKETIN-FILTER-RULE]...\n"
117
+ "\n"
118
+ " -n, --name=SERVICE_NAME service name\n"
119
+ " -d, --daemonize run in the background\n"
120
+ " -l, --logging_level=LEVEL set logging level\n"
121
+ " -h, --help display this help and exit\n"
122
+ "\n"
123
+ "PACKETIN-FILTER-RULE:\n"
124
+ " match-type::destination-service-name\n"
125
+ "\n"
126
+ "match-type:\n"
127
+ " lldp LLDP ethernet frame type and priority is 0x8000\n"
128
+ " packet_in any packet and priority is zero\n"
129
+ "\n"
130
+ "destination-service-name destination service name\n"
131
+ , get_executable_name()
132
+ );
133
+ }
134
+
135
+
136
+ static buffer *
137
+ parse_etherip( const buffer *data ) {
138
+ packet_info *packet_info = data->user_data;
139
+ if ( packet_info->etherip_version != ETHERIP_VERSION ) {
140
+ error( "invalid etherip version 0x%04x.", packet_info->etherip_version );
141
+ return NULL;
142
+ }
143
+ if ( packet_info->etherip_offset == 0 ) {
144
+ debug( "too short etherip message" );
145
+ return NULL;
146
+ }
147
+
148
+ buffer *copy = duplicate_buffer( data );
149
+ if ( copy == NULL ) {
150
+ error( "duplicate_buffer failed." );
151
+ return NULL;
152
+ }
153
+ copy->user_data = NULL;
154
+ remove_front_buffer( copy, packet_info->etherip_offset );
155
+
156
+ if ( !parse_packet( copy ) ) {
157
+ error( "parse_packet failed." );
158
+ free_buffer( copy );
159
+ return NULL;
160
+ }
161
+
162
+ debug( "Receive EtherIP packet." );
163
+
164
+ return copy;
165
+ }
166
+
167
+
168
+ static void
169
+ handle_packet_in( uint64_t datapath_id, uint32_t transaction_id,
170
+ uint32_t buffer_id, uint16_t total_len,
171
+ uint16_t in_port, uint8_t reason, const buffer *data,
172
+ void *user_data ) {
173
+ UNUSED( user_data );
174
+
175
+ char match_str[ 1024 ];
176
+ struct ofp_match ofp_match; // host order
177
+
178
+ buffer *copy = NULL;
179
+ packet_info *packet_info = data->user_data;
180
+ debug( "Receive packet. ethertype=0x%04x, ipproto=0x%x", packet_info->eth_type, packet_info->ipv4_protocol );
181
+ if ( packet_type_ipv4_etherip( data ) ) {
182
+ copy = parse_etherip( data );
183
+ }
184
+ set_match_from_packet( &ofp_match, in_port, 0, copy != NULL ? copy : data );
185
+ if ( copy != NULL ) {
186
+ free_buffer( copy );
187
+ copy = NULL;
188
+ }
189
+ match_to_string( &ofp_match, match_str, sizeof( match_str ) );
190
+
191
+ list_element *services = lookup_match_entry( ofp_match );
192
+ if ( services == NULL ) {
193
+ debug( "match entry not found" );
194
+ return;
195
+ }
196
+
197
+ buffer *buf = create_packet_in( transaction_id, buffer_id, total_len, in_port,
198
+ reason, data );
199
+
200
+ openflow_service_header_t *message;
201
+ message = append_front_buffer( buf, sizeof( openflow_service_header_t ) );
202
+ message->datapath_id = htonll( datapath_id );
203
+ message->service_name_length = htons( 0 );
204
+ list_element *element;
205
+ for ( element = services; element != NULL; element = element->next ) {
206
+ const char *service_name = element->data;
207
+ if ( !send_message( service_name, MESSENGER_OPENFLOW_MESSAGE,
208
+ buf->data, buf->length ) ) {
209
+ error( "Failed to send a message to %s ( match = %s ).", service_name, match_str );
210
+ free_buffer( buf );
211
+ return;
212
+ }
213
+
214
+ debug( "Sending a message to %s ( match = %s ).", service_name, match_str );
215
+ }
216
+
217
+ free_buffer( buf );
218
+ }
219
+
220
+
221
+ static void
222
+ init_packetin_match_table( void ) {
223
+ init_match_table();
224
+ }
225
+
226
+
227
+ static void
228
+ free_user_data_entry( struct ofp_match match, uint16_t priority, void *services, void *user_data ) {
229
+ UNUSED( match );
230
+ UNUSED( priority );
231
+ UNUSED( user_data );
232
+
233
+ list_element *element;
234
+ for ( element = services; element != NULL; element = element->next ) {
235
+ xfree( element->data );
236
+ element->data = NULL;
237
+ }
238
+ delete_list( services );
239
+ }
240
+
241
+
242
+ static void
243
+ finalize_packetin_match_table( void ) {
244
+ foreach_match_table( free_user_data_entry, NULL );
245
+ finalize_match_table();
246
+ }
247
+
248
+
249
+ static bool
250
+ add_packetin_match_entry( struct ofp_match match, uint16_t priority, const char *service_name ) {
251
+ bool ( *insert_or_update_match_entry ) ( struct ofp_match, uint16_t, void * ) = update_match_entry;
252
+ list_element *services = lookup_match_strict_entry( match, priority );
253
+ if ( services == NULL ) {
254
+ insert_or_update_match_entry = insert_match_entry;
255
+ create_list( &services );
256
+ }
257
+ else {
258
+ list_element *element;
259
+ for ( element = services; element != NULL; element = element->next ) {
260
+ if ( strcmp( element->data, service_name ) == 0 ) {
261
+ char match_string[ 256 ];
262
+ match_to_string( &match, match_string, sizeof( match_string ) );
263
+ warn( "match entry already exists ( match = [%s], service_name = [%s] )", match_string, service_name );
264
+ return false;
265
+ }
266
+ }
267
+ }
268
+ append_to_tail( &services, xstrdup( service_name ) );
269
+ insert_or_update_match_entry( match, priority, services );
270
+
271
+ return true;
272
+ }
273
+
274
+
275
+ static int
276
+ delete_packetin_match_entry( struct ofp_match match, uint16_t priority, const char *service_name ) {
277
+ list_element *head = delete_match_strict_entry( match, priority );
278
+ if ( head == NULL ) {
279
+ return 0;
280
+ }
281
+
282
+ int n_deleted = 0;
283
+ int n_remaining_services = 0;
284
+ list_element *services = head;
285
+ while ( services != NULL ) {
286
+ char *service = services->data;
287
+ services = services->next;
288
+ if ( strcmp( service, service_name ) == 0 ) {
289
+ delete_element( &head, service );
290
+ xfree( service );
291
+ n_deleted++;
292
+ }
293
+ else {
294
+ n_remaining_services++;
295
+ }
296
+ }
297
+
298
+ if ( n_remaining_services == 0 ) {
299
+ if ( head != NULL ) {
300
+ delete_list( head );
301
+ }
302
+ }
303
+ else {
304
+ insert_match_entry( match, priority, head );
305
+ }
306
+
307
+ return n_deleted;
308
+ }
309
+
310
+
311
+ static void
312
+ register_dl_type_filter( uint16_t dl_type, uint16_t priority, const char *service_name ) {
313
+ struct ofp_match match;
314
+ memset( &match, 0, sizeof( struct ofp_match ) );
315
+ match.wildcards = OFPFW_ALL & ~OFPFW_DL_TYPE;
316
+ match.dl_type = dl_type;
317
+
318
+ add_packetin_match_entry( match, priority, service_name );
319
+ }
320
+
321
+
322
+ static void
323
+ register_any_filter( uint16_t priority, const char *service_name ) {
324
+ struct ofp_match match;
325
+ memset( &match, 0, sizeof( struct ofp_match ) );
326
+ match.wildcards = OFPFW_ALL;
327
+
328
+ add_packetin_match_entry( match, priority, service_name );
329
+ }
330
+
331
+
332
+ static const char *
333
+ match_type( const char *type, char *name ) {
334
+ size_t len = strlen( type );
335
+ if ( strncmp( name, type, len ) != 0 ) {
336
+ return NULL;
337
+ }
338
+
339
+ return name + len;
340
+ }
341
+
342
+
343
+ // built-in packetin-filter-rule
344
+ static const char LLDP_PACKET_IN[] = "lldp::";
345
+ static const char ANY_PACKET_IN[] = "packet_in::";
346
+
347
+ static bool
348
+ set_match_type( int argc, char *argv[] ) {
349
+ int i;
350
+ const char *service_name;
351
+ for ( i = 1; i < argc; i++ ) {
352
+ if ( ( service_name = match_type( LLDP_PACKET_IN, argv[ i ] ) ) != NULL ) {
353
+ register_dl_type_filter( ETH_ETHTYPE_LLDP, OFP_DEFAULT_PRIORITY, service_name );
354
+ }
355
+ else if ( ( service_name = match_type( ANY_PACKET_IN, argv[ i ] ) ) != NULL ) {
356
+ register_any_filter( 0, service_name );
357
+ }
358
+ else {
359
+ return false;
360
+ }
361
+ }
362
+
363
+ return true;
364
+ }
365
+
366
+
367
+ static void
368
+ handle_add_filter_request( const messenger_context_handle *handle, add_packetin_filter_request *request ) {
369
+ assert( handle != NULL );
370
+ assert( request != NULL ) ;
371
+
372
+ request->entry.service_name[ MESSENGER_SERVICE_NAME_LENGTH - 1 ] = '\0';
373
+ if ( strlen( request->entry.service_name ) == 0 ) {
374
+ error( "Service name must be specified." );
375
+ return;
376
+ }
377
+ struct ofp_match match;
378
+ ntoh_match( &match, &request->entry.match );
379
+ bool ret = add_packetin_match_entry( match, ntohs( request->entry.priority ), request->entry.service_name );
380
+
381
+ add_packetin_filter_reply reply;
382
+ memset( &reply, 0, sizeof( add_packetin_filter_reply ) );
383
+ reply.status = ( uint8_t ) ( ret ? PACKETIN_FILTER_OPERATION_SUCCEEDED : PACKETIN_FILTER_OPERATION_FAILED );
384
+ ret = send_reply_message( handle, MESSENGER_ADD_PACKETIN_FILTER_REPLY,
385
+ &reply, sizeof( add_packetin_filter_reply ) );
386
+ if ( ret == false ) {
387
+ error( "Failed to send an add filter reply." );
388
+ }
389
+ }
390
+
391
+
392
+ static void
393
+ delete_filter_walker( struct ofp_match match, uint16_t priority, void *data, void *user_data ) {
394
+ UNUSED( data );
395
+ buffer *reply_buffer = user_data;
396
+ assert( reply_buffer != NULL );
397
+
398
+ delete_packetin_filter_reply *reply = reply_buffer->data;
399
+ list_element *head = delete_match_strict_entry( match, priority );
400
+ for ( list_element *services = head; services != NULL; services = services->next ) {
401
+ xfree( services->data );
402
+ reply->n_deleted++;
403
+ }
404
+ if ( head != NULL ) {
405
+ delete_list( head );
406
+ }
407
+ }
408
+
409
+
410
+ static void
411
+ handle_delete_filter_request( const messenger_context_handle *handle, delete_packetin_filter_request *request ) {
412
+ assert( handle != NULL );
413
+ assert( request != NULL ) ;
414
+
415
+ buffer *buf = alloc_buffer_with_length( sizeof( delete_packetin_filter_reply ) );
416
+ delete_packetin_filter_reply *reply = append_back_buffer( buf, sizeof( delete_packetin_filter_reply ) );
417
+ reply->status = PACKETIN_FILTER_OPERATION_SUCCEEDED;
418
+ reply->n_deleted = 0;
419
+
420
+ struct ofp_match match;
421
+ ntoh_match( &match, &request->criteria.match );
422
+ uint16_t priority = ntohs( request->criteria.priority );
423
+ if ( request->flags & PACKETIN_FILTER_FLAG_MATCH_STRICT ) {
424
+ int n_deleted = delete_packetin_match_entry( match, priority, request->criteria.service_name );
425
+ reply->n_deleted += ( uint32_t ) n_deleted;
426
+ }
427
+ else {
428
+ map_match_table( match, delete_filter_walker, buf );
429
+ }
430
+ reply->n_deleted = htonl( reply->n_deleted );
431
+
432
+ bool ret = send_reply_message( handle, MESSENGER_DELETE_PACKETIN_FILTER_REPLY, buf->data, buf->length );
433
+ free_buffer( buf );
434
+ if ( ret == false ) {
435
+ error( "Failed to send a dump filter reply." );
436
+ }
437
+ }
438
+
439
+
440
+ static void
441
+ dump_filter_walker( struct ofp_match match, uint16_t priority, void *data, void *user_data ) {
442
+ buffer *reply_buffer = user_data;
443
+ assert( reply_buffer != NULL );
444
+
445
+ dump_packetin_filter_reply *reply = reply_buffer->data;
446
+ list_element *services = data;
447
+ while ( services != NULL ) {
448
+ reply->n_entries++;
449
+ packetin_filter_entry *entry = append_back_buffer( reply_buffer, sizeof( packetin_filter_entry ) );
450
+ hton_match( &entry->match, &match );
451
+ entry->priority = htons( priority );
452
+ strncpy( entry->service_name, services->data, sizeof( entry->service_name ) );
453
+ entry->service_name[ sizeof( entry->service_name ) - 1 ] = '\0';
454
+ services = services->next;
455
+ }
456
+ }
457
+
458
+
459
+ static void
460
+ handle_dump_filter_request( const messenger_context_handle *handle, dump_packetin_filter_request *request ) {
461
+ assert( handle != NULL );
462
+ assert( request != NULL ) ;
463
+
464
+ buffer *buf = alloc_buffer_with_length( 2048 );
465
+ dump_packetin_filter_reply *reply = append_back_buffer( buf, offsetof( dump_packetin_filter_reply, entries ) );
466
+ reply->status = PACKETIN_FILTER_OPERATION_SUCCEEDED;
467
+ reply->n_entries = 0;
468
+
469
+ struct ofp_match match;
470
+ ntoh_match( &match, &request->criteria.match );
471
+ uint16_t priority = ntohs( request->criteria.priority );
472
+ if ( request->flags & PACKETIN_FILTER_FLAG_MATCH_STRICT ) {
473
+ list_element *services = lookup_match_strict_entry( match, priority );
474
+ while ( services != NULL ) {
475
+ if ( strcmp( services->data, request->criteria.service_name ) == 0 ) {
476
+ packetin_filter_entry *entry = append_back_buffer( buf, sizeof( packetin_filter_entry ) );
477
+ reply->n_entries++;
478
+ entry->match = request->criteria.match;
479
+ entry->priority = request->criteria.priority;
480
+ strncpy( entry->service_name, services->data, sizeof( entry->service_name ) );
481
+ entry->service_name[ sizeof( entry->service_name ) - 1 ] = '\0';
482
+ }
483
+ services = services->next;
484
+ }
485
+ }
486
+ else {
487
+ map_match_table( match, dump_filter_walker, buf );
488
+ }
489
+ reply->n_entries = htonl( reply->n_entries );
490
+
491
+ bool ret = send_reply_message( handle, MESSENGER_DUMP_PACKETIN_FILTER_REPLY, buf->data, buf->length );
492
+ free_buffer( buf );
493
+ if ( ret == false ) {
494
+ error( "Failed to send a dump packetin filter reply." );
495
+ }
496
+ }
497
+
498
+
499
+ static void
500
+ handle_request( const messenger_context_handle *handle, uint16_t tag, void *data, size_t length ) {
501
+ assert( handle != NULL );
502
+
503
+ debug( "Handling a request ( handle = %p, tag = %#x, data = %p, length = %u ).",
504
+ handle, tag, data, length );
505
+
506
+ switch ( tag ) {
507
+ case MESSENGER_ADD_PACKETIN_FILTER_REQUEST:
508
+ {
509
+ if ( length != sizeof( add_packetin_filter_request ) ) {
510
+ error( "Invalid add packetin filter request ( length = %u ).", length );
511
+ return;
512
+ }
513
+
514
+ handle_add_filter_request( handle, data );
515
+ }
516
+ break;
517
+ case MESSENGER_DELETE_PACKETIN_FILTER_REQUEST:
518
+ {
519
+ if ( length != sizeof( delete_packetin_filter_request ) ) {
520
+ error( "Invalid delete packetin filter request ( length = %u ).", length );
521
+ return;
522
+ }
523
+
524
+ handle_delete_filter_request( handle, data );
525
+ }
526
+ break;
527
+ case MESSENGER_DUMP_PACKETIN_FILTER_REQUEST:
528
+ {
529
+ if ( length != sizeof( dump_packetin_filter_request ) ) {
530
+ error( "Invalid dump packetin filter request ( length = %u ).", length );
531
+ return;
532
+ }
533
+
534
+ handle_dump_filter_request( handle, data );
535
+ }
536
+ break;
537
+ default:
538
+ {
539
+ warn( "Undefined request tag ( tag = %#x ).", tag );
540
+ }
541
+ break;
542
+ }
543
+ }
544
+
545
+
546
+ int
547
+ main( int argc, char *argv[] ) {
548
+ init_trema( &argc, &argv );
549
+
550
+ init_packetin_match_table();
551
+
552
+ // built-in packetin-filter-rule
553
+ if ( !set_match_type( argc, argv ) ) {
554
+ usage();
555
+ finalize_packetin_match_table();
556
+ exit( EXIT_FAILURE );
557
+ }
558
+
559
+ set_packet_in_handler( handle_packet_in, NULL );
560
+ add_message_requested_callback( PACKETIN_FILTER_MANAGEMENT_SERVICE, handle_request );
561
+
562
+ start_trema();
563
+
564
+ finalize_packetin_match_table();
565
+
566
+ return 0;
567
+ }
568
+
569
+
570
+ /*
571
+ * Local variables:
572
+ * c-basic-offset: 2
573
+ * indent-tabs-mode: nil
574
+ * End:
575
+ */