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
@@ -0,0 +1,63 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/action"
20
+ require "trema/monkey-patch/integer"
21
+
22
+
23
+ module Trema
24
+ #
25
+ # An action to modify the IP ToS/DSCP field of a packet.
26
+ #
27
+ class SetIpTos < Action
28
+ attr_reader :type_of_service
29
+
30
+
31
+ #
32
+ # Creates an action to modify the IP ToS/DSCP field of a packet.
33
+ #
34
+ # @example
35
+ # SetIpTos.new(32)
36
+ #
37
+ # @param [Integer] :type_of_service
38
+ # the ToS/DSCP field to set to.
39
+ #
40
+ # @raise [ArgumentError] if type_of_service argument is not an unsigned 8-bit Integer.
41
+ # @raise [TypeError] if type_of_service argument is not an Integer.
42
+ #
43
+ def initialize type_of_service
44
+ if not type_of_service.is_a?( Integer )
45
+ raise TypeError, "ToS must be an unsigned 8-bit integer"
46
+ end
47
+ if not type_of_service.unsigned_8bit?
48
+ raise ArgumentError, "ToS must be an unsigned 8-bit integer"
49
+ end
50
+ @type_of_service = type_of_service
51
+ end
52
+ end
53
+
54
+
55
+ ActionSetNwTos = SetIpTos
56
+ end
57
+
58
+
59
+ ### Local variables:
60
+ ### mode: Ruby
61
+ ### coding: utf-8-unix
62
+ ### indent-tabs-mode: nil
63
+ ### End:
@@ -0,0 +1,53 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/set-transport-port"
20
+
21
+
22
+ module Trema
23
+ #
24
+ # An action to modify the destination TCP/UDP port of a packet.
25
+ #
26
+ class SetTransportDstPort < SetTransportPort
27
+ #
28
+ # Creates an action to modify the destination TCP/UDP port of a packet.
29
+ #
30
+ # @example
31
+ # SetTransportDstPort.new( 5555 )
32
+ #
33
+ # @param [Integer] port_number
34
+ # the destination TCP/UDP port number. Any numeric 16-bit value.
35
+ #
36
+ # @raise [ArgumentError] if port_number is not an unsigned 16-bit Integer.
37
+ # @raise [TypeError] if port_number is not an Integer.
38
+ #
39
+ def initialize port_number
40
+ super port_number
41
+ end
42
+ end
43
+
44
+
45
+ ActionSetTpDst = SetTransportDstPort
46
+ end
47
+
48
+
49
+ ### Local variables:
50
+ ### mode: Ruby
51
+ ### coding: utf-8-unix
52
+ ### indent-tabs-mode: nil
53
+ ### End:
@@ -0,0 +1,52 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/action"
20
+ require "trema/monkey-patch/integer"
21
+
22
+
23
+ module Trema
24
+ #
25
+ # A super-class of {SetTransportSrcPort} and {SetTransportDstPort} action.
26
+ #
27
+ class SetTransportPort < Action
28
+ attr_reader :port_number
29
+
30
+
31
+ #
32
+ # @private
33
+ #
34
+ def initialize port_number
35
+ error_message = "TCP/UDP port must be an unsigned 16-bit integer"
36
+ if not port_number.is_a?( Integer )
37
+ raise TypeError, error_message
38
+ end
39
+ if not port_number.unsigned_16bit?
40
+ raise ArgumentError, error_message
41
+ end
42
+ @port_number = port_number
43
+ end
44
+ end
45
+ end
46
+
47
+
48
+ ### Local variables:
49
+ ### mode: Ruby
50
+ ### coding: utf-8-unix
51
+ ### indent-tabs-mode: nil
52
+ ### End:
@@ -0,0 +1,54 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/monkey-patch/integer"
20
+ require "trema/set-transport-port"
21
+
22
+
23
+ module Trema
24
+ #
25
+ # An action to modify the source TCP/UDP port of a packet.
26
+ #
27
+ class SetTransportSrcPort < SetTransportPort
28
+ #
29
+ # Creates an action to modify the source TCP/UDP port of a packet.
30
+ #
31
+ # @example
32
+ # SetTransportSrcPort.new( 5555 )
33
+ #
34
+ # @param [Integer] port_number
35
+ # the source TCP or UDP port number. Any numeric 16-bit value.
36
+ #
37
+ # @raise [ArgumentError] if port_number is not an unsigned 16-bit Integer.
38
+ # @raise [TypeError] if port_number is not an Integer.
39
+ #
40
+ def initialize port_number
41
+ super port_number
42
+ end
43
+ end
44
+
45
+
46
+ ActionSetTpSrc = SetTransportSrcPort
47
+ end
48
+
49
+
50
+ ### Local variables:
51
+ ### mode: Ruby
52
+ ### coding: utf-8-unix
53
+ ### indent-tabs-mode: nil
54
+ ### End:
@@ -0,0 +1,65 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/action"
20
+
21
+
22
+ module Trema
23
+ #
24
+ # An action to modify the VLAN priority of a packet.
25
+ #
26
+ class SetVlanPriority < Action
27
+ attr_reader :vlan_priority
28
+
29
+
30
+ #
31
+ # Creates an action to modify the VLAN priority of a
32
+ # packet. Priority bits can be used to prioritize different
33
+ # classes of traffic. Valid values are between 0 (lowest) and 7
34
+ # (highest).
35
+ #
36
+ # @example
37
+ # SetVlanPriority.new( 7 )
38
+ #
39
+ # @param [Integer] vlan_priority
40
+ # the VLAN priority to set to.
41
+ #
42
+ # @raise [ArgumentError] if vlan_priority is not within 0 and 7 inclusive.
43
+ # @raise [TypeError] if vlan_priority is not an Integer.
44
+ #
45
+ def initialize vlan_priority
46
+ if not vlan_priority.is_a?( Integer )
47
+ raise TypeError, "VLAN priority must be an unsigned 8-bit Integer"
48
+ end
49
+ if not ( vlan_priority >= 0 and vlan_priority <= 7 )
50
+ raise ArgumentError, "Valid VLAN priority values are 0 to 7 inclusive"
51
+ end
52
+ @vlan_priority = vlan_priority
53
+ end
54
+ end
55
+
56
+
57
+ ActionSetVlanPcp = SetVlanPriority
58
+ end
59
+
60
+
61
+ ### Local variables:
62
+ ### mode: Ruby
63
+ ### coding: utf-8-unix
64
+ ### indent-tabs-mode: nil
65
+ ### End:
@@ -0,0 +1,64 @@
1
+ #
2
+ # Copyright (C) 2008-2012 NEC Corporation
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License, version 2, as
6
+ # published by the Free Software Foundation.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License along
14
+ # with this program; if not, write to the Free Software Foundation, Inc.,
15
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16
+ #
17
+
18
+
19
+ require "trema/action"
20
+
21
+
22
+ module Trema
23
+ #
24
+ # An action to modify the VLAN ID of a packet.
25
+ #
26
+ class SetVlanVid < Action
27
+ attr_reader :vlan_id
28
+
29
+
30
+ #
31
+ # Creates an action to modify the VLAN ID of a packet. The VLAN ID
32
+ # is 16-bits long but the actual VID (VLAN Identifier) of the IEEE
33
+ # 802.1Q frame is 12-bits.
34
+ #
35
+ # @example
36
+ # ActionSetVlanVid.new( vlan_id )
37
+ #
38
+ # @param [Integer] vlan_id
39
+ # the VLAN ID to set to. Only the lower 12-bits are used.
40
+ #
41
+ # @raise [ArgumentError] if vlan_id not within 1 and 4096 inclusive.
42
+ # @raise [TypeError] if vlan_id is not an Integer.
43
+ #
44
+ def initialize vlan_id
45
+ if not vlan_id.is_a?( Integer )
46
+ raise TypeError, "VLAN ID argument must be an Integer"
47
+ end
48
+ if not ( vlan_id >= 1 and vlan_id <= 4096 )
49
+ raise ArgumentError, "Valid VLAN ID values between 1 to 4096 inclusive"
50
+ end
51
+ @vlan_id = vlan_id
52
+ end
53
+ end
54
+
55
+
56
+ ActionSetVlanVid = SetVlanVid
57
+ end
58
+
59
+
60
+ ### Local variables:
61
+ ### mode: Ruby
62
+ ### coding: utf-8-unix
63
+ ### indent-tabs-mode: nil
64
+ ### End:
@@ -26,7 +26,7 @@ require "trema/dsl"
26
26
  module Trema
27
27
  module Shell
28
28
  def down name
29
- Switch[ name ].shutdown!
29
+ OpenflowSwitch[ name ].shutdown!
30
30
  end
31
31
  end
32
32
  end
@@ -30,11 +30,11 @@ module Trema
30
30
  link = Link.new( stanza )
31
31
  link.enable!
32
32
 
33
- if Switch[ peer0 ]
34
- Switch[ peer0 ] << link.name
33
+ if OpenflowSwitch[ peer0 ]
34
+ OpenflowSwitch[ peer0 ] << link.name
35
35
  end
36
- if Switch[ peer1 ]
37
- Switch[ peer1 ] << link.name_peer
36
+ if OpenflowSwitch[ peer1 ]
37
+ OpenflowSwitch[ peer1 ] << link.name_peer
38
38
  end
39
39
 
40
40
  if Host[ peer0 ]
@@ -29,15 +29,17 @@ module Trema
29
29
  sanity_check
30
30
 
31
31
  if controller
32
- if /ELF/=~ `file #{ controller }`
33
- stanza = DSL::Run.new
34
- stanza.path controller
35
- App.new stanza
36
- else
32
+ if /\.rb\Z/=~ controller.split.first
37
33
  require "trema"
34
+ include Trema
38
35
  ARGV.replace controller.split
39
36
  $LOAD_PATH << File.dirname( controller )
40
- Trema.module_eval IO.read( controller )
37
+ load controller
38
+ else
39
+ # Assume that the controller is written in C
40
+ stanza = Trema::DSL::Run.new
41
+ stanza.path controller
42
+ Trema::App.new( stanza )
41
43
  end
42
44
  end
43
45
 
@@ -26,10 +26,10 @@ require "trema/dsl"
26
26
  module Trema
27
27
  module Shell
28
28
  def up name
29
- if Switch[ name ].running?
30
- Switch[ name ].restart!
29
+ if OpenflowSwitch[ name ].running?
30
+ OpenflowSwitch[ name ].restart!
31
31
  else
32
- Switch[ name ].run!
32
+ OpenflowSwitch[ name ].run!
33
33
  end
34
34
  end
35
35
  end
@@ -18,6 +18,7 @@
18
18
  */
19
19
 
20
20
 
21
+ #include <arpa/inet.h>
21
22
  #include "trema.h"
22
23
  #include "ruby.h"
23
24
  #include "action-common.h"
@@ -140,6 +141,7 @@ stats_reply_stats( VALUE self ) {
140
141
 
141
142
  void
142
143
  Init_stats_reply() {
144
+ rb_require( "trema/desc-stats-reply" );
143
145
  rb_require( "trema/flow-stats-reply" );
144
146
  rb_require( "trema/aggregate-stats-reply" );
145
147
  rb_require( "trema/table-stats-reply" );
@@ -296,6 +298,28 @@ handle_stats_reply(
296
298
 
297
299
  uint16_t body_length = ( uint16_t ) body->length;
298
300
  switch ( type ) {
301
+ case OFPST_DESC:
302
+ {
303
+ struct ofp_desc_stats *desc_stats = ( struct ofp_desc_stats * ) body->data;
304
+ VALUE options = rb_hash_new();
305
+ VALUE desc_stats_arr = rb_ary_new();
306
+ VALUE desc_stats_reply;
307
+
308
+ rb_hash_aset( options, ID2SYM( rb_intern( "mfr_desc" ) ),
309
+ rb_str_new( desc_stats->mfr_desc, ( long ) strnlen( desc_stats->mfr_desc, DESC_STR_LEN - 1 ) ) );
310
+ rb_hash_aset( options, ID2SYM( rb_intern( "hw_desc" ) ),
311
+ rb_str_new( desc_stats->hw_desc, ( long ) strnlen( desc_stats->hw_desc, DESC_STR_LEN - 1 ) ) );
312
+ rb_hash_aset( options, ID2SYM( rb_intern( "sw_desc" ) ),
313
+ rb_str_new( desc_stats->sw_desc, ( long ) strnlen( desc_stats->sw_desc, DESC_STR_LEN - 1 ) ) );
314
+ rb_hash_aset( options, ID2SYM( rb_intern( "serial_num" ) ),
315
+ rb_str_new( desc_stats->serial_num, ( long ) strnlen( desc_stats->serial_num, SERIAL_NUM_LEN - 1 ) ) );
316
+ rb_hash_aset( options, ID2SYM( rb_intern( "dp_desc" ) ),
317
+ rb_str_new( desc_stats->dp_desc, ( long ) strnlen( desc_stats->dp_desc, DESC_STR_LEN - 1 ) ) );
318
+ desc_stats_reply = rb_funcall( rb_eval_string( " Trema::DescStatsReply" ), rb_intern( "new" ), 1, options );
319
+ rb_ary_push( desc_stats_arr, desc_stats_reply );
320
+ rb_hash_aset( attributes, ID2SYM( rb_intern( "stats" ) ), desc_stats_arr );
321
+ }
322
+ break;
299
323
  case OFPST_FLOW:
300
324
  {
301
325
  struct ofp_flow_stats *flow_stats;
@@ -304,11 +328,12 @@ handle_stats_reply(
304
328
  VALUE flow_stats_reply;
305
329
  VALUE match_obj;
306
330
  VALUE options = rb_hash_new();
307
- VALUE actions_arr = rb_ary_new();
331
+ VALUE actions_arr;
308
332
 
309
333
  flow_stats = ( struct ofp_flow_stats * ) body->data;
310
334
 
311
335
  while ( body_length > 0 ) {
336
+ actions_arr = rb_ary_new();
312
337
 
313
338
  match_obj = rb_funcall( rb_eval_string( "Match.new" ), rb_intern( "replace" ), 1, Data_Wrap_Struct( cStatsReply, NULL, NULL, &flow_stats->match ) );
314
339
  rb_hash_aset( options, ID2SYM( rb_intern( "length" ) ), UINT2NUM( flow_stats->length ) );
@@ -471,7 +496,7 @@ handle_stats_reply(
471
496
  }
472
497
 
473
498
  VALUE r_stats_reply = rb_funcall( cStatsReply, rb_intern( "new" ), 1, attributes );
474
- rb_funcall( controller, rb_intern( "stats_reply" ), 1, r_stats_reply );
499
+ rb_funcall( controller, rb_intern( "stats_reply" ), 2, ULL2NUM( datapath_id ), r_stats_reply );
475
500
  }
476
501
 
477
502