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,46 @@
1
+ /*
2
+ * OpenFlow Switch Manager
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
+ #ifndef DPID_TABLE_H
24
+ #define DPID_TABLE_H
25
+
26
+
27
+ #include "trema.h"
28
+
29
+
30
+ void init_dpid_table( void );
31
+ void finalize_dpid_table( void );
32
+ void insert_dpid_entry( uint64_t *dpid );
33
+ void delete_dpid_entry( uint64_t *dpid );
34
+ buffer *get_switches( void );
35
+
36
+
37
+ #endif // DPID_TABLE_H
38
+
39
+
40
+ /*
41
+ * Local variables:
42
+ * c-basic-offset: 2
43
+ * indent-tabs-mode: nil
44
+ * End:
45
+ */
46
+
@@ -0,0 +1,44 @@
1
+ /*
2
+ * Author: Yasunobu Chiba
3
+ *
4
+ * Copyright (C) 2008-2012 NEC Corporation
5
+ *
6
+ * This program is free software; you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License, version 2, as
8
+ * published by the Free Software Foundation.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License along
16
+ * with this program; if not, write to the Free Software Foundation, Inc.,
17
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ */
19
+
20
+
21
+ #ifndef MANAGEMENT_INTERFACE_H
22
+ #define MANAGEMENT_INTERFACE_H
23
+
24
+
25
+ #include "trema.h"
26
+
27
+
28
+ enum {
29
+ DUMP_XID_TABLE = 0,
30
+ DUMP_COOKIE_TABLE,
31
+ TOGGLE_COOKIE_AGING,
32
+ };
33
+
34
+
35
+ #endif // MANAGEMENT_INTERFACE_H
36
+
37
+
38
+ /*
39
+ * Local variables:
40
+ * c-basic-offset: 2
41
+ * indent-tabs-mode: nil
42
+ * End:
43
+ */
44
+
@@ -0,0 +1,482 @@
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 <inttypes.h>
23
+ #include <openflow.h>
24
+ #include "openflow_message.h"
25
+ #include "cookie_table.h"
26
+ #include "ofpmsg_recv.h"
27
+ #include "ofpmsg_send.h"
28
+ #include "service_interface.h"
29
+ #include "switch.h"
30
+ #include "xid_table.h"
31
+
32
+
33
+ static int ofpmsg_recv_hello( struct switch_info *sw_info, buffer *buf );
34
+ static int ofpmsg_recv_error( struct switch_info *sw_info, buffer *buf );
35
+ static int ofpmsg_recv_echorequest( struct switch_info *sw_info, buffer *buf );
36
+ static int ofpmsg_recv_echoreply( struct switch_info *sw_info, buffer *buf );
37
+ static int ofpmsg_recv_vendor( struct switch_info *sw_info, buffer *buf );
38
+ static int ofpmsg_recv_featuresreply( struct switch_info *sw_info, buffer *buf );
39
+ static int ofpmsg_recv_getconfigreply( struct switch_info *sw_info, buffer *buf );
40
+ static int ofpmsg_recv_packetin( struct switch_info *sw_info, buffer *buf );
41
+ static int ofpmsg_recv_flowremoved( struct switch_info *sw_info, buffer *buf );
42
+ static int ofpmsg_recv_portstatus( struct switch_info *sw_info, buffer *buf );
43
+ static int ofpmsg_recv_statsreply( struct switch_info *sw_info, buffer *buf );
44
+ static int ofpmsg_recv_barrierreply( struct switch_info *sw_info, buffer *buf );
45
+ static int ofpmsg_recv_queue_getconfigreply( struct switch_info *sw_info, buffer *buf );
46
+
47
+
48
+ #define ofpmsg_debug( format, args... ) \
49
+ do { \
50
+ debug( format " state:%d, dpid:%#" PRIx64 ", fd:%d.", \
51
+ ## args, sw_info->state, sw_info->datapath_id, \
52
+ sw_info->secure_channel_fd ); \
53
+ } \
54
+ while ( 0 )
55
+
56
+
57
+ static int
58
+ send_transaction_reply( struct switch_info *sw_info, buffer *buf ) {
59
+ struct ofp_header *header;
60
+ uint32_t xid;
61
+ xid_entry_t *xid_entry;
62
+
63
+ header = buf->data;
64
+ xid = ntohl( header->xid );
65
+
66
+ xid_entry = lookup_xid_entry( xid );
67
+ if ( xid_entry == NULL ) {
68
+ free_buffer( buf );
69
+ return -1;
70
+ }
71
+ header->xid = htonl( xid_entry->original_xid );
72
+ service_send_to_reply( xid_entry->service_name, MESSENGER_OPENFLOW_MESSAGE,
73
+ &sw_info->datapath_id, buf );
74
+ delete_xid_entry( xid_entry );
75
+ free_buffer( buf );
76
+
77
+ return 0;
78
+ }
79
+
80
+
81
+ int
82
+ ofpmsg_recv_hello( struct switch_info *sw_info, buffer *buf ) {
83
+ int ret;
84
+
85
+ ofpmsg_debug( "Receive 'hello' from a switch." );
86
+
87
+ free_buffer( buf );
88
+
89
+ ret = switch_event_recv_hello( sw_info );
90
+ if ( ret < 0 ) {
91
+ return ret;
92
+ }
93
+
94
+ return ret;
95
+ }
96
+
97
+
98
+ int
99
+ ofpmsg_recv_error( struct switch_info *sw_info, buffer *buf ) {
100
+ int ret;
101
+ struct ofp_error_msg *error_msg;
102
+
103
+ ofpmsg_debug( "Receive 'error' from a switch." );
104
+
105
+ error_msg = buf->data;
106
+
107
+ uint16_t type = ntohs( error_msg->type );
108
+ uint16_t code = ntohs( error_msg->code );
109
+
110
+ notice( "Receive 'error' from a switch. xid:%#x, type:%d, code:%d.",
111
+ ntohl( error_msg->header.xid ), type, code );
112
+
113
+ ret = switch_event_recv_error( sw_info );
114
+ if ( ret < 0 ) {
115
+ free_buffer( buf );
116
+ return ret;
117
+ }
118
+
119
+ if ( type == OFPET_FLOW_MOD_FAILED ) {
120
+ size_t length = ntohs( error_msg->header.length ) - offsetof( struct ofp_error_msg, data );
121
+ if ( length >= offsetof( struct ofp_flow_mod, command ) ) {
122
+ struct ofp_flow_mod *flow_mod = ( struct ofp_flow_mod * ) error_msg->data;
123
+ uint32_t xid = ntohl( flow_mod->header.xid );
124
+ xid_entry_t *xid_entry = lookup_xid_entry( xid );
125
+ if ( xid_entry != NULL ) {
126
+ flow_mod->header.xid = htonl( xid_entry->original_xid );
127
+ }
128
+ uint64_t cookie = ntohll( flow_mod->cookie );
129
+ if ( cookie == RESERVED_COOKIE ) {
130
+ free_buffer( buf );
131
+ return 0;
132
+ }
133
+ cookie_entry_t *entry = lookup_cookie_entry_by_cookie( &cookie );
134
+ if ( entry != NULL ) {
135
+ flow_mod->cookie = htonll( entry->application.cookie );
136
+ if ( length >= offsetof( struct ofp_flow_mod, actions ) ) {
137
+ flow_mod->flags = htons( entry->application.flags );
138
+ }
139
+ }
140
+
141
+ if ( length >= offsetof( struct ofp_flow_mod, idle_timeout ) ) {
142
+ uint16_t command = ntohs( flow_mod->command );
143
+ switch ( command ) {
144
+ case OFPFC_ADD:
145
+ {
146
+ if ( entry != NULL ) {
147
+ delete_cookie_entry( entry );
148
+ }
149
+ else {
150
+ error( "No cookie entry found ( cookie = %#" PRIx64 " ).", cookie );
151
+ }
152
+ }
153
+ break;
154
+
155
+ case OFPFC_MODIFY:
156
+ case OFPFC_MODIFY_STRICT:
157
+ case OFPFC_DELETE:
158
+ case OFPFC_DELETE_STRICT:
159
+ break;
160
+
161
+ default:
162
+ error( "Undefined flow_mod command ( command = %#x ).", command );
163
+ }
164
+ }
165
+ }
166
+ }
167
+
168
+ send_transaction_reply( sw_info, buf );
169
+
170
+ return 0;
171
+ }
172
+
173
+
174
+ int
175
+ ofpmsg_recv_echorequest( struct switch_info *sw_info, buffer *buf ) {
176
+ int ret;
177
+ struct ofp_header *ofp_header;
178
+
179
+ ofpmsg_debug( "Receive 'echo request' from a switch." );
180
+
181
+ ofp_header = buf->data;
182
+ remove_front_buffer( buf, sizeof( struct ofp_header ) );
183
+ ret = ofpmsg_send_echoreply( sw_info, ntohl( ofp_header->xid ), buf );
184
+
185
+ return ret;
186
+ }
187
+
188
+
189
+ int
190
+ ofpmsg_recv_echoreply( struct switch_info *sw_info, buffer *buf ) {
191
+ ofpmsg_debug( "Receive 'echo reply' from a switch." );
192
+
193
+ // TODO: implement keepalive mechanism
194
+
195
+ free_buffer( buf );
196
+
197
+ return 0;
198
+ }
199
+
200
+
201
+ int
202
+ ofpmsg_recv_vendor( struct switch_info *sw_info, buffer *buf ) {
203
+ ofpmsg_debug( "Receive 'vendor' from a switch." );
204
+
205
+ service_send_to_application( sw_info->vendor_service_name_list,
206
+ MESSENGER_OPENFLOW_MESSAGE,
207
+ &sw_info->datapath_id, buf );
208
+ free_buffer( buf );
209
+
210
+ return 0;
211
+ }
212
+
213
+
214
+ int
215
+ ofpmsg_recv_featuresreply( struct switch_info *sw_info, buffer *buf ) {
216
+ int ret;
217
+ struct ofp_switch_features *feat_rep;
218
+ uint64_t datapath_id;
219
+
220
+ ofpmsg_debug( "Receive 'features reply' from a switch." );
221
+
222
+ feat_rep = buf->data;
223
+
224
+ datapath_id = ntohll( feat_rep->datapath_id );
225
+
226
+ ret = switch_event_recv_featuresreply( sw_info, &datapath_id );
227
+ if ( ret < 0 ) {
228
+ free_buffer( buf );
229
+ return ret;
230
+ }
231
+
232
+ send_transaction_reply( sw_info, buf );
233
+
234
+ return 0;
235
+ }
236
+
237
+
238
+ int
239
+ ofpmsg_recv_getconfigreply( struct switch_info *sw_info, buffer *buf ) {
240
+ ofpmsg_debug( "Receive 'get config reply' from a switch." );
241
+
242
+ send_transaction_reply( sw_info, buf );
243
+
244
+ return 0;
245
+ }
246
+
247
+
248
+ int
249
+ ofpmsg_recv_packetin( struct switch_info *sw_info, buffer *buf ) {
250
+ ofpmsg_debug( "Receive 'packet in' from a switch." );
251
+
252
+ service_send_to_application( sw_info->packetin_service_name_list,
253
+ MESSENGER_OPENFLOW_MESSAGE,
254
+ &sw_info->datapath_id, buf );
255
+ free_buffer( buf );
256
+
257
+ return 0;
258
+ }
259
+
260
+
261
+ int
262
+ ofpmsg_recv_flowremoved( struct switch_info *sw_info, buffer *buf ) {
263
+ struct ofp_flow_removed *flow_removed;
264
+ uint64_t cookie;
265
+ cookie_entry_t *entry;
266
+
267
+ ofpmsg_debug( "Receive 'flow removed' from a switch." );
268
+
269
+ flow_removed = buf->data;
270
+
271
+ cookie = ntohll( flow_removed->cookie );
272
+ if ( cookie == RESERVED_COOKIE ) {
273
+ free_buffer( buf );
274
+ return 0;
275
+ }
276
+
277
+ entry = lookup_cookie_entry_by_cookie( &cookie );
278
+ if ( entry == NULL ) {
279
+ error( "No cookie entry found ( cookie = %#" PRIx64 " ).", cookie );
280
+ free_buffer( buf );
281
+ return 0;
282
+ }
283
+ debug( "Cookie found ( cookie = %#" PRIx64 ", application = [ cookie = %#" PRIx64 ", service name = %s, flags = %#x ], "
284
+ "reference_count = %d, expire_at = %u ).",
285
+ cookie, entry->application.cookie, entry->application.service_name, entry->application.flags,
286
+ entry->reference_count, entry->expire_at );
287
+
288
+ if ( entry->application.flags & OFPFF_SEND_FLOW_REM ) {
289
+ flow_removed->cookie = htonll( entry->application.cookie );
290
+
291
+ service_send_to_reply( entry->application.service_name, MESSENGER_OPENFLOW_MESSAGE,
292
+ &sw_info->datapath_id, buf );
293
+ }
294
+
295
+ delete_cookie_entry( entry );
296
+ free_buffer( buf );
297
+
298
+ return 0;
299
+ }
300
+
301
+
302
+ int
303
+ ofpmsg_recv_portstatus( struct switch_info *sw_info, buffer *buf ) {
304
+ ofpmsg_debug( "Receive 'port status' from a switch." );
305
+
306
+ service_send_to_application( sw_info->portstatus_service_name_list,
307
+ MESSENGER_OPENFLOW_MESSAGE,
308
+ &sw_info->datapath_id, buf );
309
+ free_buffer( buf );
310
+
311
+ return 0;
312
+ }
313
+
314
+
315
+ int
316
+ ofpmsg_recv_statsreply( struct switch_info *sw_info, buffer *buf ) {
317
+ struct ofp_stats_reply *stats_reply = buf->data;
318
+ uint16_t type = ntohs( stats_reply->type );
319
+
320
+ ofpmsg_debug( "Receive 'statistics reply' from a switch." );
321
+
322
+ if ( type == OFPST_FLOW ) {
323
+ size_t body_offset = offsetof( struct ofp_stats_reply, body );
324
+ int body_length = ntohs( stats_reply->header.length ) - ( int ) body_offset;
325
+ struct ofp_flow_stats *flow_stats = ( void * ) ( ( char * ) stats_reply + body_offset );
326
+ while ( body_length > 0 ) {
327
+ uint64_t cookie = ntohll( flow_stats->cookie );
328
+ cookie_entry_t *entry = lookup_cookie_entry_by_cookie( &cookie );
329
+ if ( entry != NULL ) {
330
+ debug( "Cookie entry found ( cookie = %#" PRIx64 ", application = [ cookie = %#" PRIx64 ", service name = %s ] ).",
331
+ cookie, entry->application.cookie, entry->application.service_name );
332
+ flow_stats->cookie = htonll( entry->application.cookie );
333
+ }
334
+ else {
335
+ warn( "No cookie entry found ( cookie = %#" PRIx64 " ).", cookie );
336
+ }
337
+
338
+ body_length = body_length - ntohs( flow_stats->length );
339
+ flow_stats = ( void * ) ( ( char * ) flow_stats + ntohs( flow_stats->length ) );
340
+ }
341
+ }
342
+
343
+ // since we may receive multiple replies, we cannot call send_transaction_reply().
344
+ uint32_t xid = ntohl( stats_reply->header.xid );
345
+ xid_entry_t *xid_entry = lookup_xid_entry( xid );
346
+ if ( xid_entry == NULL ) {
347
+ error( "No transaction id entry found ( transaction_id = %#lx ).", xid );
348
+ free_buffer( buf );
349
+ return -1;
350
+ }
351
+ stats_reply->header.xid = htonl( xid_entry->original_xid );
352
+ service_send_to_reply( xid_entry->service_name, MESSENGER_OPENFLOW_MESSAGE,
353
+ &sw_info->datapath_id, buf );
354
+
355
+ if ( ( ntohs( stats_reply->flags ) & OFPSF_REPLY_MORE ) == 0 ) {
356
+ delete_xid_entry( xid_entry );
357
+ }
358
+ free_buffer( buf );
359
+
360
+ return 0;
361
+ }
362
+
363
+
364
+ int
365
+ ofpmsg_recv_barrierreply( struct switch_info *sw_info, buffer *buf ) {
366
+ ofpmsg_debug( "Receive 'barrier reply' from a switch." );
367
+
368
+ send_transaction_reply( sw_info, buf );
369
+
370
+ return 0;
371
+ }
372
+
373
+
374
+ int
375
+ ofpmsg_recv_queue_getconfigreply( struct switch_info *sw_info, buffer *buf ) {
376
+ ofpmsg_debug( "Receive 'queue get config reply' from a switch." );
377
+
378
+ send_transaction_reply( sw_info, buf );
379
+
380
+ return 0;
381
+ }
382
+
383
+
384
+ int
385
+ ofpmsg_recv( struct switch_info *sw_info, buffer *buf ) {
386
+ int ret;
387
+ struct ofp_header *header;
388
+ uint16_t error_type, error_code;
389
+
390
+ ofpmsg_debug( "Receive a message from a switch." );
391
+
392
+ header = buf->data;
393
+ ret = validate_openflow_message( buf );
394
+ if ( ret != 0 ) {
395
+ notice( "Invalid openflow message. type:%d, errno:%d", header->type, ret );
396
+
397
+ error_type = OFPET_BAD_REQUEST;
398
+ error_code = OFPBRC_BAD_TYPE;
399
+ get_error_type_and_code( header->type, ret, &error_type, &error_code );
400
+ debug( "Validation error. type %u, errno %d, error type %u, error code %u",
401
+ header->type, ret, error_type, error_code );
402
+
403
+ ofpmsg_send_error_msg( sw_info, error_type, error_code, buf );
404
+ free_buffer( buf );
405
+
406
+ return -1;
407
+ }
408
+
409
+ switch ( header->type ) {
410
+ // Immutable messages.
411
+ case OFPT_HELLO:
412
+ ret = ofpmsg_recv_hello( sw_info, buf );
413
+ break;
414
+
415
+ case OFPT_ERROR:
416
+ ret = ofpmsg_recv_error( sw_info, buf );
417
+ break;
418
+
419
+ case OFPT_ECHO_REQUEST:
420
+ ret = ofpmsg_recv_echorequest( sw_info, buf );
421
+ break;
422
+
423
+ case OFPT_ECHO_REPLY:
424
+ ret = ofpmsg_recv_echoreply( sw_info, buf );
425
+ break;
426
+
427
+ case OFPT_VENDOR:
428
+ ret = ofpmsg_recv_vendor( sw_info, buf );
429
+ break;
430
+
431
+ // Switch configuration messages.
432
+ case OFPT_FEATURES_REPLY:
433
+ ret = ofpmsg_recv_featuresreply( sw_info, buf );
434
+ break;
435
+
436
+ case OFPT_GET_CONFIG_REPLY:
437
+ ret = ofpmsg_recv_getconfigreply( sw_info, buf );
438
+ break;
439
+
440
+ // Asynchronous messages.
441
+ case OFPT_PACKET_IN:
442
+ ret = ofpmsg_recv_packetin( sw_info, buf );
443
+ break;
444
+
445
+ case OFPT_FLOW_REMOVED:
446
+ ret = ofpmsg_recv_flowremoved( sw_info, buf );
447
+ break;
448
+
449
+ case OFPT_PORT_STATUS:
450
+ ret = ofpmsg_recv_portstatus( sw_info, buf );
451
+ break;
452
+
453
+ // Statistics messages.
454
+ case OFPT_STATS_REPLY:
455
+ ret = ofpmsg_recv_statsreply( sw_info, buf );
456
+ break;
457
+
458
+ // Barrier messages.
459
+ case OFPT_BARRIER_REPLY:
460
+ ret = ofpmsg_recv_barrierreply( sw_info, buf );
461
+ break;
462
+
463
+ // Queue Configuration messages.
464
+ case OFPT_QUEUE_GET_CONFIG_REPLY:
465
+ ret = ofpmsg_recv_queue_getconfigreply( sw_info, buf );
466
+ break;
467
+
468
+ default:
469
+ assert( 0 );
470
+ break;
471
+ }
472
+
473
+ return ret;
474
+ }
475
+
476
+
477
+ /*
478
+ * Local variables:
479
+ * c-basic-offset: 2
480
+ * indent-tabs-mode: nil
481
+ * End:
482
+ */