trema 0.2.5 → 0.2.6

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 (292) hide show
  1. data/.gitignore +1 -1
  2. data/Doxyfile +1 -1
  3. data/Gemfile +18 -6
  4. data/README.md +112 -5
  5. data/Rakefile +3 -1
  6. data/Rantfile +88 -1
  7. data/bin/trema +248 -0
  8. data/bin/trema-config +59 -0
  9. data/cruise.rb +1 -1
  10. data/features/example.dumper.feature +45 -65
  11. data/features/example.hello_trema.feature +21 -0
  12. data/features/example.learning_switch.feature +26 -28
  13. data/features/example.list_switches.feature +19 -33
  14. data/features/example.message.echo_reply.feature +10 -10
  15. data/features/example.message.echo_request.feature +2 -2
  16. data/features/example.message.features_request.feature +6 -5
  17. data/features/example.message.hello.feature +47 -13
  18. data/features/example.message.set_config.feature +4 -4
  19. data/features/example.message.vendor-action.feature +23 -0
  20. data/features/example.multi_learning_switch.feature +14 -42
  21. data/features/example.packet_in.feature +31 -0
  22. data/features/example.packetin_filter_config.feature +11 -7
  23. data/features/example.patch_panel.feature +29 -0
  24. data/features/example.repeater_hub.feature +43 -40
  25. data/features/example.switch_info.feature +51 -0
  26. data/features/example.switch_monitor.feature +24 -42
  27. data/features/packetin_filter.feature +28 -22
  28. data/features/step_definitions/misc_steps.rb +19 -8
  29. data/features/step_definitions/send_packets_steps.rb +1 -10
  30. data/features/step_definitions/stats_steps.rb +4 -4
  31. data/features/support/env.rb +2 -1
  32. data/features/support/hooks.rb +35 -2
  33. data/features/switch_manager.feature +18 -12
  34. data/features/trema-config.feature +26 -39
  35. data/features/trema.dump_flows.feature +26 -12
  36. data/features/trema.help.feature +26 -0
  37. data/features/trema.kill.feature +39 -41
  38. data/features/trema.killall.feature +23 -23
  39. data/features/trema.reset_stats.feature +50 -10
  40. data/features/trema.run.feature +28 -39
  41. data/features/trema.send_packets.feature +29 -40
  42. data/features/trema.show_stats.feature +30 -33
  43. data/features/trema.up.feature +33 -0
  44. data/features/trema.version.feature +9 -0
  45. data/ruby/extconf.rb +7 -0
  46. data/ruby/trema/aggregate-stats-reply.rb +3 -3
  47. data/ruby/trema/app.rb +5 -1
  48. data/ruby/trema/barrier-request.c +55 -30
  49. data/ruby/trema/cli.rb +8 -8
  50. data/ruby/trema/command.rb +1 -3
  51. data/ruby/trema/command/dump_flows.rb +5 -24
  52. data/ruby/trema/command/kill.rb +31 -36
  53. data/ruby/trema/command/killall.rb +1 -19
  54. data/{features/step_definitions/kill_steps.rb → ruby/trema/command/netns.rb} +13 -5
  55. data/ruby/trema/command/reset_stats.rb +3 -23
  56. data/ruby/trema/command/ruby.rb +2 -19
  57. data/ruby/trema/command/run.rb +6 -27
  58. data/ruby/trema/command/send_packets.rb +6 -90
  59. data/ruby/trema/command/show_stats.rb +21 -40
  60. data/ruby/trema/command/up.rb +5 -26
  61. data/ruby/trema/command/version.rb +1 -5
  62. data/ruby/trema/controller.c +14 -16
  63. data/ruby/trema/custom-switch.rb +56 -0
  64. data/ruby/trema/desc-stats-reply.rb +5 -5
  65. data/ruby/trema/dsl/configuration.rb +4 -0
  66. data/{features/step_definitions/up_steps.rb → ruby/trema/dsl/custom-switch.rb} +18 -4
  67. data/ruby/trema/dsl/netns.rb +78 -0
  68. data/ruby/trema/dsl/parser.rb +2 -0
  69. data/ruby/trema/dsl/runner.rb +8 -0
  70. data/ruby/trema/dsl/syntax.rb +18 -0
  71. data/ruby/trema/echo-reply.h +2 -2
  72. data/ruby/trema/echo-request.c +3 -5
  73. data/ruby/trema/enqueue.rb +2 -2
  74. data/ruby/trema/error.c +3 -3
  75. data/ruby/trema/executables.rb +26 -2
  76. data/ruby/trema/features-request.c +3 -5
  77. data/ruby/trema/flow-removed.c +6 -6
  78. data/ruby/trema/flow-stats-reply.rb +6 -8
  79. data/ruby/trema/flow.rb +12 -1
  80. data/ruby/trema/get-config-request.c +55 -28
  81. data/ruby/trema/hello.c +3 -5
  82. data/ruby/trema/host.rb +8 -0
  83. data/ruby/trema/list-switches-reply.c +1 -1
  84. data/ruby/trema/mac.rb +1 -1
  85. data/ruby/trema/match.c +15 -14
  86. data/ruby/trema/monkey-patch/module/deprecation.rb +0 -2
  87. data/ruby/trema/netns.rb +127 -0
  88. data/ruby/trema/ordered-hash.rb +5 -4
  89. data/ruby/trema/packet-in.c +136 -113
  90. data/ruby/trema/packet-queue.rb +9 -9
  91. data/ruby/trema/packetin-filter.rb +1 -1
  92. data/ruby/trema/phost.rb +16 -7
  93. data/ruby/trema/port-mod.c +6 -5
  94. data/ruby/trema/port-stats-reply.rb +2 -2
  95. data/ruby/trema/process.rb +29 -0
  96. data/ruby/trema/queue-stats-reply.rb +2 -4
  97. data/ruby/trema/send-out-port.rb +5 -3
  98. data/ruby/trema/set-eth-addr.rb +4 -0
  99. data/ruby/trema/set-ip-addr.rb +4 -2
  100. data/ruby/trema/set-ip-dst-addr.rb +2 -1
  101. data/ruby/trema/set-ip-src-addr.rb +2 -1
  102. data/ruby/trema/set-ip-tos.rb +3 -2
  103. data/ruby/trema/set-transport-port.rb +3 -2
  104. data/ruby/trema/set-vlan-priority.rb +3 -2
  105. data/ruby/trema/set-vlan-vid.rb +5 -4
  106. data/ruby/trema/shell/reset_stats.rb +2 -1
  107. data/ruby/trema/shell/run.rb +1 -1
  108. data/ruby/trema/shell/send_packets.rb +1 -1
  109. data/ruby/trema/shell/show_stats.rb +1 -1
  110. data/ruby/trema/stats-helper.rb +3 -3
  111. data/ruby/trema/stats-reply.c +26 -17
  112. data/ruby/trema/stats-request.c +39 -41
  113. data/ruby/trema/switch-daemon.rb +36 -31
  114. data/ruby/trema/switch.c +1 -1
  115. data/ruby/trema/table-stats-reply.rb +1 -1
  116. data/ruby/trema/timers.rb +13 -13
  117. data/ruby/trema/trema.c +3 -3
  118. data/ruby/trema/tremashark.rb +9 -2
  119. data/ruby/trema/util.rb +39 -15
  120. data/ruby/trema/vendor-action.rb +8 -3
  121. data/ruby/trema/vendor-stats-reply.rb +4 -6
  122. data/ruby/trema/vendor.c +1 -1
  123. data/ruby/trema/version.rb +1 -1
  124. data/spec/trema/barrier-request_spec.rb +47 -37
  125. data/spec/trema/controller_spec.rb +1 -0
  126. data/spec/trema/dsl/runner_spec.rb +8 -3
  127. data/spec/trema/dsl/vhost_spec.rb +8 -8
  128. data/spec/trema/echo-request_spec.rb +1 -0
  129. data/spec/trema/features-request_spec.rb +1 -0
  130. data/spec/trema/flow-removed_spec.rb +9 -9
  131. data/spec/trema/get-config-request_spec.rb +51 -39
  132. data/spec/trema/match_spec.rb +1 -1
  133. data/spec/trema/openflow-error_spec.rb +11 -11
  134. data/spec/trema/packet-out_spec.rb +5 -5
  135. data/spec/trema/queue-get-config-reply_spec.rb +1 -1
  136. data/spec/trema/queue-get-config-request_spec.rb +1 -1
  137. data/spec/trema/set-eth-dst-addr_spec.rb +1 -1
  138. data/spec/trema/set-eth-src-addr_spec.rb +1 -1
  139. data/spec/trema/set-ip-dst-addr_spec.rb +1 -0
  140. data/spec/trema/set-ip-src-addr_spec.rb +1 -0
  141. data/spec/trema/set-ip-tos_spec.rb +1 -0
  142. data/spec/trema/set-transport-dst-port_spec.rb +1 -0
  143. data/spec/trema/set-transport-src-port_spec.rb +1 -0
  144. data/spec/trema/set-vlan-priority_spec.rb +1 -0
  145. data/spec/trema/set-vlan-vid_spec.rb +2 -1
  146. data/spec/trema/stats-reply_spec.rb +38 -36
  147. data/spec/trema/stats-request_spec.rb +6 -6
  148. data/spec/trema/strip-vlan-header_spec.rb +1 -0
  149. data/spec/trema/util_spec.rb +3 -2
  150. data/spec/trema/vendor-action_spec.rb +9 -8
  151. data/src/examples/dumper/dumper.c +8 -6
  152. data/src/examples/dumper/dumper.rb +1 -1
  153. data/{features/step_definitions/killall_steps.rb → src/examples/hello_trema/hello-trema.rb} +6 -5
  154. data/src/examples/hello_trema/hello_trema.c +4 -4
  155. data/src/examples/learning_switch/learning_switch.c +1 -1
  156. data/src/examples/list_switches/list_switches.c +2 -2
  157. data/src/examples/match_compare/match-compare.rb +2 -2
  158. data/src/examples/multi_learning_switch/multi-learning-switch.rb +1 -1
  159. data/src/examples/multi_learning_switch/multi_learning_switch.c +3 -3
  160. data/src/examples/openflow_message/README +1 -1
  161. data/src/examples/openflow_message/echo-request.rb +1 -1
  162. data/src/examples/openflow_message/features_request.c +21 -21
  163. data/src/examples/openflow_message/hello.c +1 -3
  164. data/src/examples/openflow_message/hello.rb +9 -24
  165. data/src/examples/{hello_trema/hello_trema.rb → openflow_message/vendor-action.rb} +17 -7
  166. data/src/examples/openflow_message/vendor_action.c +105 -0
  167. data/src/examples/openflow_switch/hello_switch.c +81 -0
  168. data/src/examples/packet_in/packet-in.rb +9 -13
  169. data/src/examples/packetin_filter_config/packetin_filter_config.c +2 -2
  170. data/src/examples/patch_panel/network.conf +14 -0
  171. data/src/examples/patch_panel/patch-panel.conf +1 -0
  172. data/{features/step_definitions/show_stats_steps.rb → src/examples/patch_panel/patch-panel.rb} +29 -13
  173. data/src/examples/switch_info/{switch_info.rb → switch-info.rb} +2 -2
  174. data/src/examples/switch_info/switch_info.c +4 -4
  175. data/src/examples/switch_monitor/switch_monitor.c +3 -3
  176. data/src/examples/traffic_monitor/counter.c +9 -9
  177. data/src/examples/traffic_monitor/fdb.c +9 -9
  178. data/src/lib/arp.h +1 -1
  179. data/src/lib/buffer.c +4 -3
  180. data/src/lib/byteorder.c +31 -5
  181. data/src/lib/byteorder.h +2 -2
  182. data/src/lib/chibach.c +8 -6
  183. data/src/lib/daemon.c +29 -3
  184. data/src/lib/doubly_linked_list.c +6 -1
  185. data/src/lib/ether.c +1 -1
  186. data/src/lib/ether.h +1 -1
  187. data/src/lib/event_handler.c +3 -3
  188. data/src/lib/hash_table.c +1 -1
  189. data/src/lib/linked_list.c +50 -2
  190. data/src/lib/linked_list.h +2 -2
  191. data/src/lib/log.c +122 -22
  192. data/src/lib/log.h +13 -9
  193. data/src/lib/management_interface.c +361 -0
  194. data/src/lib/management_interface.h +42 -0
  195. data/src/lib/management_service_interface.c +104 -0
  196. data/src/lib/management_service_interface.h +136 -0
  197. data/src/lib/match_table.c +5 -5
  198. data/src/lib/message_queue.c +5 -3
  199. data/src/lib/message_queue.h +1 -1
  200. data/src/lib/messenger.c +73 -39
  201. data/src/lib/messenger.h +3 -2
  202. data/src/lib/openflow_application_interface.c +17 -17
  203. data/src/lib/openflow_message.c +175 -23
  204. data/src/lib/openflow_message.h +2 -1
  205. data/src/lib/openflow_switch_interface.c +12 -12
  206. data/src/lib/packet_parser.c +11 -32
  207. data/src/lib/packetin_filter_interface.c +5 -5
  208. data/src/lib/persistent_storage.c +7 -7
  209. data/src/lib/secure_channel.c +6 -6
  210. data/src/lib/secure_channel.h +1 -1
  211. data/src/lib/stat.c +54 -17
  212. data/src/lib/stat.h +9 -0
  213. data/src/lib/timer.c +11 -10
  214. data/src/lib/trema.c +38 -9
  215. data/src/lib/trema.h +1 -0
  216. data/src/lib/trema_private.h +6 -0
  217. data/src/lib/trema_wrapper.c +4 -4
  218. data/src/lib/trema_wrapper.h +10 -10
  219. data/src/lib/utility.c +6 -6
  220. data/src/management/application.c +224 -0
  221. data/src/management/echo.c +185 -0
  222. data/src/management/set_logging_level.c +153 -0
  223. data/src/management/show_stats.c +150 -0
  224. data/src/management/trema_manager +184 -0
  225. data/src/packetin_filter/packetin_filter.c +31 -29
  226. data/src/switch_manager/cookie_table.c +7 -7
  227. data/src/switch_manager/dpid_table.c +3 -3
  228. data/src/switch_manager/dpid_table.h +0 -1
  229. data/src/switch_manager/management_interface.h +0 -1
  230. data/src/switch_manager/ofpmsg_recv.c +3 -3
  231. data/src/switch_manager/ofpmsg_recv.h +0 -1
  232. data/src/switch_manager/ofpmsg_send.c +2 -2
  233. data/src/switch_manager/ofpmsg_send.h +0 -1
  234. data/src/switch_manager/secure_channel_listener.c +2 -2
  235. data/src/switch_manager/secure_channel_receiver.c +2 -2
  236. data/src/switch_manager/secure_channel_receiver.h +0 -1
  237. data/src/switch_manager/secure_channel_sender.c +8 -1
  238. data/src/switch_manager/service_interface.c +5 -4
  239. data/src/switch_manager/switch.c +79 -53
  240. data/src/switch_manager/switch_manager.c +24 -22
  241. data/src/switch_manager/xid_table.c +6 -6
  242. data/src/switch_manager/xid_table.h +0 -1
  243. data/src/tremashark/README +4 -3
  244. data/src/tremashark/packet_capture.c +11 -9
  245. data/src/tremashark/pcap_queue.c +2 -2
  246. data/src/tremashark/pcap_queue.h +2 -2
  247. data/src/tremashark/plugin/packet-trema/Makefile +1 -1
  248. data/src/tremashark/plugin/packet-trema/Makefile.common +1 -1
  249. data/src/tremashark/plugin/packet-trema/packet-trema.c +50 -37
  250. data/src/tremashark/queue.c +5 -4
  251. data/src/tremashark/queue.h +1 -1
  252. data/src/tremashark/stdin_relay.c +10 -8
  253. data/src/tremashark/syslog_relay.c +14 -12
  254. data/src/tremashark/tremashark.c +15 -18
  255. data/trema +2 -96
  256. data/trema-config +2 -52
  257. data/trema.gemspec +12 -1
  258. data/unittests/cmockery_trema.h +14 -13
  259. data/unittests/lib/buffer_test.c +1 -1
  260. data/unittests/lib/byteorder_test.c +108 -25
  261. data/unittests/lib/daemon_test.c +141 -5
  262. data/unittests/lib/doubly_linked_list_test.c +5 -1
  263. data/unittests/lib/ether_test.c +4 -4
  264. data/unittests/lib/hash_table_test.c +5 -3
  265. data/unittests/lib/linked_list_test.c +82 -4
  266. data/unittests/lib/log_test.c +96 -5
  267. data/unittests/lib/management_interface_test.c +240 -0
  268. data/unittests/lib/management_service_interface_test.c +319 -0
  269. data/unittests/lib/message_queue_test.c +6 -2
  270. data/unittests/lib/messenger_test.c +167 -2
  271. data/unittests/lib/openflow_application_interface_test.c +16 -22
  272. data/unittests/lib/openflow_message_test.c +721 -24
  273. data/unittests/lib/packet_info_test.c +2 -2
  274. data/unittests/lib/packet_parser_test.c +15 -16
  275. data/unittests/lib/packetin_filter_interface_test.c +6 -6
  276. data/unittests/lib/persistent_storage_test.c +11 -11
  277. data/unittests/lib/stat_test.c +151 -7
  278. data/unittests/lib/timer_test.c +1 -1
  279. data/unittests/lib/trema_private_test.c +2 -2
  280. data/unittests/lib/trema_test.c +40 -12
  281. data/unittests/lib/utility_test.c +3 -3
  282. data/unittests/lib/wrapper_test.c +3 -3
  283. data/unittests/packetin_filter/packetin_filter_test.c +12 -11
  284. data/unittests/switch_manager/switch_manager_test.c +29 -22
  285. metadata +99 -20
  286. data/features/step_definitions/log_steps.rb +0 -90
  287. data/features/step_definitions/run_steps.rb +0 -91
  288. data/features/trema.feature +0 -27
  289. data/features/tutorial.hello_trema.feature +0 -27
  290. data/features/tutorial.packet_in.feature +0 -47
  291. data/features/tutorial.switch_info.feature +0 -55
  292. data/ruby/trema/command/usage.rb +0 -63
data/.gitignore CHANGED
@@ -27,7 +27,7 @@ callgrind.out.*
27
27
  html
28
28
  objects
29
29
 
30
- # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
30
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
31
31
  #
32
32
  # * Create a file at ~/.gitignore
33
33
  # * Include files you want ignored
data/Doxyfile CHANGED
@@ -616,7 +616,7 @@ INPUT_ENCODING = UTF-8
616
616
  # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
617
617
  # *.f90 *.f *.for *.vhd *.vhdl
618
618
 
619
- FILE_PATTERNS =
619
+ FILE_PATTERNS =
620
620
 
621
621
  # The RECURSIVE tag can be used to turn specify whether or not subdirectories
622
622
  # should be searched for input files as well. Possible values are YES and NO.
data/Gemfile CHANGED
@@ -1,23 +1,35 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
+
4
+ # Include dependencies from trema.gemspec. DRY!
3
5
  gemspec
4
6
 
7
+
5
8
  # Add dependencies required to use your gem here.
6
9
  # Example:
7
10
  # gem "activesupport", ">= 2.3.5"
8
11
 
12
+
9
13
  # Add dependencies to develop your gem here.
10
14
  # Include everything needed to run rake, tests, features, etc.
11
15
  group :development do
16
+ gem "aruba", "~> 0.5.1"
12
17
  gem "cucumber", "~> 1.2.1"
13
18
  gem "flay", "~> 1.4.3"
14
19
  gem "flog", "~> 2.5.3"
15
- gem "rake", "~> 0.9.2.2"
20
+ gem "rake", "~> 10.0.2"
16
21
  gem "rcov", "~> 1.0.0"
17
22
  gem "rdoc", "~> 3.12"
18
- gem "redcarpet", "~> 2.1.0"
19
- gem "reek", "~> 1.2.8"
23
+ gem "redcarpet", "~> 2.2.2"
24
+ gem "reek", "~> 1.2.13"
20
25
  gem "roodi", "~> 2.1.0"
21
- gem "rspec", "~> 2.11.0"
22
- gem "yard", "~> 0.7"
26
+ gem "rspec", "~> 2.12.0"
27
+ gem "yard", "~> 0.8.3"
23
28
  end
29
+
30
+
31
+ ### Local variables:
32
+ ### mode: Ruby
33
+ ### coding: utf-8-unix
34
+ ### indent-tabs-mode: nil
35
+ ### End:
data/README.md CHANGED
@@ -22,19 +22,30 @@ Supported Platforms
22
22
 
23
23
  Trema supports GNU/Linux only. And it has been tested on the following environments:
24
24
 
25
- * Ubuntu 12.04, 11.10, 11.04, 10.10, and 10.04 (i386/amd64, Desktop Edition)
25
+ * Ruby 1.8.7 (1.9.x is NOT supported yet)
26
+ * Ubuntu 12.10, 12.04, 11.10, and 10.04 (i386/amd64, Desktop Edition)
26
27
  * Debian GNU/Linux 6.0 (i386/amd64)
27
28
 
28
29
  It may also run on other GNU/Linux distributions but is not tested and
29
30
  NOT SUPPORTED at this moment.
30
31
 
31
32
 
33
+ Supported OpenFlow Protocol Versions
34
+ ------------------------------------
35
+
36
+ Trema currently supports OpenFlow version 1.0 only.
37
+
38
+
32
39
  Getting Started
33
40
  ---------------
34
41
 
35
42
  1.Install the prerequisites at the command prompt:
36
43
 
37
- $ sudo apt-get install gcc make ruby rubygems ruby-dev irb libpcap-dev libsqlite3-dev
44
+ (In Debian GNU/Linux or Ubuntu 12.04 and below)
45
+ $ sudo apt-get install gcc make ruby rubygems ruby-dev libpcap-dev libsqlite3-dev
46
+
47
+ (In Ubuntu 12.10)
48
+ $ sudo apt-get install gcc make ruby1.8 rubygems1.8 ruby1.8-dev libpcap-dev libsqlite3-dev
38
49
 
39
50
  2.Install Trema at the command prompt:
40
51
 
@@ -51,7 +62,7 @@ Getting Started
51
62
  Ruby API
52
63
  --------
53
64
 
54
- The following is an exerpt from the Trema Ruby API.
65
+ The following is an excerpt from the Trema Ruby API.
55
66
  The full documents are found here http://rubydoc.info/github/trema/trema/master/frames
56
67
 
57
68
  ### Event and Message Handlers
@@ -61,6 +72,22 @@ Subclass
61
72
  and override some of the following methods to implement your own
62
73
  controller.
63
74
 
75
+ ```ruby
76
+ class MyController < Controller
77
+ # handle Packet-In messages here.
78
+ def packet_in datapath_id, message
79
+ # ...
80
+ end
81
+
82
+ # handle Flow-Removed messages here.
83
+ def flow_removed datapath_id, message
84
+ # ...
85
+ end
86
+
87
+ # ...
88
+ end
89
+ ```
90
+
64
91
  * [switch_ready(datapath_id)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:switch_ready)
65
92
  * [switch_disconnected(datapath_id)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:switch_disconnected)
66
93
  * [packet_in(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:packet_in)
@@ -80,6 +107,18 @@ For sending Flow-Mod and Packet-Out, there are some methods defined in
80
107
  [Trema::Controller](http://rubydoc.info/github/trema/trema/master/Trema/Controller)
81
108
  class.
82
109
 
110
+ ```ruby
111
+ class MyController < Controller
112
+ def packet_in datapath_id, message
113
+ # ...
114
+ send_flow_mod_add( datapath_id, ... )
115
+ send_packet_out( datapath_id, ... )
116
+ end
117
+
118
+ # ...
119
+ end
120
+ ```
121
+
83
122
  * [send_flow_mod_add(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_add)
84
123
  * [send_flow_mod_delete(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_delete)
85
124
  * [send_flow_mod_modify(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_modify)
@@ -90,6 +129,24 @@ class.
90
129
  The following OpenFlow messages can be sent with
91
130
  [Trema::Controller#send_message](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_message)
92
131
 
132
+ ```ruby
133
+ class MyController < Controller
134
+ def switch_ready datapath_id
135
+ # send a FeaturesRequest message
136
+ send_message datapath_id, FeaturesRequest.new
137
+ end
138
+
139
+ def features_reply datapath_id, message
140
+ # ...
141
+ end
142
+
143
+ # ...
144
+ end
145
+ ```
146
+
147
+ * [Trema::Hello](http://rubydoc.info/github/trema/trema/master/Trema/Hello)
148
+ * [Trema::EchoRequest](http://rubydoc.info/github/trema/trema/master/Trema/EchoRequest)
149
+ * [Trema::EchoReply](http://rubydoc.info/github/trema/trema/master/Trema/EchoReply)
93
150
  * [Trema::FeaturesRequest](http://rubydoc.info/github/trema/trema/master/Trema/FeaturesRequest)
94
151
  * [Trema::SetConfig](http://rubydoc.info/github/trema/trema/master/Trema/SetConfig)
95
152
  * [Trema::GetConfigRequest](http://rubydoc.info/github/trema/trema/master/Trema/GetConfigRequest)
@@ -105,9 +162,57 @@ The following OpenFlow messages can be sent with
105
162
  * [Trema::PortMod](http://rubydoc.info/github/trema/trema/master/Trema/PortMod)
106
163
  * [Trema::Vendor](http://rubydoc.info/github/trema/trema/master/Trema/Vendor)
107
164
 
165
+ ### Matching Rules
166
+
167
+ The matching rule of each flow table entry can be created with
168
+ [Match.new(options)](http://rubydoc.info/github/trema/trema/master/Trema/Match)
169
+ and passed as ":match =>" option when sending Flow-Mod or Packet-Out.
170
+
171
+ ```ruby
172
+ def packet_in datapath_id, message
173
+ # ...
174
+
175
+ send_flow_mod_add(
176
+ datapath_id,
177
+ :match => Match.new( :in_port => message.in_port, ...)
178
+ # ...
179
+ )
180
+
181
+ # ...
182
+ end
183
+ ```
184
+
185
+ Also there is a utility method called
186
+ [ExactMatch.from(packetin)](http://rubydoc.info/github/trema/trema/master/Trema/ExactMatch)
187
+ for getting an exact match corresponding to a packet.
188
+
189
+ ```ruby
190
+ def packet_in datapath_id, message
191
+ # ...
192
+
193
+ send_flow_mod_add(
194
+ datapath_id,
195
+ :match => ExactMatch.from( message )
196
+ # ...
197
+ )
198
+
199
+ # ...
200
+ end
201
+ ```
202
+
108
203
  ### Actions
109
204
 
110
- Each flow table entry contains a list of actions that will be executed when a packet matches the entry.
205
+ The actions list of each flow table entry can be set with ":actions
206
+ =>" when sending Flow-Mod or Packet-Out.
207
+
208
+ ```ruby
209
+ # Strip the VLAN tag of a packet then send it out to switch port #1
210
+ send_flow_mod_add(
211
+ datapath_id,
212
+ # ...
213
+ :actions => [ StripVlanHeader.new, SendOutPort.new( 1 ) ]
214
+ )
215
+ ```
111
216
 
112
217
  * [Trema::SendOutPort](http://rubydoc.info/github/trema/trema/master/Trema/SendOutPort)
113
218
  * [Trema::SetEthSrcAddr](http://rubydoc.info/github/trema/trema/master/Trema/SetEthSrcAddr)
@@ -135,7 +240,8 @@ Meta
135
240
  Contributors
136
241
  ------------
137
242
 
138
- Special thanks to all contributors for submitting patches. A full list of contributors including their patches can be found at:
243
+ Special thanks to all contributors for submitting patches. A full list
244
+ of contributors including their patches can be found at:
139
245
 
140
246
  https://github.com/trema/trema/contributors
141
247
 
@@ -145,6 +251,7 @@ Project Status
145
251
 
146
252
  * Build Status [![Build Status](https://secure.travis-ci.org/trema/trema.png?branch=develop)](http://travis-ci.org/trema/trema)
147
253
  * Dependency Status [![Dependency Status](https://gemnasium.com/trema/trema.png)](https://gemnasium.com/trema/trema)
254
+ * Code Quality [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/trema/trema)
148
255
 
149
256
 
150
257
  License
data/Rakefile CHANGED
@@ -61,7 +61,9 @@ end
61
61
 
62
62
  begin
63
63
  require "cucumber/rake/task"
64
- Cucumber::Rake::Task.new( :features )
64
+ Cucumber::Rake::Task.new( :features ) do | t |
65
+ t.cucumber_opts = "features --tags ~@wip"
66
+ end
65
67
  rescue LoadError
66
68
  $stderr.puts $!.to_s
67
69
  end
data/Rantfile CHANGED
@@ -37,6 +37,7 @@ import "directedrule"
37
37
  desc "Build trema."
38
38
  task :default => [
39
39
  :libtrema,
40
+ :management_commands,
40
41
  :rubylib,
41
42
  :switch_manager,
42
43
  :switch,
@@ -57,6 +58,7 @@ task :examples => [
57
58
  "examples:learning_switch",
58
59
  "examples:list_switches",
59
60
  "examples:multi_learning_switch",
61
+ "examples:openflow_switch",
60
62
  "examples:openflow_message",
61
63
  "examples:packet_in",
62
64
  "examples:repeater_hub",
@@ -67,6 +69,14 @@ task :examples => [
67
69
  ]
68
70
 
69
71
 
72
+ task :management_commands => [
73
+ "management_commands:application",
74
+ "management_commands:echo",
75
+ "management_commands:set_logging_level",
76
+ "management_commands:show_stats",
77
+ ]
78
+
79
+
70
80
  import "clean"
71
81
 
72
82
  desc "Cleanup generated files."
@@ -173,7 +183,7 @@ end
173
183
 
174
184
 
175
185
  desc "Run the c cbench switch controller to benchmark"
176
- task "cbench" => "cbench:c"
186
+ task "cbench" => "cbench:ruby"
177
187
 
178
188
 
179
189
  desc "Run the c cbench switch controller to benchmark"
@@ -588,6 +598,45 @@ file Trema::Executables.stdin_relay => stdin_relay_objects + [ libtrema ] do | t
588
598
  end
589
599
 
590
600
 
601
+ ################################################################################
602
+ # Build management commands
603
+ ################################################################################
604
+
605
+ management_commands = [
606
+ "application",
607
+ "echo",
608
+ "set_logging_level",
609
+ "show_stats",
610
+ ]
611
+
612
+ management_source_dir = "src/management"
613
+ management_objects_dir = objects( "management" )
614
+
615
+ gen C::Dependencies, dependency( "management" ),
616
+ :search => [ Trema.include ], :sources => sys[ "#{ management_source_dir }/*.c" ]
617
+
618
+ gen Action do
619
+ source dependency( "management" )
620
+ end
621
+
622
+ gen Directory, management_objects_dir
623
+
624
+
625
+ gen DirectedRule, management_objects_dir => [ management_source_dir ], :o => :c do | t |
626
+ sys "gcc -I#{ Trema.include } -I#{ Trema.openflow } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
627
+ end
628
+
629
+
630
+ management_commands.each do | each |
631
+ target = File.join( management_objects_dir, each )
632
+ desc "Build #{ each } management command."
633
+ task "management_commands:#{ each }" => target
634
+ file target => [ File.join( management_objects_dir, "#{ each }.o" ), libtrema ] do | t |
635
+ sys "gcc -L#{ Trema.lib } -o #{ t.name } #{ t.source } -ltrema -lsqlite3 -ldl -lrt -lpthread"
636
+ end
637
+ end
638
+
639
+
591
640
  ################################################################################
592
641
  # Build standalone examples
593
642
  ################################################################################
@@ -633,6 +682,41 @@ standalone_examples.each do | each |
633
682
  end
634
683
 
635
684
 
685
+ ########################################################################################
686
+ # Build openflow switches
687
+ ################################################################################
688
+
689
+ openflow_switches = [
690
+ "hello_switch",
691
+ ]
692
+
693
+ openflow_switch_source_dir = "src/examples/openflow_switch"
694
+ openflow_switch_objects_dir = objects( "examples/openflow_switch" )
695
+
696
+ gen C::Dependencies, dependency( "openflow_switch" ),
697
+ :search => [ Trema.include ], :sources => sys[ "#{ openflow_switch_source_dir }/*.c" ]
698
+
699
+ gen Action do
700
+ source dependency( "openflow_switch" )
701
+ end
702
+
703
+ gen Directory, openflow_switch_objects_dir
704
+
705
+
706
+ gen DirectedRule, openflow_switch_objects_dir => [ openflow_switch_source_dir ], :o => :c do | t |
707
+ sys "gcc -I#{ Trema.include } -I#{ Trema.openflow } #{ var :CFLAGS } -c -o #{ t.name } #{ t.source }"
708
+ end
709
+
710
+
711
+ openflow_switches.each do | each |
712
+ target = File.join( openflow_switch_objects_dir, each )
713
+ task "examples:openflow_switch" => target
714
+ file target => [ File.join( openflow_switch_objects_dir, "#{ each }.o" ), libtrema ] do | t |
715
+ sys "gcc -L#{ Trema.lib } -o #{ t.name } #{ t.source } -ltrema -lsqlite3 -ldl -lrt -lpthread"
716
+ end
717
+ end
718
+
719
+
636
720
  ################################################################################
637
721
  # Build openflow messages
638
722
  ################################################################################
@@ -643,6 +727,7 @@ openflow_messages = [
643
727
  "features_request",
644
728
  "hello",
645
729
  "set_config",
730
+ "vendor_action",
646
731
  ]
647
732
 
648
733
  openflow_message_source_dir = "src/examples/openflow_message"
@@ -794,6 +879,8 @@ tests = [
794
879
  "objects/unittests/wrapper_test",
795
880
  "objects/unittests/match_table_test",
796
881
  "objects/unittests/message_queue_test",
882
+ "objects/unittests/management_interface_test",
883
+ "objects/unittests/management_service_interface_test",
797
884
  ]
798
885
 
799
886
 
data/bin/trema ADDED
@@ -0,0 +1,248 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # Trema command-line tool.
4
+ #
5
+ # Copyright (C) 2008-2012 NEC Corporation
6
+ #
7
+ # This program is free software; you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License, version 2, as
9
+ # published by the Free Software Foundation.
10
+ #
11
+ # This program is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License along
17
+ # with this program; if not, write to the Free Software Foundation, Inc.,
18
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
+ #
20
+
21
+
22
+ $LOAD_PATH.unshift File.expand_path( File.join File.dirname( __FILE__ ), "..", "ruby" )
23
+
24
+
25
+ require "rubygems"
26
+
27
+ require "gli"
28
+ require "trema/command"
29
+ require "trema/util"
30
+ require "trema/version"
31
+
32
+
33
+ include GLI::App
34
+ include Trema::Util
35
+ include Trema::Command
36
+
37
+
38
+ program_desc "Trema command-line tool"
39
+
40
+
41
+ desc "Displays the current runtime version"
42
+ version Trema::VERSION
43
+
44
+
45
+ desc "Be verbose"
46
+ switch [ :v, :verbose ], :negatable => false
47
+
48
+
49
+ desc "Runs a trema application"
50
+ arg_name "controller"
51
+ command :run do | c |
52
+ c.desc "Runs as a daemon"
53
+ c.switch [ :d, :daemonize ], :negatable => false
54
+
55
+ c.desc "Enables Trema wireshark plugin"
56
+ c.switch [ :s, :tremashark ], :negatable => false
57
+
58
+ c.desc "Specifies emulated network configuration"
59
+ c.flag [ :c, :conf ]
60
+
61
+ c.action do | global_options, options, args |
62
+ trema_run options
63
+ end
64
+ end
65
+
66
+
67
+ desc "Terminates a trema process"
68
+ arg_name "name"
69
+ command :kill do | c |
70
+ c.action do | global_options, options, args |
71
+ help_now!( "name is required" ) if args.empty?
72
+ args.each do | each |
73
+ trema_kill each
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ desc "Starts a killed trema process again"
80
+ arg_name "name"
81
+ command :up do | c |
82
+ c.action do | global_options, options, args |
83
+ trema_up args[ 0 ]
84
+ end
85
+ end
86
+
87
+
88
+ desc "Terminates all trema processes"
89
+ command :killall do | c |
90
+ c.action do
91
+ trema_killall
92
+ end
93
+ end
94
+
95
+
96
+ desc "Sends UDP packets to destination host"
97
+ command :send_packets do | c |
98
+ c.desc "host that sends packets"
99
+ c.flag [ :s, :source ]
100
+
101
+ c.desc "host that receives packets"
102
+ c.flag [ :d, :dest ]
103
+
104
+ c.desc "number of times to increment the IP source address"
105
+ c.default_value nil
106
+ c.flag [ :inc_ip_src ]
107
+
108
+ c.desc "number of times to increment the IP destination address"
109
+ c.default_value nil
110
+ c.flag [ :inc_ip_dst ]
111
+
112
+ c.desc "set the initial UDP source port"
113
+ c.flag [ :tp_src ]
114
+
115
+ c.desc "number of times to increment the UDP source port"
116
+ c.default_value nil
117
+ c.flag [ :inc_tp_src ]
118
+
119
+ c.desc "set the initial UDP destination port"
120
+ c.flag [ :tp_dst ]
121
+
122
+ c.desc "number of times to increment the UDP destination port"
123
+ c.default_value nil
124
+ c.flag [ :inc_tp_dst ]
125
+
126
+ c.desc "send packet rate - packets per second"
127
+ c.flag [ :pps ]
128
+
129
+ c.desc "number of packets to send"
130
+ c.flag [ :n_pkts ]
131
+
132
+ c.desc "time duration to send packets"
133
+ c.flag [ :duration ]
134
+
135
+ c.desc "length of UDP payload"
136
+ c.flag [ :length ]
137
+
138
+ c.desc "increment UDP payload"
139
+ c.default_value nil
140
+ c.flag [ :inc_payload ]
141
+
142
+ c.action do | global_options, options, args |
143
+ raise "--source option is mandatory" if options[ :source ].nil?
144
+ raise "--dest option is mandatory" if options[ :dest ].nil?
145
+
146
+ trema_send_packets options[ :source ], options[ :dest ], options
147
+ end
148
+ end
149
+
150
+
151
+ desc "Shows stats of packets"
152
+ arg_name "host"
153
+ command :show_stats do | c |
154
+ c.desc "Show stats of packets sent"
155
+ c.switch [ :t, :tx ], :negatable => false
156
+ c.desc "Show stats of packets received"
157
+ c.switch [ :r, :rx ], :negatable => false
158
+
159
+ c.action do | global_options, options, args |
160
+ help_now!( "host is required" ) if args.empty?
161
+ trema_show_stats args[ 0 ], options[ :tx ], options[ :rx ]
162
+ end
163
+ end
164
+
165
+
166
+ desc "Resets stats of packets"
167
+ arg_name "hosts..."
168
+ command :reset_stats do | c |
169
+ c.action do | global_options, options, args |
170
+ hosts = args
171
+ if hosts.empty?
172
+ hosts = Trema::DSL::Context.load_current.hosts.keys
173
+ end
174
+ hosts.each do | each |
175
+ trema_reset_stats each
176
+ end
177
+ end
178
+ end
179
+
180
+
181
+ desc "Print all flow entries"
182
+ arg_name "switches..."
183
+ command :dump_flows do | c |
184
+ c.action do | global_options, options, args |
185
+ help_now!( "switches is required" ) if args.empty?
186
+ trema_dump_flows args
187
+ end
188
+ end
189
+
190
+
191
+ desc "Opens a new shell in the specified network namespace"
192
+ arg_name "name"
193
+ command :netns do | c |
194
+ c.action do | global_options, options, args |
195
+ trema_netns args[ 0 ]
196
+ end
197
+ end
198
+
199
+
200
+ desc "Opens in your browser Trema's Ruby API documentation"
201
+ command :ruby do | c |
202
+ c.action do
203
+ trema_ruby
204
+ end
205
+ end
206
+
207
+
208
+ desc "Displays the current runtime version"
209
+ command :version do | c |
210
+ c.action do
211
+ trema_version
212
+ end
213
+ end
214
+
215
+
216
+ pre do | global, command, options, args |
217
+ $verbose = global[ :verbose ]
218
+
219
+ assert_trema_is_built
220
+
221
+ if FileTest.exist?( Trema.tmp ) and not FileTest.writable?( Trema.tmp )
222
+ # Trema is system widely installed with gem command
223
+ sh "sudo chmod o+w -R #{ Trema.tmp }"
224
+ end
225
+
226
+ FileUtils.mkdir_p Trema.log
227
+ FileUtils.mkdir_p Trema.pid
228
+ FileUtils.mkdir_p Trema.sock
229
+
230
+ true
231
+ end
232
+
233
+
234
+ on_error do | exception |
235
+ # Error logic here
236
+ # return false to skip default error handling
237
+ true
238
+ end
239
+
240
+
241
+ exit run( ARGV )
242
+
243
+
244
+ ### Local variables:
245
+ ### mode: Ruby
246
+ ### coding: utf-8
247
+ ### indent-tabs-mode: nil
248
+ ### End: