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,49 +0,0 @@
1
- /*
2
- * OpenFlow flow matching 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 MATCH_TABLE_H
22
- #define MATCH_TABLE_H
23
-
24
-
25
- #include <openflow.h>
26
- #include "hash_table.h"
27
- #include "linked_list.h"
28
-
29
-
30
- void init_match_table( void );
31
- void finalize_match_table( void );
32
- bool insert_match_entry( struct ofp_match match, uint16_t priority, void *data );
33
- void *lookup_match_strict_entry( struct ofp_match match, uint16_t priority );
34
- void *lookup_match_entry( struct ofp_match match );
35
- bool update_match_entry( struct ofp_match match, uint16_t priority, void *data );
36
- void *delete_match_strict_entry( struct ofp_match match, uint16_t priority );
37
- void foreach_match_table( void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data );
38
- void map_match_table( struct ofp_match match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data );
39
-
40
-
41
- #endif // MATCH_TABLE_H
42
-
43
-
44
- /*
45
- * Local variables:
46
- * c-basic-offset: 2
47
- * indent-tabs-mode: nil
48
- * End:
49
- */
@@ -1,143 +0,0 @@
1
- /*
2
- * Copyright (C) 2008-2013 NEC Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License, version 2, as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
12
- *
13
- * You should have received a copy of the GNU General Public License along
14
- * with this program; if not, write to the Free Software Foundation, Inc.,
15
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
- */
17
-
18
-
19
- #include <assert.h>
20
- #include "wrapper.h"
21
- #include "message_queue.h"
22
-
23
-
24
- message_queue *
25
- create_message_queue( void ) {
26
- message_queue *new_queue = xmalloc( sizeof( message_queue ) );
27
- new_queue->head = xmalloc( sizeof( message_queue_element ) );
28
- new_queue->head->data = NULL;
29
- new_queue->head->next = NULL;
30
- new_queue->divider = new_queue->tail = new_queue->head;
31
- new_queue->length = 0;
32
-
33
- return new_queue;
34
- }
35
-
36
-
37
- bool
38
- delete_message_queue( message_queue *queue ) {
39
- if ( queue == NULL ) {
40
- die( "queue must not be NULL" );
41
- }
42
-
43
- while ( queue->head != NULL ) {
44
- message_queue_element *element = queue->head;
45
- if ( queue->head->data != NULL ) {
46
- free_buffer( element->data );
47
- }
48
- queue->head = queue->head->next;
49
- xfree( element );
50
- }
51
- xfree( queue );
52
-
53
- return true;
54
- }
55
-
56
-
57
- static void
58
- collect_garbage( message_queue *queue ) {
59
- while ( queue->head != queue->divider ) {
60
- message_queue_element *element = queue->head;
61
- queue->head = queue->head->next;
62
- xfree( element );
63
- }
64
- }
65
-
66
-
67
- bool
68
- enqueue_message( message_queue *queue, buffer *message ) {
69
- if ( queue == NULL ) {
70
- die( "queues must not be NULL" );
71
- }
72
- if ( message == NULL ) {
73
- die( "message must not be NULL" );
74
- }
75
-
76
- message_queue_element *new_tail = xmalloc( sizeof( message_queue_element ) );
77
- new_tail->data = message;
78
- new_tail->next = NULL;
79
-
80
- queue->tail->next = new_tail;
81
- queue->tail = new_tail;
82
- queue->length++;
83
-
84
- collect_garbage( queue );
85
-
86
- return true;
87
- }
88
-
89
-
90
- buffer *
91
- dequeue_message( message_queue *queue ) {
92
- if ( queue == NULL ) {
93
- die( "queue must not be NULL" );
94
- }
95
- if ( queue->divider == queue->tail ) {
96
- return NULL;
97
- }
98
-
99
- message_queue_element *next = queue->divider->next;
100
- buffer *message = next->data;
101
- next->data = NULL; // data must be freed by caller
102
- queue->divider = next;
103
- queue->length--;
104
-
105
- return message;
106
- }
107
-
108
-
109
- buffer *
110
- peek_message( message_queue *queue ) {
111
- if ( queue == NULL ) {
112
- die( "queue must not be NULL" );
113
- }
114
-
115
- if ( queue->divider == queue->tail ) {
116
- return NULL;
117
- }
118
-
119
- return queue->divider->next->data;
120
- }
121
-
122
-
123
- void foreach_message_queue( message_queue *queue, bool function( buffer *message, void *user_data ), void *user_data ) {
124
- if ( queue->divider == queue->tail ) {
125
- return;
126
- }
127
- message_queue_element *element;
128
- for ( element = queue->divider->next; element != NULL; element = element->next ) {
129
- buffer *message = element->data;
130
- assert( message != NULL );
131
- if ( !function( message, user_data ) ) {
132
- break;
133
- }
134
- }
135
- }
136
-
137
-
138
- /*
139
- * Local variables:
140
- * c-basic-offset: 2
141
- * indent-tabs-mode: nil
142
- * End:
143
- */
@@ -1,59 +0,0 @@
1
- /*
2
- * Queue implementation
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 MESSAGE_QUEUE_H
22
- #define MESSAGE_QUEUE_H
23
-
24
-
25
- #include "bool.h"
26
- #include "buffer.h"
27
-
28
-
29
- typedef struct message_queue_element {
30
- buffer *data;
31
- struct message_queue_element *next;
32
- } message_queue_element;
33
-
34
-
35
- typedef struct {
36
- message_queue_element *head;
37
- message_queue_element *divider;
38
- message_queue_element *tail;
39
- unsigned int length;
40
- } message_queue;
41
-
42
-
43
- message_queue *create_message_queue( void );
44
- bool delete_message_queue( message_queue *queue );
45
- bool enqueue_message( message_queue *queue, buffer *message );
46
- buffer *dequeue_message( message_queue *queue );
47
- buffer *peek_message( message_queue *queue );
48
- void foreach_message_queue( message_queue *queue, bool function( buffer *message, void *user_data ), void *user_data );
49
-
50
-
51
- #endif // MESSAGE_QUEUE_H
52
-
53
-
54
- /*
55
- * Local variables:
56
- * c-basic-offset: 2
57
- * indent-tabs-mode: nil
58
- * End:
59
- */
@@ -1,1821 +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 <errno.h>
22
- #include <fcntl.h>
23
- #include <inttypes.h>
24
- #include <linux/limits.h>
25
- #include <linux/sockios.h>
26
- #include <stdio.h>
27
- #include <stdlib.h>
28
- #include <sys/ioctl.h>
29
- #include <sys/socket.h>
30
- #include <sys/types.h>
31
- #include <sys/un.h>
32
- #include <unistd.h>
33
- #include "doubly_linked_list.h"
34
- #include "event_handler.h"
35
- #include "hash_table.h"
36
- #include "log.h"
37
- #include "messenger.h"
38
- #include "timer.h"
39
- #include "wrapper.h"
40
-
41
-
42
- #ifdef UNIT_TESTING
43
-
44
- #define static
45
-
46
- // Redirect socket functions to mock functions in the unit test.
47
- #ifdef socket
48
- #undef socket
49
- #endif
50
- #define socket mock_socket
51
- extern int mock_socket( int domain, int type, int protocol );
52
-
53
- #ifdef bind
54
- #undef bind
55
- #endif
56
- #define bind mock_bind
57
- extern int mock_bind( int sockfd, const struct sockaddr *addr, socklen_t addrlen );
58
-
59
- #ifdef listen
60
- #undef listen
61
- #endif
62
- #define listen mock_listen
63
- extern int mock_listen( int sockfd, int backlog );
64
-
65
- #ifdef close
66
- #undef close
67
- #endif
68
- #define close mock_close
69
- extern int mock_close( int fd );
70
-
71
- #ifdef connect
72
- #undef connect
73
- #endif
74
- #define connect mock_connect
75
- extern int mock_connect( int sockfd, const struct sockaddr *addr, socklen_t addrlen );
76
-
77
- #ifdef select
78
- #undef select
79
- #endif
80
- #define select mock_select
81
- extern int mock_select( int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout );
82
-
83
- #ifdef accept
84
- #undef accept
85
- #endif
86
- #define accept mock_accept
87
- extern int mock_accept( int sockfd, struct sockaddr *addr, socklen_t *addrlen );
88
-
89
- #ifdef recv
90
- #undef recv
91
- #endif
92
- #define recv mock_recv
93
- extern ssize_t mock_recv( int sockfd, void *buf, size_t len, int flags );
94
-
95
- #ifdef send
96
- #undef send
97
- #endif
98
- #define send mock_send
99
- extern ssize_t mock_send( int sockfd, const void *buf, size_t len, int flags );
100
-
101
- #ifdef setsockopt
102
- #undef setsockopt
103
- #endif
104
- #define setsockopt mock_setsockopt
105
- extern int mock_setsockopt( int s, int level, int optname, const void *optval, socklen_t optlen );
106
-
107
- #ifdef clock_gettime
108
- #undef clock_gettime
109
- #endif
110
- #define clock_gettime mock_clock_gettime
111
- extern int mock_clock_gettime( clockid_t clk_id, struct timespec *tp );
112
-
113
- #ifdef error
114
- #undef error
115
- #endif
116
- #define error mock_error
117
- extern void mock_error( const char *format, ... );
118
-
119
- #ifdef debug
120
- #undef debug
121
- #endif
122
- #define debug mock_debug
123
- extern void mock_debug( const char *format, ... );
124
-
125
- #ifdef warn
126
- #undef warn
127
- #endif
128
- #define warn mock_warn
129
- extern void mock_warn( const char *format, ... );
130
-
131
- #ifdef add_periodic_event_callback
132
- #undef add_periodic_event_callback
133
- #endif
134
- #define add_periodic_event_callback mock_add_periodic_event_callback
135
- extern bool mock_add_periodic_event_callback( const time_t seconds, void ( *callback )( void *user_data ), void *user_data );
136
-
137
- #endif // UNIT_TESTING
138
-
139
-
140
- enum {
141
- MESSAGE_TYPE_NOTIFY,
142
- MESSAGE_TYPE_REQUEST,
143
- MESSAGE_TYPE_REPLY,
144
- MESSAGE_TYPE_INVALID = 255,
145
- };
146
-
147
- typedef struct message_buffer {
148
- void *buffer;
149
- size_t data_length;
150
- size_t size;
151
- size_t head_offset;
152
- } message_buffer;
153
-
154
- typedef struct messenger_socket {
155
- int fd;
156
- } messenger_socket;
157
-
158
- typedef struct messenger_context {
159
- uint32_t transaction_id;
160
- int life_count;
161
- void *user_data;
162
- } messenger_context;
163
-
164
- typedef struct receive_queue_callback {
165
- void *function;
166
- uint8_t message_type;
167
- } receive_queue_callback;
168
-
169
- typedef struct receive_queue {
170
- char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
171
- dlist_element *message_callbacks;
172
- int listen_socket;
173
- struct sockaddr_un listen_addr;
174
- dlist_element *client_sockets;
175
- message_buffer *buffer;
176
- bool in_progress;
177
- } receive_queue;
178
-
179
- typedef struct send_queue {
180
- char service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
181
- int server_socket;
182
- int refused_count;
183
- struct timespec reconnect_interval;
184
- struct sockaddr_un server_addr;
185
- message_buffer *buffer;
186
- bool running_timer;
187
- uint32_t overflow;
188
- uint64_t overflow_total_length;
189
- int socket_buffer_size;
190
- } send_queue;
191
-
192
-
193
- #define MESSENGER_RECV_BUFFER 100000
194
- static const uint32_t messenger_send_queue_length = MESSENGER_RECV_BUFFER * 4;
195
- static const uint32_t messenger_flush_limit_length = MESSENGER_RECV_BUFFER * 2;
196
- static const uint32_t messenger_flush_length = MESSENGER_RECV_BUFFER / 4;
197
- static const uint32_t messenger_bucket_size = MESSENGER_RECV_BUFFER;
198
- static const uint32_t messenger_recv_queue_length = MESSENGER_RECV_BUFFER * 2;
199
- static const uint32_t messenger_recv_queue_reserved = MESSENGER_RECV_BUFFER;
200
-
201
- char socket_directory[ PATH_MAX ];
202
- static bool initialized = false;
203
- static bool finalized = false;
204
- static hash_table *receive_queues = NULL;
205
- static hash_table *send_queues = NULL;
206
- static hash_table *context_db = NULL;
207
- static char *_dump_service_name = NULL;
208
- static char *_dump_app_name = NULL;
209
- static uint32_t last_transaction_id = 0;
210
-
211
- static void on_accept( int fd, void *data );
212
- static void on_recv( int fd, void *data );
213
- static void on_send_write( int fd, void *data );
214
- static void on_send_read( int fd, void *data );
215
-
216
- static void
217
- _delete_context( void *key, void *value, void *user_data ) {
218
- assert( value != NULL );
219
- UNUSED( key );
220
- UNUSED( user_data );
221
- messenger_context *context = value;
222
-
223
- debug( "Deleting a context ( transaction_id = %#x, life_count = %d, user_data = %p ).",
224
- context->transaction_id, context->life_count, context->user_data );
225
-
226
- delete_hash_entry( context_db, &context->transaction_id );
227
- xfree( context );
228
- }
229
-
230
-
231
- static void
232
- delete_context( messenger_context *context ) {
233
- assert( context != NULL );
234
-
235
- _delete_context( &context->transaction_id, context, NULL );
236
- }
237
-
238
-
239
- static void
240
- _age_context( void *key, void *value, void *user_data ) {
241
- assert( value != NULL );
242
- UNUSED( key );
243
- UNUSED( user_data );
244
- messenger_context *context = value;
245
- context->life_count--;
246
- if ( context->life_count <= 0 ) {
247
- delete_context( context );
248
- }
249
- }
250
-
251
-
252
- static void
253
- age_context_db( void *user_data ) {
254
- UNUSED( user_data );
255
-
256
- debug( "Aging context database ( context_db = %p ).", context_db );
257
-
258
- foreach_hash( context_db, _age_context, NULL );
259
- }
260
-
261
-
262
- bool
263
- init_messenger( const char *working_directory ) {
264
- assert( working_directory != NULL );
265
-
266
- init_event_handler();
267
-
268
- if ( initialized ) {
269
- warn( "Messenger is already initialized." );
270
- return true;
271
- }
272
-
273
- strcpy( socket_directory, working_directory );
274
-
275
- receive_queues = create_hash_with_size( compare_string, hash_string, 8 );
276
- send_queues = create_hash_with_size( compare_string, hash_string, 8 );
277
- context_db = create_hash_with_size( compare_uint32, hash_uint32, 128 );
278
-
279
- initialized = true;
280
- finalized = false;
281
-
282
- return initialized;
283
- }
284
-
285
-
286
- static void
287
- delete_context_db( void ) {
288
- debug( "Deleting context database ( context_db = %p ).", context_db );
289
-
290
- if ( context_db != NULL ) {
291
- foreach_hash( context_db, _delete_context, NULL );
292
- delete_hash( context_db );
293
- context_db = NULL;
294
- }
295
- }
296
-
297
-
298
- static void
299
- free_message_buffer( message_buffer *buf ) {
300
- assert( buf != NULL );
301
-
302
- xfree( buf->buffer );
303
- xfree( buf );
304
- }
305
-
306
-
307
- static void *
308
- get_message_buffer_head( message_buffer *buf ) {
309
- return ( char * ) buf->buffer + buf->head_offset;
310
- }
311
-
312
-
313
- static void
314
- delete_send_queue( send_queue *sq ) {
315
- assert( NULL != sq );
316
-
317
- debug( "Deleting a send queue ( service_name = %s, fd = %d ).", sq->service_name, sq->server_socket );
318
-
319
- free_message_buffer( sq->buffer );
320
- if ( sq->server_socket != -1 ) {
321
- set_readable( sq->server_socket, false );
322
- set_writable( sq->server_socket, false );
323
- delete_fd_handler( sq->server_socket );
324
-
325
- close( sq->server_socket );
326
- }
327
- if ( send_queues != NULL ) {
328
- delete_hash_entry( send_queues, sq->service_name );
329
- }
330
- else {
331
- error( "All send queues are already deleted or not created yet." );
332
- }
333
- xfree( sq );
334
- }
335
-
336
-
337
- static void
338
- delete_all_send_queues() {
339
- hash_iterator iter;
340
- hash_entry *e;
341
-
342
- debug( "Deleting all send queues ( send_queues = %p ).", send_queues );
343
-
344
- if ( send_queues != NULL ) {
345
- init_hash_iterator( send_queues, &iter );
346
- while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
347
- delete_send_queue( e->value );
348
- }
349
- delete_hash( send_queues );
350
- send_queues = NULL;
351
- }
352
- else {
353
- error( "All send queues are already deleted or not created yet." );
354
- }
355
- }
356
-
357
-
358
- static void
359
- send_dump_message( uint16_t dump_type, const char *service_name, const void *data, uint32_t data_len ) {
360
- assert( service_name != NULL );
361
-
362
- debug( "Sending a dump message ( dump_type = %#x, service_name = %s, data = %p, data_len = %u ).",
363
- dump_type, service_name, data, data_len );
364
-
365
- size_t service_name_len, app_name_len;
366
- char *dump_buf, *p;
367
- message_dump_header *dump_hdr;
368
- size_t dump_buf_len;
369
-
370
- if ( _dump_service_name == NULL ) {
371
- debug( "Dump service name is not set." );
372
- return;
373
- }
374
- if ( strcmp( service_name, _dump_service_name ) == 0 ) {
375
- debug( "Source service name and destination service name are the same ( service name = %s ).", service_name );
376
- return;
377
- }
378
-
379
- struct timespec now;
380
- if ( clock_gettime( CLOCK_REALTIME, &now ) == -1 ) {
381
- error( "Failed to retrieve system-wide real-time clock ( %s [%d] ).", strerror( errno ), errno );
382
- return;
383
- }
384
-
385
- service_name_len = strlen( service_name ) + 1;
386
- app_name_len = strlen( _dump_app_name ) + 1;
387
- dump_buf_len = sizeof( message_dump_header ) + app_name_len + service_name_len + data_len;
388
- dump_buf = xmalloc( dump_buf_len );
389
- dump_hdr = ( message_dump_header * ) dump_buf;
390
-
391
- // header
392
- dump_hdr->sent_time.sec = htonl( ( uint32_t ) now.tv_sec );
393
- dump_hdr->sent_time.nsec = htonl( ( uint32_t ) now.tv_nsec );
394
- dump_hdr->app_name_length = htons( ( uint16_t ) app_name_len );
395
- dump_hdr->service_name_length = htons( ( uint16_t ) service_name_len );
396
- dump_hdr->data_length = htonl( data_len );
397
-
398
- // app name
399
- p = dump_buf;
400
- p += sizeof( message_dump_header );
401
- memcpy( p, _dump_app_name, app_name_len );
402
-
403
- // service name
404
- p += app_name_len;
405
- memcpy( p, service_name, service_name_len );
406
-
407
- // data
408
- p += service_name_len;
409
- memcpy( p, data, data_len );
410
-
411
- // send
412
- send_message( _dump_service_name, dump_type, dump_buf, dump_buf_len );
413
-
414
- xfree( dump_buf );
415
- }
416
-
417
-
418
- /**
419
- * closes accepted sockets and listening socket, and releases memories.
420
- */
421
- static void
422
- delete_receive_queue( void *service_name, void *_rq, void *user_data ) {
423
- debug( "Deleting a receive queue ( service_name = %s, _rq = %p, user_data = %p ).", ( char * ) service_name, _rq, user_data );
424
-
425
- receive_queue *rq = _rq;
426
- messenger_socket *client_socket;
427
- dlist_element *element;
428
- receive_queue_callback *cb;
429
-
430
- assert( rq != NULL );
431
- assert( rq->in_progress == false );
432
- for ( element = rq->message_callbacks->next; element; element = element->next ) {
433
- cb = element->data;
434
- debug( "Deleting a callback ( function = %p, message_type = %#x ).", cb->function, cb->message_type );
435
- xfree( cb );
436
- }
437
- delete_dlist( rq->message_callbacks );
438
- rq->message_callbacks = NULL;
439
-
440
- for ( element = rq->client_sockets->next; element; element = element->next ) {
441
- client_socket = element->data;
442
-
443
- debug( "Closing a client socket ( fd = %d ).", client_socket->fd );
444
-
445
- set_readable( client_socket->fd, false );
446
- delete_fd_handler( client_socket->fd );
447
-
448
- close( client_socket->fd );
449
- xfree( client_socket );
450
- send_dump_message( MESSENGER_DUMP_RECV_CLOSED, rq->service_name, NULL, 0 );
451
- }
452
- delete_dlist( rq->client_sockets );
453
-
454
- set_readable( rq->listen_socket, false );
455
- delete_fd_handler( rq->listen_socket );
456
-
457
- close( rq->listen_socket );
458
- free_message_buffer( rq->buffer );
459
- unlink( rq->listen_addr.sun_path );
460
-
461
- if ( receive_queues != NULL ) {
462
- delete_hash_entry( receive_queues, rq->service_name );
463
- }
464
- else {
465
- error( "All receive queues are already deleted or not created yet." );
466
- }
467
- xfree( rq );
468
- }
469
-
470
-
471
- static void
472
- delete_all_receive_queues() {
473
- debug( "Deleting all receive queues ( receive_queues = %p ).", receive_queues );
474
-
475
- if ( receive_queues != NULL ) {
476
- foreach_hash( receive_queues, delete_receive_queue, NULL );
477
- delete_hash( receive_queues );
478
- receive_queues = NULL;
479
- }
480
- else {
481
- error( "All receive queues are already deleted or not created yet." );
482
- }
483
- }
484
-
485
-
486
- bool
487
- finalize_messenger() {
488
- debug( "Finalizing messenger." );
489
-
490
- if ( !initialized ) {
491
- warn( "Messenger is not initialized yet." );
492
- return false;
493
- }
494
- if ( finalized ) {
495
- warn( "Messenger is already finalized." );
496
- return true;
497
- }
498
-
499
- if ( messenger_dump_enabled() ) {
500
- stop_messenger_dump();
501
- }
502
- if ( receive_queues != NULL ) {
503
- delete_all_receive_queues();
504
- }
505
- if ( send_queues != NULL ) {
506
- delete_all_send_queues();
507
- }
508
- if ( context_db != NULL ) {
509
- delete_context_db();
510
- }
511
-
512
- initialized = false;
513
- finalized = true;
514
-
515
- finalize_event_handler();
516
-
517
- return true;
518
- }
519
-
520
-
521
- static message_buffer *
522
- create_message_buffer( size_t size ) {
523
- message_buffer *buf = xmalloc( sizeof( message_buffer ) );
524
-
525
- buf->buffer = xmalloc( size );
526
- buf->size = size;
527
- buf->data_length = 0;
528
- buf->head_offset = 0;
529
-
530
- return buf;
531
- }
532
-
533
-
534
- static receive_queue *
535
- create_receive_queue( const char *service_name ) {
536
- assert( service_name != NULL );
537
- assert( strlen( service_name ) < MESSENGER_SERVICE_NAME_LENGTH );
538
-
539
- debug( "Creating a receive queue ( service_name = %s ).", service_name );
540
-
541
- assert( receive_queues != NULL );
542
- receive_queue *rq = lookup_hash_entry( receive_queues, service_name );
543
- if ( rq != NULL ) {
544
- warn( "Receive queue for %s is already created.", service_name );
545
- return rq;
546
- }
547
-
548
- rq = xmalloc( sizeof( receive_queue ) );
549
- memset( rq->service_name, 0, MESSENGER_SERVICE_NAME_LENGTH );
550
- strncpy( rq->service_name, service_name, MESSENGER_SERVICE_NAME_LENGTH );
551
-
552
- memset( &rq->listen_addr, 0, sizeof( struct sockaddr_un ) );
553
- rq->listen_addr.sun_family = AF_UNIX;
554
- sprintf( rq->listen_addr.sun_path, "%s/trema.%s.sock", socket_directory, service_name );
555
- debug( "Set sun_path to %s.", rq->listen_addr.sun_path );
556
-
557
- rq->listen_socket = socket( AF_UNIX, SOCK_SEQPACKET, 0 );
558
- if ( rq->listen_socket == -1 ) {
559
- error( "Failed to call socket ( errno = %s [%d] ).", strerror( errno ), errno );
560
- xfree( rq );
561
- return NULL;
562
- }
563
-
564
- unlink( rq->listen_addr.sun_path ); // FIXME: handle error correctly
565
-
566
- int ret;
567
- ret = bind( rq->listen_socket, ( struct sockaddr * ) &rq->listen_addr, sizeof( struct sockaddr_un ) );
568
- if ( ret == -1 ) {
569
- error( "Failed to bind ( fd = %d, sun_path = %s, errno = %s [%d] ).",
570
- rq->listen_socket, rq->listen_addr.sun_path, strerror( errno ), errno );
571
- close( rq->listen_socket );
572
- xfree( rq );
573
- return NULL;
574
- }
575
-
576
- ret = listen( rq->listen_socket, SOMAXCONN );
577
- if ( ret == -1 ) {
578
- error( "Failed to listen ( fd = %d, sun_path = %s, errno = %s [%d] ).",
579
- rq->listen_socket, rq->listen_addr.sun_path, strerror( errno ), errno );
580
- close( rq->listen_socket );
581
- xfree( rq );
582
- return NULL;
583
- }
584
-
585
- ret = fcntl( rq->listen_socket, F_SETFL, O_NONBLOCK );
586
- if ( ret < 0 ) {
587
- error( "Failed to set O_NONBLOCK ( %s [%d] ).", strerror( errno ), errno );
588
- close( rq->listen_socket );
589
- xfree( rq );
590
- return NULL;
591
- }
592
-
593
- set_fd_handler( rq->listen_socket, on_accept, rq, NULL, NULL );
594
- set_readable( rq->listen_socket, true );
595
-
596
- rq->message_callbacks = create_dlist();
597
- rq->client_sockets = create_dlist();
598
- rq->buffer = create_message_buffer( messenger_recv_queue_length );
599
- rq->in_progress = false;
600
-
601
- insert_hash_entry( receive_queues, rq->service_name, rq );
602
-
603
- return rq;
604
- }
605
-
606
-
607
- static bool
608
- add_message_callback( const char *service_name, uint8_t message_type, void *callback ) {
609
- assert( receive_queues != NULL );
610
- assert( service_name != NULL );
611
- assert( callback != NULL );
612
-
613
- debug( "Adding a message callback ( service_name = %s, message_type = %#x, callback = %p ).",
614
- service_name, message_type, callback );
615
-
616
- receive_queue *rq = lookup_hash_entry( receive_queues, service_name );
617
- if ( rq == NULL ) {
618
- debug( "No receive queue found. Creating." );
619
- rq = create_receive_queue( service_name );
620
- if ( rq == NULL ) {
621
- error( "Failed to create a receive queue." );
622
- return false;
623
- }
624
- }
625
-
626
- if ( message_type == MESSAGE_TYPE_REQUEST || message_type == MESSAGE_TYPE_REPLY ) {
627
- for ( dlist_element *e = rq->message_callbacks->next; e; e = e->next ) {
628
- receive_queue_callback *cb = e->data;
629
- if ( cb->message_type == message_type ) {
630
- warn( "Multiple message_requested/replied handler is not supported. ( service_name = %s, message_type = %#x, callback = %p )",
631
- service_name, message_type, callback );
632
- break;
633
- }
634
- }
635
- }
636
-
637
- receive_queue_callback *cb = xmalloc( sizeof( receive_queue_callback ) );
638
- cb->message_type = message_type;
639
- cb->function = callback;
640
- insert_after_dlist( rq->message_callbacks, cb );
641
-
642
- return true;
643
- }
644
-
645
-
646
- static bool
647
- _add_message_received_callback( const char *service_name, const callback_message_received callback ) {
648
- assert( service_name != NULL );
649
- assert( callback != NULL );
650
-
651
- debug( "Adding a message received callback ( service_name = %s, callback = %p ).",
652
- service_name, callback );
653
-
654
- return add_message_callback( service_name, MESSAGE_TYPE_NOTIFY, callback );
655
- }
656
- bool ( *add_message_received_callback )( const char *service_name, const callback_message_received function ) = _add_message_received_callback;
657
-
658
-
659
- static bool
660
- _add_message_requested_callback( const char *service_name,
661
- void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) {
662
- assert( service_name != NULL );
663
- assert( callback != NULL );
664
-
665
- debug( "Adding a message requested callback ( service_name = %s, callback = %p ).",
666
- service_name, callback );
667
-
668
- return add_message_callback( service_name, MESSAGE_TYPE_REQUEST, callback );
669
- }
670
- bool ( *add_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) = _add_message_requested_callback;
671
-
672
-
673
- static bool
674
- _add_message_replied_callback( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) ) {
675
- assert( service_name != NULL );
676
- assert( callback != NULL );
677
-
678
- debug( "Adding a message replied callback ( service_name = %s, callback = %p ).",
679
- service_name, callback );
680
-
681
- return add_message_callback( service_name, MESSAGE_TYPE_REPLY, callback );
682
- }
683
- bool ( *add_message_replied_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) ) = _add_message_replied_callback;
684
-
685
-
686
- static bool
687
- delete_message_callback( const char *service_name, uint8_t message_type, void ( *callback ) ) {
688
- assert( service_name != NULL );
689
- assert( callback != NULL );
690
-
691
- debug( "Deleting a message callback ( service_name = %s, message_type = %#x, callback = %p ).",
692
- service_name, message_type, callback );
693
-
694
- if ( receive_queues == NULL ) {
695
- debug( "All receive queues are already deleted or not created yet." );
696
- return false;
697
- }
698
-
699
- receive_queue *rq = lookup_hash_entry( receive_queues, service_name );
700
- receive_queue_callback *cb;
701
-
702
- if ( NULL != rq ) {
703
- dlist_element *e;
704
- for ( e = rq->message_callbacks->next; e; e = e->next ) {
705
- cb = e->data;
706
- if ( ( cb->function == callback ) && ( cb->message_type == message_type ) ) {
707
- debug( "Deleting a callback ( message_type = %#x, callback = %p ).", message_type, callback );
708
- if ( rq->in_progress ) {
709
- cb->function = NULL;
710
- cb->message_type = MESSAGE_TYPE_INVALID;
711
- }
712
- else {
713
- xfree( cb );
714
- delete_dlist_element( e );
715
- if ( rq->message_callbacks->next == NULL ) {
716
- debug( "No more callback for message_type = %#x.", message_type );
717
- delete_receive_queue( rq->service_name, rq, NULL );
718
- }
719
- }
720
- return true;
721
- }
722
- }
723
- }
724
-
725
- error( "No registered message callback found." );
726
-
727
- return false;
728
- }
729
-
730
-
731
- static bool
732
- _delete_message_received_callback( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len ) ) {
733
- assert( service_name != NULL );
734
- assert( callback != NULL );
735
-
736
- debug( "Deleting a message received callback ( service_name = %s, callback = %p ).",
737
- service_name, callback );
738
-
739
- return delete_message_callback( service_name, MESSAGE_TYPE_NOTIFY, callback );
740
- }
741
- bool ( *delete_message_received_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len ) ) = _delete_message_received_callback;
742
-
743
-
744
- static bool
745
- _delete_message_requested_callback( const char *service_name,
746
- void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) {
747
- assert( service_name != NULL );
748
- assert( callback != NULL );
749
-
750
- debug( "Deleting a message requested callback ( service_name = %s, callback = %p ).",
751
- service_name, callback );
752
-
753
- return delete_message_callback( service_name, MESSAGE_TYPE_REQUEST, callback );
754
- }
755
- bool ( *delete_message_requested_callback )( const char *service_name, void ( *callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len ) ) = _delete_message_requested_callback;
756
-
757
-
758
- static bool
759
- _delete_message_replied_callback( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) ) {
760
- assert( service_name != NULL );
761
- assert( callback != NULL );
762
-
763
- debug( "Deleting a message replied callback ( service_name = %s, callback = %p ).",
764
- service_name, callback );
765
-
766
- return delete_message_callback( service_name, MESSAGE_TYPE_REPLY, callback );
767
- }
768
- bool ( *delete_message_replied_callback )( const char *service_name, void ( *callback )( uint16_t tag, void *data, size_t len, void *user_data ) ) = _delete_message_replied_callback;
769
-
770
-
771
- static bool
772
- rename_message_callback( const char *old_service_name, const char *new_service_name ) {
773
- assert( old_service_name != NULL );
774
- assert( new_service_name != NULL );
775
- assert( receive_queues != NULL );
776
-
777
- receive_queue *old_rq = lookup_hash_entry( receive_queues, old_service_name );
778
- receive_queue *new_rq = lookup_hash_entry( receive_queues, new_service_name );
779
- dlist_element *element;
780
- receive_queue_callback *cb;
781
-
782
- if ( old_rq == NULL ) {
783
- error( "No receive queue for old service name ( %s ) found.", old_service_name );
784
- return false;
785
- }
786
- else if ( new_rq != NULL ) {
787
- error( "Receive queue for new service name ( %s ) is already created.", new_service_name );
788
- return false;
789
- }
790
-
791
- bool success = true;
792
- for ( element = old_rq->message_callbacks->next; element; element = element->next ) {
793
- cb = element->data;
794
- if ( !add_message_callback( new_service_name, cb->message_type, cb->function ) ) {
795
- success = false;
796
- break;
797
- }
798
- }
799
- if ( success ) {
800
- delete_receive_queue( old_rq->service_name, old_rq, NULL );
801
- }
802
- else if ( ( new_rq = lookup_hash_entry( receive_queues, new_service_name ) ) != NULL ) {
803
- delete_receive_queue( new_rq->service_name, new_rq, NULL );
804
- }
805
-
806
- return success;
807
- }
808
-
809
- static bool
810
- _rename_message_received_callback( const char *old_service_name, const char *new_service_name ) {
811
- assert( old_service_name != NULL );
812
- assert( new_service_name != NULL );
813
- assert( receive_queues != NULL );
814
-
815
- debug( "Renaming a message received callback ( old_service_name = %s, new_service_name = %s ).",
816
- old_service_name, new_service_name );
817
-
818
- return rename_message_callback( old_service_name, new_service_name );
819
- }
820
- bool ( *rename_message_received_callback )( const char *old_service_name, const char *new_service_name ) = _rename_message_received_callback;
821
-
822
-
823
- static bool
824
- _rename_message_requested_callback( const char *old_service_name, const char *new_service_name ) {
825
- assert( old_service_name != NULL );
826
- assert( new_service_name != NULL );
827
- assert( receive_queues != NULL );
828
-
829
- debug( "Renaming a message requested callback ( old_service_name = %s, new_service_name = %s ).",
830
- old_service_name, new_service_name );
831
-
832
- return rename_message_callback( old_service_name, new_service_name );
833
- }
834
- bool ( *rename_message_requested_callback )( const char *old_service_name, const char *new_service_name ) = _rename_message_requested_callback;
835
-
836
-
837
- static size_t
838
- message_buffer_remain_bytes( message_buffer *buf ) {
839
- assert( buf != NULL );
840
-
841
- return buf->size - buf->data_length;
842
- }
843
-
844
-
845
- /**
846
- * connects send_queue to the service
847
- * return value: -1:error, 0:refused (retry), 1:connected
848
- */
849
- static int
850
- send_queue_connect( send_queue *sq ) {
851
- assert( sq != NULL );
852
-
853
- sq->running_timer = false;
854
- if ( ( sq->server_socket = socket( AF_UNIX, SOCK_SEQPACKET, 0 ) ) == -1 ) {
855
- error( "Failed to call socket ( errno = %s [%d] ).", strerror( errno ), errno );
856
- return -1;
857
- }
858
-
859
- sq->socket_buffer_size = 1048576;
860
- int ret = setsockopt( sq->server_socket, SOL_SOCKET, SO_SNDBUF, ( const void * ) &sq->socket_buffer_size, ( socklen_t ) sizeof( sq->socket_buffer_size ) );
861
- if ( ret < 0 ) {
862
- error( "Failed to set SO_SNDBUF to %d ( %s [%d] ).", sq->socket_buffer_size, strerror( errno ), errno );
863
- close( sq->server_socket );
864
- sq->server_socket = -1;
865
- return -1;
866
- }
867
- ret = fcntl( sq->server_socket, F_SETFL, O_NONBLOCK );
868
- if ( ret < 0 ) {
869
- error( "Failed to set O_NONBLOCK ( %s [%d] ).", strerror( errno ), errno );
870
- close( sq->server_socket );
871
- sq->server_socket = -1;
872
- return -1;
873
- }
874
-
875
- if ( connect( sq->server_socket, ( struct sockaddr * ) &sq->server_addr, sizeof( struct sockaddr_un ) ) == -1 ) {
876
- debug( "Connection refused ( service_name = %s, sun_path = %s, fd = %d, errno = %s [%d] ).",
877
- sq->service_name, sq->server_addr.sun_path, sq->server_socket, strerror( errno ), errno );
878
-
879
- send_dump_message( MESSENGER_DUMP_SEND_REFUSED, sq->service_name, NULL, 0 );
880
- close( sq->server_socket );
881
- sq->server_socket = -1;
882
-
883
- return 0;
884
- }
885
-
886
- set_fd_handler( sq->server_socket, on_send_read, sq, on_send_write, sq );
887
- set_readable( sq->server_socket, true );
888
-
889
- debug( "Connection established ( service_name = %s, sun_path = %s, fd = %d ).",
890
- sq->service_name, sq->server_addr.sun_path, sq->server_socket );
891
-
892
- socklen_t optlen = sizeof( sq->socket_buffer_size );
893
- if ( getsockopt( sq->server_socket, SOL_SOCKET, SO_SNDBUF, &sq->socket_buffer_size, &optlen ) == -1 ) {
894
- sq->socket_buffer_size = 0;
895
- }
896
-
897
- send_dump_message( MESSENGER_DUMP_SEND_CONNECTED, sq->service_name, NULL, 0 );
898
-
899
- if ( sq->buffer != NULL && sq->buffer->data_length >= sizeof( message_header ) ) {
900
- set_writable( sq->server_socket, true );
901
- if ( sq->buffer->data_length >= messenger_flush_length &&
902
- sq->buffer->data_length < messenger_flush_limit_length ) {
903
- on_send_write( sq->server_socket, sq );
904
- }
905
- }
906
-
907
- return 1;
908
- }
909
-
910
-
911
- static int send_queue_connect_timer( send_queue *sq );
912
-
913
- static int
914
- send_queue_connect_timeout( send_queue *sq ) {
915
- sq->running_timer = false;
916
- return send_queue_connect_timer( sq );
917
- }
918
-
919
- // Remember to clean up timer if we delete the send_queue.
920
-
921
- static int
922
- send_queue_connect_timer( send_queue *sq ) {
923
- struct itimerspec interval;
924
- if ( sq->server_socket != -1 ) {
925
- return 1;
926
- }
927
- if ( sq->running_timer ) {
928
- sq->running_timer = false;
929
- delete_timer_event( ( timer_callback ) send_queue_connect_timeout, sq );
930
- }
931
-
932
- int ret = send_queue_connect( sq );
933
-
934
- switch ( ret ) {
935
- case -1:
936
- // Print an error, and find a better way of indicating the send
937
- // queue has an error.
938
- sq->reconnect_interval.tv_sec = -1;
939
- sq->reconnect_interval.tv_nsec = 0;
940
- return -1;
941
-
942
- case 0:
943
- // Try again later.
944
- sq->refused_count++;
945
- sq->reconnect_interval.tv_sec = ( 1 << ( sq->refused_count > 4 ? 4 : sq->refused_count - 1 ) );
946
-
947
- interval.it_interval.tv_sec = 0;
948
- interval.it_interval.tv_nsec = 0;
949
- interval.it_value = sq->reconnect_interval;
950
- add_timer_event_callback( &interval, ( void ( * )( void * ) ) send_queue_connect_timeout, ( void * ) sq );
951
- sq->running_timer = true;
952
-
953
- debug( "refused_count = %d, reconnect_interval = %" PRIu64 ".", sq->refused_count, ( int64_t ) sq->reconnect_interval.tv_sec );
954
- return 0;
955
-
956
- case 1:
957
- // Success.
958
- sq->refused_count = 0;
959
- sq->reconnect_interval.tv_sec = 0;
960
- sq->reconnect_interval.tv_nsec = 0;
961
- return 1;
962
-
963
- default:
964
- die( "Got invalid value from send_queue_connect_timer( send_queue* )." );
965
- }
966
-
967
- return -1;
968
- }
969
-
970
-
971
- static int
972
- send_queue_try_connect( send_queue *sq ) {
973
- // TODO: Add a proper check for this.
974
- if ( sq->reconnect_interval.tv_sec != 0 ) {
975
- return 0;
976
- }
977
-
978
- return send_queue_connect_timer( sq );
979
- }
980
-
981
-
982
- /**
983
- * creates send_queue and connects to specified service name.
984
- */
985
- static send_queue *
986
- create_send_queue( const char *service_name ) {
987
- assert( service_name != NULL );
988
-
989
- debug( "Creating a send queue ( service_name = %s ).", service_name );
990
-
991
- send_queue *sq;
992
-
993
- assert( send_queues != NULL );
994
-
995
- sq = lookup_hash_entry( send_queues, service_name );
996
- if ( NULL != sq ) {
997
- warn( "Send queue for %s is already created.", service_name );
998
- return sq;
999
- }
1000
-
1001
- sq = xmalloc( sizeof( send_queue ) );
1002
- memset( sq->service_name, 0, MESSENGER_SERVICE_NAME_LENGTH );
1003
- strncpy( sq->service_name, service_name, MESSENGER_SERVICE_NAME_LENGTH );
1004
-
1005
- memset( &sq->server_addr, 0, sizeof( struct sockaddr_un ) );
1006
- sq->server_addr.sun_family = AF_UNIX;
1007
- sprintf( sq->server_addr.sun_path, "%s/trema.%s.sock", socket_directory, service_name );
1008
- debug( "Set sun_path to %s.", sq->server_addr.sun_path );
1009
-
1010
- sq->server_socket = -1;
1011
- sq->buffer = NULL;
1012
- sq->refused_count = 0;
1013
- sq->reconnect_interval.tv_sec = 0;
1014
- sq->reconnect_interval.tv_nsec = 0;
1015
- sq->running_timer = false;
1016
- sq->overflow = 0;
1017
- sq->overflow_total_length = 0;
1018
- sq->socket_buffer_size = 0;
1019
-
1020
- if ( send_queue_try_connect( sq ) == -1 ) {
1021
- xfree( sq );
1022
- error( "Failed to create a send queue for %s.", service_name );
1023
- return NULL;
1024
- }
1025
-
1026
- sq->buffer = create_message_buffer( messenger_send_queue_length );
1027
-
1028
- insert_hash_entry( send_queues, sq->service_name, sq );
1029
-
1030
- return sq;
1031
- }
1032
-
1033
-
1034
- static bool
1035
- write_message_buffer( message_buffer *buf, const void *data, size_t len ) {
1036
- assert( buf != NULL );
1037
-
1038
- if ( message_buffer_remain_bytes( buf ) < len ) {
1039
- return false;
1040
- }
1041
-
1042
- if ( ( buf->head_offset + buf->data_length + len ) <= buf->size ) {
1043
- memcpy( ( char * ) get_message_buffer_head( buf ) + buf->data_length, data, len );
1044
- }
1045
- else {
1046
- memmove( buf->buffer, ( char * ) get_message_buffer_head( buf ), buf->data_length );
1047
- buf->head_offset = 0;
1048
- memcpy( ( char * ) buf->buffer + buf->data_length, data, len );
1049
- }
1050
- buf->data_length += len;
1051
-
1052
- return true;
1053
- }
1054
-
1055
-
1056
- static bool
1057
- push_message_to_send_queue( const char *service_name, const uint8_t message_type, const uint16_t tag, const void *data, size_t len ) {
1058
- assert( service_name != NULL );
1059
-
1060
- debug( "Pushing a message to send queue ( service_name = %s, message_type = %#x, tag = %#x, data = %p, len = %zu ).",
1061
- service_name, message_type, tag, data, len );
1062
-
1063
- message_header header;
1064
-
1065
- if ( send_queues == NULL ) {
1066
- error( "All send queues are already deleted or not created yet." );
1067
- return false;
1068
- }
1069
-
1070
- send_queue *sq = lookup_hash_entry( send_queues, service_name );
1071
-
1072
- if ( NULL == sq ) {
1073
- sq = create_send_queue( service_name );
1074
- assert( sq != NULL );
1075
- }
1076
-
1077
- header.version = 0;
1078
- header.message_type = message_type;
1079
- header.tag = htons( tag );
1080
- uint32_t length = ( uint32_t ) ( sizeof( message_header ) + len );
1081
- header.message_length = htonl( length );
1082
-
1083
- if ( message_buffer_remain_bytes( sq->buffer ) < length ) {
1084
- if ( sq->overflow == 0 ) {
1085
- warn( "Could not write a message to send queue due to overflow ( service_name = %s, fd = %u, length = %u ).", sq->service_name, sq->server_socket, length );
1086
- }
1087
- ++sq->overflow;
1088
- sq->overflow_total_length += length;
1089
- send_dump_message( MESSENGER_DUMP_SEND_OVERFLOW, sq->service_name, NULL, 0 );
1090
- return false;
1091
- }
1092
- if ( sq->overflow > 1 ) {
1093
- warn( "Could not write a message to send queue due to overflow ( service_name = %s, fd = %u, count = %u, total length = %" PRIu64 " ).", sq->service_name, sq->server_socket, sq->overflow, sq->overflow_total_length );
1094
- }
1095
- sq->overflow = 0;
1096
- sq->overflow_total_length = 0;
1097
-
1098
- write_message_buffer( sq->buffer, &header, sizeof( message_header ) );
1099
- write_message_buffer( sq->buffer, data, len );
1100
-
1101
- if ( sq->server_socket == -1 ) {
1102
- debug( "Tried to send message on closed send queue, connecting..." );
1103
-
1104
- send_queue_try_connect( sq );
1105
- return true;
1106
- }
1107
-
1108
- set_writable( sq->server_socket, true );
1109
- if ( sq->buffer->data_length >= messenger_flush_length &&
1110
- sq->buffer->data_length < messenger_flush_limit_length ) {
1111
- on_send_write( sq->server_socket, sq );
1112
- }
1113
-
1114
- return true;
1115
- }
1116
-
1117
-
1118
- static bool
1119
- _send_message( const char *service_name, const uint16_t tag, const void *data, size_t len ) {
1120
- assert( service_name != NULL );
1121
-
1122
- debug( "Sending a message ( service_name = %s, tag = %#x, data = %p, len = %zu ).",
1123
- service_name, tag, data, len );
1124
-
1125
- return push_message_to_send_queue( service_name, MESSAGE_TYPE_NOTIFY, tag, data, len );
1126
- }
1127
- bool ( *send_message )( const char *service_name, const uint16_t tag, const void *data, size_t len ) = _send_message;
1128
-
1129
-
1130
- static messenger_context *
1131
- insert_context( void *user_data ) {
1132
- messenger_context *context = xmalloc( sizeof( messenger_context ) );
1133
-
1134
- context->transaction_id = ++last_transaction_id;
1135
- context->life_count = 10;
1136
- context->user_data = user_data;
1137
-
1138
- debug( "Inserting a new context ( transaction_id = %#x, life_count = %d, user_data = %p ).",
1139
- context->transaction_id, context->life_count, context->user_data );
1140
-
1141
- messenger_context *old = insert_hash_entry( context_db, &context->transaction_id, context );
1142
- if ( old != NULL ) {
1143
- delete_context( old );
1144
- }
1145
-
1146
- return context;
1147
- }
1148
-
1149
-
1150
- static bool
1151
- _send_request_message( const char *to_service_name, const char *from_service_name, const uint16_t tag, const void *data, size_t len, void *user_data ) {
1152
- assert( to_service_name != NULL );
1153
- assert( from_service_name != NULL );
1154
-
1155
- debug( "Sending a request message ( to_service_name = %s, from_service_name = %s, tag = %#x, data = %p, len = %zu, user_data = %p ).",
1156
- to_service_name, from_service_name, tag, data, len, user_data );
1157
-
1158
- char *request_data, *p;
1159
- size_t from_service_name_len = strlen( from_service_name ) + 1;
1160
- size_t handle_len = sizeof( messenger_context_handle ) + from_service_name_len;
1161
- messenger_context *context;
1162
- messenger_context_handle *handle;
1163
- bool return_value;
1164
-
1165
- context = insert_context( user_data );
1166
-
1167
- request_data = xmalloc( handle_len + len );
1168
- handle = ( messenger_context_handle * ) request_data;
1169
- handle->transaction_id = htonl( context->transaction_id );
1170
- handle->service_name_len = htons( ( uint16_t ) from_service_name_len );
1171
- strcpy( handle->service_name, from_service_name );
1172
- p = request_data + handle_len;
1173
- memcpy( p, data, len );
1174
-
1175
- return_value = push_message_to_send_queue( to_service_name, MESSAGE_TYPE_REQUEST, tag, request_data, handle_len + len );
1176
-
1177
- xfree( request_data );
1178
-
1179
- return return_value;
1180
- }
1181
- bool ( *send_request_message )( const char *to_service_name, const char *from_service_name, const uint16_t tag, const void *data, size_t len, void *user_data ) = _send_request_message;
1182
-
1183
-
1184
- static bool
1185
- _send_reply_message( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t len ) {
1186
- assert( handle != NULL );
1187
-
1188
- debug( "Sending a reply message ( handle = [ transaction_id = %#x, service_name_len = %u, service_name = %s ], "
1189
- "tag = %#x, data = %p, len = %zu ).",
1190
- handle->transaction_id, handle->service_name_len, handle->service_name, tag, data, len );
1191
-
1192
- char *reply_data;
1193
- messenger_context_handle *reply_handle;
1194
- bool return_value;
1195
-
1196
- reply_data = xmalloc( sizeof( messenger_context_handle ) + len );
1197
- reply_handle = ( messenger_context_handle * ) reply_data;
1198
- reply_handle->transaction_id = htonl( handle->transaction_id );
1199
- reply_handle->service_name_len = htons( 0 );
1200
- memcpy( reply_handle->service_name, data, len );
1201
-
1202
- return_value = push_message_to_send_queue( handle->service_name, MESSAGE_TYPE_REPLY, tag, reply_data, sizeof( messenger_context_handle ) + len );
1203
-
1204
- xfree( reply_data );
1205
-
1206
- return return_value;
1207
- }
1208
- bool ( *send_reply_message )( const messenger_context_handle *handle, const uint16_t tag, const void *data, size_t len ) = _send_reply_message;
1209
-
1210
-
1211
- static bool
1212
- _clear_send_queue( const char *service_name ) {
1213
- assert( service_name != NULL );
1214
-
1215
- debug( "Deleting all messages from send queue ( service_name = %s ).", service_name );
1216
-
1217
- if ( send_queues == NULL ) {
1218
- error( "All send queues are already deleted or not created yet." );
1219
- return false;
1220
- }
1221
-
1222
- send_queue *sq = lookup_hash_entry( send_queues, service_name );
1223
-
1224
- if ( NULL == sq ) {
1225
- warn( "Send queue is already deleted or not created yet ( service_name = %s ).", service_name );
1226
- return false;
1227
- }
1228
- if ( NULL == sq->buffer ) {
1229
- error( "Message buffer is already deleted or not created yet ( send_queue = %p, service_name = %s ).",
1230
- sq, service_name );
1231
- return false;
1232
- }
1233
-
1234
- if ( sq->server_socket > -1 ) {
1235
- set_writable( sq->server_socket, false );
1236
- }
1237
-
1238
- sq->buffer->head_offset = 0;
1239
- sq->buffer->data_length = 0;
1240
-
1241
- return true;
1242
- }
1243
- bool ( *clear_send_queue )( const char *service_name ) = _clear_send_queue;
1244
-
1245
-
1246
- static void
1247
- number_of_send_queue( int *connected_count, int *sending_count, int *reconnecting_count, int *closed_count ) {
1248
- assert( connected_count != NULL );
1249
- assert( sending_count != NULL );
1250
- assert( reconnecting_count != NULL );
1251
- assert( closed_count != NULL );
1252
-
1253
- debug( "Checking queue statuses." );
1254
-
1255
- hash_iterator iter;
1256
- hash_entry *e;
1257
-
1258
- *connected_count = 0;
1259
- *sending_count = 0;
1260
- *reconnecting_count = 0;
1261
- *closed_count = 0;
1262
-
1263
- if ( send_queues == NULL ) {
1264
- error( "All send queues are already deleted or not created yet." );
1265
- return;
1266
- }
1267
-
1268
- init_hash_iterator( send_queues, &iter );
1269
- while ( ( e = iterate_hash_next( &iter ) ) != NULL ) {
1270
- send_queue *sq = e->value;
1271
- if ( sq->server_socket != -1 ) {
1272
- if ( sq->buffer->data_length == 0 ) {
1273
- ( *connected_count )++;
1274
- }
1275
- else {
1276
- if ( sq->refused_count > 0 ) {
1277
- ( *reconnecting_count )++;
1278
- }
1279
- else {
1280
- ( *sending_count )++;
1281
- }
1282
- }
1283
- }
1284
- else {
1285
- ( *closed_count )++;
1286
- }
1287
- }
1288
-
1289
- debug( "connected_count = %d, reconnecting_count = %d, sending_count = %d, closed_count = %d.",
1290
- *connected_count, *reconnecting_count, *sending_count, *closed_count );
1291
- }
1292
-
1293
-
1294
- static void
1295
- add_recv_queue_client_fd( receive_queue *rq, int fd ) {
1296
- assert( rq != NULL );
1297
- assert( fd >= 0 );
1298
-
1299
- debug( "Adding a client fd to receive queue ( fd = %d, service_name = %s ).", fd, rq->service_name );
1300
-
1301
- messenger_socket *socket;
1302
-
1303
- socket = xmalloc( sizeof( messenger_socket ) );
1304
- socket->fd = fd;
1305
- insert_after_dlist( rq->client_sockets, socket );
1306
-
1307
- set_fd_handler( fd, on_recv, rq, NULL, NULL );
1308
- set_readable( fd, true );
1309
- }
1310
-
1311
-
1312
- static void
1313
- on_accept( int fd, void *data ) {
1314
- receive_queue *rq = ( receive_queue * ) data;
1315
-
1316
- assert( rq != NULL );
1317
-
1318
- int client_fd;
1319
- struct sockaddr_un addr;
1320
-
1321
- socklen_t addr_len = sizeof( struct sockaddr_un );
1322
-
1323
- if ( ( client_fd = accept( fd, ( struct sockaddr * ) &addr, &addr_len ) ) == -1 ) {
1324
- error( "Failed to accept ( fd = %d, errno = %s [%d] ).", fd, strerror( errno ), errno );
1325
- return;
1326
- }
1327
-
1328
- if ( geteuid() == 0 ) {
1329
- int rmem_size = 1048576;
1330
- int ret = setsockopt( client_fd, SOL_SOCKET, SO_RCVBUFFORCE, ( const void * ) &rmem_size, ( socklen_t ) sizeof( rmem_size ) );
1331
- if ( ret < 0 ) {
1332
- error( "Failed to set SO_RCVBUFFORCE to %d ( %s [%d] ).", rmem_size, strerror( errno ), errno );
1333
- close( client_fd );
1334
- return;
1335
- }
1336
- }
1337
- int ret = fcntl( client_fd, F_SETFL, O_NONBLOCK );
1338
- if ( ret < 0 ) {
1339
- error( "Failed to set O_NONBLOCK ( %s [%d] ).", strerror( errno ), errno );
1340
- close( client_fd );
1341
- return;
1342
- }
1343
-
1344
- add_recv_queue_client_fd( rq, client_fd );
1345
- send_dump_message( MESSENGER_DUMP_RECV_CONNECTED, rq->service_name, NULL, 0 );
1346
- }
1347
-
1348
-
1349
- static int
1350
- del_recv_queue_client_fd( receive_queue *rq, int fd ) {
1351
- assert( rq != NULL );
1352
- assert( fd >= 0 );
1353
-
1354
- messenger_socket *socket;
1355
- dlist_element *element;
1356
-
1357
- debug( "Deleting a client fd from receive queue ( fd = %d, service_name = %s ).", fd, rq->service_name );
1358
-
1359
- for ( element = rq->client_sockets->next; element; element = element->next ) {
1360
- socket = element->data;
1361
- if ( socket->fd == fd ) {
1362
- set_readable( fd, false );
1363
- delete_fd_handler( fd );
1364
-
1365
- debug( "Deleting fd ( %d ).", fd );
1366
- delete_dlist_element( element );
1367
- xfree( socket );
1368
- return 1;
1369
- }
1370
- }
1371
-
1372
- return 0;
1373
- }
1374
-
1375
-
1376
- static void
1377
- truncate_message_buffer( message_buffer *buf, size_t len ) {
1378
- assert( buf != NULL );
1379
-
1380
- if ( len == 0 || buf->data_length == 0 ) {
1381
- return;
1382
- }
1383
-
1384
- if ( len > buf->data_length ) {
1385
- len = buf->data_length;
1386
- }
1387
-
1388
- buf->data_length -= len;
1389
- if ( buf->data_length == 0 ) {
1390
- buf->head_offset = 0;
1391
- }
1392
- else {
1393
- buf->head_offset += len;
1394
- }
1395
- }
1396
-
1397
-
1398
- /**
1399
- * pulls message data from recv_queue.
1400
- * returns 1 if succeeded, otherwise 0.
1401
- */
1402
- static int
1403
- pull_from_recv_queue( receive_queue *rq, uint8_t *message_type, uint16_t *tag, void *data, size_t *len, size_t maxlen ) {
1404
- assert( rq != NULL );
1405
- assert( message_type != NULL );
1406
- assert( tag != NULL );
1407
- assert( data != NULL );
1408
- assert( len != NULL );
1409
-
1410
- debug( "Pulling a message from receive queue ( service_name = %s ).", rq->service_name );
1411
-
1412
- message_header *header;
1413
-
1414
- if ( rq->buffer->data_length < sizeof( message_header ) ) {
1415
- debug( "Queue length is smaller than a message header ( queue length = %zu ).", rq->buffer->data_length );
1416
- return 0;
1417
- }
1418
-
1419
- header = ( message_header * ) get_message_buffer_head( rq->buffer );
1420
-
1421
- uint32_t length = ntohl( header->message_length );
1422
- assert( length != 0 );
1423
- assert( length < messenger_recv_queue_length );
1424
- if ( rq->buffer->data_length < length ) {
1425
- debug( "Queue length is smaller than message length ( queue length = %zu, message length = %u ).",
1426
- rq->buffer->data_length, length );
1427
- return 0;
1428
- }
1429
-
1430
- *message_type = header->message_type;
1431
- *tag = ntohs( header->tag );
1432
- *len = length - sizeof( message_header );
1433
- memcpy( data, header->value, *len > maxlen ? maxlen : *len );
1434
- truncate_message_buffer( rq->buffer, length );
1435
-
1436
- debug( "A message is retrieved from receive queue ( message_type = %#x, tag = %#x, len = %zu, data = %p ).",
1437
- *message_type, *tag, *len, data );
1438
-
1439
- return 1;
1440
- }
1441
-
1442
-
1443
- static messenger_context *
1444
- get_context( uint32_t transaction_id ) {
1445
- debug( "Looking up a context ( transaction_id = %#x ).", transaction_id );
1446
-
1447
- return lookup_hash_entry( context_db, &transaction_id );
1448
- }
1449
-
1450
-
1451
- static void
1452
- call_message_callbacks( receive_queue *rq, const uint8_t message_type, const uint16_t tag, void *data, size_t len ) {
1453
- assert( rq != NULL );
1454
-
1455
- dlist_element *element, *next;
1456
- receive_queue_callback *cb;
1457
-
1458
- debug( "Calling message callbacks ( service_name = %s, message_type = %#x, tag = %#x, data = %p, len = %zu ).",
1459
- rq->service_name, message_type, tag, data, len );
1460
-
1461
- assert( rq->in_progress != true );
1462
- rq->in_progress = true;
1463
- for ( element = rq->message_callbacks->next; element; element = next ) {
1464
- next = element->next;
1465
- cb = element->data;
1466
- if ( cb == NULL || cb->function == NULL || cb->message_type != message_type ) {
1467
- continue;
1468
- }
1469
- switch ( message_type ) {
1470
- case MESSAGE_TYPE_NOTIFY:
1471
- {
1472
- void ( *received_callback )( uint16_t tag, void *data, size_t len );
1473
- received_callback = cb->function;
1474
-
1475
- debug( "Calling a callback ( %p ) for MESSAGE_TYPE_NOTIFY (%#x) ( tag = %#x, data = %p, len = %zu ).",
1476
- cb->function, message_type, tag, data, len );
1477
-
1478
- received_callback( tag, data, len );
1479
- }
1480
- break;
1481
- case MESSAGE_TYPE_REQUEST:
1482
- {
1483
- void ( *requested_callback )( const messenger_context_handle *handle, uint16_t tag, void *data, size_t len );
1484
- messenger_context_handle *handle;
1485
- char *requested_data;
1486
- size_t header_len;
1487
-
1488
- requested_callback = cb->function;
1489
- handle = ( messenger_context_handle * ) data;
1490
- handle->transaction_id = ntohl( handle->transaction_id );
1491
- handle->service_name_len = ntohs( handle->service_name_len );
1492
- header_len = sizeof( messenger_context_handle ) + handle->service_name_len;
1493
- requested_data = ( ( char * ) data ) + header_len;
1494
-
1495
- debug( "Calling a callback ( %p ) for MESSAGE_TYPE_REQUEST (%#x) ( handle = %p, tag = %#x, requested_data = %p, len = %zu ).",
1496
- cb->function, message_type, handle, tag, requested_data, len - header_len );
1497
-
1498
- requested_callback( handle, tag, ( void * ) requested_data, len - header_len );
1499
- }
1500
- break;
1501
- case MESSAGE_TYPE_REPLY:
1502
- {
1503
- debug( "Calling a callback ( %p ) for MESSAGE_TYPE_REPLY (%#x).", cb->function, message_type );
1504
-
1505
- void ( *replied_callback )( uint16_t tag, void *data, size_t len, void *user_data );
1506
- messenger_context_handle *reply_handle;
1507
- messenger_context *context;
1508
-
1509
- replied_callback = cb->function;
1510
- reply_handle = data;
1511
- reply_handle->transaction_id = ntohl( reply_handle->transaction_id );
1512
- reply_handle->service_name_len = ntohs( reply_handle->service_name_len );
1513
-
1514
- context = get_context( reply_handle->transaction_id );
1515
-
1516
- if ( NULL != context ) {
1517
- debug( "tag = %#x, data = %p, len = %zu, user_data = %p.",
1518
- tag, reply_handle->service_name, len - sizeof( messenger_context_handle ), context->user_data );
1519
- replied_callback( tag, reply_handle->service_name, len - sizeof( messenger_context_handle ), context->user_data );
1520
- delete_context( context );
1521
- }
1522
- else {
1523
- warn( "No context found." );
1524
- }
1525
- }
1526
- break;
1527
- default:
1528
- error( "Unknown message type ( %#x ).", message_type );
1529
- assert( 0 );
1530
- }
1531
- }
1532
- for ( element = rq->message_callbacks->next; element; element = next ) {
1533
- next = element->next;
1534
- cb = element->data;
1535
- if ( cb->function == NULL ) {
1536
- xfree( cb );
1537
- delete_dlist_element( element );
1538
- }
1539
- }
1540
- rq->in_progress = false;
1541
- if ( rq->message_callbacks->next == NULL ) {
1542
- debug( "No more callback for message_type = %#x.", message_type );
1543
- delete_receive_queue( rq->service_name, rq, NULL );
1544
- }
1545
- }
1546
-
1547
-
1548
- static void
1549
- on_recv( int fd, void *data ) {
1550
- receive_queue *rq = ( receive_queue * ) data;
1551
-
1552
- assert( rq != NULL );
1553
- assert( fd >= 0 );
1554
-
1555
- debug( "Receiving data from remote ( fd = %d, service_name = %s ).", fd, rq->service_name );
1556
-
1557
- uint8_t buf[ MESSENGER_RECV_BUFFER ];
1558
- ssize_t recv_len;
1559
- size_t buf_len;
1560
- uint8_t message_type;
1561
- uint16_t tag;
1562
-
1563
- while ( ( buf_len = message_buffer_remain_bytes( rq->buffer ) ) > messenger_recv_queue_reserved ) {
1564
- if ( buf_len > sizeof( buf ) ) {
1565
- buf_len = sizeof( buf );
1566
- }
1567
- recv_len = recv( fd, buf, buf_len, 0 );
1568
- if ( recv_len == -1 ) {
1569
- if ( errno != EAGAIN && errno != EWOULDBLOCK ) {
1570
- error( "Failed to recv ( fd = %d, errno = %s [%d] ).", fd, strerror( errno ), errno );
1571
- send_dump_message( MESSENGER_DUMP_RECV_CLOSED, rq->service_name, NULL, 0 );
1572
- del_recv_queue_client_fd( rq, fd );
1573
- close( fd );
1574
- }
1575
- else {
1576
- debug( "Failed to recv ( fd = %d, errno = %s [%d] ).", fd, strerror( errno ), errno );
1577
- }
1578
- break;
1579
- }
1580
- else if ( recv_len == 0 ) {
1581
- debug( "Connection closed ( fd = %d, service_name = %s ).", fd, rq->service_name );
1582
- send_dump_message( MESSENGER_DUMP_RECV_CLOSED, rq->service_name, NULL, 0 );
1583
- del_recv_queue_client_fd( rq, fd );
1584
- close( fd );
1585
- break;
1586
- }
1587
-
1588
- if ( !write_message_buffer( rq->buffer, buf, ( size_t ) recv_len ) ) {
1589
- warn( "Could not write a message to receive queue due to overflow ( service_name = %s, len = %zd ).", rq->service_name, recv_len );
1590
- send_dump_message( MESSENGER_DUMP_RECV_OVERFLOW, rq->service_name, buf, ( uint32_t ) recv_len );
1591
- }
1592
- else {
1593
- debug( "Pushing a message to receive queue ( service_name = %s, len = %zd ).", rq->service_name, recv_len );
1594
- send_dump_message( MESSENGER_DUMP_RECEIVED, rq->service_name, buf, ( uint32_t ) recv_len );
1595
- }
1596
- }
1597
-
1598
- while ( pull_from_recv_queue( rq, &message_type, &tag, buf, &buf_len, sizeof( buf ) ) == 1 ) {
1599
- call_message_callbacks( rq, message_type, tag, buf, buf_len );
1600
- }
1601
- }
1602
-
1603
-
1604
- static uint32_t
1605
- get_send_data( send_queue *sq, size_t offset ) {
1606
- assert( sq != NULL );
1607
-
1608
- uint32_t bucket_size = messenger_bucket_size;
1609
- if ( sq->socket_buffer_size != 0 ) {
1610
- int used;
1611
- if ( ioctl( sq->server_socket, SIOCOUTQ, &used ) == 0 ) {
1612
- if ( used < sq->socket_buffer_size ) {
1613
- bucket_size = ( uint32_t ) ( sq->socket_buffer_size - used ) << 1;
1614
- if ( bucket_size > messenger_bucket_size ) {
1615
- bucket_size = messenger_bucket_size;
1616
- }
1617
- }
1618
- else {
1619
- bucket_size = 1;
1620
- }
1621
- }
1622
- }
1623
-
1624
- uint32_t length = 0;
1625
- message_header *header;
1626
- while ( ( sq->buffer->data_length - offset ) >= sizeof( message_header ) ) {
1627
- header = ( message_header * ) ( ( char * ) get_message_buffer_head( sq->buffer ) + offset );
1628
- uint32_t message_length = ntohl( header->message_length );
1629
- assert( message_length != 0 );
1630
- assert( message_length < messenger_recv_queue_length );
1631
- if ( length + message_length > bucket_size ) {
1632
- if ( length == 0 ) {
1633
- length = message_length;
1634
- }
1635
- break;
1636
- }
1637
- length += message_length;
1638
- offset += message_length;
1639
- }
1640
- return length;
1641
- }
1642
-
1643
-
1644
- static void
1645
- on_send_read( int fd, void *data ) {
1646
- UNUSED( fd );
1647
-
1648
- char buf[ 256 ];
1649
- send_queue *sq = ( send_queue * ) data;
1650
-
1651
- if ( recv( sq->server_socket, buf, sizeof( buf ), 0 ) <= 0 ) {
1652
- send_dump_message( MESSENGER_DUMP_SEND_CLOSED, sq->service_name, NULL, 0 );
1653
-
1654
- set_readable( sq->server_socket, false );
1655
- set_writable( sq->server_socket, false );
1656
- delete_fd_handler( sq->server_socket );
1657
-
1658
- close( sq->server_socket );
1659
- sq->server_socket = -1;
1660
-
1661
- // Tries to reconnecting immediately, else adds a reconnect timer.
1662
- if ( sq->buffer->data_length > 0 ) {
1663
- send_queue_try_connect( sq );
1664
- }
1665
- else {
1666
- delete_send_queue( sq );
1667
- }
1668
- }
1669
- }
1670
-
1671
-
1672
- static void
1673
- on_send_write( int fd, void *data ) {
1674
- send_queue *sq = ( send_queue * ) data;
1675
-
1676
- assert( sq != NULL );
1677
- assert( fd >= 0 );
1678
-
1679
- debug( "Sending data to remote ( fd = %d, service_name = %s, buffer = %p, data_length = %zu ).",
1680
- fd, sq->service_name, get_message_buffer_head( sq->buffer ), sq->buffer->data_length );
1681
-
1682
- void *send_data;
1683
- size_t send_len;
1684
- ssize_t sent_len;
1685
- size_t sent_total = 0;
1686
-
1687
- while ( ( send_len = get_send_data( sq, sent_total ) ) > 0 ) {
1688
- send_data = ( ( char * ) get_message_buffer_head( sq->buffer ) + sent_total );
1689
- sent_len = send( fd, send_data, send_len, MSG_DONTWAIT );
1690
- if ( sent_len == -1 ) {
1691
- int err = errno;
1692
- if ( err != EAGAIN && err != EWOULDBLOCK ) {
1693
- if ( err == EPIPE ) {
1694
- debug( "Failed to send ( service_name = %s, fd = %d, errno = %s [%d] ).",
1695
- sq->service_name, fd, strerror( err ), err );
1696
- }
1697
- else {
1698
- error( "Failed to send ( service_name = %s, fd = %d, errno = %s [%d] ).",
1699
- sq->service_name, fd, strerror( err ), err );
1700
- }
1701
- send_dump_message( MESSENGER_DUMP_SEND_CLOSED, sq->service_name, NULL, 0 );
1702
-
1703
- set_readable( sq->server_socket, false );
1704
- set_writable( sq->server_socket, false );
1705
- delete_fd_handler( sq->server_socket );
1706
-
1707
- close( sq->server_socket );
1708
- sq->server_socket = -1;
1709
- sq->refused_count = 0;
1710
-
1711
- // Tries to reconnecting immediately, else adds a reconnect timer.
1712
- send_queue_try_connect( sq );
1713
- }
1714
- truncate_message_buffer( sq->buffer, sent_total );
1715
- if ( err == EMSGSIZE || err == ENOBUFS || err == ENOMEM ) {
1716
- warn( "Dropping %zu bytes data in send queue ( service_name = %s ).", sq->buffer->data_length, sq->service_name );
1717
- truncate_message_buffer( sq->buffer, sq->buffer->data_length );
1718
- }
1719
- return;
1720
- }
1721
- assert( sent_len != 0 );
1722
- assert( send_len == ( size_t ) sent_len );
1723
- send_dump_message( MESSENGER_DUMP_SENT, sq->service_name, send_data, ( uint32_t ) sent_len );
1724
- sent_total += ( size_t ) sent_len;
1725
- }
1726
-
1727
- truncate_message_buffer( sq->buffer, sent_total );
1728
- if ( sq->buffer->data_length == 0 ) {
1729
- set_writable( sq->server_socket, false );
1730
- }
1731
- }
1732
-
1733
-
1734
- int
1735
- flush_messenger() {
1736
- int connected_count, sending_count, reconnecting_count, closed_count;
1737
-
1738
- debug( "Flushing send queues." );
1739
-
1740
- while ( true ) {
1741
- number_of_send_queue( &connected_count, &sending_count, &reconnecting_count, &closed_count );
1742
- if ( sending_count == 0 ) {
1743
- return reconnecting_count;
1744
- }
1745
- run_event_handler_once( 100000 );
1746
- }
1747
- }
1748
-
1749
-
1750
- bool
1751
- start_messenger() {
1752
- debug( "Starting messenger." );
1753
-
1754
- add_periodic_event_callback( 10, age_context_db, NULL );
1755
-
1756
- return true;
1757
- }
1758
-
1759
-
1760
- bool
1761
- stop_messenger() {
1762
- debug( "Terminating messenger." );
1763
-
1764
- return true;
1765
- }
1766
-
1767
-
1768
- void
1769
- start_messenger_dump( const char *dump_app_name, const char *dump_service_name ) {
1770
- assert( dump_app_name != NULL );
1771
- assert( dump_service_name != NULL );
1772
-
1773
- debug( "Starting a message dumper ( dump_app_name = %s, dump_service_name = %s ).",
1774
- dump_app_name, dump_service_name );
1775
-
1776
- if ( messenger_dump_enabled() ) {
1777
- stop_messenger_dump();
1778
- }
1779
- _dump_service_name = xstrdup( dump_service_name );
1780
- _dump_app_name = xstrdup( dump_app_name );
1781
- }
1782
-
1783
-
1784
- void
1785
- stop_messenger_dump( void ) {
1786
- assert( _dump_service_name != NULL );
1787
- assert( _dump_app_name != NULL );
1788
-
1789
- debug( "Terminating a message dumper ( dump_app_name = %s, dump_service_name = %s ).",
1790
- _dump_app_name, _dump_service_name );
1791
-
1792
- assert( send_queues != NULL );
1793
- send_queue *sq = lookup_hash_entry( send_queues, _dump_service_name );
1794
- if ( sq != NULL ) {
1795
- delete_send_queue( sq );
1796
- }
1797
-
1798
- xfree( _dump_service_name );
1799
- _dump_service_name = NULL;
1800
-
1801
- xfree( _dump_app_name );
1802
- _dump_app_name = NULL;
1803
- }
1804
-
1805
-
1806
- bool
1807
- messenger_dump_enabled( void ) {
1808
- if ( _dump_service_name != NULL && _dump_app_name != NULL ) {
1809
- return true;
1810
- }
1811
-
1812
- return false;
1813
- }
1814
-
1815
-
1816
- /*
1817
- * Local variables:
1818
- * c-basic-offset: 2
1819
- * indent-tabs-mode: nil
1820
- * End:
1821
- */