trema 0.2.2.1 → 0.2.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 (250) hide show
  1. data/.gitmodules +3 -0
  2. data/.travis.yml +13 -0
  3. data/.yardopts +4 -0
  4. data/Gemfile +2 -3
  5. data/README.md +43 -97
  6. data/Rakefile +60 -4
  7. data/Rantfile +11 -10
  8. data/cruise.rb +4 -6
  9. data/features/example.packetin_filter_config.feature +10 -10
  10. data/features/example.switch_monitor.feature +14 -2
  11. data/features/step_definitions/kill_steps.rb +2 -2
  12. data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
  13. data/features/step_definitions/misc_steps.rb +1 -1
  14. data/features/step_definitions/up_steps.rb +30 -0
  15. data/features/trema.feature +1 -0
  16. data/features/trema.run.feature +1 -0
  17. data/locale/README.ja.md +19 -0
  18. data/locale/ja/yard.po +3762 -0
  19. data/locale/yard.pot +3740 -0
  20. data/ruby/extconf.rb +4 -1
  21. data/ruby/trema/action-common.c +3 -17
  22. data/ruby/trema/action-common.h +3 -7
  23. data/ruby/trema/action.rb +33 -0
  24. data/ruby/trema/app.rb +1 -1
  25. data/ruby/trema/barrier-request.c +1 -0
  26. data/ruby/trema/command/run.rb +13 -9
  27. data/ruby/trema/command/usage.rb +1 -0
  28. data/ruby/trema/command/version.rb +1 -1
  29. data/ruby/trema/controller.c +133 -50
  30. data/ruby/trema/controller.rb +2 -2
  31. data/ruby/trema/desc-stats-reply.rb +77 -0
  32. data/ruby/trema/dsl/configuration.rb +3 -14
  33. data/ruby/trema/dsl/rswitch.rb +47 -0
  34. data/ruby/trema/dsl/runner.rb +4 -1
  35. data/ruby/trema/dsl/syntax.rb +11 -8
  36. data/ruby/trema/echo-reply.c +59 -45
  37. data/ruby/trema/echo-reply.h +1 -3
  38. data/ruby/trema/echo-request.c +49 -71
  39. data/ruby/trema/echo-request.h +0 -2
  40. data/ruby/trema/echo.c +99 -0
  41. data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
  42. data/ruby/trema/enqueue.rb +87 -0
  43. data/ruby/trema/error.c +109 -104
  44. data/ruby/trema/error.h +0 -2
  45. data/ruby/trema/features-reply.c +89 -35
  46. data/ruby/trema/features-reply.h +0 -6
  47. data/ruby/trema/features-request.c +63 -37
  48. data/ruby/trema/features-request.h +0 -2
  49. data/ruby/trema/flow-mod.c +149 -0
  50. data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
  51. data/ruby/trema/get-config-request.c +1 -0
  52. data/ruby/trema/hardware-switch.rb +88 -0
  53. data/ruby/trema/hello.c +55 -31
  54. data/ruby/trema/hello.h +0 -2
  55. data/ruby/trema/ip.rb +12 -2
  56. data/ruby/trema/logger.rb +29 -0
  57. data/ruby/trema/mac.rb +57 -36
  58. data/ruby/trema/match.c +7 -9
  59. data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
  60. data/ruby/trema/network-component.rb +1 -1
  61. data/ruby/trema/open-vswitch.rb +2 -2
  62. data/ruby/trema/openflow-switch.rb +3 -54
  63. data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
  64. data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
  65. data/ruby/trema/packet-queue.rb +4 -3
  66. data/ruby/trema/port-mod.c +8 -9
  67. data/ruby/trema/port-status-add.rb +60 -0
  68. data/ruby/trema/port-status-delete.rb +60 -0
  69. data/ruby/trema/port-status-modify.rb +60 -0
  70. data/ruby/trema/port-status.c +48 -15
  71. data/ruby/trema/port-status.h +6 -8
  72. data/ruby/trema/port.c +63 -8
  73. data/ruby/trema/queue-get-config-request.c +1 -0
  74. data/ruby/trema/ruby-switch.rb +62 -0
  75. data/ruby/trema/send-out-port.rb +97 -0
  76. data/ruby/trema/set-config.c +1 -0
  77. data/ruby/trema/set-eth-addr.rb +45 -0
  78. data/ruby/trema/set-eth-dst-addr.rb +54 -0
  79. data/ruby/trema/set-eth-src-addr.rb +54 -0
  80. data/ruby/trema/set-ip-addr.rb +47 -0
  81. data/ruby/trema/set-ip-dst-addr.rb +53 -0
  82. data/ruby/trema/set-ip-src-addr.rb +52 -0
  83. data/ruby/trema/set-ip-tos.rb +63 -0
  84. data/ruby/trema/set-transport-dst-port.rb +53 -0
  85. data/ruby/trema/set-transport-port.rb +52 -0
  86. data/ruby/trema/set-transport-src-port.rb +54 -0
  87. data/ruby/trema/set-vlan-priority.rb +65 -0
  88. data/ruby/trema/set-vlan-vid.rb +64 -0
  89. data/ruby/trema/shell/down.rb +1 -1
  90. data/ruby/trema/shell/link.rb +4 -4
  91. data/ruby/trema/shell/run.rb +8 -6
  92. data/ruby/trema/shell/up.rb +3 -3
  93. data/ruby/trema/stats-reply.c +27 -2
  94. data/ruby/trema/stats-request.c +64 -23
  95. data/ruby/trema/strip-vlan-header.rb +41 -0
  96. data/ruby/trema/switch.c +196 -0
  97. data/ruby/trema/{action-vendor.h → switch.h} +5 -7
  98. data/ruby/trema/switch.rb +28 -9
  99. data/ruby/trema/trema-ruby-utils.c +66 -0
  100. data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
  101. data/ruby/trema/trema.c +61 -61
  102. data/ruby/trema/vendor-action.rb +73 -0
  103. data/ruby/trema/vendor.c +121 -52
  104. data/ruby/trema/vendor.h +6 -10
  105. data/ruby/trema/version.rb +1 -1
  106. data/spec/spec_helper.rb +1 -1
  107. data/spec/support/action.rb +52 -0
  108. data/spec/support/mandatory-option.rb +56 -0
  109. data/spec/support/openflow-message.rb +91 -7
  110. data/spec/support/port-status.rb +38 -0
  111. data/spec/trema/controller_spec.rb +0 -26
  112. data/spec/trema/dsl/configuration_spec.rb +3 -3
  113. data/spec/trema/dsl/runner_spec.rb +12 -32
  114. data/spec/trema/dsl/syntax_spec.rb +2 -11
  115. data/spec/trema/echo-reply_spec.rb +49 -14
  116. data/spec/trema/echo-request_spec.rb +86 -34
  117. data/spec/trema/enqueue_spec.rb +76 -0
  118. data/spec/trema/error_spec.rb +43 -58
  119. data/spec/trema/features-reply_spec.rb +58 -24
  120. data/spec/trema/features-request_spec.rb +54 -28
  121. data/spec/trema/flow-mod_spec.rb +99 -0
  122. data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
  123. data/spec/trema/hello_spec.rb +28 -14
  124. data/spec/trema/ip_spec.rb +54 -0
  125. data/spec/trema/mac_spec.rb +49 -64
  126. data/spec/trema/match_spec.rb +1 -1
  127. data/spec/trema/open-vswitch_spec.rb +7 -7
  128. data/spec/trema/packet-in_spec.rb +73 -16
  129. data/spec/trema/port-status-add_spec.rb +32 -0
  130. data/spec/trema/port-status-delete_spec.rb +32 -0
  131. data/spec/trema/port-status-modify_spec.rb +71 -0
  132. data/spec/trema/port-status_spec.rb +5 -76
  133. data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
  134. data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
  135. data/spec/trema/set-eth-src-addr_spec.rb +72 -0
  136. data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
  137. data/spec/trema/set-ip-src-addr_spec.rb +58 -0
  138. data/spec/trema/set-ip-tos_spec.rb +65 -0
  139. data/spec/trema/set-transport-dst-port_spec.rb +65 -0
  140. data/spec/trema/set-transport-src-port_spec.rb +65 -0
  141. data/spec/trema/set-vlan-priority_spec.rb +65 -0
  142. data/spec/trema/set-vlan-vid_spec.rb +65 -0
  143. data/spec/trema/shell/vhost_spec.rb +4 -1
  144. data/spec/trema/shell/vswitch_spec.rb +11 -11
  145. data/spec/trema/stats-reply_spec.rb +59 -13
  146. data/spec/trema/stats-request_spec.rb +6 -0
  147. data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
  148. data/spec/trema/switch-daemon_spec.rb +39 -0
  149. data/spec/trema/vendor-action_spec.rb +81 -0
  150. data/spec/trema/vendor_spec.rb +76 -0
  151. data/spec/trema_spec.rb +56 -0
  152. data/src/examples/dumper/dumper.c +0 -8
  153. data/src/examples/dumper/dumper.rb +52 -52
  154. data/src/examples/hello_trema/hello_trema.c +0 -2
  155. data/src/examples/learning_switch/learning-switch.rb +3 -3
  156. data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
  157. data/src/examples/openflow_message/features-request.rb +3 -3
  158. data/src/examples/packetin_filter_config/utils.c +4 -4
  159. data/src/examples/repeater_hub/repeater-hub.rb +3 -3
  160. data/src/examples/switch_info/switch_info.rb +2 -2
  161. data/src/examples/switch_monitor/switch_monitor.c +1 -1
  162. data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
  163. data/src/lib/arp.h +4 -1
  164. data/src/lib/chibach.c +391 -0
  165. data/src/lib/chibach.h +71 -0
  166. data/src/lib/chibach_private.c +170 -0
  167. data/src/lib/chibach_private.h +52 -0
  168. data/src/lib/ether.c +2 -1
  169. data/src/lib/ether.h +0 -1
  170. data/src/lib/ipv4.h +13 -14
  171. data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
  172. data/src/lib/log.c +161 -58
  173. data/src/lib/log.h +11 -16
  174. data/src/lib/messenger.c +36 -1
  175. data/src/lib/messenger.h +1 -0
  176. data/src/lib/openflow_application_interface.c +128 -28
  177. data/src/lib/openflow_application_interface.h +31 -6
  178. data/src/lib/openflow_message.c +2 -1
  179. data/src/lib/openflow_service_interface.h +1 -0
  180. data/src/lib/openflow_switch_interface.c +1380 -0
  181. data/src/lib/openflow_switch_interface.h +264 -0
  182. data/src/lib/packet_info.c +94 -11
  183. data/src/lib/packet_info.h +22 -3
  184. data/src/lib/packet_parser.c +38 -2
  185. data/src/lib/secure_channel.c +498 -0
  186. data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
  187. data/src/lib/tcp.h +0 -3
  188. data/src/lib/trema.c +38 -5
  189. data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
  190. data/src/lib/trema_wrapper.c +5 -0
  191. data/src/lib/trema_wrapper.h +4 -0
  192. data/src/lib/utility.c +93 -4
  193. data/src/lib/utility.h +1 -0
  194. data/src/lib/wrapper.c +30 -7
  195. data/src/lib/wrapper.h +2 -0
  196. data/src/switch_manager/ofpmsg_recv.c +44 -30
  197. data/src/switch_manager/ofpmsg_send.c +40 -1
  198. data/src/switch_manager/ofpmsg_send.h +2 -0
  199. data/src/switch_manager/switch.c +153 -8
  200. data/src/switch_manager/switch.h +1 -0
  201. data/src/switch_manager/switchinfo.h +5 -0
  202. data/src/tremashark/README +2 -2
  203. data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
  204. data/trema +1 -1
  205. data/unittests/lib/log_test.c +158 -34
  206. data/unittests/lib/openflow_application_interface_test.c +252 -69
  207. data/unittests/lib/openflow_message_test.c +3 -1
  208. data/unittests/lib/packet_parser_test.c +60 -15
  209. data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
  210. data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
  211. data/unittests/lib/trema_test.c +2 -0
  212. data/unittests/lib/utility_test.c +65 -2
  213. data/unittests/lib/wrapper_test.c +29 -0
  214. data/vendor/{README → README.md} +2 -12
  215. data/vendor/packet-openflow.diff +13 -0
  216. metadata +86 -53
  217. data/GPL2 +0 -339
  218. data/ruby/trema/action-enqueue.c +0 -161
  219. data/ruby/trema/action-output.c +0 -169
  220. data/ruby/trema/action-set-dl-dst.c +0 -131
  221. data/ruby/trema/action-set-dl-dst.h +0 -44
  222. data/ruby/trema/action-set-dl-src.c +0 -131
  223. data/ruby/trema/action-set-nw-dst.c +0 -135
  224. data/ruby/trema/action-set-nw-src.c +0 -140
  225. data/ruby/trema/action-set-nw-tos.c +0 -124
  226. data/ruby/trema/action-set-nw-tos.h +0 -42
  227. data/ruby/trema/action-set-tp-dst.c +0 -122
  228. data/ruby/trema/action-set-tp-dst.h +0 -42
  229. data/ruby/trema/action-set-tp-src.c +0 -124
  230. data/ruby/trema/action-set-tp-src.h +0 -42
  231. data/ruby/trema/action-set-vlan-pcp.c +0 -128
  232. data/ruby/trema/action-set-vlan-pcp.h +0 -42
  233. data/ruby/trema/action-set-vlan-vid.c +0 -125
  234. data/ruby/trema/action-set-vlan-vid.h +0 -42
  235. data/ruby/trema/action-strip-vlan.c +0 -81
  236. data/ruby/trema/action-strip-vlan.h +0 -42
  237. data/ruby/trema/action-vendor.c +0 -121
  238. data/ruby/trema/vendor-request.c +0 -193
  239. data/spec/trema/action-enqueue_spec.rb +0 -100
  240. data/spec/trema/action-set-dl-dst_spec.rb +0 -95
  241. data/spec/trema/action-set-dl-src_spec.rb +0 -92
  242. data/spec/trema/action-set-nw-dst_spec.rb +0 -96
  243. data/spec/trema/action-set-nw-src_spec.rb +0 -97
  244. data/spec/trema/action-set-nw-tos_spec.rb +0 -88
  245. data/spec/trema/action-set-tp-dst_spec.rb +0 -88
  246. data/spec/trema/action-set-tp-src_spec.rb +0 -88
  247. data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
  248. data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
  249. data/spec/trema/action-vendor_spec.rb +0 -90
  250. data/spec/trema/vendor-request_spec.rb +0 -79
@@ -1,6 +1,4 @@
1
1
  #
2
- # Author: Yasuhito Takamiya <yasuhito@gmail.com>
3
- #
4
2
  # Copyright (C) 2008-2012 NEC Corporation
5
3
  #
6
4
  # This program is free software; you can redistribute it and/or modify
@@ -19,6 +17,7 @@
19
17
 
20
18
 
21
19
  require "trema/app"
20
+ require "trema/logger"
22
21
  require "trema/monkey-patch/integer"
23
22
  require "trema/monkey-patch/string"
24
23
  require "trema/timers"
@@ -29,6 +28,7 @@ module Trema
29
28
  # The base class of Trema controller.
30
29
  #
31
30
  class Controller < App
31
+ include Logger
32
32
  include Timers
33
33
 
34
34
 
@@ -0,0 +1,77 @@
1
+ #
2
+ # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
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
+ require "trema/stats-helper"
22
+
23
+
24
+ module Trema
25
+ class DescStatsReply < StatsHelper
26
+ FIELDS = %w(mfr_desc hw_desc sw_desc serial_num dp_desc )
27
+ FIELDS.each { |field| attr_reader field.intern }
28
+
29
+
30
+ # Descriptive information about a vswitch.
31
+ # A user would not explicitly instantiate a {DescStatsReply} object but
32
+ # would be created as a result of parsing the +OFPT_STATS_REPLY(OFPST_DESC)+
33
+ # message.
34
+ #
35
+ # @overload initialize(options={})
36
+ #
37
+ # @example
38
+ # DescStatsReply.new(
39
+ # :mfr_desc => "Nicira Networks, Inc.",
40
+ # :hw_desc => "Open vSwitch",
41
+ # :sw_desc => "1.2.2"
42
+ # :serial_num => "None"
43
+ # )
44
+ #
45
+ # @param [Hash] options
46
+ # the options to create this instance with.
47
+ #
48
+ # @option options [String] :mfr_desc
49
+ # the manufacturer description.
50
+ #
51
+ # @option options [String] :hw_desc
52
+ # the hardware description.
53
+ #
54
+ # @option options [String] :sw_desc
55
+ # the software description.
56
+ #
57
+ # @option options [String] :serial_num
58
+ # the serial number.
59
+ #
60
+ # @option options [String] :dp_desc
61
+ # the human readable description of datapath.
62
+ #
63
+ # @return [DescStatsReply]
64
+ # an object that encapsulates the OFPST_STATS_REPLY(OFPST_DESC) OpenFlow message.
65
+ #
66
+ def initialize options
67
+ super FIELDS, options
68
+ end
69
+ end
70
+ end
71
+
72
+
73
+ ### Local variables:
74
+ ### mode: Ruby
75
+ ### coding: utf-8-unix
76
+ ### indent-tabs-mode: nil
77
+ ### End:
@@ -21,8 +21,8 @@
21
21
  require "trema/app"
22
22
  require "trema/host"
23
23
  require "trema/link"
24
+ require "trema/openflow-switch"
24
25
  require "trema/packetin-filter"
25
- require "trema/switch"
26
26
  require "trema/switch-manager"
27
27
 
28
28
 
@@ -42,16 +42,6 @@ module Trema
42
42
  #
43
43
  attr_accessor :port
44
44
 
45
- #
46
- # use tremashark?
47
- #
48
- # @example
49
- # config.tremashark = true
50
- #
51
- # @return [Boolean]
52
- #
53
- attr_accessor :tremashark
54
-
55
45
  #
56
46
  # the hash of {App}
57
47
  #
@@ -90,7 +80,7 @@ module Trema
90
80
  #
91
81
  # @example
92
82
  # p config.switches
93
- # #=> {"switch #0"=>#<Trema::Switch:0xb73c9328>, ...}
83
+ # #=> {"switch #0"=>#<Trema::OpenflowSwitch:0xb73c9328>, ...}
94
84
  #
95
85
  # @return [Hash]
96
86
  #
@@ -107,13 +97,12 @@ module Trema
107
97
  #
108
98
  def initialize
109
99
  @port = 6633
110
- @tremashark = false
111
100
  @apps = Trema::App.clear
112
101
  @hosts = Trema::Host.clear
113
102
  @links = Trema::Link.clear
114
103
  @packetin_filter = Trema::PacketinFilter.clear
115
104
  @switch_manager = Trema::SwitchManager.clear
116
- @switches = Trema::Switch.clear
105
+ @switches = Trema::OpenflowSwitch.clear
117
106
  end
118
107
 
119
108
 
@@ -0,0 +1,47 @@
1
+ #
2
+ # The syntax definition of rswitch { ... } stanza in Trema DSL.
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
+ require "trema/dsl/switch"
22
+
23
+
24
+ module Trema
25
+ module DSL
26
+ class Rswitch < Switch
27
+ attr_reader :path
28
+
29
+
30
+ def initialize name = nil
31
+ super name
32
+ end
33
+
34
+
35
+ def file path
36
+ @path = path
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+
43
+ ### Local variables:
44
+ ### mode: Ruby
45
+ ### coding: utf-8-unix
46
+ ### indent-tabs-mode: nil
47
+ ### End:
@@ -20,6 +20,9 @@
20
20
  #
21
21
 
22
22
 
23
+ require "trema/tremashark"
24
+
25
+
23
26
  module Trema
24
27
  module DSL
25
28
  class Runner
@@ -89,7 +92,7 @@ module Trema
89
92
 
90
93
 
91
94
  def maybe_run_tremashark
92
- @context.tremashark.run if @context.tremashark
95
+ Trema::Tremashark.new.run if $use_tremashark
93
96
  end
94
97
 
95
98
 
@@ -22,18 +22,19 @@
22
22
 
23
23
  require "trema/app"
24
24
  require "trema/dsl/link"
25
+ require "trema/dsl/rswitch"
25
26
  require "trema/dsl/run"
26
27
  require "trema/dsl/switch"
27
28
  require "trema/dsl/vhost"
28
29
  require "trema/dsl/vswitch"
30
+ require "trema/hardware-switch"
29
31
  require "trema/host"
30
32
  require "trema/link"
31
33
  require "trema/monkey-patch/module"
32
34
  require "trema/open-vswitch"
33
- require "trema/openflow-switch"
34
35
  require "trema/packetin-filter"
36
+ require "trema/ruby-switch"
35
37
  require "trema/switch-manager"
36
- require "trema/tremashark"
37
38
 
38
39
 
39
40
  module Trema
@@ -44,11 +45,6 @@ module Trema
44
45
  end
45
46
 
46
47
 
47
- def use_tremashark
48
- @config.tremashark = Trema::Tremashark.new
49
- end
50
-
51
-
52
48
  def port number
53
49
  @config.port = number
54
50
  end
@@ -63,7 +59,7 @@ module Trema
63
59
  def switch name = nil, &block
64
60
  stanza = Trema::DSL::Switch.new( name )
65
61
  stanza.instance_eval( &block )
66
- Trema::OpenflowSwitch.new( stanza )
62
+ Trema::HardwareSwitch.new( stanza )
67
63
  end
68
64
 
69
65
 
@@ -74,6 +70,13 @@ module Trema
74
70
  end
75
71
 
76
72
 
73
+ def rswitch name = nil, &block
74
+ stanza = Trema::DSL::Rswitch.new( name )
75
+ stanza.instance_eval( &block )
76
+ Trema::RubySwitch.new( stanza )
77
+ end
78
+
79
+
77
80
  def vhost name = nil, &block
78
81
  stanza = Trema::DSL::Vhost.new( name )
79
82
  stanza.instance_eval( &block ) if block
@@ -1,6 +1,4 @@
1
1
  /*
2
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
3
- *
4
2
  * Copyright (C) 2008-2012 NEC Corporation
5
3
  *
6
4
  * This program is free software; you can redistribute it and/or modify
@@ -18,8 +16,10 @@
18
16
  */
19
17
 
20
18
 
21
- #include "trema.h"
19
+ #include "echo.h"
22
20
  #include "ruby.h"
21
+ #include "trema.h"
22
+ #include "trema-ruby-utils.h"
23
23
 
24
24
 
25
25
  extern VALUE mTrema;
@@ -28,74 +28,88 @@ VALUE cEchoReply;
28
28
 
29
29
  static VALUE
30
30
  echo_reply_alloc( VALUE klass ) {
31
- buffer *echo_reply = create_echo_reply( get_transaction_id(), NULL );
31
+ buffer *body = alloc_buffer();
32
+ buffer *echo_reply = create_echo_reply( 0, body );
33
+ free_buffer( body );
32
34
  return Data_Wrap_Struct( klass, NULL, free_buffer, echo_reply );
33
35
  }
34
36
 
35
37
 
38
+ #if 0
36
39
  /*
37
- * Creates a {EchoReply} instance.
38
- *
39
- * @overload initialize(options={})
40
+ * Creates a EchoReply OpenFlow message. This message can be used to
41
+ * measure the bandwidth of a controller/switch connection as well as
42
+ * to verify its liveness.
40
43
  *
44
+ * @overload initialize()
41
45
  * @example
42
46
  * EchoReply.new
43
- * EchoReply.new( :transaction_id => 123 )
44
47
  *
48
+ * @overload initialize(transaction_id)
49
+ * @example
50
+ * EchoReply.new( 123 )
51
+ * @param [Integer] transaction_id
52
+ * An unsigned 32bit integer number associated with this message.
53
+ *
54
+ * @overload initialize(options)
55
+ * @example
56
+ * EchoReply.new(
57
+ * :transaction_id => transaction_id,
58
+ * :user_data => "Thu Aug 25 13:09:00 +0900 2011"
59
+ * )
45
60
  * @param [Hash] options
46
61
  * the options to create a message with.
47
- *
62
+ * @option options [Number] :xid
48
63
  * @option options [Number] :transaction_id
49
- * An unsigned 32-bit integer auto-generated if not supplied.
50
- *
51
- * @raise [ArgumentError] if transaction id is not an unsigned 32-bit integer.
52
- * @raise [TypeError] if options is not a hash.
64
+ * An unsigned 32bit integer number associated with this message.
65
+ * If not specified, an auto-generated value is set.
66
+ * @option options [String] :user_data
67
+ * the user data field specified as a String may be a message timestamp to check latency,
68
+ * various lengths to measure bandwidth or zero-size(nil) to verify liveness between
69
+ * the switch and controller.
53
70
  *
54
- * @return [EchoReply]
55
- * an object that encapsulates the +OFPT_ECHO_REPLY+ OpenFlow message.
71
+ * @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
72
+ * @raise [ArgumentError] if user data is not a string.
73
+ * @raise [TypeError] if argument is not a hash.
74
+ * @return [EchoReply]
56
75
  */
57
- static VALUE
58
- echo_reply_init( int argc, VALUE *argv, VALUE self ) {
59
- buffer *echo_reply;
60
- Data_Get_Struct( self, buffer, echo_reply );
61
- uint32_t xid = get_transaction_id();
62
- VALUE options;
63
-
64
- if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
65
- Check_Type( options, T_HASH );
66
- VALUE xid_ruby;
67
- if ( ( xid_ruby = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
68
- if ( rb_funcall( xid_ruby, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
69
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
70
- }
71
- xid = ( uint32_t ) NUM2UINT( xid_ruby );
72
- }
73
- }
74
- ( ( struct ofp_header * ) ( echo_reply->data ) )->xid = htonl( xid );
75
- return self;
76
- }
76
+ VALUE
77
+ echo_init( int argc, VALUE *argv, VALUE self ) {}
78
+ #endif
77
79
 
78
80
 
81
+ #if 0
79
82
  /*
80
- * Transaction ids, message sequence numbers matching requests to replies.
83
+ * Transaction ids, message sequence numbers matching requests to
84
+ * replies.
81
85
  *
82
86
  * @return [Number] the value of transaction id.
83
87
  */
84
- static VALUE
85
- echo_reply_transaction_id( VALUE self ) {
86
- buffer *echo_reply;
87
- Data_Get_Struct( self, buffer, echo_reply );
88
- uint32_t xid = ntohl( ( ( struct ofp_header * ) ( echo_reply->data ) )->xid );
89
- return UINT2NUM( xid );
90
- }
88
+ VALUE
89
+ echo_transaction_id( VALUE self ) {}
90
+ #endif
91
+
92
+
93
+ #if 0
94
+ /*
95
+ * An arbitrary length user data payload.
96
+ *
97
+ * @return [String] a user data payload is set.
98
+ * @return [nil] a user data payload is not set.
99
+ */
100
+ VALUE
101
+ echo_user_data( VALUE self ) {}
102
+ #endif
91
103
 
92
104
 
93
105
  void
94
106
  Init_echo_reply() {
95
107
  cEchoReply = rb_define_class_under( mTrema, "EchoReply", rb_cObject );
96
108
  rb_define_alloc_func( cEchoReply, echo_reply_alloc );
97
- rb_define_method( cEchoReply, "initialize", echo_reply_init, -1 );
98
- rb_define_method( cEchoReply, "transaction_id", echo_reply_transaction_id, 0 );
109
+ rb_define_method( cEchoReply, "initialize", echo_init, -1 );
110
+ rb_define_method( cEchoReply, "transaction_id", echo_transaction_id, 0 );
111
+ rb_alias( cEchoReply, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
112
+ rb_define_method( cEchoReply, "user_data", echo_user_data, 0 );
99
113
  }
100
114
 
101
115
 
@@ -1,6 +1,4 @@
1
1
  /*
2
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
3
- *
4
2
  * Copyright (C) 2008-2012 NEC Corporation
5
3
  *
6
4
  * This program is free software; you can redistribute it and/or modify
@@ -39,4 +37,4 @@ void Init_echo_reply( void );
39
37
  * c-basic-offset: 2
40
38
  * indent-tabs-mode: nil
41
39
  * End:
42
- */
40
+ */
@@ -1,6 +1,4 @@
1
1
  /*
2
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
3
- *
4
2
  * Copyright (C) 2008-2012 NEC Corporation
5
3
  *
6
4
  * This program is free software; you can redistribute it and/or modify
@@ -18,117 +16,97 @@
18
16
  */
19
17
 
20
18
 
21
- #include "trema.h"
19
+ #include "echo.h"
22
20
  #include "ruby.h"
21
+ #include "trema.h"
22
+ #include "trema-ruby-utils.h"
23
23
 
24
24
 
25
25
  extern VALUE mTrema;
26
26
  VALUE cEchoRequest;
27
27
 
28
28
 
29
+ static VALUE
30
+ echo_request_alloc( VALUE klass ) {
31
+ return Data_Wrap_Struct( klass, NULL, free_buffer, create_echo_request( 0, NULL ) );
32
+ }
33
+
34
+
35
+ #if 0
29
36
  /*
30
- * An echo request message can be used to measure the bandwidth of a
31
- * controller/switch connection as well as to verify its liveness.
37
+ * Creates a EchoRequest OpenFlow message. This message can be used to
38
+ * measure the bandwidth of a controller/switch connection as well as
39
+ * to verify its liveness.
40
+ *
41
+ * @overload initialize()
42
+ * @example
43
+ * EchoRequest.new
44
+ *
45
+ * @overload initialize(transaction_id)
46
+ * @example
47
+ * EchoRequest.new( 123 )
48
+ * @param [Integer] transaction_id
49
+ * An unsigned 32bit integer number associated with this message.
32
50
  *
33
- * @overload initialize(options={})
51
+ * @overload initialize(options)
34
52
  * @example
35
53
  * EchoRequest.new(
36
54
  * :transaction_id => transaction_id,
37
55
  * :user_data => "Thu Aug 25 13:09:00 +0900 2011"
38
56
  * )
39
- *
40
57
  * @param [Hash] options
41
58
  * the options to create a message with.
42
- *
59
+ * @option options [Number] :xid
43
60
  * @option options [Number] :transaction_id
44
- * a positive number, not recently attached to any previous pending commands to
45
- * guarantee message integrity auto-generated if not specified.
46
- *
61
+ * An unsigned 32bit integer number associated with this message.
62
+ * If not specified, an auto-generated value is set.
47
63
  * @option options [String] :user_data
48
64
  * the user data field specified as a String may be a message timestamp to check latency,
49
65
  * various lengths to measure bandwidth or zero-size(nil) to verify liveness between
50
66
  * the switch and controller.
51
67
  *
52
- * @raise [ArgumentError] if transaction id is not an unsigned 32-bit integer.
53
- * @raise [ArgumentError] if user data is not a string.
54
- * @raise [TypeError] if options is not a hash.
55
- *
56
- * @return [EchoRequest]
57
- * an object that encapsulates the +OPFT_ECHO_REQUEST+ OpenFlow message.
68
+ * @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
69
+ * @raise [ArgumentError] if user data is not a string.
70
+ * @raise [TypeError] if argument is not a hash.
71
+ * @return [EchoRequest]
58
72
  */
59
- static VALUE
60
- echo_request_new( int argc, VALUE *argv, VALUE klass ) {
61
- buffer *echo_request;
62
- buffer *body = NULL;
63
- uint32_t xid = get_transaction_id();
64
- VALUE options;
65
-
66
- if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
67
- Check_Type( options, T_HASH );
68
- VALUE xid_ruby;
69
- if ( ( xid_ruby = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
70
- if ( rb_funcall( xid_ruby, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
71
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
72
- }
73
- xid = ( uint32_t ) NUM2UINT( xid_ruby );
74
- }
75
- VALUE user_data;
76
- if ( ( user_data = rb_hash_aref( options, ID2SYM( rb_intern( "user_data" ) ) ) ) != Qnil ) {
77
- if ( rb_obj_is_kind_of( user_data, rb_cString ) == Qfalse ) {
78
- rb_raise( rb_eArgError, "User data must be a string" );
79
- }
80
- uint16_t length = ( u_int16_t ) RSTRING_LEN( user_data );
81
- body = alloc_buffer_with_length( length );
82
- void *p = append_back_buffer( body, length );
83
- memcpy( p, RSTRING_PTR( user_data ), length );
84
- }
85
- }
86
- echo_request = create_echo_request( xid, body );
87
- if ( body != NULL ) {
88
- free_buffer( body );
89
- }
90
- return Data_Wrap_Struct( klass, NULL, free_buffer, echo_request );
91
- }
73
+ VALUE
74
+ echo_init( int argc, VALUE *argv, VALUE self ) {}
75
+ #endif
92
76
 
93
77
 
78
+ #if 0
94
79
  /*
95
- * Transaction ids, message sequence numbers matching requests to replies.
80
+ * Transaction ids, message sequence numbers matching requests to
81
+ * replies.
96
82
  *
97
83
  * @return [Number] the value of transaction id.
98
84
  */
99
- static VALUE
100
- echo_request_transaction_id( VALUE self ) {
101
- buffer *echo_request;
102
- Data_Get_Struct( self, buffer, echo_request );
103
- uint32_t xid = ntohl( ( ( struct ofp_header * ) ( echo_request->data ) )->xid );
104
- return UINT2NUM( xid );
105
- }
85
+ VALUE
86
+ echo_transaction_id( VALUE self ) {}
87
+ #endif
106
88
 
107
89
 
90
+ #if 0
108
91
  /*
109
92
  * An arbitrary length user data payload.
110
93
  *
111
94
  * @return [String] a user data payload is set.
112
95
  * @return [nil] a user data payload is not set.
113
96
  */
114
- static VALUE
115
- echo_request_user_data( VALUE self ) {
116
- buffer *echo_request;
117
- Data_Get_Struct( self, buffer, echo_request );
118
- if ( echo_request->length > sizeof( struct ofp_header ) ) {
119
- return rb_str_new( ( char * ) echo_request->data + sizeof( struct ofp_header ),
120
- ( long ) ( echo_request->length - sizeof( struct ofp_header ) ) );
121
- }
122
- return Qnil;
123
- }
97
+ VALUE
98
+ echo_user_data( VALUE self ) {}
99
+ #endif
124
100
 
125
101
 
126
102
  void
127
103
  Init_echo_request() {
128
104
  cEchoRequest = rb_define_class_under( mTrema, "EchoRequest", rb_cObject );
129
- rb_define_singleton_method( cEchoRequest, "new", echo_request_new, -1 );
130
- rb_define_method( cEchoRequest, "transaction_id", echo_request_transaction_id, 0 );
131
- rb_define_method( cEchoRequest, "user_data", echo_request_user_data, 0 );
105
+ rb_define_alloc_func( cEchoRequest, echo_request_alloc );
106
+ rb_define_method( cEchoRequest, "initialize", echo_init, -1 );
107
+ rb_define_method( cEchoRequest, "transaction_id", echo_transaction_id, 0 );
108
+ rb_alias( cEchoRequest, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
109
+ rb_define_method( cEchoRequest, "user_data", echo_user_data, 0 );
132
110
  }
133
111
 
134
112