trema 0.1.3

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 (560) hide show
  1. data/.mono.rant +4107 -0
  2. data/.rspec +1 -0
  3. data/.yardopts +4 -0
  4. data/Doxyfile +1679 -0
  5. data/GPL2 +339 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +71 -0
  8. data/README.md +135 -0
  9. data/Rakefile +140 -0
  10. data/Rantfile +834 -0
  11. data/VERSION +1 -0
  12. data/build.rb +32 -0
  13. data/cruise.rb +389 -0
  14. data/features/example.dumper.feature +87 -0
  15. data/features/example.learning_switch.feature +39 -0
  16. data/features/example.list_switches.feature +38 -0
  17. data/features/example.message.echo_reply.feature +26 -0
  18. data/features/example.message.echo_request.feature +25 -0
  19. data/features/example.message.features_request.feature +84 -0
  20. data/features/example.message.hello.feature +25 -0
  21. data/features/example.message.set_config.feature +27 -0
  22. data/features/example.multi_learning_switch.feature +135 -0
  23. data/features/example.packetin_filter_config.feature +91 -0
  24. data/features/example.repeater_hub.feature +49 -0
  25. data/features/example.switch_monitor.feature +39 -0
  26. data/features/packetin_filter.feature +49 -0
  27. data/features/step_definitions/kill_steps.rb +30 -0
  28. data/features/step_definitions/log_steps.rb +90 -0
  29. data/features/step_definitions/misc_steps.rb +64 -0
  30. data/features/step_definitions/off_steps.rb +30 -0
  31. data/features/step_definitions/run_steps.rb +91 -0
  32. data/features/step_definitions/send_packets_steps.rb +42 -0
  33. data/features/step_definitions/show_stats_steps.rb +43 -0
  34. data/features/step_definitions/stats_steps.rb +39 -0
  35. data/features/support/env.rb +75 -0
  36. data/features/support/hooks.rb +8 -0
  37. data/features/switch_manager.feature +35 -0
  38. data/features/trema-config.feature +68 -0
  39. data/features/trema.dump_flows.feature +25 -0
  40. data/features/trema.feature +25 -0
  41. data/features/trema.kill.feature +53 -0
  42. data/features/trema.killall.feature +30 -0
  43. data/features/trema.reset_stats.feature +14 -0
  44. data/features/trema.run.feature +46 -0
  45. data/features/trema.send_packets.feature +56 -0
  46. data/features/trema.show_stats.feature +67 -0
  47. data/features/tutorial.hello_trema.feature +27 -0
  48. data/features/tutorial.packet_in.feature +47 -0
  49. data/features/tutorial.switch_info.feature +55 -0
  50. data/ruby/.gitignore +4 -0
  51. data/ruby/blocker.rb +78 -0
  52. data/ruby/extconf.rb +71 -0
  53. data/ruby/sub-process.rb +291 -0
  54. data/ruby/trema/action-common.c +60 -0
  55. data/ruby/trema/action-common.h +42 -0
  56. data/ruby/trema/action-enqueue.c +161 -0
  57. data/ruby/trema/action-enqueue.h +40 -0
  58. data/ruby/trema/action-output.c +169 -0
  59. data/ruby/trema/action-output.h +42 -0
  60. data/ruby/trema/action-set-dl-dst.c +131 -0
  61. data/ruby/trema/action-set-dl-dst.h +44 -0
  62. data/ruby/trema/action-set-dl-src.c +131 -0
  63. data/ruby/trema/action-set-dl-src.h +44 -0
  64. data/ruby/trema/action-set-nw-dst.c +135 -0
  65. data/ruby/trema/action-set-nw-dst.h +42 -0
  66. data/ruby/trema/action-set-nw-src.c +140 -0
  67. data/ruby/trema/action-set-nw-src.h +42 -0
  68. data/ruby/trema/action-set-nw-tos.c +124 -0
  69. data/ruby/trema/action-set-nw-tos.h +42 -0
  70. data/ruby/trema/action-set-tp-dst.c +122 -0
  71. data/ruby/trema/action-set-tp-dst.h +42 -0
  72. data/ruby/trema/action-set-tp-src.c +124 -0
  73. data/ruby/trema/action-set-tp-src.h +42 -0
  74. data/ruby/trema/action-set-vlan-pcp.c +128 -0
  75. data/ruby/trema/action-set-vlan-pcp.h +42 -0
  76. data/ruby/trema/action-set-vlan-vid.c +125 -0
  77. data/ruby/trema/action-set-vlan-vid.h +42 -0
  78. data/ruby/trema/action-strip-vlan.c +81 -0
  79. data/ruby/trema/action-strip-vlan.h +42 -0
  80. data/ruby/trema/action-vendor.c +121 -0
  81. data/ruby/trema/action-vendor.h +42 -0
  82. data/ruby/trema/aggregate-stats-reply.rb +70 -0
  83. data/ruby/trema/app.rb +112 -0
  84. data/ruby/trema/barrier-reply.c +99 -0
  85. data/ruby/trema/barrier-reply.h +46 -0
  86. data/ruby/trema/barrier-request.c +108 -0
  87. data/ruby/trema/barrier-request.h +44 -0
  88. data/ruby/trema/cli.rb +269 -0
  89. data/ruby/trema/command.rb +40 -0
  90. data/ruby/trema/command/dump_flows.rb +62 -0
  91. data/ruby/trema/command/kill.rb +71 -0
  92. data/ruby/trema/command/killall.rb +56 -0
  93. data/ruby/trema/command/reset_stats.rb +61 -0
  94. data/ruby/trema/command/ruby.rb +55 -0
  95. data/ruby/trema/command/run.rb +120 -0
  96. data/ruby/trema/command/send_packets.rb +130 -0
  97. data/ruby/trema/command/shell.rb +61 -0
  98. data/ruby/trema/command/show_stats.rb +84 -0
  99. data/ruby/trema/command/usage.rb +61 -0
  100. data/ruby/trema/command/version.rb +39 -0
  101. data/ruby/trema/controller.c +595 -0
  102. data/ruby/trema/controller.h +44 -0
  103. data/ruby/trema/controller.rb +81 -0
  104. data/ruby/trema/daemon.rb +167 -0
  105. data/ruby/trema/dsl.rb +34 -0
  106. data/ruby/trema/dsl/configuration.rb +153 -0
  107. data/ruby/trema/dsl/context.rb +71 -0
  108. data/ruby/trema/dsl/link.rb +41 -0
  109. data/ruby/trema/dsl/parser.rb +70 -0
  110. data/ruby/trema/dsl/run.rb +49 -0
  111. data/ruby/trema/dsl/runner.rb +165 -0
  112. data/ruby/trema/dsl/stanza.rb +53 -0
  113. data/ruby/trema/dsl/switch.rb +78 -0
  114. data/ruby/trema/dsl/syntax-error.rb +33 -0
  115. data/ruby/trema/dsl/syntax.rb +109 -0
  116. data/ruby/trema/dsl/vhost.rb +108 -0
  117. data/ruby/trema/dsl/vswitch.rb +47 -0
  118. data/ruby/trema/echo-reply.c +107 -0
  119. data/ruby/trema/echo-reply.h +42 -0
  120. data/ruby/trema/echo-request.c +140 -0
  121. data/ruby/trema/echo-request.h +42 -0
  122. data/ruby/trema/error.c +253 -0
  123. data/ruby/trema/error.h +44 -0
  124. data/ruby/trema/exact-match.rb +36 -0
  125. data/ruby/trema/executables.rb +95 -0
  126. data/ruby/trema/features-reply.c +238 -0
  127. data/ruby/trema/features-reply.h +60 -0
  128. data/ruby/trema/features-request.c +109 -0
  129. data/ruby/trema/features-request.h +44 -0
  130. data/ruby/trema/flow-removed.c +275 -0
  131. data/ruby/trema/flow-removed.h +46 -0
  132. data/ruby/trema/flow-stats-reply.rb +109 -0
  133. data/ruby/trema/flow.rb +56 -0
  134. data/ruby/trema/get-config-reply.c +159 -0
  135. data/ruby/trema/get-config-reply.h +52 -0
  136. data/ruby/trema/get-config-request.c +107 -0
  137. data/ruby/trema/get-config-request.h +44 -0
  138. data/ruby/trema/hello.c +110 -0
  139. data/ruby/trema/hello.h +44 -0
  140. data/ruby/trema/host.rb +257 -0
  141. data/ruby/trema/ip.rb +101 -0
  142. data/ruby/trema/link.rb +176 -0
  143. data/ruby/trema/list-switches-reply.c +46 -0
  144. data/ruby/trema/list-switches-reply.h +40 -0
  145. data/ruby/trema/logger.c +162 -0
  146. data/ruby/trema/logger.h +44 -0
  147. data/ruby/trema/mac.rb +151 -0
  148. data/ruby/trema/match.c +594 -0
  149. data/ruby/trema/match.h +36 -0
  150. data/ruby/trema/monkey-patch/integer.rb +35 -0
  151. data/ruby/trema/monkey-patch/integer/base-conversions.rb +36 -0
  152. data/ruby/trema/monkey-patch/integer/ranges.rb +51 -0
  153. data/ruby/trema/monkey-patch/module.rb +33 -0
  154. data/ruby/trema/monkey-patch/module/deprecation.rb +41 -0
  155. data/ruby/trema/monkey-patch/string.rb +33 -0
  156. data/ruby/trema/monkey-patch/string/inflectors.rb +54 -0
  157. data/ruby/trema/network-component.rb +153 -0
  158. data/ruby/trema/ofctl.rb +62 -0
  159. data/ruby/trema/open-vswitch.rb +154 -0
  160. data/ruby/trema/openflow-error.c +191 -0
  161. data/ruby/trema/openflow-error.h +53 -0
  162. data/ruby/trema/openflow-switch.rb +88 -0
  163. data/ruby/trema/ordered-hash.rb +74 -0
  164. data/ruby/trema/packet-queue.rb +178 -0
  165. data/ruby/trema/packet_in.c +736 -0
  166. data/ruby/trema/packet_in.h +46 -0
  167. data/ruby/trema/packetin-filter.rb +126 -0
  168. data/ruby/trema/path.rb +135 -0
  169. data/ruby/trema/phost.rb +69 -0
  170. data/ruby/trema/port-mod.c +226 -0
  171. data/ruby/trema/port-mod.h +36 -0
  172. data/ruby/trema/port-stats-reply.rb +111 -0
  173. data/ruby/trema/port-status.c +156 -0
  174. data/ruby/trema/port-status.h +45 -0
  175. data/ruby/trema/port.c +295 -0
  176. data/ruby/trema/port.h +47 -0
  177. data/ruby/trema/process.rb +76 -0
  178. data/ruby/trema/queue-get-config-reply.c +200 -0
  179. data/ruby/trema/queue-get-config-reply.h +47 -0
  180. data/ruby/trema/queue-get-config-request.c +141 -0
  181. data/ruby/trema/queue-get-config-request.h +44 -0
  182. data/ruby/trema/queue-stats-reply.rb +78 -0
  183. data/ruby/trema/set-config.c +171 -0
  184. data/ruby/trema/set-config.h +44 -0
  185. data/ruby/trema/shell.rb +39 -0
  186. data/ruby/trema/shell/down.rb +39 -0
  187. data/ruby/trema/shell/killall.rb +40 -0
  188. data/ruby/trema/shell/link.rb +61 -0
  189. data/ruby/trema/shell/reset_stats.rb +50 -0
  190. data/ruby/trema/shell/run.rb +67 -0
  191. data/ruby/trema/shell/send_packets.rb +42 -0
  192. data/ruby/trema/shell/show_stats.rb +49 -0
  193. data/ruby/trema/shell/up.rb +43 -0
  194. data/ruby/trema/shell/vhost.rb +44 -0
  195. data/ruby/trema/shell/vswitch.rb +49 -0
  196. data/ruby/trema/stats-helper.rb +65 -0
  197. data/ruby/trema/stats-reply.c +483 -0
  198. data/ruby/trema/stats-reply.h +53 -0
  199. data/ruby/trema/stats-request.c +634 -0
  200. data/ruby/trema/stats-request.h +42 -0
  201. data/ruby/trema/switch-daemon.rb +74 -0
  202. data/ruby/trema/switch-disconnected.c +40 -0
  203. data/ruby/trema/switch-disconnected.h +38 -0
  204. data/ruby/trema/switch-manager.rb +121 -0
  205. data/ruby/trema/switch.rb +37 -0
  206. data/ruby/trema/table-stats-reply.rb +87 -0
  207. data/ruby/trema/timers.rb +97 -0
  208. data/ruby/trema/trema.c +122 -0
  209. data/ruby/trema/tremashark.rb +39 -0
  210. data/ruby/trema/util.rb +84 -0
  211. data/ruby/trema/vendor-request.c +193 -0
  212. data/ruby/trema/vendor-request.h +44 -0
  213. data/ruby/trema/vendor-stats-reply.rb +62 -0
  214. data/ruby/trema/vendor.c +152 -0
  215. data/ruby/trema/vendor.h +52 -0
  216. data/ruby/trema/version.rb +30 -0
  217. data/spec/spec_helper.rb +153 -0
  218. data/spec/support/openflow-message.rb +94 -0
  219. data/spec/trema/action-enqueue_spec.rb +100 -0
  220. data/spec/trema/action-output_spec.rb +116 -0
  221. data/spec/trema/action-set-dl-dst_spec.rb +95 -0
  222. data/spec/trema/action-set-dl-src_spec.rb +92 -0
  223. data/spec/trema/action-set-nw-dst_spec.rb +96 -0
  224. data/spec/trema/action-set-nw-src_spec.rb +97 -0
  225. data/spec/trema/action-set-nw-tos_spec.rb +88 -0
  226. data/spec/trema/action-set-tp-dst_spec.rb +88 -0
  227. data/spec/trema/action-set-tp-src_spec.rb +88 -0
  228. data/spec/trema/action-set-vlan-pcp_spec.rb +91 -0
  229. data/spec/trema/action-set-vlan-vid_spec.rb +91 -0
  230. data/spec/trema/action-strip-vlan_spec.rb +57 -0
  231. data/spec/trema/action-vendor_spec.rb +90 -0
  232. data/spec/trema/app_spec.rb +90 -0
  233. data/spec/trema/barrier-reply_spec.rb +45 -0
  234. data/spec/trema/barrier-request_spec.rb +83 -0
  235. data/spec/trema/cli_spec.rb +160 -0
  236. data/spec/trema/controller_spec.rb +100 -0
  237. data/spec/trema/dsl/configuration_spec.rb +122 -0
  238. data/spec/trema/dsl/link_spec.rb +54 -0
  239. data/spec/trema/dsl/run_spec.rb +78 -0
  240. data/spec/trema/dsl/runner_spec.rb +239 -0
  241. data/spec/trema/dsl/switch_spec.rb +77 -0
  242. data/spec/trema/dsl/syntax_spec.rb +121 -0
  243. data/spec/trema/dsl/vhost_spec.rb +148 -0
  244. data/spec/trema/dsl/vswitch_spec.rb +90 -0
  245. data/spec/trema/echo-reply_spec.rb +49 -0
  246. data/spec/trema/echo-request_spec.rb +75 -0
  247. data/spec/trema/error_spec.rb +142 -0
  248. data/spec/trema/executables_spec.rb +75 -0
  249. data/spec/trema/features-reply_spec.rb +57 -0
  250. data/spec/trema/features-request_spec.rb +66 -0
  251. data/spec/trema/flow-removed_spec.rb +146 -0
  252. data/spec/trema/get-config-reply_spec.rb +43 -0
  253. data/spec/trema/get-config-request_spec.rb +82 -0
  254. data/spec/trema/hello_spec.rb +49 -0
  255. data/spec/trema/host_spec.rb +193 -0
  256. data/spec/trema/link_spec.rb +64 -0
  257. data/spec/trema/list-switches-reply_spec.rb +48 -0
  258. data/spec/trema/logger_spec.rb +48 -0
  259. data/spec/trema/mac_spec.rb +115 -0
  260. data/spec/trema/match_spec.rb +113 -0
  261. data/spec/trema/open-vswitch_spec.rb +123 -0
  262. data/spec/trema/openflow-error_spec.rb +141 -0
  263. data/spec/trema/openflow-switch_spec.rb +56 -0
  264. data/spec/trema/packet-in_spec.rb +168 -0
  265. data/spec/trema/packet-out_spec.rb +128 -0
  266. data/spec/trema/packetin-filter_spec.rb +41 -0
  267. data/spec/trema/port-mod_spec.rb +101 -0
  268. data/spec/trema/port-status_spec.rb +108 -0
  269. data/spec/trema/port_spec.rb +61 -0
  270. data/spec/trema/process_spec.rb +71 -0
  271. data/spec/trema/queue-get-config-reply_spec.rb +66 -0
  272. data/spec/trema/queue-get-config-request_spec.rb +69 -0
  273. data/spec/trema/set-config_spec.rb +80 -0
  274. data/spec/trema/shell/vhost_spec.rb +57 -0
  275. data/spec/trema/shell/vswitch_spec.rb +89 -0
  276. data/spec/trema/stats-reply_spec.rb +306 -0
  277. data/spec/trema/stats-request_spec.rb +151 -0
  278. data/spec/trema/switch-disconnected_spec.rb +58 -0
  279. data/spec/trema/switch-manager_spec.rb +43 -0
  280. data/spec/trema/tremashark_spec.rb +41 -0
  281. data/spec/trema/util_spec.rb +93 -0
  282. data/spec/trema/vendor-request_spec.rb +79 -0
  283. data/src/examples/cbench_switch/README +21 -0
  284. data/src/examples/cbench_switch/cbench-switch.rb +39 -0
  285. data/src/examples/cbench_switch/cbench_switch.c +68 -0
  286. data/src/examples/dumper/dumper.c +370 -0
  287. data/src/examples/dumper/dumper.conf +7 -0
  288. data/src/examples/dumper/dumper.rb +196 -0
  289. data/src/examples/hello_trema/README +13 -0
  290. data/src/examples/hello_trema/hello_trema.c +51 -0
  291. data/src/examples/hello_trema/hello_trema.conf +3 -0
  292. data/src/examples/hello_trema/hello_trema.rb +35 -0
  293. data/src/examples/learning_switch/README +15 -0
  294. data/src/examples/learning_switch/fdb.rb +112 -0
  295. data/src/examples/learning_switch/learning-switch.rb +88 -0
  296. data/src/examples/learning_switch/learning_switch.c +236 -0
  297. data/src/examples/learning_switch/learning_switch.conf +18 -0
  298. data/src/examples/list_switches/README +19 -0
  299. data/src/examples/list_switches/list-switches.rb +45 -0
  300. data/src/examples/list_switches/list_switches.c +81 -0
  301. data/src/examples/list_switches/list_switches.conf +15 -0
  302. data/src/examples/match_compare/match-compare.conf +30 -0
  303. data/src/examples/match_compare/match-compare.rb +99 -0
  304. data/src/examples/multi_learning_switch/README +14 -0
  305. data/src/examples/multi_learning_switch/multi-learning-switch.rb +96 -0
  306. data/src/examples/multi_learning_switch/multi_learning_switch.c +296 -0
  307. data/src/examples/multi_learning_switch/multi_learning_switch.conf +17 -0
  308. data/src/examples/openflow_message/README +11 -0
  309. data/src/examples/openflow_message/echo-reply.rb +59 -0
  310. data/src/examples/openflow_message/echo-request.rb +58 -0
  311. data/src/examples/openflow_message/echo_reply.c +70 -0
  312. data/src/examples/openflow_message/echo_request.c +70 -0
  313. data/src/examples/openflow_message/example.rb +63 -0
  314. data/src/examples/openflow_message/features-request.rb +97 -0
  315. data/src/examples/openflow_message/features_request.c +168 -0
  316. data/src/examples/openflow_message/hello.c +70 -0
  317. data/src/examples/openflow_message/hello.rb +58 -0
  318. data/src/examples/openflow_message/set-config.rb +59 -0
  319. data/src/examples/openflow_message/set_config.c +70 -0
  320. data/src/examples/packet_in/README +15 -0
  321. data/src/examples/packet_in/packet_in.c +55 -0
  322. data/src/examples/packet_in/packet_in.conf +15 -0
  323. data/src/examples/packet_in/packet_in.rb +34 -0
  324. data/src/examples/packetin_filter_config/README +12 -0
  325. data/src/examples/packetin_filter_config/add_filter.c +73 -0
  326. data/src/examples/packetin_filter_config/delete_filter.c +65 -0
  327. data/src/examples/packetin_filter_config/delete_filter_strict.c +75 -0
  328. data/src/examples/packetin_filter_config/dump_filter.c +65 -0
  329. data/src/examples/packetin_filter_config/dump_filter_strict.c +75 -0
  330. data/src/examples/packetin_filter_config/packetin_filter_config.c +134 -0
  331. data/src/examples/packetin_filter_config/packetin_filter_config.conf +7 -0
  332. data/src/examples/packetin_filter_config/utils.c +102 -0
  333. data/src/examples/packetin_filter_config/utils.h +42 -0
  334. data/src/examples/repeater_hub/README +8 -0
  335. data/src/examples/repeater_hub/repeater-hub.rb +43 -0
  336. data/src/examples/repeater_hub/repeater-hub_spec.rb +156 -0
  337. data/src/examples/repeater_hub/repeater_hub.c +83 -0
  338. data/src/examples/repeater_hub/repeater_hub.conf +28 -0
  339. data/src/examples/switch_info/README +13 -0
  340. data/src/examples/switch_info/switch_info.c +80 -0
  341. data/src/examples/switch_info/switch_info.conf +3 -0
  342. data/src/examples/switch_info/switch_info.rb +46 -0
  343. data/src/examples/switch_monitor/switch-monitor.conf +3 -0
  344. data/src/examples/switch_monitor/switch-monitor.rb +58 -0
  345. data/src/examples/switch_monitor/switch_monitor.c +154 -0
  346. data/src/examples/traffic_monitor/counter.c +74 -0
  347. data/src/examples/traffic_monitor/counter.h +48 -0
  348. data/src/examples/traffic_monitor/counter.rb +46 -0
  349. data/src/examples/traffic_monitor/fdb.c +76 -0
  350. data/src/examples/traffic_monitor/fdb.h +50 -0
  351. data/src/examples/traffic_monitor/fdb.rb +44 -0
  352. data/src/examples/traffic_monitor/traffic-monitor.rb +100 -0
  353. data/src/examples/traffic_monitor/traffic_monitor.c +163 -0
  354. data/src/examples/traffic_monitor/traffic_monitor.conf +16 -0
  355. data/src/lib/arp.h +61 -0
  356. data/src/lib/bool.h +49 -0
  357. data/src/lib/buffer.c +305 -0
  358. data/src/lib/buffer.h +56 -0
  359. data/src/lib/byteorder.c +547 -0
  360. data/src/lib/byteorder.h +110 -0
  361. data/src/lib/checks.h +42 -0
  362. data/src/lib/daemon.c +302 -0
  363. data/src/lib/daemon.h +42 -0
  364. data/src/lib/doubly_linked_list.c +281 -0
  365. data/src/lib/doubly_linked_list.h +88 -0
  366. data/src/lib/ether.c +48 -0
  367. data/src/lib/ether.h +94 -0
  368. data/src/lib/etherip.h +46 -0
  369. data/src/lib/event_handler.c +389 -0
  370. data/src/lib/event_handler.h +64 -0
  371. data/src/lib/hash_table.c +417 -0
  372. data/src/lib/hash_table.h +138 -0
  373. data/src/lib/icmp.h +74 -0
  374. data/src/lib/igmp.h +50 -0
  375. data/src/lib/ipv4.h +50 -0
  376. data/src/lib/linked_list.c +199 -0
  377. data/src/lib/linked_list.h +84 -0
  378. data/src/lib/log.c +402 -0
  379. data/src/lib/log.h +78 -0
  380. data/src/lib/match.h +84 -0
  381. data/src/lib/match_table.c +608 -0
  382. data/src/lib/match_table.h +51 -0
  383. data/src/lib/message_queue.c +143 -0
  384. data/src/lib/message_queue.h +61 -0
  385. data/src/lib/messenger.c +1714 -0
  386. data/src/lib/messenger.h +145 -0
  387. data/src/lib/openflow_application_interface.c +1673 -0
  388. data/src/lib/openflow_application_interface.h +329 -0
  389. data/src/lib/openflow_message.c +4051 -0
  390. data/src/lib/openflow_message.h +288 -0
  391. data/src/lib/openflow_service_interface.h +59 -0
  392. data/src/lib/packet_info.c +230 -0
  393. data/src/lib/packet_info.h +209 -0
  394. data/src/lib/packet_parser.c +502 -0
  395. data/src/lib/packetin_filter_interface.c +294 -0
  396. data/src/lib/packetin_filter_interface.h +127 -0
  397. data/src/lib/persistent_storage.c +480 -0
  398. data/src/lib/persistent_storage.h +46 -0
  399. data/src/lib/stat.c +213 -0
  400. data/src/lib/stat.h +44 -0
  401. data/src/lib/tcp.h +67 -0
  402. data/src/lib/timer.c +350 -0
  403. data/src/lib/timer.h +53 -0
  404. data/src/lib/trema.c +710 -0
  405. data/src/lib/trema.h +79 -0
  406. data/src/lib/trema_private.c +177 -0
  407. data/src/lib/trema_private.h +60 -0
  408. data/src/lib/trema_wrapper.c +56 -0
  409. data/src/lib/trema_wrapper.h +64 -0
  410. data/src/lib/udp.h +43 -0
  411. data/src/lib/utility.c +515 -0
  412. data/src/lib/utility.h +67 -0
  413. data/src/lib/wrapper.c +100 -0
  414. data/src/lib/wrapper.h +76 -0
  415. data/src/packetin_filter/README +17 -0
  416. data/src/packetin_filter/packetin_filter.c +575 -0
  417. data/src/switch_manager/README +20 -0
  418. data/src/switch_manager/cookie_table.c +292 -0
  419. data/src/switch_manager/cookie_table.h +72 -0
  420. data/src/switch_manager/dpid_table.c +110 -0
  421. data/src/switch_manager/dpid_table.h +46 -0
  422. data/src/switch_manager/management_interface.h +44 -0
  423. data/src/switch_manager/ofpmsg_recv.c +482 -0
  424. data/src/switch_manager/ofpmsg_recv.h +42 -0
  425. data/src/switch_manager/ofpmsg_send.c +235 -0
  426. data/src/switch_manager/ofpmsg_send.h +50 -0
  427. data/src/switch_manager/secure_channel_listener.c +281 -0
  428. data/src/switch_manager/secure_channel_listener.h +42 -0
  429. data/src/switch_manager/secure_channel_receiver.c +126 -0
  430. data/src/switch_manager/secure_channel_receiver.h +43 -0
  431. data/src/switch_manager/secure_channel_sender.c +126 -0
  432. data/src/switch_manager/secure_channel_sender.h +43 -0
  433. data/src/switch_manager/service_interface.c +181 -0
  434. data/src/switch_manager/service_interface.h +46 -0
  435. data/src/switch_manager/switch.c +538 -0
  436. data/src/switch_manager/switch.h +51 -0
  437. data/src/switch_manager/switch_manager.c +448 -0
  438. data/src/switch_manager/switch_manager.h +63 -0
  439. data/src/switch_manager/switchinfo.h +72 -0
  440. data/src/switch_manager/xid_table.c +184 -0
  441. data/src/switch_manager/xid_table.h +56 -0
  442. data/src/tremashark/README +78 -0
  443. data/src/tremashark/packet_capture.c +357 -0
  444. data/src/tremashark/pcap_private.h +47 -0
  445. data/src/tremashark/pcap_queue.c +197 -0
  446. data/src/tremashark/pcap_queue.h +58 -0
  447. data/src/tremashark/plugin/.gitignore +6 -0
  448. data/src/tremashark/plugin/packet-trema/.gitignore +5 -0
  449. data/src/tremashark/plugin/packet-trema/Makefile +77 -0
  450. data/src/tremashark/plugin/packet-trema/Makefile.am +110 -0
  451. data/src/tremashark/plugin/packet-trema/Makefile.common +31 -0
  452. data/src/tremashark/plugin/packet-trema/moduleinfo.h +41 -0
  453. data/src/tremashark/plugin/packet-trema/packet-trema.c +1659 -0
  454. data/src/tremashark/plugin/packet-trema/plugin.c +31 -0
  455. data/src/tremashark/plugin/user_dlts +2 -0
  456. data/src/tremashark/queue.c +168 -0
  457. data/src/tremashark/queue.h +60 -0
  458. data/src/tremashark/stdin_relay.c +257 -0
  459. data/src/tremashark/syslog_relay.c +247 -0
  460. data/src/tremashark/tremashark.c +556 -0
  461. data/trema +93 -0
  462. data/trema-config +61 -0
  463. data/unittests/buffer_stubs.c +74 -0
  464. data/unittests/cmockery_trema.c +123 -0
  465. data/unittests/cmockery_trema.h +96 -0
  466. data/unittests/lib/buffer_test.c +370 -0
  467. data/unittests/lib/byteorder_test.c +1717 -0
  468. data/unittests/lib/daemon_test.c +664 -0
  469. data/unittests/lib/doubly_linked_list_test.c +346 -0
  470. data/unittests/lib/ether_test.c +127 -0
  471. data/unittests/lib/hash_table_test.c +278 -0
  472. data/unittests/lib/linked_list_test.c +343 -0
  473. data/unittests/lib/log_test.c +459 -0
  474. data/unittests/lib/match_table_test.c +1509 -0
  475. data/unittests/lib/message_queue_test.c +379 -0
  476. data/unittests/lib/messenger_test.c +438 -0
  477. data/unittests/lib/openflow_application_interface_test.c +3488 -0
  478. data/unittests/lib/openflow_message_test.c +7337 -0
  479. data/unittests/lib/packet_info_test.c +544 -0
  480. data/unittests/lib/packet_parser_test.c +703 -0
  481. data/unittests/lib/packetin_filter_interface_test.c +723 -0
  482. data/unittests/lib/persistent_storage_test.c +802 -0
  483. data/unittests/lib/stat_test.c +291 -0
  484. data/unittests/lib/test_packets/arp_rep.cap +0 -0
  485. data/unittests/lib/test_packets/arp_req.cap +0 -0
  486. data/unittests/lib/test_packets/icmp_echo_rep.cap +0 -0
  487. data/unittests/lib/test_packets/icmp_echo_req.cap +0 -0
  488. data/unittests/lib/test_packets/igmp_query_v2.cap +0 -0
  489. data/unittests/lib/test_packets/ipx.cap +0 -0
  490. data/unittests/lib/test_packets/lldp.cap +0 -0
  491. data/unittests/lib/test_packets/lldp_over_ip.cap +0 -0
  492. data/unittests/lib/test_packets/tcp.cap +0 -0
  493. data/unittests/lib/test_packets/tcp_syn.cap +0 -0
  494. data/unittests/lib/test_packets/udp.cap +0 -0
  495. data/unittests/lib/test_packets/udp_frag_head.cap +0 -0
  496. data/unittests/lib/test_packets/udp_frag_next.cap +0 -0
  497. data/unittests/lib/test_packets/vtag_icmp_echo_rep.cap +0 -0
  498. data/unittests/lib/test_packets/vtag_icmp_echo_req.cap +0 -0
  499. data/unittests/lib/timer_test.c +248 -0
  500. data/unittests/lib/trema_private_test.c +323 -0
  501. data/unittests/lib/trema_test.c +985 -0
  502. data/unittests/lib/utility_test.c +628 -0
  503. data/unittests/lib/wrapper_test.c +201 -0
  504. data/unittests/packetin_filter/packetin_filter_test.c +477 -0
  505. data/unittests/switch_manager/switch_manager_test.c +1178 -0
  506. data/unittests/wrapper_stubs.c +39 -0
  507. data/vendor/.gitignore +6 -0
  508. data/vendor/README +30 -0
  509. data/vendor/cmockery-20110428.tar.gz +0 -0
  510. data/vendor/oflops-0.03.tar.gz +0 -0
  511. data/vendor/oflops_no_snmp+1.0.0.patch +340 -0
  512. data/vendor/openflow-1.0.0.tar.gz +0 -0
  513. data/vendor/openflow.git.tar.gz +0 -0
  514. data/vendor/openvswitch-1.2.2.tar.gz +0 -0
  515. data/vendor/ruby-ifconfig-1.2/COPYING +340 -0
  516. data/vendor/ruby-ifconfig-1.2/Changelog +16 -0
  517. data/vendor/ruby-ifconfig-1.2/INSTALL +239 -0
  518. data/vendor/ruby-ifconfig-1.2/README +38 -0
  519. data/vendor/ruby-ifconfig-1.2/Rakefile +14 -0
  520. data/vendor/ruby-ifconfig-1.2/TODO +8 -0
  521. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/darwin.txt +17 -0
  522. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd.txt +10 -0
  523. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/dragonflybsd_netstat.txt +14 -0
  524. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd.txt +17 -0
  525. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/freebsd_netstat.txt +24 -0
  526. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux.txt +60 -0
  527. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/linux_ethernet.txt +20 -0
  528. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/netbsd.txt +10 -0
  529. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/openbsd.txt +36 -0
  530. data/vendor/ruby-ifconfig-1.2/ifconfig_examples/sunos.txt +10 -0
  531. data/vendor/ruby-ifconfig-1.2/lib/ifconfig.rb +71 -0
  532. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/ifconfig.rb +72 -0
  533. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/interface_types.rb +69 -0
  534. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/bsd/network_types.rb +3 -0
  535. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/ifconfig.rb +84 -0
  536. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/interface_types.rb +130 -0
  537. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/common/network_types.rb +49 -0
  538. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/ifconfig.rb +43 -0
  539. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/interface_types.rb +112 -0
  540. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/linux/network_types.rb +55 -0
  541. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/ifconfig.rb +38 -0
  542. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/interface_types.rb +77 -0
  543. data/vendor/ruby-ifconfig-1.2/lib/ifconfig/sunos/network_types.rb +4 -0
  544. data/vendor/ruby-ifconfig-1.2/setup.rb +1306 -0
  545. data/vendor/ruby-ifconfig-1.2/test/test_bsd.rb +35 -0
  546. data/vendor/ruby-ifconfig-1.2/test/test_darwin.rb +33 -0
  547. data/vendor/ruby-ifconfig-1.2/test/test_dragonflybsd.rb +35 -0
  548. data/vendor/ruby-ifconfig-1.2/test/test_helper.rb +4 -0
  549. data/vendor/ruby-ifconfig-1.2/test/test_linux.rb +31 -0
  550. data/vendor/ruby-ifconfig-1.2/test/test_netbsd.rb +33 -0
  551. data/vendor/ruby-ifconfig-1.2/test/test_openbsd.rb +33 -0
  552. data/vendor/ruby-ifconfig-1.2/test/test_sunos.rb +35 -0
  553. data/vendor/ruby-ifconfig-1.2/test/unit/tc_darwin.rb +40 -0
  554. data/vendor/ruby-ifconfig-1.2/test/unit/tc_dragonflybsd.rb +39 -0
  555. data/vendor/ruby-ifconfig-1.2/test/unit/tc_freebsd.rb +40 -0
  556. data/vendor/ruby-ifconfig-1.2/test/unit/tc_linux.rb +49 -0
  557. data/vendor/ruby-ifconfig-1.2/test/unit/tc_netbsd.rb +39 -0
  558. data/vendor/ruby-ifconfig-1.2/test/unit/tc_openbsd.rb +39 -0
  559. data/vendor/ruby-ifconfig-1.2/test/unit/tc_sunos.rb +44 -0
  560. metadata +856 -0
@@ -0,0 +1,288 @@
1
+ /*
2
+ * An OpenFlow message library.
3
+ *
4
+ * Author: Yasunobu Chiba
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef OPENFLOW_MESSAGE_H
24
+ #define OPENFLOW_MESSAGE_H
25
+
26
+
27
+ #include <openflow.h>
28
+ #include "bool.h"
29
+ #include "buffer.h"
30
+ #include "byteorder.h"
31
+ #include "linked_list.h"
32
+ #include "packet_info.h"
33
+
34
+
35
+ // A structure for storing OpenFlow actions
36
+ typedef struct openflow_actions {
37
+ int n_actions;
38
+ list_element *list;
39
+ } openflow_actions;
40
+
41
+
42
+ // Initialization
43
+ bool init_openflow_message( void );
44
+
45
+ // Functions for creating OpenFlow messages
46
+ buffer *create_hello( const uint32_t transaction_id );
47
+ buffer *create_error( const uint32_t transaction_id, const uint16_t type,
48
+ const uint16_t code, const buffer *data );
49
+ buffer *create_echo_request( const uint32_t transaction_id, const buffer *body );
50
+ buffer *create_echo_reply( const uint32_t transaction_id, const buffer *body );
51
+ buffer *create_vendor( const uint32_t transaction_id, const uint32_t vendor,
52
+ const buffer *body );
53
+ buffer *create_features_request( const uint32_t transaction_id );
54
+ buffer *create_features_reply( const uint32_t transaction_id, const uint64_t datapath_id,
55
+ const uint32_t n_buffers, const uint8_t n_tables,
56
+ const uint32_t capabilities, const uint32_t actions,
57
+ const list_element *ports );
58
+ buffer *create_get_config_request( const uint32_t transaction_id );
59
+ buffer *create_get_config_reply( const uint32_t transaction_id, const uint16_t flags,
60
+ const uint16_t miss_send_len );
61
+ buffer *create_set_config( const uint32_t transaction_id, const uint16_t flags,
62
+ const uint16_t miss_send_len );
63
+ buffer *create_packet_in( const uint32_t transaction_id, const uint32_t buffer_id,
64
+ const uint16_t total_len, uint16_t in_port,
65
+ const uint8_t reason, const buffer *data );
66
+ buffer *create_flow_removed( const uint32_t transaction_id, const struct ofp_match match,
67
+ const uint64_t cookie, const uint16_t priority,
68
+ const uint8_t reason, const uint32_t duration_sec,
69
+ const uint32_t duration_nsec, const uint16_t idle_timeout,
70
+ const uint64_t packet_count, const uint64_t byte_count );
71
+ buffer *create_port_status( const uint32_t transaction_id, const uint8_t reason,
72
+ const struct ofp_phy_port desc);
73
+ buffer *create_packet_out( const uint32_t transaction_id, const uint32_t buffer_id,
74
+ const uint16_t in_port, const openflow_actions *actions,
75
+ const buffer *data );
76
+ buffer *create_flow_mod(
77
+ const uint32_t transaction_id,
78
+ const struct ofp_match match,
79
+ const uint64_t cookie,
80
+ const uint16_t command,
81
+ const uint16_t idle_timeout,
82
+ const uint16_t hard_timeout,
83
+ const uint16_t priority,
84
+ const uint32_t buffer_id,
85
+ const uint16_t out_port,
86
+ const uint16_t flags,
87
+ const openflow_actions *actions
88
+ );
89
+ buffer *create_port_mod( const uint32_t transaction_id, const uint16_t port_no,
90
+ const uint8_t hw_addr[ OFP_ETH_ALEN ], const uint32_t config,
91
+ const uint32_t mask, const uint32_t advertise );
92
+ buffer *create_desc_stats_request( const uint32_t transaction_id, const uint16_t flags );
93
+ buffer *create_flow_stats_request( const uint32_t transaction_id, const uint16_t flags,
94
+ const struct ofp_match match, const uint8_t table_id,
95
+ const uint16_t out_port );
96
+ buffer *create_aggregate_stats_request( const uint32_t transaction_id,
97
+ const uint16_t flags, const struct ofp_match match,
98
+ const uint8_t table_id, const uint16_t out_port );
99
+ buffer *create_table_stats_request( const uint32_t transaction_id, const uint16_t flags );
100
+ buffer *create_port_stats_request( const uint32_t transaction_id, const uint16_t flags,
101
+ const uint16_t port_no );
102
+ buffer *create_queue_stats_request( const uint32_t transaction_id, const uint16_t flags,
103
+ const uint16_t port_no, const uint32_t queue_id );
104
+ buffer *create_vendor_stats_request( const uint32_t transaction_id, const uint16_t flags,
105
+ const uint32_t vendor, const buffer *body );
106
+ buffer *create_desc_stats_reply( const uint32_t transaction_id, const uint16_t flags,
107
+ const char mfr_desc[ DESC_STR_LEN ],
108
+ const char hw_desc[ DESC_STR_LEN ],
109
+ const char sw_desc[ DESC_STR_LEN ],
110
+ const char serial_num[ SERIAL_NUM_LEN ],
111
+ const char dp_desc[ DESC_STR_LEN ] );
112
+ buffer *create_flow_stats_reply( const uint32_t transaction_id, const uint16_t flags,
113
+ const list_element *flows_stats_head );
114
+ buffer *create_aggregate_stats_reply( const uint32_t transaction_id,
115
+ const uint16_t flags,
116
+ const uint64_t packet_count, const uint64_t byte_count,
117
+ const uint32_t flow_count );
118
+ buffer *create_table_stats_reply( const uint32_t transaction_id, const uint16_t flags,
119
+ const list_element *table_stats_head );
120
+ buffer *create_port_stats_reply( const uint32_t transaction_id, const uint16_t flags,
121
+ const list_element *port_stats_head );
122
+ buffer *create_queue_stats_reply( const uint32_t transaction_id, const uint16_t flags,
123
+ const list_element *queue_stats_head );
124
+ buffer *create_vendor_stats_reply( const uint32_t transaction_id, const uint16_t flags,
125
+ const uint32_t vendor, const buffer *body );
126
+ buffer *create_barrier_request( const uint32_t transaction_id );
127
+ buffer *create_barrier_reply( const uint32_t transaction_id );
128
+ buffer *create_queue_get_config_request( const uint32_t transaction_id, const uint16_t port );
129
+ buffer *create_queue_get_config_reply( const uint32_t transaction_id, const uint16_t port,
130
+ const list_element *queues );
131
+ uint32_t get_transaction_id( void );
132
+ uint64_t get_cookie( void );
133
+ openflow_actions *create_actions( void );
134
+ bool delete_actions( openflow_actions *actions );
135
+ bool append_action_output( openflow_actions *actions, const uint16_t port, const uint16_t max_len );
136
+ bool append_action_set_vlan_vid( openflow_actions *actions, const uint16_t vlan_vid );
137
+ bool append_action_set_vlan_pcp( openflow_actions *actions, const uint8_t vlan_pcp );
138
+ bool append_action_strip_vlan( openflow_actions *actions );
139
+ bool append_action_set_dl_src( openflow_actions *actions, const uint8_t hw_addr[ OFP_ETH_ALEN ] );
140
+ bool append_action_set_dl_dst( openflow_actions *actions, const uint8_t hw_addr[ OFP_ETH_ALEN ] );
141
+ bool append_action_set_nw_src( openflow_actions *actions, const uint32_t nw_addr );
142
+ bool append_action_set_nw_dst( openflow_actions *actions, const uint32_t nw_addr );
143
+ bool append_action_set_nw_tos( openflow_actions *actions, const uint8_t nw_tos );
144
+ bool append_action_set_tp_src( openflow_actions *actions, const uint16_t tp_port );
145
+ bool append_action_set_tp_dst( openflow_actions *actions, const uint16_t tp_port );
146
+ bool append_action_enqueue( openflow_actions *actions, const uint16_t port,
147
+ const uint32_t queue_id );
148
+ bool append_action_vendor( openflow_actions *actions, const uint32_t vendor,
149
+ const buffer *data );
150
+
151
+
152
+ // Return code definitions indicating the result of OpenFlow message validation.
153
+ enum {
154
+ SUCCESS = 0,
155
+ ERROR_UNSUPPORTED_VERSION = -60,
156
+ ERROR_INVALID_LENGTH,
157
+ ERROR_TOO_SHORT_MESSAGE,
158
+ ERROR_TOO_LONG_MESSAGE,
159
+ ERROR_INVALID_TYPE,
160
+ ERROR_UNDEFINED_TYPE,
161
+ ERROR_UNSUPPORTED_TYPE,
162
+ ERROR_NO_TABLE_AVAILABLE,
163
+ ERROR_INVALID_PORT_NO,
164
+ ERROR_INVALID_PORT_CONFIG,
165
+ ERROR_INVALID_PORT_STATE,
166
+ ERROR_INVALID_PORT_FEATURES,
167
+ ERROR_INVALID_SWITCH_CONFIG,
168
+ ERROR_INVALID_PACKET_IN_REASON,
169
+ ERROR_INVALID_FLOW_REMOVED_REASON,
170
+ ERROR_INVALID_WILDCARDS,
171
+ ERROR_INVALID_VLAN_VID,
172
+ ERROR_INVALID_VLAN_PCP,
173
+ ERROR_INVALID_NW_TOS,
174
+ ERROR_INVALID_PORT_STATUS_REASON,
175
+ ERROR_TOO_SHORT_QUEUE_DESCRIPTION,
176
+ ERROR_TOO_SHORT_QUEUE_PROPERTY,
177
+ ERROR_TOO_LONG_QUEUE_PROPERTY,
178
+ ERROR_UNDEFINED_QUEUE_PROPERTY,
179
+ ERROR_TOO_SHORT_ACTION,
180
+ ERROR_UNDEFINED_ACTION_TYPE,
181
+ ERROR_INVALID_ACTION_TYPE,
182
+ ERROR_TOO_SHORT_ACTION_OUTPUT,
183
+ ERROR_TOO_LONG_ACTION_OUTPUT,
184
+ ERROR_TOO_SHORT_ACTION_VLAN_VID,
185
+ ERROR_TOO_LONG_ACTION_VLAN_VID,
186
+ ERROR_TOO_SHORT_ACTION_VLAN_PCP,
187
+ ERROR_TOO_LONG_ACTION_VLAN_PCP,
188
+ ERROR_TOO_SHORT_ACTION_STRIP_VLAN,
189
+ ERROR_TOO_LONG_ACTION_STRIP_VLAN,
190
+ ERROR_TOO_SHORT_ACTION_DL_SRC,
191
+ ERROR_TOO_LONG_ACTION_DL_SRC,
192
+ ERROR_TOO_SHORT_ACTION_DL_DST,
193
+ ERROR_TOO_LONG_ACTION_DL_DST,
194
+ ERROR_TOO_SHORT_ACTION_NW_SRC,
195
+ ERROR_TOO_LONG_ACTION_NW_SRC,
196
+ ERROR_TOO_SHORT_ACTION_NW_DST,
197
+ ERROR_TOO_LONG_ACTION_NW_DST,
198
+ ERROR_TOO_SHORT_ACTION_NW_TOS,
199
+ ERROR_TOO_LONG_ACTION_NW_TOS,
200
+ ERROR_TOO_SHORT_ACTION_TP_SRC,
201
+ ERROR_TOO_LONG_ACTION_TP_SRC,
202
+ ERROR_TOO_SHORT_ACTION_TP_DST,
203
+ ERROR_TOO_LONG_ACTION_TP_DST,
204
+ ERROR_TOO_SHORT_ACTION_ENQUEUE,
205
+ ERROR_TOO_LONG_ACTION_ENQUEUE,
206
+ ERROR_TOO_SHORT_ACTION_VENDOR,
207
+ ERROR_UNSUPPORTED_STATS_TYPE,
208
+ ERROR_INVALID_STATS_REPLY_FLAGS,
209
+ ERROR_INVALID_FLOW_PRIORITY,
210
+ ERROR_INVALID_FLOW_MOD_FLAGS,
211
+ ERROR_INVALID_PORT_MASK,
212
+ ERROR_INVALID_STATS_TYPE,
213
+ ERROR_INVALID_STATS_REQUEST_FLAGS,
214
+ ERROR_UNDEFINED_FLOW_MOD_COMMAND,
215
+ ERROR_UNEXPECTED_ERROR = -255
216
+ };
217
+
218
+
219
+ // Functions for validating OpenFlow messages
220
+ int validate_hello( const buffer *message );
221
+ int validate_error( const buffer *message );
222
+ int validate_echo_request( const buffer *message );
223
+ int validate_echo_reply( const buffer *message );
224
+ int validate_vendor( const buffer *message );
225
+ int validate_features_request( const buffer *message );
226
+ int validate_features_reply( const buffer *message );
227
+ int validate_get_config_request( const buffer *message );
228
+ int validate_get_config_reply( const buffer *message );
229
+ int validate_set_config( const buffer *message );
230
+ int validate_packet_in( const buffer *message );
231
+ int validate_flow_removed( const buffer *message );
232
+ int validate_port_status( const buffer *message );
233
+ int validate_packet_out( const buffer *message );
234
+ int validate_flow_mod( const buffer *message );
235
+ int validate_port_mod( const buffer *message );
236
+ int validate_desc_stats_request( const buffer *message );
237
+ int validate_flow_stats_request( const buffer *message );
238
+ int validate_aggregate_stats_request( const buffer *message );
239
+ int validate_table_stats_request( const buffer *message );
240
+ int validate_port_stats_request( const buffer *message );
241
+ int validate_queue_stats_request( const buffer *message );
242
+ int validate_vendor_stats_request( const buffer *message );
243
+ int validate_stats_request( const buffer *message );
244
+ int validate_desc_stats_reply( const buffer *message );
245
+ int validate_flow_stats_reply( const buffer *message );
246
+ int validate_aggregate_stats_reply( const buffer *message );
247
+ int validate_table_stats_reply( const buffer *message );
248
+ int validate_port_stats_reply( const buffer *message );
249
+ int validate_queue_stats_reply( const buffer *message );
250
+ int validate_vendor_stats_reply( const buffer *message );
251
+ int validate_stats_reply( const buffer *message );
252
+ int validate_barrier_request( const buffer *message );
253
+ int validate_barrier_reply( const buffer *message );
254
+ int validate_queue_get_config_request( const buffer *message );
255
+ int validate_queue_get_config_reply( const buffer *message );
256
+ int validate_actions( struct ofp_action_header *actions_head, const uint16_t length );
257
+ int validate_action_output( const struct ofp_action_output *action );
258
+ int validate_action_set_vlan_vid( const struct ofp_action_vlan_vid *action );
259
+ int validate_action_set_vlan_pcp( const struct ofp_action_vlan_pcp *action );
260
+ int validate_action_strip_vlan( const struct ofp_action_header *action );
261
+ int validate_action_set_dl_src( const struct ofp_action_dl_addr *action );
262
+ int validate_action_set_dl_dst( const struct ofp_action_dl_addr *action );
263
+ int validate_action_set_nw_src( const struct ofp_action_nw_addr *action );
264
+ int validate_action_set_nw_dst( const struct ofp_action_nw_addr *action );
265
+ int validate_action_set_nw_tos( const struct ofp_action_nw_tos *action );
266
+ int validate_action_set_tp_src( const struct ofp_action_tp_port *action );
267
+ int validate_action_set_tp_dst( const struct ofp_action_tp_port *action );
268
+ int validate_action_enqueue( const struct ofp_action_enqueue *action );
269
+ int validate_action_vendor( const struct ofp_action_vendor_header *action );
270
+ int validate_openflow_message( const buffer *message );
271
+ bool valid_openflow_message( const buffer *message );
272
+
273
+ // Utility functions
274
+ bool get_error_type_and_code( const uint8_t type, const int error_no,
275
+ uint16_t *error_type, uint16_t *error_code );
276
+ void set_match_from_packet( struct ofp_match *match, const uint16_t in_port,
277
+ const uint32_t wildcards, const buffer *packet );
278
+
279
+
280
+ #endif // OPENFLOW_MESSAGE_H
281
+
282
+
283
+ /*
284
+ * Local variables:
285
+ * c-basic-offset: 2
286
+ * indent-tabs-mode: nil
287
+ * End:
288
+ */
@@ -0,0 +1,59 @@
1
+ /*
2
+ * OpenFlow service interface.
3
+ *
4
+ * Author: Yasunobu Chiba
5
+ *
6
+ * Copyright (C) 2008-2012 NEC Corporation
7
+ *
8
+ * This program is free software; you can redistribute it and/or modify
9
+ * it under the terms of the GNU General Public License, version 2, as
10
+ * published by the Free Software Foundation.
11
+ *
12
+ * This program is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ * GNU General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU General Public License along
18
+ * with this program; if not, write to the Free Software Foundation, Inc.,
19
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ */
21
+
22
+
23
+ #ifndef OPENFLOW_SERVICE_INTERFACE_H
24
+ #define OPENFLOW_SERVICE_INTERFACE_H
25
+
26
+
27
+ /**
28
+ * Message type definitions for sending/receiving OpenFlow messages or
29
+ * related events via messenger.
30
+ */
31
+ #define MESSENGER_OPENFLOW_MESSAGE 1
32
+ #define MESSENGER_OPENFLOW_CONNECTED 2
33
+ #define MESSENGER_OPENFLOW_READY 3
34
+ #define MESSENGER_OPENFLOW_DISCONNECTED 4
35
+ #define MESSENGER_OPENFLOW_DISCONNECT_REQUEST 5
36
+
37
+
38
+ /**
39
+ * Header for sending/receiving OpenFlow messages or events via messenger.
40
+ * A null-terminated service name can be provided after service_name_len
41
+ * and an OpenFlow message must be included in the rest of part in case of
42
+ * MESSENGER_OPENFLOW_MESSAGE. service_name_length can be zero if service
43
+ * name notification is not necessary.
44
+ */
45
+ typedef struct openflow_service_header {
46
+ uint64_t datapath_id;
47
+ uint16_t service_name_length;
48
+ } __attribute__( ( packed ) ) openflow_service_header_t;
49
+
50
+
51
+ #endif // OPENFLOW_SERVICE_INTERFACE_H
52
+
53
+
54
+ /*
55
+ * Local variables:
56
+ * c-basic-offset: 2
57
+ * indent-tabs-mode: nil
58
+ * End:
59
+ */
@@ -0,0 +1,230 @@
1
+ /*
2
+ * Author: Kazuya Suzuki
3
+ *
4
+ * Copyright (C) 2008-2012 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
+ #include <assert.h>
22
+ #include "checks.h"
23
+ #include "packet_info.h"
24
+ #include "wrapper.h"
25
+
26
+
27
+ void
28
+ free_packet_info( buffer *buf ) {
29
+ die_if_NULL( buf );
30
+ die_if_NULL( buf->user_data );
31
+
32
+ xfree( buf->user_data );
33
+ buf->user_data = NULL;
34
+ buf->user_data_free_function = NULL;
35
+ }
36
+
37
+
38
+ void
39
+ calloc_packet_info( buffer *buf ) {
40
+ die_if_NULL( buf );
41
+
42
+ void *user_data = xcalloc( 1, sizeof( packet_info ) );
43
+ assert( user_data != NULL );
44
+
45
+ memset( user_data, 0, sizeof( packet_info ) );
46
+
47
+ buf->user_data = user_data;
48
+ buf->user_data_free_function = free_packet_info;
49
+ }
50
+
51
+
52
+ packet_info
53
+ get_packet_info( const buffer *frame ) {
54
+ die_if_NULL( frame );
55
+
56
+ packet_info info;
57
+
58
+ if ( frame->user_data != NULL ) {
59
+ info = *( packet_info * ) frame->user_data;
60
+ }
61
+ else {
62
+ memset( &info, 0, sizeof( info ) );
63
+ }
64
+
65
+ return info;
66
+ }
67
+
68
+
69
+ static bool
70
+ if_packet_type( const buffer *frame, const uint32_t type ) {
71
+ die_if_NULL( frame );
72
+ packet_info packet_info = get_packet_info( frame );
73
+ return ( ( packet_info.format & type ) == type );
74
+ }
75
+
76
+
77
+ bool
78
+ packet_type_eth_dix( const buffer *frame ) {
79
+ die_if_NULL( frame );
80
+ return if_packet_type( frame, ETH_DIX );
81
+ }
82
+
83
+
84
+ bool
85
+ packet_type_eth_vtag( const buffer *frame ) {
86
+ die_if_NULL( frame );
87
+ return if_packet_type( frame, ETH_8021Q );
88
+ }
89
+
90
+
91
+ bool
92
+ packet_type_eth_raw( const buffer *frame ) {
93
+ die_if_NULL( frame );
94
+ return if_packet_type( frame, ETH_8023_RAW );
95
+ }
96
+
97
+
98
+ bool
99
+ packet_type_eth_llc( const buffer *frame ) {
100
+ die_if_NULL( frame );
101
+ return if_packet_type( frame, ETH_8023_LLC );
102
+ }
103
+
104
+
105
+ bool
106
+ packet_type_ether( const buffer *frame ) {
107
+ die_if_NULL( frame );
108
+ return ( if_packet_type( frame, ETH_DIX ) |
109
+ if_packet_type( frame, ETH_8023_RAW ) |
110
+ if_packet_type( frame, ETH_8023_LLC ) |
111
+ if_packet_type( frame, ETH_8023_SNAP ) );
112
+ }
113
+
114
+
115
+ bool
116
+ packet_type_eth_snap( const buffer *frame ) {
117
+ die_if_NULL( frame );
118
+ return if_packet_type( frame, ETH_8023_SNAP );
119
+ }
120
+
121
+
122
+ bool
123
+ packet_type_arp( const buffer *frame ) {
124
+ die_if_NULL( frame );
125
+ return if_packet_type( frame, NW_ARP );
126
+ }
127
+
128
+
129
+ bool
130
+ packet_type_ipv4( const buffer *frame ) {
131
+ die_if_NULL( frame );
132
+ return if_packet_type( frame, NW_IPV4 );
133
+ }
134
+
135
+
136
+ bool
137
+ packet_type_lldp( const buffer *frame ) {
138
+ die_if_NULL( frame );
139
+ return if_packet_type( frame, NW_LLDP );
140
+ }
141
+
142
+
143
+ bool
144
+ packet_type_icmpv4( const buffer *frame ) {
145
+ die_if_NULL( frame );
146
+ return if_packet_type( frame, NW_ICMPV4 );
147
+ }
148
+
149
+
150
+ bool
151
+ packet_type_igmp( const buffer *frame ) {
152
+ die_if_NULL( frame );
153
+ return if_packet_type( frame, NW_IGMP );
154
+ }
155
+
156
+
157
+ bool
158
+ packet_type_ipv4_tcp( const buffer *frame ) {
159
+ die_if_NULL( frame );
160
+ return if_packet_type( frame, NW_IPV4 | TP_TCP );
161
+ }
162
+
163
+
164
+ bool
165
+ packet_type_ipv4_udp( const buffer *frame ) {
166
+ die_if_NULL( frame );
167
+ return if_packet_type( frame, NW_IPV4 | TP_UDP );
168
+ }
169
+
170
+
171
+ bool
172
+ packet_type_ipv4_etherip( const buffer *frame ) {
173
+ die_if_NULL( frame );
174
+ return if_packet_type( frame, NW_IPV4 | TP_ETHERIP );
175
+ }
176
+
177
+
178
+ static bool
179
+ if_igmp_type( const buffer *frame, const uint32_t type ) {
180
+ die_if_NULL( frame );
181
+ packet_info packet_info = get_packet_info( frame );
182
+ return ( packet_info.igmp_type == type );
183
+ }
184
+
185
+
186
+ bool
187
+ packet_type_igmp_membership_query( const buffer *frame ) {
188
+ die_if_NULL( frame );
189
+ return ( if_packet_type( frame, NW_IGMP ) &
190
+ if_igmp_type( frame, IGMP_TYPE_MEMBERSHIP_QUERY ) );
191
+ }
192
+
193
+
194
+ bool
195
+ packet_type_igmp_v1_membership_report( const buffer *frame ) {
196
+ die_if_NULL( frame );
197
+ return ( if_packet_type( frame, NW_IGMP ) &
198
+ if_igmp_type( frame, IGMP_TYPE_V1_MEMBERSHIP_REPORT ) );
199
+ }
200
+
201
+ bool
202
+ packet_type_igmp_v2_membership_report( const buffer *frame ) {
203
+ die_if_NULL( frame );
204
+ return ( if_packet_type( frame, NW_IGMP ) &
205
+ if_igmp_type( frame, IGMP_TYPE_V2_MEMBERSHIP_REPORT ) );
206
+ }
207
+
208
+
209
+ bool
210
+ packet_type_igmp_v2_leave_group( const buffer *frame ) {
211
+ die_if_NULL( frame );
212
+ return ( if_packet_type( frame, NW_IGMP ) &
213
+ if_igmp_type( frame, IGMP_TYPE_V2_LEAVE_GROUP ) );
214
+ }
215
+
216
+
217
+ bool
218
+ packet_type_igmp_v3_membership_report( const buffer *frame ) {
219
+ die_if_NULL( frame );
220
+ return ( if_packet_type( frame, NW_IGMP ) &
221
+ if_igmp_type( frame, IGMP_TYPE_V3_MEMBERSHIP_REPORT ) );
222
+ }
223
+
224
+
225
+ /*
226
+ * Local variables:
227
+ * c-basic-offset: 2
228
+ * indent-tabs-mode: nil
229
+ * End:
230
+ */