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,102 +0,0 @@
1
- /*
2
- * Copyright (C) 2013 NEC Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License, version 2, as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
12
- *
13
- * You should have received a copy of the GNU General Public License along
14
- * with this program; if not, write to the Free Software Foundation, Inc.,
15
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
- */
17
-
18
-
19
- #include <arpa/inet.h>
20
- #include <assert.h>
21
- #include <string.h>
22
- #include "bool.h"
23
- #include "checks.h"
24
- #include "log.h"
25
- #include "management_service_interface.h"
26
- #include "messenger.h"
27
- #include "trema_private.h"
28
- #include "trema_wrapper.h"
29
- #include "utility.h"
30
- #include "wrapper.h"
31
-
32
-
33
- static char management_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
34
-
35
-
36
- static const char *
37
- _get_management_service_name( const char *service_name ) {
38
- if ( service_name == NULL ) {
39
- die( "Service name must not be NULL." );
40
- }
41
- if ( strlen( service_name ) == 0 ) {
42
- die( "Service name length must not be zero." );
43
- }
44
- if ( strlen( service_name ) >= ( MESSENGER_SERVICE_NAME_LENGTH - 2 ) ) {
45
- die( "Too long service name ( %s ).", service_name );
46
- }
47
-
48
- memset( management_service_name, '\0', MESSENGER_SERVICE_NAME_LENGTH );
49
- snprintf( management_service_name, MESSENGER_SERVICE_NAME_LENGTH, "%s.m", service_name );
50
-
51
- return management_service_name;
52
- }
53
- const char *( *get_management_service_name )( const char *service_name ) = _get_management_service_name;
54
-
55
-
56
- management_application_reply *
57
- _create_management_application_reply( uint8_t status, uint32_t application_id, void *data, size_t data_length ) {
58
- size_t length = offsetof( management_application_reply, data );
59
- if ( data != NULL ) {
60
- length += data_length;
61
- }
62
- management_application_reply *reply = xmalloc( length );
63
- memset( reply, 0, length );
64
- reply->header.type = htons( MANAGEMENT_APPLICATION_REPLY );
65
- reply->header.status = status;
66
- reply->header.length = htonl( ( uint32_t ) length );
67
- reply->application_id = htonl( application_id );
68
- if ( data != NULL ) {
69
- memcpy( reply->data, data, data_length );
70
- }
71
-
72
- return reply;
73
- }
74
- management_application_reply *( *create_management_application_reply )( uint8_t status, uint32_t application_id, void *data, size_t data_length ) = _create_management_application_reply;
75
-
76
-
77
- bool
78
- _send_management_application_reply( const messenger_context_handle *handle, const management_application_reply *reply ) {
79
- if ( handle == NULL || reply == NULL ) {
80
- error( "Both context handle and reply message must not be NULL ( handle = %p, reply = %p ).", handle, reply );
81
- return false;
82
- }
83
- bool ret = send_reply_message( handle, MESSENGER_MANAGEMENT_REPLY, reply, ( size_t ) ntohl( reply->header.length ) );
84
- if ( !ret ) {
85
- error( "Failed to send an application specific management reply." );
86
- return false;
87
- }
88
-
89
- return true;
90
- }
91
- bool ( *send_management_application_reply )( const messenger_context_handle *handle, const management_application_reply *reply ) = _send_management_application_reply;
92
-
93
-
94
- void ( *set_management_application_request_handler )( management_application_request_handler callback, void *user_data ) = _set_management_application_request_handler;
95
-
96
-
97
- /*
98
- * Local variables:
99
- * c-basic-offset: 2
100
- * indent-tabs-mode: nil
101
- * End:
102
- */
@@ -1,134 +0,0 @@
1
- /*
2
- * Management service interface.
3
- *
4
- * Copyright (C) 2013 NEC Corporation
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License, version 2, as
8
- * published by the Free Software Foundation.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License along
16
- * with this program; if not, write to the Free Software Foundation, Inc.,
17
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
- */
19
-
20
-
21
- #ifndef MANAGEMENT_SERVICE_INTERFACE_H
22
- #define MANAGEMENT_SERVICE_INTERFACE_H
23
-
24
-
25
- #include <inttypes.h>
26
- #include <time.h>
27
- #include "messenger.h"
28
- #include "stat.h"
29
-
30
-
31
- enum {
32
- MESSENGER_MANAGEMENT_REQUEST = 0x0020,
33
- MESSENGER_MANAGEMENT_REPLY,
34
- };
35
-
36
- enum {
37
- MANAGEMENT_REQUEST_SUCCEEDED,
38
- MANAGEMENT_REQUEST_FAILED,
39
- };
40
-
41
- enum {
42
- MANAGEMENT_ECHO_REQUEST,
43
- MANAGEMENT_ECHO_REPLY,
44
- MANAGEMENT_SET_LOGGING_LEVEL_REQUEST,
45
- MANAGEMENT_SET_LOGGING_LEVEL_REPLY,
46
- MANAGEMENT_SHOW_STATS_REQUEST,
47
- MANAGEMENT_SHOW_STATS_REPLY,
48
- MANAGEMENT_APPLICATION_REQUEST,
49
- MANAGEMENT_APPLICATION_REPLY,
50
- };
51
-
52
-
53
- typedef struct {
54
- uint16_t type;
55
- uint32_t length;
56
- } __attribute__( ( packed ) ) management_request_header;
57
-
58
- typedef struct {
59
- uint32_t tv_sec;
60
- uint32_t tv_nsec;
61
- } timespec_n;
62
-
63
- typedef struct {
64
- management_request_header header;
65
- timespec_n sent_at;
66
- } __attribute__( ( packed ) ) management_echo_request;
67
-
68
- typedef struct {
69
- management_request_header header;
70
- char level[ LOGGING_LEVEL_STR_LENGTH ];
71
- } __attribute__( ( packed ) ) management_set_logging_level_request;
72
-
73
- typedef struct {
74
- management_request_header header;
75
- } __attribute__( ( packed ) ) management_show_stats_request;
76
-
77
- typedef struct {
78
- management_request_header header;
79
- uint32_t application_id;
80
- uint8_t data[ 0 ];
81
- } __attribute__( ( packed ) ) management_application_request;
82
-
83
- typedef struct {
84
- uint16_t type;
85
- uint8_t status;
86
- uint8_t flags;
87
- uint32_t length;
88
- } __attribute__( ( packed ) ) management_reply_header;
89
-
90
- typedef struct {
91
- management_reply_header header;
92
- timespec_n sent_at;
93
- timespec_n received_at;
94
- } __attribute__( ( packed ) ) management_echo_reply;
95
-
96
- typedef struct {
97
- management_reply_header header;
98
- } __attribute__( ( packed ) ) management_set_logging_level_reply;
99
-
100
- typedef struct {
101
- management_reply_header header;
102
- stat_entry entries[ 0 ];
103
- } __attribute__( ( packed ) ) management_show_stats_reply;
104
-
105
- typedef struct {
106
- management_reply_header header;
107
- uint32_t application_id;
108
- uint8_t data[ 0 ];
109
- } __attribute__( ( packed ) ) management_application_reply;
110
-
111
- typedef void ( *management_application_request_handler )(
112
- const messenger_context_handle *handle,
113
- uint32_t application_id,
114
- void *data,
115
- size_t data_length,
116
- void *user_data
117
- );
118
-
119
-
120
- extern const char *( *get_management_service_name )( const char *service_name );
121
- extern void ( *set_management_application_request_handler )( management_application_request_handler callback, void *user_data );
122
- extern management_application_reply *( *create_management_application_reply )( uint8_t status, uint32_t application_id, void *data, size_t data_length );
123
- extern bool ( *send_management_application_reply )( const messenger_context_handle *handle, const management_application_reply *reply );
124
-
125
-
126
- #endif // MANAGEMENT_SERVICE_INTERFACE_H
127
-
128
-
129
- /*
130
- * Local variables:
131
- * c-basic-offset: 2
132
- * indent-tabs-mode: nil
133
- * End:
134
- */
@@ -1,82 +0,0 @@
1
- /*
2
- * OpenFlow flow matching library
3
- *
4
- * Copyright (C) 2008-2013 NEC Corporation
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License, version 2, as
8
- * published by the Free Software Foundation.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License along
16
- * with this program; if not, write to the Free Software Foundation, Inc.,
17
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
- */
19
-
20
-
21
- #ifndef MATCH_H
22
- #define MATCH_H
23
-
24
-
25
- #include <openflow.h>
26
-
27
-
28
- #define COMPARE_MAC( _x, _y ) \
29
- ( ( ( ( uint16_t * ) &( _x ) )[ 0 ] == ( ( uint16_t * ) &( _y ) )[ 0 ] ) \
30
- && ( ( ( uint16_t * ) &( _x ) )[ 1 ] == ( ( uint16_t * ) &( _y ) )[ 1 ] ) \
31
- && ( ( ( uint16_t * ) &( _x ) )[ 2 ] == ( ( uint16_t * ) &( _y ) )[ 2 ] ) )
32
-
33
- #define create_nw_src_mask( _w ) \
34
- ( { \
35
- uint32_t _m = ( ( _w ) & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT; \
36
- ( _m >= 32 ) ? 0 : 0xffffffff << _m; \
37
- } \
38
- )
39
-
40
- #define create_nw_dst_mask( _w ) \
41
- ( { \
42
- uint32_t _m = ( ( _w ) & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT; \
43
- ( _m >= 32 ) ? 0 : 0xffffffff << _m; \
44
- } \
45
- )
46
-
47
- #define compare_match( _x, _y ) \
48
- ( { \
49
- uint32_t _w = ( _x )->wildcards | ( _y )->wildcards; \
50
- uint32_t _sm = create_nw_src_mask( ( _x )->wildcards ) \
51
- & create_nw_src_mask( ( _y )->wildcards ); \
52
- uint32_t _dm = create_nw_dst_mask( ( _x )->wildcards ) \
53
- & create_nw_dst_mask( ( _y )->wildcards ); \
54
- ( ( _w & OFPFW_IN_PORT || ( _x )->in_port == ( _y )->in_port ) \
55
- && ( _w & OFPFW_DL_VLAN || ( _x )->dl_vlan == ( _y )->dl_vlan ) \
56
- && ( _w & OFPFW_DL_VLAN_PCP || ( _x )->dl_vlan_pcp == ( _y )->dl_vlan_pcp ) \
57
- && ( _w & OFPFW_DL_SRC || COMPARE_MAC( ( _x )->dl_src, ( _y )->dl_src ) ) \
58
- && ( _w & OFPFW_DL_DST || COMPARE_MAC( ( _x )->dl_dst, ( _y )->dl_dst ) ) \
59
- && ( _w & OFPFW_DL_TYPE || ( _x )->dl_type == ( _y )->dl_type ) \
60
- && !( ( ( _x )->nw_src ^ ( _y )->nw_src ) & _sm ) \
61
- && !( ( ( _x )->nw_dst ^ ( _y )->nw_dst ) & _dm ) \
62
- && ( _w & OFPFW_NW_TOS || ( _x )->nw_tos == ( _y )->nw_tos ) \
63
- && ( _w & OFPFW_NW_PROTO || ( _x )->nw_proto == ( _y )->nw_proto ) \
64
- && ( _w & OFPFW_TP_SRC || ( _x )->tp_src == ( _y )->tp_src ) \
65
- && ( _w & OFPFW_TP_DST || ( _x )->tp_dst == ( _y )->tp_dst ) ); \
66
- } \
67
- )
68
-
69
- #define compare_match_strict( _x, _y ) \
70
- ( ( ( ( ( _x )->wildcards ^ ( _y )->wildcards ) & OFPFW_ALL ) == 0 ) \
71
- && compare_match( ( _x ), ( _y ) ) )
72
-
73
-
74
- #endif // MATCH_H
75
-
76
-
77
- /*
78
- * Local variables:
79
- * c-basic-offset: 2
80
- * indent-tabs-mode: nil
81
- * End:
82
- */
@@ -1,606 +0,0 @@
1
- /*
2
- * Copyright (C) 2008-2013 NEC Corporation
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License, version 2, as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
12
- *
13
- * You should have received a copy of the GNU General Public License along
14
- * with this program; if not, write to the Free Software Foundation, Inc.,
15
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
- */
17
-
18
-
19
- #include <assert.h>
20
- #include <openflow.h>
21
- #include <pthread.h>
22
- #include <stdlib.h>
23
- #include <string.h>
24
- #include "checks.h"
25
- #include "match.h"
26
- #include "match_table.h"
27
- #include "log.h"
28
- #include "wrapper.h"
29
-
30
-
31
- #define VLAN_VID_MASK 0x0fff // 12 bits
32
- #define VLAN_PCP_MASK 0x07 // 3 bits
33
- #define NW_TOS_MASK 0xfc // upper 6 bits
34
-
35
- #define MATCH_STRING_LENGTH 1024
36
-
37
-
38
- typedef struct {
39
- struct ofp_match match; // match data. host byte order
40
- uint16_t priority;
41
- void *data;
42
- } match_entry;
43
-
44
-
45
- typedef struct {
46
- hash_table *exact_table; // no wildcards are set
47
- list_element *wildcards_table; // wildcards flags are set
48
- pthread_mutex_t *mutex;
49
- } match_table;
50
-
51
-
52
- typedef struct {
53
- struct ofp_match *match;
54
- void ( *function )( struct ofp_match, uint16_t, void *, void * );
55
- void *user_data;
56
- } match_walker;
57
-
58
-
59
- match_table *_match_table_head = NULL; // non-static variable for use in unit testing
60
-
61
-
62
- static inline bool
63
- exact_match( struct ofp_match *match ) {
64
- assert( match != NULL );
65
-
66
- return ( ( match->wildcards & OFPFW_ALL ) == 0 );
67
- }
68
-
69
-
70
- static match_entry *
71
- allocate_match_entry( struct ofp_match *match, uint16_t priority, void *data ) {
72
- match_entry *new_entry = xmalloc( sizeof( match_entry ) );
73
- new_entry->match = *match;
74
- new_entry->priority = priority;
75
- new_entry->data = data;
76
-
77
- return new_entry;
78
- }
79
-
80
-
81
- static void
82
- free_match_entry( match_entry *free_entry ) {
83
- assert( free_entry != NULL );
84
-
85
- xfree( free_entry );
86
- }
87
-
88
-
89
- static bool
90
- compare_filter_match( struct ofp_match *x, struct ofp_match *y ) {
91
- uint32_t w_x = x->wildcards & OFPFW_ALL;
92
- uint32_t w_y = y->wildcards & OFPFW_ALL;
93
- uint32_t sm_x = create_nw_src_mask( w_x );
94
- uint32_t dm_x = create_nw_dst_mask( w_x );
95
- uint32_t sm_y = create_nw_src_mask( w_y );
96
- uint32_t dm_y = create_nw_dst_mask( w_y );
97
-
98
- w_x &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
99
- w_y &= ( uint32_t ) ~( OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK );
100
- if ( ( ~w_x & w_y ) != 0 ) {
101
- return false;
102
- }
103
- if ( sm_x > sm_y ) {
104
- return false;
105
- }
106
- if ( dm_x > dm_y ) {
107
- return false;
108
- }
109
-
110
- return ( ( w_x & OFPFW_IN_PORT || x->in_port == y->in_port )
111
- && ( w_x & OFPFW_DL_VLAN || x->dl_vlan == y->dl_vlan )
112
- && ( w_x & OFPFW_DL_VLAN_PCP || x->dl_vlan_pcp == y->dl_vlan_pcp )
113
- && ( w_x & OFPFW_DL_SRC || COMPARE_MAC( x->dl_src, y->dl_src ) )
114
- && ( w_x & OFPFW_DL_DST || COMPARE_MAC( x->dl_dst, y->dl_dst ) )
115
- && ( w_x & OFPFW_DL_TYPE || x->dl_type == y->dl_type )
116
- && !( ( x->nw_src ^ y->nw_src ) & sm_x )
117
- && !( ( x->nw_dst ^ y->nw_dst ) & dm_x )
118
- && ( w_x & OFPFW_NW_TOS || x->nw_tos == y->nw_tos )
119
- && ( w_x & OFPFW_NW_PROTO || x->nw_proto == y->nw_proto )
120
- && ( w_x & OFPFW_TP_SRC || x->tp_src == y->tp_src )
121
- && ( w_x & OFPFW_TP_DST || x->tp_dst == y->tp_dst ) ) != 0 ? true : false;
122
- }
123
-
124
-
125
- static bool
126
- compare_exact_match_entry( const void *x, const void *y ) {
127
- assert( x != NULL );
128
- assert( y != NULL );
129
-
130
- const struct ofp_match *xofp_match = x;
131
- const struct ofp_match *yofp_match = y;
132
- return compare_match_strict( xofp_match, yofp_match );
133
- }
134
-
135
-
136
- static unsigned int
137
- hash_exact_match_entry( const void *key ) {
138
- assert( key != NULL );
139
- const struct ofp_match *match = key;
140
-
141
- uint16_t dl_vlan = match->dl_vlan;
142
- if ( dl_vlan != UINT16_MAX ) {
143
- dl_vlan = ( uint16_t ) ( dl_vlan & VLAN_VID_MASK );
144
- }
145
- uint8_t dl_vlan_pcp = ( uint8_t ) ( match->dl_vlan_pcp & VLAN_PCP_MASK );
146
- uint8_t nw_tos = ( uint8_t ) ( match->nw_tos & NW_TOS_MASK );
147
-
148
- unsigned int hash = 0;
149
- hash ^= ( unsigned int ) ( match->in_port << 16 );
150
- hash ^= ( unsigned int ) hash_mac( match->dl_src );
151
- hash ^= ( unsigned int ) hash_mac( match->dl_dst );
152
- hash ^= dl_vlan;
153
- hash ^= ( unsigned int ) ( dl_vlan_pcp << 24 );
154
- hash ^= ( unsigned int ) ( match->dl_type << 8 );
155
- hash ^= nw_tos;
156
- hash ^= ( unsigned int ) ( match->nw_proto << 24 );
157
- hash ^= match->nw_src;
158
- hash ^= match->nw_dst;
159
- hash ^= ( unsigned int ) ( match->tp_src << 16 );
160
- hash ^= match->tp_dst;
161
-
162
- return hash;
163
- }
164
-
165
-
166
- static void
167
- init_exact_match_table( hash_table **exact_table ) {
168
- assert( exact_table != NULL );
169
-
170
- *exact_table = create_hash( compare_exact_match_entry, hash_exact_match_entry );
171
- }
172
-
173
-
174
- static void
175
- free_exact_match_entry( void *key, void *value, void *user_data ) {
176
- UNUSED( key );
177
- assert( value != NULL );
178
- UNUSED( user_data );
179
-
180
- match_entry *entry = value;
181
-
182
- free_match_entry( entry );
183
- }
184
-
185
-
186
- static void
187
- finalize_exact_match_table( hash_table *exact_table ) {
188
- assert( exact_table != NULL );
189
-
190
- foreach_hash( exact_table, free_exact_match_entry, NULL );
191
- delete_hash( exact_table );
192
- }
193
-
194
-
195
- static bool
196
- insert_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
197
- assert( exact_table != NULL );
198
- assert( match != NULL );
199
-
200
- match_entry *entry = lookup_hash_entry( exact_table, match );
201
- if ( entry != NULL ) {
202
- char match_string[ MATCH_STRING_LENGTH ];
203
- match_to_string( match, match_string, sizeof( match_string ) );
204
- warn( "exact match entry already exists ( match = [%s] )", match_string );
205
- return false;
206
- }
207
- match_entry *new_entry = allocate_match_entry( match, 0 /* dummy priority */, data );
208
- match_entry *conflict_entry = insert_hash_entry( exact_table, &new_entry->match, new_entry );
209
- assert( conflict_entry == NULL );
210
- return true;
211
- }
212
-
213
-
214
- static match_entry *
215
- lookup_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
216
- assert( exact_table != NULL );
217
- assert( match != NULL );
218
-
219
- return lookup_hash_entry( exact_table, match );
220
- }
221
-
222
-
223
- #define lookup_exact_match_entry( table, match ) lookup_exact_match_strict_entry( table, match )
224
-
225
-
226
- static bool
227
- update_exact_match_entry( hash_table *exact_table, struct ofp_match *match, void *data ) {
228
- assert( exact_table != NULL );
229
- assert( match != NULL );
230
-
231
- match_entry *entry = lookup_exact_match_strict_entry( exact_table, match );
232
- if ( entry == NULL ) {
233
- char match_string[ MATCH_STRING_LENGTH ];
234
- match_to_string( match, match_string, sizeof( match_string ) );
235
- warn( "exact match entry not found ( match = [%s] )",
236
- match_string );
237
- return false;
238
- }
239
- entry->data = data;
240
- return true;
241
- }
242
-
243
-
244
- static void *
245
- delete_exact_match_strict_entry( hash_table *exact_table, struct ofp_match *match ) {
246
- assert( exact_table != NULL );
247
- assert( match != NULL );
248
-
249
- match_entry *entry = lookup_hash_entry( exact_table, match );
250
- if ( entry == NULL ) {
251
- char match_string[ MATCH_STRING_LENGTH ];
252
- match_to_string( match, match_string, sizeof( match_string ) );
253
- warn( "exact match entry not found ( match = [%s] )",
254
- match_string );
255
- return NULL;
256
- }
257
- void *data = entry->data;
258
- delete_hash_entry( exact_table, match );
259
- free_match_entry( entry );
260
- return data;
261
- }
262
-
263
-
264
- static void
265
- exact_match_table_walker( void *key, void *value, void *user_data ) {
266
- UNUSED( key );
267
- assert( value != NULL );
268
- match_walker *walker = user_data;
269
- assert( walker != NULL );
270
- assert( walker->function != NULL );
271
-
272
- match_entry *entry = value;
273
- if ( walker->match != NULL ) {
274
- if ( !compare_filter_match( walker->match, &entry->match ) ) {
275
- return;
276
- }
277
- }
278
- void ( *function )( struct ofp_match, uint16_t, void *, void * ) = walker->function;
279
-
280
- function( entry->match, entry->priority, entry->data, walker->user_data );
281
- }
282
-
283
-
284
- static void
285
- map_exact_match_table( hash_table *exact_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void *user_data ) {
286
- assert( exact_table != NULL );
287
- assert( function != NULL );
288
- match_walker walker;
289
- walker.match = match;
290
- walker.function = function;
291
- walker.user_data = user_data;
292
- foreach_hash( exact_table, exact_match_table_walker, &walker );
293
- }
294
-
295
-
296
- static void
297
- init_wildcards_match_table( list_element **wildcards_table ) {
298
- assert( wildcards_table != NULL );
299
-
300
- create_list( wildcards_table );
301
- }
302
-
303
-
304
- static void
305
- finalize_wildcards_match_table( list_element *wildcards_table ) {
306
- list_element *element;
307
- for ( element = wildcards_table; element != NULL; element = element->next ) {
308
- free_match_entry( element->data );
309
- element->data = NULL;
310
- }
311
- delete_list( wildcards_table );
312
- }
313
-
314
-
315
- static bool
316
- insert_wildcards_match_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
317
- assert( match != NULL );
318
-
319
- list_element *element;
320
- for ( element = *wildcards_table; element != NULL; element = element->next ) {
321
- match_entry *entry = element->data;
322
- if ( entry->priority < priority ) {
323
- break;
324
- }
325
- assert( entry != NULL );
326
- if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
327
- char match_string[ MATCH_STRING_LENGTH ];
328
- match_to_string( match, match_string, sizeof( match_string ) );
329
- warn( "wildcards match entry already exists ( match = [%s], priority = %u )",
330
- match_string, priority );
331
- return false;
332
- }
333
- }
334
- match_entry *new_entry = allocate_match_entry( match, priority, data );
335
- if ( element == NULL ) {
336
- // tail
337
- append_to_tail( wildcards_table, new_entry );
338
- }
339
- else if ( element == *wildcards_table ) {
340
- // head
341
- insert_in_front( wildcards_table, new_entry );
342
- }
343
- else {
344
- // insert before
345
- insert_before( wildcards_table, element->data, new_entry );
346
- }
347
- return true;
348
- }
349
-
350
-
351
- static match_entry *
352
- lookup_wildcards_match_strict_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority ) {
353
- assert( match != NULL );
354
-
355
- list_element *element;
356
- for ( element = wildcards_table; element != NULL; element = element->next ) {
357
- match_entry *entry = element->data;
358
- if ( entry->priority < priority ) {
359
- break;
360
- }
361
- if ( entry->priority == priority && compare_match_strict( &entry->match, match ) ) {
362
- return entry;
363
- }
364
- }
365
- return NULL;
366
- }
367
-
368
-
369
- static match_entry *
370
- lookup_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match ) {
371
- assert( match != NULL );
372
-
373
- list_element *element;
374
- for ( element = wildcards_table; element != NULL; element = element->next ) {
375
- match_entry *entry = element->data;
376
- if ( compare_match( &entry->match, match ) ) {
377
- return entry;
378
- }
379
- }
380
- return NULL;
381
- }
382
-
383
-
384
- static bool
385
- update_wildcards_match_entry( list_element *wildcards_table, struct ofp_match *match, uint16_t priority, void *data ) {
386
- assert( match != NULL );
387
-
388
- match_entry *entry = lookup_wildcards_match_strict_entry( wildcards_table, match, priority );
389
- if ( entry == NULL ) {
390
- char match_string[ MATCH_STRING_LENGTH ];
391
- match_to_string( match, match_string, sizeof( match_string ) );
392
- warn( "wildcards match entry not found ( match = [%s], priority = %u )",
393
- match_string, priority );
394
- return false;
395
- }
396
- entry->data = data;
397
- return true;
398
- }
399
-
400
-
401
- static void *
402
- delete_wildcards_match_strict_entry( list_element **wildcards_table, struct ofp_match *match, uint16_t priority ) {
403
- assert( match != NULL );
404
-
405
- match_entry *entry = lookup_wildcards_match_strict_entry( *wildcards_table, match, priority );
406
- if ( entry == NULL ) {
407
- char match_string[ MATCH_STRING_LENGTH ];
408
- match_to_string( match, match_string, sizeof( match_string ) );
409
- warn( "wildcards match entry not found ( match = [%s], priority = %u )",
410
- match_string, priority );
411
- return NULL;
412
- }
413
- void *data = entry->data;
414
- delete_element( wildcards_table, entry );
415
- free_match_entry( entry );
416
- return data;
417
- }
418
-
419
-
420
- static void
421
- map_wildcards_match_table( list_element *wildcards_table, struct ofp_match *match, void function( struct ofp_match, uint16_t, void *, void * ), void * user_data ) {
422
- assert( function != NULL );
423
-
424
- list_element *element = wildcards_table;
425
- while ( element != NULL ) {
426
- match_entry *entry = element->data;
427
- element = element->next;
428
- if ( match != NULL ) {
429
- if ( !compare_filter_match( match, &entry->match ) ) {
430
- continue;
431
- }
432
- }
433
- function( entry->match, entry->priority, entry->data, user_data );
434
- }
435
- }
436
-
437
-
438
- void
439
- init_match_table( void ) {
440
- if ( _match_table_head != NULL ) {
441
- die( "match table is already initialized." );
442
- }
443
-
444
- match_table *table = xmalloc( sizeof( match_table ) );
445
- init_exact_match_table( &table->exact_table );
446
- init_wildcards_match_table( &table->wildcards_table );
447
- pthread_mutexattr_t attr;
448
- pthread_mutexattr_init( &attr );
449
- pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE_NP );
450
- table->mutex = xmalloc( sizeof( pthread_mutex_t ) );
451
- pthread_mutex_init( table->mutex, &attr );
452
-
453
- _match_table_head = table;
454
- }
455
-
456
-
457
- void
458
- finalize_match_table( void ) {
459
- if ( _match_table_head == NULL ) {
460
- die( "match table is not initialized." );
461
- }
462
-
463
- pthread_mutex_t *mutex = _match_table_head->mutex;
464
-
465
- pthread_mutex_lock( mutex );
466
- finalize_exact_match_table( _match_table_head->exact_table );
467
- finalize_wildcards_match_table( _match_table_head->wildcards_table );
468
- xfree( _match_table_head );
469
- _match_table_head = NULL;
470
- pthread_mutex_unlock( mutex );
471
- pthread_mutex_destroy( mutex );
472
- xfree( mutex );
473
- }
474
-
475
-
476
- bool
477
- insert_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
478
- if ( _match_table_head == NULL ) {
479
- die( "match table is not initialized." );
480
- }
481
-
482
- pthread_mutex_lock( _match_table_head->mutex );
483
- bool result;
484
- if ( exact_match( &match ) ) {
485
- result = insert_exact_match_entry( _match_table_head->exact_table, &match, data );
486
- }
487
- else {
488
- // wildcards flags are set
489
- result = insert_wildcards_match_entry( &_match_table_head->wildcards_table, &match, priority, data );
490
- }
491
- pthread_mutex_unlock( _match_table_head->mutex );
492
- return result;
493
- }
494
-
495
-
496
- void *
497
- lookup_match_strict_entry( struct ofp_match match, uint16_t priority ) {
498
- if ( _match_table_head == NULL ) {
499
- die( "match table is not initialized." );
500
- }
501
-
502
- pthread_mutex_lock( _match_table_head->mutex );
503
- match_entry *entry;
504
- if ( exact_match( &match ) ) {
505
- entry = lookup_exact_match_strict_entry( _match_table_head->exact_table, &match );
506
- }
507
- else {
508
- entry = lookup_wildcards_match_strict_entry( _match_table_head->wildcards_table, &match, priority );
509
- }
510
- void *data = ( entry != NULL ? entry->data : NULL );
511
- pthread_mutex_unlock( _match_table_head->mutex );
512
- return data;
513
- }
514
-
515
-
516
- void *
517
- lookup_match_entry( struct ofp_match match ) {
518
- if ( _match_table_head == NULL ) {
519
- die( "match table is not initialized." );
520
- }
521
-
522
- pthread_mutex_lock( _match_table_head->mutex );
523
- match_entry *entry = lookup_exact_match_entry( _match_table_head->exact_table, &match );
524
- if ( entry == NULL ) {
525
- entry = lookup_wildcards_match_entry( _match_table_head->wildcards_table, &match );
526
- }
527
- void *data = ( entry != NULL ? entry->data : NULL );
528
- pthread_mutex_unlock( _match_table_head->mutex );
529
- return data;
530
- }
531
-
532
-
533
- bool
534
- update_match_entry( struct ofp_match match, uint16_t priority, void *data ) {
535
- if ( _match_table_head == NULL ) {
536
- die( "match table is not initialized." );
537
- }
538
-
539
- pthread_mutex_lock( _match_table_head->mutex );
540
- bool result;
541
- if ( exact_match( &match ) ) {
542
- result = update_exact_match_entry( _match_table_head->exact_table, &match, data );
543
- }
544
- else {
545
- // wildcards flags are set
546
- result = update_wildcards_match_entry( _match_table_head->wildcards_table, &match, priority, data );
547
- }
548
- pthread_mutex_unlock( _match_table_head->mutex );
549
- return result;
550
- }
551
-
552
-
553
- void *
554
- delete_match_strict_entry( struct ofp_match match, uint16_t priority ) {
555
- if ( _match_table_head == NULL ) {
556
- die( "match table is not initialized." );
557
- }
558
-
559
- pthread_mutex_lock( _match_table_head->mutex );
560
- void *data = NULL;
561
- if ( exact_match( &match ) ) {
562
- data = delete_exact_match_strict_entry( _match_table_head->exact_table, &match );
563
- }
564
- else {
565
- // wildcards flags are set
566
- data = delete_wildcards_match_strict_entry( &_match_table_head->wildcards_table, &match, priority );
567
- }
568
- pthread_mutex_unlock( _match_table_head->mutex );
569
- return data;
570
- }
571
-
572
-
573
- static void
574
- _map_match_table( struct ofp_match *match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
575
- if ( _match_table_head == NULL ) {
576
- die( "match table is not initialized." );
577
- }
578
- if ( function == NULL ) {
579
- die( "function must not be NULL" );
580
- }
581
-
582
- pthread_mutex_lock( _match_table_head->mutex );
583
- map_exact_match_table( _match_table_head->exact_table, match, function, user_data );
584
- map_wildcards_match_table( _match_table_head->wildcards_table, match, function, user_data );
585
- pthread_mutex_unlock( _match_table_head->mutex );
586
- }
587
-
588
-
589
- void
590
- foreach_match_table( void function( struct ofp_match, uint16_t, void *, void * ), void *user_data ) {
591
- _map_match_table( NULL, function, user_data );
592
- }
593
-
594
-
595
- void
596
- map_match_table( struct ofp_match match, void function( struct ofp_match match, uint16_t priority, void *data, void *user_data ), void *user_data ) {
597
- _map_match_table( &match, function, user_data );
598
- }
599
-
600
-
601
- /*
602
- * Local variables:
603
- * c-basic-offset: 2
604
- * indent-tabs-mode: nil
605
- * End:
606
- */