trema 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +33 -54
  3. data/.hound.yml +3 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +17 -1
  6. data/.travis.yml +14 -18
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +1 -26
  9. data/README.md +25 -241
  10. data/Rakefile +4 -1056
  11. data/bin/.gitignore +3 -0
  12. data/bin/trema +163 -237
  13. data/features/cleanup_on_failure.feature +118 -0
  14. data/features/logging.feature +73 -0
  15. data/features/open_flow13.feature +21 -0
  16. data/features/step_definitions/.gitignore +35 -0
  17. data/features/step_definitions/.rubocop.yml +5 -0
  18. data/features/step_definitions/.travis.yml +19 -0
  19. data/features/step_definitions/Gemfile +9 -0
  20. data/features/step_definitions/Guardfile +4 -0
  21. data/features/step_definitions/LICENSE +675 -0
  22. data/features/step_definitions/README.md +7 -0
  23. data/features/step_definitions/Rakefile +10 -0
  24. data/features/step_definitions/show_stats_steps.rb +56 -0
  25. data/features/step_definitions/virtual_link_steps.rb +8 -0
  26. data/features/support/env.rb +0 -73
  27. data/features/support/hooks.rb +6 -50
  28. data/features/trema_delete_link.feature +30 -0
  29. data/features/trema_killall.feature +56 -0
  30. data/features/trema_run.feature +47 -0
  31. data/features/trema_start.feature +73 -0
  32. data/features/trema_stop.feature +50 -0
  33. data/lib/trema.rb +4 -0
  34. data/lib/trema/command.rb +184 -0
  35. data/lib/trema/controller.rb +289 -0
  36. data/lib/trema/dirs.rb +14 -0
  37. data/lib/trema/drb.rb +32 -0
  38. data/lib/trema/logger.rb +63 -0
  39. data/lib/trema/monkey_patch/integer.rb +8 -0
  40. data/lib/trema/monkey_patch/integer/base_conversions.rb +12 -0
  41. data/lib/trema/monkey_patch/integer/durations.rb +12 -0
  42. data/lib/trema/switch.rb +83 -0
  43. data/lib/trema/version.rb +5 -0
  44. data/spec/spec_helper.rb +9 -178
  45. data/spec/trema/controller_spec.rb +4 -53
  46. data/tasks/.gitignore +34 -0
  47. data/tasks/LICENSE +675 -0
  48. data/tasks/README.md +6 -0
  49. data/tasks/cucumber.rake +14 -0
  50. data/tasks/flay.rake +15 -0
  51. data/tasks/flog.rake +25 -0
  52. data/tasks/gem.rake +15 -0
  53. data/tasks/reek.rake +11 -0
  54. data/tasks/relish.rake +8 -0
  55. data/tasks/rspec.rake +8 -0
  56. data/tasks/rubocop.rake +2 -16
  57. data/tasks/yard.rake +11 -0
  58. data/trema.gemspec +24 -23
  59. metadata +180 -720
  60. data/.yardopts +0 -4
  61. data/Doxyfile +0 -1679
  62. data/Guardfile +0 -14
  63. data/bin/quality +0 -31
  64. data/bin/trema-config +0 -59
  65. data/build.rb +0 -32
  66. data/cruise.rb +0 -409
  67. data/features/.nav +0 -50
  68. data/features/README.md +0 -7
  69. data/features/core/get_pid_by_trema_name.feature +0 -137
  70. data/features/core/packetin_filter.feature +0 -55
  71. data/features/core/switch_manager.feature +0 -41
  72. data/features/core/trema-config.feature +0 -55
  73. data/features/dsl/switch_port_specifier.feature +0 -15
  74. data/features/examples/dumper.feature +0 -35
  75. data/features/examples/hello_trema.feature +0 -23
  76. data/features/examples/learning_switch.feature +0 -37
  77. data/features/examples/list_switches.feature +0 -24
  78. data/features/examples/message.set_config.feature +0 -27
  79. data/features/examples/message.vendor-action.feature +0 -25
  80. data/features/examples/message.vendor-stats-request.feature +0 -20
  81. data/features/examples/multi_learning_switch.feature +0 -107
  82. data/features/examples/openflow_message.echo.feature +0 -59
  83. data/features/examples/openflow_message.features_request.feature +0 -35
  84. data/features/examples/openflow_message.hello.feature +0 -59
  85. data/features/examples/packet_in.feature +0 -33
  86. data/features/examples/packetin_filter_config.feature +0 -95
  87. data/features/examples/patch_panel.feature +0 -29
  88. data/features/examples/repeater_hub.feature +0 -52
  89. data/features/examples/switch_info.feature +0 -51
  90. data/features/examples/switch_monitor.feature +0 -35
  91. data/features/examples/transparent_firewall.feature +0 -73
  92. data/features/handlers/switch_ready.feature +0 -40
  93. data/features/step_definitions/misc_steps.rb +0 -85
  94. data/features/step_definitions/send_packets_steps.rb +0 -33
  95. data/features/step_definitions/stats_steps.rb +0 -39
  96. data/features/switch_event/C-add_forward_entry.feature +0 -114
  97. data/features/switch_event/C-delete_forward_entry.feature +0 -85
  98. data/features/switch_event/C-dump_forward_entries.feature +0 -72
  99. data/features/switch_event/C-set_forward_entries.feature +0 -77
  100. data/features/switch_event/README.md +0 -40
  101. data/features/switch_event/add_forward_entry.feature +0 -160
  102. data/features/switch_event/delete_forward_entry.feature +0 -160
  103. data/features/switch_event/dump_forward_entries.feature +0 -103
  104. data/features/switch_event/set_forward_entries.feature +0 -102
  105. data/features/trema_commands/README.md +0 -8
  106. data/features/trema_commands/dump_flows.feature +0 -41
  107. data/features/trema_commands/help.feature +0 -27
  108. data/features/trema_commands/help_option.feature +0 -20
  109. data/features/trema_commands/kill.feature +0 -56
  110. data/features/trema_commands/killall.feature +0 -32
  111. data/features/trema_commands/port_down.feature +0 -71
  112. data/features/trema_commands/port_up.feature +0 -75
  113. data/features/trema_commands/reset_stats.feature +0 -56
  114. data/features/trema_commands/run.feature +0 -56
  115. data/features/trema_commands/send_packets.feature +0 -46
  116. data/features/trema_commands/show_stats.feature +0 -66
  117. data/features/trema_commands/up.feature +0 -34
  118. data/features/trema_commands/version.feature +0 -10
  119. data/features/trema_commands/version_option.feature +0 -8
  120. data/rubocop-todo.yml +0 -159
  121. data/ruby/.gitignore +0 -4
  122. data/ruby/blocker.rb +0 -74
  123. data/ruby/extconf.rb +0 -80
  124. data/ruby/sub-process.rb +0 -289
  125. data/ruby/trema/action-common.c +0 -46
  126. data/ruby/trema/action-common.h +0 -38
  127. data/ruby/trema/action.rb +0 -33
  128. data/ruby/trema/aggregate-stats-reply.rb +0 -68
  129. data/ruby/trema/app.rb +0 -114
  130. data/ruby/trema/barrier-reply.c +0 -98
  131. data/ruby/trema/barrier-reply.h +0 -44
  132. data/ruby/trema/barrier-request.c +0 -135
  133. data/ruby/trema/barrier-request.h +0 -42
  134. data/ruby/trema/cli.rb +0 -267
  135. data/ruby/trema/command.rb +0 -41
  136. data/ruby/trema/command/dump_flows.rb +0 -43
  137. data/ruby/trema/command/kill.rb +0 -75
  138. data/ruby/trema/command/killall.rb +0 -38
  139. data/ruby/trema/command/netns.rb +0 -38
  140. data/ruby/trema/command/port_down.rb +0 -43
  141. data/ruby/trema/command/port_up.rb +0 -43
  142. data/ruby/trema/command/reset_stats.rb +0 -41
  143. data/ruby/trema/command/ruby.rb +0 -38
  144. data/ruby/trema/command/run.rb +0 -110
  145. data/ruby/trema/command/send_packets.rb +0 -46
  146. data/ruby/trema/command/shell.rb +0 -57
  147. data/ruby/trema/command/show_stats.rb +0 -65
  148. data/ruby/trema/command/up.rb +0 -44
  149. data/ruby/trema/command/version.rb +0 -35
  150. data/ruby/trema/compat.h +0 -36
  151. data/ruby/trema/controller.c +0 -691
  152. data/ruby/trema/controller.h +0 -42
  153. data/ruby/trema/controller.rb +0 -255
  154. data/ruby/trema/custom-switch.rb +0 -56
  155. data/ruby/trema/daemon.rb +0 -184
  156. data/ruby/trema/default-logger.c +0 -161
  157. data/ruby/trema/default-logger.h +0 -42
  158. data/ruby/trema/default-logger.rb +0 -29
  159. data/ruby/trema/default_openflow_channel_port.rb +0 -26
  160. data/ruby/trema/desc-stats-reply.rb +0 -75
  161. data/ruby/trema/dsl.rb +0 -32
  162. data/ruby/trema/dsl/configuration.rb +0 -145
  163. data/ruby/trema/dsl/context.rb +0 -69
  164. data/ruby/trema/dsl/custom-switch.rb +0 -44
  165. data/ruby/trema/dsl/link.rb +0 -39
  166. data/ruby/trema/dsl/netns.rb +0 -78
  167. data/ruby/trema/dsl/parser.rb +0 -70
  168. data/ruby/trema/dsl/rswitch.rb +0 -47
  169. data/ruby/trema/dsl/run.rb +0 -47
  170. data/ruby/trema/dsl/runner.rb +0 -178
  171. data/ruby/trema/dsl/stanza.rb +0 -51
  172. data/ruby/trema/dsl/switch.rb +0 -76
  173. data/ruby/trema/dsl/syntax-error.rb +0 -31
  174. data/ruby/trema/dsl/syntax.rb +0 -128
  175. data/ruby/trema/dsl/vhost.rb +0 -106
  176. data/ruby/trema/dsl/vswitch.rb +0 -45
  177. data/ruby/trema/echo-reply.c +0 -122
  178. data/ruby/trema/echo-reply.h +0 -40
  179. data/ruby/trema/echo-request.c +0 -117
  180. data/ruby/trema/echo-request.h +0 -40
  181. data/ruby/trema/echo.c +0 -99
  182. data/ruby/trema/echo.h +0 -39
  183. data/ruby/trema/enqueue.rb +0 -87
  184. data/ruby/trema/error.c +0 -262
  185. data/ruby/trema/error.h +0 -42
  186. data/ruby/trema/exact-match.rb +0 -34
  187. data/ruby/trema/executables.rb +0 -99
  188. data/ruby/trema/features-reply.c +0 -330
  189. data/ruby/trema/features-reply.h +0 -54
  190. data/ruby/trema/features-request.c +0 -134
  191. data/ruby/trema/features-request.h +0 -42
  192. data/ruby/trema/flow-mod.c +0 -150
  193. data/ruby/trema/flow-mod.h +0 -42
  194. data/ruby/trema/flow-removed.c +0 -280
  195. data/ruby/trema/flow-removed.h +0 -44
  196. data/ruby/trema/flow-stats-reply.rb +0 -107
  197. data/ruby/trema/flow.rb +0 -65
  198. data/ruby/trema/get-config-reply.c +0 -158
  199. data/ruby/trema/get-config-reply.h +0 -50
  200. data/ruby/trema/get-config-request.c +0 -136
  201. data/ruby/trema/get-config-request.h +0 -42
  202. data/ruby/trema/hardware-switch.rb +0 -86
  203. data/ruby/trema/hello.c +0 -133
  204. data/ruby/trema/hello.h +0 -42
  205. data/ruby/trema/host.rb +0 -263
  206. data/ruby/trema/link.rb +0 -177
  207. data/ruby/trema/list-switches-reply.c +0 -44
  208. data/ruby/trema/list-switches-reply.h +0 -38
  209. data/ruby/trema/mac.rb +0 -29
  210. data/ruby/trema/match.c +0 -621
  211. data/ruby/trema/match.h +0 -34
  212. data/ruby/trema/monkey-patch/integer.rb +0 -35
  213. data/ruby/trema/monkey-patch/integer/base-conversions.rb +0 -34
  214. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -49
  215. data/ruby/trema/monkey-patch/integer/validators.rb +0 -36
  216. data/ruby/trema/monkey-patch/module.rb +0 -33
  217. data/ruby/trema/monkey-patch/module/class-method.rb +0 -38
  218. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -39
  219. data/ruby/trema/monkey-patch/string.rb +0 -31
  220. data/ruby/trema/monkey-patch/string/inflectors.rb +0 -52
  221. data/ruby/trema/netns.rb +0 -127
  222. data/ruby/trema/network-component.rb +0 -151
  223. data/ruby/trema/ofctl.rb +0 -70
  224. data/ruby/trema/open-vswitch.rb +0 -160
  225. data/ruby/trema/openflow-error.c +0 -193
  226. data/ruby/trema/openflow-error.h +0 -51
  227. data/ruby/trema/openflow-switch.rb +0 -35
  228. data/ruby/trema/ordered-hash.rb +0 -75
  229. data/ruby/trema/packet-in.c +0 -1365
  230. data/ruby/trema/packet-in.h +0 -44
  231. data/ruby/trema/packet-queue.rb +0 -181
  232. data/ruby/trema/packetin-filter.rb +0 -124
  233. data/ruby/trema/path.rb +0 -85
  234. data/ruby/trema/phost.rb +0 -76
  235. data/ruby/trema/port-mod.c +0 -232
  236. data/ruby/trema/port-mod.h +0 -34
  237. data/ruby/trema/port-stats-reply.rb +0 -109
  238. data/ruby/trema/port-status-add.rb +0 -60
  239. data/ruby/trema/port-status-delete.rb +0 -60
  240. data/ruby/trema/port-status-modify.rb +0 -60
  241. data/ruby/trema/port-status.c +0 -192
  242. data/ruby/trema/port-status.h +0 -41
  243. data/ruby/trema/port.c +0 -398
  244. data/ruby/trema/port.h +0 -45
  245. data/ruby/trema/process.rb +0 -103
  246. data/ruby/trema/queue-get-config-reply.c +0 -205
  247. data/ruby/trema/queue-get-config-reply.h +0 -45
  248. data/ruby/trema/queue-get-config-request.c +0 -141
  249. data/ruby/trema/queue-get-config-request.h +0 -42
  250. data/ruby/trema/queue-stats-reply.rb +0 -76
  251. data/ruby/trema/ruby-switch.rb +0 -62
  252. data/ruby/trema/send-out-port.rb +0 -113
  253. data/ruby/trema/set-config.c +0 -174
  254. data/ruby/trema/set-config.h +0 -42
  255. data/ruby/trema/set-eth-addr.rb +0 -54
  256. data/ruby/trema/set-eth-dst-addr.rb +0 -52
  257. data/ruby/trema/set-eth-src-addr.rb +0 -53
  258. data/ruby/trema/set-ip-addr.rb +0 -54
  259. data/ruby/trema/set-ip-dst-addr.rb +0 -53
  260. data/ruby/trema/set-ip-src-addr.rb +0 -52
  261. data/ruby/trema/set-ip-tos.rb +0 -64
  262. data/ruby/trema/set-transport-dst-port.rb +0 -53
  263. data/ruby/trema/set-transport-port.rb +0 -53
  264. data/ruby/trema/set-transport-src-port.rb +0 -54
  265. data/ruby/trema/set-vlan-priority.rb +0 -66
  266. data/ruby/trema/set-vlan-vid.rb +0 -65
  267. data/ruby/trema/shell.rb +0 -37
  268. data/ruby/trema/shell/down.rb +0 -37
  269. data/ruby/trema/shell/killall.rb +0 -38
  270. data/ruby/trema/shell/link.rb +0 -59
  271. data/ruby/trema/shell/reset_stats.rb +0 -49
  272. data/ruby/trema/shell/run.rb +0 -67
  273. data/ruby/trema/shell/send_packets.rb +0 -40
  274. data/ruby/trema/shell/show_stats.rb +0 -47
  275. data/ruby/trema/shell/up.rb +0 -41
  276. data/ruby/trema/shell/vhost.rb +0 -42
  277. data/ruby/trema/shell/vswitch.rb +0 -47
  278. data/ruby/trema/stats-helper.rb +0 -63
  279. data/ruby/trema/stats-reply.c +0 -540
  280. data/ruby/trema/stats-reply.h +0 -51
  281. data/ruby/trema/stats-request.c +0 -715
  282. data/ruby/trema/stats-request.h +0 -40
  283. data/ruby/trema/strip-vlan-header.rb +0 -41
  284. data/ruby/trema/switch-daemon.rb +0 -90
  285. data/ruby/trema/switch-disconnected.c +0 -38
  286. data/ruby/trema/switch-disconnected.h +0 -36
  287. data/ruby/trema/switch-event.c +0 -648
  288. data/ruby/trema/switch-event.h +0 -27
  289. data/ruby/trema/switch-manager.rb +0 -119
  290. data/ruby/trema/switch.c +0 -197
  291. data/ruby/trema/switch.h +0 -40
  292. data/ruby/trema/switch.rb +0 -56
  293. data/ruby/trema/table-stats-reply.rb +0 -85
  294. data/ruby/trema/timers.rb +0 -95
  295. data/ruby/trema/trema-ruby-utils.c +0 -66
  296. data/ruby/trema/trema-ruby-utils.h +0 -42
  297. data/ruby/trema/trema.c +0 -126
  298. data/ruby/trema/tremashark.rb +0 -46
  299. data/ruby/trema/util.rb +0 -116
  300. data/ruby/trema/vendor-action.rb +0 -82
  301. data/ruby/trema/vendor-stats-reply.rb +0 -64
  302. data/ruby/trema/vendor.c +0 -230
  303. data/ruby/trema/vendor.h +0 -48
  304. data/ruby/trema/version.rb +0 -28
  305. data/spec/support/action.rb +0 -49
  306. data/spec/support/mandatory-option.rb +0 -53
  307. data/spec/support/matchers/constant.rb +0 -25
  308. data/spec/support/openflow-message.rb +0 -173
  309. data/spec/support/port-status.rb +0 -35
  310. data/spec/trema/app_spec.rb +0 -88
  311. data/spec/trema/barrier-reply_spec.rb +0 -43
  312. data/spec/trema/barrier-request_spec.rb +0 -92
  313. data/spec/trema/cli_spec.rb +0 -156
  314. data/spec/trema/default-logger_spec.rb +0 -46
  315. data/spec/trema/dsl/configuration_spec.rb +0 -120
  316. data/spec/trema/dsl/link_spec.rb +0 -50
  317. data/spec/trema/dsl/run_spec.rb +0 -72
  318. data/spec/trema/dsl/runner_spec.rb +0 -247
  319. data/spec/trema/dsl/switch_spec.rb +0 -69
  320. data/spec/trema/dsl/syntax_spec.rb +0 -110
  321. data/spec/trema/dsl/vhost_spec.rb +0 -144
  322. data/spec/trema/dsl/vswitch_spec.rb +0 -80
  323. data/spec/trema/echo-reply_spec.rb +0 -84
  324. data/spec/trema/echo-request_spec.rb +0 -128
  325. data/spec/trema/enqueue_spec.rb +0 -76
  326. data/spec/trema/error_spec.rb +0 -81
  327. data/spec/trema/executables_spec.rb +0 -54
  328. data/spec/trema/features-reply_spec.rb +0 -91
  329. data/spec/trema/features-request_spec.rb +0 -93
  330. data/spec/trema/flow-mod_spec.rb +0 -99
  331. data/spec/trema/flow-removed_spec.rb +0 -144
  332. data/spec/trema/get-config-reply_spec.rb +0 -43
  333. data/spec/trema/get-config-request_spec.rb +0 -92
  334. data/spec/trema/hardware-switch_spec.rb +0 -54
  335. data/spec/trema/hello_spec.rb +0 -63
  336. data/spec/trema/host_spec.rb +0 -191
  337. data/spec/trema/link_spec.rb +0 -62
  338. data/spec/trema/list-switches-reply_spec.rb +0 -46
  339. data/spec/trema/match_spec.rb +0 -111
  340. data/spec/trema/open-vswitch_spec.rb +0 -121
  341. data/spec/trema/openflow-error_spec.rb +0 -141
  342. data/spec/trema/packet-in_spec.rb +0 -717
  343. data/spec/trema/packet-out_spec.rb +0 -125
  344. data/spec/trema/packetin-filter_spec.rb +0 -39
  345. data/spec/trema/port-mod_spec.rb +0 -98
  346. data/spec/trema/port-status-add_spec.rb +0 -32
  347. data/spec/trema/port-status-delete_spec.rb +0 -32
  348. data/spec/trema/port-status-modify_spec.rb +0 -71
  349. data/spec/trema/port-status_spec.rb +0 -38
  350. data/spec/trema/port_spec.rb +0 -59
  351. data/spec/trema/process_spec.rb +0 -69
  352. data/spec/trema/queue-get-config-reply_spec.rb +0 -65
  353. data/spec/trema/queue-get-config-request_spec.rb +0 -67
  354. data/spec/trema/send-out-port_spec.rb +0 -106
  355. data/spec/trema/set-config_spec.rb +0 -78
  356. data/spec/trema/set-eth-addr_spec.rb +0 -62
  357. data/spec/trema/set-ip-addr_spec.rb +0 -81
  358. data/spec/trema/set-ip-tos_spec.rb +0 -70
  359. data/spec/trema/set-transport-dst-port_spec.rb +0 -65
  360. data/spec/trema/set-transport-src-port_spec.rb +0 -65
  361. data/spec/trema/set-vlan-priority_spec.rb +0 -65
  362. data/spec/trema/set-vlan-vid_spec.rb +0 -65
  363. data/spec/trema/shell/vhost_spec.rb +0 -58
  364. data/spec/trema/shell/vswitch_spec.rb +0 -87
  365. data/spec/trema/stats-reply_spec.rb +0 -363
  366. data/spec/trema/stats-request_spec.rb +0 -166
  367. data/spec/trema/strip-vlan-header_spec.rb +0 -44
  368. data/spec/trema/switch-daemon_spec.rb +0 -81
  369. data/spec/trema/switch-disconnected_spec.rb +0 -56
  370. data/spec/trema/switch-manager_spec.rb +0 -41
  371. data/spec/trema/tremashark_spec.rb +0 -39
  372. data/spec/trema/util_spec.rb +0 -88
  373. data/spec/trema/vendor-action_spec.rb +0 -75
  374. data/spec/trema/vendor_spec.rb +0 -76
  375. data/spec/trema_spec.rb +0 -94
  376. data/src/examples/cbench_switch/README +0 -21
  377. data/src/examples/cbench_switch/cbench-switch.rb +0 -38
  378. data/src/examples/cbench_switch/cbench_switch.c +0 -66
  379. data/src/examples/dumper/dumper.c +0 -362
  380. data/src/examples/dumper/dumper.conf +0 -7
  381. data/src/examples/dumper/dumper.rb +0 -195
  382. data/src/examples/hello_trema/.gitignore +0 -2
  383. data/src/examples/hello_trema/README.md +0 -2
  384. data/src/examples/hello_trema/hello-trema.rb +0 -30
  385. data/src/examples/hello_trema/hello_trema.c +0 -48
  386. data/src/examples/hello_trema/sample.conf +0 -1
  387. data/src/examples/learning_switch/README +0 -15
  388. data/src/examples/learning_switch/fdb.rb +0 -110
  389. data/src/examples/learning_switch/learning-switch.rb +0 -90
  390. data/src/examples/learning_switch/learning_switch.c +0 -217
  391. data/src/examples/learning_switch/learning_switch.conf +0 -18
  392. data/src/examples/list_switches/README +0 -19
  393. data/src/examples/list_switches/list-switches.rb +0 -43
  394. data/src/examples/list_switches/list_switches.c +0 -79
  395. data/src/examples/list_switches/list_switches.conf +0 -15
  396. data/src/examples/match_compare/match-compare.conf +0 -30
  397. data/src/examples/match_compare/match-compare.rb +0 -97
  398. data/src/examples/multi_learning_switch/README +0 -14
  399. data/src/examples/multi_learning_switch/multi-learning-switch.rb +0 -94
  400. data/src/examples/multi_learning_switch/multi_learning_switch.c +0 -294
  401. data/src/examples/multi_learning_switch/multi_learning_switch.conf +0 -17
  402. data/src/examples/openflow_message/README +0 -11
  403. data/src/examples/openflow_message/echo.c +0 -80
  404. data/src/examples/openflow_message/echo.rb +0 -56
  405. data/src/examples/openflow_message/example.rb +0 -60
  406. data/src/examples/openflow_message/features-request.rb +0 -96
  407. data/src/examples/openflow_message/features_request.c +0 -167
  408. data/src/examples/openflow_message/hello.c +0 -68
  409. data/src/examples/openflow_message/hello.rb +0 -43
  410. data/src/examples/openflow_message/set-config.rb +0 -57
  411. data/src/examples/openflow_message/set_config.c +0 -68
  412. data/src/examples/openflow_message/vendor-action.rb +0 -43
  413. data/src/examples/openflow_message/vendor-stats-request.rb +0 -66
  414. data/src/examples/openflow_message/vendor_action.c +0 -103
  415. data/src/examples/openflow_switch/echo_switch.c +0 -89
  416. data/src/examples/openflow_switch/hello_switch.c +0 -85
  417. data/src/examples/packet_in/README +0 -15
  418. data/src/examples/packet_in/packet-in.rb +0 -37
  419. data/src/examples/packet_in/packet_in.c +0 -53
  420. data/src/examples/packet_in/packet_in.conf +0 -15
  421. data/src/examples/packetin_filter_config/README +0 -12
  422. data/src/examples/packetin_filter_config/add_filter.c +0 -71
  423. data/src/examples/packetin_filter_config/delete_filter.c +0 -63
  424. data/src/examples/packetin_filter_config/delete_filter_strict.c +0 -73
  425. data/src/examples/packetin_filter_config/dump_filter.c +0 -63
  426. data/src/examples/packetin_filter_config/dump_filter_strict.c +0 -73
  427. data/src/examples/packetin_filter_config/packetin_filter_config.c +0 -132
  428. data/src/examples/packetin_filter_config/packetin_filter_config.conf +0 -7
  429. data/src/examples/packetin_filter_config/utils.c +0 -100
  430. data/src/examples/packetin_filter_config/utils.h +0 -40
  431. data/src/examples/patch_panel/network.conf +0 -14
  432. data/src/examples/patch_panel/patch-panel.conf +0 -1
  433. data/src/examples/patch_panel/patch-panel.rb +0 -59
  434. data/src/examples/repeater_hub/README +0 -8
  435. data/src/examples/repeater_hub/repeater-hub.rb +0 -41
  436. data/src/examples/repeater_hub/repeater-hub_spec.rb +0 -154
  437. data/src/examples/repeater_hub/repeater_hub.c +0 -81
  438. data/src/examples/repeater_hub/repeater_hub.conf +0 -28
  439. data/src/examples/simple_router/README +0 -18
  440. data/src/examples/simple_router/arp-table.rb +0 -81
  441. data/src/examples/simple_router/interface.rb +0 -90
  442. data/src/examples/simple_router/routing-table.rb +0 -60
  443. data/src/examples/simple_router/simple-router.rb +0 -191
  444. data/src/examples/simple_router/simple_router.conf +0 -24
  445. data/src/examples/simple_router/simple_router_netns.conf +0 -15
  446. data/src/examples/simple_router/simple_router_network.conf +0 -6
  447. data/src/examples/switch_event_config/.gitignore +0 -6
  448. data/src/examples/switch_event_config/add_forward_entry.c +0 -227
  449. data/src/examples/switch_event_config/delete_forward_entry.c +0 -226
  450. data/src/examples/switch_event_config/dump_forward_entries.c +0 -190
  451. data/src/examples/switch_event_config/network.conf +0 -2
  452. data/src/examples/switch_event_config/set_forward_entries.c +0 -210
  453. data/src/examples/switch_info/README +0 -13
  454. data/src/examples/switch_info/switch-info.rb +0 -44
  455. data/src/examples/switch_info/switch_info.c +0 -78
  456. data/src/examples/switch_info/switch_info.conf +0 -3
  457. data/src/examples/switch_monitor/switch-monitor.conf +0 -3
  458. data/src/examples/switch_monitor/switch-monitor.rb +0 -56
  459. data/src/examples/switch_monitor/switch_monitor.c +0 -152
  460. data/src/examples/traffic_monitor/counter.c +0 -72
  461. data/src/examples/traffic_monitor/counter.h +0 -46
  462. data/src/examples/traffic_monitor/counter.rb +0 -44
  463. data/src/examples/traffic_monitor/fdb.c +0 -74
  464. data/src/examples/traffic_monitor/fdb.h +0 -48
  465. data/src/examples/traffic_monitor/fdb.rb +0 -42
  466. data/src/examples/traffic_monitor/traffic-monitor.rb +0 -98
  467. data/src/examples/traffic_monitor/traffic_monitor.c +0 -161
  468. data/src/examples/traffic_monitor/traffic_monitor.conf +0 -16
  469. data/src/examples/transparent_firewall/README.md +0 -61
  470. data/src/examples/transparent_firewall/aggregated-delegated-afrinic.txt +0 -713
  471. data/src/examples/transparent_firewall/aggregated-delegated-apnic.txt +0 -3440
  472. data/src/examples/transparent_firewall/aggregated-delegated-arin.txt +0 -11342
  473. data/src/examples/transparent_firewall/aggregated-delegated-lacnic.txt +0 -1937
  474. data/src/examples/transparent_firewall/aggregated-delegated-ripencc.txt +0 -7329
  475. data/src/examples/transparent_firewall/block-rfc1918.rb +0 -86
  476. data/src/examples/transparent_firewall/pass-delegated.rb +0 -178
  477. data/src/examples/transparent_firewall/regen_aggregated.sh +0 -53
  478. data/src/examples/transparent_firewall/stats-to-cidrs.rb +0 -59
  479. data/src/lib/arp.h +0 -64
  480. data/src/lib/bool.h +0 -47
  481. data/src/lib/buffer.c +0 -304
  482. data/src/lib/buffer.h +0 -54
  483. data/src/lib/byteorder.c +0 -571
  484. data/src/lib/byteorder.h +0 -108
  485. data/src/lib/checks.h +0 -40
  486. data/src/lib/chibach.c +0 -392
  487. data/src/lib/chibach.h +0 -69
  488. data/src/lib/chibach_private.c +0 -168
  489. data/src/lib/chibach_private.h +0 -50
  490. data/src/lib/daemon.c +0 -429
  491. data/src/lib/daemon.h +0 -40
  492. data/src/lib/doubly_linked_list.c +0 -284
  493. data/src/lib/doubly_linked_list.h +0 -86
  494. data/src/lib/ether.c +0 -47
  495. data/src/lib/ether.h +0 -92
  496. data/src/lib/etherip.h +0 -44
  497. data/src/lib/event_forward_interface.c +0 -788
  498. data/src/lib/event_forward_interface.h +0 -138
  499. data/src/lib/event_handler.c +0 -419
  500. data/src/lib/event_handler.h +0 -57
  501. data/src/lib/external_callback.c +0 -126
  502. data/src/lib/external_callback.h +0 -46
  503. data/src/lib/hash_table.c +0 -415
  504. data/src/lib/hash_table.h +0 -136
  505. data/src/lib/icmp.h +0 -72
  506. data/src/lib/igmp.h +0 -48
  507. data/src/lib/ipv4.h +0 -64
  508. data/src/lib/ipv6.h +0 -46
  509. data/src/lib/linked_list.c +0 -244
  510. data/src/lib/linked_list.h +0 -84
  511. data/src/lib/log.c +0 -636
  512. data/src/lib/log.h +0 -77
  513. data/src/lib/management_interface.c +0 -359
  514. data/src/lib/management_interface.h +0 -40
  515. data/src/lib/management_service_interface.c +0 -102
  516. data/src/lib/management_service_interface.h +0 -134
  517. data/src/lib/match.h +0 -82
  518. data/src/lib/match_table.c +0 -606
  519. data/src/lib/match_table.h +0 -49
  520. data/src/lib/message_queue.c +0 -143
  521. data/src/lib/message_queue.h +0 -59
  522. data/src/lib/messenger.c +0 -1821
  523. data/src/lib/messenger.h +0 -145
  524. data/src/lib/openflow_application_interface.c +0 -1800
  525. data/src/lib/openflow_application_interface.h +0 -359
  526. data/src/lib/openflow_message.c +0 -4240
  527. data/src/lib/openflow_message.h +0 -291
  528. data/src/lib/openflow_service_interface.h +0 -58
  529. data/src/lib/openflow_switch_interface.c +0 -1378
  530. data/src/lib/openflow_switch_interface.h +0 -262
  531. data/src/lib/packet_info.c +0 -336
  532. data/src/lib/packet_info.h +0 -233
  533. data/src/lib/packet_parser.c +0 -522
  534. data/src/lib/packetin_filter_interface.c +0 -292
  535. data/src/lib/packetin_filter_interface.h +0 -125
  536. data/src/lib/persistent_storage.c +0 -478
  537. data/src/lib/persistent_storage.h +0 -44
  538. data/src/lib/secure_channel.c +0 -496
  539. data/src/lib/secure_channel.h +0 -43
  540. data/src/lib/stat.c +0 -248
  541. data/src/lib/stat.h +0 -51
  542. data/src/lib/tcp.h +0 -62
  543. data/src/lib/timer.c +0 -349
  544. data/src/lib/timer.h +0 -51
  545. data/src/lib/trema.c +0 -776
  546. data/src/lib/trema.h +0 -80
  547. data/src/lib/trema.hpp +0 -49
  548. data/src/lib/trema_private.c +0 -175
  549. data/src/lib/trema_private.h +0 -64
  550. data/src/lib/trema_wrapper.c +0 -59
  551. data/src/lib/trema_wrapper.h +0 -66
  552. data/src/lib/udp.h +0 -41
  553. data/src/lib/utility.c +0 -625
  554. data/src/lib/utility.h +0 -84
  555. data/src/lib/wrapper.c +0 -121
  556. data/src/lib/wrapper.h +0 -76
  557. data/src/management/application.c +0 -222
  558. data/src/management/echo.c +0 -183
  559. data/src/management/set_logging_level.c +0 -151
  560. data/src/management/show_stats.c +0 -148
  561. data/src/management/trema_manager +0 -184
  562. data/src/packetin_filter/README +0 -17
  563. data/src/packetin_filter/packetin_filter.c +0 -575
  564. data/src/switch_manager/README +0 -20
  565. data/src/switch_manager/cookie_table.c +0 -290
  566. data/src/switch_manager/cookie_table.h +0 -70
  567. data/src/switch_manager/dpid_table.c +0 -108
  568. data/src/switch_manager/dpid_table.h +0 -43
  569. data/src/switch_manager/event_forward_entry_manipulation.c +0 -120
  570. data/src/switch_manager/event_forward_entry_manipulation.h +0 -31
  571. data/src/switch_manager/ofpmsg_recv.c +0 -497
  572. data/src/switch_manager/ofpmsg_recv.h +0 -39
  573. data/src/switch_manager/ofpmsg_send.c +0 -274
  574. data/src/switch_manager/ofpmsg_send.h +0 -51
  575. data/src/switch_manager/secure_channel_listener.c +0 -296
  576. data/src/switch_manager/secure_channel_listener.h +0 -40
  577. data/src/switch_manager/secure_channel_receiver.c +0 -129
  578. data/src/switch_manager/secure_channel_receiver.h +0 -40
  579. data/src/switch_manager/secure_channel_sender.c +0 -131
  580. data/src/switch_manager/secure_channel_sender.h +0 -41
  581. data/src/switch_manager/service_interface.c +0 -180
  582. data/src/switch_manager/service_interface.h +0 -44
  583. data/src/switch_manager/switch.c +0 -988
  584. data/src/switch_manager/switch.h +0 -50
  585. data/src/switch_manager/switch_manager.c +0 -643
  586. data/src/switch_manager/switch_manager.h +0 -65
  587. data/src/switch_manager/switch_option.c +0 -30
  588. data/src/switch_manager/switch_option.h +0 -41
  589. data/src/switch_manager/switchinfo.h +0 -81
  590. data/src/switch_manager/xid_table.c +0 -182
  591. data/src/switch_manager/xid_table.h +0 -53
  592. data/src/tremashark/README +0 -79
  593. data/src/tremashark/packet_capture.c +0 -358
  594. data/src/tremashark/pcap_private.h +0 -45
  595. data/src/tremashark/pcap_queue.c +0 -195
  596. data/src/tremashark/pcap_queue.h +0 -56
  597. data/src/tremashark/plugin/.gitignore +0 -6
  598. data/src/tremashark/plugin/packet-trema/.gitignore +0 -5
  599. data/src/tremashark/plugin/packet-trema/Makefile +0 -77
  600. data/src/tremashark/plugin/packet-trema/Makefile.am +0 -110
  601. data/src/tremashark/plugin/packet-trema/Makefile.common +0 -29
  602. data/src/tremashark/plugin/packet-trema/moduleinfo.h +0 -39
  603. data/src/tremashark/plugin/packet-trema/packet-trema.c +0 -1671
  604. data/src/tremashark/plugin/packet-trema/plugin.c +0 -31
  605. data/src/tremashark/plugin/user_dlts +0 -2
  606. data/src/tremashark/queue.c +0 -167
  607. data/src/tremashark/queue.h +0 -58
  608. data/src/tremashark/stdin_relay.c +0 -257
  609. data/src/tremashark/syslog_relay.c +0 -247
  610. data/src/tremashark/tremashark.c +0 -554
  611. data/trema +0 -11
  612. data/trema-config +0 -11
  613. data/unittests/buffer_stubs.c +0 -72
  614. data/unittests/cmockery_trema.c +0 -121
  615. data/unittests/cmockery_trema.h +0 -95
  616. data/unittests/lib/buffer_test.c +0 -368
  617. data/unittests/lib/byteorder_test.c +0 -1798
  618. data/unittests/lib/daemon_test.c +0 -804
  619. data/unittests/lib/doubly_linked_list_test.c +0 -348
  620. data/unittests/lib/ether_test.c +0 -125
  621. data/unittests/lib/event_forward_interface_test.c +0 -1676
  622. data/unittests/lib/external_callback_test.c +0 -282
  623. data/unittests/lib/hash_table_test.c +0 -278
  624. data/unittests/lib/linked_list_test.c +0 -434
  625. data/unittests/lib/log_test.c +0 -672
  626. data/unittests/lib/management_interface_test.c +0 -238
  627. data/unittests/lib/management_service_interface_test.c +0 -317
  628. data/unittests/lib/match_table_test.c +0 -1507
  629. data/unittests/lib/message_queue_test.c +0 -381
  630. data/unittests/lib/messenger_test.c +0 -623
  631. data/unittests/lib/openflow_application_interface_test.c +0 -3713
  632. data/unittests/lib/openflow_message_test.c +0 -8047
  633. data/unittests/lib/packet_info_test.c +0 -558
  634. data/unittests/lib/packet_parser_test.c +0 -784
  635. data/unittests/lib/packetin_filter_interface_test.c +0 -721
  636. data/unittests/lib/persistent_storage_test.c +0 -800
  637. data/unittests/lib/stat_test.c +0 -433
  638. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  639. data/unittests/lib/test_packets/arp_req.cap +0 -0
  640. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  641. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  642. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  643. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  644. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  645. data/unittests/lib/test_packets/ipx.cap +0 -0
  646. data/unittests/lib/test_packets/lldp.cap +0 -0
  647. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  648. data/unittests/lib/test_packets/rarp_req.cap +0 -0
  649. data/unittests/lib/test_packets/tcp.cap +0 -0
  650. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  651. data/unittests/lib/test_packets/udp.cap +0 -0
  652. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  653. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  654. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  655. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  656. data/unittests/lib/timer_test.c +0 -246
  657. data/unittests/lib/trema_private_test.c +0 -321
  658. data/unittests/lib/trema_test.c +0 -1030
  659. data/unittests/lib/utility_test.c +0 -711
  660. data/unittests/lib/wrapper_test.c +0 -228
  661. data/unittests/packetin_filter/packetin_filter_test.c +0 -476
  662. data/unittests/switch_manager/switch_manager_test.c +0 -1183
  663. data/unittests/wrapper_stubs.c +0 -37
  664. data/vendor/.gitignore +0 -6
  665. data/vendor/README.md +0 -29
  666. data/vendor/cmockery-20110428.tar.gz +0 -0
  667. data/vendor/oflops-0.03.trema1.tar.gz +0 -0
  668. data/vendor/oflops_no_snmp+1.0.0.diff +0 -340
  669. data/vendor/openflow-1.0.0.tar.gz +0 -0
  670. data/vendor/openflow.git.tar.gz +0 -0
  671. data/vendor/openvswitch-1.2.2.trema1.tar.gz +0 -0
  672. data/vendor/openvswitch-1.2.2_librt-check.diff +0 -21
  673. data/vendor/packet-openflow.diff +0 -13
  674. data/vendor/ruby-ifconfig-1.2/COPYING +0 -340
  675. data/vendor/ruby-ifconfig-1.2/Changelog +0 -16
  676. data/vendor/ruby-ifconfig-1.2/INSTALL +0 -239
  677. data/vendor/ruby-ifconfig-1.2/README +0 -38
  678. data/vendor/ruby-ifconfig-1.2/Rakefile +0 -14
  679. data/vendor/ruby-ifconfig-1.2/TODO +0 -8
  680. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +0 -17
  681. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +0 -10
  682. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +0 -14
  683. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +0 -17
  684. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +0 -24
  685. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +0 -60
  686. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +0 -20
  687. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +0 -10
  688. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +0 -36
  689. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +0 -10
  690. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +0 -71
  691. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +0 -72
  692. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +0 -69
  693. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +0 -3
  694. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +0 -84
  695. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +0 -130
  696. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +0 -49
  697. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +0 -43
  698. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +0 -112
  699. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +0 -55
  700. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +0 -38
  701. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +0 -77
  702. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +0 -4
  703. data/vendor/ruby-ifconfig-1.2/setup.rb +0 -1306
  704. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +0 -35
  705. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +0 -33
  706. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +0 -35
  707. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +0 -4
  708. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +0 -31
  709. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +0 -33
  710. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +0 -33
  711. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +0 -35
  712. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +0 -40
  713. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +0 -39
  714. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +0 -40
  715. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +0 -49
  716. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +0 -39
  717. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +0 -39
  718. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +0 -44
@@ -1,44 +0,0 @@
1
- /*
2
- * OpenFlow Switch Manager
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 SERVICE_INTERFACE_H
22
- #define SERVICE_INTERFACE_H
23
-
24
-
25
- #include "trema.h"
26
- #include "openflow_service_interface.h"
27
- #include "switchinfo.h"
28
-
29
-
30
- void service_send_to_reply( char *service_name, uint16_t message_type, uint64_t *datapath_id, buffer *buf );
31
- void service_send_to_application( list_element *service_name_list, uint16_t message_type, uint64_t *datapath_id, buffer *buf );
32
- void service_recv_from_application( uint16_t message_type, buffer *buf );
33
-
34
-
35
- #endif // SERVICE_INTERFACE_H
36
-
37
-
38
- /*
39
- * Local variables:
40
- * c-basic-offset: 2
41
- * indent-tabs-mode: nil
42
- * End:
43
- */
44
-
@@ -1,988 +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 <fcntl.h>
20
- #include <getopt.h>
21
- #include <inttypes.h>
22
- #include <limits.h>
23
- #include <openflow.h>
24
- #include <pthread.h>
25
- #include <signal.h>
26
- #include <stdio.h>
27
- #include <string.h>
28
- #include <unistd.h>
29
- #include <assert.h>
30
- #include "trema.h"
31
- #include "cookie_table.h"
32
- #include "message_queue.h"
33
- #include "messenger.h"
34
- #include "ofpmsg_send.h"
35
- #include "openflow_service_interface.h"
36
- #include "secure_channel_receiver.h"
37
- #include "secure_channel_sender.h"
38
- #include "service_interface.h"
39
- #include "switch.h"
40
- #include "xid_table.h"
41
- #include "switch_option.h"
42
- #include "event_forward_entry_manipulation.h"
43
-
44
- #define SUB_TIMESPEC( _a, _b, _return ) \
45
- do { \
46
- ( _return )->tv_sec = ( _a )->tv_sec - ( _b )->tv_sec; \
47
- ( _return )->tv_nsec = ( _a )->tv_nsec - ( _b )->tv_nsec; \
48
- if ( ( _return )->tv_nsec < 0 ) { \
49
- ( _return )->tv_sec--; \
50
- ( _return )->tv_nsec += 1000000000; \
51
- } \
52
- } \
53
- while ( 0 )
54
-
55
-
56
- struct switch_info switch_info;
57
-
58
- static const time_t COOKIE_TABLE_AGING_INTERVAL = 3600; // sec.
59
- static const time_t ECHO_REQUEST_INTERVAL = 60; // sec.
60
- static const time_t ECHO_REPLY_TIMEOUT = 2; // sec.
61
- static const time_t WARNING_ECHO_RTT = 500; // msec. The value must is less than 1000.
62
- static const time_t REGISTRATION_RETRY = 1; // sec.
63
- static const int REGISTRATION_RETRY_COUNT = 1;
64
- static const time_t REGISTRATION_TIMEOUT = 1; // sec.
65
- static const time_t UNREGISTRATION_RETRY = 1; // sec.
66
- static const int UNREGISTRATION_RETRY_COUNT = 1;
67
- static const time_t UNREGISTRATION_TIMEOUT = 1; // sec.
68
-
69
-
70
- static bool age_cookie_table_enabled = false;
71
-
72
- #define SWITCH_MANAGER "switch_manager"
73
-
74
-
75
- typedef struct {
76
- uint64_t datapath_id;
77
- uint32_t sec;
78
- uint32_t nsec;
79
- } echo_body;
80
-
81
- void
82
- usage() {
83
- printf(
84
- "OpenFlow Switch Manager.\n"
85
- "Usage: %s [OPTION]... [DESTINATION-RULE]...\n"
86
- "\n"
87
- " -s, --socket=fd secure channnel socket\n"
88
- " -n, --name=SERVICE_NAME service name\n"
89
- " -l, --logging_level=LEVEL set logging level\n"
90
- " -g, --syslog output log messages to syslog\n"
91
- " -f, --logging_facility=FACILITY set syslog facility\n"
92
- " --no-flow-cleanup do not cleanup flows on startup\n"
93
- " --no-cookie-translation do not translate cookie values\n"
94
- " --no-packet_in do not allow packet-ins on startup\n"
95
- " -h, --help display this help and exit\n"
96
- "\n"
97
- "DESTINATION-RULE:\n"
98
- " openflow-message-type::destination-service-name\n"
99
- "\n"
100
- "openflow-message-type:\n"
101
- " packet_in packet-in openflow message type\n"
102
- " port_status port-status openflow message type\n"
103
- " vendor vendor openflow message type\n"
104
- " state_notify connection status\n"
105
- "\n"
106
- "destination-service-name destination service name\n"
107
- , get_executable_name()
108
- );
109
- }
110
-
111
-
112
- static int
113
- strtofd( const char *str ) {
114
- char *ep;
115
- long l;
116
-
117
- l = strtol( str, &ep, 0 );
118
- if ( l < 0 || l > INT_MAX || *ep != '\0' ) {
119
- die( "Invalid socket (%s).", str );
120
- return 0;
121
- }
122
- return ( int ) l;
123
- }
124
-
125
-
126
- static void
127
- option_parser( int argc, char *argv[] ) {
128
- int c;
129
-
130
- switch_info.secure_channel_fd = 0; // stdin
131
- switch_info.flow_cleanup = true;
132
- switch_info.cookie_translation = true;
133
- switch_info.deny_packet_in_on_startup = false;
134
- while ( ( c = getopt_long( argc, argv, switch_short_options, switch_long_options, NULL ) ) != -1 ) {
135
- switch ( c ) {
136
- case 's':
137
- switch_info.secure_channel_fd = strtofd( optarg );
138
- break;
139
-
140
- case NO_FLOW_CLEANUP_LONG_OPTION_VALUE:
141
- switch_info.flow_cleanup = false;
142
- break;
143
-
144
- case NO_COOKIE_TRANSLATION_LONG_OPTION_VALUE:
145
- switch_info.cookie_translation = false;
146
- break;
147
-
148
- case NO_PACKET_IN_LONG_OPTION_VALUE:
149
- switch_info.deny_packet_in_on_startup = true;
150
- break;
151
-
152
- default:
153
- usage();
154
- exit( EXIT_SUCCESS );
155
- return;
156
- }
157
- }
158
- }
159
-
160
-
161
- static void
162
- service_recv( uint16_t message_type, void *data, size_t data_len ) {
163
- buffer *buf;
164
- void *msg;
165
-
166
- buf = alloc_buffer_with_length( data_len );
167
-
168
- msg = append_back_buffer( buf, data_len );
169
- memcpy( msg, data, data_len );
170
-
171
- service_recv_from_application( message_type, buf );
172
- }
173
-
174
-
175
- static void
176
- service_send_state( struct switch_info *sw_info, uint64_t *dpid, uint16_t tag ) {
177
- service_send_to_application( sw_info->state_service_name_list, tag, dpid, NULL );
178
- }
179
-
180
-
181
- static void
182
- secure_channel_read( int fd, void *data ) {
183
- UNUSED( fd );
184
- UNUSED( data );
185
-
186
- if ( recv_from_secure_channel( &switch_info ) < 0 ) {
187
- switch_event_disconnected( &switch_info );
188
- return;
189
- }
190
-
191
- if ( switch_info.recv_queue->length > 0 ) {
192
- int ret = handle_messages_from_secure_channel( &switch_info );
193
- if ( ret < 0 ) {
194
- stop_event_handler();
195
- stop_messenger();
196
- }
197
- }
198
- }
199
-
200
-
201
- static void
202
- secure_channel_write( int fd, void *data ) {
203
- UNUSED( fd );
204
- UNUSED( data );
205
-
206
- if ( flush_secure_channel( &switch_info ) < 0 ) {
207
- switch_event_disconnected( &switch_info );
208
- return;
209
- }
210
- }
211
-
212
-
213
- static void
214
- switch_set_timeout( long sec, timer_callback callback, void *user_data ) {
215
- struct itimerspec interval;
216
-
217
- interval.it_value.tv_sec = sec;
218
- interval.it_value.tv_nsec = 0;
219
- interval.it_interval.tv_sec = 0;
220
- interval.it_interval.tv_nsec = 0;
221
- add_timer_event_callback( &interval, callback, user_data );
222
- switch_info.running_timer = true;
223
- }
224
-
225
-
226
- static void
227
- switch_unset_timeout( timer_callback callback, void *user_data ) {
228
- if ( switch_info.running_timer ) {
229
- switch_info.running_timer = false;
230
- delete_timer_event( callback, user_data );
231
- }
232
- }
233
-
234
-
235
- static void
236
- switch_event_timeout_hello( void *user_data ) {
237
- UNUSED( user_data );
238
-
239
- if ( switch_info.state != SWITCH_STATE_WAIT_HELLO ) {
240
- return;
241
- }
242
- switch_info.running_timer = false;
243
-
244
- error( "Hello timeout. state:%d, dpid:%#" PRIx64 ", fd:%d.",
245
- switch_info.state, switch_info.datapath_id, switch_info.secure_channel_fd );
246
- switch_event_disconnected( &switch_info );
247
- }
248
-
249
-
250
- static void
251
- switch_event_timeout_features_reply( void *user_data ) {
252
- UNUSED( user_data );
253
-
254
- if ( switch_info.state != SWITCH_STATE_WAIT_FEATURES_REPLY ) {
255
- return;
256
- }
257
- switch_info.running_timer = false;
258
-
259
- error( "Features Reply timeout. state:%d, dpid:%#" PRIx64 ", fd:%d.",
260
- switch_info.state, switch_info.datapath_id, switch_info.secure_channel_fd );
261
- switch_event_disconnected( &switch_info );
262
- }
263
-
264
-
265
- int
266
- switch_event_connected( struct switch_info *sw_info ) {
267
- int ret;
268
-
269
- // send secure channel disconnect state to application
270
- service_send_state( sw_info, &sw_info->datapath_id, MESSENGER_OPENFLOW_CONNECTED );
271
- debug( "Send connected state" );
272
- ret = ofpmsg_send_hello( sw_info );
273
- if ( ret < 0 ) {
274
- return ret;
275
- }
276
- sw_info->state = SWITCH_STATE_WAIT_HELLO;
277
-
278
- switch_set_timeout( SWITCH_STATE_TIMEOUT_HELLO, switch_event_timeout_hello, NULL );
279
-
280
- return 0;
281
- }
282
-
283
-
284
- int
285
- switch_event_recv_hello( struct switch_info *sw_info ) {
286
- int ret;
287
-
288
- if ( sw_info->state == SWITCH_STATE_WAIT_HELLO ) {
289
- // cancel to hello_wait-timeout timer
290
- switch_unset_timeout( switch_event_timeout_hello, NULL );
291
-
292
- if ( sw_info->deny_packet_in_on_startup ) {
293
- ret = ofpmsg_send_deny_all( sw_info );
294
- if ( ret < 0 ) {
295
- return ret;
296
- }
297
- }
298
-
299
- ret = ofpmsg_send_featuresrequest( sw_info );
300
- if ( ret < 0 ) {
301
- return ret;
302
- }
303
- sw_info->state = SWITCH_STATE_WAIT_FEATURES_REPLY;
304
-
305
- switch_set_timeout( SWITCH_STATE_TIMEOUT_FEATURES_REPLY,
306
- switch_event_timeout_features_reply, NULL );
307
- }
308
-
309
- return 0;
310
- }
311
-
312
-
313
- static void
314
- echo_reply_timeout( void *user_data ) {
315
- UNUSED( user_data );
316
-
317
- switch_info.running_timer = false;
318
- error( "Echo request timeout ( datapath id %#" PRIx64 ").", switch_info.datapath_id );
319
- switch_event_disconnected( &switch_info );
320
- }
321
-
322
-
323
- int
324
- switch_event_recv_echoreply( struct switch_info *sw_info, buffer *buf ) {
325
- if ( buf->length != sizeof( struct ofp_header ) + sizeof( echo_body ) ) {
326
- return 0;
327
- }
328
- struct ofp_header *header = buf->data;
329
- if ( ntohl( header->xid ) != sw_info->echo_request_xid ) {
330
- return 0;
331
- }
332
-
333
- echo_body *body = ( echo_body * ) ( header + 1 );
334
- if ( ntohll( body->datapath_id ) != sw_info->datapath_id ) {
335
- return 0;
336
- }
337
- switch_unset_timeout( echo_reply_timeout, NULL );
338
- struct timespec now, tim;
339
- clock_gettime( CLOCK_MONOTONIC, &now );
340
- tim.tv_sec = ( time_t ) ntohl( body->sec );
341
- tim.tv_nsec = ( long ) ntohl( body->nsec );
342
-
343
- SUB_TIMESPEC( &now, &tim, &tim );
344
-
345
- if ( tim.tv_sec > 0 || tim.tv_nsec > ( ( long ) WARNING_ECHO_RTT * 1000000 ) ) {
346
- warn( "echo round-trip time is greater then %ld ms ( round-trip time = %" PRId64 ".%09ld ).",
347
- ( long ) WARNING_ECHO_RTT, ( int64_t ) tim.tv_sec, tim.tv_nsec );
348
- }
349
-
350
- return 0;
351
- }
352
-
353
-
354
- static void
355
- echo_request_interval( void *user_data ) {
356
- struct switch_info *sw_info = user_data;
357
-
358
- buffer *buf = alloc_buffer();
359
- echo_body *body = append_back_buffer( buf, sizeof( echo_body ) );
360
- body->datapath_id = htonll( switch_info.datapath_id );
361
- struct timespec now;
362
- clock_gettime( CLOCK_MONOTONIC, &now );
363
- body->sec = htonl( ( uint32_t ) now.tv_sec );
364
- body->nsec = htonl( ( uint32_t ) now.tv_nsec );
365
- sw_info->echo_request_xid = generate_xid();
366
-
367
- int err = ofpmsg_send_echorequest( sw_info, sw_info->echo_request_xid, buf );
368
- if ( err < 0 ) {
369
- switch_event_disconnected( &switch_info );
370
- return;
371
- }
372
-
373
- switch_set_timeout( ECHO_REPLY_TIMEOUT, echo_reply_timeout, NULL );
374
- }
375
-
376
-
377
- static void
378
- registration_timeout( void *user_data ) {
379
- struct switch_info *sw_info = user_data;
380
-
381
- sw_info->running_timer = false;
382
-
383
- error( "Registration timeout ( datapath id %#" PRIx64 " ).", sw_info->datapath_id );
384
- switch_event_disconnected( sw_info );
385
- }
386
-
387
-
388
- static void
389
- confirm_self_dpid_is_registered( const list_element *switches, void *user_data );
390
-
391
-
392
- int
393
- switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
394
- int ret;
395
- char new_service_name[ SWITCH_MANAGER_PREFIX_STR_LEN + SWITCH_MANAGER_DPID_STR_LEN + 1 ];
396
- const uint16_t new_service_name_len = SWITCH_MANAGER_PREFIX_STR_LEN + SWITCH_MANAGER_DPID_STR_LEN + 1;
397
-
398
- switch ( sw_info->state ) {
399
- case SWITCH_STATE_WAIT_FEATURES_REPLY:
400
-
401
- sw_info->datapath_id = *dpid;
402
- sw_info->state = SWITCH_STATE_WAIT_REGISTRATION;
403
-
404
- // cancel to features_reply_wait-timeout timer
405
- switch_unset_timeout( switch_event_timeout_features_reply, NULL );
406
-
407
- // TODO: set keepalive-timeout
408
- snprintf( new_service_name, new_service_name_len, "%s%#" PRIx64, SWITCH_MANAGER_PREFIX, sw_info->datapath_id );
409
-
410
- // checking duplicate service
411
- pid_t pid = get_pid_by_trema_name( new_service_name );
412
- if ( pid > 0 ) {
413
- debug( "duplicated datapath-id %#" PRIx64, sw_info->datapath_id );
414
- if ( !terminate_trema_process( pid ) ) {
415
- return -1;
416
- }
417
- }
418
- // rename service_name of messenger
419
- rename_message_received_callback( get_trema_name(), new_service_name );
420
-
421
- // rename management service name
422
- char *management_service_name = xstrdup( get_management_service_name( get_trema_name() ) );
423
- char *new_management_service_name = xstrdup( get_management_service_name( new_service_name ) );
424
- rename_message_requested_callback( management_service_name, new_management_service_name );
425
- xfree( management_service_name );
426
- xfree( new_management_service_name );
427
-
428
- debug( "Rename service name from %s to %s.", get_trema_name(), new_service_name );
429
- if ( messenger_dump_enabled() ) {
430
- stop_messenger_dump();
431
- start_messenger_dump( new_service_name, DEFAULT_DUMP_SERVICE_NAME );
432
- }
433
- set_trema_name( new_service_name );
434
-
435
- // reset to default config
436
- ret = ofpmsg_send_setconfig( sw_info );
437
- if ( ret < 0 ) {
438
- error( "Failed to send setconfig." );
439
- return ret;
440
- }
441
- if ( switch_info.flow_cleanup ) {
442
- debug( "Deleting all flows." );
443
- ret = ofpmsg_send_delete_all_flows( sw_info );
444
- if ( ret < 0 ) {
445
- error( "Failed to send delete all flows." );
446
- return ret;
447
- }
448
- }
449
-
450
- // switch_ready to switch_manager
451
- debug( "Notify switch_ready to switch manager." );
452
- char switch_manager[] = SWITCH_MANAGER;
453
- list_element switch_manager_only_list;
454
- switch_manager_only_list.next = NULL;
455
- switch_manager_only_list.data = switch_manager;
456
- service_send_to_application( &switch_manager_only_list, MESSENGER_OPENFLOW_READY, &sw_info->datapath_id, NULL );
457
-
458
- init_event_forward_interface();
459
- // Check switch_manager registration
460
- debug( "Checking switch manager's switch list." );
461
- sw_info->retry_count = REGISTRATION_RETRY_COUNT;
462
- set_list_switches_reply_handler( confirm_self_dpid_is_registered );
463
- if ( send_list_switches_request( sw_info ) ) {
464
- switch_set_timeout( REGISTRATION_TIMEOUT, registration_timeout, sw_info );
465
- }
466
- else {
467
- error( "Failed to send switch list request to switch manager." );
468
- return -1;
469
- }
470
- break;
471
-
472
- case SWITCH_STATE_WAIT_REGISTRATION:
473
- case SWITCH_STATE_COMPLETED:
474
- // NOP
475
- break;
476
-
477
- default:
478
- notice( "Invalid event 'features reply' from a switch." );
479
- return -1;
480
-
481
- break;
482
- }
483
-
484
- return 0;
485
- }
486
-
487
-
488
- static void
489
- registration_retry( void *user_data ) {
490
- struct switch_info *sw_info = user_data;
491
-
492
- if ( sw_info->retry_count == 0 ) {
493
- switch_event_disconnected( sw_info );
494
- return;
495
- }
496
- sw_info->retry_count--;
497
- sw_info->running_timer = false;
498
- debug( "Checking switch manager's switch list." );
499
- set_list_switches_reply_handler( confirm_self_dpid_is_registered );
500
- if ( send_list_switches_request( sw_info ) ) {
501
- switch_set_timeout( REGISTRATION_TIMEOUT, registration_timeout, sw_info );
502
- }
503
- else {
504
- error( "Failed to send switch list request to switch manager." );
505
- switch_event_disconnected( sw_info );
506
- }
507
- }
508
-
509
-
510
- static void
511
- confirm_self_dpid_is_registered( const list_element *switches, void *user_data ) {
512
- struct switch_info *sw_info = user_data;
513
-
514
- switch_unset_timeout( registration_timeout, sw_info );
515
-
516
- debug( "Received switch manager's switch list." );
517
- bool found = false;
518
- for ( const list_element *e = switches; e != NULL; e = e->next ) {
519
- if ( sw_info->datapath_id == *( uint64_t * ) e->data ) {
520
- // self dpid registered
521
- debug( "Self dpid found" );
522
- found = true;
523
- break;
524
- }
525
- }
526
- if ( found ) {
527
- sw_info->state = SWITCH_STATE_COMPLETED;
528
-
529
- finalize_openflow_application_interface();
530
-
531
- // notify state and datapath_id to controllers
532
- service_send_state( sw_info, &sw_info->datapath_id, MESSENGER_OPENFLOW_READY );
533
- debug( "send ready state" );
534
-
535
- add_periodic_event_callback( ECHO_REQUEST_INTERVAL, echo_request_interval, sw_info );
536
- }
537
- else {
538
- debug( "Self dpid not found. Retrying..." );
539
- switch_set_timeout( REGISTRATION_RETRY, registration_retry, sw_info );
540
- }
541
- }
542
-
543
-
544
- static void
545
- stop_switch() {
546
- if ( switch_info.secure_channel_fd >= 0 ) {
547
- close( switch_info.secure_channel_fd );
548
- switch_info.secure_channel_fd = -1;
549
- }
550
- uint8_t state = MESSENGER_OPENFLOW_DISCONNECTED;
551
- if ( switch_info.state == SWITCH_STATE_CONNECTION_FAILED ) {
552
- state = MESSENGER_OPENFLOW_FAILD_TO_CONNECT;
553
- }
554
- service_send_state( &switch_info, &switch_info.datapath_id, state );
555
- flush_messenger();
556
-
557
- // free service name list
558
- iterate_list( switch_info.vendor_service_name_list, xfree_data, NULL );
559
- delete_list( switch_info.vendor_service_name_list );
560
- switch_info.vendor_service_name_list = NULL;
561
- iterate_list( switch_info.packetin_service_name_list, xfree_data, NULL );
562
- delete_list( switch_info.packetin_service_name_list );
563
- switch_info.packetin_service_name_list = NULL;
564
- iterate_list( switch_info.portstatus_service_name_list, xfree_data, NULL );
565
- delete_list( switch_info.portstatus_service_name_list );
566
- switch_info.portstatus_service_name_list = NULL;
567
- iterate_list( switch_info.state_service_name_list, xfree_data, NULL );
568
- delete_list( switch_info.state_service_name_list );
569
- switch_info.state_service_name_list = NULL;
570
-
571
- stop_trema();
572
- }
573
-
574
-
575
- static void
576
- unregistration_timeout( void *user_data ) {
577
- struct switch_info *sw_info = user_data;
578
-
579
- sw_info->running_timer = false;
580
-
581
- warn( "Unregistration timeout ( datapath id %#" PRIx64 " ).", sw_info->datapath_id );
582
-
583
- stop_switch();
584
- }
585
-
586
-
587
- static void
588
- confirm_self_dpid_is_unregistered( const list_element *switches, void *user_data );
589
-
590
-
591
- int
592
- switch_event_disconnected( struct switch_info *sw_info ) {
593
- int old_state = sw_info->state;
594
-
595
- if ( sw_info->state == SWITCH_STATE_DISCONNECTED ||
596
- sw_info->state == SWITCH_STATE_CONNECTION_FAILED ) {
597
- debug( "already disconnected" );
598
- return -1;
599
- }
600
-
601
- if ( sw_info->state == SWITCH_STATE_COMPLETED ) {
602
- sw_info->state = SWITCH_STATE_DISCONNECTED;
603
- }
604
- else {
605
- sw_info->state = SWITCH_STATE_CONNECTION_FAILED;
606
- }
607
-
608
- if ( old_state == SWITCH_STATE_COMPLETED ) {
609
- switch_unset_timeout( echo_reply_timeout, NULL );
610
- }
611
-
612
- if ( sw_info->fragment_buf != NULL ) {
613
- free_buffer( sw_info->fragment_buf );
614
- sw_info->fragment_buf = NULL;
615
- }
616
-
617
- if ( sw_info->send_queue != NULL ) {
618
- delete_message_queue( sw_info->send_queue );
619
- sw_info->send_queue = NULL;
620
- }
621
-
622
- if ( sw_info->recv_queue != NULL ) {
623
- delete_message_queue( sw_info->recv_queue );
624
- sw_info->recv_queue = NULL;
625
- }
626
-
627
- if ( sw_info->secure_channel_fd >= 0 ) {
628
- set_readable( switch_info.secure_channel_fd, false );
629
- set_writable( switch_info.secure_channel_fd, false );
630
- delete_fd_handler( switch_info.secure_channel_fd );
631
- }
632
-
633
- uint8_t state = MESSENGER_OPENFLOW_DISCONNECTED;
634
- if ( sw_info->state == SWITCH_STATE_CONNECTION_FAILED ) {
635
- state = MESSENGER_OPENFLOW_FAILD_TO_CONNECT;
636
- }
637
-
638
- debug( "Notify switch_disconnected to switch manager." );
639
- char switch_manager[] = SWITCH_MANAGER;
640
- list_element switch_manager_only_list;
641
- switch_manager_only_list.next = NULL;
642
- switch_manager_only_list.data = switch_manager;
643
- service_send_to_application( &switch_manager_only_list, state, &sw_info->datapath_id, NULL );
644
-
645
- // Check switch_manager registration
646
- debug( "Checking switch manager's switch list." );
647
- sw_info->retry_count = UNREGISTRATION_RETRY_COUNT;
648
- set_list_switches_reply_handler( confirm_self_dpid_is_unregistered );
649
- if ( send_list_switches_request( sw_info ) ) {
650
- switch_set_timeout( UNREGISTRATION_TIMEOUT, unregistration_timeout, sw_info );
651
- }
652
- else {
653
- error( "Failed to send switch list request to switch manager." );
654
- stop_switch();
655
- }
656
-
657
- return 0;
658
- }
659
-
660
-
661
- static void
662
- unregistration_retry( void *user_data ) {
663
- struct switch_info *sw_info = user_data;
664
-
665
- if ( sw_info->retry_count == 0 ) {
666
- stop_switch();
667
- return;
668
- }
669
- sw_info->retry_count--;
670
- sw_info->running_timer = false;
671
- debug( "Checking switch manager's switch list." );
672
- set_list_switches_reply_handler( confirm_self_dpid_is_unregistered );
673
- if ( send_list_switches_request( sw_info ) ) {
674
- switch_set_timeout( UNREGISTRATION_TIMEOUT, unregistration_timeout, sw_info );
675
- }
676
- else {
677
- error( "Failed to send switch list request to switch manager." );
678
- stop_switch();
679
- }
680
- }
681
-
682
-
683
- static void
684
- confirm_self_dpid_is_unregistered( const list_element *switches, void *user_data ) {
685
- struct switch_info *sw_info = user_data;
686
-
687
- switch_unset_timeout( unregistration_timeout, sw_info );
688
-
689
- debug( "Received switch manager's switch list." );
690
- bool found = false;
691
- for ( const list_element *e = switches; e != NULL; e = e->next ) {
692
- if ( sw_info->datapath_id == *( uint64_t * ) e->data ) {
693
- // self dpid registered
694
- debug( "Self dpid found" );
695
- found = true;
696
- break;
697
- }
698
- }
699
- if ( found ) {
700
- debug( "Self dpid found. Retrying..." );
701
- switch_set_timeout( UNREGISTRATION_RETRY, unregistration_retry, sw_info );
702
- }
703
- else {
704
- // The switch has been deleted from the switch list
705
- finalize_openflow_application_interface();
706
- push_external_callback( stop_switch );
707
- }
708
- }
709
-
710
-
711
- int
712
- switch_event_recv_from_application( uint64_t *datapath_id, char *application_service_name, buffer *buf ) {
713
-
714
- if ( *datapath_id != switch_info.datapath_id ) {
715
- error( "Invalid datapath id %#" PRIx64 ".", *datapath_id );
716
- free_buffer( buf );
717
-
718
- return -1;
719
- }
720
-
721
- return ofpmsg_send( &switch_info, buf, application_service_name );
722
- }
723
-
724
-
725
- int
726
- switch_event_disconnect_request( uint64_t *datapath_id ) {
727
-
728
- if ( *datapath_id != switch_info.datapath_id ) {
729
- error( "Invalid datapath id %#" PRIx64 ".", *datapath_id );
730
- return -1;
731
- }
732
- return switch_event_disconnected( &switch_info );
733
- }
734
-
735
-
736
- int
737
- switch_event_recv_error( struct switch_info *sw_info ) {
738
- if ( sw_info->state == SWITCH_STATE_COMPLETED ) {
739
- return 0;
740
- }
741
-
742
- return -1;
743
- }
744
-
745
-
746
- static void
747
- management_event_forward_entry_operation( const messenger_context_handle *handle, uint32_t command, event_forward_operation_request *req, size_t data_len ) {
748
-
749
- debug( "management efi command:%#x, type:%#x, n_services:%d", command, req->type, req->n_services );
750
-
751
- list_element **subject = NULL;
752
- switch ( req->type ) {
753
- case EVENT_FORWARD_TYPE_VENDOR:
754
- info( "Managing vendor event." );
755
- subject = &switch_info.vendor_service_name_list;
756
- break;
757
-
758
- case EVENT_FORWARD_TYPE_PACKET_IN:
759
- info( "Managing packet_in event." );
760
- subject = &switch_info.packetin_service_name_list;
761
- break;
762
-
763
- case EVENT_FORWARD_TYPE_PORT_STATUS:
764
- info( "Managing port_status event." );
765
- subject = &switch_info.portstatus_service_name_list;
766
- break;
767
-
768
- case EVENT_FORWARD_TYPE_STATE_NOTIFY:
769
- info( "Managing state_notify event." );
770
- subject = &switch_info.state_service_name_list;
771
- break;
772
-
773
- default:
774
- error( "Invalid EVENT_FWD_TYPE ( %#x )", req->type );
775
- event_forward_operation_reply res;
776
- memset( &res, 0, sizeof( event_forward_operation_reply ) );
777
- res.type = req->type;
778
- res.result = EFI_OPERATION_FAILED;
779
- management_application_reply *reply = create_management_application_reply( MANAGEMENT_REQUEST_FAILED, command, &res, sizeof( event_forward_operation_reply ) );
780
- send_management_application_reply( handle, reply );
781
- xfree( reply );
782
- return;
783
- }
784
- assert( subject != NULL );
785
-
786
- switch ( command ) {
787
- case EVENT_FORWARD_ENTRY_ADD:
788
- management_event_forward_entry_add( subject, req, data_len );
789
- break;
790
-
791
- case EVENT_FORWARD_ENTRY_DELETE:
792
- management_event_forward_entry_delete( subject, req, data_len );
793
- break;
794
-
795
- case EVENT_FORWARD_ENTRY_DUMP:
796
- info( "Dumping current event filter." );
797
- // do nothing
798
- break;
799
-
800
- case EVENT_FORWARD_ENTRY_SET:
801
- management_event_forward_entries_set( subject, req, data_len );
802
- break;
803
- }
804
-
805
- buffer *buf = create_event_forward_operation_reply( req->type, EFI_OPERATION_SUCCEEDED, *subject );
806
- management_application_reply *reply = create_management_application_reply( MANAGEMENT_REQUEST_SUCCEEDED, command, buf->data, buf->length );
807
- free_buffer( buf );
808
- send_management_application_reply( handle, reply );
809
- xfree( reply );
810
- }
811
-
812
-
813
- static void
814
- management_recv( const messenger_context_handle *handle, uint32_t command, void *data, size_t data_len, void *user_data ) {
815
- UNUSED( user_data );
816
-
817
- switch ( command ) {
818
- case DUMP_XID_TABLE:
819
- {
820
- dump_xid_table();
821
- }
822
- break;
823
-
824
- case DUMP_COOKIE_TABLE:
825
- {
826
- if ( !switch_info.cookie_translation ) {
827
- break;
828
- }
829
- dump_cookie_table();
830
- }
831
- break;
832
-
833
- case TOGGLE_COOKIE_AGING:
834
- {
835
- if ( !switch_info.cookie_translation ) {
836
- break;
837
- }
838
- if ( age_cookie_table_enabled ) {
839
- delete_timer_event( age_cookie_table, NULL );
840
- age_cookie_table_enabled = false;
841
- }
842
- else {
843
- add_periodic_event_callback( COOKIE_TABLE_AGING_INTERVAL, age_cookie_table, NULL );
844
- age_cookie_table_enabled = true;
845
- }
846
- }
847
- break;
848
-
849
- case EVENT_FORWARD_ENTRY_ADD:
850
- case EVENT_FORWARD_ENTRY_DELETE:
851
- case EVENT_FORWARD_ENTRY_DUMP:
852
- case EVENT_FORWARD_ENTRY_SET:
853
- {
854
- event_forward_operation_request *req = data;
855
- req->n_services = ntohl( req->n_services );
856
- management_event_forward_entry_operation( handle, command, req, data_len );
857
- return;
858
- }
859
- break;
860
-
861
- default:
862
- {
863
- error( "Undefined management command ( %#x )", command );
864
- management_application_reply *reply = create_management_application_reply( MANAGEMENT_REQUEST_FAILED, command, NULL, 0 );
865
- send_management_application_reply( handle, reply );
866
- xfree( reply );
867
- return;
868
- }
869
- }
870
-
871
- management_application_reply *reply = create_management_application_reply( MANAGEMENT_REQUEST_SUCCEEDED, command, NULL, 0 );
872
- send_management_application_reply( handle, reply );
873
- xfree( reply );
874
- }
875
-
876
-
877
- static void
878
- stop_switch_daemon( void ) {
879
- switch_event_disconnected( &switch_info );
880
- }
881
-
882
-
883
- static void
884
- handle_sigterm( int signum ) {
885
- UNUSED( signum );
886
-
887
- push_external_callback( stop_switch_daemon );
888
- }
889
-
890
-
891
- int
892
- main( int argc, char *argv[] ) {
893
- int ret;
894
- int i;
895
- char *service_name;
896
-
897
- init_trema( &argc, &argv );
898
- option_parser( argc, argv );
899
-
900
- create_list( &switch_info.vendor_service_name_list );
901
- create_list( &switch_info.packetin_service_name_list );
902
- create_list( &switch_info.portstatus_service_name_list );
903
- create_list( &switch_info.state_service_name_list );
904
-
905
- for ( i = optind; i < argc; i++ ) {
906
- if ( strncmp( argv[ i ], VENDOR_PREFIX, strlen( VENDOR_PREFIX ) ) == 0 ) {
907
- service_name = xstrdup( argv[ i ] + strlen( VENDOR_PREFIX ) );
908
- append_to_tail( &switch_info.vendor_service_name_list, service_name );
909
- }
910
- else if ( strncmp( argv[ i ], PACKET_IN_PREFIX, strlen( PACKET_IN_PREFIX ) ) == 0 ) {
911
- service_name = xstrdup( argv[ i ] + strlen( PACKET_IN_PREFIX ) );
912
- append_to_tail( &switch_info.packetin_service_name_list, service_name );
913
- }
914
- else if ( strncmp( argv[ i ], PORTSTATUS_PREFIX, strlen( PORTSTATUS_PREFIX ) ) == 0 ) {
915
- service_name = xstrdup( argv[ i ] + strlen( PORTSTATUS_PREFIX ) );
916
- append_to_tail( &switch_info.portstatus_service_name_list, service_name );
917
- }
918
- else if ( strncmp( argv[ i ], STATE_PREFIX, strlen( STATE_PREFIX ) ) == 0 ) {
919
- service_name = xstrdup( argv[ i ] + strlen( STATE_PREFIX ) );
920
- append_to_tail( &switch_info.state_service_name_list, service_name );
921
- }
922
- }
923
-
924
- struct sigaction signal_exit;
925
- memset( &signal_exit, 0, sizeof( struct sigaction ) );
926
- signal_exit.sa_handler = handle_sigterm;
927
- sigaction( SIGINT, &signal_exit, NULL );
928
- sigaction( SIGTERM, &signal_exit, NULL );
929
-
930
- fcntl( switch_info.secure_channel_fd, F_SETFL, O_NONBLOCK );
931
-
932
- set_fd_handler( switch_info.secure_channel_fd, secure_channel_read, NULL, secure_channel_write, NULL );
933
- set_readable( switch_info.secure_channel_fd, true );
934
- set_writable( switch_info.secure_channel_fd, false );
935
-
936
- // default switch configuration
937
- switch_info.config_flags = OFPC_FRAG_NORMAL;
938
- switch_info.miss_send_len = UINT16_MAX;
939
-
940
- switch_info.fragment_buf = NULL;
941
- switch_info.send_queue = create_message_queue();
942
- switch_info.recv_queue = create_message_queue();
943
- switch_info.running_timer = false;
944
- switch_info.echo_request_xid = 0;
945
-
946
- init_xid_table();
947
- if ( switch_info.cookie_translation ) {
948
- init_cookie_table();
949
- }
950
-
951
- add_message_received_callback( get_trema_name(), service_recv );
952
- set_management_application_request_handler( management_recv, NULL );
953
-
954
- ret = switch_event_connected( &switch_info );
955
- if ( ret < 0 ) {
956
- error( "Failed to set connected state." );
957
- return -1;
958
- }
959
- ret = flush_secure_channel( &switch_info );
960
- if ( ret < 0 ) {
961
- error( "Failed to flush secure channel. Terminating %s.", argv[ 0 ] );
962
- return -1;
963
- }
964
-
965
- start_trema();
966
-
967
- // Note: init_event_forward_interface will be called on feature_reply.
968
- finalize_event_forward_interface();
969
-
970
- finalize_xid_table();
971
- if ( switch_info.cookie_translation ) {
972
- finalize_cookie_table();
973
- }
974
-
975
- if ( switch_info.secure_channel_fd >= 0 ) {
976
- delete_fd_handler( switch_info.secure_channel_fd );
977
- }
978
-
979
- return 0;
980
- }
981
-
982
-
983
- /*
984
- * Local variables:
985
- * c-basic-offset: 2
986
- * indent-tabs-mode: nil
987
- * End:
988
- */