trema 0.4.7 → 0.4.8

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 (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +33 -54
  3. data/.hound.yml +3 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +17 -1
  6. data/.travis.yml +14 -18
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +1 -26
  9. data/README.md +25 -241
  10. data/Rakefile +4 -1056
  11. data/bin/.gitignore +3 -0
  12. data/bin/trema +163 -237
  13. data/features/cleanup_on_failure.feature +118 -0
  14. data/features/logging.feature +73 -0
  15. data/features/open_flow13.feature +21 -0
  16. data/features/step_definitions/.gitignore +35 -0
  17. data/features/step_definitions/.rubocop.yml +5 -0
  18. data/features/step_definitions/.travis.yml +19 -0
  19. data/features/step_definitions/Gemfile +9 -0
  20. data/features/step_definitions/Guardfile +4 -0
  21. data/features/step_definitions/LICENSE +675 -0
  22. data/features/step_definitions/README.md +7 -0
  23. data/features/step_definitions/Rakefile +10 -0
  24. data/features/step_definitions/show_stats_steps.rb +56 -0
  25. data/features/step_definitions/virtual_link_steps.rb +8 -0
  26. data/features/support/env.rb +0 -73
  27. data/features/support/hooks.rb +6 -50
  28. data/features/trema_delete_link.feature +30 -0
  29. data/features/trema_killall.feature +56 -0
  30. data/features/trema_run.feature +47 -0
  31. data/features/trema_start.feature +73 -0
  32. data/features/trema_stop.feature +50 -0
  33. data/lib/trema.rb +4 -0
  34. data/lib/trema/command.rb +184 -0
  35. data/lib/trema/controller.rb +289 -0
  36. data/lib/trema/dirs.rb +14 -0
  37. data/lib/trema/drb.rb +32 -0
  38. data/lib/trema/logger.rb +63 -0
  39. data/lib/trema/monkey_patch/integer.rb +8 -0
  40. data/lib/trema/monkey_patch/integer/base_conversions.rb +12 -0
  41. data/lib/trema/monkey_patch/integer/durations.rb +12 -0
  42. data/lib/trema/switch.rb +83 -0
  43. data/lib/trema/version.rb +5 -0
  44. data/spec/spec_helper.rb +9 -178
  45. data/spec/trema/controller_spec.rb +4 -53
  46. data/tasks/.gitignore +34 -0
  47. data/tasks/LICENSE +675 -0
  48. data/tasks/README.md +6 -0
  49. data/tasks/cucumber.rake +14 -0
  50. data/tasks/flay.rake +15 -0
  51. data/tasks/flog.rake +25 -0
  52. data/tasks/gem.rake +15 -0
  53. data/tasks/reek.rake +11 -0
  54. data/tasks/relish.rake +8 -0
  55. data/tasks/rspec.rake +8 -0
  56. data/tasks/rubocop.rake +2 -16
  57. data/tasks/yard.rake +11 -0
  58. data/trema.gemspec +24 -23
  59. metadata +180 -720
  60. data/.yardopts +0 -4
  61. data/Doxyfile +0 -1679
  62. data/Guardfile +0 -14
  63. data/bin/quality +0 -31
  64. data/bin/trema-config +0 -59
  65. data/build.rb +0 -32
  66. data/cruise.rb +0 -409
  67. data/features/.nav +0 -50
  68. data/features/README.md +0 -7
  69. data/features/core/get_pid_by_trema_name.feature +0 -137
  70. data/features/core/packetin_filter.feature +0 -55
  71. data/features/core/switch_manager.feature +0 -41
  72. data/features/core/trema-config.feature +0 -55
  73. data/features/dsl/switch_port_specifier.feature +0 -15
  74. data/features/examples/dumper.feature +0 -35
  75. data/features/examples/hello_trema.feature +0 -23
  76. data/features/examples/learning_switch.feature +0 -37
  77. data/features/examples/list_switches.feature +0 -24
  78. data/features/examples/message.set_config.feature +0 -27
  79. data/features/examples/message.vendor-action.feature +0 -25
  80. data/features/examples/message.vendor-stats-request.feature +0 -20
  81. data/features/examples/multi_learning_switch.feature +0 -107
  82. data/features/examples/openflow_message.echo.feature +0 -59
  83. data/features/examples/openflow_message.features_request.feature +0 -35
  84. data/features/examples/openflow_message.hello.feature +0 -59
  85. data/features/examples/packet_in.feature +0 -33
  86. data/features/examples/packetin_filter_config.feature +0 -95
  87. data/features/examples/patch_panel.feature +0 -29
  88. data/features/examples/repeater_hub.feature +0 -52
  89. data/features/examples/switch_info.feature +0 -51
  90. data/features/examples/switch_monitor.feature +0 -35
  91. data/features/examples/transparent_firewall.feature +0 -73
  92. data/features/handlers/switch_ready.feature +0 -40
  93. data/features/step_definitions/misc_steps.rb +0 -85
  94. data/features/step_definitions/send_packets_steps.rb +0 -33
  95. data/features/step_definitions/stats_steps.rb +0 -39
  96. data/features/switch_event/C-add_forward_entry.feature +0 -114
  97. data/features/switch_event/C-delete_forward_entry.feature +0 -85
  98. data/features/switch_event/C-dump_forward_entries.feature +0 -72
  99. data/features/switch_event/C-set_forward_entries.feature +0 -77
  100. data/features/switch_event/README.md +0 -40
  101. data/features/switch_event/add_forward_entry.feature +0 -160
  102. data/features/switch_event/delete_forward_entry.feature +0 -160
  103. data/features/switch_event/dump_forward_entries.feature +0 -103
  104. data/features/switch_event/set_forward_entries.feature +0 -102
  105. data/features/trema_commands/README.md +0 -8
  106. data/features/trema_commands/dump_flows.feature +0 -41
  107. data/features/trema_commands/help.feature +0 -27
  108. data/features/trema_commands/help_option.feature +0 -20
  109. data/features/trema_commands/kill.feature +0 -56
  110. data/features/trema_commands/killall.feature +0 -32
  111. data/features/trema_commands/port_down.feature +0 -71
  112. data/features/trema_commands/port_up.feature +0 -75
  113. data/features/trema_commands/reset_stats.feature +0 -56
  114. data/features/trema_commands/run.feature +0 -56
  115. data/features/trema_commands/send_packets.feature +0 -46
  116. data/features/trema_commands/show_stats.feature +0 -66
  117. data/features/trema_commands/up.feature +0 -34
  118. data/features/trema_commands/version.feature +0 -10
  119. data/features/trema_commands/version_option.feature +0 -8
  120. data/rubocop-todo.yml +0 -159
  121. data/ruby/.gitignore +0 -4
  122. data/ruby/blocker.rb +0 -74
  123. data/ruby/extconf.rb +0 -80
  124. data/ruby/sub-process.rb +0 -289
  125. data/ruby/trema/action-common.c +0 -46
  126. data/ruby/trema/action-common.h +0 -38
  127. data/ruby/trema/action.rb +0 -33
  128. data/ruby/trema/aggregate-stats-reply.rb +0 -68
  129. data/ruby/trema/app.rb +0 -114
  130. data/ruby/trema/barrier-reply.c +0 -98
  131. data/ruby/trema/barrier-reply.h +0 -44
  132. data/ruby/trema/barrier-request.c +0 -135
  133. data/ruby/trema/barrier-request.h +0 -42
  134. data/ruby/trema/cli.rb +0 -267
  135. data/ruby/trema/command.rb +0 -41
  136. data/ruby/trema/command/dump_flows.rb +0 -43
  137. data/ruby/trema/command/kill.rb +0 -75
  138. data/ruby/trema/command/killall.rb +0 -38
  139. data/ruby/trema/command/netns.rb +0 -38
  140. data/ruby/trema/command/port_down.rb +0 -43
  141. data/ruby/trema/command/port_up.rb +0 -43
  142. data/ruby/trema/command/reset_stats.rb +0 -41
  143. data/ruby/trema/command/ruby.rb +0 -38
  144. data/ruby/trema/command/run.rb +0 -110
  145. data/ruby/trema/command/send_packets.rb +0 -46
  146. data/ruby/trema/command/shell.rb +0 -57
  147. data/ruby/trema/command/show_stats.rb +0 -65
  148. data/ruby/trema/command/up.rb +0 -44
  149. data/ruby/trema/command/version.rb +0 -35
  150. data/ruby/trema/compat.h +0 -36
  151. data/ruby/trema/controller.c +0 -691
  152. data/ruby/trema/controller.h +0 -42
  153. data/ruby/trema/controller.rb +0 -255
  154. data/ruby/trema/custom-switch.rb +0 -56
  155. data/ruby/trema/daemon.rb +0 -184
  156. data/ruby/trema/default-logger.c +0 -161
  157. data/ruby/trema/default-logger.h +0 -42
  158. data/ruby/trema/default-logger.rb +0 -29
  159. data/ruby/trema/default_openflow_channel_port.rb +0 -26
  160. data/ruby/trema/desc-stats-reply.rb +0 -75
  161. data/ruby/trema/dsl.rb +0 -32
  162. data/ruby/trema/dsl/configuration.rb +0 -145
  163. data/ruby/trema/dsl/context.rb +0 -69
  164. data/ruby/trema/dsl/custom-switch.rb +0 -44
  165. data/ruby/trema/dsl/link.rb +0 -39
  166. data/ruby/trema/dsl/netns.rb +0 -78
  167. data/ruby/trema/dsl/parser.rb +0 -70
  168. data/ruby/trema/dsl/rswitch.rb +0 -47
  169. data/ruby/trema/dsl/run.rb +0 -47
  170. data/ruby/trema/dsl/runner.rb +0 -178
  171. data/ruby/trema/dsl/stanza.rb +0 -51
  172. data/ruby/trema/dsl/switch.rb +0 -76
  173. data/ruby/trema/dsl/syntax-error.rb +0 -31
  174. data/ruby/trema/dsl/syntax.rb +0 -128
  175. data/ruby/trema/dsl/vhost.rb +0 -106
  176. data/ruby/trema/dsl/vswitch.rb +0 -45
  177. data/ruby/trema/echo-reply.c +0 -122
  178. data/ruby/trema/echo-reply.h +0 -40
  179. data/ruby/trema/echo-request.c +0 -117
  180. data/ruby/trema/echo-request.h +0 -40
  181. data/ruby/trema/echo.c +0 -99
  182. data/ruby/trema/echo.h +0 -39
  183. data/ruby/trema/enqueue.rb +0 -87
  184. data/ruby/trema/error.c +0 -262
  185. data/ruby/trema/error.h +0 -42
  186. data/ruby/trema/exact-match.rb +0 -34
  187. data/ruby/trema/executables.rb +0 -99
  188. data/ruby/trema/features-reply.c +0 -330
  189. data/ruby/trema/features-reply.h +0 -54
  190. data/ruby/trema/features-request.c +0 -134
  191. data/ruby/trema/features-request.h +0 -42
  192. data/ruby/trema/flow-mod.c +0 -150
  193. data/ruby/trema/flow-mod.h +0 -42
  194. data/ruby/trema/flow-removed.c +0 -280
  195. data/ruby/trema/flow-removed.h +0 -44
  196. data/ruby/trema/flow-stats-reply.rb +0 -107
  197. data/ruby/trema/flow.rb +0 -65
  198. data/ruby/trema/get-config-reply.c +0 -158
  199. data/ruby/trema/get-config-reply.h +0 -50
  200. data/ruby/trema/get-config-request.c +0 -136
  201. data/ruby/trema/get-config-request.h +0 -42
  202. data/ruby/trema/hardware-switch.rb +0 -86
  203. data/ruby/trema/hello.c +0 -133
  204. data/ruby/trema/hello.h +0 -42
  205. data/ruby/trema/host.rb +0 -263
  206. data/ruby/trema/link.rb +0 -177
  207. data/ruby/trema/list-switches-reply.c +0 -44
  208. data/ruby/trema/list-switches-reply.h +0 -38
  209. data/ruby/trema/mac.rb +0 -29
  210. data/ruby/trema/match.c +0 -621
  211. data/ruby/trema/match.h +0 -34
  212. data/ruby/trema/monkey-patch/integer.rb +0 -35
  213. data/ruby/trema/monkey-patch/integer/base-conversions.rb +0 -34
  214. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -49
  215. data/ruby/trema/monkey-patch/integer/validators.rb +0 -36
  216. data/ruby/trema/monkey-patch/module.rb +0 -33
  217. data/ruby/trema/monkey-patch/module/class-method.rb +0 -38
  218. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -39
  219. data/ruby/trema/monkey-patch/string.rb +0 -31
  220. data/ruby/trema/monkey-patch/string/inflectors.rb +0 -52
  221. data/ruby/trema/netns.rb +0 -127
  222. data/ruby/trema/network-component.rb +0 -151
  223. data/ruby/trema/ofctl.rb +0 -70
  224. data/ruby/trema/open-vswitch.rb +0 -160
  225. data/ruby/trema/openflow-error.c +0 -193
  226. data/ruby/trema/openflow-error.h +0 -51
  227. data/ruby/trema/openflow-switch.rb +0 -35
  228. data/ruby/trema/ordered-hash.rb +0 -75
  229. data/ruby/trema/packet-in.c +0 -1365
  230. data/ruby/trema/packet-in.h +0 -44
  231. data/ruby/trema/packet-queue.rb +0 -181
  232. data/ruby/trema/packetin-filter.rb +0 -124
  233. data/ruby/trema/path.rb +0 -85
  234. data/ruby/trema/phost.rb +0 -76
  235. data/ruby/trema/port-mod.c +0 -232
  236. data/ruby/trema/port-mod.h +0 -34
  237. data/ruby/trema/port-stats-reply.rb +0 -109
  238. data/ruby/trema/port-status-add.rb +0 -60
  239. data/ruby/trema/port-status-delete.rb +0 -60
  240. data/ruby/trema/port-status-modify.rb +0 -60
  241. data/ruby/trema/port-status.c +0 -192
  242. data/ruby/trema/port-status.h +0 -41
  243. data/ruby/trema/port.c +0 -398
  244. data/ruby/trema/port.h +0 -45
  245. data/ruby/trema/process.rb +0 -103
  246. data/ruby/trema/queue-get-config-reply.c +0 -205
  247. data/ruby/trema/queue-get-config-reply.h +0 -45
  248. data/ruby/trema/queue-get-config-request.c +0 -141
  249. data/ruby/trema/queue-get-config-request.h +0 -42
  250. data/ruby/trema/queue-stats-reply.rb +0 -76
  251. data/ruby/trema/ruby-switch.rb +0 -62
  252. data/ruby/trema/send-out-port.rb +0 -113
  253. data/ruby/trema/set-config.c +0 -174
  254. data/ruby/trema/set-config.h +0 -42
  255. data/ruby/trema/set-eth-addr.rb +0 -54
  256. data/ruby/trema/set-eth-dst-addr.rb +0 -52
  257. data/ruby/trema/set-eth-src-addr.rb +0 -53
  258. data/ruby/trema/set-ip-addr.rb +0 -54
  259. data/ruby/trema/set-ip-dst-addr.rb +0 -53
  260. data/ruby/trema/set-ip-src-addr.rb +0 -52
  261. data/ruby/trema/set-ip-tos.rb +0 -64
  262. data/ruby/trema/set-transport-dst-port.rb +0 -53
  263. data/ruby/trema/set-transport-port.rb +0 -53
  264. data/ruby/trema/set-transport-src-port.rb +0 -54
  265. data/ruby/trema/set-vlan-priority.rb +0 -66
  266. data/ruby/trema/set-vlan-vid.rb +0 -65
  267. data/ruby/trema/shell.rb +0 -37
  268. data/ruby/trema/shell/down.rb +0 -37
  269. data/ruby/trema/shell/killall.rb +0 -38
  270. data/ruby/trema/shell/link.rb +0 -59
  271. data/ruby/trema/shell/reset_stats.rb +0 -49
  272. data/ruby/trema/shell/run.rb +0 -67
  273. data/ruby/trema/shell/send_packets.rb +0 -40
  274. data/ruby/trema/shell/show_stats.rb +0 -47
  275. data/ruby/trema/shell/up.rb +0 -41
  276. data/ruby/trema/shell/vhost.rb +0 -42
  277. data/ruby/trema/shell/vswitch.rb +0 -47
  278. data/ruby/trema/stats-helper.rb +0 -63
  279. data/ruby/trema/stats-reply.c +0 -540
  280. data/ruby/trema/stats-reply.h +0 -51
  281. data/ruby/trema/stats-request.c +0 -715
  282. data/ruby/trema/stats-request.h +0 -40
  283. data/ruby/trema/strip-vlan-header.rb +0 -41
  284. data/ruby/trema/switch-daemon.rb +0 -90
  285. data/ruby/trema/switch-disconnected.c +0 -38
  286. data/ruby/trema/switch-disconnected.h +0 -36
  287. data/ruby/trema/switch-event.c +0 -648
  288. data/ruby/trema/switch-event.h +0 -27
  289. data/ruby/trema/switch-manager.rb +0 -119
  290. data/ruby/trema/switch.c +0 -197
  291. data/ruby/trema/switch.h +0 -40
  292. data/ruby/trema/switch.rb +0 -56
  293. data/ruby/trema/table-stats-reply.rb +0 -85
  294. data/ruby/trema/timers.rb +0 -95
  295. data/ruby/trema/trema-ruby-utils.c +0 -66
  296. data/ruby/trema/trema-ruby-utils.h +0 -42
  297. data/ruby/trema/trema.c +0 -126
  298. data/ruby/trema/tremashark.rb +0 -46
  299. data/ruby/trema/util.rb +0 -116
  300. data/ruby/trema/vendor-action.rb +0 -82
  301. data/ruby/trema/vendor-stats-reply.rb +0 -64
  302. data/ruby/trema/vendor.c +0 -230
  303. data/ruby/trema/vendor.h +0 -48
  304. data/ruby/trema/version.rb +0 -28
  305. data/spec/support/action.rb +0 -49
  306. data/spec/support/mandatory-option.rb +0 -53
  307. data/spec/support/matchers/constant.rb +0 -25
  308. data/spec/support/openflow-message.rb +0 -173
  309. data/spec/support/port-status.rb +0 -35
  310. data/spec/trema/app_spec.rb +0 -88
  311. data/spec/trema/barrier-reply_spec.rb +0 -43
  312. data/spec/trema/barrier-request_spec.rb +0 -92
  313. data/spec/trema/cli_spec.rb +0 -156
  314. data/spec/trema/default-logger_spec.rb +0 -46
  315. data/spec/trema/dsl/configuration_spec.rb +0 -120
  316. data/spec/trema/dsl/link_spec.rb +0 -50
  317. data/spec/trema/dsl/run_spec.rb +0 -72
  318. data/spec/trema/dsl/runner_spec.rb +0 -247
  319. data/spec/trema/dsl/switch_spec.rb +0 -69
  320. data/spec/trema/dsl/syntax_spec.rb +0 -110
  321. data/spec/trema/dsl/vhost_spec.rb +0 -144
  322. data/spec/trema/dsl/vswitch_spec.rb +0 -80
  323. data/spec/trema/echo-reply_spec.rb +0 -84
  324. data/spec/trema/echo-request_spec.rb +0 -128
  325. data/spec/trema/enqueue_spec.rb +0 -76
  326. data/spec/trema/error_spec.rb +0 -81
  327. data/spec/trema/executables_spec.rb +0 -54
  328. data/spec/trema/features-reply_spec.rb +0 -91
  329. data/spec/trema/features-request_spec.rb +0 -93
  330. data/spec/trema/flow-mod_spec.rb +0 -99
  331. data/spec/trema/flow-removed_spec.rb +0 -144
  332. data/spec/trema/get-config-reply_spec.rb +0 -43
  333. data/spec/trema/get-config-request_spec.rb +0 -92
  334. data/spec/trema/hardware-switch_spec.rb +0 -54
  335. data/spec/trema/hello_spec.rb +0 -63
  336. data/spec/trema/host_spec.rb +0 -191
  337. data/spec/trema/link_spec.rb +0 -62
  338. data/spec/trema/list-switches-reply_spec.rb +0 -46
  339. data/spec/trema/match_spec.rb +0 -111
  340. data/spec/trema/open-vswitch_spec.rb +0 -121
  341. data/spec/trema/openflow-error_spec.rb +0 -141
  342. data/spec/trema/packet-in_spec.rb +0 -717
  343. data/spec/trema/packet-out_spec.rb +0 -125
  344. data/spec/trema/packetin-filter_spec.rb +0 -39
  345. data/spec/trema/port-mod_spec.rb +0 -98
  346. data/spec/trema/port-status-add_spec.rb +0 -32
  347. data/spec/trema/port-status-delete_spec.rb +0 -32
  348. data/spec/trema/port-status-modify_spec.rb +0 -71
  349. data/spec/trema/port-status_spec.rb +0 -38
  350. data/spec/trema/port_spec.rb +0 -59
  351. data/spec/trema/process_spec.rb +0 -69
  352. data/spec/trema/queue-get-config-reply_spec.rb +0 -65
  353. data/spec/trema/queue-get-config-request_spec.rb +0 -67
  354. data/spec/trema/send-out-port_spec.rb +0 -106
  355. data/spec/trema/set-config_spec.rb +0 -78
  356. data/spec/trema/set-eth-addr_spec.rb +0 -62
  357. data/spec/trema/set-ip-addr_spec.rb +0 -81
  358. data/spec/trema/set-ip-tos_spec.rb +0 -70
  359. data/spec/trema/set-transport-dst-port_spec.rb +0 -65
  360. data/spec/trema/set-transport-src-port_spec.rb +0 -65
  361. data/spec/trema/set-vlan-priority_spec.rb +0 -65
  362. data/spec/trema/set-vlan-vid_spec.rb +0 -65
  363. data/spec/trema/shell/vhost_spec.rb +0 -58
  364. data/spec/trema/shell/vswitch_spec.rb +0 -87
  365. data/spec/trema/stats-reply_spec.rb +0 -363
  366. data/spec/trema/stats-request_spec.rb +0 -166
  367. data/spec/trema/strip-vlan-header_spec.rb +0 -44
  368. data/spec/trema/switch-daemon_spec.rb +0 -81
  369. data/spec/trema/switch-disconnected_spec.rb +0 -56
  370. data/spec/trema/switch-manager_spec.rb +0 -41
  371. data/spec/trema/tremashark_spec.rb +0 -39
  372. data/spec/trema/util_spec.rb +0 -88
  373. data/spec/trema/vendor-action_spec.rb +0 -75
  374. data/spec/trema/vendor_spec.rb +0 -76
  375. data/spec/trema_spec.rb +0 -94
  376. data/src/examples/cbench_switch/README +0 -21
  377. data/src/examples/cbench_switch/cbench-switch.rb +0 -38
  378. data/src/examples/cbench_switch/cbench_switch.c +0 -66
  379. data/src/examples/dumper/dumper.c +0 -362
  380. data/src/examples/dumper/dumper.conf +0 -7
  381. data/src/examples/dumper/dumper.rb +0 -195
  382. data/src/examples/hello_trema/.gitignore +0 -2
  383. data/src/examples/hello_trema/README.md +0 -2
  384. data/src/examples/hello_trema/hello-trema.rb +0 -30
  385. data/src/examples/hello_trema/hello_trema.c +0 -48
  386. data/src/examples/hello_trema/sample.conf +0 -1
  387. data/src/examples/learning_switch/README +0 -15
  388. data/src/examples/learning_switch/fdb.rb +0 -110
  389. data/src/examples/learning_switch/learning-switch.rb +0 -90
  390. data/src/examples/learning_switch/learning_switch.c +0 -217
  391. data/src/examples/learning_switch/learning_switch.conf +0 -18
  392. data/src/examples/list_switches/README +0 -19
  393. data/src/examples/list_switches/list-switches.rb +0 -43
  394. data/src/examples/list_switches/list_switches.c +0 -79
  395. data/src/examples/list_switches/list_switches.conf +0 -15
  396. data/src/examples/match_compare/match-compare.conf +0 -30
  397. data/src/examples/match_compare/match-compare.rb +0 -97
  398. data/src/examples/multi_learning_switch/README +0 -14
  399. data/src/examples/multi_learning_switch/multi-learning-switch.rb +0 -94
  400. data/src/examples/multi_learning_switch/multi_learning_switch.c +0 -294
  401. data/src/examples/multi_learning_switch/multi_learning_switch.conf +0 -17
  402. data/src/examples/openflow_message/README +0 -11
  403. data/src/examples/openflow_message/echo.c +0 -80
  404. data/src/examples/openflow_message/echo.rb +0 -56
  405. data/src/examples/openflow_message/example.rb +0 -60
  406. data/src/examples/openflow_message/features-request.rb +0 -96
  407. data/src/examples/openflow_message/features_request.c +0 -167
  408. data/src/examples/openflow_message/hello.c +0 -68
  409. data/src/examples/openflow_message/hello.rb +0 -43
  410. data/src/examples/openflow_message/set-config.rb +0 -57
  411. data/src/examples/openflow_message/set_config.c +0 -68
  412. data/src/examples/openflow_message/vendor-action.rb +0 -43
  413. data/src/examples/openflow_message/vendor-stats-request.rb +0 -66
  414. data/src/examples/openflow_message/vendor_action.c +0 -103
  415. data/src/examples/openflow_switch/echo_switch.c +0 -89
  416. data/src/examples/openflow_switch/hello_switch.c +0 -85
  417. data/src/examples/packet_in/README +0 -15
  418. data/src/examples/packet_in/packet-in.rb +0 -37
  419. data/src/examples/packet_in/packet_in.c +0 -53
  420. data/src/examples/packet_in/packet_in.conf +0 -15
  421. data/src/examples/packetin_filter_config/README +0 -12
  422. data/src/examples/packetin_filter_config/add_filter.c +0 -71
  423. data/src/examples/packetin_filter_config/delete_filter.c +0 -63
  424. data/src/examples/packetin_filter_config/delete_filter_strict.c +0 -73
  425. data/src/examples/packetin_filter_config/dump_filter.c +0 -63
  426. data/src/examples/packetin_filter_config/dump_filter_strict.c +0 -73
  427. data/src/examples/packetin_filter_config/packetin_filter_config.c +0 -132
  428. data/src/examples/packetin_filter_config/packetin_filter_config.conf +0 -7
  429. data/src/examples/packetin_filter_config/utils.c +0 -100
  430. data/src/examples/packetin_filter_config/utils.h +0 -40
  431. data/src/examples/patch_panel/network.conf +0 -14
  432. data/src/examples/patch_panel/patch-panel.conf +0 -1
  433. data/src/examples/patch_panel/patch-panel.rb +0 -59
  434. data/src/examples/repeater_hub/README +0 -8
  435. data/src/examples/repeater_hub/repeater-hub.rb +0 -41
  436. data/src/examples/repeater_hub/repeater-hub_spec.rb +0 -154
  437. data/src/examples/repeater_hub/repeater_hub.c +0 -81
  438. data/src/examples/repeater_hub/repeater_hub.conf +0 -28
  439. data/src/examples/simple_router/README +0 -18
  440. data/src/examples/simple_router/arp-table.rb +0 -81
  441. data/src/examples/simple_router/interface.rb +0 -90
  442. data/src/examples/simple_router/routing-table.rb +0 -60
  443. data/src/examples/simple_router/simple-router.rb +0 -191
  444. data/src/examples/simple_router/simple_router.conf +0 -24
  445. data/src/examples/simple_router/simple_router_netns.conf +0 -15
  446. data/src/examples/simple_router/simple_router_network.conf +0 -6
  447. data/src/examples/switch_event_config/.gitignore +0 -6
  448. data/src/examples/switch_event_config/add_forward_entry.c +0 -227
  449. data/src/examples/switch_event_config/delete_forward_entry.c +0 -226
  450. data/src/examples/switch_event_config/dump_forward_entries.c +0 -190
  451. data/src/examples/switch_event_config/network.conf +0 -2
  452. data/src/examples/switch_event_config/set_forward_entries.c +0 -210
  453. data/src/examples/switch_info/README +0 -13
  454. data/src/examples/switch_info/switch-info.rb +0 -44
  455. data/src/examples/switch_info/switch_info.c +0 -78
  456. data/src/examples/switch_info/switch_info.conf +0 -3
  457. data/src/examples/switch_monitor/switch-monitor.conf +0 -3
  458. data/src/examples/switch_monitor/switch-monitor.rb +0 -56
  459. data/src/examples/switch_monitor/switch_monitor.c +0 -152
  460. data/src/examples/traffic_monitor/counter.c +0 -72
  461. data/src/examples/traffic_monitor/counter.h +0 -46
  462. data/src/examples/traffic_monitor/counter.rb +0 -44
  463. data/src/examples/traffic_monitor/fdb.c +0 -74
  464. data/src/examples/traffic_monitor/fdb.h +0 -48
  465. data/src/examples/traffic_monitor/fdb.rb +0 -42
  466. data/src/examples/traffic_monitor/traffic-monitor.rb +0 -98
  467. data/src/examples/traffic_monitor/traffic_monitor.c +0 -161
  468. data/src/examples/traffic_monitor/traffic_monitor.conf +0 -16
  469. data/src/examples/transparent_firewall/README.md +0 -61
  470. data/src/examples/transparent_firewall/aggregated-delegated-afrinic.txt +0 -713
  471. data/src/examples/transparent_firewall/aggregated-delegated-apnic.txt +0 -3440
  472. data/src/examples/transparent_firewall/aggregated-delegated-arin.txt +0 -11342
  473. data/src/examples/transparent_firewall/aggregated-delegated-lacnic.txt +0 -1937
  474. data/src/examples/transparent_firewall/aggregated-delegated-ripencc.txt +0 -7329
  475. data/src/examples/transparent_firewall/block-rfc1918.rb +0 -86
  476. data/src/examples/transparent_firewall/pass-delegated.rb +0 -178
  477. data/src/examples/transparent_firewall/regen_aggregated.sh +0 -53
  478. data/src/examples/transparent_firewall/stats-to-cidrs.rb +0 -59
  479. data/src/lib/arp.h +0 -64
  480. data/src/lib/bool.h +0 -47
  481. data/src/lib/buffer.c +0 -304
  482. data/src/lib/buffer.h +0 -54
  483. data/src/lib/byteorder.c +0 -571
  484. data/src/lib/byteorder.h +0 -108
  485. data/src/lib/checks.h +0 -40
  486. data/src/lib/chibach.c +0 -392
  487. data/src/lib/chibach.h +0 -69
  488. data/src/lib/chibach_private.c +0 -168
  489. data/src/lib/chibach_private.h +0 -50
  490. data/src/lib/daemon.c +0 -429
  491. data/src/lib/daemon.h +0 -40
  492. data/src/lib/doubly_linked_list.c +0 -284
  493. data/src/lib/doubly_linked_list.h +0 -86
  494. data/src/lib/ether.c +0 -47
  495. data/src/lib/ether.h +0 -92
  496. data/src/lib/etherip.h +0 -44
  497. data/src/lib/event_forward_interface.c +0 -788
  498. data/src/lib/event_forward_interface.h +0 -138
  499. data/src/lib/event_handler.c +0 -419
  500. data/src/lib/event_handler.h +0 -57
  501. data/src/lib/external_callback.c +0 -126
  502. data/src/lib/external_callback.h +0 -46
  503. data/src/lib/hash_table.c +0 -415
  504. data/src/lib/hash_table.h +0 -136
  505. data/src/lib/icmp.h +0 -72
  506. data/src/lib/igmp.h +0 -48
  507. data/src/lib/ipv4.h +0 -64
  508. data/src/lib/ipv6.h +0 -46
  509. data/src/lib/linked_list.c +0 -244
  510. data/src/lib/linked_list.h +0 -84
  511. data/src/lib/log.c +0 -636
  512. data/src/lib/log.h +0 -77
  513. data/src/lib/management_interface.c +0 -359
  514. data/src/lib/management_interface.h +0 -40
  515. data/src/lib/management_service_interface.c +0 -102
  516. data/src/lib/management_service_interface.h +0 -134
  517. data/src/lib/match.h +0 -82
  518. data/src/lib/match_table.c +0 -606
  519. data/src/lib/match_table.h +0 -49
  520. data/src/lib/message_queue.c +0 -143
  521. data/src/lib/message_queue.h +0 -59
  522. data/src/lib/messenger.c +0 -1821
  523. data/src/lib/messenger.h +0 -145
  524. data/src/lib/openflow_application_interface.c +0 -1800
  525. data/src/lib/openflow_application_interface.h +0 -359
  526. data/src/lib/openflow_message.c +0 -4240
  527. data/src/lib/openflow_message.h +0 -291
  528. data/src/lib/openflow_service_interface.h +0 -58
  529. data/src/lib/openflow_switch_interface.c +0 -1378
  530. data/src/lib/openflow_switch_interface.h +0 -262
  531. data/src/lib/packet_info.c +0 -336
  532. data/src/lib/packet_info.h +0 -233
  533. data/src/lib/packet_parser.c +0 -522
  534. data/src/lib/packetin_filter_interface.c +0 -292
  535. data/src/lib/packetin_filter_interface.h +0 -125
  536. data/src/lib/persistent_storage.c +0 -478
  537. data/src/lib/persistent_storage.h +0 -44
  538. data/src/lib/secure_channel.c +0 -496
  539. data/src/lib/secure_channel.h +0 -43
  540. data/src/lib/stat.c +0 -248
  541. data/src/lib/stat.h +0 -51
  542. data/src/lib/tcp.h +0 -62
  543. data/src/lib/timer.c +0 -349
  544. data/src/lib/timer.h +0 -51
  545. data/src/lib/trema.c +0 -776
  546. data/src/lib/trema.h +0 -80
  547. data/src/lib/trema.hpp +0 -49
  548. data/src/lib/trema_private.c +0 -175
  549. data/src/lib/trema_private.h +0 -64
  550. data/src/lib/trema_wrapper.c +0 -59
  551. data/src/lib/trema_wrapper.h +0 -66
  552. data/src/lib/udp.h +0 -41
  553. data/src/lib/utility.c +0 -625
  554. data/src/lib/utility.h +0 -84
  555. data/src/lib/wrapper.c +0 -121
  556. data/src/lib/wrapper.h +0 -76
  557. data/src/management/application.c +0 -222
  558. data/src/management/echo.c +0 -183
  559. data/src/management/set_logging_level.c +0 -151
  560. data/src/management/show_stats.c +0 -148
  561. data/src/management/trema_manager +0 -184
  562. data/src/packetin_filter/README +0 -17
  563. data/src/packetin_filter/packetin_filter.c +0 -575
  564. data/src/switch_manager/README +0 -20
  565. data/src/switch_manager/cookie_table.c +0 -290
  566. data/src/switch_manager/cookie_table.h +0 -70
  567. data/src/switch_manager/dpid_table.c +0 -108
  568. data/src/switch_manager/dpid_table.h +0 -43
  569. data/src/switch_manager/event_forward_entry_manipulation.c +0 -120
  570. data/src/switch_manager/event_forward_entry_manipulation.h +0 -31
  571. data/src/switch_manager/ofpmsg_recv.c +0 -497
  572. data/src/switch_manager/ofpmsg_recv.h +0 -39
  573. data/src/switch_manager/ofpmsg_send.c +0 -274
  574. data/src/switch_manager/ofpmsg_send.h +0 -51
  575. data/src/switch_manager/secure_channel_listener.c +0 -296
  576. data/src/switch_manager/secure_channel_listener.h +0 -40
  577. data/src/switch_manager/secure_channel_receiver.c +0 -129
  578. data/src/switch_manager/secure_channel_receiver.h +0 -40
  579. data/src/switch_manager/secure_channel_sender.c +0 -131
  580. data/src/switch_manager/secure_channel_sender.h +0 -41
  581. data/src/switch_manager/service_interface.c +0 -180
  582. data/src/switch_manager/service_interface.h +0 -44
  583. data/src/switch_manager/switch.c +0 -988
  584. data/src/switch_manager/switch.h +0 -50
  585. data/src/switch_manager/switch_manager.c +0 -643
  586. data/src/switch_manager/switch_manager.h +0 -65
  587. data/src/switch_manager/switch_option.c +0 -30
  588. data/src/switch_manager/switch_option.h +0 -41
  589. data/src/switch_manager/switchinfo.h +0 -81
  590. data/src/switch_manager/xid_table.c +0 -182
  591. data/src/switch_manager/xid_table.h +0 -53
  592. data/src/tremashark/README +0 -79
  593. data/src/tremashark/packet_capture.c +0 -358
  594. data/src/tremashark/pcap_private.h +0 -45
  595. data/src/tremashark/pcap_queue.c +0 -195
  596. data/src/tremashark/pcap_queue.h +0 -56
  597. data/src/tremashark/plugin/.gitignore +0 -6
  598. data/src/tremashark/plugin/packet-trema/.gitignore +0 -5
  599. data/src/tremashark/plugin/packet-trema/Makefile +0 -77
  600. data/src/tremashark/plugin/packet-trema/Makefile.am +0 -110
  601. data/src/tremashark/plugin/packet-trema/Makefile.common +0 -29
  602. data/src/tremashark/plugin/packet-trema/moduleinfo.h +0 -39
  603. data/src/tremashark/plugin/packet-trema/packet-trema.c +0 -1671
  604. data/src/tremashark/plugin/packet-trema/plugin.c +0 -31
  605. data/src/tremashark/plugin/user_dlts +0 -2
  606. data/src/tremashark/queue.c +0 -167
  607. data/src/tremashark/queue.h +0 -58
  608. data/src/tremashark/stdin_relay.c +0 -257
  609. data/src/tremashark/syslog_relay.c +0 -247
  610. data/src/tremashark/tremashark.c +0 -554
  611. data/trema +0 -11
  612. data/trema-config +0 -11
  613. data/unittests/buffer_stubs.c +0 -72
  614. data/unittests/cmockery_trema.c +0 -121
  615. data/unittests/cmockery_trema.h +0 -95
  616. data/unittests/lib/buffer_test.c +0 -368
  617. data/unittests/lib/byteorder_test.c +0 -1798
  618. data/unittests/lib/daemon_test.c +0 -804
  619. data/unittests/lib/doubly_linked_list_test.c +0 -348
  620. data/unittests/lib/ether_test.c +0 -125
  621. data/unittests/lib/event_forward_interface_test.c +0 -1676
  622. data/unittests/lib/external_callback_test.c +0 -282
  623. data/unittests/lib/hash_table_test.c +0 -278
  624. data/unittests/lib/linked_list_test.c +0 -434
  625. data/unittests/lib/log_test.c +0 -672
  626. data/unittests/lib/management_interface_test.c +0 -238
  627. data/unittests/lib/management_service_interface_test.c +0 -317
  628. data/unittests/lib/match_table_test.c +0 -1507
  629. data/unittests/lib/message_queue_test.c +0 -381
  630. data/unittests/lib/messenger_test.c +0 -623
  631. data/unittests/lib/openflow_application_interface_test.c +0 -3713
  632. data/unittests/lib/openflow_message_test.c +0 -8047
  633. data/unittests/lib/packet_info_test.c +0 -558
  634. data/unittests/lib/packet_parser_test.c +0 -784
  635. data/unittests/lib/packetin_filter_interface_test.c +0 -721
  636. data/unittests/lib/persistent_storage_test.c +0 -800
  637. data/unittests/lib/stat_test.c +0 -433
  638. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  639. data/unittests/lib/test_packets/arp_req.cap +0 -0
  640. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  641. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  642. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  643. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  644. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  645. data/unittests/lib/test_packets/ipx.cap +0 -0
  646. data/unittests/lib/test_packets/lldp.cap +0 -0
  647. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  648. data/unittests/lib/test_packets/rarp_req.cap +0 -0
  649. data/unittests/lib/test_packets/tcp.cap +0 -0
  650. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  651. data/unittests/lib/test_packets/udp.cap +0 -0
  652. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  653. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  654. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  655. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  656. data/unittests/lib/timer_test.c +0 -246
  657. data/unittests/lib/trema_private_test.c +0 -321
  658. data/unittests/lib/trema_test.c +0 -1030
  659. data/unittests/lib/utility_test.c +0 -711
  660. data/unittests/lib/wrapper_test.c +0 -228
  661. data/unittests/packetin_filter/packetin_filter_test.c +0 -476
  662. data/unittests/switch_manager/switch_manager_test.c +0 -1183
  663. data/unittests/wrapper_stubs.c +0 -37
  664. data/vendor/.gitignore +0 -6
  665. data/vendor/README.md +0 -29
  666. data/vendor/cmockery-20110428.tar.gz +0 -0
  667. data/vendor/oflops-0.03.trema1.tar.gz +0 -0
  668. data/vendor/oflops_no_snmp+1.0.0.diff +0 -340
  669. data/vendor/openflow-1.0.0.tar.gz +0 -0
  670. data/vendor/openflow.git.tar.gz +0 -0
  671. data/vendor/openvswitch-1.2.2.trema1.tar.gz +0 -0
  672. data/vendor/openvswitch-1.2.2_librt-check.diff +0 -21
  673. data/vendor/packet-openflow.diff +0 -13
  674. data/vendor/ruby-ifconfig-1.2/COPYING +0 -340
  675. data/vendor/ruby-ifconfig-1.2/Changelog +0 -16
  676. data/vendor/ruby-ifconfig-1.2/INSTALL +0 -239
  677. data/vendor/ruby-ifconfig-1.2/README +0 -38
  678. data/vendor/ruby-ifconfig-1.2/Rakefile +0 -14
  679. data/vendor/ruby-ifconfig-1.2/TODO +0 -8
  680. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +0 -17
  681. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +0 -10
  682. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +0 -14
  683. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +0 -17
  684. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +0 -24
  685. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +0 -60
  686. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +0 -20
  687. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +0 -10
  688. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +0 -36
  689. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +0 -10
  690. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +0 -71
  691. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +0 -72
  692. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +0 -69
  693. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +0 -3
  694. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +0 -84
  695. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +0 -130
  696. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +0 -49
  697. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +0 -43
  698. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +0 -112
  699. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +0 -55
  700. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +0 -38
  701. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +0 -77
  702. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +0 -4
  703. data/vendor/ruby-ifconfig-1.2/setup.rb +0 -1306
  704. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +0 -35
  705. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +0 -33
  706. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +0 -35
  707. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +0 -4
  708. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +0 -31
  709. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +0 -33
  710. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +0 -33
  711. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +0 -35
  712. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +0 -40
  713. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +0 -39
  714. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +0 -40
  715. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +0 -49
  716. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +0 -39
  717. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +0 -39
  718. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +0 -44
@@ -1,145 +0,0 @@
1
- /*
2
- * Trema messenger library.
3
- *
4
- * Copyright (C) 2008-2013 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 MESSENGER_H
22
- #define MESSENGER_H
23
-
24
-
25
- #include <net/if.h>
26
- #include <stdint.h>
27
- #include <stdlib.h>
28
- #include <time.h>
29
- #include "checks.h"
30
- #include "bool.h"
31
-
32
-
33
- #define MESSENGER_SERVICE_NAME_LENGTH 32
34
-
35
-
36
- typedef struct message_header {
37
- uint8_t version; // version = 0 (unused)
38
- uint8_t message_type; // MESSAGE_TYPE_
39
- uint16_t tag; // user defined
40
- uint32_t message_length; // message length including header
41
- uint8_t value[ 0 ];
42
- } message_header;
43
-
44
- typedef struct messenger_context_handle {
45
- uint32_t transaction_id;
46
- uint16_t service_name_len;
47
- uint16_t pad;
48
- char service_name[ 0 ];
49
- } messenger_context_handle;
50
-
51
- /* message dump format:
52
- * +-------------------+--------+------------+----+
53
- * |message_dump_header|app_name|service_name|data|
54
- * +-------------------+--------+------------+----+
55
- */
56
- typedef struct message_dump_header {
57
- struct { // same as struct timespec but fixed length
58
- uint32_t sec;
59
- uint32_t nsec;
60
- } sent_time;
61
- uint16_t app_name_length;
62
- uint16_t service_name_length;
63
- uint32_t data_length;
64
- } message_dump_header;
65
-
66
- enum {
67
- MESSENGER_DUMP_SENT,
68
- MESSENGER_DUMP_RECEIVED,
69
- MESSENGER_DUMP_RECV_CONNECTED,
70
- MESSENGER_DUMP_RECV_OVERFLOW,
71
- MESSENGER_DUMP_RECV_CLOSED,
72
- MESSENGER_DUMP_SEND_CONNECTED,
73
- MESSENGER_DUMP_SEND_REFUSED,
74
- MESSENGER_DUMP_SEND_OVERFLOW,
75
- MESSENGER_DUMP_SEND_CLOSED,
76
- MESSENGER_DUMP_LOGGER,
77
- MESSENGER_DUMP_PCAP,
78
- MESSENGER_DUMP_SYSLOG,
79
- MESSENGER_DUMP_TEXT,
80
- };
81
-
82
- typedef struct pcap_dump_header {
83
- uint32_t datalink;
84
- uint8_t interface[ IF_NAMESIZE ];
85
- } pcap_dump_header;
86
-
87
- typedef struct logger_dump_header {
88
- struct {
89
- uint32_t sec;
90
- uint32_t nsec;
91
- } sent_time;
92
- } logger_dump_header;
93
-
94
- typedef struct syslog_dump_header {
95
- struct {
96
- uint32_t sec;
97
- uint32_t nsec;
98
- } sent_time;
99
- } syslog_dump_header;
100
-
101
- typedef struct text_dump_header {
102
- struct {
103
- uint32_t sec;
104
- uint32_t nsec;
105
- } sent_time;
106
- } text_dump_header;
107
-
108
-
109
- typedef void ( *callback_message_received )( uint16_t tag, void *data, size_t len );
110
-
111
-
112
- extern bool ( *add_message_received_callback )( const char *service_name, const callback_message_received function );
113
- extern bool ( *rename_message_received_callback )( const char *old_service_name, const char *new_service_name );
114
- extern bool ( *delete_message_received_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len ) );
115
- extern bool ( *add_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) );
116
- extern bool ( *rename_message_requested_callback )( const char *old_service_name, const char *new_service_name );
117
- extern bool ( *delete_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) );
118
- extern bool ( *add_message_replied_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) );
119
- extern bool ( *delete_message_replied_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) );
120
- extern bool ( *send_message )( const char *service_name, const uint16_t tag, const void *data, size_t len );
121
- extern bool ( *send_request_message )( const char *to_service_name, const char *from_service_name, const uint16_t tag, const void *data, size_t len, void *user_data );
122
- extern bool ( *send_reply_message )( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t len );
123
- extern bool ( *clear_send_queue )( const char *service_name );
124
-
125
- bool init_messenger( const char *working_directory );
126
- bool finalize_messenger( void );
127
-
128
- bool start_messenger( void );
129
- int flush_messenger( void );
130
- bool stop_messenger( void );
131
-
132
- void start_messenger_dump( const char *dump_app_name, const char *dump_service_name );
133
- void stop_messenger_dump( void );
134
- bool messenger_dump_enabled( void );
135
-
136
-
137
- #endif // MESSENGER_H
138
-
139
-
140
- /*
141
- * Local variables:
142
- * c-basic-offset: 2
143
- * indent-tabs-mode: nil
144
- * End:
145
- */
@@ -1,1800 +0,0 @@
1
- /*
2
- * Copyright (C) 2008-2013 NEC Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License, version 2, as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
12
- *
13
- * You should have received a copy of the GNU General Public License along
14
- * with this program; if not, write to the Free Software Foundation, Inc.,
15
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
- */
17
-
18
-
19
- #include <assert.h>
20
- #include <inttypes.h>
21
- #include <stdio.h>
22
- #include <string.h>
23
- #include <unistd.h>
24
- #include "trema.h"
25
- #include "log.h"
26
- #include "messenger.h"
27
- #include "openflow_application_interface.h"
28
- #include "openflow_message.h"
29
- #include "packet_info.h"
30
- #include "wrapper.h"
31
-
32
-
33
- #ifdef UNIT_TESTING
34
-
35
- #define static
36
-
37
- #ifdef get_trema_name
38
- #undef get_trema_name
39
- #endif
40
- #define get_trema_name mock_get_trema_name
41
- const char *mock_get_trema_name( void );
42
-
43
- #ifdef send_message
44
- #undef send_message
45
- #endif
46
- #define send_message mock_send_message
47
- bool mock_send_message( char *service_name, uint16_t tag, void *data, size_t len );
48
-
49
- #ifdef send_request_message
50
- #undef send_request_message
51
- #endif
52
- #define send_request_message mock_send_request_message
53
- bool mock_send_request_message( const char *to_service_name, char *from_service_name, uint16_t tag,
54
- void *data, size_t len, void *user_data );
55
-
56
- #ifdef init_openflow_message
57
- #undef init_openflow_message
58
- #endif
59
- #define init_openflow_message mock_init_openflow_message
60
- bool mock_init_openflow_message( void );
61
-
62
- #ifdef add_message_received_callback
63
- #undef add_message_received_callback
64
- #endif
65
- #define add_message_received_callback mock_add_message_received_callback
66
- bool mock_add_message_received_callback( char *service_name,
67
- void ( *callback )( uint16_t tag, void *data, size_t len ) );
68
-
69
- #ifdef add_message_replied_callback
70
- #undef add_message_replied_callback
71
- #endif
72
- #define add_message_replied_callback mock_add_message_replied_callback
73
- bool mock_add_message_replied_callback( char *service_name,
74
- void ( *callback )( uint16_t tag, void *data, size_t len, void *yser_data ) );
75
-
76
- #ifdef delete_message_received_callback
77
- #undef delete_message_received_callback
78
- #endif
79
- #define delete_message_received_callback mock_delete_message_received_callback
80
- bool mock_delete_message_received_callback( char *service_name,
81
- void ( *callback )( uint16_t tag, void *data, size_t len ) );
82
-
83
- #ifdef delete_message_replied_callback
84
- #undef delete_message_replied_callback
85
- #endif
86
- #define delete_message_replied_callback mock_delete_message_replied_callback
87
- bool mock_delete_message_replied_callback( char *service_name,
88
- void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) );
89
-
90
- #ifdef clear_send_queue
91
- #undef clear_send_queue
92
- #endif
93
- #define clear_send_queue mock_clear_send_queue
94
- bool mock_clear_send_queue( const char *service_name );
95
-
96
- #ifdef getpid
97
- #undef getpid
98
- #endif
99
- #define getpid mock_getpid
100
- pid_t mock_getpid( void );
101
-
102
- #ifdef parse_packet
103
- #undef parse_packet
104
- #endif
105
- #define parse_packet mock_parse_packet
106
- bool mock_parse_packet( buffer *buf );
107
-
108
- #ifdef die
109
- #undef die
110
- #endif
111
- #define die mock_die
112
- void mock_die( const char *format, ... );
113
-
114
- #ifdef debug
115
- #undef debug
116
- #endif
117
- #define debug mock_debug
118
- extern void mock_debug( const char *format, ... );
119
-
120
- #ifdef info
121
- #undef info
122
- #endif
123
- #define info mock_info
124
- extern void mock_info( const char *format, ... );
125
-
126
- #ifdef warn
127
- #undef warn
128
- #endif
129
- #define warn mock_warn
130
- extern void mock_warn( const char *format, ... );
131
-
132
- #ifdef error
133
- #undef error
134
- #endif
135
- #define error mock_error
136
- extern void mock_error( const char *format, ... );
137
-
138
- #ifdef critical
139
- #undef critical
140
- #endif
141
- #define critical mock_critical
142
- extern void mock_critical( const char *format, ... );
143
-
144
- #endif // UNIT_TESTING
145
-
146
- static bool openflow_application_interface_initialized = false;
147
- static openflow_event_handlers_t event_handlers;
148
- static char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
149
-
150
-
151
- static void handle_message( uint16_t message_type, void *data, size_t length );
152
- static void handle_list_switches_reply( uint16_t message_type, void *dpid, size_t length, void *user_data );
153
-
154
-
155
- enum {
156
- OPENFLOW_MESSAGE_SEND = 0,
157
- OPENFLOW_MESSAGE_RECEIVE,
158
- };
159
-
160
-
161
- bool
162
- openflow_application_interface_is_initialized() {
163
- return openflow_application_interface_initialized;
164
- }
165
-
166
-
167
- static bool
168
- maybe_init_openflow_application_interface() {
169
- if ( !openflow_application_interface_is_initialized() ) {
170
- debug( "OpenFlow Application Interface is not initialized yet. Initializing..." );
171
- return init_openflow_application_interface( get_trema_name() );
172
- }
173
- return true;
174
- }
175
-
176
-
177
- bool
178
- init_openflow_application_interface( const char *custom_service_name ) {
179
- assert( custom_service_name != NULL );
180
-
181
- debug( "Initializing OpenFlow Application Interface." );
182
-
183
- if ( openflow_application_interface_is_initialized() ) {
184
- error( "OpenFlow Application Interface is already initialized." );
185
- return false;
186
- }
187
-
188
- memset( &event_handlers, 0, sizeof( openflow_event_handlers_t ) );
189
- memset( service_name, '\0', sizeof( service_name ) );
190
-
191
- size_t length = strlen( custom_service_name ) + 1;
192
- if ( length > MESSENGER_SERVICE_NAME_LENGTH ) {
193
- error( "Too long custom service name ( %s ).", custom_service_name );
194
- return false;
195
- }
196
- assert( length <= sizeof( service_name ) );
197
- memcpy( service_name, custom_service_name, length );
198
-
199
- init_openflow_message();
200
-
201
- add_message_received_callback( service_name, handle_message );
202
- add_message_replied_callback( service_name, handle_list_switches_reply );
203
-
204
- openflow_application_interface_initialized = true;
205
-
206
- return true;
207
- }
208
-
209
-
210
- bool
211
- finalize_openflow_application_interface() {
212
- debug( "Finalizing OpenFlow Application Interface." );
213
-
214
- assert( openflow_application_interface_initialized );
215
-
216
- delete_message_received_callback( service_name, handle_message );
217
- delete_message_replied_callback( service_name, handle_list_switches_reply );
218
-
219
- memset( &event_handlers, 0, sizeof( openflow_event_handlers_t ) );
220
- memset( service_name, '\0', sizeof( service_name ) );
221
-
222
- openflow_application_interface_initialized = false;
223
-
224
- return true;
225
- }
226
-
227
-
228
- bool
229
- set_openflow_event_handlers( const openflow_event_handlers_t handlers ) {
230
- maybe_init_openflow_application_interface();
231
- assert( openflow_application_interface_initialized );
232
-
233
- memcpy( &event_handlers, &handlers, sizeof( event_handlers ) );
234
-
235
- return true;
236
- }
237
-
238
-
239
- bool
240
- _set_switch_ready_handler( bool simple_callback, void *callback, void *user_data ) {
241
- if ( callback == NULL ) {
242
- die( "Invalid callback function for switch_ready event." );
243
- }
244
- assert( callback != NULL );
245
-
246
- maybe_init_openflow_application_interface();
247
- assert( openflow_application_interface_initialized );
248
-
249
- debug( "Setting a switch ready handler ( callback = %p, user_data = %p ).",
250
- callback, user_data );
251
-
252
- event_handlers.simple_switch_ready_callback = simple_callback;
253
- event_handlers.switch_ready_callback = callback;
254
- event_handlers.switch_ready_user_data = user_data;
255
-
256
- return true;
257
- }
258
-
259
-
260
- bool
261
- set_switch_disconnected_handler( switch_disconnected_handler callback, void *user_data ) {
262
- if ( callback == NULL ) {
263
- die( "Callback function ( switch_disconnected_handler ) must not be NULL." );
264
- }
265
- assert( callback != NULL );
266
-
267
- maybe_init_openflow_application_interface();
268
- assert( openflow_application_interface_initialized );
269
-
270
- debug( "Setting a switch disconnected handler ( callback = %p, user_data = %p ).",
271
- callback, user_data );
272
-
273
- event_handlers.switch_disconnected_callback = callback;
274
- event_handlers.switch_disconnected_user_data = user_data;
275
-
276
- return true;
277
- }
278
-
279
-
280
- bool
281
- set_error_handler( error_handler callback, void *user_data ) {
282
- if ( callback == NULL ) {
283
- die( "Callback function ( error_handler ) must not be NULL." );
284
- }
285
- assert( callback != NULL );
286
-
287
- maybe_init_openflow_application_interface();
288
- assert( openflow_application_interface_initialized );
289
-
290
- debug( "Setting an error handler ( callback = %p, user_data = %p ).",
291
- callback, user_data );
292
-
293
- event_handlers.error_callback = callback;
294
- event_handlers.error_user_data = user_data;
295
-
296
- return true;
297
- }
298
-
299
-
300
- bool
301
- set_echo_reply_handler( echo_reply_handler callback, void *user_data ) {
302
- if ( callback == NULL ) {
303
- die( "Callback function ( echo_reply_handler ) must not be NULL." );
304
- }
305
- assert( callback != NULL );
306
-
307
- maybe_init_openflow_application_interface();
308
- assert( openflow_application_interface_initialized );
309
-
310
- debug( "Setting a echo reply handler ( callback = %p, user_data = %p ).",
311
- callback, user_data );
312
-
313
- event_handlers.echo_reply_callback = callback;
314
- event_handlers.echo_reply_user_data = user_data;
315
-
316
- return true;
317
- }
318
-
319
-
320
- bool
321
- set_vendor_handler( vendor_handler callback, void *user_data ) {
322
- if ( callback == NULL ) {
323
- die( "Callback function ( vendor_handler ) must not be NULL." );
324
- }
325
- assert( callback != NULL );
326
-
327
- maybe_init_openflow_application_interface();
328
- assert( openflow_application_interface_initialized );
329
-
330
- debug( "Setting a vendor handler ( callback = %p, user_data = %p ).",
331
- callback, user_data );
332
-
333
- event_handlers.vendor_callback = callback;
334
- event_handlers.vendor_user_data = user_data;
335
-
336
- return true;
337
- }
338
-
339
-
340
- bool
341
- set_features_reply_handler( features_reply_handler callback, void *user_data ) {
342
- if ( callback == NULL ) {
343
- die( "Callback function ( features_reply_handler ) must not be NULL." );
344
- }
345
- assert( callback != NULL );
346
-
347
- maybe_init_openflow_application_interface();
348
- assert( openflow_application_interface_initialized );
349
-
350
- debug( "Setting a features reply handler ( callback = %p, user_data = %p ).",
351
- callback, user_data );
352
-
353
- event_handlers.features_reply_callback = callback;
354
- event_handlers.features_reply_user_data = user_data;
355
-
356
- return true;
357
- }
358
-
359
-
360
- bool
361
- set_get_config_reply_handler( get_config_reply_handler callback, void *user_data ) {
362
- if ( callback == NULL ) {
363
- die( "Callback function ( get_config_reply_handler ) must not be NULL." );
364
- }
365
- assert( callback != NULL );
366
-
367
- maybe_init_openflow_application_interface();
368
- assert( openflow_application_interface_initialized );
369
-
370
- debug( "Setting a get config reply handler ( callback = %p, user_data = %p ).",
371
- callback, user_data );
372
-
373
- event_handlers.get_config_reply_callback = callback;
374
- event_handlers.get_config_reply_user_data = user_data;
375
-
376
- return true;
377
- }
378
-
379
-
380
- bool
381
- _set_packet_in_handler( bool simple_callback, void *callback, void *user_data ) {
382
- if ( callback == NULL ) {
383
- die( "Callback function (packet_in_handler) must not be NULL." );
384
- }
385
- assert( callback != NULL );
386
-
387
- maybe_init_openflow_application_interface();
388
- assert( openflow_application_interface_initialized );
389
-
390
- debug( "Setting a packet-in handler (callback = %p, user_data = %p).", callback, user_data );
391
-
392
- event_handlers.simple_packet_in_callback = simple_callback;
393
- event_handlers.packet_in_callback = callback;
394
- event_handlers.packet_in_user_data = user_data;
395
-
396
- return true;
397
- }
398
-
399
-
400
- bool
401
- _set_flow_removed_handler( bool simple_callback, void *callback, void *user_data ) {
402
- if ( callback == NULL ) {
403
- die( "Callback function (flow_removed_handler) must not be NULL." );
404
- }
405
- assert( callback != NULL );
406
-
407
- maybe_init_openflow_application_interface();
408
- assert( openflow_application_interface_initialized );
409
-
410
- debug( "Setting a flow removed handler (callback = %p, user_data = %p).", callback, user_data );
411
-
412
- event_handlers.simple_flow_removed_callback = simple_callback;
413
- event_handlers.flow_removed_callback = callback;
414
- event_handlers.flow_removed_user_data = user_data;
415
-
416
- return true;
417
- }
418
-
419
-
420
- bool
421
- set_port_status_handler( port_status_handler callback, void *user_data ) {
422
- if ( callback == NULL ) {
423
- die( "Callback function ( port_status_handler ) must not be NULL." );
424
- }
425
- assert( callback != NULL );
426
-
427
- maybe_init_openflow_application_interface();
428
- assert( openflow_application_interface_initialized );
429
-
430
- debug( "Setting a port status handler ( callback = %p, user_data = %p ).",
431
- callback, user_data );
432
-
433
- event_handlers.port_status_callback = callback;
434
- event_handlers.port_status_user_data = user_data;
435
-
436
- return true;
437
- }
438
-
439
-
440
- bool
441
- set_stats_reply_handler( stats_reply_handler callback, void *user_data ) {
442
- if ( callback == NULL ) {
443
- die( "Callback function ( stats_reply_handler ) must not be NULL." );
444
- }
445
- assert( callback != NULL );
446
-
447
- maybe_init_openflow_application_interface();
448
- assert( openflow_application_interface_initialized );
449
-
450
- debug( "Setting a stats reply handler ( callback = %p, user_data = %p ).",
451
- callback, user_data );
452
-
453
- event_handlers.stats_reply_callback = callback;
454
- event_handlers.stats_reply_user_data = user_data;
455
-
456
- return true;
457
- }
458
-
459
-
460
- bool
461
- set_barrier_reply_handler( barrier_reply_handler callback, void *user_data ) {
462
- if ( callback == NULL ) {
463
- die( "Callback function ( barrier_reply_handler ) must not be NULL." );
464
- }
465
- assert( callback != NULL );
466
-
467
- maybe_init_openflow_application_interface();
468
- assert( openflow_application_interface_initialized );
469
-
470
- debug( "Setting a barrier reply handler ( callback = %p, user_data = %p ).",
471
- callback, user_data );
472
-
473
- event_handlers.barrier_reply_callback = callback;
474
- event_handlers.barrier_reply_user_data = user_data;
475
-
476
- return true;
477
- }
478
-
479
-
480
- bool
481
- set_queue_get_config_reply_handler( queue_get_config_reply_handler callback, void *user_data ) {
482
- if ( callback == NULL ) {
483
- die( "Callback function ( queue_get_config_reply_handler ) must not be NULL." );
484
- }
485
- assert( callback != NULL );
486
-
487
- maybe_init_openflow_application_interface();
488
- assert( openflow_application_interface_initialized );
489
-
490
- debug( "Setting a queue get config reply handler ( callback = %p, user_data = %p ).",
491
- callback, user_data );
492
-
493
- event_handlers.queue_get_config_reply_callback = callback;
494
- event_handlers.queue_get_config_reply_user_data = user_data;
495
-
496
- return true;
497
- }
498
-
499
-
500
- bool
501
- set_list_switches_reply_handler( list_switches_reply_handler callback ) {
502
- if ( callback == NULL ) {
503
- die( "Callback function ( list_switches_reply_handler ) must not be NULL." );
504
- }
505
- assert( callback != NULL );
506
-
507
- maybe_init_openflow_application_interface();
508
- assert( openflow_application_interface_initialized );
509
-
510
- debug( "Setting a list switches reply handler ( callback = %p ).", callback );
511
-
512
- event_handlers.list_switches_reply_callback = callback;
513
-
514
- return true;
515
- }
516
-
517
-
518
- static void
519
- handle_error( const uint64_t datapath_id, buffer *data ) {
520
- uint16_t type, code;
521
- uint32_t transaction_id;
522
- buffer *body;
523
- struct ofp_error_msg *error_msg;
524
-
525
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
526
- critical( "An OpenFlow message must be filled before calling handle_error()." );
527
- assert( 0 );
528
- }
529
-
530
- error_msg = ( struct ofp_error_msg * ) data->data;
531
-
532
- transaction_id = ntohl( error_msg->header.xid );
533
- type = ntohs( error_msg->type );
534
- code = ntohs( error_msg->code );
535
-
536
- body = duplicate_buffer( data );
537
- remove_front_buffer( body, offsetof( struct ofp_error_msg, data ) );
538
-
539
- debug( "An error message is received from %#" PRIx64 " "
540
- "( transaction_id = %#x, type = %#x, code = %#x, data length = %zu ).",
541
- datapath_id, transaction_id, type, code, body->length );
542
-
543
- if ( event_handlers.error_callback == NULL ) {
544
- debug( "Callback function for error events is not set." );
545
- free_buffer( body );
546
- return;
547
- }
548
-
549
- debug( "Calling error handler ( callback = %p, user_data = %p ).",
550
- event_handlers.error_callback, event_handlers.error_user_data );
551
-
552
- event_handlers.error_callback( datapath_id,
553
- transaction_id,
554
- type,
555
- code,
556
- body,
557
- event_handlers.error_user_data );
558
-
559
- free_buffer( body );
560
- }
561
-
562
-
563
- static void
564
- handle_echo_reply( const uint64_t datapath_id, buffer *data ) {
565
- uint16_t body_length;
566
- uint32_t transaction_id;
567
- buffer *body;
568
- struct ofp_header *header;
569
-
570
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
571
- critical( "An OpenFlow message must be filled before calling handle_echo_reply()." );
572
- assert( 0 );
573
- }
574
-
575
- header = ( struct ofp_header * ) data->data;
576
-
577
- transaction_id = ntohl( header->xid );
578
-
579
- body_length = ( uint16_t ) ( ntohs( header->length )
580
- - sizeof( struct ofp_header ) );
581
-
582
- debug( "A echo reply message is received from %#" PRIx64
583
- " ( transaction_id = %#x, body length = %u ).",
584
- datapath_id, transaction_id, body_length );
585
-
586
- if ( event_handlers.echo_reply_callback == NULL ) {
587
- debug( "Callback function for echo reply events is not set." );
588
- return;
589
- }
590
-
591
- if ( body_length > 0 ) {
592
- body = duplicate_buffer( data );
593
- remove_front_buffer( body, sizeof( struct ofp_header ) );
594
- }
595
- else {
596
- body = NULL;
597
- }
598
-
599
- debug( "Calling echo reply handler ( callback = %p, user_data = %p ).",
600
- event_handlers.echo_reply_callback, event_handlers.echo_reply_user_data );
601
-
602
- event_handlers.echo_reply_callback( datapath_id,
603
- transaction_id,
604
- body,
605
- event_handlers.echo_reply_user_data );
606
-
607
- if ( body != NULL ) {
608
- free_buffer( body );
609
- }
610
- }
611
-
612
-
613
-
614
- static void
615
- handle_vendor( const uint64_t datapath_id, buffer *data ) {
616
- uint16_t body_length;
617
- uint32_t vendor, transaction_id;
618
- buffer *body;
619
- struct ofp_vendor_header *vendor_header;
620
-
621
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
622
- critical( "An OpenFlow message must be filled before calling handle_vendor()." );
623
- assert( 0 );
624
- }
625
-
626
- vendor_header = ( struct ofp_vendor_header * ) data->data;
627
-
628
- transaction_id = ntohl( vendor_header->header.xid );
629
- vendor = ntohl( vendor_header->vendor );
630
-
631
- body_length = ( uint16_t ) ( ntohs( vendor_header->header.length )
632
- - sizeof( struct ofp_vendor_header ) );
633
-
634
- debug( "A vendor message is received from %#" PRIx64
635
- " ( transaction_id = %#x, vendor = %#x, body length = %u ).",
636
- datapath_id, transaction_id, vendor, body_length );
637
-
638
- if ( event_handlers.vendor_callback == NULL ) {
639
- debug( "Callback function for vendor events is not set." );
640
- return;
641
- }
642
-
643
- if ( body_length > 0 ) {
644
- body = duplicate_buffer( data );
645
- remove_front_buffer( body, sizeof( struct ofp_vendor_header ) );
646
- }
647
- else {
648
- body = NULL;
649
- }
650
-
651
- debug( "Calling vendor handler ( callback = %p, user_data = %p ).",
652
- event_handlers.vendor_callback, event_handlers.vendor_user_data );
653
-
654
- event_handlers.vendor_callback( datapath_id,
655
- transaction_id,
656
- vendor,
657
- body,
658
- event_handlers.vendor_user_data );
659
-
660
- if ( body != NULL ) {
661
- free_buffer( body );
662
- }
663
- }
664
-
665
-
666
- static void
667
- handle_features_reply( const uint64_t datapath_id, buffer *data ) {
668
- char description[ 1024 ];
669
- int i, n_phy_ports;
670
- uint8_t n_tables;
671
- uint16_t phy_ports_length;
672
- uint32_t transaction_id, n_buffers, capabilities, actions;
673
- list_element *element, *phy_ports_head;
674
- struct ofp_phy_port *p, *phy_port;
675
- struct ofp_switch_features *switch_features;
676
-
677
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
678
- critical( "An OpenFlow message must be filled before calling handle_features_reply()." );
679
- assert( 0 );
680
- }
681
-
682
- switch_features = ( struct ofp_switch_features * ) data->data;
683
-
684
- transaction_id = ntohl( switch_features->header.xid );
685
- n_buffers = ntohl( switch_features->n_buffers );
686
- n_tables = switch_features->n_tables;
687
- capabilities = ntohl( switch_features->capabilities );
688
- actions = ntohl( switch_features->actions );
689
-
690
- phy_ports_length = ( uint16_t ) ( ntohs( switch_features->header.length )
691
- - offsetof( struct ofp_switch_features, ports ) );
692
-
693
- n_phy_ports = phy_ports_length / sizeof( struct ofp_phy_port );
694
-
695
- debug( "A features reply message is received from %#" PRIx64
696
- " ( transaction_id = %#x, n_buffers = %u, n_tables = %u, "
697
- "capabilities = %#x, actions = %#x, # of phy ports = %u ).",
698
- datapath_id, transaction_id, n_buffers, n_tables,
699
- capabilities, actions, n_phy_ports );
700
-
701
- if ( n_phy_ports > 0 ) {
702
- create_list( &phy_ports_head );
703
- phy_port = ( struct ofp_phy_port * ) switch_features->ports;
704
- for ( i = 0; i < n_phy_ports; i++ ) {
705
- p = ( struct ofp_phy_port * ) xcalloc( 1, sizeof( struct ofp_phy_port ) );
706
- ntoh_phy_port( p, phy_port );
707
- append_to_tail( &phy_ports_head, ( void * ) p );
708
- phy_port_to_string( p, description, sizeof( description ) );
709
- debug( "[%p] %s", phy_port, description );
710
- phy_port++;
711
- }
712
- }
713
- else {
714
- phy_ports_head = NULL;
715
- }
716
-
717
- if ( event_handlers.features_reply_callback == NULL ) {
718
- debug( "Callback function for features reply events is not set." );
719
- if ( phy_ports_head != NULL ) {
720
- element = phy_ports_head;
721
- while ( element != NULL ) {
722
- xfree( element->data );
723
- element = element->next;
724
- }
725
- delete_list( phy_ports_head );
726
- }
727
- return;
728
- }
729
-
730
- debug( "Calling features reply handler ( callback = %p, user_data = %p ).",
731
- event_handlers.features_reply_callback, event_handlers.features_reply_user_data );
732
-
733
- event_handlers.features_reply_callback( datapath_id,
734
- transaction_id,
735
- n_buffers,
736
- n_tables,
737
- capabilities,
738
- actions,
739
- phy_ports_head,
740
- event_handlers.features_reply_user_data );
741
-
742
- if ( phy_ports_head != NULL ) {
743
- element = phy_ports_head;
744
- while ( element != NULL ) {
745
- xfree( element->data );
746
- element = element->next;
747
- }
748
- delete_list( phy_ports_head );
749
- }
750
- }
751
-
752
-
753
- static void
754
- handle_get_config_reply( const uint64_t datapath_id, buffer *data ) {
755
- uint16_t flags, miss_send_len;
756
- uint32_t transaction_id;
757
- struct ofp_switch_config *switch_config;
758
-
759
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
760
- critical( "An OpenFlow message must be filled before calling handle_get_config_reply()." );
761
- assert( 0 );
762
- }
763
-
764
- switch_config = ( struct ofp_switch_config * ) data->data;
765
-
766
- transaction_id = ntohl( switch_config->header.xid );
767
- flags = ntohs( switch_config->flags );
768
- miss_send_len = ntohs( switch_config->miss_send_len );
769
-
770
- debug( "A get config reply message is received from %#" PRIx64
771
- " ( transaction_id = %#x, flags = %#x, miss_send_len = %u ).",
772
- datapath_id, transaction_id, flags, miss_send_len );
773
-
774
- if ( event_handlers.get_config_reply_callback == NULL ) {
775
- debug( "Callback function for get config reply events is not set." );
776
- return;
777
- }
778
-
779
- debug( "Calling get config reply handler ( callback = %p, user_data = %p ).",
780
- event_handlers.get_config_reply_callback, event_handlers.get_config_reply_user_data );
781
-
782
- event_handlers.get_config_reply_callback( datapath_id,
783
- transaction_id,
784
- flags,
785
- miss_send_len,
786
- event_handlers.get_config_reply_user_data );
787
- }
788
-
789
-
790
- static bool
791
- empty( const buffer *data ) {
792
- return ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) );
793
- }
794
-
795
-
796
- static void
797
- handle_packet_in( const uint64_t datapath_id, buffer *data ) {
798
- if ( empty( data ) ) {
799
- die( "handle_packet_in(): packet_in message should not be empty." );
800
- }
801
-
802
- struct ofp_packet_in *_packet_in = ( struct ofp_packet_in * ) data->data;
803
- uint32_t transaction_id = ntohl( _packet_in->header.xid );
804
- uint32_t buffer_id = ntohl( _packet_in->buffer_id );
805
- uint16_t total_len = ntohs( _packet_in->total_len );
806
- uint16_t in_port = ntohs( _packet_in->in_port );
807
- uint8_t reason = _packet_in->reason;
808
- uint16_t body_length = ( uint16_t ) ( ntohs( _packet_in->header.length ) - offsetof( struct ofp_packet_in, data ) );
809
-
810
- debug(
811
- "A packet_in message is received from %#" PRIx64
812
- " ( transaction_id = %#x, buffer_id = %#x, total_len = %u, in_port = %u, reason = %#x, body length = %u ).",
813
- datapath_id,
814
- transaction_id,
815
- buffer_id,
816
- total_len,
817
- in_port,
818
- reason,
819
- body_length
820
- );
821
-
822
- if ( event_handlers.packet_in_callback == NULL ) {
823
- debug( "Callback function for packet_in events is not set." );
824
- return;
825
- }
826
-
827
- buffer *body = NULL;
828
- if ( body_length > 0 ) {
829
- body = duplicate_buffer( data );
830
- remove_front_buffer( body, offsetof( struct ofp_packet_in, data ) );
831
- bool parse_ok = parse_packet( body );
832
- if ( !parse_ok ) {
833
- error( "Failed to parse a packet." );
834
- // ???: Is it OK to drop malformed packets?
835
- free_buffer( body );
836
- return;
837
- }
838
- }
839
- else {
840
- body = NULL;
841
- }
842
-
843
- assert( event_handlers.packet_in_callback != NULL );
844
- debug( "Calling packet_in handler ( callback = %p, user_data = %p ).",
845
- event_handlers.packet_in_callback,
846
- event_handlers.packet_in_user_data
847
- );
848
- if ( event_handlers.simple_packet_in_callback ) {
849
- packet_in message = {
850
- datapath_id,
851
- transaction_id,
852
- buffer_id,
853
- total_len,
854
- in_port,
855
- reason,
856
- body,
857
- event_handlers.packet_in_user_data
858
- };
859
- ( ( simple_packet_in_handler * ) event_handlers.packet_in_callback )( datapath_id, message );
860
- }
861
- else {
862
- ( ( packet_in_handler * ) event_handlers.packet_in_callback )(
863
- datapath_id,
864
- transaction_id,
865
- buffer_id,
866
- total_len,
867
- in_port,
868
- reason,
869
- body,
870
- event_handlers.packet_in_user_data
871
- );
872
- }
873
-
874
- if ( body != NULL ) {
875
- free_buffer( body );
876
- }
877
- }
878
-
879
-
880
- static void
881
- handle_flow_removed( const uint64_t datapath_id, buffer *data ) {
882
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
883
- critical( "An OpenFlow message must be filled before calling handle_flow_removed()." );
884
- assert( 0 );
885
- }
886
-
887
- struct ofp_flow_removed *_flow_removed = ( struct ofp_flow_removed * ) data->data;
888
- uint32_t transaction_id = ntohl( _flow_removed->header.xid );
889
- struct ofp_match match;
890
- ntoh_match( &match, &_flow_removed->match );
891
- uint64_t cookie = ntohll( _flow_removed->cookie );
892
- uint16_t priority = ntohs( _flow_removed->priority );
893
- uint8_t reason = _flow_removed->reason;
894
- uint32_t duration_sec = ntohl( _flow_removed->duration_sec );
895
- uint32_t duration_nsec = ntohl( _flow_removed->duration_nsec );
896
- uint16_t idle_timeout = ntohs( _flow_removed->idle_timeout );
897
- uint64_t packet_count = ntohll( _flow_removed->packet_count );
898
- uint64_t byte_count = ntohll( _flow_removed->byte_count );
899
-
900
- char match_string[ 1024 ];
901
- match_to_string( &match, match_string, sizeof( match_string ) );
902
-
903
- debug(
904
- "A flow removed message is received from %#" PRIx64
905
- " ( transaction_id = %#x, match = [%s], cookie = %#" PRIx64 ", "
906
- "priority = %u, reason = %#x, duration_sec = %u, duration_nsec = %u, "
907
- "idle_timeout = %u, packet_count = %" PRIu64 ", byte_count = %" PRIu64 " ).",
908
- datapath_id,
909
- transaction_id,
910
- match_string,
911
- cookie,
912
- priority,
913
- reason,
914
- duration_sec,
915
- duration_nsec,
916
- idle_timeout,
917
- packet_count,
918
- byte_count
919
- );
920
-
921
- if ( event_handlers.flow_removed_callback == NULL ) {
922
- debug( "Callback function for flow removed events is not set." );
923
- return;
924
- }
925
-
926
- debug(
927
- "Calling flow removed handler ( callback = %p, user_data = %p ).",
928
- event_handlers.flow_removed_callback,
929
- event_handlers.flow_removed_user_data
930
- );
931
- if ( event_handlers.simple_flow_removed_callback ) {
932
- flow_removed message = {
933
- datapath_id,
934
- transaction_id,
935
- match,
936
- cookie,
937
- priority,
938
- reason,
939
- duration_sec,
940
- duration_nsec,
941
- idle_timeout,
942
- packet_count,
943
- byte_count,
944
- event_handlers.flow_removed_user_data
945
- };
946
- ( ( simple_flow_removed_handler * ) event_handlers.flow_removed_callback )( datapath_id, message );
947
- }
948
- else {
949
- ( ( flow_removed_handler * ) event_handlers.flow_removed_callback )(
950
- datapath_id,
951
- transaction_id,
952
- match,
953
- cookie,
954
- priority,
955
- reason,
956
- duration_sec,
957
- duration_nsec,
958
- idle_timeout,
959
- packet_count,
960
- byte_count,
961
- event_handlers.flow_removed_user_data
962
- );
963
- }
964
- }
965
-
966
-
967
- static void
968
- handle_port_status( const uint64_t datapath_id, buffer *data ) {
969
- char description[ 1024 ];
970
- uint8_t reason;
971
- uint32_t transaction_id;
972
- struct ofp_phy_port phy_port;
973
- struct ofp_port_status *port_status;
974
-
975
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
976
- critical( "An OpenFlow message must be filled before calling handle_port_status()." );
977
- assert( 0 );
978
- }
979
-
980
- port_status = ( struct ofp_port_status * ) data->data;
981
-
982
- transaction_id = ntohl( port_status->header.xid );
983
- reason = port_status->reason;
984
- ntoh_phy_port( &phy_port, &port_status->desc );
985
-
986
- phy_port_to_string( &phy_port, description, sizeof( description ) );
987
-
988
- debug( "A port status message is received from %#" PRIx64
989
- " ( transaction_id = %#x, reason = %#x, desc = [%s] ).",
990
- datapath_id, transaction_id, reason, description );
991
-
992
- if ( event_handlers.port_status_callback == NULL ) {
993
- debug( "Callback function for port status events is not set." );
994
- return;
995
- }
996
-
997
- debug( "Calling port status handler ( callback = %p, user_data = %p ).",
998
- event_handlers.port_status_callback, event_handlers.port_status_user_data );
999
-
1000
- event_handlers.port_status_callback( datapath_id,
1001
- transaction_id,
1002
- reason,
1003
- phy_port,
1004
- event_handlers.port_status_user_data );
1005
- }
1006
-
1007
-
1008
- static void
1009
- handle_stats_reply( const uint64_t datapath_id, buffer *data ) {
1010
- uint16_t type, flags, body_length;
1011
- uint32_t transaction_id;
1012
- buffer *body = NULL;
1013
- buffer *body_h = NULL;
1014
- struct ofp_stats_reply *stats_reply;
1015
-
1016
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
1017
- critical( "An OpenFlow message must be filled before calling handle_stats_reply()." );
1018
- assert( 0 );
1019
- }
1020
-
1021
- stats_reply = ( struct ofp_stats_reply * ) data->data;
1022
-
1023
- transaction_id = ntohl( stats_reply->header.xid );
1024
- type = ntohs( stats_reply->type );
1025
- flags = ntohs( stats_reply->flags );
1026
-
1027
- body_length = ( uint16_t ) ( ntohs( stats_reply->header.length )
1028
- - offsetof( struct ofp_stats_reply, body ) );
1029
-
1030
- debug( "A stats reply message is received from %#" PRIx64
1031
- " ( transaction_id = %#x, type = %#x, flags = %#x, body length = %u ).",
1032
- datapath_id, transaction_id, type, flags, body_length );
1033
-
1034
- if ( event_handlers.stats_reply_callback == NULL ) {
1035
- debug( "Callback function for stats reply events is not set." );
1036
- return;
1037
- }
1038
-
1039
- if ( body_length > 0 ) {
1040
- body = duplicate_buffer( data );
1041
- remove_front_buffer( body, offsetof( struct ofp_stats_reply, body ) );
1042
- }
1043
-
1044
- if ( body != NULL ) {
1045
- switch ( type ) {
1046
- case OFPST_DESC:
1047
- {
1048
- body_h = body;
1049
- body = NULL;
1050
- }
1051
- break;
1052
- case OFPST_FLOW:
1053
- {
1054
- struct ofp_flow_stats *src, *dst;
1055
-
1056
- body_h = alloc_buffer_with_length( body_length );
1057
- append_back_buffer( body_h, body_length );
1058
-
1059
- src = ( struct ofp_flow_stats * ) body->data;
1060
- dst = ( struct ofp_flow_stats * ) body_h->data;
1061
-
1062
- while ( body_length > 0 ) {
1063
- ntoh_flow_stats( dst, src );
1064
-
1065
- body_length = ( uint16_t ) ( body_length - dst->length );
1066
-
1067
- src = ( struct ofp_flow_stats * ) ( ( char * ) src + dst->length );
1068
- dst = ( struct ofp_flow_stats * ) ( ( char * ) dst + dst->length );
1069
- }
1070
- }
1071
- break;
1072
- case OFPST_AGGREGATE:
1073
- {
1074
- struct ofp_aggregate_stats_reply *src, *dst;
1075
-
1076
- body_h = alloc_buffer_with_length( body_length );
1077
- append_back_buffer( body_h, body_length );
1078
-
1079
- src = ( struct ofp_aggregate_stats_reply * ) body->data;
1080
- dst = ( struct ofp_aggregate_stats_reply * ) body_h->data;
1081
-
1082
- ntoh_aggregate_stats( dst, src );
1083
- }
1084
- break;
1085
- case OFPST_TABLE:
1086
- {
1087
- struct ofp_table_stats *src, *dst;
1088
-
1089
- body_h = alloc_buffer_with_length( body_length );
1090
- append_back_buffer( body_h, body_length );
1091
-
1092
- src = ( struct ofp_table_stats * ) body->data;
1093
- dst = ( struct ofp_table_stats * ) body_h->data;
1094
-
1095
- while ( body_length > 0 ) {
1096
- ntoh_table_stats( dst, src );
1097
-
1098
- body_length = ( uint16_t ) ( body_length - sizeof( struct ofp_table_stats ) );
1099
-
1100
- src++;
1101
- dst++;
1102
- }
1103
- }
1104
- break;
1105
- case OFPST_PORT:
1106
- {
1107
- struct ofp_port_stats *src, *dst;
1108
-
1109
- body_h = alloc_buffer_with_length( body_length );
1110
- append_back_buffer( body_h, body_length );
1111
-
1112
- src = ( struct ofp_port_stats * ) body->data;
1113
- dst = ( struct ofp_port_stats * ) body_h->data;
1114
-
1115
- while ( body_length > 0 ) {
1116
- ntoh_port_stats( dst, src );
1117
-
1118
- body_length = ( uint16_t ) ( body_length - sizeof( struct ofp_port_stats ) );
1119
-
1120
- src++;
1121
- dst++;
1122
- }
1123
- }
1124
- break;
1125
- case OFPST_QUEUE:
1126
- {
1127
- struct ofp_queue_stats *src, *dst;
1128
-
1129
- body_h = alloc_buffer_with_length( body_length );
1130
- append_back_buffer( body_h, body_length );
1131
-
1132
- src = ( struct ofp_queue_stats * ) body->data;
1133
- dst = ( struct ofp_queue_stats * ) body_h->data;
1134
-
1135
- while ( body_length > 0 ) {
1136
- ntoh_queue_stats( dst, src );
1137
-
1138
- body_length = ( uint16_t ) ( body_length - sizeof( struct ofp_queue_stats ) );
1139
-
1140
- src++;
1141
- dst++;
1142
- }
1143
- }
1144
- break;
1145
- case OFPST_VENDOR:
1146
- {
1147
- uint32_t *src, *dst;
1148
- body_h = alloc_buffer_with_length( body_length );
1149
- append_back_buffer( body_h, body_length );
1150
-
1151
- memcpy( body_h->data, body->data, body_length );
1152
-
1153
- src = ( uint32_t * ) body->data;
1154
- dst = ( uint32_t * ) body_h->data;
1155
-
1156
- *dst = ntohl( *src ); // vendor id
1157
- }
1158
- break;
1159
- default:
1160
- if ( body != NULL ) {
1161
- free_buffer( body );
1162
- }
1163
- critical( "Unhandled stats type ( type = %#x ).", type );
1164
- assert( 0 );
1165
- break;
1166
- }
1167
- }
1168
-
1169
- debug( "Calling stats reply handler ( callback = %p, user_data = %p ).",
1170
- event_handlers.stats_reply_callback, event_handlers.stats_reply_user_data );
1171
-
1172
- event_handlers.stats_reply_callback( datapath_id,
1173
- transaction_id,
1174
- type,
1175
- flags,
1176
- body_h,
1177
- event_handlers.stats_reply_user_data );
1178
-
1179
- if ( body != NULL ) {
1180
- free_buffer( body );
1181
- }
1182
- if ( body_h != NULL ) {
1183
- free_buffer( body_h );
1184
- }
1185
- }
1186
-
1187
-
1188
- static void
1189
- handle_barrier_reply( const uint64_t datapath_id, buffer *data ) {
1190
- uint32_t transaction_id;
1191
- struct ofp_header *header;
1192
-
1193
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
1194
- critical( "An OpenFlow message must be filled before calling handle_barrier_reply()." );
1195
- assert( 0 );
1196
- }
1197
-
1198
- header = ( struct ofp_header * ) data->data;
1199
-
1200
- transaction_id = ntohl( header->xid );
1201
-
1202
- debug( "A barrier reply message is received from %#" PRIx64 " ( transaction_id = %#x ).",
1203
- datapath_id, transaction_id );
1204
-
1205
- if ( event_handlers.barrier_reply_callback == NULL ) {
1206
- debug( "Callback function for barrier reply events is not set." );
1207
- return;
1208
- }
1209
-
1210
- debug( "Calling barrier reply handler ( callback = %p, user_data = %p ).",
1211
- event_handlers.barrier_reply_callback, event_handlers.barrier_reply_user_data );
1212
-
1213
- event_handlers.barrier_reply_callback( datapath_id,
1214
- transaction_id,
1215
- event_handlers.barrier_reply_user_data );
1216
- }
1217
-
1218
-
1219
- static void
1220
- handle_queue_get_config_reply( const uint64_t datapath_id, buffer *data ) {
1221
- uint16_t port, queues_length;
1222
- uint32_t transaction_id;
1223
- list_element *queues_head = NULL;
1224
- list_element *element = NULL;
1225
- struct ofp_packet_queue *pq, *packet_queue;
1226
- struct ofp_queue_get_config_reply *queue_get_config_reply;
1227
-
1228
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
1229
- critical( "An OpenFlow message must be filled before calling handle_queue_get_config_reply()." );
1230
- assert( 0 );
1231
- }
1232
-
1233
- queue_get_config_reply = ( struct ofp_queue_get_config_reply * ) data->data;
1234
-
1235
- transaction_id = ntohl( queue_get_config_reply->header.xid );
1236
- port = ntohs( queue_get_config_reply->port );
1237
-
1238
- queues_length = ( uint16_t ) ( ntohs( queue_get_config_reply->header.length )
1239
- - offsetof( struct ofp_queue_get_config_reply, queues ) );
1240
-
1241
- debug( "A queue get config reply message is received from %#" PRIx64
1242
- " ( transaction_id = %#x, port = %u, queues length = %u ).",
1243
- datapath_id, transaction_id, port, queues_length );
1244
-
1245
- if ( event_handlers.queue_get_config_reply_callback == NULL ) {
1246
- debug( "Callback function for queue get config reply events is not set." );
1247
- return;
1248
- }
1249
-
1250
- if ( queues_length > 0 ) {
1251
- create_list( &queues_head );
1252
- }
1253
- else {
1254
- critical( "No queues found." );
1255
- assert( 0 );
1256
- }
1257
-
1258
- packet_queue = ( struct ofp_packet_queue * ) queue_get_config_reply->queues;
1259
-
1260
- while ( queues_length > 0 ) {
1261
- pq = ( struct ofp_packet_queue * ) xcalloc( 1, ntohs( packet_queue->len ) );
1262
-
1263
- ntoh_packet_queue( pq, packet_queue );
1264
- append_to_tail( &queues_head, pq );
1265
-
1266
- packet_queue = ( struct ofp_packet_queue * ) ( ( char * ) packet_queue + pq->len );
1267
- queues_length = ( uint16_t ) ( queues_length - pq->len );
1268
- }
1269
-
1270
- debug( "Calling queue get config reply handler ( callback = %p, user_data = %p ).",
1271
- event_handlers.queue_get_config_reply_callback,
1272
- event_handlers.queue_get_config_reply_user_data );
1273
-
1274
- event_handlers.queue_get_config_reply_callback( datapath_id,
1275
- transaction_id,
1276
- port,
1277
- queues_head,
1278
- event_handlers.queue_get_config_reply_user_data );
1279
-
1280
- if ( queues_head != NULL ) {
1281
- element = queues_head;
1282
- while ( element != NULL ) {
1283
- xfree( element->data );
1284
- element = element->next;
1285
- }
1286
- delete_list( queues_head );
1287
- }
1288
- }
1289
-
1290
-
1291
- static void
1292
- update_switch_event_stats( uint16_t type, int send_receive, bool result ) {
1293
- char key[ STAT_KEY_LENGTH ];
1294
- char suffix[ 16 ];
1295
- char direction[ 16 ];
1296
- const char *prefix = "openflow_application_interface.";
1297
-
1298
- memset( suffix, '\0', sizeof( suffix ) );
1299
-
1300
- if ( result ) {
1301
- sprintf( suffix, "_succeeded" );
1302
- }
1303
- else {
1304
- sprintf( suffix, "_failed" );
1305
- }
1306
-
1307
- memset( direction, '\0', sizeof( direction ) );
1308
-
1309
- switch ( send_receive ) {
1310
- case OPENFLOW_MESSAGE_SEND:
1311
- sprintf( direction, "_send" );
1312
- break;
1313
- case OPENFLOW_MESSAGE_RECEIVE:
1314
- sprintf( direction, "_receive" );
1315
- break;
1316
- default:
1317
- return;
1318
- }
1319
-
1320
- switch ( type ) {
1321
- case MESSENGER_OPENFLOW_CONNECTED:
1322
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_connected", direction, suffix );
1323
- break;
1324
- case MESSENGER_OPENFLOW_READY:
1325
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_ready", direction, suffix );
1326
- break;
1327
- case MESSENGER_OPENFLOW_DISCONNECTED:
1328
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_disconnected", direction, suffix );
1329
- break;
1330
- case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
1331
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "switch_failed_to_connect", direction, suffix );
1332
- break;
1333
- default:
1334
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "undefined_switch_event", direction, suffix );
1335
- break;
1336
- }
1337
-
1338
- increment_stat( key );
1339
- }
1340
-
1341
-
1342
- static void
1343
- handle_switch_ready( uint64_t datapath_id ) {
1344
- if ( event_handlers.switch_ready_callback == NULL ) {
1345
- debug( "Callback function for switch_ready events is not set." );
1346
- return;
1347
- }
1348
-
1349
- assert( event_handlers.switch_ready_callback != NULL );
1350
- if ( event_handlers.simple_switch_ready_callback ) {
1351
- switch_ready event = {
1352
- datapath_id,
1353
- event_handlers.switch_ready_user_data
1354
- };
1355
- ( ( simple_switch_ready_handler * ) event_handlers.switch_ready_callback )( event );
1356
- }
1357
- else {
1358
- ( ( switch_ready_handler * ) event_handlers.switch_ready_callback )(
1359
- datapath_id,
1360
- event_handlers.switch_ready_user_data
1361
- );
1362
- }
1363
- }
1364
-
1365
-
1366
- static void
1367
- handle_messenger_openflow_disconnected( uint64_t datapath_id ) {
1368
- if ( event_handlers.switch_disconnected_callback != NULL ) {
1369
- debug( "Calling switch disconnected handler ( callback = %p, user_data = %p ).",
1370
- event_handlers.switch_disconnected_callback, event_handlers.switch_disconnected_user_data );
1371
- event_handlers.switch_disconnected_callback( datapath_id, event_handlers.switch_disconnected_user_data );
1372
- }
1373
- else {
1374
- debug( "Callback function for switch disconnected events is not set." );
1375
- }
1376
- delete_openflow_messages( datapath_id );
1377
- }
1378
-
1379
-
1380
- static void
1381
- handle_switch_events( uint16_t type, void *data, size_t length ) {
1382
- assert( data != NULL );
1383
- assert( length == sizeof( openflow_service_header_t ) );
1384
-
1385
- debug( "Received a switch event ( type = %#x ) from remote.", type );
1386
-
1387
- openflow_service_header_t *message = data;
1388
- uint64_t datapath_id = ntohll( message->datapath_id );
1389
-
1390
- switch ( type ) {
1391
- case MESSENGER_OPENFLOW_CONNECTED:
1392
- case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
1393
- // Do nothing.
1394
- break;
1395
- case MESSENGER_OPENFLOW_READY:
1396
- handle_switch_ready( datapath_id );
1397
- break;
1398
- case MESSENGER_OPENFLOW_DISCONNECTED:
1399
- handle_messenger_openflow_disconnected( datapath_id );
1400
- break;
1401
- default:
1402
- error( "Unhandled switch event ( type = %#x ).", type );
1403
- break;
1404
- }
1405
-
1406
- update_switch_event_stats( type, OPENFLOW_MESSAGE_RECEIVE, true );
1407
- }
1408
-
1409
-
1410
- static void
1411
- update_openflow_stats( uint8_t type, int send_receive, bool result ) {
1412
- char key[ STAT_KEY_LENGTH ];
1413
- char suffix[ 16 ];
1414
- char direction[ 16 ];
1415
- const char *prefix = "openflow_application_interface.";
1416
-
1417
- memset( suffix, '\0', sizeof( suffix ) );
1418
-
1419
- if ( result ) {
1420
- sprintf( suffix, "_succeeded" );
1421
- }
1422
- else {
1423
- sprintf( suffix, "_failed" );
1424
- }
1425
-
1426
- memset( direction, '\0', sizeof( direction ) );
1427
-
1428
- switch ( send_receive ) {
1429
- case OPENFLOW_MESSAGE_SEND:
1430
- sprintf( direction, "_send" );
1431
- break;
1432
- case OPENFLOW_MESSAGE_RECEIVE:
1433
- sprintf( direction, "_receive" );
1434
- break;
1435
- default:
1436
- return;
1437
- }
1438
-
1439
- switch ( type ) {
1440
- case OFPT_HELLO:
1441
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "hello", direction, suffix );
1442
- break;
1443
- case OFPT_ERROR:
1444
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "error", direction, suffix );
1445
- break;
1446
- case OFPT_ECHO_REQUEST:
1447
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "echo_request", direction, suffix );
1448
- break;
1449
- case OFPT_ECHO_REPLY:
1450
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "echo_reply", direction, suffix );
1451
- break;
1452
- case OFPT_VENDOR:
1453
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "vendor", direction, suffix );
1454
- break;
1455
- case OFPT_FEATURES_REQUEST:
1456
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "features_request", direction, suffix );
1457
- break;
1458
- case OFPT_FEATURES_REPLY:
1459
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "features_reply", direction, suffix );
1460
- break;
1461
- case OFPT_GET_CONFIG_REQUEST:
1462
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "get_config_request", direction, suffix );
1463
- break;
1464
- case OFPT_GET_CONFIG_REPLY:
1465
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "get_config_reply", direction, suffix );
1466
- break;
1467
- case OFPT_SET_CONFIG:
1468
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "set_config", direction, suffix );
1469
- break;
1470
- case OFPT_PACKET_IN:
1471
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "packet_in", direction, suffix );
1472
- break;
1473
- case OFPT_FLOW_REMOVED:
1474
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "flow_removed", direction, suffix );
1475
- break;
1476
- case OFPT_PORT_STATUS:
1477
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "port_status", direction, suffix );
1478
- break;
1479
- case OFPT_PACKET_OUT:
1480
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "packet_out", direction, suffix );
1481
- break;
1482
- case OFPT_FLOW_MOD:
1483
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "flow_mod", direction, suffix );
1484
- break;
1485
- case OFPT_PORT_MOD:
1486
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "port_mod", direction, suffix );
1487
- break;
1488
- case OFPT_STATS_REQUEST:
1489
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "stats_request", direction, suffix );
1490
- break;
1491
- case OFPT_STATS_REPLY:
1492
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "stats_reply", direction, suffix );
1493
- break;
1494
- case OFPT_BARRIER_REQUEST:
1495
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "barrier_request", direction, suffix );
1496
- break;
1497
- case OFPT_BARRIER_REPLY:
1498
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "barrier_reply", direction, suffix );
1499
- break;
1500
- case OFPT_QUEUE_GET_CONFIG_REQUEST:
1501
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "queue_get_config_request", direction, suffix );
1502
- break;
1503
- case OFPT_QUEUE_GET_CONFIG_REPLY:
1504
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "queue_get_config_reply", direction, suffix );
1505
- break;
1506
- default:
1507
- snprintf( key, STAT_KEY_LENGTH, "%s%s%s%s", prefix, "undefined_message_type", direction, suffix );
1508
- break;
1509
- }
1510
-
1511
- increment_stat( key );
1512
- }
1513
-
1514
-
1515
- static void
1516
- handle_openflow_message( void *data, size_t length ) {
1517
- void *p;
1518
- int ret;
1519
- uint64_t datapath_id;
1520
- buffer *buffer;
1521
- struct ofp_header *header;
1522
- openflow_service_header_t *message;
1523
-
1524
- assert( data != NULL );
1525
- assert( length >= ( sizeof( openflow_service_header_t ) + sizeof( struct ofp_header ) ) );
1526
-
1527
- debug( "An OpenFlow message is received from remote." );
1528
-
1529
- message = ( openflow_service_header_t * ) data;
1530
-
1531
- datapath_id = ntohll( message->datapath_id );
1532
-
1533
- buffer = alloc_buffer_with_length( length );
1534
-
1535
- assert( buffer != NULL );
1536
-
1537
- p = append_back_buffer( buffer, length );
1538
- memcpy( p, data, length );
1539
- remove_front_buffer( buffer, sizeof( openflow_service_header_t ) );
1540
-
1541
- ret = validate_openflow_message( buffer );
1542
-
1543
- if ( ret < 0 ) {
1544
- error( "Failed to validate an OpenFlow message ( code = %d, length = %zu ).", ret, length );
1545
- free_buffer( buffer );
1546
-
1547
- return;
1548
- }
1549
-
1550
- header = ( struct ofp_header * ) buffer->data;
1551
-
1552
- switch ( header->type ) {
1553
- case OFPT_ERROR:
1554
- handle_error( datapath_id, buffer );
1555
- break;
1556
- case OFPT_ECHO_REPLY:
1557
- handle_echo_reply( datapath_id, buffer );
1558
- break;
1559
- case OFPT_VENDOR:
1560
- handle_vendor( datapath_id, buffer );
1561
- break;
1562
- case OFPT_FEATURES_REPLY:
1563
- handle_features_reply( datapath_id, buffer );
1564
- break;
1565
- case OFPT_GET_CONFIG_REPLY:
1566
- handle_get_config_reply( datapath_id, buffer );
1567
- break;
1568
- case OFPT_PACKET_IN:
1569
- handle_packet_in( datapath_id, buffer );
1570
- break;
1571
- case OFPT_FLOW_REMOVED:
1572
- handle_flow_removed( datapath_id, buffer );
1573
- break;
1574
- case OFPT_PORT_STATUS:
1575
- handle_port_status( datapath_id, buffer );
1576
- break;
1577
- case OFPT_STATS_REPLY:
1578
- handle_stats_reply( datapath_id, buffer );
1579
- break;
1580
- case OFPT_BARRIER_REPLY:
1581
- handle_barrier_reply( datapath_id, buffer );
1582
- break;
1583
- case OFPT_QUEUE_GET_CONFIG_REPLY:
1584
- handle_queue_get_config_reply( datapath_id, buffer );
1585
- break;
1586
- default:
1587
- error( "Unhandled OpenFlow message ( type = %#x ).", header->type );
1588
- break;
1589
- }
1590
-
1591
- update_openflow_stats( header->type, OPENFLOW_MESSAGE_RECEIVE, true );
1592
-
1593
- free_buffer( buffer );
1594
- }
1595
-
1596
-
1597
- static void
1598
- handle_message( uint16_t type, void *data, size_t length ) {
1599
- assert( data != NULL );
1600
- assert( length >= sizeof( openflow_service_header_t ) );
1601
-
1602
- debug( "A message is received from remote ( type = %#x ).", type );
1603
-
1604
- switch ( type ) {
1605
- case MESSENGER_OPENFLOW_MESSAGE:
1606
- return handle_openflow_message( data, length );
1607
- case MESSENGER_OPENFLOW_CONNECTED:
1608
- case MESSENGER_OPENFLOW_FAILD_TO_CONNECT:
1609
- case MESSENGER_OPENFLOW_READY:
1610
- case MESSENGER_OPENFLOW_DISCONNECTED:
1611
- return handle_switch_events( type, data, length );
1612
- default:
1613
- error( "Unhandled message ( type = %#x ).", type );
1614
- update_switch_event_stats( type, OPENFLOW_MESSAGE_RECEIVE, true );
1615
- break;
1616
- }
1617
- }
1618
-
1619
-
1620
- static void
1621
- insert_dpid( list_element **head, uint64_t *dpid ) {
1622
- assert( head != NULL );
1623
- assert( dpid != NULL );
1624
-
1625
- list_element *element;
1626
- for ( element = *head; element != NULL; element = element->next ) {
1627
- if ( *dpid <= *( uint64_t * ) element->data ) {
1628
- break;
1629
- }
1630
- }
1631
- if ( element == NULL ) {
1632
- append_to_tail( head, dpid );
1633
- }
1634
- else if ( element == *head ) {
1635
- insert_in_front( head, dpid );
1636
- }
1637
- else {
1638
- insert_before( head, element->data, dpid );
1639
- }
1640
- }
1641
-
1642
-
1643
- static void
1644
- handle_list_switches_reply( uint16_t message_type, void *data, size_t length, void *user_data ) {
1645
- UNUSED( message_type );
1646
- assert( data != NULL );
1647
-
1648
- uint64_t *dpid = ( uint64_t * ) data;
1649
- size_t num_switch = length / sizeof( uint64_t );
1650
-
1651
- debug( "A list switches reply message is received ( number of switches = %zu ).",
1652
- num_switch );
1653
-
1654
- if ( event_handlers.list_switches_reply_callback == NULL ) {
1655
- debug( "Callback function for list switches reply events is not set." );
1656
- return;
1657
- }
1658
-
1659
- list_element *switches;
1660
- create_list( &switches );
1661
-
1662
- unsigned int i;
1663
- for ( i = 0; i < num_switch; ++i ) {
1664
- uint64_t *datapath_id = ( uint64_t * ) xmalloc( sizeof( uint64_t ) );
1665
- *datapath_id = ntohll( dpid[ i ] );
1666
- insert_dpid( &switches, datapath_id );
1667
- }
1668
-
1669
- debug( "Calling list switches reply handler ( callback = %p ).",
1670
- event_handlers.list_switches_reply_callback );
1671
-
1672
- event_handlers.list_switches_reply_callback( switches, user_data );
1673
-
1674
- list_element *element;
1675
- for ( element = switches; element != NULL; element = element->next ) {
1676
- xfree( element->data );
1677
- }
1678
- delete_list( switches );
1679
- }
1680
-
1681
-
1682
- bool
1683
- send_openflow_message( const uint64_t datapath_id, buffer *message ) {
1684
- bool ret;
1685
- void *data;
1686
- char remote_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
1687
- uint16_t header_length;
1688
- buffer *buffer;
1689
- struct ofp_header *ofp;
1690
- openflow_service_header_t header;
1691
-
1692
- maybe_init_openflow_application_interface();
1693
- assert( openflow_application_interface_initialized );
1694
-
1695
- if ( ( message == NULL ) || ( ( message != NULL ) && ( message->length == 0 ) ) ) {
1696
- critical( "An OpenFlow message must be passed to send_openflow_message()." );
1697
- assert( 0 );
1698
- }
1699
-
1700
- ofp = ( struct ofp_header * ) message->data;
1701
- buffer = duplicate_buffer( message );
1702
-
1703
- assert( buffer != NULL );
1704
-
1705
- header_length = ( uint16_t ) ( sizeof( openflow_service_header_t )
1706
- + strlen( service_name ) + 1 );
1707
-
1708
- header.datapath_id = htonll( datapath_id );
1709
- header.service_name_length = htons( ( uint16_t ) ( strlen( service_name ) + 1 ) );
1710
-
1711
- data = append_front_buffer( buffer, header_length );
1712
- memset( data, '\0', header_length );
1713
- memcpy( data, &header, sizeof( openflow_service_header_t ) );
1714
- memcpy( ( char * ) data + sizeof( openflow_service_header_t ),
1715
- service_name, strlen( service_name ) );
1716
-
1717
- memset( remote_service_name, '\0', sizeof( remote_service_name ) );
1718
- snprintf( remote_service_name, sizeof( remote_service_name ),
1719
- "switch.%#" PRIx64, datapath_id );
1720
-
1721
- debug( "Sending an OpenFlow message to %#" PRIx64
1722
- " ( service_name = %s, remote_service_name = %s, "
1723
- "ofp_header = [version = %#x, type = %#x, length = %u, transaction_id = %#x] ).",
1724
- datapath_id, service_name, remote_service_name,
1725
- ofp->version, ofp->type, ntohs( ofp->length ), ntohl( ofp->xid ) );
1726
-
1727
- ret = send_message( remote_service_name, MESSENGER_OPENFLOW_MESSAGE,
1728
- buffer->data, buffer->length );
1729
-
1730
- free_buffer( buffer );
1731
-
1732
- update_openflow_stats( ofp->type, OPENFLOW_MESSAGE_SEND, ret );
1733
-
1734
- return ret;
1735
- }
1736
-
1737
-
1738
- bool
1739
- send_list_switches_request( void *user_data ) {
1740
- uint16_t message_type = 0;
1741
- void *data = NULL;
1742
- size_t data_length = 0;
1743
-
1744
- maybe_init_openflow_application_interface();
1745
- assert( openflow_application_interface_initialized );
1746
-
1747
- debug( "Sending a list switches request ( service_name = %s ).", service_name );
1748
-
1749
- return send_request_message( "switch_manager", service_name, message_type,
1750
- data, data_length, user_data );
1751
- }
1752
-
1753
-
1754
- bool
1755
- delete_openflow_messages( uint64_t datapath_id ) {
1756
- debug( "Deleting OpenFlow messages in a send queue ( datapath_id = %#" PRIx64 " ).", datapath_id );
1757
-
1758
- char remote_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
1759
- memset( remote_service_name, '\0', sizeof( remote_service_name ) );
1760
- snprintf( remote_service_name, sizeof( remote_service_name ),
1761
- "switch.%#" PRIx64, datapath_id );
1762
- return clear_send_queue( remote_service_name );
1763
- }
1764
-
1765
-
1766
- bool
1767
- disconnect_switch( uint64_t datapath_id ) {
1768
- debug( "Disconnecting a switch ( datapath_id = %#" PRIx64 " ).", datapath_id );
1769
-
1770
- maybe_init_openflow_application_interface();
1771
- assert( openflow_application_interface_initialized );
1772
-
1773
- size_t service_name_length = strlen( service_name ) + 1;
1774
- size_t length = sizeof( openflow_service_header_t ) + service_name_length;
1775
- buffer *buf = alloc_buffer_with_length( length );
1776
- openflow_service_header_t *header = append_back_buffer( buf, sizeof( openflow_service_header_t ) );
1777
- header->datapath_id = htonll( datapath_id );
1778
- header->service_name_length = htons( ( uint16_t ) service_name_length );
1779
- char *name = append_back_buffer( buf, service_name_length );
1780
- memcpy( name, service_name, service_name_length );
1781
-
1782
- char remote_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
1783
- snprintf( remote_service_name, sizeof( remote_service_name ),
1784
- "switch.%#" PRIx64, datapath_id );
1785
-
1786
- bool ret = send_message( remote_service_name, MESSENGER_OPENFLOW_DISCONNECT_REQUEST,
1787
- buf->data, buf->length );
1788
-
1789
- free_buffer( buf );
1790
-
1791
- return ret;
1792
- }
1793
-
1794
-
1795
- /*
1796
- * Local variables:
1797
- * c-basic-offset: 2
1798
- * indent-tabs-mode: nil
1799
- * End:
1800
- */