trema 0.4.7 → 0.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +33 -54
  3. data/.hound.yml +3 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +17 -1
  6. data/.travis.yml +14 -18
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +1 -26
  9. data/README.md +25 -241
  10. data/Rakefile +4 -1056
  11. data/bin/.gitignore +3 -0
  12. data/bin/trema +163 -237
  13. data/features/cleanup_on_failure.feature +118 -0
  14. data/features/logging.feature +73 -0
  15. data/features/open_flow13.feature +21 -0
  16. data/features/step_definitions/.gitignore +35 -0
  17. data/features/step_definitions/.rubocop.yml +5 -0
  18. data/features/step_definitions/.travis.yml +19 -0
  19. data/features/step_definitions/Gemfile +9 -0
  20. data/features/step_definitions/Guardfile +4 -0
  21. data/features/step_definitions/LICENSE +675 -0
  22. data/features/step_definitions/README.md +7 -0
  23. data/features/step_definitions/Rakefile +10 -0
  24. data/features/step_definitions/show_stats_steps.rb +56 -0
  25. data/features/step_definitions/virtual_link_steps.rb +8 -0
  26. data/features/support/env.rb +0 -73
  27. data/features/support/hooks.rb +6 -50
  28. data/features/trema_delete_link.feature +30 -0
  29. data/features/trema_killall.feature +56 -0
  30. data/features/trema_run.feature +47 -0
  31. data/features/trema_start.feature +73 -0
  32. data/features/trema_stop.feature +50 -0
  33. data/lib/trema.rb +4 -0
  34. data/lib/trema/command.rb +184 -0
  35. data/lib/trema/controller.rb +289 -0
  36. data/lib/trema/dirs.rb +14 -0
  37. data/lib/trema/drb.rb +32 -0
  38. data/lib/trema/logger.rb +63 -0
  39. data/lib/trema/monkey_patch/integer.rb +8 -0
  40. data/lib/trema/monkey_patch/integer/base_conversions.rb +12 -0
  41. data/lib/trema/monkey_patch/integer/durations.rb +12 -0
  42. data/lib/trema/switch.rb +83 -0
  43. data/lib/trema/version.rb +5 -0
  44. data/spec/spec_helper.rb +9 -178
  45. data/spec/trema/controller_spec.rb +4 -53
  46. data/tasks/.gitignore +34 -0
  47. data/tasks/LICENSE +675 -0
  48. data/tasks/README.md +6 -0
  49. data/tasks/cucumber.rake +14 -0
  50. data/tasks/flay.rake +15 -0
  51. data/tasks/flog.rake +25 -0
  52. data/tasks/gem.rake +15 -0
  53. data/tasks/reek.rake +11 -0
  54. data/tasks/relish.rake +8 -0
  55. data/tasks/rspec.rake +8 -0
  56. data/tasks/rubocop.rake +2 -16
  57. data/tasks/yard.rake +11 -0
  58. data/trema.gemspec +24 -23
  59. metadata +180 -720
  60. data/.yardopts +0 -4
  61. data/Doxyfile +0 -1679
  62. data/Guardfile +0 -14
  63. data/bin/quality +0 -31
  64. data/bin/trema-config +0 -59
  65. data/build.rb +0 -32
  66. data/cruise.rb +0 -409
  67. data/features/.nav +0 -50
  68. data/features/README.md +0 -7
  69. data/features/core/get_pid_by_trema_name.feature +0 -137
  70. data/features/core/packetin_filter.feature +0 -55
  71. data/features/core/switch_manager.feature +0 -41
  72. data/features/core/trema-config.feature +0 -55
  73. data/features/dsl/switch_port_specifier.feature +0 -15
  74. data/features/examples/dumper.feature +0 -35
  75. data/features/examples/hello_trema.feature +0 -23
  76. data/features/examples/learning_switch.feature +0 -37
  77. data/features/examples/list_switches.feature +0 -24
  78. data/features/examples/message.set_config.feature +0 -27
  79. data/features/examples/message.vendor-action.feature +0 -25
  80. data/features/examples/message.vendor-stats-request.feature +0 -20
  81. data/features/examples/multi_learning_switch.feature +0 -107
  82. data/features/examples/openflow_message.echo.feature +0 -59
  83. data/features/examples/openflow_message.features_request.feature +0 -35
  84. data/features/examples/openflow_message.hello.feature +0 -59
  85. data/features/examples/packet_in.feature +0 -33
  86. data/features/examples/packetin_filter_config.feature +0 -95
  87. data/features/examples/patch_panel.feature +0 -29
  88. data/features/examples/repeater_hub.feature +0 -52
  89. data/features/examples/switch_info.feature +0 -51
  90. data/features/examples/switch_monitor.feature +0 -35
  91. data/features/examples/transparent_firewall.feature +0 -73
  92. data/features/handlers/switch_ready.feature +0 -40
  93. data/features/step_definitions/misc_steps.rb +0 -85
  94. data/features/step_definitions/send_packets_steps.rb +0 -33
  95. data/features/step_definitions/stats_steps.rb +0 -39
  96. data/features/switch_event/C-add_forward_entry.feature +0 -114
  97. data/features/switch_event/C-delete_forward_entry.feature +0 -85
  98. data/features/switch_event/C-dump_forward_entries.feature +0 -72
  99. data/features/switch_event/C-set_forward_entries.feature +0 -77
  100. data/features/switch_event/README.md +0 -40
  101. data/features/switch_event/add_forward_entry.feature +0 -160
  102. data/features/switch_event/delete_forward_entry.feature +0 -160
  103. data/features/switch_event/dump_forward_entries.feature +0 -103
  104. data/features/switch_event/set_forward_entries.feature +0 -102
  105. data/features/trema_commands/README.md +0 -8
  106. data/features/trema_commands/dump_flows.feature +0 -41
  107. data/features/trema_commands/help.feature +0 -27
  108. data/features/trema_commands/help_option.feature +0 -20
  109. data/features/trema_commands/kill.feature +0 -56
  110. data/features/trema_commands/killall.feature +0 -32
  111. data/features/trema_commands/port_down.feature +0 -71
  112. data/features/trema_commands/port_up.feature +0 -75
  113. data/features/trema_commands/reset_stats.feature +0 -56
  114. data/features/trema_commands/run.feature +0 -56
  115. data/features/trema_commands/send_packets.feature +0 -46
  116. data/features/trema_commands/show_stats.feature +0 -66
  117. data/features/trema_commands/up.feature +0 -34
  118. data/features/trema_commands/version.feature +0 -10
  119. data/features/trema_commands/version_option.feature +0 -8
  120. data/rubocop-todo.yml +0 -159
  121. data/ruby/.gitignore +0 -4
  122. data/ruby/blocker.rb +0 -74
  123. data/ruby/extconf.rb +0 -80
  124. data/ruby/sub-process.rb +0 -289
  125. data/ruby/trema/action-common.c +0 -46
  126. data/ruby/trema/action-common.h +0 -38
  127. data/ruby/trema/action.rb +0 -33
  128. data/ruby/trema/aggregate-stats-reply.rb +0 -68
  129. data/ruby/trema/app.rb +0 -114
  130. data/ruby/trema/barrier-reply.c +0 -98
  131. data/ruby/trema/barrier-reply.h +0 -44
  132. data/ruby/trema/barrier-request.c +0 -135
  133. data/ruby/trema/barrier-request.h +0 -42
  134. data/ruby/trema/cli.rb +0 -267
  135. data/ruby/trema/command.rb +0 -41
  136. data/ruby/trema/command/dump_flows.rb +0 -43
  137. data/ruby/trema/command/kill.rb +0 -75
  138. data/ruby/trema/command/killall.rb +0 -38
  139. data/ruby/trema/command/netns.rb +0 -38
  140. data/ruby/trema/command/port_down.rb +0 -43
  141. data/ruby/trema/command/port_up.rb +0 -43
  142. data/ruby/trema/command/reset_stats.rb +0 -41
  143. data/ruby/trema/command/ruby.rb +0 -38
  144. data/ruby/trema/command/run.rb +0 -110
  145. data/ruby/trema/command/send_packets.rb +0 -46
  146. data/ruby/trema/command/shell.rb +0 -57
  147. data/ruby/trema/command/show_stats.rb +0 -65
  148. data/ruby/trema/command/up.rb +0 -44
  149. data/ruby/trema/command/version.rb +0 -35
  150. data/ruby/trema/compat.h +0 -36
  151. data/ruby/trema/controller.c +0 -691
  152. data/ruby/trema/controller.h +0 -42
  153. data/ruby/trema/controller.rb +0 -255
  154. data/ruby/trema/custom-switch.rb +0 -56
  155. data/ruby/trema/daemon.rb +0 -184
  156. data/ruby/trema/default-logger.c +0 -161
  157. data/ruby/trema/default-logger.h +0 -42
  158. data/ruby/trema/default-logger.rb +0 -29
  159. data/ruby/trema/default_openflow_channel_port.rb +0 -26
  160. data/ruby/trema/desc-stats-reply.rb +0 -75
  161. data/ruby/trema/dsl.rb +0 -32
  162. data/ruby/trema/dsl/configuration.rb +0 -145
  163. data/ruby/trema/dsl/context.rb +0 -69
  164. data/ruby/trema/dsl/custom-switch.rb +0 -44
  165. data/ruby/trema/dsl/link.rb +0 -39
  166. data/ruby/trema/dsl/netns.rb +0 -78
  167. data/ruby/trema/dsl/parser.rb +0 -70
  168. data/ruby/trema/dsl/rswitch.rb +0 -47
  169. data/ruby/trema/dsl/run.rb +0 -47
  170. data/ruby/trema/dsl/runner.rb +0 -178
  171. data/ruby/trema/dsl/stanza.rb +0 -51
  172. data/ruby/trema/dsl/switch.rb +0 -76
  173. data/ruby/trema/dsl/syntax-error.rb +0 -31
  174. data/ruby/trema/dsl/syntax.rb +0 -128
  175. data/ruby/trema/dsl/vhost.rb +0 -106
  176. data/ruby/trema/dsl/vswitch.rb +0 -45
  177. data/ruby/trema/echo-reply.c +0 -122
  178. data/ruby/trema/echo-reply.h +0 -40
  179. data/ruby/trema/echo-request.c +0 -117
  180. data/ruby/trema/echo-request.h +0 -40
  181. data/ruby/trema/echo.c +0 -99
  182. data/ruby/trema/echo.h +0 -39
  183. data/ruby/trema/enqueue.rb +0 -87
  184. data/ruby/trema/error.c +0 -262
  185. data/ruby/trema/error.h +0 -42
  186. data/ruby/trema/exact-match.rb +0 -34
  187. data/ruby/trema/executables.rb +0 -99
  188. data/ruby/trema/features-reply.c +0 -330
  189. data/ruby/trema/features-reply.h +0 -54
  190. data/ruby/trema/features-request.c +0 -134
  191. data/ruby/trema/features-request.h +0 -42
  192. data/ruby/trema/flow-mod.c +0 -150
  193. data/ruby/trema/flow-mod.h +0 -42
  194. data/ruby/trema/flow-removed.c +0 -280
  195. data/ruby/trema/flow-removed.h +0 -44
  196. data/ruby/trema/flow-stats-reply.rb +0 -107
  197. data/ruby/trema/flow.rb +0 -65
  198. data/ruby/trema/get-config-reply.c +0 -158
  199. data/ruby/trema/get-config-reply.h +0 -50
  200. data/ruby/trema/get-config-request.c +0 -136
  201. data/ruby/trema/get-config-request.h +0 -42
  202. data/ruby/trema/hardware-switch.rb +0 -86
  203. data/ruby/trema/hello.c +0 -133
  204. data/ruby/trema/hello.h +0 -42
  205. data/ruby/trema/host.rb +0 -263
  206. data/ruby/trema/link.rb +0 -177
  207. data/ruby/trema/list-switches-reply.c +0 -44
  208. data/ruby/trema/list-switches-reply.h +0 -38
  209. data/ruby/trema/mac.rb +0 -29
  210. data/ruby/trema/match.c +0 -621
  211. data/ruby/trema/match.h +0 -34
  212. data/ruby/trema/monkey-patch/integer.rb +0 -35
  213. data/ruby/trema/monkey-patch/integer/base-conversions.rb +0 -34
  214. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -49
  215. data/ruby/trema/monkey-patch/integer/validators.rb +0 -36
  216. data/ruby/trema/monkey-patch/module.rb +0 -33
  217. data/ruby/trema/monkey-patch/module/class-method.rb +0 -38
  218. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -39
  219. data/ruby/trema/monkey-patch/string.rb +0 -31
  220. data/ruby/trema/monkey-patch/string/inflectors.rb +0 -52
  221. data/ruby/trema/netns.rb +0 -127
  222. data/ruby/trema/network-component.rb +0 -151
  223. data/ruby/trema/ofctl.rb +0 -70
  224. data/ruby/trema/open-vswitch.rb +0 -160
  225. data/ruby/trema/openflow-error.c +0 -193
  226. data/ruby/trema/openflow-error.h +0 -51
  227. data/ruby/trema/openflow-switch.rb +0 -35
  228. data/ruby/trema/ordered-hash.rb +0 -75
  229. data/ruby/trema/packet-in.c +0 -1365
  230. data/ruby/trema/packet-in.h +0 -44
  231. data/ruby/trema/packet-queue.rb +0 -181
  232. data/ruby/trema/packetin-filter.rb +0 -124
  233. data/ruby/trema/path.rb +0 -85
  234. data/ruby/trema/phost.rb +0 -76
  235. data/ruby/trema/port-mod.c +0 -232
  236. data/ruby/trema/port-mod.h +0 -34
  237. data/ruby/trema/port-stats-reply.rb +0 -109
  238. data/ruby/trema/port-status-add.rb +0 -60
  239. data/ruby/trema/port-status-delete.rb +0 -60
  240. data/ruby/trema/port-status-modify.rb +0 -60
  241. data/ruby/trema/port-status.c +0 -192
  242. data/ruby/trema/port-status.h +0 -41
  243. data/ruby/trema/port.c +0 -398
  244. data/ruby/trema/port.h +0 -45
  245. data/ruby/trema/process.rb +0 -103
  246. data/ruby/trema/queue-get-config-reply.c +0 -205
  247. data/ruby/trema/queue-get-config-reply.h +0 -45
  248. data/ruby/trema/queue-get-config-request.c +0 -141
  249. data/ruby/trema/queue-get-config-request.h +0 -42
  250. data/ruby/trema/queue-stats-reply.rb +0 -76
  251. data/ruby/trema/ruby-switch.rb +0 -62
  252. data/ruby/trema/send-out-port.rb +0 -113
  253. data/ruby/trema/set-config.c +0 -174
  254. data/ruby/trema/set-config.h +0 -42
  255. data/ruby/trema/set-eth-addr.rb +0 -54
  256. data/ruby/trema/set-eth-dst-addr.rb +0 -52
  257. data/ruby/trema/set-eth-src-addr.rb +0 -53
  258. data/ruby/trema/set-ip-addr.rb +0 -54
  259. data/ruby/trema/set-ip-dst-addr.rb +0 -53
  260. data/ruby/trema/set-ip-src-addr.rb +0 -52
  261. data/ruby/trema/set-ip-tos.rb +0 -64
  262. data/ruby/trema/set-transport-dst-port.rb +0 -53
  263. data/ruby/trema/set-transport-port.rb +0 -53
  264. data/ruby/trema/set-transport-src-port.rb +0 -54
  265. data/ruby/trema/set-vlan-priority.rb +0 -66
  266. data/ruby/trema/set-vlan-vid.rb +0 -65
  267. data/ruby/trema/shell.rb +0 -37
  268. data/ruby/trema/shell/down.rb +0 -37
  269. data/ruby/trema/shell/killall.rb +0 -38
  270. data/ruby/trema/shell/link.rb +0 -59
  271. data/ruby/trema/shell/reset_stats.rb +0 -49
  272. data/ruby/trema/shell/run.rb +0 -67
  273. data/ruby/trema/shell/send_packets.rb +0 -40
  274. data/ruby/trema/shell/show_stats.rb +0 -47
  275. data/ruby/trema/shell/up.rb +0 -41
  276. data/ruby/trema/shell/vhost.rb +0 -42
  277. data/ruby/trema/shell/vswitch.rb +0 -47
  278. data/ruby/trema/stats-helper.rb +0 -63
  279. data/ruby/trema/stats-reply.c +0 -540
  280. data/ruby/trema/stats-reply.h +0 -51
  281. data/ruby/trema/stats-request.c +0 -715
  282. data/ruby/trema/stats-request.h +0 -40
  283. data/ruby/trema/strip-vlan-header.rb +0 -41
  284. data/ruby/trema/switch-daemon.rb +0 -90
  285. data/ruby/trema/switch-disconnected.c +0 -38
  286. data/ruby/trema/switch-disconnected.h +0 -36
  287. data/ruby/trema/switch-event.c +0 -648
  288. data/ruby/trema/switch-event.h +0 -27
  289. data/ruby/trema/switch-manager.rb +0 -119
  290. data/ruby/trema/switch.c +0 -197
  291. data/ruby/trema/switch.h +0 -40
  292. data/ruby/trema/switch.rb +0 -56
  293. data/ruby/trema/table-stats-reply.rb +0 -85
  294. data/ruby/trema/timers.rb +0 -95
  295. data/ruby/trema/trema-ruby-utils.c +0 -66
  296. data/ruby/trema/trema-ruby-utils.h +0 -42
  297. data/ruby/trema/trema.c +0 -126
  298. data/ruby/trema/tremashark.rb +0 -46
  299. data/ruby/trema/util.rb +0 -116
  300. data/ruby/trema/vendor-action.rb +0 -82
  301. data/ruby/trema/vendor-stats-reply.rb +0 -64
  302. data/ruby/trema/vendor.c +0 -230
  303. data/ruby/trema/vendor.h +0 -48
  304. data/ruby/trema/version.rb +0 -28
  305. data/spec/support/action.rb +0 -49
  306. data/spec/support/mandatory-option.rb +0 -53
  307. data/spec/support/matchers/constant.rb +0 -25
  308. data/spec/support/openflow-message.rb +0 -173
  309. data/spec/support/port-status.rb +0 -35
  310. data/spec/trema/app_spec.rb +0 -88
  311. data/spec/trema/barrier-reply_spec.rb +0 -43
  312. data/spec/trema/barrier-request_spec.rb +0 -92
  313. data/spec/trema/cli_spec.rb +0 -156
  314. data/spec/trema/default-logger_spec.rb +0 -46
  315. data/spec/trema/dsl/configuration_spec.rb +0 -120
  316. data/spec/trema/dsl/link_spec.rb +0 -50
  317. data/spec/trema/dsl/run_spec.rb +0 -72
  318. data/spec/trema/dsl/runner_spec.rb +0 -247
  319. data/spec/trema/dsl/switch_spec.rb +0 -69
  320. data/spec/trema/dsl/syntax_spec.rb +0 -110
  321. data/spec/trema/dsl/vhost_spec.rb +0 -144
  322. data/spec/trema/dsl/vswitch_spec.rb +0 -80
  323. data/spec/trema/echo-reply_spec.rb +0 -84
  324. data/spec/trema/echo-request_spec.rb +0 -128
  325. data/spec/trema/enqueue_spec.rb +0 -76
  326. data/spec/trema/error_spec.rb +0 -81
  327. data/spec/trema/executables_spec.rb +0 -54
  328. data/spec/trema/features-reply_spec.rb +0 -91
  329. data/spec/trema/features-request_spec.rb +0 -93
  330. data/spec/trema/flow-mod_spec.rb +0 -99
  331. data/spec/trema/flow-removed_spec.rb +0 -144
  332. data/spec/trema/get-config-reply_spec.rb +0 -43
  333. data/spec/trema/get-config-request_spec.rb +0 -92
  334. data/spec/trema/hardware-switch_spec.rb +0 -54
  335. data/spec/trema/hello_spec.rb +0 -63
  336. data/spec/trema/host_spec.rb +0 -191
  337. data/spec/trema/link_spec.rb +0 -62
  338. data/spec/trema/list-switches-reply_spec.rb +0 -46
  339. data/spec/trema/match_spec.rb +0 -111
  340. data/spec/trema/open-vswitch_spec.rb +0 -121
  341. data/spec/trema/openflow-error_spec.rb +0 -141
  342. data/spec/trema/packet-in_spec.rb +0 -717
  343. data/spec/trema/packet-out_spec.rb +0 -125
  344. data/spec/trema/packetin-filter_spec.rb +0 -39
  345. data/spec/trema/port-mod_spec.rb +0 -98
  346. data/spec/trema/port-status-add_spec.rb +0 -32
  347. data/spec/trema/port-status-delete_spec.rb +0 -32
  348. data/spec/trema/port-status-modify_spec.rb +0 -71
  349. data/spec/trema/port-status_spec.rb +0 -38
  350. data/spec/trema/port_spec.rb +0 -59
  351. data/spec/trema/process_spec.rb +0 -69
  352. data/spec/trema/queue-get-config-reply_spec.rb +0 -65
  353. data/spec/trema/queue-get-config-request_spec.rb +0 -67
  354. data/spec/trema/send-out-port_spec.rb +0 -106
  355. data/spec/trema/set-config_spec.rb +0 -78
  356. data/spec/trema/set-eth-addr_spec.rb +0 -62
  357. data/spec/trema/set-ip-addr_spec.rb +0 -81
  358. data/spec/trema/set-ip-tos_spec.rb +0 -70
  359. data/spec/trema/set-transport-dst-port_spec.rb +0 -65
  360. data/spec/trema/set-transport-src-port_spec.rb +0 -65
  361. data/spec/trema/set-vlan-priority_spec.rb +0 -65
  362. data/spec/trema/set-vlan-vid_spec.rb +0 -65
  363. data/spec/trema/shell/vhost_spec.rb +0 -58
  364. data/spec/trema/shell/vswitch_spec.rb +0 -87
  365. data/spec/trema/stats-reply_spec.rb +0 -363
  366. data/spec/trema/stats-request_spec.rb +0 -166
  367. data/spec/trema/strip-vlan-header_spec.rb +0 -44
  368. data/spec/trema/switch-daemon_spec.rb +0 -81
  369. data/spec/trema/switch-disconnected_spec.rb +0 -56
  370. data/spec/trema/switch-manager_spec.rb +0 -41
  371. data/spec/trema/tremashark_spec.rb +0 -39
  372. data/spec/trema/util_spec.rb +0 -88
  373. data/spec/trema/vendor-action_spec.rb +0 -75
  374. data/spec/trema/vendor_spec.rb +0 -76
  375. data/spec/trema_spec.rb +0 -94
  376. data/src/examples/cbench_switch/README +0 -21
  377. data/src/examples/cbench_switch/cbench-switch.rb +0 -38
  378. data/src/examples/cbench_switch/cbench_switch.c +0 -66
  379. data/src/examples/dumper/dumper.c +0 -362
  380. data/src/examples/dumper/dumper.conf +0 -7
  381. data/src/examples/dumper/dumper.rb +0 -195
  382. data/src/examples/hello_trema/.gitignore +0 -2
  383. data/src/examples/hello_trema/README.md +0 -2
  384. data/src/examples/hello_trema/hello-trema.rb +0 -30
  385. data/src/examples/hello_trema/hello_trema.c +0 -48
  386. data/src/examples/hello_trema/sample.conf +0 -1
  387. data/src/examples/learning_switch/README +0 -15
  388. data/src/examples/learning_switch/fdb.rb +0 -110
  389. data/src/examples/learning_switch/learning-switch.rb +0 -90
  390. data/src/examples/learning_switch/learning_switch.c +0 -217
  391. data/src/examples/learning_switch/learning_switch.conf +0 -18
  392. data/src/examples/list_switches/README +0 -19
  393. data/src/examples/list_switches/list-switches.rb +0 -43
  394. data/src/examples/list_switches/list_switches.c +0 -79
  395. data/src/examples/list_switches/list_switches.conf +0 -15
  396. data/src/examples/match_compare/match-compare.conf +0 -30
  397. data/src/examples/match_compare/match-compare.rb +0 -97
  398. data/src/examples/multi_learning_switch/README +0 -14
  399. data/src/examples/multi_learning_switch/multi-learning-switch.rb +0 -94
  400. data/src/examples/multi_learning_switch/multi_learning_switch.c +0 -294
  401. data/src/examples/multi_learning_switch/multi_learning_switch.conf +0 -17
  402. data/src/examples/openflow_message/README +0 -11
  403. data/src/examples/openflow_message/echo.c +0 -80
  404. data/src/examples/openflow_message/echo.rb +0 -56
  405. data/src/examples/openflow_message/example.rb +0 -60
  406. data/src/examples/openflow_message/features-request.rb +0 -96
  407. data/src/examples/openflow_message/features_request.c +0 -167
  408. data/src/examples/openflow_message/hello.c +0 -68
  409. data/src/examples/openflow_message/hello.rb +0 -43
  410. data/src/examples/openflow_message/set-config.rb +0 -57
  411. data/src/examples/openflow_message/set_config.c +0 -68
  412. data/src/examples/openflow_message/vendor-action.rb +0 -43
  413. data/src/examples/openflow_message/vendor-stats-request.rb +0 -66
  414. data/src/examples/openflow_message/vendor_action.c +0 -103
  415. data/src/examples/openflow_switch/echo_switch.c +0 -89
  416. data/src/examples/openflow_switch/hello_switch.c +0 -85
  417. data/src/examples/packet_in/README +0 -15
  418. data/src/examples/packet_in/packet-in.rb +0 -37
  419. data/src/examples/packet_in/packet_in.c +0 -53
  420. data/src/examples/packet_in/packet_in.conf +0 -15
  421. data/src/examples/packetin_filter_config/README +0 -12
  422. data/src/examples/packetin_filter_config/add_filter.c +0 -71
  423. data/src/examples/packetin_filter_config/delete_filter.c +0 -63
  424. data/src/examples/packetin_filter_config/delete_filter_strict.c +0 -73
  425. data/src/examples/packetin_filter_config/dump_filter.c +0 -63
  426. data/src/examples/packetin_filter_config/dump_filter_strict.c +0 -73
  427. data/src/examples/packetin_filter_config/packetin_filter_config.c +0 -132
  428. data/src/examples/packetin_filter_config/packetin_filter_config.conf +0 -7
  429. data/src/examples/packetin_filter_config/utils.c +0 -100
  430. data/src/examples/packetin_filter_config/utils.h +0 -40
  431. data/src/examples/patch_panel/network.conf +0 -14
  432. data/src/examples/patch_panel/patch-panel.conf +0 -1
  433. data/src/examples/patch_panel/patch-panel.rb +0 -59
  434. data/src/examples/repeater_hub/README +0 -8
  435. data/src/examples/repeater_hub/repeater-hub.rb +0 -41
  436. data/src/examples/repeater_hub/repeater-hub_spec.rb +0 -154
  437. data/src/examples/repeater_hub/repeater_hub.c +0 -81
  438. data/src/examples/repeater_hub/repeater_hub.conf +0 -28
  439. data/src/examples/simple_router/README +0 -18
  440. data/src/examples/simple_router/arp-table.rb +0 -81
  441. data/src/examples/simple_router/interface.rb +0 -90
  442. data/src/examples/simple_router/routing-table.rb +0 -60
  443. data/src/examples/simple_router/simple-router.rb +0 -191
  444. data/src/examples/simple_router/simple_router.conf +0 -24
  445. data/src/examples/simple_router/simple_router_netns.conf +0 -15
  446. data/src/examples/simple_router/simple_router_network.conf +0 -6
  447. data/src/examples/switch_event_config/.gitignore +0 -6
  448. data/src/examples/switch_event_config/add_forward_entry.c +0 -227
  449. data/src/examples/switch_event_config/delete_forward_entry.c +0 -226
  450. data/src/examples/switch_event_config/dump_forward_entries.c +0 -190
  451. data/src/examples/switch_event_config/network.conf +0 -2
  452. data/src/examples/switch_event_config/set_forward_entries.c +0 -210
  453. data/src/examples/switch_info/README +0 -13
  454. data/src/examples/switch_info/switch-info.rb +0 -44
  455. data/src/examples/switch_info/switch_info.c +0 -78
  456. data/src/examples/switch_info/switch_info.conf +0 -3
  457. data/src/examples/switch_monitor/switch-monitor.conf +0 -3
  458. data/src/examples/switch_monitor/switch-monitor.rb +0 -56
  459. data/src/examples/switch_monitor/switch_monitor.c +0 -152
  460. data/src/examples/traffic_monitor/counter.c +0 -72
  461. data/src/examples/traffic_monitor/counter.h +0 -46
  462. data/src/examples/traffic_monitor/counter.rb +0 -44
  463. data/src/examples/traffic_monitor/fdb.c +0 -74
  464. data/src/examples/traffic_monitor/fdb.h +0 -48
  465. data/src/examples/traffic_monitor/fdb.rb +0 -42
  466. data/src/examples/traffic_monitor/traffic-monitor.rb +0 -98
  467. data/src/examples/traffic_monitor/traffic_monitor.c +0 -161
  468. data/src/examples/traffic_monitor/traffic_monitor.conf +0 -16
  469. data/src/examples/transparent_firewall/README.md +0 -61
  470. data/src/examples/transparent_firewall/aggregated-delegated-afrinic.txt +0 -713
  471. data/src/examples/transparent_firewall/aggregated-delegated-apnic.txt +0 -3440
  472. data/src/examples/transparent_firewall/aggregated-delegated-arin.txt +0 -11342
  473. data/src/examples/transparent_firewall/aggregated-delegated-lacnic.txt +0 -1937
  474. data/src/examples/transparent_firewall/aggregated-delegated-ripencc.txt +0 -7329
  475. data/src/examples/transparent_firewall/block-rfc1918.rb +0 -86
  476. data/src/examples/transparent_firewall/pass-delegated.rb +0 -178
  477. data/src/examples/transparent_firewall/regen_aggregated.sh +0 -53
  478. data/src/examples/transparent_firewall/stats-to-cidrs.rb +0 -59
  479. data/src/lib/arp.h +0 -64
  480. data/src/lib/bool.h +0 -47
  481. data/src/lib/buffer.c +0 -304
  482. data/src/lib/buffer.h +0 -54
  483. data/src/lib/byteorder.c +0 -571
  484. data/src/lib/byteorder.h +0 -108
  485. data/src/lib/checks.h +0 -40
  486. data/src/lib/chibach.c +0 -392
  487. data/src/lib/chibach.h +0 -69
  488. data/src/lib/chibach_private.c +0 -168
  489. data/src/lib/chibach_private.h +0 -50
  490. data/src/lib/daemon.c +0 -429
  491. data/src/lib/daemon.h +0 -40
  492. data/src/lib/doubly_linked_list.c +0 -284
  493. data/src/lib/doubly_linked_list.h +0 -86
  494. data/src/lib/ether.c +0 -47
  495. data/src/lib/ether.h +0 -92
  496. data/src/lib/etherip.h +0 -44
  497. data/src/lib/event_forward_interface.c +0 -788
  498. data/src/lib/event_forward_interface.h +0 -138
  499. data/src/lib/event_handler.c +0 -419
  500. data/src/lib/event_handler.h +0 -57
  501. data/src/lib/external_callback.c +0 -126
  502. data/src/lib/external_callback.h +0 -46
  503. data/src/lib/hash_table.c +0 -415
  504. data/src/lib/hash_table.h +0 -136
  505. data/src/lib/icmp.h +0 -72
  506. data/src/lib/igmp.h +0 -48
  507. data/src/lib/ipv4.h +0 -64
  508. data/src/lib/ipv6.h +0 -46
  509. data/src/lib/linked_list.c +0 -244
  510. data/src/lib/linked_list.h +0 -84
  511. data/src/lib/log.c +0 -636
  512. data/src/lib/log.h +0 -77
  513. data/src/lib/management_interface.c +0 -359
  514. data/src/lib/management_interface.h +0 -40
  515. data/src/lib/management_service_interface.c +0 -102
  516. data/src/lib/management_service_interface.h +0 -134
  517. data/src/lib/match.h +0 -82
  518. data/src/lib/match_table.c +0 -606
  519. data/src/lib/match_table.h +0 -49
  520. data/src/lib/message_queue.c +0 -143
  521. data/src/lib/message_queue.h +0 -59
  522. data/src/lib/messenger.c +0 -1821
  523. data/src/lib/messenger.h +0 -145
  524. data/src/lib/openflow_application_interface.c +0 -1800
  525. data/src/lib/openflow_application_interface.h +0 -359
  526. data/src/lib/openflow_message.c +0 -4240
  527. data/src/lib/openflow_message.h +0 -291
  528. data/src/lib/openflow_service_interface.h +0 -58
  529. data/src/lib/openflow_switch_interface.c +0 -1378
  530. data/src/lib/openflow_switch_interface.h +0 -262
  531. data/src/lib/packet_info.c +0 -336
  532. data/src/lib/packet_info.h +0 -233
  533. data/src/lib/packet_parser.c +0 -522
  534. data/src/lib/packetin_filter_interface.c +0 -292
  535. data/src/lib/packetin_filter_interface.h +0 -125
  536. data/src/lib/persistent_storage.c +0 -478
  537. data/src/lib/persistent_storage.h +0 -44
  538. data/src/lib/secure_channel.c +0 -496
  539. data/src/lib/secure_channel.h +0 -43
  540. data/src/lib/stat.c +0 -248
  541. data/src/lib/stat.h +0 -51
  542. data/src/lib/tcp.h +0 -62
  543. data/src/lib/timer.c +0 -349
  544. data/src/lib/timer.h +0 -51
  545. data/src/lib/trema.c +0 -776
  546. data/src/lib/trema.h +0 -80
  547. data/src/lib/trema.hpp +0 -49
  548. data/src/lib/trema_private.c +0 -175
  549. data/src/lib/trema_private.h +0 -64
  550. data/src/lib/trema_wrapper.c +0 -59
  551. data/src/lib/trema_wrapper.h +0 -66
  552. data/src/lib/udp.h +0 -41
  553. data/src/lib/utility.c +0 -625
  554. data/src/lib/utility.h +0 -84
  555. data/src/lib/wrapper.c +0 -121
  556. data/src/lib/wrapper.h +0 -76
  557. data/src/management/application.c +0 -222
  558. data/src/management/echo.c +0 -183
  559. data/src/management/set_logging_level.c +0 -151
  560. data/src/management/show_stats.c +0 -148
  561. data/src/management/trema_manager +0 -184
  562. data/src/packetin_filter/README +0 -17
  563. data/src/packetin_filter/packetin_filter.c +0 -575
  564. data/src/switch_manager/README +0 -20
  565. data/src/switch_manager/cookie_table.c +0 -290
  566. data/src/switch_manager/cookie_table.h +0 -70
  567. data/src/switch_manager/dpid_table.c +0 -108
  568. data/src/switch_manager/dpid_table.h +0 -43
  569. data/src/switch_manager/event_forward_entry_manipulation.c +0 -120
  570. data/src/switch_manager/event_forward_entry_manipulation.h +0 -31
  571. data/src/switch_manager/ofpmsg_recv.c +0 -497
  572. data/src/switch_manager/ofpmsg_recv.h +0 -39
  573. data/src/switch_manager/ofpmsg_send.c +0 -274
  574. data/src/switch_manager/ofpmsg_send.h +0 -51
  575. data/src/switch_manager/secure_channel_listener.c +0 -296
  576. data/src/switch_manager/secure_channel_listener.h +0 -40
  577. data/src/switch_manager/secure_channel_receiver.c +0 -129
  578. data/src/switch_manager/secure_channel_receiver.h +0 -40
  579. data/src/switch_manager/secure_channel_sender.c +0 -131
  580. data/src/switch_manager/secure_channel_sender.h +0 -41
  581. data/src/switch_manager/service_interface.c +0 -180
  582. data/src/switch_manager/service_interface.h +0 -44
  583. data/src/switch_manager/switch.c +0 -988
  584. data/src/switch_manager/switch.h +0 -50
  585. data/src/switch_manager/switch_manager.c +0 -643
  586. data/src/switch_manager/switch_manager.h +0 -65
  587. data/src/switch_manager/switch_option.c +0 -30
  588. data/src/switch_manager/switch_option.h +0 -41
  589. data/src/switch_manager/switchinfo.h +0 -81
  590. data/src/switch_manager/xid_table.c +0 -182
  591. data/src/switch_manager/xid_table.h +0 -53
  592. data/src/tremashark/README +0 -79
  593. data/src/tremashark/packet_capture.c +0 -358
  594. data/src/tremashark/pcap_private.h +0 -45
  595. data/src/tremashark/pcap_queue.c +0 -195
  596. data/src/tremashark/pcap_queue.h +0 -56
  597. data/src/tremashark/plugin/.gitignore +0 -6
  598. data/src/tremashark/plugin/packet-trema/.gitignore +0 -5
  599. data/src/tremashark/plugin/packet-trema/Makefile +0 -77
  600. data/src/tremashark/plugin/packet-trema/Makefile.am +0 -110
  601. data/src/tremashark/plugin/packet-trema/Makefile.common +0 -29
  602. data/src/tremashark/plugin/packet-trema/moduleinfo.h +0 -39
  603. data/src/tremashark/plugin/packet-trema/packet-trema.c +0 -1671
  604. data/src/tremashark/plugin/packet-trema/plugin.c +0 -31
  605. data/src/tremashark/plugin/user_dlts +0 -2
  606. data/src/tremashark/queue.c +0 -167
  607. data/src/tremashark/queue.h +0 -58
  608. data/src/tremashark/stdin_relay.c +0 -257
  609. data/src/tremashark/syslog_relay.c +0 -247
  610. data/src/tremashark/tremashark.c +0 -554
  611. data/trema +0 -11
  612. data/trema-config +0 -11
  613. data/unittests/buffer_stubs.c +0 -72
  614. data/unittests/cmockery_trema.c +0 -121
  615. data/unittests/cmockery_trema.h +0 -95
  616. data/unittests/lib/buffer_test.c +0 -368
  617. data/unittests/lib/byteorder_test.c +0 -1798
  618. data/unittests/lib/daemon_test.c +0 -804
  619. data/unittests/lib/doubly_linked_list_test.c +0 -348
  620. data/unittests/lib/ether_test.c +0 -125
  621. data/unittests/lib/event_forward_interface_test.c +0 -1676
  622. data/unittests/lib/external_callback_test.c +0 -282
  623. data/unittests/lib/hash_table_test.c +0 -278
  624. data/unittests/lib/linked_list_test.c +0 -434
  625. data/unittests/lib/log_test.c +0 -672
  626. data/unittests/lib/management_interface_test.c +0 -238
  627. data/unittests/lib/management_service_interface_test.c +0 -317
  628. data/unittests/lib/match_table_test.c +0 -1507
  629. data/unittests/lib/message_queue_test.c +0 -381
  630. data/unittests/lib/messenger_test.c +0 -623
  631. data/unittests/lib/openflow_application_interface_test.c +0 -3713
  632. data/unittests/lib/openflow_message_test.c +0 -8047
  633. data/unittests/lib/packet_info_test.c +0 -558
  634. data/unittests/lib/packet_parser_test.c +0 -784
  635. data/unittests/lib/packetin_filter_interface_test.c +0 -721
  636. data/unittests/lib/persistent_storage_test.c +0 -800
  637. data/unittests/lib/stat_test.c +0 -433
  638. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  639. data/unittests/lib/test_packets/arp_req.cap +0 -0
  640. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  641. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  642. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  643. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  644. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  645. data/unittests/lib/test_packets/ipx.cap +0 -0
  646. data/unittests/lib/test_packets/lldp.cap +0 -0
  647. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  648. data/unittests/lib/test_packets/rarp_req.cap +0 -0
  649. data/unittests/lib/test_packets/tcp.cap +0 -0
  650. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  651. data/unittests/lib/test_packets/udp.cap +0 -0
  652. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  653. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  654. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  655. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  656. data/unittests/lib/timer_test.c +0 -246
  657. data/unittests/lib/trema_private_test.c +0 -321
  658. data/unittests/lib/trema_test.c +0 -1030
  659. data/unittests/lib/utility_test.c +0 -711
  660. data/unittests/lib/wrapper_test.c +0 -228
  661. data/unittests/packetin_filter/packetin_filter_test.c +0 -476
  662. data/unittests/switch_manager/switch_manager_test.c +0 -1183
  663. data/unittests/wrapper_stubs.c +0 -37
  664. data/vendor/.gitignore +0 -6
  665. data/vendor/README.md +0 -29
  666. data/vendor/cmockery-20110428.tar.gz +0 -0
  667. data/vendor/oflops-0.03.trema1.tar.gz +0 -0
  668. data/vendor/oflops_no_snmp+1.0.0.diff +0 -340
  669. data/vendor/openflow-1.0.0.tar.gz +0 -0
  670. data/vendor/openflow.git.tar.gz +0 -0
  671. data/vendor/openvswitch-1.2.2.trema1.tar.gz +0 -0
  672. data/vendor/openvswitch-1.2.2_librt-check.diff +0 -21
  673. data/vendor/packet-openflow.diff +0 -13
  674. data/vendor/ruby-ifconfig-1.2/COPYING +0 -340
  675. data/vendor/ruby-ifconfig-1.2/Changelog +0 -16
  676. data/vendor/ruby-ifconfig-1.2/INSTALL +0 -239
  677. data/vendor/ruby-ifconfig-1.2/README +0 -38
  678. data/vendor/ruby-ifconfig-1.2/Rakefile +0 -14
  679. data/vendor/ruby-ifconfig-1.2/TODO +0 -8
  680. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +0 -17
  681. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +0 -10
  682. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +0 -14
  683. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +0 -17
  684. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +0 -24
  685. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +0 -60
  686. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +0 -20
  687. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +0 -10
  688. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +0 -36
  689. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +0 -10
  690. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +0 -71
  691. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +0 -72
  692. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +0 -69
  693. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +0 -3
  694. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +0 -84
  695. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +0 -130
  696. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +0 -49
  697. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +0 -43
  698. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +0 -112
  699. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +0 -55
  700. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +0 -38
  701. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +0 -77
  702. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +0 -4
  703. data/vendor/ruby-ifconfig-1.2/setup.rb +0 -1306
  704. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +0 -35
  705. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +0 -33
  706. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +0 -35
  707. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +0 -4
  708. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +0 -31
  709. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +0 -33
  710. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +0 -33
  711. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +0 -35
  712. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +0 -40
  713. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +0 -39
  714. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +0 -40
  715. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +0 -49
  716. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +0 -39
  717. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +0 -39
  718. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +0 -44
@@ -1,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
- */