trema 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
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,291 +0,0 @@
1
- /*
2
- * An OpenFlow message 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 OPENFLOW_MESSAGE_H
22
- #define OPENFLOW_MESSAGE_H
23
-
24
-
25
- #include <openflow.h>
26
- #include "bool.h"
27
- #include "buffer.h"
28
- #include "byteorder.h"
29
- #include "linked_list.h"
30
- #include "packet_info.h"
31
-
32
-
33
- // A structure for storing OpenFlow actions
34
- typedef struct openflow_actions {
35
- int n_actions;
36
- list_element *list;
37
- } openflow_actions;
38
-
39
-
40
- // Initialization
41
- bool init_openflow_message( void );
42
-
43
- // Functions for creating OpenFlow messages
44
- buffer *create_hello( const uint32_t transaction_id );
45
- buffer *create_error( const uint32_t transaction_id, const uint16_t type,
46
- const uint16_t code, const buffer *data );
47
- buffer *create_echo_request( const uint32_t transaction_id, const buffer *body );
48
- buffer *create_echo_reply( const uint32_t transaction_id, const buffer *body );
49
- buffer *create_vendor( const uint32_t transaction_id, const uint32_t vendor,
50
- const buffer *body );
51
- buffer *create_features_request( const uint32_t transaction_id );
52
- buffer *create_features_reply( const uint32_t transaction_id, const uint64_t datapath_id,
53
- const uint32_t n_buffers, const uint8_t n_tables,
54
- const uint32_t capabilities, const uint32_t actions,
55
- const list_element *ports );
56
- buffer *create_get_config_request( const uint32_t transaction_id );
57
- buffer *create_get_config_reply( const uint32_t transaction_id, const uint16_t flags,
58
- const uint16_t miss_send_len );
59
- buffer *create_set_config( const uint32_t transaction_id, const uint16_t flags,
60
- const uint16_t miss_send_len );
61
- buffer *create_packet_in( const uint32_t transaction_id, const uint32_t buffer_id,
62
- const uint16_t total_len, uint16_t in_port,
63
- const uint8_t reason, const buffer *data );
64
- buffer *create_flow_removed( const uint32_t transaction_id, const struct ofp_match match,
65
- const uint64_t cookie, const uint16_t priority,
66
- const uint8_t reason, const uint32_t duration_sec,
67
- const uint32_t duration_nsec, const uint16_t idle_timeout,
68
- const uint64_t packet_count, const uint64_t byte_count );
69
- buffer *create_port_status( const uint32_t transaction_id, const uint8_t reason,
70
- const struct ofp_phy_port desc );
71
- buffer *create_packet_out( const uint32_t transaction_id, const uint32_t buffer_id,
72
- const uint16_t in_port, const openflow_actions *actions,
73
- const buffer *data );
74
- buffer *create_flow_mod(
75
- const uint32_t transaction_id,
76
- const struct ofp_match match,
77
- const uint64_t cookie,
78
- const uint16_t command,
79
- const uint16_t idle_timeout,
80
- const uint16_t hard_timeout,
81
- const uint16_t priority,
82
- const uint32_t buffer_id,
83
- const uint16_t out_port,
84
- const uint16_t flags,
85
- const openflow_actions *actions
86
- );
87
- buffer *create_port_mod( const uint32_t transaction_id, const uint16_t port_no,
88
- const uint8_t hw_addr[ OFP_ETH_ALEN ], const uint32_t config,
89
- const uint32_t mask, const uint32_t advertise );
90
- buffer *create_desc_stats_request( const uint32_t transaction_id, const uint16_t flags );
91
- buffer *create_flow_stats_request( const uint32_t transaction_id, const uint16_t flags,
92
- const struct ofp_match match, const uint8_t table_id,
93
- const uint16_t out_port );
94
- buffer *create_aggregate_stats_request( const uint32_t transaction_id,
95
- const uint16_t flags, const struct ofp_match match,
96
- const uint8_t table_id, const uint16_t out_port );
97
- buffer *create_table_stats_request( const uint32_t transaction_id, const uint16_t flags );
98
- buffer *create_port_stats_request( const uint32_t transaction_id, const uint16_t flags,
99
- const uint16_t port_no );
100
- buffer *create_queue_stats_request( const uint32_t transaction_id, const uint16_t flags,
101
- const uint16_t port_no, const uint32_t queue_id );
102
- buffer *create_vendor_stats_request( const uint32_t transaction_id, const uint16_t flags,
103
- const uint32_t vendor, const buffer *body );
104
- buffer *create_desc_stats_reply( const uint32_t transaction_id, const uint16_t flags,
105
- const char mfr_desc[ DESC_STR_LEN ],
106
- const char hw_desc[ DESC_STR_LEN ],
107
- const char sw_desc[ DESC_STR_LEN ],
108
- const char serial_num[ SERIAL_NUM_LEN ],
109
- const char dp_desc[ DESC_STR_LEN ] );
110
- buffer *create_flow_stats_reply( const uint32_t transaction_id, const uint16_t flags,
111
- const list_element *flows_stats_head );
112
- buffer *create_aggregate_stats_reply( const uint32_t transaction_id,
113
- const uint16_t flags,
114
- const uint64_t packet_count, const uint64_t byte_count,
115
- const uint32_t flow_count );
116
- buffer *create_table_stats_reply( const uint32_t transaction_id, const uint16_t flags,
117
- const list_element *table_stats_head );
118
- buffer *create_port_stats_reply( const uint32_t transaction_id, const uint16_t flags,
119
- const list_element *port_stats_head );
120
- buffer *create_queue_stats_reply( const uint32_t transaction_id, const uint16_t flags,
121
- const list_element *queue_stats_head );
122
- buffer *create_vendor_stats_reply( const uint32_t transaction_id, const uint16_t flags,
123
- const uint32_t vendor, const buffer *body );
124
- buffer *create_barrier_request( const uint32_t transaction_id );
125
- buffer *create_barrier_reply( const uint32_t transaction_id );
126
- buffer *create_queue_get_config_request( const uint32_t transaction_id, const uint16_t port );
127
- buffer *create_queue_get_config_reply( const uint32_t transaction_id, const uint16_t port,
128
- const list_element *queues );
129
- uint32_t get_transaction_id( void );
130
- uint64_t get_cookie( void );
131
- openflow_actions *create_actions( void );
132
- bool delete_actions( openflow_actions *actions );
133
- bool append_action_output( openflow_actions *actions, const uint16_t port, const uint16_t max_len );
134
- bool append_action_set_vlan_vid( openflow_actions *actions, const uint16_t vlan_vid );
135
- bool append_action_set_vlan_pcp( openflow_actions *actions, const uint8_t vlan_pcp );
136
- bool append_action_strip_vlan( openflow_actions *actions );
137
- bool append_action_set_dl_src( openflow_actions *actions, const uint8_t hw_addr[ OFP_ETH_ALEN ] );
138
- bool append_action_set_dl_dst( openflow_actions *actions, const uint8_t hw_addr[ OFP_ETH_ALEN ] );
139
- bool append_action_set_nw_src( openflow_actions *actions, const uint32_t nw_addr );
140
- bool append_action_set_nw_dst( openflow_actions *actions, const uint32_t nw_addr );
141
- bool append_action_set_nw_tos( openflow_actions *actions, const uint8_t nw_tos );
142
- bool append_action_set_tp_src( openflow_actions *actions, const uint16_t tp_port );
143
- bool append_action_set_tp_dst( openflow_actions *actions, const uint16_t tp_port );
144
- bool append_action_enqueue( openflow_actions *actions, const uint16_t port,
145
- const uint32_t queue_id );
146
- bool append_action_vendor( openflow_actions *actions, const uint32_t vendor,
147
- const buffer *data );
148
-
149
-
150
- // Return code definitions indicating the result of OpenFlow message validation.
151
- enum {
152
- SUCCESS = 0,
153
- ERROR_UNSUPPORTED_VERSION = -63,
154
- ERROR_INVALID_LENGTH,
155
- ERROR_TOO_SHORT_MESSAGE,
156
- ERROR_TOO_LONG_MESSAGE,
157
- ERROR_INVALID_TYPE,
158
- ERROR_UNDEFINED_TYPE,
159
- ERROR_UNSUPPORTED_TYPE,
160
- ERROR_NO_TABLE_AVAILABLE,
161
- ERROR_INVALID_PORT_NO,
162
- ERROR_INVALID_PORT_CONFIG,
163
- ERROR_INVALID_PORT_STATE,
164
- ERROR_INVALID_PORT_FEATURES,
165
- ERROR_INVALID_SWITCH_CONFIG,
166
- ERROR_INVALID_PACKET_IN_REASON,
167
- ERROR_INVALID_FLOW_REMOVED_REASON,
168
- ERROR_INVALID_WILDCARDS,
169
- ERROR_INVALID_VLAN_VID,
170
- ERROR_INVALID_VLAN_PCP,
171
- ERROR_INVALID_NW_TOS,
172
- ERROR_INVALID_PORT_STATUS_REASON,
173
- ERROR_TOO_SHORT_QUEUE_DESCRIPTION,
174
- ERROR_TOO_SHORT_QUEUE_PROPERTY,
175
- ERROR_TOO_LONG_QUEUE_PROPERTY,
176
- ERROR_UNDEFINED_QUEUE_PROPERTY,
177
- ERROR_TOO_SHORT_ACTION,
178
- ERROR_UNDEFINED_ACTION_TYPE,
179
- ERROR_INVALID_ACTION_TYPE,
180
- ERROR_TOO_SHORT_ACTION_OUTPUT,
181
- ERROR_TOO_LONG_ACTION_OUTPUT,
182
- ERROR_TOO_SHORT_ACTION_VLAN_VID,
183
- ERROR_TOO_LONG_ACTION_VLAN_VID,
184
- ERROR_TOO_SHORT_ACTION_VLAN_PCP,
185
- ERROR_TOO_LONG_ACTION_VLAN_PCP,
186
- ERROR_TOO_SHORT_ACTION_STRIP_VLAN,
187
- ERROR_TOO_LONG_ACTION_STRIP_VLAN,
188
- ERROR_TOO_SHORT_ACTION_DL_SRC,
189
- ERROR_TOO_LONG_ACTION_DL_SRC,
190
- ERROR_TOO_SHORT_ACTION_DL_DST,
191
- ERROR_TOO_LONG_ACTION_DL_DST,
192
- ERROR_TOO_SHORT_ACTION_NW_SRC,
193
- ERROR_TOO_LONG_ACTION_NW_SRC,
194
- ERROR_TOO_SHORT_ACTION_NW_DST,
195
- ERROR_TOO_LONG_ACTION_NW_DST,
196
- ERROR_TOO_SHORT_ACTION_NW_TOS,
197
- ERROR_TOO_LONG_ACTION_NW_TOS,
198
- ERROR_TOO_SHORT_ACTION_TP_SRC,
199
- ERROR_TOO_LONG_ACTION_TP_SRC,
200
- ERROR_TOO_SHORT_ACTION_TP_DST,
201
- ERROR_TOO_LONG_ACTION_TP_DST,
202
- ERROR_TOO_SHORT_ACTION_ENQUEUE,
203
- ERROR_TOO_LONG_ACTION_ENQUEUE,
204
- ERROR_TOO_SHORT_ACTION_VENDOR,
205
- ERROR_INVALID_LENGTH_ACTION_VENDOR,
206
- ERROR_UNSUPPORTED_STATS_TYPE,
207
- ERROR_INVALID_STATS_REPLY_FLAGS,
208
- ERROR_INVALID_FLOW_PRIORITY,
209
- ERROR_INVALID_FLOW_MOD_FLAGS,
210
- ERROR_INVALID_PORT_MASK,
211
- ERROR_INVALID_STATS_TYPE,
212
- ERROR_INVALID_STATS_REQUEST_FLAGS,
213
- ERROR_UNDEFINED_FLOW_MOD_COMMAND,
214
- ERROR_INVALID_ERROR_TYPE,
215
- ERROR_INVALID_ERROR_CODE,
216
- ERROR_UNEXPECTED_ERROR = -255
217
- };
218
-
219
-
220
- // Functions for validating OpenFlow messages
221
- int validate_hello( const buffer *message );
222
- int validate_error( const buffer *message );
223
- int validate_echo_request( const buffer *message );
224
- int validate_echo_reply( const buffer *message );
225
- int validate_vendor( const buffer *message );
226
- int validate_features_request( const buffer *message );
227
- int validate_features_reply( const buffer *message );
228
- int validate_get_config_request( const buffer *message );
229
- int validate_get_config_reply( const buffer *message );
230
- int validate_set_config( const buffer *message );
231
- int validate_packet_in( const buffer *message );
232
- int validate_flow_removed( const buffer *message );
233
- int validate_port_status( const buffer *message );
234
- int validate_packet_out( const buffer *message );
235
- int validate_flow_mod( const buffer *message );
236
- int validate_port_mod( const buffer *message );
237
- int validate_desc_stats_request( const buffer *message );
238
- int validate_flow_stats_request( const buffer *message );
239
- int validate_aggregate_stats_request( const buffer *message );
240
- int validate_table_stats_request( const buffer *message );
241
- int validate_port_stats_request( const buffer *message );
242
- int validate_queue_stats_request( const buffer *message );
243
- int validate_vendor_stats_request( const buffer *message );
244
- int validate_stats_request( const buffer *message );
245
- int validate_desc_stats_reply( const buffer *message );
246
- int validate_flow_stats_reply( const buffer *message );
247
- int validate_aggregate_stats_reply( const buffer *message );
248
- int validate_table_stats_reply( const buffer *message );
249
- int validate_port_stats_reply( const buffer *message );
250
- int validate_queue_stats_reply( const buffer *message );
251
- int validate_vendor_stats_reply( const buffer *message );
252
- int validate_stats_reply( const buffer *message );
253
- int validate_barrier_request( const buffer *message );
254
- int validate_barrier_reply( const buffer *message );
255
- int validate_queue_get_config_request( const buffer *message );
256
- int validate_queue_get_config_reply( const buffer *message );
257
- int validate_actions( struct ofp_action_header *actions_head, const uint16_t length );
258
- int validate_action_output( const struct ofp_action_output *action );
259
- int validate_action_set_vlan_vid( const struct ofp_action_vlan_vid *action );
260
- int validate_action_set_vlan_pcp( const struct ofp_action_vlan_pcp *action );
261
- int validate_action_strip_vlan( const struct ofp_action_header *action );
262
- int validate_action_set_dl_src( const struct ofp_action_dl_addr *action );
263
- int validate_action_set_dl_dst( const struct ofp_action_dl_addr *action );
264
- int validate_action_set_nw_src( const struct ofp_action_nw_addr *action );
265
- int validate_action_set_nw_dst( const struct ofp_action_nw_addr *action );
266
- int validate_action_set_nw_tos( const struct ofp_action_nw_tos *action );
267
- int validate_action_set_tp_src( const struct ofp_action_tp_port *action );
268
- int validate_action_set_tp_dst( const struct ofp_action_tp_port *action );
269
- int validate_action_enqueue( const struct ofp_action_enqueue *action );
270
- int validate_action_vendor( const struct ofp_action_vendor_header *action );
271
- int validate_openflow_message( const buffer *message );
272
- bool valid_openflow_message( const buffer *message );
273
- bool valid_message_version( const uint8_t type, const uint8_t version );
274
-
275
- // Utility functions
276
- bool get_error_type_and_code( const uint8_t type, const int error_no,
277
- uint16_t *error_type, uint16_t *error_code );
278
- void set_match_from_packet( struct ofp_match *match, const uint16_t in_port,
279
- const uint32_t wildcards, const buffer *packet );
280
- void normalize_match( struct ofp_match *match );
281
-
282
-
283
- #endif // OPENFLOW_MESSAGE_H
284
-
285
-
286
- /*
287
- * Local variables:
288
- * c-basic-offset: 2
289
- * indent-tabs-mode: nil
290
- * End:
291
- */
@@ -1,58 +0,0 @@
1
- /*
2
- * OpenFlow service interface.
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 OPENFLOW_SERVICE_INTERFACE_H
22
- #define OPENFLOW_SERVICE_INTERFACE_H
23
-
24
-
25
- /**
26
- * Message type definitions for sending/receiving OpenFlow messages or
27
- * related events via messenger.
28
- */
29
- #define MESSENGER_OPENFLOW_MESSAGE 1
30
- #define MESSENGER_OPENFLOW_CONNECTED 2
31
- #define MESSENGER_OPENFLOW_READY 3
32
- #define MESSENGER_OPENFLOW_DISCONNECTED 4
33
- #define MESSENGER_OPENFLOW_DISCONNECT_REQUEST 5
34
- #define MESSENGER_OPENFLOW_FAILD_TO_CONNECT 6
35
-
36
-
37
- /**
38
- * Header for sending/receiving OpenFlow messages or events via messenger.
39
- * A null-terminated service name can be provided after service_name_len
40
- * and an OpenFlow message must be included in the rest of part in case of
41
- * MESSENGER_OPENFLOW_MESSAGE. service_name_length can be zero if service
42
- * name notification is not necessary.
43
- */
44
- typedef struct openflow_service_header {
45
- uint64_t datapath_id;
46
- uint16_t service_name_length;
47
- } __attribute__( ( packed ) ) openflow_service_header_t;
48
-
49
-
50
- #endif // OPENFLOW_SERVICE_INTERFACE_H
51
-
52
-
53
- /*
54
- * Local variables:
55
- * c-basic-offset: 2
56
- * indent-tabs-mode: nil
57
- * End:
58
- */
@@ -1,1378 +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 <arpa/inet.h>
20
- #include <assert.h>
21
- #include <inttypes.h>
22
- #include <syslog.h>
23
- #include "chibach_private.h"
24
- #include "hash_table.h"
25
- #include "log.h"
26
- #include "messenger.h"
27
- #include "openflow_message.h"
28
- #include "openflow_service_interface.h"
29
- #include "openflow_switch_interface.h"
30
- #include "secure_channel.h"
31
- #include "timer.h"
32
- #include "wrapper.h"
33
-
34
-
35
- typedef struct {
36
- uint64_t datapath_id;
37
- struct {
38
- uint32_t ip;
39
- uint16_t port;
40
- } controller;
41
- } openflow_switch_config;
42
-
43
- typedef bool ( *message_send_handler )( buffer *message, void *user_data );
44
-
45
- typedef struct {
46
- uint32_t transaction_id;
47
- buffer *message;
48
- message_send_handler send_callback;
49
- void *user_data;
50
- time_t created_at;
51
- } openflow_context;
52
-
53
-
54
- static bool openflow_switch_interface_initialized = false;
55
- static openflow_event_handlers event_handlers;
56
- static openflow_switch_config config;
57
- static const int CONTEXT_LIFETIME = 5;
58
- static hash_table *contexts = NULL;
59
-
60
-
61
- static bool
62
- compare_context( const void *x, const void *y ) {
63
- const openflow_context *cx = x;
64
- const openflow_context *cy = y;
65
-
66
- return ( cx->transaction_id == cy->transaction_id ) ? true : false;
67
- }
68
-
69
-
70
- static unsigned int
71
- hash_context( const void *key ) {
72
- return ( unsigned int ) *( ( const uint32_t * ) key );
73
- }
74
-
75
-
76
- static openflow_context *
77
- lookup_context( uint32_t transaction_id ) {
78
- assert( contexts != NULL );
79
-
80
- return lookup_hash_entry( contexts, &transaction_id );
81
- }
82
-
83
-
84
- static bool
85
- save_context( uint32_t transaction_id, buffer *message, message_send_handler callback, void *user_data ) {
86
- assert( contexts != NULL );
87
-
88
- openflow_context *context = lookup_context( transaction_id );
89
- if ( context != NULL ) {
90
- return false;
91
- }
92
-
93
- context = xmalloc( sizeof( openflow_context ) );
94
- memset( context, 0, sizeof( openflow_context ) );
95
- context->transaction_id = transaction_id;
96
- context->message = duplicate_buffer( message );
97
- context->send_callback = callback;
98
- context->user_data = user_data;
99
- context->created_at = time( NULL );
100
-
101
- insert_hash_entry( contexts, &context->transaction_id, context );
102
-
103
- return true;
104
- }
105
-
106
-
107
- static void
108
- delete_context( uint32_t transaction_id ) {
109
- assert( contexts != NULL );
110
-
111
- openflow_context *context = delete_hash_entry( contexts, &transaction_id );
112
- if ( context == NULL ) {
113
- return;
114
- }
115
-
116
- if ( context->message != NULL ) {
117
- free_buffer( context->message );
118
- }
119
- if ( context->user_data != NULL ) {
120
- xfree( context->user_data );
121
- }
122
-
123
- xfree( context );
124
- }
125
-
126
-
127
- static void
128
- age_contexts( void *user_data ) {
129
- UNUSED( user_data );
130
-
131
- time_t now = time( NULL );
132
-
133
- hash_iterator iter;
134
- init_hash_iterator( contexts, &iter );
135
- hash_entry *e = NULL;
136
- while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
137
- openflow_context *context = e->value;
138
- if ( ( context != NULL ) && ( ( context->created_at + CONTEXT_LIFETIME ) <= now ) ) {
139
- delete_context( context->transaction_id );
140
- }
141
- }
142
- }
143
-
144
-
145
- static void
146
- init_context() {
147
- assert( contexts == NULL );
148
-
149
- contexts = create_hash_with_size( compare_context, hash_context, 128 );
150
- }
151
-
152
-
153
- static void
154
- finalize_context() {
155
- assert( contexts != NULL );
156
-
157
- hash_iterator iter;
158
- init_hash_iterator( contexts, &iter );
159
- hash_entry *e = NULL;
160
- while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
161
- openflow_context *context = e->value;
162
- if ( context != NULL ) {
163
- delete_context( context->transaction_id );
164
- }
165
- }
166
- delete_hash( contexts );
167
- contexts = NULL;
168
- }
169
-
170
-
171
- bool
172
- openflow_switch_interface_is_initialized() {
173
- return openflow_switch_interface_initialized;
174
- }
175
-
176
-
177
- bool
178
- switch_set_openflow_event_handlers( const openflow_event_handlers handlers ) {
179
- assert( openflow_switch_interface_initialized );
180
-
181
- memcpy( &event_handlers, &handlers, sizeof( event_handlers ) );
182
-
183
- return true;
184
- }
185
-
186
-
187
- bool
188
- set_controller_connected_handler( controller_connected_handler callback, void *user_data ) {
189
- assert( callback != NULL );
190
- assert( openflow_switch_interface_initialized );
191
-
192
- debug( "Setting a controller connected handler ( callback = %p, user_data = %p ).", callback, user_data );
193
-
194
- event_handlers.controller_connected_callback = callback;
195
- event_handlers.controller_connected_user_data = user_data;
196
-
197
- return true;
198
- }
199
-
200
-
201
- bool
202
- set_controller_disconnected_handler( controller_disconnected_handler callback, void *user_data ) {
203
- assert( callback != NULL );
204
- assert( openflow_switch_interface_initialized );
205
-
206
- debug( "Setting a controller disconnected handler ( callback = %p, user_data = %p ).", callback, user_data );
207
-
208
- event_handlers.controller_disconnected_callback = callback;
209
- event_handlers.controller_disconnected_user_data = user_data;
210
-
211
- return true;
212
- }
213
-
214
-
215
- bool
216
- set_hello_handler( hello_handler callback, void *user_data ) {
217
- assert( callback != NULL );
218
- assert( openflow_switch_interface_initialized );
219
-
220
- debug( "Setting a hello handler ( callback = %p, user_data = %p ).", callback, user_data );
221
-
222
- event_handlers.hello_callback = callback;
223
- event_handlers.hello_user_data = user_data;
224
-
225
- return true;
226
- }
227
-
228
-
229
- bool
230
- switch_set_error_handler( error_handler callback, void *user_data ) {
231
- assert( callback != NULL );
232
- assert( openflow_switch_interface_initialized );
233
-
234
- debug( "Setting an error handler ( callback = %p, user_data = %p ).", callback, user_data );
235
-
236
- event_handlers.error_callback = callback;
237
- event_handlers.error_user_data = user_data;
238
-
239
- return true;
240
- }
241
-
242
-
243
- bool
244
- set_echo_request_handler( echo_request_handler callback, void *user_data ) {
245
- assert( callback != NULL );
246
- assert( openflow_switch_interface_initialized );
247
-
248
- debug( "Setting an echo request handler ( callback = %p, user_data = %p ).", callback, user_data );
249
-
250
- event_handlers.echo_request_callback = callback;
251
- event_handlers.echo_request_user_data = user_data;
252
-
253
- return true;
254
- }
255
-
256
-
257
- bool
258
- switch_set_echo_reply_handler( echo_reply_handler callback, void *user_data ) {
259
- assert( callback != NULL );
260
- assert( openflow_switch_interface_initialized );
261
-
262
- debug( "Setting an echo reply handler ( callback = %p, user_data = %p ).", callback, user_data );
263
-
264
- event_handlers.echo_reply_callback = callback;
265
- event_handlers.echo_reply_user_data = user_data;
266
-
267
- return true;
268
- }
269
-
270
-
271
- bool
272
- switch_set_vendor_handler( vendor_handler callback, void *user_data ) {
273
- assert( callback != NULL );
274
- assert( openflow_switch_interface_initialized );
275
-
276
- debug( "Setting a vendor handler ( callback = %p, user_data = %p ).", callback, user_data );
277
-
278
- event_handlers.vendor_callback = callback;
279
- event_handlers.vendor_user_data = user_data;
280
-
281
- return true;
282
- }
283
-
284
-
285
- bool
286
- set_features_request_handler( features_request_handler callback, void *user_data ) {
287
- assert( callback != NULL );
288
- assert( openflow_switch_interface_initialized );
289
-
290
- debug( "Setting a features request handler ( callback = %p, user_data = %p ).", callback, user_data );
291
-
292
- event_handlers.features_request_callback = callback;
293
- event_handlers.features_request_user_data = user_data;
294
-
295
- return true;
296
- }
297
-
298
-
299
- bool
300
- set_get_config_request_handler( get_config_request_handler callback, void *user_data ) {
301
- assert( callback != NULL );
302
- assert( openflow_switch_interface_initialized );
303
-
304
- debug( "Setting a get config request handler ( callback = %p, user_data = %p ).", callback, user_data );
305
-
306
- event_handlers.get_config_request_callback = callback;
307
- event_handlers.get_config_request_user_data = user_data;
308
-
309
- return true;
310
- }
311
-
312
-
313
- bool
314
- set_set_config_handler( set_config_handler callback, void *user_data ) {
315
- assert( callback != NULL );
316
- assert( openflow_switch_interface_initialized );
317
-
318
- debug( "Setting a set config handler ( callback = %p, user_data = %p ).", callback, user_data );
319
-
320
- event_handlers.set_config_callback = callback;
321
- event_handlers.set_config_user_data = user_data;
322
-
323
- return true;
324
- }
325
-
326
-
327
- bool
328
- set_packet_out_handler( packet_out_handler callback, void *user_data ) {
329
- assert( callback != NULL );
330
- assert( openflow_switch_interface_initialized );
331
-
332
- debug( "Setting a packet out handler ( callback = %p, user_data = %p ).", callback, user_data );
333
-
334
- event_handlers.packet_out_callback = callback;
335
- event_handlers.packet_out_user_data = user_data;
336
-
337
- return true;
338
- }
339
-
340
-
341
- bool
342
- set_flow_mod_handler( flow_mod_handler callback, void *user_data ) {
343
- assert( callback != NULL );
344
- assert( openflow_switch_interface_initialized );
345
-
346
- debug( "Setting a flow mod handler ( callback = %p, user_data = %p ).", callback, user_data );
347
-
348
- event_handlers.flow_mod_callback = callback;
349
- event_handlers.flow_mod_user_data = user_data;
350
-
351
- return true;
352
- }
353
-
354
-
355
- bool
356
- set_port_mod_handler( port_mod_handler callback, void *user_data ) {
357
- assert( callback != NULL );
358
- assert( openflow_switch_interface_initialized );
359
-
360
- debug( "Setting a port mod handler ( callback = %p, user_data = %p ).", callback, user_data );
361
-
362
- event_handlers.port_mod_callback = callback;
363
- event_handlers.port_mod_user_data = user_data;
364
-
365
- return true;
366
- }
367
-
368
-
369
- bool
370
- set_stats_request_handler( stats_request_handler callback, void *user_data ) {
371
- assert( callback != NULL );
372
- assert( openflow_switch_interface_initialized );
373
-
374
- debug( "Setting a stats request handler ( callback = %p, user_data = %p ).", callback, user_data );
375
-
376
- event_handlers.stats_request_callback = callback;
377
- event_handlers.stats_request_user_data = user_data;
378
-
379
- return true;
380
- }
381
-
382
-
383
- bool
384
- set_barrier_request_handler( barrier_request_handler callback, void *user_data ) {
385
- assert( callback != NULL );
386
- assert( openflow_switch_interface_initialized );
387
-
388
- debug( "Setting a barrier request handler ( callback = %p, user_data = %p ).", callback, user_data );
389
-
390
- event_handlers.barrier_request_callback = callback;
391
- event_handlers.barrier_request_user_data = user_data;
392
-
393
- return true;
394
- }
395
-
396
-
397
- bool
398
- set_queue_get_config_request_handler( queue_get_config_request_handler callback, void *user_data ) {
399
- assert( callback != NULL );
400
- assert( openflow_switch_interface_initialized );
401
-
402
- debug( "Setting a queue get config request handler ( callback = %p, user_data = %p ).", callback, user_data );
403
-
404
- event_handlers.queue_get_config_request_callback = callback;
405
- event_handlers.queue_get_config_request_user_data = user_data;
406
-
407
- return true;
408
- }
409
-
410
-
411
- static bool
412
- empty( const buffer *data ) {
413
- if ( ( data == NULL ) || ( ( data != NULL ) && ( data->length == 0 ) ) ) {
414
- return true;
415
- }
416
-
417
- return false;
418
- }
419
-
420
-
421
- static void
422
- handle_hello( buffer *data ) {
423
- assert( empty( data ) == false );
424
-
425
- struct ofp_header *hello = data->data;
426
-
427
- uint32_t transaction_id = ntohl( hello->xid );
428
- uint8_t version = hello->version;
429
-
430
- debug( "A hello message is received ( transaction_id = %#x, version = %#x ).", transaction_id, version );
431
-
432
- if ( event_handlers.hello_callback == NULL ) {
433
- debug( "Callback function for hello events is not set." );
434
- return;
435
- }
436
-
437
- debug( "Calling hello handler ( callback = %p, user_data = %p ).",
438
- event_handlers.hello_callback, event_handlers.hello_user_data );
439
-
440
- event_handlers.hello_callback( transaction_id,
441
- version,
442
- event_handlers.hello_user_data );
443
- }
444
-
445
-
446
- static void
447
- handle_error( buffer *data ) {
448
- assert( empty( data ) == false );
449
-
450
- struct ofp_error_msg *error_msg = ( struct ofp_error_msg * ) data->data;
451
-
452
- uint32_t transaction_id = ntohl( error_msg->header.xid );
453
- uint16_t type = ntohs( error_msg->type );
454
- uint16_t code = ntohs( error_msg->code );
455
-
456
- buffer *body = duplicate_buffer( data );
457
- remove_front_buffer( body, offsetof( struct ofp_error_msg, data ) );
458
-
459
- debug( "An error message is received ( transaction_id = %#x, type = %#x, code = %#x, data length = %zu ).",
460
- transaction_id, type, code, body->length );
461
-
462
- if ( event_handlers.error_callback == NULL ) {
463
- debug( "Callback function for error events is not set." );
464
- free_buffer( body );
465
- return;
466
- }
467
-
468
- debug( "Calling error handler ( callback = %p, user_data = %p ).",
469
- event_handlers.error_callback, event_handlers.error_user_data );
470
-
471
- event_handlers.error_callback( transaction_id,
472
- type,
473
- code,
474
- body,
475
- event_handlers.error_user_data );
476
-
477
- free_buffer( body );
478
- }
479
-
480
-
481
- static void
482
- handle_echo_request( buffer *data ) {
483
- assert( empty( data ) == false );
484
-
485
- struct ofp_header *header = data->data;
486
- uint32_t transaction_id = htonl( header->xid );
487
- uint16_t length = htons( header->length );
488
-
489
- debug( "An echo request is received ( transaction_id = %#x, len = %u ).", transaction_id, length );
490
-
491
- if ( event_handlers.echo_request_callback == NULL ) {
492
- debug( "Callback function for echo request events is not set." );
493
- return;
494
- }
495
-
496
- buffer *body = NULL;
497
- if ( ( length - sizeof( struct ofp_header ) ) > 0 ) {
498
- body = duplicate_buffer( data );
499
- remove_front_buffer( body, sizeof( struct ofp_header ) );
500
- }
501
-
502
- debug( "Calling echo request handler ( callback = %p, body = %p, user_data = %p ).",
503
- event_handlers.echo_request_callback,
504
- body,
505
- event_handlers.echo_request_user_data );
506
-
507
- event_handlers.echo_request_callback( transaction_id, body, event_handlers.echo_request_user_data );
508
-
509
- if ( body != NULL ) {
510
- free_buffer( body );
511
- }
512
- }
513
-
514
-
515
- static void
516
- handle_echo_reply( buffer *data ) {
517
- assert( empty( data ) == false );
518
-
519
- struct ofp_header *header = data->data;
520
- uint32_t transaction_id = htonl( header->xid );
521
- uint16_t length = htons( header->length );
522
-
523
- debug( "An echo reply is received ( transaction_id = %#x, len = %u ).", transaction_id, length );
524
-
525
- if ( event_handlers.echo_reply_callback == NULL ) {
526
- debug( "Callback function for echo reply events is not set." );
527
- return;
528
- }
529
-
530
- buffer *body = NULL;
531
- if ( ( length - sizeof( struct ofp_header ) ) > 0 ) {
532
- body = duplicate_buffer( data );
533
- remove_front_buffer( body, sizeof( struct ofp_header ) );
534
- }
535
-
536
- debug( "Calling echo reply handler ( callback = %p, body = %p, user_data = %p ).",
537
- event_handlers.echo_reply_callback,
538
- body,
539
- event_handlers.echo_reply_user_data );
540
-
541
- event_handlers.echo_reply_callback( transaction_id, body, event_handlers.echo_reply_user_data );
542
-
543
- if ( body != NULL ) {
544
- free_buffer( body );
545
- }
546
- }
547
-
548
-
549
- static void
550
- handle_vendor( buffer *data ) {
551
- assert( empty( data ) == false );
552
-
553
- struct ofp_vendor_header *vendor_header = ( struct ofp_vendor_header * ) data->data;
554
-
555
- uint32_t transaction_id = ntohl( vendor_header->header.xid );
556
- uint32_t vendor = ntohl( vendor_header->vendor );
557
-
558
- uint16_t body_length = ( uint16_t ) ( ntohs( vendor_header->header.length )
559
- - sizeof( struct ofp_vendor_header ) );
560
-
561
- debug( "A vendor message is received ( transaction_id = %#x, vendor = %#x, body length = %u ).",
562
- transaction_id, vendor, body_length );
563
-
564
- if ( event_handlers.vendor_callback == NULL ) {
565
- debug( "Callback function for vendor events is not set." );
566
- return;
567
- }
568
-
569
- buffer *body = NULL;
570
- if ( body_length > 0 ) {
571
- body = duplicate_buffer( data );
572
- remove_front_buffer( body, sizeof( struct ofp_vendor_header ) );
573
- }
574
-
575
- debug( "Calling vendor handler ( callback = %p, user_data = %p ).",
576
- event_handlers.vendor_callback, event_handlers.vendor_user_data );
577
-
578
- event_handlers.vendor_callback( transaction_id,
579
- vendor,
580
- body,
581
- event_handlers.vendor_user_data );
582
-
583
- if ( body != NULL ) {
584
- free_buffer( body );
585
- }
586
- }
587
-
588
-
589
- static void
590
- handle_features_request( buffer *data ) {
591
- assert( empty( data ) == false );
592
-
593
- struct ofp_header *header = data->data;
594
-
595
- uint32_t transaction_id = ntohl( header->xid );
596
-
597
- debug( "A features request is received ( transaction_id = %#x ).", transaction_id );
598
-
599
- if ( event_handlers.features_request_callback == NULL ) {
600
- debug( "Callback function for features request events is not set." );
601
- return;
602
- }
603
-
604
- debug( "Calling features request handler ( callback = %p, user_data = %p ).",
605
- event_handlers.features_request_callback,
606
- event_handlers.features_request_user_data );
607
-
608
- event_handlers.features_request_callback( transaction_id,
609
- event_handlers.features_request_user_data );
610
- }
611
-
612
-
613
- static void
614
- handle_get_config_request( buffer *data ) {
615
- assert( empty( data ) == false );
616
-
617
- struct ofp_header *header = data->data;
618
-
619
- uint32_t transaction_id = ntohl( header->xid );
620
-
621
- debug( "A get config request is received ( transaction_id = %#x ).", transaction_id );
622
-
623
- if ( event_handlers.get_config_request_callback == NULL ) {
624
- debug( "Callback function for get config request events is not set." );
625
- return;
626
- }
627
-
628
- debug( "Calling get config request handler ( callback = %p, user_data = %p ).",
629
- event_handlers.get_config_request_callback,
630
- event_handlers.get_config_request_user_data );
631
-
632
- event_handlers.get_config_request_callback( transaction_id,
633
- event_handlers.get_config_request_user_data );
634
- }
635
-
636
-
637
- static void
638
- handle_set_config( buffer *data ) {
639
- assert( empty( data ) == false );
640
-
641
- struct ofp_switch_config *config = data->data;
642
-
643
- uint32_t transaction_id = ntohl( config->header.xid );
644
- uint16_t flags = ntohs( config->flags );
645
- uint16_t miss_send_len = ntohs( config->miss_send_len );
646
-
647
- debug( "A set config is received ( transaction_id = %#x, flags = %#x, miss_send_len = %u ).",
648
- transaction_id, flags, miss_send_len );
649
-
650
- if ( event_handlers.set_config_callback == NULL ) {
651
- debug( "Callback function for set config events is not set." );
652
- return;
653
- }
654
-
655
- debug( "Calling set config handler ( callback = %p, user_data = %p ).",
656
- event_handlers.set_config_callback,
657
- event_handlers.set_config_user_data );
658
-
659
- event_handlers.set_config_callback( transaction_id, flags, miss_send_len,
660
- event_handlers.set_config_user_data );
661
- }
662
-
663
-
664
- static void
665
- handle_packet_out( buffer *data ) {
666
- assert( empty( data ) == false );
667
-
668
- struct ofp_packet_out *packet_out = data->data;
669
-
670
- uint32_t transaction_id = ntohl( packet_out->header.xid );
671
- uint32_t buffer_id = ntohl( packet_out->buffer_id );
672
- uint16_t in_port = ntohs( packet_out->in_port );
673
- size_t actions_len = ntohs( packet_out->actions_len );
674
- openflow_actions *actions = NULL;
675
- if ( actions_len > 0 ) {
676
- actions = create_actions();
677
- void *actions_p = packet_out->actions;
678
- while ( actions_len > 0 ) {
679
- struct ofp_action_header *ah = actions_p;
680
- ntoh_action( ah, ah );
681
- actions_len -= ah->len;
682
- actions_p = ( char * ) actions_p + ah->len;
683
-
684
- void *action = xmalloc( ah->len );
685
- memcpy( action, ah, ah->len );
686
- append_to_tail( &actions->list, ( void * ) action );
687
- actions->n_actions++;
688
- }
689
- }
690
-
691
- buffer *frame = NULL;
692
- actions_len = ntohs( packet_out->actions_len );
693
- size_t frame_length = ntohs( packet_out->header.length ) - offsetof( struct ofp_packet_out, actions ) - actions_len;
694
- if ( frame_length > 0 ) {
695
- frame = alloc_buffer_with_length( frame_length );
696
- void *p = append_back_buffer( frame, frame_length );
697
- size_t offset = offsetof( struct ofp_packet_out, actions ) + actions_len;
698
- memcpy( p, ( char * ) packet_out + offset, frame_length );
699
- }
700
-
701
- debug( "A packet-out is received ( transaction_id = %#x, buffer_id = %#x, in_port = %u, "
702
- "actions_len = %zu, frame_length = %zu ).",
703
- transaction_id, buffer_id, in_port, actions_len, frame_length );
704
-
705
- if ( event_handlers.packet_out_callback == NULL ) {
706
- debug( "Callback function for packet-out events is not set." );
707
- return;
708
- }
709
-
710
- debug( "Calling packet-outhandler ( callback = %p, user_data = %p ).",
711
- event_handlers.packet_out_callback,
712
- event_handlers.packet_out_user_data );
713
-
714
- event_handlers.packet_out_callback( transaction_id, buffer_id, in_port, actions, frame,
715
- event_handlers.packet_out_user_data );
716
-
717
- if ( actions != NULL ) {
718
- delete_actions( actions );
719
- }
720
- if ( frame != NULL ) {
721
- free_buffer( frame );
722
- }
723
- }
724
-
725
-
726
- static void
727
- handle_flow_mod( buffer *data ) {
728
- assert( empty( data ) == false );
729
-
730
- struct ofp_flow_mod *flow_mod = data->data;
731
-
732
- uint32_t transaction_id = ntohl( flow_mod->header.xid );
733
- struct ofp_match match;
734
- ntoh_match( &match, &flow_mod->match );
735
- uint64_t cookie = ntohll( flow_mod->cookie );
736
- uint16_t command = ntohs( flow_mod->command );
737
- uint16_t idle_timeout = ntohs( flow_mod->idle_timeout );
738
- uint16_t hard_timeout = ntohs( flow_mod->hard_timeout );
739
- uint16_t priority = ntohs( flow_mod->priority );
740
- uint32_t buffer_id = ntohl( flow_mod->buffer_id );
741
- uint16_t out_port = ntohs( flow_mod->out_port );
742
- uint16_t flags = ntohs( flow_mod->flags );
743
-
744
- size_t actions_length = ntohs( flow_mod->header.length ) - offsetof( struct ofp_flow_mod, actions );
745
- openflow_actions *actions = NULL;
746
- if ( actions_length > 0 ) {
747
- actions = create_actions();
748
- void *actions_p = flow_mod->actions;
749
- while ( actions_length > 0 ) {
750
- struct ofp_action_header *ah = actions_p;
751
- ntoh_action( ah, ah );
752
- actions_length -= ah->len;
753
- actions_p = ( char * ) actions_p + ah->len;
754
-
755
- void *action = xmalloc( ah->len );
756
- memcpy( action, ah, ah->len );
757
- append_to_tail( &actions->list, ( void * ) action );
758
- actions->n_actions++;
759
- }
760
- }
761
-
762
- if ( get_logging_level() >= LOG_DEBUG ) {
763
- char match_str[ 256 ];
764
- match_to_string( &match, match_str, sizeof( match_str ) );
765
- debug( "A flow modification is received ( transaction_id = %#x, match = [%s], cookie = %#" PRIx64 ", "
766
- "command = %#x, idle_timeout = %u, hard_timeout = %u, priority = %u, buffer_id = %#x, "
767
- "out_port = %u, flags = %#x ).",
768
- transaction_id, match_str, cookie, command, idle_timeout, hard_timeout, priority, buffer_id,
769
- out_port, flags );
770
- }
771
-
772
- if ( event_handlers.flow_mod_callback == NULL ) {
773
- debug( "Callback function for flow modification events is not set." );
774
- return;
775
- }
776
-
777
- debug( "Calling flow modification handler ( callback = %p, user_data = %p ).",
778
- event_handlers.flow_mod_callback,
779
- event_handlers.flow_mod_user_data );
780
-
781
- event_handlers.flow_mod_callback( transaction_id, match, cookie, command, idle_timeout, hard_timeout,
782
- priority, buffer_id, out_port, flags, actions,
783
- event_handlers.flow_mod_user_data );
784
-
785
- if ( actions != NULL ) {
786
- delete_actions( actions );
787
- }
788
- }
789
-
790
-
791
- static void
792
- handle_port_mod( buffer *data ) {
793
- assert( empty( data ) == false );
794
-
795
- struct ofp_port_mod *port_mod = data->data;
796
-
797
- uint32_t transaction_id = ntohl( port_mod->header.xid );
798
- uint16_t port_no = ntohs( port_mod->port_no );
799
- uint8_t hw_addr[ OFP_ETH_ALEN ];
800
- memcpy( hw_addr, port_mod->hw_addr, OFP_ETH_ALEN );
801
- uint32_t config = ntohl( port_mod->config );
802
- uint32_t mask = ntohl( port_mod->mask );
803
- uint32_t advertise = ntohl( port_mod->advertise );
804
-
805
- debug( "A port modification is received ( transaction_id = %#x, port_no = %u, "
806
- "hw_addr = %02x:%02x:%02x:%02x:%02x:%02x, config = %#x, mask = %#x, advertise = %#x ).",
807
- transaction_id, port_no,
808
- hw_addr[ 0 ], hw_addr[ 1 ], hw_addr[ 2 ], hw_addr[ 3 ], hw_addr[ 4 ], hw_addr[ 5 ],
809
- config, mask, advertise );
810
-
811
- if ( event_handlers.port_mod_callback == NULL ) {
812
- debug( "Callback function for port modification events is not set." );
813
- return;
814
- }
815
-
816
- debug( "Calling port modification handler ( callback = %p, user_data = %p ).",
817
- event_handlers.port_mod_callback,
818
- event_handlers.port_mod_user_data );
819
-
820
- event_handlers.port_mod_callback( transaction_id, port_no, hw_addr, config, mask, advertise,
821
- event_handlers.port_mod_user_data );
822
-
823
- }
824
-
825
-
826
- static void
827
- handle_stats_request( buffer *data ) {
828
- assert( empty( data ) == false );
829
-
830
- struct ofp_stats_request *stats_request = data->data;
831
-
832
- uint32_t transaction_id = ntohl( stats_request->header.xid );
833
- uint16_t type = ntohs( stats_request->type );
834
- uint16_t flags = ntohs( stats_request->flags );
835
-
836
- size_t body_length = ntohs( stats_request->header.length ) - offsetof( struct ofp_stats_request, body );
837
- buffer *body = NULL;
838
- if ( body_length > 0 ) {
839
- body = alloc_buffer_with_length( body_length );
840
- void *p = append_back_buffer( body, body_length );
841
- memcpy( p, stats_request->body, body_length );
842
-
843
- switch ( type ) {
844
- case OFPST_FLOW:
845
- {
846
- struct ofp_flow_stats_request *flow = p;
847
- ntoh_match( &flow->match, &flow->match );
848
- flow->out_port = ntohs( flow->out_port );
849
- }
850
- break;
851
-
852
- case OFPST_AGGREGATE:
853
- {
854
- struct ofp_aggregate_stats_request *aggregate = p;
855
- ntoh_match( &aggregate->match, &aggregate->match );
856
- aggregate->out_port = ntohs( aggregate->out_port );
857
- }
858
- break;
859
-
860
- case OFPST_PORT:
861
- {
862
- struct ofp_port_stats_request *port = p;
863
- port->port_no = ntohs( port->port_no );
864
- }
865
- break;
866
-
867
- case OFPST_VENDOR:
868
- {
869
- uint32_t *vendor_id = p;
870
- *vendor_id = ntohl( *vendor_id );
871
- }
872
- break;
873
-
874
- default:
875
- break;
876
- }
877
- }
878
-
879
- debug( "A stats request is received ( transaction_id = %#x, type = %#x, flags = %#x ).",
880
- transaction_id, type, flags );
881
-
882
- if ( event_handlers.stats_request_callback == NULL ) {
883
- debug( "Callback function for stats request events is not set." );
884
- return;
885
- }
886
-
887
- debug( "Calling stats request handler ( callback = %p, user_data = %p ).",
888
- event_handlers.stats_request_callback,
889
- event_handlers.stats_request_user_data );
890
-
891
- event_handlers.stats_request_callback( transaction_id, type, flags, body,
892
- event_handlers.stats_request_user_data );
893
-
894
- if ( body_length > 0 && body != NULL ) {
895
- free_buffer( body );
896
- }
897
- }
898
-
899
-
900
- static void
901
- handle_barrier_request( buffer *data ) {
902
- assert( empty( data ) == false );
903
-
904
- struct ofp_header *header = data->data;
905
-
906
- uint32_t transaction_id = ntohl( header->xid );
907
-
908
- debug( "A barrier request is received ( transaction_id = %#x ).", transaction_id );
909
-
910
- if ( event_handlers.barrier_request_callback == NULL ) {
911
- debug( "Callback function for barrier request events is not set." );
912
- return;
913
- }
914
-
915
- debug( "Calling barrier request handler ( callback = %p, user_data = %p ).",
916
- event_handlers.barrier_request_callback,
917
- event_handlers.barrier_request_user_data );
918
-
919
- event_handlers.barrier_request_callback( transaction_id,
920
- event_handlers.barrier_request_user_data );
921
- }
922
-
923
-
924
- static void
925
- handle_queue_get_config_request( buffer *data ) {
926
- assert( empty( data ) == false );
927
-
928
- struct ofp_queue_get_config_request *queue_get_config_request = data->data;
929
-
930
- uint32_t transaction_id = ntohl( queue_get_config_request->header.xid );
931
- uint16_t port = ntohs( queue_get_config_request->port );
932
-
933
- debug( "A queue get config request is received ( transaction_id = %#x, port = %u ).",
934
- transaction_id, port );
935
-
936
- if ( event_handlers.queue_get_config_request_callback == NULL ) {
937
- debug( "Callback function for queue get config request events is not set." );
938
- return;
939
- }
940
-
941
- debug( "Calling queue get config request handler ( callback = %p, user_data = %p ).",
942
- event_handlers.queue_get_config_request_callback,
943
- event_handlers.queue_get_config_request_user_data );
944
-
945
- event_handlers.queue_get_config_request_callback( transaction_id, port,
946
- event_handlers.queue_get_config_request_user_data );
947
- }
948
-
949
-
950
- static void
951
- handle_controller_connected() {
952
- if ( event_handlers.controller_connected_callback == NULL ) {
953
- debug( "Callback function for controller connected events is not set." );
954
- return;
955
- }
956
-
957
- event_handlers.controller_connected_callback( event_handlers.controller_connected_user_data );
958
- }
959
-
960
-
961
- static void
962
- handle_controller_disconnected() {
963
- if ( event_handlers.controller_disconnected_callback == NULL ) {
964
- debug( "Callback function for controller disconnected events is not set." );
965
- return;
966
- }
967
-
968
- event_handlers.controller_disconnected_callback( event_handlers.controller_disconnected_user_data );
969
- }
970
-
971
-
972
- static bool
973
- handle_openflow_message( buffer *message ) {
974
- debug( "An OpenFlow message is received from remote." );
975
-
976
- assert( message != NULL );
977
- assert( message->length >= sizeof( struct ofp_header ) );
978
-
979
- int ret = validate_openflow_message( message );
980
- if ( ret < 0 ) {
981
- error( "Failed to validate an OpenFlow message ( code = %d, length = %zu ).", ret, message->length );
982
- return false;
983
- }
984
-
985
- ret = true;
986
- struct ofp_header *header = ( struct ofp_header * ) message->data;
987
-
988
- switch ( header->type ) {
989
- case OFPT_HELLO:
990
- handle_hello( message );
991
- break;
992
- case OFPT_ERROR:
993
- handle_error( message );
994
- break;
995
- case OFPT_ECHO_REQUEST:
996
- handle_echo_request( message );
997
- break;
998
- case OFPT_ECHO_REPLY:
999
- handle_echo_reply( message );
1000
- break;
1001
- case OFPT_VENDOR:
1002
- handle_vendor( message);
1003
- break;
1004
- case OFPT_FEATURES_REQUEST:
1005
- handle_features_request( message );
1006
- break;
1007
- case OFPT_GET_CONFIG_REQUEST:
1008
- handle_get_config_request( message );
1009
- break;
1010
- case OFPT_SET_CONFIG:
1011
- handle_set_config( message );
1012
- break;
1013
- case OFPT_PACKET_OUT:
1014
- handle_packet_out( message );
1015
- break;
1016
- case OFPT_FLOW_MOD:
1017
- handle_flow_mod( message );
1018
- break;
1019
- case OFPT_PORT_MOD:
1020
- handle_port_mod( message );
1021
- break;
1022
- case OFPT_STATS_REQUEST:
1023
- handle_stats_request( message );
1024
- break;
1025
- case OFPT_BARRIER_REQUEST:
1026
- handle_barrier_request( message );
1027
- break;
1028
- case OFPT_QUEUE_GET_CONFIG_REQUEST:
1029
- handle_queue_get_config_request( message );
1030
- break;
1031
- default:
1032
- error( "Unhandled OpenFlow message ( type = %#x ).", header->type );
1033
- ret = false;
1034
- break;
1035
- }
1036
-
1037
- return ret;
1038
- }
1039
-
1040
-
1041
- static bool
1042
- send_openflow_message_to_secure_channel( buffer *message, void *user_data ) {
1043
- assert( user_data == NULL );
1044
-
1045
- return send_message_to_secure_channel( message );
1046
- }
1047
-
1048
-
1049
- static bool
1050
- send_openflow_message_to_local( buffer *message, void *user_data ) {
1051
- char *service_name = user_data;
1052
- size_t service_name_length = strlen( service_name ) + 1;
1053
- size_t service_header_length = sizeof( openflow_service_header_t ) + service_name_length;
1054
- openflow_service_header_t *service_header = append_front_buffer( message, service_header_length );
1055
- service_header->service_name_length = htons( ( uint16_t ) service_name_length );
1056
- memcpy( ( char * ) service_header + sizeof( openflow_service_header_t ), service_name, service_name_length );
1057
-
1058
- return send_message( service_name, MESSENGER_OPENFLOW_MESSAGE, message->data, message->length );
1059
- }
1060
-
1061
-
1062
- bool
1063
- switch_send_openflow_message( buffer *message ) {
1064
- assert( message != NULL );
1065
- assert( message->length >= sizeof( struct ofp_header ) );
1066
-
1067
- struct ofp_header *header = message->data;
1068
- uint32_t transaction_id = ntohl( header->xid );
1069
- openflow_context *context = lookup_context( transaction_id );
1070
- if ( context != NULL ) {
1071
- assert( context->send_callback != NULL );
1072
- return context->send_callback( message, context->user_data );
1073
- }
1074
-
1075
- return send_openflow_message_to_secure_channel( message, NULL );
1076
- }
1077
-
1078
-
1079
- bool
1080
- handle_secure_channel_message( buffer *message ) {
1081
- debug( "An OpenFlow message is received from remote." );
1082
-
1083
- assert( message != NULL );
1084
- assert( message->length >= sizeof( struct ofp_header ) );
1085
-
1086
- struct ofp_header *header = message->data;
1087
-
1088
- save_context( ntohl( header->xid ), message, send_openflow_message_to_secure_channel, NULL );
1089
-
1090
- return handle_openflow_message( message );
1091
- }
1092
-
1093
-
1094
- static void
1095
- handle_local_message( uint16_t tag, void *data, size_t length ) {
1096
- assert( data != NULL );
1097
- assert( length >= sizeof( openflow_service_header_t ) );
1098
-
1099
- debug( "A message is received from remote ( tag = %#x, data = %p, length = %zu ).", tag, data, length );
1100
-
1101
- switch ( tag ) {
1102
- case MESSENGER_OPENFLOW_MESSAGE:
1103
- {
1104
- openflow_service_header_t *header = data;
1105
- uint16_t service_name_length = ntohs( header->service_name_length );
1106
- size_t ofp_offset = sizeof( openflow_service_header_t ) + service_name_length;
1107
- size_t ofp_length = length - ofp_offset;
1108
- buffer *message = alloc_buffer_with_length( ofp_length );
1109
- char *p = append_back_buffer( message, ofp_length );
1110
- memcpy( p, ( char * ) data + ofp_offset, ofp_length );
1111
- char *service_name = strndup( ( char * ) data + sizeof( openflow_service_header_t ), service_name_length );
1112
-
1113
- save_context( ntohl( ( ( struct ofp_header * ) p )->xid ), message, send_openflow_message_to_local,
1114
- service_name );
1115
-
1116
- handle_openflow_message( message );
1117
- }
1118
- break;
1119
- default:
1120
- break;
1121
- }
1122
- }
1123
-
1124
-
1125
- bool
1126
- init_openflow_switch_interface( const uint64_t datapath_id, uint32_t controller_ip, uint16_t controller_port ) {
1127
- debug( "Initializing OpenFlow Switch Interface ( datapath_id = %#" PRIx64 ", controller_ip = %#x, controller_port = %u ).",
1128
- datapath_id, controller_ip, controller_port );
1129
-
1130
- if ( openflow_switch_interface_is_initialized() ) {
1131
- error( "OpenFlow Switch Interface is already initialized." );
1132
- return false;
1133
- }
1134
-
1135
- bool ret = init_secure_channel( controller_ip, controller_port,
1136
- handle_controller_connected, handle_controller_disconnected );
1137
- if ( ret == false ) {
1138
- error( "Failed to initialize a secure chanel." );
1139
- return false;
1140
- }
1141
-
1142
-
1143
- memset( &event_handlers, 0, sizeof( openflow_event_handlers ) );
1144
- memset( &config, 0, sizeof( openflow_switch_config ) );
1145
-
1146
- config.datapath_id = datapath_id;
1147
- config.controller.ip = controller_ip;
1148
- config.controller.port = controller_port;
1149
-
1150
- init_context();
1151
-
1152
- add_periodic_event_callback( 5, age_contexts, NULL );
1153
- add_message_received_callback( get_chibach_name(), handle_local_message );
1154
-
1155
- openflow_switch_interface_initialized = true;
1156
-
1157
- return true;
1158
- }
1159
-
1160
-
1161
- bool
1162
- finalize_openflow_switch_interface() {
1163
- if ( !openflow_switch_interface_is_initialized() ) {
1164
- error( "OpenFlow Switch Interface is not initialized." );
1165
- return false;
1166
- }
1167
-
1168
- finalize_secure_channel();
1169
-
1170
- delete_timer_event( age_contexts, NULL );
1171
- finalize_context();
1172
-
1173
- openflow_switch_interface_initialized = false;
1174
-
1175
- return true;
1176
- }
1177
-
1178
-
1179
- static const buffer *
1180
- get_openflow_message( uint32_t transaction_id ) {
1181
- openflow_context *context = lookup_context( transaction_id );
1182
- if ( context == NULL ) {
1183
- return NULL;
1184
- }
1185
-
1186
- return context->message;
1187
- }
1188
-
1189
-
1190
- bool
1191
- send_error_message( uint32_t transaction_id, uint16_t type, uint16_t code ) {
1192
- buffer *data = NULL;
1193
- switch ( type ) {
1194
- case OFPET_HELLO_FAILED:
1195
- {
1196
- switch ( code ) {
1197
- case OFPHFC_INCOMPATIBLE:
1198
- {
1199
- const char *description = "Incompatible OpenFlow version.";
1200
- size_t length = strlen( description ) + 1;
1201
- data = alloc_buffer_with_length ( length );
1202
- void *p = append_back_buffer( data, length );
1203
- strncpy( p, description, length );
1204
- }
1205
- break;
1206
- case OFPHFC_EPERM:
1207
- {
1208
- const char *description = "Permissions error.";
1209
- size_t length = strlen( description ) + 1;
1210
- data = alloc_buffer_with_length ( length );
1211
- void *p = append_back_buffer( data, length );
1212
- strncpy( p, description, length );
1213
- }
1214
- break;
1215
- default:
1216
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1217
- return false;
1218
- }
1219
- }
1220
- break;
1221
-
1222
- case OFPET_BAD_REQUEST:
1223
- {
1224
- switch ( code ) {
1225
- case OFPBRC_BAD_VERSION:
1226
- case OFPBRC_BAD_TYPE:
1227
- case OFPBRC_BAD_STAT:
1228
- case OFPBRC_BAD_VENDOR:
1229
- case OFPBRC_BAD_SUBTYPE:
1230
- case OFPBRC_EPERM:
1231
- case OFPBRC_BAD_LEN:
1232
- case OFPBRC_BUFFER_EMPTY:
1233
- case OFPBRC_BUFFER_UNKNOWN:
1234
- {
1235
- const buffer *original_message = get_openflow_message( transaction_id );
1236
- if ( original_message != NULL ) {
1237
- data = duplicate_buffer( original_message );
1238
- if ( data->length > 64 ) {
1239
- data->length = 64;
1240
- }
1241
- }
1242
- }
1243
- break;
1244
- default:
1245
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1246
- return false;
1247
- }
1248
- }
1249
- break;
1250
-
1251
- case OFPET_BAD_ACTION:
1252
- {
1253
- switch ( code ) {
1254
- case OFPBAC_BAD_TYPE:
1255
- case OFPBAC_BAD_LEN:
1256
- case OFPBAC_BAD_VENDOR:
1257
- case OFPBAC_BAD_VENDOR_TYPE:
1258
- case OFPBAC_BAD_OUT_PORT:
1259
- case OFPBAC_BAD_ARGUMENT:
1260
- case OFPBAC_EPERM:
1261
- case OFPBAC_TOO_MANY:
1262
- case OFPBAC_BAD_QUEUE:
1263
- {
1264
- const buffer *original_message = get_openflow_message( transaction_id );
1265
- if ( original_message != NULL ) {
1266
- data = duplicate_buffer( original_message );
1267
- if ( data->length > 64 ) {
1268
- data->length = 64;
1269
- }
1270
- }
1271
- }
1272
- break;
1273
- default:
1274
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1275
- return false;
1276
- }
1277
-
1278
- }
1279
- break;
1280
-
1281
- case OFPET_FLOW_MOD_FAILED:
1282
- {
1283
- switch ( code ) {
1284
- case OFPFMFC_ALL_TABLES_FULL:
1285
- case OFPFMFC_OVERLAP:
1286
- case OFPFMFC_EPERM:
1287
- case OFPFMFC_BAD_EMERG_TIMEOUT:
1288
- case OFPFMFC_BAD_COMMAND:
1289
- case OFPFMFC_UNSUPPORTED:
1290
- {
1291
- const buffer *original_message = get_openflow_message( transaction_id );
1292
- if ( original_message != NULL ) {
1293
- data = duplicate_buffer( original_message );
1294
- if ( data->length > 64 ) {
1295
- data->length = 64;
1296
- }
1297
- }
1298
- }
1299
- break;
1300
- default:
1301
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1302
- return false;
1303
- }
1304
- }
1305
- break;
1306
-
1307
- case OFPET_PORT_MOD_FAILED:
1308
- {
1309
- switch ( code ) {
1310
- case OFPPMFC_BAD_PORT:
1311
- case OFPPMFC_BAD_HW_ADDR:
1312
- {
1313
- const buffer *original_message = get_openflow_message( transaction_id );
1314
- if ( original_message != NULL ) {
1315
- data = duplicate_buffer( original_message );
1316
- if ( data->length > 64 ) {
1317
- data->length = 64;
1318
- }
1319
- }
1320
- }
1321
- break;
1322
- default:
1323
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1324
- return false;
1325
- }
1326
- }
1327
- break;
1328
-
1329
- case OFPET_QUEUE_OP_FAILED:
1330
- {
1331
- switch ( code ) {
1332
- case OFPQOFC_BAD_PORT:
1333
- case OFPQOFC_BAD_QUEUE:
1334
- case OFPQOFC_EPERM:
1335
- {
1336
- const buffer *original_message = get_openflow_message( transaction_id );
1337
- if ( original_message != NULL ) {
1338
- data = duplicate_buffer( original_message );
1339
- if ( data->length > 64 ) {
1340
- data->length = 64;
1341
- }
1342
- }
1343
- }
1344
- break;
1345
- default:
1346
- error( "Undefined error code ( type = %#x, code = %#x ).", type, code );
1347
- return false;
1348
- }
1349
- }
1350
- break;
1351
-
1352
- default:
1353
- error( "Undefined error type ( type = %#x, code = %#x ).", type, code );
1354
- return false;
1355
- }
1356
-
1357
- buffer *err = create_error( transaction_id, type, code, data );
1358
- bool ret = switch_send_openflow_message( err );
1359
- if ( !ret ) {
1360
- error( "Failed to send an error message ( transaction_id = %#x, type = %#x, code = %#x ).",
1361
- transaction_id, type, code );
1362
- }
1363
-
1364
- free_buffer( err );
1365
- if ( data != NULL ) {
1366
- free_buffer( data );
1367
- }
1368
-
1369
- return ret;
1370
- }
1371
-
1372
-
1373
- /*
1374
- * Local variables:
1375
- * c-basic-offset: 2
1376
- * indent-tabs-mode: nil
1377
- * End:
1378
- */