trema 0.4.7 → 0.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +33 -54
  3. data/.hound.yml +3 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +17 -1
  6. data/.travis.yml +14 -18
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +1 -26
  9. data/README.md +25 -241
  10. data/Rakefile +4 -1056
  11. data/bin/.gitignore +3 -0
  12. data/bin/trema +163 -237
  13. data/features/cleanup_on_failure.feature +118 -0
  14. data/features/logging.feature +73 -0
  15. data/features/open_flow13.feature +21 -0
  16. data/features/step_definitions/.gitignore +35 -0
  17. data/features/step_definitions/.rubocop.yml +5 -0
  18. data/features/step_definitions/.travis.yml +19 -0
  19. data/features/step_definitions/Gemfile +9 -0
  20. data/features/step_definitions/Guardfile +4 -0
  21. data/features/step_definitions/LICENSE +675 -0
  22. data/features/step_definitions/README.md +7 -0
  23. data/features/step_definitions/Rakefile +10 -0
  24. data/features/step_definitions/show_stats_steps.rb +56 -0
  25. data/features/step_definitions/virtual_link_steps.rb +8 -0
  26. data/features/support/env.rb +0 -73
  27. data/features/support/hooks.rb +6 -50
  28. data/features/trema_delete_link.feature +30 -0
  29. data/features/trema_killall.feature +56 -0
  30. data/features/trema_run.feature +47 -0
  31. data/features/trema_start.feature +73 -0
  32. data/features/trema_stop.feature +50 -0
  33. data/lib/trema.rb +4 -0
  34. data/lib/trema/command.rb +184 -0
  35. data/lib/trema/controller.rb +289 -0
  36. data/lib/trema/dirs.rb +14 -0
  37. data/lib/trema/drb.rb +32 -0
  38. data/lib/trema/logger.rb +63 -0
  39. data/lib/trema/monkey_patch/integer.rb +8 -0
  40. data/lib/trema/monkey_patch/integer/base_conversions.rb +12 -0
  41. data/lib/trema/monkey_patch/integer/durations.rb +12 -0
  42. data/lib/trema/switch.rb +83 -0
  43. data/lib/trema/version.rb +5 -0
  44. data/spec/spec_helper.rb +9 -178
  45. data/spec/trema/controller_spec.rb +4 -53
  46. data/tasks/.gitignore +34 -0
  47. data/tasks/LICENSE +675 -0
  48. data/tasks/README.md +6 -0
  49. data/tasks/cucumber.rake +14 -0
  50. data/tasks/flay.rake +15 -0
  51. data/tasks/flog.rake +25 -0
  52. data/tasks/gem.rake +15 -0
  53. data/tasks/reek.rake +11 -0
  54. data/tasks/relish.rake +8 -0
  55. data/tasks/rspec.rake +8 -0
  56. data/tasks/rubocop.rake +2 -16
  57. data/tasks/yard.rake +11 -0
  58. data/trema.gemspec +24 -23
  59. metadata +180 -720
  60. data/.yardopts +0 -4
  61. data/Doxyfile +0 -1679
  62. data/Guardfile +0 -14
  63. data/bin/quality +0 -31
  64. data/bin/trema-config +0 -59
  65. data/build.rb +0 -32
  66. data/cruise.rb +0 -409
  67. data/features/.nav +0 -50
  68. data/features/README.md +0 -7
  69. data/features/core/get_pid_by_trema_name.feature +0 -137
  70. data/features/core/packetin_filter.feature +0 -55
  71. data/features/core/switch_manager.feature +0 -41
  72. data/features/core/trema-config.feature +0 -55
  73. data/features/dsl/switch_port_specifier.feature +0 -15
  74. data/features/examples/dumper.feature +0 -35
  75. data/features/examples/hello_trema.feature +0 -23
  76. data/features/examples/learning_switch.feature +0 -37
  77. data/features/examples/list_switches.feature +0 -24
  78. data/features/examples/message.set_config.feature +0 -27
  79. data/features/examples/message.vendor-action.feature +0 -25
  80. data/features/examples/message.vendor-stats-request.feature +0 -20
  81. data/features/examples/multi_learning_switch.feature +0 -107
  82. data/features/examples/openflow_message.echo.feature +0 -59
  83. data/features/examples/openflow_message.features_request.feature +0 -35
  84. data/features/examples/openflow_message.hello.feature +0 -59
  85. data/features/examples/packet_in.feature +0 -33
  86. data/features/examples/packetin_filter_config.feature +0 -95
  87. data/features/examples/patch_panel.feature +0 -29
  88. data/features/examples/repeater_hub.feature +0 -52
  89. data/features/examples/switch_info.feature +0 -51
  90. data/features/examples/switch_monitor.feature +0 -35
  91. data/features/examples/transparent_firewall.feature +0 -73
  92. data/features/handlers/switch_ready.feature +0 -40
  93. data/features/step_definitions/misc_steps.rb +0 -85
  94. data/features/step_definitions/send_packets_steps.rb +0 -33
  95. data/features/step_definitions/stats_steps.rb +0 -39
  96. data/features/switch_event/C-add_forward_entry.feature +0 -114
  97. data/features/switch_event/C-delete_forward_entry.feature +0 -85
  98. data/features/switch_event/C-dump_forward_entries.feature +0 -72
  99. data/features/switch_event/C-set_forward_entries.feature +0 -77
  100. data/features/switch_event/README.md +0 -40
  101. data/features/switch_event/add_forward_entry.feature +0 -160
  102. data/features/switch_event/delete_forward_entry.feature +0 -160
  103. data/features/switch_event/dump_forward_entries.feature +0 -103
  104. data/features/switch_event/set_forward_entries.feature +0 -102
  105. data/features/trema_commands/README.md +0 -8
  106. data/features/trema_commands/dump_flows.feature +0 -41
  107. data/features/trema_commands/help.feature +0 -27
  108. data/features/trema_commands/help_option.feature +0 -20
  109. data/features/trema_commands/kill.feature +0 -56
  110. data/features/trema_commands/killall.feature +0 -32
  111. data/features/trema_commands/port_down.feature +0 -71
  112. data/features/trema_commands/port_up.feature +0 -75
  113. data/features/trema_commands/reset_stats.feature +0 -56
  114. data/features/trema_commands/run.feature +0 -56
  115. data/features/trema_commands/send_packets.feature +0 -46
  116. data/features/trema_commands/show_stats.feature +0 -66
  117. data/features/trema_commands/up.feature +0 -34
  118. data/features/trema_commands/version.feature +0 -10
  119. data/features/trema_commands/version_option.feature +0 -8
  120. data/rubocop-todo.yml +0 -159
  121. data/ruby/.gitignore +0 -4
  122. data/ruby/blocker.rb +0 -74
  123. data/ruby/extconf.rb +0 -80
  124. data/ruby/sub-process.rb +0 -289
  125. data/ruby/trema/action-common.c +0 -46
  126. data/ruby/trema/action-common.h +0 -38
  127. data/ruby/trema/action.rb +0 -33
  128. data/ruby/trema/aggregate-stats-reply.rb +0 -68
  129. data/ruby/trema/app.rb +0 -114
  130. data/ruby/trema/barrier-reply.c +0 -98
  131. data/ruby/trema/barrier-reply.h +0 -44
  132. data/ruby/trema/barrier-request.c +0 -135
  133. data/ruby/trema/barrier-request.h +0 -42
  134. data/ruby/trema/cli.rb +0 -267
  135. data/ruby/trema/command.rb +0 -41
  136. data/ruby/trema/command/dump_flows.rb +0 -43
  137. data/ruby/trema/command/kill.rb +0 -75
  138. data/ruby/trema/command/killall.rb +0 -38
  139. data/ruby/trema/command/netns.rb +0 -38
  140. data/ruby/trema/command/port_down.rb +0 -43
  141. data/ruby/trema/command/port_up.rb +0 -43
  142. data/ruby/trema/command/reset_stats.rb +0 -41
  143. data/ruby/trema/command/ruby.rb +0 -38
  144. data/ruby/trema/command/run.rb +0 -110
  145. data/ruby/trema/command/send_packets.rb +0 -46
  146. data/ruby/trema/command/shell.rb +0 -57
  147. data/ruby/trema/command/show_stats.rb +0 -65
  148. data/ruby/trema/command/up.rb +0 -44
  149. data/ruby/trema/command/version.rb +0 -35
  150. data/ruby/trema/compat.h +0 -36
  151. data/ruby/trema/controller.c +0 -691
  152. data/ruby/trema/controller.h +0 -42
  153. data/ruby/trema/controller.rb +0 -255
  154. data/ruby/trema/custom-switch.rb +0 -56
  155. data/ruby/trema/daemon.rb +0 -184
  156. data/ruby/trema/default-logger.c +0 -161
  157. data/ruby/trema/default-logger.h +0 -42
  158. data/ruby/trema/default-logger.rb +0 -29
  159. data/ruby/trema/default_openflow_channel_port.rb +0 -26
  160. data/ruby/trema/desc-stats-reply.rb +0 -75
  161. data/ruby/trema/dsl.rb +0 -32
  162. data/ruby/trema/dsl/configuration.rb +0 -145
  163. data/ruby/trema/dsl/context.rb +0 -69
  164. data/ruby/trema/dsl/custom-switch.rb +0 -44
  165. data/ruby/trema/dsl/link.rb +0 -39
  166. data/ruby/trema/dsl/netns.rb +0 -78
  167. data/ruby/trema/dsl/parser.rb +0 -70
  168. data/ruby/trema/dsl/rswitch.rb +0 -47
  169. data/ruby/trema/dsl/run.rb +0 -47
  170. data/ruby/trema/dsl/runner.rb +0 -178
  171. data/ruby/trema/dsl/stanza.rb +0 -51
  172. data/ruby/trema/dsl/switch.rb +0 -76
  173. data/ruby/trema/dsl/syntax-error.rb +0 -31
  174. data/ruby/trema/dsl/syntax.rb +0 -128
  175. data/ruby/trema/dsl/vhost.rb +0 -106
  176. data/ruby/trema/dsl/vswitch.rb +0 -45
  177. data/ruby/trema/echo-reply.c +0 -122
  178. data/ruby/trema/echo-reply.h +0 -40
  179. data/ruby/trema/echo-request.c +0 -117
  180. data/ruby/trema/echo-request.h +0 -40
  181. data/ruby/trema/echo.c +0 -99
  182. data/ruby/trema/echo.h +0 -39
  183. data/ruby/trema/enqueue.rb +0 -87
  184. data/ruby/trema/error.c +0 -262
  185. data/ruby/trema/error.h +0 -42
  186. data/ruby/trema/exact-match.rb +0 -34
  187. data/ruby/trema/executables.rb +0 -99
  188. data/ruby/trema/features-reply.c +0 -330
  189. data/ruby/trema/features-reply.h +0 -54
  190. data/ruby/trema/features-request.c +0 -134
  191. data/ruby/trema/features-request.h +0 -42
  192. data/ruby/trema/flow-mod.c +0 -150
  193. data/ruby/trema/flow-mod.h +0 -42
  194. data/ruby/trema/flow-removed.c +0 -280
  195. data/ruby/trema/flow-removed.h +0 -44
  196. data/ruby/trema/flow-stats-reply.rb +0 -107
  197. data/ruby/trema/flow.rb +0 -65
  198. data/ruby/trema/get-config-reply.c +0 -158
  199. data/ruby/trema/get-config-reply.h +0 -50
  200. data/ruby/trema/get-config-request.c +0 -136
  201. data/ruby/trema/get-config-request.h +0 -42
  202. data/ruby/trema/hardware-switch.rb +0 -86
  203. data/ruby/trema/hello.c +0 -133
  204. data/ruby/trema/hello.h +0 -42
  205. data/ruby/trema/host.rb +0 -263
  206. data/ruby/trema/link.rb +0 -177
  207. data/ruby/trema/list-switches-reply.c +0 -44
  208. data/ruby/trema/list-switches-reply.h +0 -38
  209. data/ruby/trema/mac.rb +0 -29
  210. data/ruby/trema/match.c +0 -621
  211. data/ruby/trema/match.h +0 -34
  212. data/ruby/trema/monkey-patch/integer.rb +0 -35
  213. data/ruby/trema/monkey-patch/integer/base-conversions.rb +0 -34
  214. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -49
  215. data/ruby/trema/monkey-patch/integer/validators.rb +0 -36
  216. data/ruby/trema/monkey-patch/module.rb +0 -33
  217. data/ruby/trema/monkey-patch/module/class-method.rb +0 -38
  218. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -39
  219. data/ruby/trema/monkey-patch/string.rb +0 -31
  220. data/ruby/trema/monkey-patch/string/inflectors.rb +0 -52
  221. data/ruby/trema/netns.rb +0 -127
  222. data/ruby/trema/network-component.rb +0 -151
  223. data/ruby/trema/ofctl.rb +0 -70
  224. data/ruby/trema/open-vswitch.rb +0 -160
  225. data/ruby/trema/openflow-error.c +0 -193
  226. data/ruby/trema/openflow-error.h +0 -51
  227. data/ruby/trema/openflow-switch.rb +0 -35
  228. data/ruby/trema/ordered-hash.rb +0 -75
  229. data/ruby/trema/packet-in.c +0 -1365
  230. data/ruby/trema/packet-in.h +0 -44
  231. data/ruby/trema/packet-queue.rb +0 -181
  232. data/ruby/trema/packetin-filter.rb +0 -124
  233. data/ruby/trema/path.rb +0 -85
  234. data/ruby/trema/phost.rb +0 -76
  235. data/ruby/trema/port-mod.c +0 -232
  236. data/ruby/trema/port-mod.h +0 -34
  237. data/ruby/trema/port-stats-reply.rb +0 -109
  238. data/ruby/trema/port-status-add.rb +0 -60
  239. data/ruby/trema/port-status-delete.rb +0 -60
  240. data/ruby/trema/port-status-modify.rb +0 -60
  241. data/ruby/trema/port-status.c +0 -192
  242. data/ruby/trema/port-status.h +0 -41
  243. data/ruby/trema/port.c +0 -398
  244. data/ruby/trema/port.h +0 -45
  245. data/ruby/trema/process.rb +0 -103
  246. data/ruby/trema/queue-get-config-reply.c +0 -205
  247. data/ruby/trema/queue-get-config-reply.h +0 -45
  248. data/ruby/trema/queue-get-config-request.c +0 -141
  249. data/ruby/trema/queue-get-config-request.h +0 -42
  250. data/ruby/trema/queue-stats-reply.rb +0 -76
  251. data/ruby/trema/ruby-switch.rb +0 -62
  252. data/ruby/trema/send-out-port.rb +0 -113
  253. data/ruby/trema/set-config.c +0 -174
  254. data/ruby/trema/set-config.h +0 -42
  255. data/ruby/trema/set-eth-addr.rb +0 -54
  256. data/ruby/trema/set-eth-dst-addr.rb +0 -52
  257. data/ruby/trema/set-eth-src-addr.rb +0 -53
  258. data/ruby/trema/set-ip-addr.rb +0 -54
  259. data/ruby/trema/set-ip-dst-addr.rb +0 -53
  260. data/ruby/trema/set-ip-src-addr.rb +0 -52
  261. data/ruby/trema/set-ip-tos.rb +0 -64
  262. data/ruby/trema/set-transport-dst-port.rb +0 -53
  263. data/ruby/trema/set-transport-port.rb +0 -53
  264. data/ruby/trema/set-transport-src-port.rb +0 -54
  265. data/ruby/trema/set-vlan-priority.rb +0 -66
  266. data/ruby/trema/set-vlan-vid.rb +0 -65
  267. data/ruby/trema/shell.rb +0 -37
  268. data/ruby/trema/shell/down.rb +0 -37
  269. data/ruby/trema/shell/killall.rb +0 -38
  270. data/ruby/trema/shell/link.rb +0 -59
  271. data/ruby/trema/shell/reset_stats.rb +0 -49
  272. data/ruby/trema/shell/run.rb +0 -67
  273. data/ruby/trema/shell/send_packets.rb +0 -40
  274. data/ruby/trema/shell/show_stats.rb +0 -47
  275. data/ruby/trema/shell/up.rb +0 -41
  276. data/ruby/trema/shell/vhost.rb +0 -42
  277. data/ruby/trema/shell/vswitch.rb +0 -47
  278. data/ruby/trema/stats-helper.rb +0 -63
  279. data/ruby/trema/stats-reply.c +0 -540
  280. data/ruby/trema/stats-reply.h +0 -51
  281. data/ruby/trema/stats-request.c +0 -715
  282. data/ruby/trema/stats-request.h +0 -40
  283. data/ruby/trema/strip-vlan-header.rb +0 -41
  284. data/ruby/trema/switch-daemon.rb +0 -90
  285. data/ruby/trema/switch-disconnected.c +0 -38
  286. data/ruby/trema/switch-disconnected.h +0 -36
  287. data/ruby/trema/switch-event.c +0 -648
  288. data/ruby/trema/switch-event.h +0 -27
  289. data/ruby/trema/switch-manager.rb +0 -119
  290. data/ruby/trema/switch.c +0 -197
  291. data/ruby/trema/switch.h +0 -40
  292. data/ruby/trema/switch.rb +0 -56
  293. data/ruby/trema/table-stats-reply.rb +0 -85
  294. data/ruby/trema/timers.rb +0 -95
  295. data/ruby/trema/trema-ruby-utils.c +0 -66
  296. data/ruby/trema/trema-ruby-utils.h +0 -42
  297. data/ruby/trema/trema.c +0 -126
  298. data/ruby/trema/tremashark.rb +0 -46
  299. data/ruby/trema/util.rb +0 -116
  300. data/ruby/trema/vendor-action.rb +0 -82
  301. data/ruby/trema/vendor-stats-reply.rb +0 -64
  302. data/ruby/trema/vendor.c +0 -230
  303. data/ruby/trema/vendor.h +0 -48
  304. data/ruby/trema/version.rb +0 -28
  305. data/spec/support/action.rb +0 -49
  306. data/spec/support/mandatory-option.rb +0 -53
  307. data/spec/support/matchers/constant.rb +0 -25
  308. data/spec/support/openflow-message.rb +0 -173
  309. data/spec/support/port-status.rb +0 -35
  310. data/spec/trema/app_spec.rb +0 -88
  311. data/spec/trema/barrier-reply_spec.rb +0 -43
  312. data/spec/trema/barrier-request_spec.rb +0 -92
  313. data/spec/trema/cli_spec.rb +0 -156
  314. data/spec/trema/default-logger_spec.rb +0 -46
  315. data/spec/trema/dsl/configuration_spec.rb +0 -120
  316. data/spec/trema/dsl/link_spec.rb +0 -50
  317. data/spec/trema/dsl/run_spec.rb +0 -72
  318. data/spec/trema/dsl/runner_spec.rb +0 -247
  319. data/spec/trema/dsl/switch_spec.rb +0 -69
  320. data/spec/trema/dsl/syntax_spec.rb +0 -110
  321. data/spec/trema/dsl/vhost_spec.rb +0 -144
  322. data/spec/trema/dsl/vswitch_spec.rb +0 -80
  323. data/spec/trema/echo-reply_spec.rb +0 -84
  324. data/spec/trema/echo-request_spec.rb +0 -128
  325. data/spec/trema/enqueue_spec.rb +0 -76
  326. data/spec/trema/error_spec.rb +0 -81
  327. data/spec/trema/executables_spec.rb +0 -54
  328. data/spec/trema/features-reply_spec.rb +0 -91
  329. data/spec/trema/features-request_spec.rb +0 -93
  330. data/spec/trema/flow-mod_spec.rb +0 -99
  331. data/spec/trema/flow-removed_spec.rb +0 -144
  332. data/spec/trema/get-config-reply_spec.rb +0 -43
  333. data/spec/trema/get-config-request_spec.rb +0 -92
  334. data/spec/trema/hardware-switch_spec.rb +0 -54
  335. data/spec/trema/hello_spec.rb +0 -63
  336. data/spec/trema/host_spec.rb +0 -191
  337. data/spec/trema/link_spec.rb +0 -62
  338. data/spec/trema/list-switches-reply_spec.rb +0 -46
  339. data/spec/trema/match_spec.rb +0 -111
  340. data/spec/trema/open-vswitch_spec.rb +0 -121
  341. data/spec/trema/openflow-error_spec.rb +0 -141
  342. data/spec/trema/packet-in_spec.rb +0 -717
  343. data/spec/trema/packet-out_spec.rb +0 -125
  344. data/spec/trema/packetin-filter_spec.rb +0 -39
  345. data/spec/trema/port-mod_spec.rb +0 -98
  346. data/spec/trema/port-status-add_spec.rb +0 -32
  347. data/spec/trema/port-status-delete_spec.rb +0 -32
  348. data/spec/trema/port-status-modify_spec.rb +0 -71
  349. data/spec/trema/port-status_spec.rb +0 -38
  350. data/spec/trema/port_spec.rb +0 -59
  351. data/spec/trema/process_spec.rb +0 -69
  352. data/spec/trema/queue-get-config-reply_spec.rb +0 -65
  353. data/spec/trema/queue-get-config-request_spec.rb +0 -67
  354. data/spec/trema/send-out-port_spec.rb +0 -106
  355. data/spec/trema/set-config_spec.rb +0 -78
  356. data/spec/trema/set-eth-addr_spec.rb +0 -62
  357. data/spec/trema/set-ip-addr_spec.rb +0 -81
  358. data/spec/trema/set-ip-tos_spec.rb +0 -70
  359. data/spec/trema/set-transport-dst-port_spec.rb +0 -65
  360. data/spec/trema/set-transport-src-port_spec.rb +0 -65
  361. data/spec/trema/set-vlan-priority_spec.rb +0 -65
  362. data/spec/trema/set-vlan-vid_spec.rb +0 -65
  363. data/spec/trema/shell/vhost_spec.rb +0 -58
  364. data/spec/trema/shell/vswitch_spec.rb +0 -87
  365. data/spec/trema/stats-reply_spec.rb +0 -363
  366. data/spec/trema/stats-request_spec.rb +0 -166
  367. data/spec/trema/strip-vlan-header_spec.rb +0 -44
  368. data/spec/trema/switch-daemon_spec.rb +0 -81
  369. data/spec/trema/switch-disconnected_spec.rb +0 -56
  370. data/spec/trema/switch-manager_spec.rb +0 -41
  371. data/spec/trema/tremashark_spec.rb +0 -39
  372. data/spec/trema/util_spec.rb +0 -88
  373. data/spec/trema/vendor-action_spec.rb +0 -75
  374. data/spec/trema/vendor_spec.rb +0 -76
  375. data/spec/trema_spec.rb +0 -94
  376. data/src/examples/cbench_switch/README +0 -21
  377. data/src/examples/cbench_switch/cbench-switch.rb +0 -38
  378. data/src/examples/cbench_switch/cbench_switch.c +0 -66
  379. data/src/examples/dumper/dumper.c +0 -362
  380. data/src/examples/dumper/dumper.conf +0 -7
  381. data/src/examples/dumper/dumper.rb +0 -195
  382. data/src/examples/hello_trema/.gitignore +0 -2
  383. data/src/examples/hello_trema/README.md +0 -2
  384. data/src/examples/hello_trema/hello-trema.rb +0 -30
  385. data/src/examples/hello_trema/hello_trema.c +0 -48
  386. data/src/examples/hello_trema/sample.conf +0 -1
  387. data/src/examples/learning_switch/README +0 -15
  388. data/src/examples/learning_switch/fdb.rb +0 -110
  389. data/src/examples/learning_switch/learning-switch.rb +0 -90
  390. data/src/examples/learning_switch/learning_switch.c +0 -217
  391. data/src/examples/learning_switch/learning_switch.conf +0 -18
  392. data/src/examples/list_switches/README +0 -19
  393. data/src/examples/list_switches/list-switches.rb +0 -43
  394. data/src/examples/list_switches/list_switches.c +0 -79
  395. data/src/examples/list_switches/list_switches.conf +0 -15
  396. data/src/examples/match_compare/match-compare.conf +0 -30
  397. data/src/examples/match_compare/match-compare.rb +0 -97
  398. data/src/examples/multi_learning_switch/README +0 -14
  399. data/src/examples/multi_learning_switch/multi-learning-switch.rb +0 -94
  400. data/src/examples/multi_learning_switch/multi_learning_switch.c +0 -294
  401. data/src/examples/multi_learning_switch/multi_learning_switch.conf +0 -17
  402. data/src/examples/openflow_message/README +0 -11
  403. data/src/examples/openflow_message/echo.c +0 -80
  404. data/src/examples/openflow_message/echo.rb +0 -56
  405. data/src/examples/openflow_message/example.rb +0 -60
  406. data/src/examples/openflow_message/features-request.rb +0 -96
  407. data/src/examples/openflow_message/features_request.c +0 -167
  408. data/src/examples/openflow_message/hello.c +0 -68
  409. data/src/examples/openflow_message/hello.rb +0 -43
  410. data/src/examples/openflow_message/set-config.rb +0 -57
  411. data/src/examples/openflow_message/set_config.c +0 -68
  412. data/src/examples/openflow_message/vendor-action.rb +0 -43
  413. data/src/examples/openflow_message/vendor-stats-request.rb +0 -66
  414. data/src/examples/openflow_message/vendor_action.c +0 -103
  415. data/src/examples/openflow_switch/echo_switch.c +0 -89
  416. data/src/examples/openflow_switch/hello_switch.c +0 -85
  417. data/src/examples/packet_in/README +0 -15
  418. data/src/examples/packet_in/packet-in.rb +0 -37
  419. data/src/examples/packet_in/packet_in.c +0 -53
  420. data/src/examples/packet_in/packet_in.conf +0 -15
  421. data/src/examples/packetin_filter_config/README +0 -12
  422. data/src/examples/packetin_filter_config/add_filter.c +0 -71
  423. data/src/examples/packetin_filter_config/delete_filter.c +0 -63
  424. data/src/examples/packetin_filter_config/delete_filter_strict.c +0 -73
  425. data/src/examples/packetin_filter_config/dump_filter.c +0 -63
  426. data/src/examples/packetin_filter_config/dump_filter_strict.c +0 -73
  427. data/src/examples/packetin_filter_config/packetin_filter_config.c +0 -132
  428. data/src/examples/packetin_filter_config/packetin_filter_config.conf +0 -7
  429. data/src/examples/packetin_filter_config/utils.c +0 -100
  430. data/src/examples/packetin_filter_config/utils.h +0 -40
  431. data/src/examples/patch_panel/network.conf +0 -14
  432. data/src/examples/patch_panel/patch-panel.conf +0 -1
  433. data/src/examples/patch_panel/patch-panel.rb +0 -59
  434. data/src/examples/repeater_hub/README +0 -8
  435. data/src/examples/repeater_hub/repeater-hub.rb +0 -41
  436. data/src/examples/repeater_hub/repeater-hub_spec.rb +0 -154
  437. data/src/examples/repeater_hub/repeater_hub.c +0 -81
  438. data/src/examples/repeater_hub/repeater_hub.conf +0 -28
  439. data/src/examples/simple_router/README +0 -18
  440. data/src/examples/simple_router/arp-table.rb +0 -81
  441. data/src/examples/simple_router/interface.rb +0 -90
  442. data/src/examples/simple_router/routing-table.rb +0 -60
  443. data/src/examples/simple_router/simple-router.rb +0 -191
  444. data/src/examples/simple_router/simple_router.conf +0 -24
  445. data/src/examples/simple_router/simple_router_netns.conf +0 -15
  446. data/src/examples/simple_router/simple_router_network.conf +0 -6
  447. data/src/examples/switch_event_config/.gitignore +0 -6
  448. data/src/examples/switch_event_config/add_forward_entry.c +0 -227
  449. data/src/examples/switch_event_config/delete_forward_entry.c +0 -226
  450. data/src/examples/switch_event_config/dump_forward_entries.c +0 -190
  451. data/src/examples/switch_event_config/network.conf +0 -2
  452. data/src/examples/switch_event_config/set_forward_entries.c +0 -210
  453. data/src/examples/switch_info/README +0 -13
  454. data/src/examples/switch_info/switch-info.rb +0 -44
  455. data/src/examples/switch_info/switch_info.c +0 -78
  456. data/src/examples/switch_info/switch_info.conf +0 -3
  457. data/src/examples/switch_monitor/switch-monitor.conf +0 -3
  458. data/src/examples/switch_monitor/switch-monitor.rb +0 -56
  459. data/src/examples/switch_monitor/switch_monitor.c +0 -152
  460. data/src/examples/traffic_monitor/counter.c +0 -72
  461. data/src/examples/traffic_monitor/counter.h +0 -46
  462. data/src/examples/traffic_monitor/counter.rb +0 -44
  463. data/src/examples/traffic_monitor/fdb.c +0 -74
  464. data/src/examples/traffic_monitor/fdb.h +0 -48
  465. data/src/examples/traffic_monitor/fdb.rb +0 -42
  466. data/src/examples/traffic_monitor/traffic-monitor.rb +0 -98
  467. data/src/examples/traffic_monitor/traffic_monitor.c +0 -161
  468. data/src/examples/traffic_monitor/traffic_monitor.conf +0 -16
  469. data/src/examples/transparent_firewall/README.md +0 -61
  470. data/src/examples/transparent_firewall/aggregated-delegated-afrinic.txt +0 -713
  471. data/src/examples/transparent_firewall/aggregated-delegated-apnic.txt +0 -3440
  472. data/src/examples/transparent_firewall/aggregated-delegated-arin.txt +0 -11342
  473. data/src/examples/transparent_firewall/aggregated-delegated-lacnic.txt +0 -1937
  474. data/src/examples/transparent_firewall/aggregated-delegated-ripencc.txt +0 -7329
  475. data/src/examples/transparent_firewall/block-rfc1918.rb +0 -86
  476. data/src/examples/transparent_firewall/pass-delegated.rb +0 -178
  477. data/src/examples/transparent_firewall/regen_aggregated.sh +0 -53
  478. data/src/examples/transparent_firewall/stats-to-cidrs.rb +0 -59
  479. data/src/lib/arp.h +0 -64
  480. data/src/lib/bool.h +0 -47
  481. data/src/lib/buffer.c +0 -304
  482. data/src/lib/buffer.h +0 -54
  483. data/src/lib/byteorder.c +0 -571
  484. data/src/lib/byteorder.h +0 -108
  485. data/src/lib/checks.h +0 -40
  486. data/src/lib/chibach.c +0 -392
  487. data/src/lib/chibach.h +0 -69
  488. data/src/lib/chibach_private.c +0 -168
  489. data/src/lib/chibach_private.h +0 -50
  490. data/src/lib/daemon.c +0 -429
  491. data/src/lib/daemon.h +0 -40
  492. data/src/lib/doubly_linked_list.c +0 -284
  493. data/src/lib/doubly_linked_list.h +0 -86
  494. data/src/lib/ether.c +0 -47
  495. data/src/lib/ether.h +0 -92
  496. data/src/lib/etherip.h +0 -44
  497. data/src/lib/event_forward_interface.c +0 -788
  498. data/src/lib/event_forward_interface.h +0 -138
  499. data/src/lib/event_handler.c +0 -419
  500. data/src/lib/event_handler.h +0 -57
  501. data/src/lib/external_callback.c +0 -126
  502. data/src/lib/external_callback.h +0 -46
  503. data/src/lib/hash_table.c +0 -415
  504. data/src/lib/hash_table.h +0 -136
  505. data/src/lib/icmp.h +0 -72
  506. data/src/lib/igmp.h +0 -48
  507. data/src/lib/ipv4.h +0 -64
  508. data/src/lib/ipv6.h +0 -46
  509. data/src/lib/linked_list.c +0 -244
  510. data/src/lib/linked_list.h +0 -84
  511. data/src/lib/log.c +0 -636
  512. data/src/lib/log.h +0 -77
  513. data/src/lib/management_interface.c +0 -359
  514. data/src/lib/management_interface.h +0 -40
  515. data/src/lib/management_service_interface.c +0 -102
  516. data/src/lib/management_service_interface.h +0 -134
  517. data/src/lib/match.h +0 -82
  518. data/src/lib/match_table.c +0 -606
  519. data/src/lib/match_table.h +0 -49
  520. data/src/lib/message_queue.c +0 -143
  521. data/src/lib/message_queue.h +0 -59
  522. data/src/lib/messenger.c +0 -1821
  523. data/src/lib/messenger.h +0 -145
  524. data/src/lib/openflow_application_interface.c +0 -1800
  525. data/src/lib/openflow_application_interface.h +0 -359
  526. data/src/lib/openflow_message.c +0 -4240
  527. data/src/lib/openflow_message.h +0 -291
  528. data/src/lib/openflow_service_interface.h +0 -58
  529. data/src/lib/openflow_switch_interface.c +0 -1378
  530. data/src/lib/openflow_switch_interface.h +0 -262
  531. data/src/lib/packet_info.c +0 -336
  532. data/src/lib/packet_info.h +0 -233
  533. data/src/lib/packet_parser.c +0 -522
  534. data/src/lib/packetin_filter_interface.c +0 -292
  535. data/src/lib/packetin_filter_interface.h +0 -125
  536. data/src/lib/persistent_storage.c +0 -478
  537. data/src/lib/persistent_storage.h +0 -44
  538. data/src/lib/secure_channel.c +0 -496
  539. data/src/lib/secure_channel.h +0 -43
  540. data/src/lib/stat.c +0 -248
  541. data/src/lib/stat.h +0 -51
  542. data/src/lib/tcp.h +0 -62
  543. data/src/lib/timer.c +0 -349
  544. data/src/lib/timer.h +0 -51
  545. data/src/lib/trema.c +0 -776
  546. data/src/lib/trema.h +0 -80
  547. data/src/lib/trema.hpp +0 -49
  548. data/src/lib/trema_private.c +0 -175
  549. data/src/lib/trema_private.h +0 -64
  550. data/src/lib/trema_wrapper.c +0 -59
  551. data/src/lib/trema_wrapper.h +0 -66
  552. data/src/lib/udp.h +0 -41
  553. data/src/lib/utility.c +0 -625
  554. data/src/lib/utility.h +0 -84
  555. data/src/lib/wrapper.c +0 -121
  556. data/src/lib/wrapper.h +0 -76
  557. data/src/management/application.c +0 -222
  558. data/src/management/echo.c +0 -183
  559. data/src/management/set_logging_level.c +0 -151
  560. data/src/management/show_stats.c +0 -148
  561. data/src/management/trema_manager +0 -184
  562. data/src/packetin_filter/README +0 -17
  563. data/src/packetin_filter/packetin_filter.c +0 -575
  564. data/src/switch_manager/README +0 -20
  565. data/src/switch_manager/cookie_table.c +0 -290
  566. data/src/switch_manager/cookie_table.h +0 -70
  567. data/src/switch_manager/dpid_table.c +0 -108
  568. data/src/switch_manager/dpid_table.h +0 -43
  569. data/src/switch_manager/event_forward_entry_manipulation.c +0 -120
  570. data/src/switch_manager/event_forward_entry_manipulation.h +0 -31
  571. data/src/switch_manager/ofpmsg_recv.c +0 -497
  572. data/src/switch_manager/ofpmsg_recv.h +0 -39
  573. data/src/switch_manager/ofpmsg_send.c +0 -274
  574. data/src/switch_manager/ofpmsg_send.h +0 -51
  575. data/src/switch_manager/secure_channel_listener.c +0 -296
  576. data/src/switch_manager/secure_channel_listener.h +0 -40
  577. data/src/switch_manager/secure_channel_receiver.c +0 -129
  578. data/src/switch_manager/secure_channel_receiver.h +0 -40
  579. data/src/switch_manager/secure_channel_sender.c +0 -131
  580. data/src/switch_manager/secure_channel_sender.h +0 -41
  581. data/src/switch_manager/service_interface.c +0 -180
  582. data/src/switch_manager/service_interface.h +0 -44
  583. data/src/switch_manager/switch.c +0 -988
  584. data/src/switch_manager/switch.h +0 -50
  585. data/src/switch_manager/switch_manager.c +0 -643
  586. data/src/switch_manager/switch_manager.h +0 -65
  587. data/src/switch_manager/switch_option.c +0 -30
  588. data/src/switch_manager/switch_option.h +0 -41
  589. data/src/switch_manager/switchinfo.h +0 -81
  590. data/src/switch_manager/xid_table.c +0 -182
  591. data/src/switch_manager/xid_table.h +0 -53
  592. data/src/tremashark/README +0 -79
  593. data/src/tremashark/packet_capture.c +0 -358
  594. data/src/tremashark/pcap_private.h +0 -45
  595. data/src/tremashark/pcap_queue.c +0 -195
  596. data/src/tremashark/pcap_queue.h +0 -56
  597. data/src/tremashark/plugin/.gitignore +0 -6
  598. data/src/tremashark/plugin/packet-trema/.gitignore +0 -5
  599. data/src/tremashark/plugin/packet-trema/Makefile +0 -77
  600. data/src/tremashark/plugin/packet-trema/Makefile.am +0 -110
  601. data/src/tremashark/plugin/packet-trema/Makefile.common +0 -29
  602. data/src/tremashark/plugin/packet-trema/moduleinfo.h +0 -39
  603. data/src/tremashark/plugin/packet-trema/packet-trema.c +0 -1671
  604. data/src/tremashark/plugin/packet-trema/plugin.c +0 -31
  605. data/src/tremashark/plugin/user_dlts +0 -2
  606. data/src/tremashark/queue.c +0 -167
  607. data/src/tremashark/queue.h +0 -58
  608. data/src/tremashark/stdin_relay.c +0 -257
  609. data/src/tremashark/syslog_relay.c +0 -247
  610. data/src/tremashark/tremashark.c +0 -554
  611. data/trema +0 -11
  612. data/trema-config +0 -11
  613. data/unittests/buffer_stubs.c +0 -72
  614. data/unittests/cmockery_trema.c +0 -121
  615. data/unittests/cmockery_trema.h +0 -95
  616. data/unittests/lib/buffer_test.c +0 -368
  617. data/unittests/lib/byteorder_test.c +0 -1798
  618. data/unittests/lib/daemon_test.c +0 -804
  619. data/unittests/lib/doubly_linked_list_test.c +0 -348
  620. data/unittests/lib/ether_test.c +0 -125
  621. data/unittests/lib/event_forward_interface_test.c +0 -1676
  622. data/unittests/lib/external_callback_test.c +0 -282
  623. data/unittests/lib/hash_table_test.c +0 -278
  624. data/unittests/lib/linked_list_test.c +0 -434
  625. data/unittests/lib/log_test.c +0 -672
  626. data/unittests/lib/management_interface_test.c +0 -238
  627. data/unittests/lib/management_service_interface_test.c +0 -317
  628. data/unittests/lib/match_table_test.c +0 -1507
  629. data/unittests/lib/message_queue_test.c +0 -381
  630. data/unittests/lib/messenger_test.c +0 -623
  631. data/unittests/lib/openflow_application_interface_test.c +0 -3713
  632. data/unittests/lib/openflow_message_test.c +0 -8047
  633. data/unittests/lib/packet_info_test.c +0 -558
  634. data/unittests/lib/packet_parser_test.c +0 -784
  635. data/unittests/lib/packetin_filter_interface_test.c +0 -721
  636. data/unittests/lib/persistent_storage_test.c +0 -800
  637. data/unittests/lib/stat_test.c +0 -433
  638. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  639. data/unittests/lib/test_packets/arp_req.cap +0 -0
  640. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  641. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  642. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  643. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  644. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  645. data/unittests/lib/test_packets/ipx.cap +0 -0
  646. data/unittests/lib/test_packets/lldp.cap +0 -0
  647. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  648. data/unittests/lib/test_packets/rarp_req.cap +0 -0
  649. data/unittests/lib/test_packets/tcp.cap +0 -0
  650. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  651. data/unittests/lib/test_packets/udp.cap +0 -0
  652. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  653. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  654. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  655. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  656. data/unittests/lib/timer_test.c +0 -246
  657. data/unittests/lib/trema_private_test.c +0 -321
  658. data/unittests/lib/trema_test.c +0 -1030
  659. data/unittests/lib/utility_test.c +0 -711
  660. data/unittests/lib/wrapper_test.c +0 -228
  661. data/unittests/packetin_filter/packetin_filter_test.c +0 -476
  662. data/unittests/switch_manager/switch_manager_test.c +0 -1183
  663. data/unittests/wrapper_stubs.c +0 -37
  664. data/vendor/.gitignore +0 -6
  665. data/vendor/README.md +0 -29
  666. data/vendor/cmockery-20110428.tar.gz +0 -0
  667. data/vendor/oflops-0.03.trema1.tar.gz +0 -0
  668. data/vendor/oflops_no_snmp+1.0.0.diff +0 -340
  669. data/vendor/openflow-1.0.0.tar.gz +0 -0
  670. data/vendor/openflow.git.tar.gz +0 -0
  671. data/vendor/openvswitch-1.2.2.trema1.tar.gz +0 -0
  672. data/vendor/openvswitch-1.2.2_librt-check.diff +0 -21
  673. data/vendor/packet-openflow.diff +0 -13
  674. data/vendor/ruby-ifconfig-1.2/COPYING +0 -340
  675. data/vendor/ruby-ifconfig-1.2/Changelog +0 -16
  676. data/vendor/ruby-ifconfig-1.2/INSTALL +0 -239
  677. data/vendor/ruby-ifconfig-1.2/README +0 -38
  678. data/vendor/ruby-ifconfig-1.2/Rakefile +0 -14
  679. data/vendor/ruby-ifconfig-1.2/TODO +0 -8
  680. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +0 -17
  681. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +0 -10
  682. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +0 -14
  683. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +0 -17
  684. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +0 -24
  685. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +0 -60
  686. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +0 -20
  687. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +0 -10
  688. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +0 -36
  689. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +0 -10
  690. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +0 -71
  691. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +0 -72
  692. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +0 -69
  693. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +0 -3
  694. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +0 -84
  695. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +0 -130
  696. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +0 -49
  697. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +0 -43
  698. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +0 -112
  699. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +0 -55
  700. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +0 -38
  701. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +0 -77
  702. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +0 -4
  703. data/vendor/ruby-ifconfig-1.2/setup.rb +0 -1306
  704. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +0 -35
  705. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +0 -33
  706. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +0 -35
  707. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +0 -4
  708. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +0 -31
  709. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +0 -33
  710. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +0 -33
  711. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +0 -35
  712. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +0 -40
  713. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +0 -39
  714. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +0 -40
  715. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +0 -49
  716. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +0 -39
  717. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +0 -39
  718. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +0 -44
@@ -1,29 +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
- # the name of the plugin
18
- PLUGIN_NAME = trema
19
-
20
- # the dissector sources (without any helpers)
21
- DISSECTOR_SRC = packet-trema.c
22
-
23
- # corresponding headers
24
- DISSECTOR_INCLUDES =
25
-
26
- # Dissector helpers. They're included in the source files in this
27
- # directory, but they're not dissectors themselves, i.e. they're not
28
- # used to generate "register.c").
29
- DISSECTOR_SUPPORT_SRC =
@@ -1,39 +0,0 @@
1
- /*
2
- * Package name and version definition of tremashark
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
- #ifdef PACKAGE
22
- #undef PACKAGE
23
- #endif
24
-
25
- #define PACKAGE "trema"
26
-
27
- #ifdef VERSION
28
- #undef VERSION
29
- #endif
30
-
31
- #define VERSION "0.1.1"
32
-
33
-
34
- /*
35
- * Local variables:
36
- * c-basic-offset: 2
37
- * indent-tabs-mode: nil
38
- * End:
39
- */
@@ -1,1671 +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
- #ifdef HAVE_CONFIG_H
20
- #include "config.h"
21
- #endif
22
-
23
- #include <stdio.h>
24
- #include <stdlib.h>
25
- #include <glib.h>
26
- #include <epan/emem.h>
27
- #include <epan/packet.h>
28
- #include <epan/dissectors/packet-tcp.h>
29
- #include <epan/prefs.h>
30
- #include <epan/ipproto.h>
31
- #include <epan/etypes.h>
32
- #include <epan/addr_resolv.h>
33
- #include <epan/reassemble.h>
34
- #include <pcap/pcap.h>
35
- #include <string.h>
36
- #include <arpa/inet.h>
37
- #include "messenger.h"
38
- #include "openflow_service_interface.h"
39
-
40
-
41
- #define PROTO_TAG_TREMA "TREMA"
42
-
43
- #define NO_STRINGS NULL
44
- #define NO_MASK 0x0
45
-
46
- #define UDP_PORT_SYSLOG 514
47
-
48
- // Macro for debug use
49
- //#define PRINTF( ... ) printf( __VA_ARGS__ )
50
- #define PRINTF( ... )
51
-
52
-
53
- // Wireshark ID
54
- static int proto_trema = -1;
55
- //static dissector_handle_t trema_handle;
56
- static void dissect_trema( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree );
57
-
58
-
59
- // Structure defined in tremashark.c
60
- typedef struct message_pcap_dump_header {
61
- uint16_t dump_type;
62
- struct {
63
- uint32_t sec;
64
- uint32_t nsec;
65
- } sent_time;
66
- uint16_t app_name_len;
67
- uint16_t service_name_len;
68
- uint32_t data_len;
69
- } __attribute__( ( packed ) ) message_pcap_dump_header;
70
-
71
- typedef struct stream_id {
72
- gchar *app_name;
73
- guint16 app_name_length;
74
- gchar *service_name;
75
- guint16 service_name_length;
76
- } stream_id;
77
-
78
- // Fragmented stream information
79
- typedef struct fragmented_stream_info {
80
- stream_id stream_name; // app name and service name pair
81
- gint32 unreceived_length; // unreceived length
82
- guint32 message_length; // expected message length
83
- guint32 reassemble_id; // unique id for reassembling
84
- guint32 number; // fragment count of the stream. start from 0.
85
- gboolean temporary_length; // set TRUE until it received message_header.
86
- } fragmented_stream_info;
87
-
88
- // Packet status information
89
- typedef struct packet_status_info {
90
- guint32 packet_number;
91
- guint32 reassemble_id;
92
- } packet_status_info;
93
-
94
-
95
- // OpenFlow dissector
96
- static dissector_handle_t openflow_handle = NULL;
97
-
98
- // Ethernet dissector
99
- static dissector_handle_t ethernet_handle = NULL;
100
-
101
- // PPP dissector
102
- static dissector_handle_t ppp_handle = NULL;
103
-
104
- // IPv4 dissector
105
- static dissector_handle_t ip_handle = NULL;
106
-
107
- // Linux SLL dissector table
108
- static dissector_table_t sll_dissector_table = NULL;
109
-
110
- // UDP dissector table
111
- static dissector_table_t udp_dissector_table = NULL;
112
-
113
- // Fragment tables
114
- static GHashTable *trema_fragment_table = NULL;
115
- static GHashTable *trema_reassembled_table = NULL;
116
-
117
- // Fragment status list
118
- static GList *fragments_status = NULL;
119
- static packet_status_info **packets_status = NULL;
120
- static guint32 packets_status_size = 0; // allocated element count of packets_status;
121
-
122
- // Header fields
123
- static gint hf_dump_header = -1;
124
- static gint hf_dump_type = -1;
125
- static gint hf_dump_event_time = -1;
126
- static gint hf_dump_app_name_length = -1;
127
- static gint hf_dump_service_name_length = -1;
128
- static gint hf_dump_data_length = -1;
129
- static gint hf_dump_app_name = -1;
130
- static gint hf_dump_service_name = -1;
131
- static gint hf_message_header = -1;
132
- static gint hf_version = -1;
133
- static gint hf_message_type = -1;
134
- static gint hf_tag = -1;
135
- static gint hf_message_length = -1;
136
- static gint hf_service_header = -1;
137
- static gint hf_context_handle = -1;
138
- static gint hf_datapath_id = -1;
139
- static gint hf_service_name_length = -1;
140
- static gint hf_service_name = -1;
141
- static gint hf_transaction_id = -1;
142
- static gint hf_hex_dump = -1;
143
- static gint hf_pcap_dump_header = -1;
144
- static gint hf_pcap_dump_datalink = -1;
145
- static gint hf_pcap_dump_interface = -1;
146
- static gint hf_pcap_pkthdr = -1;
147
- static gint hf_pcap_pkthdr_ts = -1;
148
- static gint hf_pcap_pkthdr_caplen = -1;
149
- static gint hf_pcap_pkthdr_len = -1;
150
- static gint hf_syslog_dump_header = -1;
151
- static gint hf_syslog_dump_receive_time = -1;
152
- static gint hf_syslog_dump_message = -1;
153
- static gint hf_text_dump_header = -1;
154
- static gint hf_text_dump_receive_time = -1;
155
- static gint hf_text_dump_string = -1;
156
-
157
- // Subtrees
158
- static gint ett_trema = -1;
159
- static gint ett_dump_header = -1;
160
- static gint ett_message_header = -1;
161
- static gint ett_service_header = -1;
162
- static gint ett_context_handle = -1;
163
- static gint ett_pcap_dump_header = -1;
164
- static gint ett_pcap_pkthdr = -1;
165
- static gint ett_syslog_dump_header = -1;
166
- static gint ett_text_dump_header = -1;
167
-
168
- // Fragment subtrees
169
- static gint ett_trema_fragment = -1;
170
- static gint ett_trema_fragments = -1;
171
-
172
- // Fragment fields
173
- static int hf_trema_fragments = -1;
174
- static int hf_trema_fragment = -1;
175
- static int hf_trema_fragment_overlap = -1;
176
- static int hf_trema_fragment_overlap_conflict = -1;
177
- static int hf_trema_fragment_multiple_tails = -1;
178
- static int hf_trema_fragment_too_long_fragment = -1;
179
- static int hf_trema_fragment_error = -1;
180
- #ifndef WIRESHARK_VERSION_OLDER_THAN_160
181
- static int hf_trema_fragment_count = -1;
182
- #endif
183
-
184
- // Reassembled in field
185
- static int hf_trema_reassembled_in = -1;
186
-
187
- // Reassembled length field
188
- static int hf_trema_reassembled_length = -1;
189
-
190
-
191
- enum {
192
- MESSAGE_TYPE_NOTIFY,
193
- MESSAGE_TYPE_REQUEST,
194
- MESSAGE_TYPE_REPLY,
195
- };
196
-
197
-
198
- // Names to bind to various values in the type field
199
- static const value_string names_dump_type[] = {
200
- { MESSENGER_DUMP_SENT, "Sent" },
201
- { MESSENGER_DUMP_RECEIVED, "Received" },
202
- { MESSENGER_DUMP_RECV_CONNECTED, "Receive Connected" },
203
- { MESSENGER_DUMP_RECV_OVERFLOW, "Receive Overflow" },
204
- { MESSENGER_DUMP_RECV_CLOSED, "Receive Closed" },
205
- { MESSENGER_DUMP_SEND_CONNECTED, "Send Connected" },
206
- { MESSENGER_DUMP_SEND_REFUSED, "Send Refused" },
207
- { MESSENGER_DUMP_SEND_OVERFLOW, "Send Overflow" },
208
- { MESSENGER_DUMP_SEND_CLOSED, "Send Closed" },
209
- { MESSENGER_DUMP_LOGGER, "Log Message" },
210
- { MESSENGER_DUMP_PCAP, "Packet Capture" },
211
- { MESSENGER_DUMP_SYSLOG, "Syslog" },
212
- { MESSENGER_DUMP_TEXT, "Text" },
213
- { 0, NULL },
214
- };
215
-
216
- static const value_string names_message_type[] = {
217
- { MESSAGE_TYPE_NOTIFY, "Notify" },
218
- { MESSAGE_TYPE_REQUEST, "Request" },
219
- { MESSAGE_TYPE_REPLY, "Reply" },
220
- { 0, NULL },
221
- };
222
-
223
- static const value_string names_service_tag[] = {
224
- { MESSENGER_OPENFLOW_MESSAGE, "OpenFlow Message" },
225
- { MESSENGER_OPENFLOW_CONNECTED, "Switch Connected" },
226
- { MESSENGER_OPENFLOW_READY, "Switch Ready" },
227
- { MESSENGER_OPENFLOW_DISCONNECTED, "Switch Disconnected" },
228
- { MESSENGER_OPENFLOW_FAILD_TO_CONNECT, "Switch Failed to connect" },
229
- { 0, NULL },
230
- };
231
-
232
- // Names to bind to various datalink type values
233
- static const value_string names_datalink_type[] = {
234
- { DLT_EN10MB, "Ethernet (10Mb)" },
235
- { DLT_PPP, "Point-to-point protocol" },
236
- { DLT_RAW, "Raw IP" },
237
- { DLT_LINUX_SLL, "Linux cooked sockets" },
238
- { 0, NULL },
239
- };
240
-
241
- static const fragment_items trema_fragment_items = {
242
- // Fragment subtrees
243
- &ett_trema_fragment,
244
- &ett_trema_fragments,
245
- // Fragment fields
246
- &hf_trema_fragments,
247
- &hf_trema_fragment,
248
- &hf_trema_fragment_overlap,
249
- &hf_trema_fragment_overlap_conflict,
250
- &hf_trema_fragment_multiple_tails,
251
- &hf_trema_fragment_too_long_fragment,
252
- &hf_trema_fragment_error,
253
- #ifndef WIRESHARK_VERSION_OLDER_THAN_160
254
- &hf_trema_fragment_count,
255
- #endif
256
- // Reassembled in field
257
- &hf_trema_reassembled_in,
258
- // Reassembled length field
259
- &hf_trema_reassembled_length,
260
- // Tag
261
- "Trema fragments"
262
- };
263
-
264
-
265
- /** Check the status whether the packet_number exists.
266
- *
267
- * return TRUE when it exists.
268
- */
269
- static gboolean
270
- check_packet_status( guint32 packet_number ) {
271
- if ( packet_number == 0 || packet_number > packets_status_size ) {
272
- return FALSE;
273
- }
274
-
275
- if ( packets_status[ packet_number - 1 ] ) {
276
- return TRUE;
277
- }
278
- return FALSE;
279
- }
280
-
281
-
282
- /** Update packet_status
283
- *
284
- * This function would overwrite information when any data already exists.
285
- */
286
- static void
287
- update_packet_status( guint32 packet_number, guint32 reassemble_id ) {
288
- const guint32 PACKET_STATUS_CHUNK_SIZE = 1000;
289
-
290
- guint32 current_size = packets_status_size;
291
- packet_status_info *p = NULL;
292
-
293
- // This should use '>=' to keep NULL termination for free.
294
- while ( packet_number >= packets_status_size ) {
295
- packets_status_size += PACKET_STATUS_CHUNK_SIZE;
296
- }
297
-
298
- if ( packets_status_size > current_size ) {
299
- // extend pointer table
300
- packet_status_info **new_table_buffer = g_malloc( packets_status_size * sizeof( packet_status_info * ) );
301
- memset( new_table_buffer, 0, packets_status_size * sizeof( packet_status_info * ) );
302
- if ( packets_status != NULL ) {
303
- memcpy( ( void * ) new_table_buffer, ( void * ) packets_status, current_size * sizeof( packet_status_info * ) );
304
- g_free( packets_status );
305
- }
306
- packets_status = new_table_buffer;
307
- }
308
-
309
- if ( packets_status[ packet_number - 1 ] == NULL ) {
310
- packets_status[ packet_number - 1 ] = g_malloc( sizeof( packet_status_info ) );
311
- }
312
- p = packets_status[ packet_number - 1 ];
313
- p->packet_number = packet_number;
314
- p->reassemble_id = reassemble_id;
315
- }
316
-
317
-
318
- /** Get packet status information
319
- */
320
- static packet_status_info *
321
- get_packet_status( guint32 packet_number ) {
322
- packet_status_info *p = NULL;
323
-
324
- if ( check_packet_status( packet_number ) ) {
325
- p = packets_status[ packet_number - 1 ];
326
- }
327
-
328
- return p;
329
- }
330
-
331
-
332
- /** Clear packet status
333
- */
334
- static void
335
- clear_packet_status() {
336
- if ( packets_status != NULL ) {
337
- guint count;
338
-
339
- for ( count = 0; count < packets_status_size; count++ ) {
340
- if ( packets_status[ count ] ) {
341
- g_free( packets_status[ count ] );
342
- }
343
- }
344
- g_free( packets_status );
345
- packets_status = NULL;
346
- packets_status_size = 0;
347
- }
348
- }
349
-
350
-
351
- /** Get app name and service name, this pair can be used as stream name.
352
- */
353
- static void
354
- get_stream_id( tvbuff_t *tvb, stream_id *stream_name ) {
355
- assert( tvb != NULL );
356
- assert( stream_name != NULL );
357
-
358
- stream_name->app_name_length = tvb_get_ntohs( tvb, offsetof( message_pcap_dump_header, app_name_len ) );
359
- stream_name->app_name = tvb_format_text( tvb, sizeof( message_pcap_dump_header ), stream_name->app_name_length - 1 );
360
- stream_name->service_name_length = tvb_get_ntohs( tvb, offsetof( message_pcap_dump_header, service_name_len ) );
361
- stream_name->service_name = tvb_format_text( tvb, sizeof( message_pcap_dump_header ) + stream_name->app_name_length,
362
- stream_name->service_name_length - 1 );
363
- }
364
-
365
-
366
- /** Generate a unique reassemble_id.
367
- */
368
- static guint32
369
- generate_reassemble_id() {
370
- guint32 new_id = 1; // The lowest id is 1, 0 means non fragmentation
371
-
372
- if ( packets_status != NULL ) {
373
- guint count;
374
-
375
- for ( count = 0; count < packets_status_size; count++ ) {
376
- if ( packets_status[ count ] ) {
377
- packet_status_info *p = packets_status[ count ];
378
- if ( new_id == p->reassemble_id ) {
379
- new_id++;
380
- count = 0;
381
- continue;
382
- }
383
- }
384
- }
385
- }
386
-
387
- return new_id;
388
- }
389
-
390
-
391
- /** Confirm status of fragment whether it received enough fragments or not.
392
- *
393
- * return TRUE if the stream information indicates it needs more fragment,
394
- * FALSE means the stream has enough fragments, it can be reassembled.
395
- */
396
- static gboolean
397
- is_last_fragment( fragmented_stream_info *fragment_info ) {
398
- assert( fragment_info != NULL );
399
-
400
- if ( fragment_info->unreceived_length <= 0 ) {
401
- return FALSE;
402
- }
403
- return TRUE;
404
- }
405
-
406
-
407
- /** Trim a message from packet payload.
408
- *
409
- * 'offset' points at message header.
410
- * Return new subset tvbuff of a message.
411
- * If given tvb is not enough length, return NULL.
412
- */
413
- static tvbuff_t *
414
- trim_message( tvbuff_t *tvb, gint offset ) {
415
- guint32 length = tvb_length( tvb );
416
- guint32 message_length;
417
-
418
- assert( tvb != NULL );
419
-
420
- if ( length < sizeof( message_header ) ) {
421
- PRINTF( "trim() failed length %d\n", length );
422
- return NULL;
423
- }
424
- message_length = tvb_get_ntohl( tvb, offset + offsetof( message_header, message_length ) );
425
- if ( length < message_length ) {
426
- PRINTF( "trim() failed length %d message_length %d\n", length, message_length );
427
- return NULL;
428
- }
429
- return tvb_new_subset( tvb, offset, message_length, message_length );
430
- }
431
-
432
-
433
- /** Get fragmented_stream_info from the current fragments_status by stream_name.
434
- */
435
- static fragmented_stream_info *
436
- get_fragmented_stream_info( stream_id *stream_name ) {
437
- GList *element;
438
-
439
- assert( stream_name != NULL );
440
-
441
- if ( fragments_status == NULL ) {
442
- return NULL;
443
- }
444
-
445
- for ( element = g_list_first( fragments_status ); element != NULL; element = element->next ) {
446
- if ( element->data != NULL ) {
447
- fragmented_stream_info *fragment_info = element->data;
448
- if ( strncmp( fragment_info->stream_name.app_name, stream_name->app_name, stream_name->app_name_length - 1 ) == 0 &&
449
- strncmp( fragment_info->stream_name.service_name, stream_name->service_name, stream_name->service_name_length - 1 ) == 0 ) {
450
- return fragment_info;
451
- }
452
- }
453
- }
454
-
455
- return NULL;
456
- }
457
-
458
-
459
- /** Add a new fragmented stream information to fragment status list.
460
- *
461
- * 'offset' points at begging of messages.
462
- * return updated fragmented streasm info.
463
- */
464
- static fragmented_stream_info *
465
- add_fragmented_stream_info( tvbuff_t *tvb, gint offset, stream_id *stream_name ) {
466
- fragmented_stream_info *fragment_info;
467
-
468
- assert( tvb != NULL );
469
- assert( stream_name != NULL );
470
- assert( get_fragmented_stream_info( stream_name ) == NULL );
471
-
472
- PRINTF( " ** add_fragmented_stream_info\n" );
473
- guint32 received_message_length = tvb_length_remaining( tvb, offset );
474
- fragment_info = g_malloc( sizeof( fragmented_stream_info ) );
475
- fragment_info->stream_name.app_name = g_malloc( stream_name->app_name_length );
476
- memset( fragment_info->stream_name.app_name, 0, stream_name->app_name_length );
477
- strncpy( fragment_info->stream_name.app_name, stream_name->app_name, stream_name->app_name_length - 1 );
478
- fragment_info->stream_name.app_name_length = stream_name->app_name_length;
479
- fragment_info->stream_name.service_name = g_malloc( stream_name->service_name_length );
480
- memset( fragment_info->stream_name.service_name, 0, stream_name->service_name_length );
481
- strncpy( fragment_info->stream_name.service_name, stream_name->service_name, stream_name->service_name_length - 1 );
482
- fragment_info->stream_name.service_name_length = stream_name->service_name_length;
483
- if ( received_message_length < sizeof( message_header ) ) {
484
- /* this case cannot calculate message length until reassembling message_header.
485
- * we need next fragment to build whole message_header.
486
- */
487
- PRINTF( " - received stream is less than message_header\n" );
488
- fragment_info->message_length = sizeof( message_header );
489
- fragment_info->temporary_length = TRUE;
490
- }
491
- else {
492
- fragment_info->message_length = tvb_get_ntohl( tvb, offset + offsetof( message_header, message_length ) );
493
- fragment_info->temporary_length = FALSE;
494
- }
495
-
496
- fragment_info->unreceived_length = fragment_info->message_length - received_message_length;
497
- fragment_info->reassemble_id = generate_reassemble_id();
498
- fragment_info->number = 0;
499
-
500
- fragments_status = g_list_prepend( fragments_status, fragment_info );
501
-
502
- PRINTF( " - unreceived_length %d message_length %u reassemble_id %d\n",
503
- fragment_info->unreceived_length, fragment_info->message_length, fragment_info->reassemble_id );
504
-
505
- return fragment_info;
506
- }
507
-
508
-
509
- /** Reset fragmented stream information with reassembled message which includes message_header.
510
- * This function should be invoked when message_header is reassembled.
511
- *
512
- * return updated fragmented streasm info.
513
- */
514
- static fragmented_stream_info *
515
- reset_fragmented_stream_info( tvbuff_t *reassembled_tvb, fragmented_stream_info *fragment_info ) {
516
- guint32 received_message_length;
517
-
518
- assert( reassembled_tvb != NULL );
519
- assert( fragment_info != NULL );
520
- assert( fragment_info->temporary_length == TRUE );
521
-
522
- PRINTF( " ** reset_fragmented_stream_info reassemble_id %d\n", fragment_info->reassemble_id );
523
- received_message_length = tvb_reported_length( reassembled_tvb );
524
- assert( received_message_length >= sizeof( message_header ) );
525
-
526
- fragment_info->message_length = tvb_get_ntohl( reassembled_tvb, offsetof( message_header, message_length ) );
527
- fragment_info->unreceived_length = fragment_info->message_length - received_message_length;
528
- fragment_info->temporary_length = FALSE;
529
-
530
- PRINTF( " - unreceived_length %d message_length %u reassemble_id %d\n",
531
- fragment_info->unreceived_length, fragment_info->message_length, fragment_info->reassemble_id );
532
- return fragment_info;
533
- }
534
-
535
-
536
- /** Update fragment status list with new fragmented stream information.
537
- *
538
- * 'offset' points at beginning of inner message.
539
- * return updated fragmented streasm info.
540
- */
541
- static fragmented_stream_info *
542
- update_fragmented_stream_info( tvbuff_t *tvb, gint offset, fragmented_stream_info *fragment_info ) {
543
- assert( tvb != NULL );
544
- assert( fragment_info != NULL );
545
-
546
- PRINTF( " ** update_fragmented_stream_info reassemble_id %d\n", fragment_info->reassemble_id );
547
- fragment_info->unreceived_length -= tvb_reported_length_remaining( tvb, offset );
548
- fragment_info->number++;
549
- PRINTF( " - unreceived_length %d message_length %u reassemble_id %d\n",
550
- fragment_info->unreceived_length, fragment_info->message_length, fragment_info->reassemble_id );
551
- return fragment_info;
552
- }
553
-
554
-
555
- /** Inner function to remove fragmented stream information in dlist
556
- */
557
- static void
558
- free_fragmented_stream_info( fragmented_stream_info *info ) {
559
- if ( info != NULL ) {
560
- g_free( info->stream_name.app_name );
561
- g_free( info->stream_name.service_name );
562
- g_free( info );
563
- }
564
- }
565
-
566
-
567
- /** Inner function to remove fragmented stream information in dlist
568
- */
569
- static void
570
- delete_fragmented_stream_info( fragmented_stream_info *fragment_info ) {
571
- if ( fragment_info != NULL ) {
572
- fragments_status = g_list_remove( fragments_status, fragment_info );
573
- free_fragmented_stream_info( fragment_info );
574
- }
575
- }
576
-
577
-
578
- /** Remove a fragment stream information from fragment status list.
579
- */
580
- static gboolean
581
- remove_fragmented_stream_info( fragmented_stream_info *fragment_info ) {
582
- GList *element;
583
-
584
- assert( fragment_info != NULL );
585
-
586
- PRINTF( " ** remove_fragmented_stream_info reassemble_id %d\n", fragment_info->reassemble_id );
587
- if ( fragments_status == NULL ) {
588
- return FALSE;
589
- }
590
-
591
- element = g_list_find( fragments_status, fragment_info );
592
- if ( element == NULL ) {
593
- return FALSE;
594
- }
595
- delete_fragmented_stream_info( element->data );
596
-
597
- return TRUE;
598
- }
599
-
600
-
601
- static void
602
- clear_fragmented_stream_info_walker( gpointer fragment_info, gpointer user_data ) {
603
- if ( fragment_info != NULL ) {
604
- free_fragmented_stream_info( fragment_info );
605
- }
606
- }
607
-
608
-
609
- /** Clear all fragment status
610
- */
611
- static void
612
- clear_fragmented_stream_info() {
613
- PRINTF( " ** clear_fragmented_stream_info\n" );
614
-
615
- if ( fragments_status != NULL ) {
616
- g_list_foreach( fragments_status, clear_fragmented_stream_info_walker, NULL );
617
- g_list_free( fragments_status );
618
- fragments_status = NULL;
619
- }
620
- }
621
-
622
-
623
- /** Add a new fragmented message to hash table and reassemble the fragments if possible.
624
- *
625
- * 'offset' which point at beginning of message.
626
- * 'fragment_info' has fragment information of target stream.
627
- *
628
- * return NULL if there is not enough fragments yet.
629
- */
630
- static tvbuff_t *
631
- reassemble_message( tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree, fragmented_stream_info *fragment_info ) {
632
- packet_status_info *packet_status;
633
- gboolean save_fragmented;
634
- gboolean more_fragment;
635
- fragment_data *fragment_message;
636
- tvbuff_t *new_tvb;
637
-
638
- assert( tvb != NULL );
639
- assert( pinfo != NULL );
640
- assert( tree != NULL );
641
- assert( fragment_info != NULL );
642
-
643
- packet_status = get_packet_status( pinfo->fd->num );
644
- assert( packet_status != NULL );
645
-
646
- save_fragmented = pinfo->fragmented;
647
- more_fragment = is_last_fragment( fragment_info );
648
-
649
- pinfo->fragmented = TRUE;
650
- fragment_message = fragment_add_seq_next( tvb, offset, pinfo, packet_status->reassemble_id,
651
- trema_fragment_table, trema_reassembled_table,
652
- tvb_length_remaining( tvb, offset ), more_fragment );
653
-
654
- new_tvb = process_reassembled_data( tvb, offset, pinfo, "Reassembled Trema",
655
- fragment_message, &trema_fragment_items, NULL, tree );
656
-
657
- if ( fragment_message ) {
658
- // Reassembled
659
- col_append_str( pinfo->cinfo, COL_INFO, " (Message reassembled)" );
660
- PRINTF( " reassemble_message() reassembled\n" );
661
- }
662
- else {
663
- // Not last packet of reassembled
664
- col_append_fstr( pinfo->cinfo, COL_INFO, " (Message fragment %u)", fragment_info->number );
665
- PRINTF( " reassemble_message() not last packet\n" );
666
- }
667
-
668
- pinfo->fragmented = save_fragmented;
669
- return new_tvb;
670
- }
671
-
672
-
673
- /** Get reassembled message
674
- */
675
- static tvbuff_t *
676
- get_reassembled_message( tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree, stream_id *stream_name ) {
677
- unsigned int save_visited;
678
- gboolean save_fragmented;
679
- gboolean more_fragment;
680
- fragmented_stream_info *fragment_info;
681
- packet_status_info *packet_status = NULL;
682
- fragment_data *fragment_message = NULL;
683
- tvbuff_t *reassembled_tvb = NULL;
684
-
685
- assert( tvb != NULL );
686
- assert( pinfo != NULL );
687
- assert( tree != NULL );
688
- assert( stream_name != NULL );
689
-
690
- packet_status = get_packet_status( pinfo->fd->num );
691
- assert( packet_status != NULL );
692
-
693
- more_fragment = FALSE;
694
- fragment_info = get_fragmented_stream_info( stream_name );
695
- if ( fragment_info != NULL ) {
696
- if ( fragment_info->reassemble_id == packet_status->reassemble_id ) {
697
- // this fragment has not closed yet, it still needs more packets
698
- more_fragment = TRUE;
699
- }
700
- }
701
- save_visited = pinfo->fd->flags.visited;
702
- pinfo->fd->flags.visited = 1;
703
- save_fragmented = pinfo->fragmented;
704
- pinfo->fragmented = TRUE;
705
-
706
- fragment_message = fragment_add_seq_next( tvb, offset, pinfo, packet_status->reassemble_id,
707
- trema_fragment_table, trema_reassembled_table,
708
- tvb_length_remaining( tvb, offset ), more_fragment );
709
- reassembled_tvb = process_reassembled_data( tvb, offset, pinfo, "Reassembled Trema",
710
- fragment_message, &trema_fragment_items, NULL, tree );
711
-
712
- pinfo->fragmented = save_fragmented;
713
- pinfo->fd->flags.visited = save_visited;
714
-
715
- return reassembled_tvb;
716
- }
717
-
718
-
719
- /** Update fragment status and store fragmented stream in hash table.
720
- * if it can reassemble entire message, do it and removes the fragment information.
721
- *
722
- * return reassembled stream if possible, otherwise return NULL.
723
- */
724
- static tvbuff_t *
725
- update_fragment_status( tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree *tree,
726
- fragmented_stream_info *fragment_info, stream_id *stream_name ) {
727
- tvbuff_t *reassembled_tvb;
728
-
729
- assert( tvb != NULL );
730
- assert( pinfo != NULL );
731
- assert( tree != NULL );
732
- assert( ( fragment_info != NULL && stream_name == NULL ) ||
733
- ( fragment_info == NULL && stream_name != NULL ) );
734
-
735
- if ( fragment_info == NULL ) {
736
- fragment_info = add_fragmented_stream_info( tvb, offset, stream_name );
737
- }
738
- else {
739
- fragment_info = update_fragmented_stream_info( tvb, offset, fragment_info );
740
- }
741
- update_packet_status( pinfo->fd->num, fragment_info->reassemble_id );
742
- reassembled_tvb = reassemble_message( tvb, offset, pinfo, tree, fragment_info );
743
-
744
- if ( reassembled_tvb != NULL ) {
745
- // reassembled done
746
- if ( fragment_info->unreceived_length <= 0 &&
747
- fragment_info->temporary_length == TRUE ) {
748
- // reassembled one includes at least message_header
749
- fragment_info = reset_fragmented_stream_info( reassembled_tvb, fragment_info );
750
- }
751
-
752
- if ( fragment_info->unreceived_length <= 0 ) {
753
- // reassembled entire message
754
- remove_fragmented_stream_info( fragment_info );
755
- }
756
- else {
757
- // reassembled a part of message which includes header
758
-
759
- // store again the reassembled message as a first fragment of whole message
760
- reassemble_message( reassembled_tvb, 0, pinfo, tree, fragment_info );
761
- }
762
- }
763
-
764
- return reassembled_tvb;
765
- }
766
-
767
-
768
- static void
769
- init_trema_fragment() {
770
- // Initialize tables for reassembling
771
- fragment_table_init( &trema_fragment_table );
772
- reassembled_table_init( &trema_reassembled_table );
773
-
774
- // Clear fragment status information
775
- clear_fragmented_stream_info();
776
-
777
- // Clear packet status information
778
- clear_packet_status();
779
- }
780
-
781
-
782
- static gint
783
- dissect_message_pcap_dump_header( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree, guint16 *dump_type ) {
784
- /*
785
- +------------------------+--------+------------+----+
786
- |message_pcap_dump_header|app_name|service_name|data|
787
- +------------------------+--------+------------+----+
788
-
789
- typedef struct message_pcap_dump_header {
790
- uint16_t dump_type;
791
- struct {
792
- uint32_t sec;
793
- uint32_t nsec;
794
- } sent_time;
795
- uint16_t app_name_len;
796
- uint16_t service_name_len;
797
- uint32_t data_len;
798
- } __attribute__( ( packed ) ) message_pcap_dump_header;
799
- */
800
-
801
- gchar *src, *dst;
802
- gint offset = 0;
803
- *dump_type = tvb_get_ntohs( tvb, 0 );
804
- guint16 app_name_len = tvb_get_ntohs( tvb, offsetof( message_pcap_dump_header, app_name_len ) );
805
- guint16 service_name_len = tvb_get_ntohs( tvb, offsetof( message_pcap_dump_header, service_name_len ) );
806
-
807
- if ( check_col( pinfo->cinfo, COL_DEF_SRC ) ) {
808
- src = tvb_format_text( tvb, sizeof( message_pcap_dump_header ), app_name_len - 1 );
809
- if ( *dump_type != MESSENGER_DUMP_RECEIVED ) {
810
- col_add_str( pinfo->cinfo, COL_DEF_SRC, src );
811
- }
812
- }
813
-
814
- if ( check_col( pinfo->cinfo, COL_DEF_DST ) ) {
815
- dst = tvb_format_text( tvb, sizeof( message_pcap_dump_header ) + app_name_len, service_name_len - 1 );
816
- col_add_str( pinfo->cinfo, COL_DEF_DST, dst );
817
- }
818
-
819
- if ( check_col( pinfo->cinfo, COL_INFO ) ) {
820
- switch ( *dump_type ) {
821
- case MESSENGER_DUMP_SENT:
822
- case MESSENGER_DUMP_RECEIVED:
823
- case MESSENGER_DUMP_RECV_CONNECTED:
824
- case MESSENGER_DUMP_RECV_OVERFLOW:
825
- case MESSENGER_DUMP_RECV_CLOSED:
826
- case MESSENGER_DUMP_SEND_CONNECTED:
827
- case MESSENGER_DUMP_SEND_REFUSED:
828
- case MESSENGER_DUMP_SEND_OVERFLOW:
829
- case MESSENGER_DUMP_SEND_CLOSED:
830
- {
831
- if ( g_ascii_strcasecmp( src, dst ) == 0 ) {
832
- col_add_fstr( pinfo->cinfo, COL_INFO, "%s (%s)",
833
- src, names_dump_type[ *dump_type ].strptr );
834
- }
835
- else {
836
- col_add_fstr( pinfo->cinfo, COL_INFO, "%s > %s (%s)",
837
- src, dst, names_dump_type[ *dump_type ].strptr );
838
- }
839
- }
840
- break;
841
-
842
- case MESSENGER_DUMP_PCAP:
843
- {
844
- col_add_fstr( pinfo->cinfo, COL_INFO, "%s (%s)",
845
- src, names_dump_type[ *dump_type ].strptr );
846
- }
847
- break;
848
-
849
- case MESSENGER_DUMP_LOGGER:
850
- case MESSENGER_DUMP_SYSLOG:
851
- case MESSENGER_DUMP_TEXT:
852
- {
853
- col_add_fstr( pinfo->cinfo, COL_INFO, "(%s)", names_dump_type[ *dump_type ].strptr );
854
- }
855
- break;
856
- default:
857
- break;
858
- }
859
- }
860
-
861
- if ( trema_tree != NULL ) {
862
- proto_tree *dump_header_tree = NULL;
863
- proto_item *ti = NULL;
864
-
865
- offset = 0;
866
-
867
- ti = proto_tree_add_item( trema_tree, hf_dump_header, tvb, offset, 18, FALSE );
868
- dump_header_tree = proto_item_add_subtree( ti, ett_dump_header );
869
-
870
- proto_tree_add_item( dump_header_tree, hf_dump_type, tvb, offset, 2, FALSE );
871
- offset += 2;
872
- nstime_t sent_time;
873
- sent_time.secs = tvb_get_ntohl( tvb, offset );
874
- sent_time.nsecs = tvb_get_ntohl( tvb, offset + 4 );
875
- proto_tree_add_time( dump_header_tree, hf_dump_event_time, tvb, offset, 8, &sent_time );
876
- offset += 8;
877
- proto_tree_add_item( dump_header_tree, hf_dump_app_name_length, tvb, offset, 2, FALSE );
878
- guint16 app_name_len = tvb_get_ntohs( tvb, offset );
879
- offset += 2;
880
- proto_tree_add_item( dump_header_tree, hf_dump_service_name_length, tvb, offset, 2, FALSE );
881
- guint16 service_name_len = tvb_get_ntohs( tvb, offset );
882
- offset += 2;
883
- proto_tree_add_item( dump_header_tree, hf_dump_data_length, tvb, offset, 4, FALSE );
884
- offset += 4;
885
-
886
- if ( app_name_len > 0 ) {
887
- proto_tree_add_item( trema_tree, hf_dump_app_name, tvb, offset, app_name_len, FALSE );
888
- offset += app_name_len;
889
- }
890
- if ( service_name_len > 0 ) {
891
- proto_tree_add_item( trema_tree, hf_dump_service_name, tvb, offset, service_name_len, FALSE );
892
- offset += service_name_len;
893
- }
894
- }
895
-
896
- return offset;
897
- }
898
-
899
-
900
- static gint
901
- dissect_openflow_service_header( tvbuff_t *tvb, gint offset, proto_tree *trema_tree ) {
902
- gint head = offset;
903
-
904
- guint16 service_name_len = tvb_get_ntohs( tvb, offset + 8 );
905
-
906
- if ( trema_tree != NULL ) {
907
- proto_tree *service_header_tree = NULL;
908
- proto_item *ti = NULL;
909
-
910
- ti = proto_tree_add_item( trema_tree, hf_service_header, tvb, offset,
911
- sizeof( openflow_service_header_t ), FALSE );
912
- service_header_tree = proto_item_add_subtree( ti, ett_service_header );
913
-
914
- proto_tree_add_item( service_header_tree, hf_datapath_id, tvb, offset, 8, FALSE );
915
- offset += 8;
916
- proto_tree_add_item( service_header_tree, hf_service_name_length, tvb, offset, 2, FALSE );
917
- offset += 2;
918
- if ( service_name_len > 0 ) {
919
- proto_tree_add_item( service_header_tree, hf_service_name, tvb, offset, service_name_len, FALSE );
920
- offset += service_name_len;
921
- }
922
- }
923
-
924
- return ( offset - head );
925
- }
926
-
927
-
928
- static void
929
- dissect_openflow( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree ) {
930
- if ( openflow_handle != NULL ) {
931
- if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
932
- col_append_str( pinfo->cinfo, COL_PROTOCOL, "+" );
933
- }
934
-
935
- if ( check_col( pinfo->cinfo, COL_INFO ) ) {
936
- col_append_str( pinfo->cinfo, COL_INFO, " => " );
937
- }
938
-
939
- col_set_fence( pinfo->cinfo, COL_PROTOCOL );
940
- col_set_fence( pinfo->cinfo, COL_INFO );
941
-
942
- call_dissector( openflow_handle, tvb, pinfo, trema_tree );
943
- }
944
- else {
945
- // FIXME: do something here...
946
- }
947
- }
948
-
949
-
950
- static gint
951
- dissect_context_handle( tvbuff_t *tvb, gint offset, proto_tree *trema_tree ) {
952
- gint head = offset;
953
-
954
- guint16 service_name_len = tvb_get_ntohs( tvb, offset + 4 );
955
-
956
- if ( trema_tree != NULL ) {
957
- proto_tree *context_handle_tree = NULL;
958
- proto_item *ti = NULL;
959
-
960
- ti = proto_tree_add_item( trema_tree, hf_context_handle, tvb, offset,
961
- sizeof( messenger_context_handle ), FALSE );
962
- context_handle_tree = proto_item_add_subtree( ti, ett_context_handle );
963
-
964
- proto_tree_add_item( context_handle_tree, hf_transaction_id, tvb, offset, 4, FALSE );
965
- offset += 4;
966
- proto_tree_add_item( context_handle_tree, hf_service_name_length, tvb, offset, 2, FALSE );
967
- offset += 2;
968
- offset += 2; // padding
969
- if ( service_name_len > 0 ) {
970
- proto_tree_add_item( context_handle_tree, hf_service_name, tvb, offset, service_name_len, FALSE );
971
- offset += service_name_len;
972
- }
973
- }
974
-
975
- return ( offset - head );
976
- }
977
-
978
-
979
- static gint
980
- dissect_message_dump( tvbuff_t *tvb, gint offset, proto_tree *trema_tree ) {
981
- gint length = tvb_length_remaining( tvb, offset );
982
-
983
- assert( tvb != NULL );
984
- assert( trema_tree != NULL );
985
-
986
- PRINTF( "dissect_message_dump()\n" );
987
-
988
- if ( length > 0 ) {
989
- proto_tree_add_item( trema_tree, hf_hex_dump, tvb, offset, length, FALSE );
990
- }
991
-
992
- return length;
993
- }
994
-
995
-
996
- static gint
997
- dissect_message_dump_with_length( tvbuff_t *tvb, gint offset, gint length, proto_tree *trema_tree ) {
998
- gint remaining_length = tvb_length_remaining( tvb, offset );
999
-
1000
- assert( tvb != NULL );
1001
- assert( trema_tree != NULL );
1002
-
1003
- PRINTF( "dissect_message_dump()\n" );
1004
-
1005
- if ( remaining_length < length ) {
1006
- length = remaining_length;
1007
- }
1008
-
1009
- proto_tree_add_item( trema_tree, hf_hex_dump, tvb, offset, length, FALSE );
1010
-
1011
- return length;
1012
- }
1013
-
1014
-
1015
- static gint
1016
- dissect_message_header( tvbuff_t *tvb, packet_info *pinfo, gint offset, proto_tree *trema_tree ) {
1017
- /*
1018
- typedef struct message_header {
1019
- uint8_t version; // version = 0 (unused)
1020
- uint8_t message_type; // MESSAGE_TYPE_
1021
- uint16_t tag; // user defined
1022
- uint32_t message_length; // message length including header
1023
- uint8_t value[ 0 ];
1024
- } message_header;
1025
- */
1026
-
1027
- gint head = offset;
1028
- guint8 message_type = tvb_get_guint8( tvb, offset + 1 );
1029
- guint16 tag = tvb_get_ntohs( tvb, offset + 2 );
1030
- guint32 message_length = tvb_get_ntohl( tvb, offset + 4 );
1031
-
1032
- PRINTF( "dissect_message_header()\n" );
1033
-
1034
- if ( trema_tree != NULL ) {
1035
- proto_tree *message_header_tree = NULL;
1036
- proto_item *ti = NULL;
1037
-
1038
- ti = proto_tree_add_item( trema_tree, hf_message_header, tvb, offset,
1039
- sizeof( message_header ), FALSE );
1040
- message_header_tree = proto_item_add_subtree( ti, ett_message_header );
1041
-
1042
- proto_tree_add_item( message_header_tree, hf_version, tvb, offset, 1, FALSE );
1043
- offset += 1;
1044
- proto_tree_add_item( message_header_tree, hf_message_type, tvb, offset, 1, FALSE );
1045
- offset += 1;
1046
- proto_tree_add_item( message_header_tree, hf_tag, tvb, offset, 2, FALSE );
1047
- offset += 2;
1048
- proto_tree_add_item( message_header_tree, hf_message_length, tvb, offset, 4, FALSE );
1049
- offset += 4;
1050
-
1051
- if ( message_type == MESSAGE_TYPE_NOTIFY &&
1052
- tag >= MESSENGER_OPENFLOW_MESSAGE &&
1053
- tag <= MESSENGER_OPENFLOW_DISCONNECTED ) {
1054
- offset += dissect_openflow_service_header( tvb, offset, trema_tree );
1055
-
1056
- if ( tag == MESSENGER_OPENFLOW_MESSAGE && openflow_handle != NULL ) {
1057
- guint16 total_len = tvb_reported_length_remaining( tvb, offset );
1058
- if ( total_len > 0 ) {
1059
- tvbuff_t *next_tvb = tvb_new_subset( tvb, offset, -1, total_len );
1060
- dissect_openflow( next_tvb, pinfo, trema_tree );
1061
- }
1062
- offset += total_len;
1063
- }
1064
- }
1065
- else if ( message_type == MESSAGE_TYPE_REQUEST ||
1066
- message_type == MESSAGE_TYPE_REPLY ) {
1067
- offset += dissect_context_handle( tvb, offset, trema_tree );
1068
- }
1069
-
1070
- guint remaining_len = message_length - ( offset - head );
1071
- if ( remaining_len > 0 ) {
1072
- offset += dissect_message_dump_with_length( tvb, offset, remaining_len, trema_tree );
1073
- }
1074
- }
1075
-
1076
- return ( offset - head );
1077
- }
1078
-
1079
-
1080
- static void
1081
- dissect_trema_ipc( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *trema_tree,
1082
- gint offset, gboolean visited, stream_id *stream_name ) {
1083
- gint remaining_length = 0;
1084
- tvbuff_t *messages_tvb;
1085
- tvbuff_t *next_tvb;
1086
-
1087
- if ( visited ) {
1088
- packet_status_info *packet_status = NULL;
1089
-
1090
- PRINTF( " Known packet\n" );
1091
- // We have seen this packet
1092
- packet_status = get_packet_status( pinfo->fd->num );
1093
- assert( packet_status != NULL );
1094
-
1095
- if ( packet_status->reassemble_id != 0 ) {
1096
- // This is a part of fragment.
1097
- messages_tvb = get_reassembled_message( tvb, offset, pinfo, tree, stream_name );
1098
- if ( messages_tvb == NULL ) {
1099
- // We have not had all packets yet to reassemble this
1100
- dissect_message_dump( tvb, offset, trema_tree );
1101
- PRINTF( "----- end %u (known packet)\n", pinfo->fd->num );
1102
- return;
1103
- }
1104
- }
1105
- else {
1106
- messages_tvb = tvb_new_subset( tvb, offset, -1, -1 );
1107
- }
1108
-
1109
- offset = 0;
1110
- remaining_length = tvb_length_remaining( messages_tvb, offset );
1111
- while ( remaining_length > 0 ) {
1112
- next_tvb = trim_message( messages_tvb, offset );
1113
- if ( next_tvb == NULL ) {
1114
- dissect_message_dump( messages_tvb, offset, trema_tree );
1115
- break;
1116
- }
1117
- offset += tvb_length( next_tvb );
1118
- dissect_message_header( next_tvb, pinfo, 0, trema_tree );
1119
- remaining_length = tvb_length_remaining( messages_tvb, offset );
1120
- } // end of while
1121
-
1122
- PRINTF( "----- end %u (known packet, reassembled)\n", pinfo->fd->num );
1123
- return;
1124
- }
1125
-
1126
- messages_tvb = tvb;
1127
- remaining_length = tvb_length_remaining( messages_tvb, offset );
1128
- PRINTF( " received payload length %d\n", remaining_length );
1129
- while ( remaining_length > 0 ) {
1130
- fragmented_stream_info *fragment_info = get_fragmented_stream_info( stream_name );
1131
- if ( fragment_info != NULL ) {
1132
- // this stream is in fragmentated status
1133
- PRINTF( " In fragmented status\n" );
1134
-
1135
- dissect_message_dump( messages_tvb, offset, trema_tree );
1136
-
1137
- messages_tvb = update_fragment_status( messages_tvb, offset, pinfo, tree, fragment_info, NULL );
1138
- if ( messages_tvb != NULL ) {
1139
- offset = 0;
1140
- remaining_length = tvb_length_remaining( messages_tvb, offset );
1141
- }
1142
-
1143
- PRINTF( " unreceived_len %d remaining_len %d\n", fragment_info->unreceived_length, remaining_length );
1144
- if ( messages_tvb == NULL || fragment_info->unreceived_length > 0 ) {
1145
- // need more packet to reassemble
1146
- PRINTF( "----- end %u need more packet to reassemble\n", pinfo->fd->num );
1147
- return;
1148
- }
1149
- else {
1150
- // reassembled message
1151
- PRINTF( " reassembled message\n" );
1152
- next_tvb = trim_message( messages_tvb, offset );
1153
- assert( next_tvb != NULL );
1154
- offset += tvb_length( next_tvb );
1155
- }
1156
- }
1157
- else {
1158
- // Not in fragmented status
1159
- PRINTF( " Not in fragmented status\n" );
1160
-
1161
- if ( remaining_length < sizeof( message_header ) ) {
1162
- // Not enough data received to get message length
1163
- PRINTF( " Not enough data for message header remaining_length %d\n", remaining_length );
1164
- dissect_message_dump( messages_tvb, offset, trema_tree );
1165
- messages_tvb = update_fragment_status( messages_tvb, offset, pinfo, tree, NULL, stream_name );
1166
- offset += remaining_length;
1167
- PRINTF( "----- end %u (Not enough data for message header)\n", pinfo->fd->num );
1168
- return;
1169
- }
1170
- else {
1171
- guint32 message_length = tvb_get_ntohl( messages_tvb, offset + offsetof( message_header, message_length ) );
1172
-
1173
- if ( remaining_length < message_length ) {
1174
- // new fragment
1175
- dissect_message_dump( messages_tvb, offset, trema_tree );
1176
- messages_tvb = update_fragment_status( messages_tvb, offset, pinfo, tree, NULL, stream_name );
1177
- offset += remaining_length;
1178
- PRINTF( "----- end %u (new fragment)\n", pinfo->fd->num );
1179
- return;
1180
- }
1181
- else {
1182
- next_tvb = trim_message( messages_tvb, offset );
1183
- assert( next_tvb != NULL );
1184
- offset += tvb_length( next_tvb );
1185
- }
1186
- }
1187
- }
1188
-
1189
- dissect_message_header( next_tvb, pinfo, 0, trema_tree );
1190
-
1191
- remaining_length = tvb_length_remaining( messages_tvb, offset );
1192
- } // end of while
1193
- }
1194
-
1195
-
1196
- static gint
1197
- dissect_pcap_dump_header( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree, gint offset, guint32 *datalink ) {
1198
- /*
1199
- typedef struct pcap_dump_header {
1200
- uint32_t datalink;
1201
- uint8_t interface[ IF_NAMESIZE ];
1202
- } pcap_dump_header;
1203
- */
1204
- gint head = offset;
1205
-
1206
- *datalink = tvb_get_ntohl( tvb, offset );
1207
-
1208
- if ( trema_tree != NULL ) {
1209
- proto_tree *pcap_dump_header_tree = NULL;
1210
- proto_item *ti = NULL;
1211
-
1212
- ti = proto_tree_add_item( trema_tree, hf_pcap_dump_header, tvb, offset, sizeof( pcap_dump_header ), FALSE );
1213
- pcap_dump_header_tree = proto_item_add_subtree( ti, ett_pcap_dump_header );
1214
-
1215
- proto_tree_add_item( pcap_dump_header_tree, hf_pcap_dump_datalink, tvb, offset, 4, FALSE );
1216
- offset += 4;
1217
- proto_tree_add_item( pcap_dump_header_tree, hf_pcap_dump_interface, tvb, offset, IF_NAMESIZE, FALSE );
1218
- offset += IF_NAMESIZE;
1219
- }
1220
-
1221
- return ( offset - head );
1222
- }
1223
-
1224
-
1225
- static gint
1226
- dissect_pcap_pkthdr( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree, gint offset ) {
1227
- /*
1228
- struct pcap_pkthdr {
1229
- struct timeval ts;
1230
- bpf_u_int32 caplen;
1231
- bpf_u_int32 len;
1232
- };
1233
- */
1234
- gint head = offset;
1235
-
1236
- if ( trema_tree != NULL ) {
1237
- proto_tree *pcap_pkthdr_tree = NULL;
1238
- proto_item *ti = NULL;
1239
-
1240
- ti = proto_tree_add_item( trema_tree, hf_pcap_pkthdr, tvb, offset, sizeof( struct pcap_pkthdr ), FALSE );
1241
- pcap_pkthdr_tree = proto_item_add_subtree( ti, ett_pcap_pkthdr );
1242
-
1243
- nstime_t ts;
1244
- ts.secs = tvb_get_ntohl( tvb, offset );
1245
- ts.nsecs = tvb_get_ntohl( tvb, offset + 4 ) * 1000;
1246
- proto_tree_add_time( pcap_pkthdr_tree, hf_pcap_pkthdr_ts, tvb, offset, sizeof( nstime_t ), &ts );
1247
- offset += sizeof( nstime_t );
1248
- proto_tree_add_item( pcap_pkthdr_tree, hf_pcap_pkthdr_caplen, tvb, offset, 4, FALSE );
1249
- offset += 4;
1250
- proto_tree_add_item( pcap_pkthdr_tree, hf_pcap_pkthdr_len, tvb, offset, 4, FALSE );
1251
- offset += 4;
1252
- }
1253
-
1254
- return ( offset - head );
1255
- }
1256
-
1257
-
1258
- static void
1259
- dissect_ethernet( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree ) {
1260
- if ( ethernet_handle != NULL ) {
1261
- if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
1262
- col_append_str( pinfo->cinfo, COL_PROTOCOL, "+" );
1263
- }
1264
-
1265
- if ( check_col( pinfo->cinfo, COL_INFO ) ) {
1266
- col_append_str( pinfo->cinfo, COL_INFO, " => " );
1267
- }
1268
-
1269
- col_set_fence( pinfo->cinfo, COL_PROTOCOL );
1270
- col_set_fence( pinfo->cinfo, COL_INFO );
1271
-
1272
- call_dissector( ethernet_handle, tvb, pinfo, trema_tree );
1273
- }
1274
- else {
1275
- // FIXME: do something here
1276
- }
1277
- }
1278
-
1279
-
1280
- static void
1281
- dissect_pcap_dump( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *trema_tree,
1282
- gint offset, gboolean visited, stream_id *stream_name ) {
1283
- guint32 datalink = 0;
1284
-
1285
- offset += dissect_pcap_dump_header( tvb, pinfo, trema_tree, offset, &datalink );
1286
- offset += dissect_pcap_pkthdr( tvb, pinfo, trema_tree, offset );
1287
- if ( datalink == DLT_EN10MB ) {
1288
- guint16 remaining_len = tvb_reported_length_remaining( tvb, offset );
1289
- if ( remaining_len > 0 ) {
1290
- tvbuff_t *next_tvb = tvb_new_subset( tvb, offset, -1, remaining_len );
1291
- dissect_ethernet( next_tvb, pinfo, trema_tree );
1292
- }
1293
- offset += remaining_len;
1294
- }
1295
- dissect_message_dump( tvb, offset, trema_tree );
1296
- }
1297
-
1298
-
1299
- static gint
1300
- dissect_syslog_dump_header( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree, gint offset ) {
1301
- /*
1302
- typedef struct syslog_dump_header {
1303
- struct {
1304
- uint32_t sec;
1305
- uint32_t nsec;
1306
- } sent_time;
1307
- } syslog_dump_header;
1308
- */
1309
- gint head = offset;
1310
-
1311
- if ( trema_tree != NULL ) {
1312
- proto_tree *syslog_dump_header_tree = NULL;
1313
- proto_item *ti = NULL;
1314
-
1315
- ti = proto_tree_add_item( trema_tree, hf_syslog_dump_header, tvb, offset, sizeof( syslog_dump_header ), FALSE );
1316
- syslog_dump_header_tree = proto_item_add_subtree( ti, ett_syslog_dump_header );
1317
-
1318
- nstime_t receive_time;
1319
- receive_time.secs = tvb_get_ntohl( tvb, offset );
1320
- receive_time.nsecs = tvb_get_ntohl( tvb, offset + 4 );
1321
- proto_tree_add_time( syslog_dump_header_tree, hf_syslog_dump_receive_time, tvb, offset, 8, &receive_time );
1322
- offset += sizeof( syslog_dump_header );
1323
- }
1324
-
1325
- return ( offset - head );
1326
- }
1327
-
1328
-
1329
- static void
1330
- dissect_syslog( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree ) {
1331
- if ( udp_dissector_table != NULL ) {
1332
- if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
1333
- col_append_str( pinfo->cinfo, COL_PROTOCOL, "+" );
1334
- }
1335
-
1336
- if ( check_col( pinfo->cinfo, COL_INFO ) ) {
1337
- col_append_str( pinfo->cinfo, COL_INFO, " => " );
1338
- }
1339
-
1340
- col_set_fence( pinfo->cinfo, COL_PROTOCOL );
1341
- col_set_fence( pinfo->cinfo, COL_INFO );
1342
- #ifndef WIRESHARK_VERSION_OLDER_THAN_160
1343
- dissector_try_uint( udp_dissector_table, UDP_PORT_SYSLOG, tvb, pinfo, trema_tree );
1344
- #else
1345
- dissector_try_port( udp_dissector_table, UDP_PORT_SYSLOG, tvb, pinfo, trema_tree );
1346
- #endif
1347
- }
1348
- else {
1349
- gint length = tvb_length_remaining( tvb, 0 );
1350
- if ( length > 0 ) {
1351
- proto_tree_add_item( trema_tree, hf_syslog_dump_message, tvb, 0, length, FALSE );
1352
- }
1353
- }
1354
- }
1355
-
1356
-
1357
- static void
1358
- dissect_syslog_dump( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *trema_tree,
1359
- gint offset, gboolean visited, stream_id *stream_name ) {
1360
-
1361
- offset += dissect_syslog_dump_header( tvb, pinfo, trema_tree, offset );
1362
- guint16 remaining_len = tvb_reported_length_remaining( tvb, offset );
1363
- if ( remaining_len > 0 ) {
1364
- tvbuff_t *next_tvb = tvb_new_subset( tvb, offset, -1, remaining_len );
1365
- dissect_syslog( next_tvb, pinfo, trema_tree );
1366
- }
1367
- }
1368
-
1369
-
1370
- static gint
1371
- dissect_text_dump_header( tvbuff_t *tvb, packet_info *pinfo, proto_tree *trema_tree, gint offset ) {
1372
- /*
1373
- typedef struct text_dump_header {
1374
- struct {
1375
- uint32_t sec;
1376
- uint32_t nsec;
1377
- } sent_time;
1378
- } text_dump_header;
1379
- */
1380
- gint head = offset;
1381
-
1382
- if ( trema_tree != NULL ) {
1383
- proto_tree *text_dump_header_tree = NULL;
1384
- proto_item *ti = NULL;
1385
-
1386
- ti = proto_tree_add_item( trema_tree, hf_text_dump_header, tvb, offset, sizeof( text_dump_header ), FALSE );
1387
- text_dump_header_tree = proto_item_add_subtree( ti, ett_text_dump_header );
1388
-
1389
- nstime_t receive_time;
1390
- receive_time.secs = tvb_get_ntohl( tvb, offset );
1391
- receive_time.nsecs = tvb_get_ntohl( tvb, offset + 4 );
1392
- proto_tree_add_time( text_dump_header_tree, hf_text_dump_receive_time, tvb, offset, 8, &receive_time );
1393
- offset += sizeof( text_dump_header );
1394
- }
1395
-
1396
- return ( offset - head );
1397
- }
1398
-
1399
-
1400
- static void
1401
- dissect_text_dump( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_tree *trema_tree,
1402
- gint offset, gboolean visited, stream_id *stream_name ) {
1403
-
1404
- offset += dissect_text_dump_header( tvb, pinfo, trema_tree, offset );
1405
- guint16 remaining_len = tvb_reported_length_remaining( tvb, offset );
1406
- if ( remaining_len > 0 ) {
1407
- proto_tree_add_item( trema_tree, hf_text_dump_string, tvb, offset, -1, FALSE );
1408
-
1409
- gchar *string = tvb_format_text( tvb, offset, remaining_len - 1 );
1410
-
1411
- if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
1412
- col_append_str( pinfo->cinfo, COL_PROTOCOL, "+TEXT" );
1413
- }
1414
-
1415
- if ( check_col( pinfo->cinfo, COL_INFO ) && string != NULL ) {
1416
- col_append_str( pinfo->cinfo, COL_INFO, " => " );
1417
- col_append_str( pinfo->cinfo, COL_INFO, string );
1418
- }
1419
-
1420
- col_set_fence( pinfo->cinfo, COL_PROTOCOL );
1421
- col_set_fence( pinfo->cinfo, COL_INFO );
1422
- }
1423
- }
1424
-
1425
-
1426
- static void
1427
- dissect_trema( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
1428
- gboolean visited = TRUE;
1429
- gint offset = 0;
1430
- guint16 dump_type = 0;
1431
- proto_tree *trema_tree = NULL;
1432
- proto_item *ti = NULL;
1433
- stream_id stream_name;
1434
-
1435
- PRINTF( "----- start %u\n", pinfo->fd->num );
1436
-
1437
- if ( tree == NULL ) { // FIXME: is it okay to return here?
1438
- PRINTF( "----- end %u (tree is NULL)\n", pinfo->fd->num );
1439
- return;
1440
- }
1441
-
1442
- if ( check_packet_status( pinfo->fd->num ) == FALSE ) {
1443
- visited = FALSE;
1444
- update_packet_status( pinfo->fd->num, 0 );
1445
- }
1446
-
1447
- if ( check_col( pinfo->cinfo, COL_PROTOCOL ) ) {
1448
- col_set_str( pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_TREMA );
1449
- }
1450
-
1451
- ti = proto_tree_add_item( tree, proto_trema, tvb, 0, -1, FALSE );
1452
- trema_tree = proto_item_add_subtree( ti, ett_trema );
1453
-
1454
- get_stream_id( tvb, &stream_name );
1455
- PRINTF( " app [%s] service [%s]\n", stream_name.app_name, stream_name.service_name );
1456
-
1457
- offset = dissect_message_pcap_dump_header( tvb, pinfo, trema_tree, &dump_type );
1458
- if ( tvb_length_remaining( tvb, offset ) <= 0 ) {
1459
- PRINTF( "----- end %u (message_pcap_dump_header only)\n", pinfo->fd->num );
1460
- return;
1461
- }
1462
-
1463
- if ( dump_type >= MESSENGER_DUMP_SENT && dump_type <= MESSENGER_DUMP_SEND_CLOSED ) {
1464
- dissect_trema_ipc( tvb, pinfo, tree, trema_tree, offset, visited, &stream_name );
1465
- }
1466
- else if ( dump_type == MESSENGER_DUMP_PCAP ) {
1467
- dissect_pcap_dump( tvb, pinfo, tree, trema_tree, offset, visited, &stream_name );
1468
- }
1469
- else if ( dump_type == MESSENGER_DUMP_SYSLOG ) {
1470
- dissect_syslog_dump( tvb, pinfo, tree, trema_tree, offset, visited, &stream_name );
1471
- }
1472
- else if ( dump_type == MESSENGER_DUMP_TEXT ) {
1473
- dissect_text_dump( tvb, pinfo, tree, trema_tree, offset, visited, &stream_name );
1474
- }
1475
- else {
1476
- // FIXME
1477
- dissect_message_dump( tvb, offset, trema_tree );
1478
- }
1479
-
1480
- PRINTF( "----- end %u\n", pinfo->fd->num );
1481
- }
1482
-
1483
-
1484
- void
1485
- proto_register_trema() {
1486
- static hf_register_info hf[] = {
1487
- { &hf_dump_header,
1488
- { "Dump header", "trema.dump_header",
1489
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Dump header", HFILL }},
1490
- { &hf_dump_type,
1491
- { "Type", "trema.dump_type",
1492
- FT_UINT16, BASE_DEC, VALS( names_dump_type ), NO_MASK, "Type", HFILL }},
1493
- { &hf_dump_event_time,
1494
- { "Event occurred at", "trema.dump_event_time",
1495
- FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NO_STRINGS, NO_MASK, "Event Occurred at", HFILL }},
1496
- { &hf_dump_app_name_length,
1497
- { "Application name length", "trema.dump_app_name_length",
1498
- FT_UINT16, BASE_DEC, NO_STRINGS, NO_MASK, "Application name length", HFILL }},
1499
- { &hf_dump_service_name_length,
1500
- { "Service name length", "trema.dump_service_name_length",
1501
- FT_UINT16, BASE_DEC, NO_STRINGS, NO_MASK, "Service name length", HFILL }},
1502
- { &hf_dump_data_length,
1503
- { "Data length", "trema.dump_data_length",
1504
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, "Data length", HFILL }},
1505
- { &hf_dump_app_name,
1506
- { "Application name", "trema.dump_app_name",
1507
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Application name", HFILL }},
1508
- { &hf_dump_service_name,
1509
- { "Service name", "trema.dump_service_name",
1510
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Service name", HFILL }},
1511
- { &hf_message_header,
1512
- { "Message header", "trema.message_header",
1513
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Mesasge header", HFILL }},
1514
- { &hf_version,
1515
- { "Version", "trema.version",
1516
- FT_UINT8, BASE_DEC, NO_STRINGS, NO_MASK, "Version", HFILL }},
1517
- { &hf_message_type,
1518
- { "Type", "trema.type",
1519
- FT_UINT8, BASE_DEC, VALS( names_message_type ), NO_MASK, "Type", HFILL }},
1520
- { &hf_tag,
1521
- { "Tag", "trema.tag",
1522
- FT_UINT16, BASE_DEC, VALS( names_service_tag ), NO_MASK, "Tag", HFILL }},
1523
- { &hf_message_length,
1524
- { "Length", "trema.length",
1525
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, "Length", HFILL }},
1526
- { &hf_service_header,
1527
- { "OpenFlow service header", "trema.service_header",
1528
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "OpenFlow service header", HFILL }},
1529
- { &hf_datapath_id,
1530
- { "Datapath ID", "trema.datapath_id",
1531
- FT_UINT64, BASE_HEX, NO_STRINGS, NO_MASK, "Datapath ID", HFILL }},
1532
- { &hf_service_name_length,
1533
- { "Service name length", "trema.service_name_length",
1534
- FT_UINT16, BASE_DEC, NO_STRINGS, NO_MASK, "Service name length", HFILL }},
1535
- { &hf_service_name,
1536
- { "Service name", "trema.service_name",
1537
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Service name", HFILL }},
1538
- { &hf_context_handle,
1539
- { "Request/Reply context handle", "trema.context_handle",
1540
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Request/Reply context handle", HFILL }},
1541
- { &hf_transaction_id,
1542
- { "Transaction ID", "trema.transaction_id",
1543
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, "Transaction ID", HFILL }},
1544
- { &hf_hex_dump,
1545
- { "[Unknown data]", "trema.hex_dump",
1546
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Hex dump", HFILL }},
1547
-
1548
- // pcap_dump_header
1549
- { &hf_pcap_dump_header,
1550
- { "PCAP dump header", "trema.pcap_dump_header",
1551
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "PCAP dump header", HFILL }},
1552
- { &hf_pcap_dump_datalink,
1553
- { "Datalink", "trema.pcap_dump_datalink",
1554
- FT_UINT32, BASE_DEC, VALS( names_datalink_type ), NO_MASK, "Datalink", HFILL }},
1555
- { &hf_pcap_dump_interface,
1556
- { "Interface", "trema.pcap_dump_interface",
1557
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Inerface", HFILL }},
1558
-
1559
- // pcap_pkthdr
1560
- { &hf_pcap_pkthdr,
1561
- { "PCAP packet header", "trema.pcap_pkthdr",
1562
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "PCAP packet header", HFILL }},
1563
- { &hf_pcap_pkthdr_ts,
1564
- { "Captured at", "trema.pcap_pkthdr_ts",
1565
- FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NO_STRINGS, NO_MASK, "Captured at", HFILL }},
1566
- { &hf_pcap_pkthdr_caplen,
1567
- { "Capture length", "trema.pcap_pkthdr_caplen",
1568
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, "Capture length", HFILL }},
1569
- { &hf_pcap_pkthdr_len,
1570
- { "Frame length", "trema.pcap_pkthdr_len",
1571
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, "Frame length", HFILL }},
1572
-
1573
- // syslog_dump_header
1574
- { &hf_syslog_dump_header,
1575
- { "Syslog dump header", "trema.syslog_dump_header",
1576
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Syslog dump header", HFILL }},
1577
- { &hf_syslog_dump_receive_time,
1578
- { "Received at", "trema.syslog_dump_receive_time",
1579
- FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NO_STRINGS, NO_MASK, "Received at", HFILL }},
1580
-
1581
- // text_dump_header
1582
- { &hf_text_dump_header,
1583
- { "Text dump header", "trema.text_dump_header",
1584
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, "Text dump header", HFILL }},
1585
- { &hf_text_dump_receive_time,
1586
- { "Received at", "trema.text_dump_receive_time",
1587
- FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NO_STRINGS, NO_MASK, "Received at", HFILL }},
1588
- { &hf_text_dump_string,
1589
- { "Text string", "trema.text_dump_string",
1590
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Text string", HFILL }},
1591
-
1592
- // raw syslog message
1593
- { &hf_syslog_dump_message,
1594
- { "Raw syslog message", "trema.syslog_message",
1595
- FT_STRING, BASE_NONE, NO_STRINGS, NO_MASK, "Raw syslog message", HFILL }},
1596
-
1597
- // Fragment fields
1598
- { &hf_trema_fragments,
1599
- { "Trema fragments", "trema.fragments",
1600
- FT_NONE, BASE_NONE, NO_STRINGS, NO_MASK, NULL, HFILL }},
1601
- { &hf_trema_fragment,
1602
- { "Trema fragment", "trema.fragment",
1603
- FT_FRAMENUM, BASE_NONE, NO_STRINGS, NO_MASK, NULL, HFILL }},
1604
- { &hf_trema_fragment_overlap,
1605
- { "Trema fragment overlap", "trema.fragment.overlap",
1606
- FT_BOOLEAN, 0, NO_STRINGS, NO_MASK, NULL, HFILL }},
1607
- { &hf_trema_fragment_overlap_conflict,
1608
- { "Trema fragment overlapping with conflicting data", "trema.fragment.overlap.conflicts",
1609
- FT_BOOLEAN, 0, NO_STRINGS, NO_MASK, NULL, HFILL }},
1610
- { &hf_trema_fragment_multiple_tails,
1611
- { "Trema has multiple tail fragments", "trema.fragment.multiple_tails",
1612
- FT_BOOLEAN, 0, NO_STRINGS, NO_MASK, NULL, HFILL }},
1613
- { &hf_trema_fragment_too_long_fragment,
1614
- { "Trema fragment too long", "trema.fragment.too_long_fragment",
1615
- FT_BOOLEAN, 0, NO_STRINGS, NO_MASK, NULL, HFILL }},
1616
- { &hf_trema_fragment_error,
1617
- { "Trema defragmentation error", "trema.fragment.error",
1618
- FT_FRAMENUM, BASE_NONE, NO_STRINGS, NO_MASK, NULL, HFILL }},
1619
- #ifndef WIRESHARK_VERSION_OLDER_THAN_160
1620
- { &hf_trema_fragment_count,
1621
- { "Trema defragmentation count", "trema.fragment.count",
1622
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, NULL, HFILL }},
1623
- #endif
1624
- { &hf_trema_reassembled_in,
1625
- { "Reassembled in", "trema.reassembled.in",
1626
- FT_FRAMENUM, BASE_NONE, NO_STRINGS, NO_MASK, NULL, HFILL }},
1627
- { &hf_trema_reassembled_length,
1628
- { "Reassembled length", "trema.reassembled.length",
1629
- FT_UINT32, BASE_DEC, NO_STRINGS, NO_MASK, NULL, HFILL }},
1630
- };
1631
-
1632
- static gint *ett[] = {
1633
- &ett_trema,
1634
- &ett_dump_header,
1635
- &ett_message_header,
1636
- &ett_service_header,
1637
- &ett_context_handle,
1638
- &ett_trema_fragment,
1639
- &ett_trema_fragments,
1640
- &ett_pcap_dump_header,
1641
- &ett_pcap_pkthdr,
1642
- &ett_syslog_dump_header,
1643
- &ett_text_dump_header,
1644
- };
1645
-
1646
- proto_trema = proto_register_protocol( "Trema Universal Event Dumper", "TREMA", "trema" );
1647
- proto_register_field_array( proto_trema, hf, array_length( hf ) );
1648
- proto_register_subtree_array( ett, array_length( ett ) );
1649
- register_dissector( "trema", dissect_trema, proto_trema );
1650
-
1651
- register_init_routine( init_trema_fragment );
1652
- }
1653
-
1654
-
1655
- void
1656
- proto_reg_handoff_trema() {
1657
- ethernet_handle = find_dissector( "eth" );
1658
- ppp_handle = find_dissector( "ppp" );
1659
- ip_handle = find_dissector( "ip" );
1660
- openflow_handle = find_dissector( "openflow" );
1661
- sll_dissector_table = find_dissector_table( "sll.ltype" );
1662
- udp_dissector_table = find_dissector_table( "udp.port" );
1663
- }
1664
-
1665
-
1666
- /*
1667
- * Local variables:
1668
- * c-basic-offset: 2
1669
- * indent-tabs-mode: nil
1670
- * End:
1671
- */